ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyZjQ5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13c2MtYXhpcy5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkMGMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLmF4aXM8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NWRmMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2Uud3NjLWF4aXMuamFyID0gc3JjLwotYmluLmluY2x1ZGVzID0gd3NjLWF4aXMuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcmVhZG1lLmh0bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWFkbWUuaHRtbCxcCi0gICAgICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOWZmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIHNlcnZpY2UgQXhpcyBDb25zdW1wdGlvbiBDb3JlCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWUxOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZSIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgbmFtZT0iJVBMVUdJTl9OQU1FIgotICAgcHJvdmlkZXItbmFtZT0iJVBMVUdJTl9QUk9WSURFUiI+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLmF4aXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLmFudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0id3NjLWF4aXMuamFyIj4KLSAgICAgIAk8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLndzZmluZGVyIj4KLSAgICAgIDx3c2ZpbmRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUud3NmaW5kZXIuV1NGaW5kZXJBeGlzIgotICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlci5XU0ZpbmRlckF4aXMiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlci5XU0ZpbmRlckF4aXMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlci5XU0ZpbmRlckF4aXMiPgotICAgICAgPC93c2ZpbmRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL2NvcmUvY29uc3VtcHRpb24ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb25zdW1wdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM4ZWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb25zdW1wdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBmb3IgQXhpc0RlcGxveUNvbW1hbmQKLSMKLU1TR19FUlJPUl9QUk9KRUNUX1VSTF9QQVJBTV9OT1RfU0VUPUlXQUIwMDU0RSBXZWIgcHJvamVjdCBVUkwgZm9yIGRlcGxveW1lbnQgb2YgV2ViIHNlcnZpY2UgaXMgbm90IHNldCBpbiBBeGlzRGVwbG95Q29tbWFuZAotTVNHX0VSUk9SX0RFUExPWV9GSUxFX1BBUkFNX05PVF9TRVQ9SVdBQjA0ODhFIExvY2F0aW9uIG9mIEF4aXMgZGVwbG95bWVudCBmaWxlIGlzIG5vdCBzZXQgaW4gQXhpc0RlcGxveUNvbW1hbmQKLU1TR19FUlJPUl9BWElTX0RFUExPWT1JV0FCMDQ4OUUgRXJyb3Igd2hlbiBkZXBsb3lpbmcgV2ViIHNlcnZpY2UgdG8gQXhpcyBydW50aW1lCi1NU0dfQVhJU19ERVBMT1k9RGVwbG95aW5nIFdlYiBzZXJ2aWNlIHRvIEF4aXMgcnVuLXRpbWUgZW52aXJvbm1lbnQKLU1TR19BWElTX0RFUExPWV9PSz1XZWIgc2VydmljZSBzdWNjZXNzZnVseSBkZXBsb3llZCB0byBBeGlzIHJ1bi10aW1lIGVudmlyb25tZW50Ci0KLVRBU0tfTEFCRUxfV1NETF9KQVZBX0NPTU1BTkQ9V1NETDJKYXZhQ29tbWFuZAotVEFTS19ERVNDX1dTRExfSkFWQV9DT01NQU5EPUNhbGxzIHRvIEFYSVMgV1NETDJKYXZhQ29tbWFuZC4KLSMKLSMgTWVzc2FnZXMgZm9yIEphdmEyV1NETENvbW1hbmQKLSMKLVRBU0tfTEFCRUxfSkFWQV9XU0RMX0NPTU1BTkQ9SmF2YTJXU0RMQ29tbWFuZAotVEFTS19ERVNDX0pBVkFfV1NETF9DT01NQU5EPUNhbGxzIHRvIEFYSVMgSmF2YTJXU0RMQ29tbWFuZC4KLU1TR19HRU5FUkFURV9XU0RMPUdlbmVyYXRpbmcgV1NETCBmaWxlOiB7MH0KLU1TR19FUlJPUl9KQVZBX1dTRExfR0VORVJBVEU9SVdBQjAzOThFIEVycm9yIGluIGdlbmVyYXRpbmcgV1NETCBmcm9tIEphdmEKLQotIwotIyBNZXNzYWdlcyBmb3IgV1NETDJKYXZhQ29tbWFuZAotIwotVEFTS19MQUJFTF9XU0RMX0pBVkFfQ09NTUFORD1XU0RMMkphdmFDb21tYW5kCi1UQVNLX0RFU0NfV1NETF9KQVZBX0NPTU1BTkQ9Q2FsbHMgdG8gQVhJUyBXU0RMMkphdmFDb21tYW5kLgotTVNHX1BBUlNJTkdfV1NETD1QYXJzaW5nIFdTREwgZmlsZTogezB9Ci1NU0dfRVJST1JfV1NETF9KQVZBX0dFTkVSQVRFPUlXQUIwMzk5RSBFcnJvciBpbiBnZW5lcmF0aW5nIEphdmEgZnJvbSBXU0RMCi0KLSMKLSMgTWVzc2FnZXMgY29tbW9uIGZvciBhbGwKLSMKLU1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVD1JV0FCMDM5N0UgSmF2YVdTRExQYXJhbSBub3Qgc2V0Ci0KLSMKLSMgTWVzc2FnZXMgY29tbW9uIGZvciBKYXZhMldTRExDb21tYW5kIGFuZCAgV1NETDJKYXZhQ29tbWFuZAotIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpc0RlcGxveUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXNEZXBsb3lDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjM2FhYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpc0RlcGxveUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy50b29scy5hbnQuYXhpcy5BZG1pbkNsaWVudFRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIENvbW1hbmRzIGFyZSBleGVjdXRhYmxlLCB1bmRvYWJsZSwgcmVkb2FibGUgb2JqZWN0cy4gRXZlcnkgQ29tbWFuZCBoYXMgYSBuYW1lIGFuZCBhIGRlc2NyaXB0aW9uLgotICovCi0KLXB1YmxpYyBjbGFzcyBBeGlzRGVwbG95Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRVhUID0gIi9zZXJ2aWNlcy9BZG1pblNlcnZpY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotICBwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEF4aXNEZXBsb3lDb21tYW5kLgotICAgKiBAcGFyYW0gU3RyaW5nIGRlc2NyaXB0aW9uCi0gICAqIEBwYXJhbSBTdHJpbmcgbmFtZQotICAgKiAKLSAgICovCi0gIHB1YmxpYyBBeGlzRGVwbG95Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXNEZXBsb3lDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5BeGlzRGVwbG95Q29tbWFuZCIpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgaWYgKGphdmFXU0RMUGFyYW0gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgIGdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotICAgIH0KLQotICAgIGlmIChqYXZhV1NETFBhcmFtLmdldFByb2plY3RVUkwoKSA9PSBudWxsIHx8IGphdmFXU0RMUGFyYW0uZ2V0UHJvamVjdFVSTCgpLmVxdWFscygiIikpCi0gICAgeyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgIGdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX1VSTF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgfQotCi0gICAgaWYgKGphdmFXU0RMUGFyYW0uZ2V0RGVwbG95bWVudEZpbGVzKCkgPT0gbnVsbCB8fCBqYXZhV1NETFBhcmFtLmdldERlcGxveW1lbnRGaWxlcygpLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhMldTRExDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotICAgICAgZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0RFUExPWV9GSUxFX1BBUkFNX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0KLSAgICBlbnZpcm9ubWVudC5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQoZ2V0TWVzc2FnZSgiTVNHX0FYSVNfREVQTE9ZIikpOwotCi0gICAgU3RhdHVzIHN0YXR1cyA9IGV4ZWN1dGVBbnRUYXNrKCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICB7Ci0gICAgCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0YXR1cyBleGVjdXRlQW50VGFzaygpCi0gIHsKLSAgICBmaW5hbCBjbGFzcyBEZXBsb3lUYXNrIGV4dGVuZHMgQWRtaW5DbGllbnRUYXNrCi0gICAgewotICAgICAgcHVibGljIERlcGxveVRhc2soKQotICAgICAgewotICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgcHJvamVjdC5pbml0KCk7Ci0gICAgICAgIHRhc2tUeXBlID0gImF4aXMiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRhc2tOYW1lID0gImF4aXMtYWRtaW4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRhcmdldCA9IG5ldyBUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBEZXBsb3lUYXNrIGFkbWluQ2xpZW50ID0gbmV3IERlcGxveVRhc2soKTsKLSAgICBTdHJpbmcgdXJsID0gamF2YVdTRExQYXJhbS5nZXRQcm9qZWN0VVJMKCkgKyBTRVJWSUNFX0VYVDsKLSAgICBhZG1pbkNsaWVudC5zZXRVcmwodXJsKTsKLSAgICBhZG1pbkNsaWVudC5zZXRYbWxGaWxlKG5ldyBGaWxlKGphdmFXU0RMUGFyYW0uZ2V0RGVwbG95bWVudEZpbGVzKClbMF0pKTsKLQotICAgIC8vIFNpbmNlIHRoZSBhZG1pbiBzZXJ2ZXIgbWF5IG5vdCBiZSBhdmFpbGFibGUgcmlnaHQgYXdheSB3ZSB3aWxsIHRyeQotICAgIC8vIHNldmVyYWwgdGltZXMgdG8gZXhlY3V0ZSBpdC4KLSAgICB0cnkKLSAgICB7Ci0gICAgICBCdWlsZEV4Y2VwdGlvbiBsYXN0RXhjZXB0aW9uID0gbnVsbDsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IDIwOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBsYXN0RXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgICBhZG1pbkNsaWVudC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEJ1aWxkRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsKLSAgICAgICAgICBsYXN0RXhjZXB0aW9uID0gZXhjOwotICAgICAgICAgIAotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCggMjAwICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aHJlYWRFeGNlcHRpb24gICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBubyBleGNlcHRpb24gb2NjdXJlZCB0aGVuIHdlIHNob3VsZCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCi0gICAgICAgIGlmKCBsYXN0RXhjZXB0aW9uID09IG51bGwgKSBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gSWYgYWZ0ZXIgbWFueSB0cmllcyB3ZSBzdGlsbCBnZXQgYW4gZXhjZXB0aW9uLCB0aGVuIHdlIHdpbGwgcmUgdGhyb3cgaXQuCi0gICAgICBpZiggbGFzdEV4Y2VwdGlvbiAhPSBudWxsICkgdGhyb3cgbGFzdEV4Y2VwdGlvbjsKLSAgICB9Ci0gICAgY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIFN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICBpZiAoZS5nZXRDYXVzZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBlLmdldENhdXNlKCkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RhdHVzW10gY2hpbGRTdGF0dXMgPSBuZXcgU3RhdHVzWzFdOwotICAgICAgY2hpbGRTdGF0dXNbMF0gPSBuZXcgU2ltcGxlU3RhdHVzKCJBeGlzRGVwbG95Q29tbWFuZCIsIG1lc3NhZ2UsIFN0YXR1cy5FUlJPUik7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiQXhpc0RlcGxveUNvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0gICAgICBnZXRNZXNzYWdlKCJNU0dfRVJST1JfQVhJU19ERVBMT1kiKSwgY2hpbGRTdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiQXhpc0RlcGxveUNvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0gICAgZ2V0TWVzc2FnZSgiTVNHX0FYSVNfREVQTE9ZX09LIiksIFN0YXR1cy5PSyk7Ci0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIHBhcm0xKQotICB7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSByZXNvdXJjZS5nZXRTdHJpbmcobWVzc2FnZUlkKTsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgbmV3IFN0cmluZ1tdIHsgcGFybTEgfSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gcGx1Z2luLnByb3BlcnRpZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlLmdldFN0cmluZyhrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBqYXZhV1NETFBhcmFtIFRoZSBqYXZhV1NETFBhcmFtIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLSAgewotICAgIHRoaXMuamF2YVdTRExQYXJhbSA9IGphdmFXU0RMUGFyYW07Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvSmF2YTJXU0RMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvSmF2YTJXU0RMQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODBkM2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0phdmEyV1NETENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLnRvb2xzLmFudC53c2RsLkphdmEyV3NkbEFudFRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLnRvb2xzLmFudC53c2RsLk5hbWVzcGFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0gKiBDb21tYW5kcyBhcmUgZXhlY3V0YWJsZSwgdW5kb2FibGUsIHJlZG9hYmxlIG9iamVjdHMuCi0gKiBFdmVyeSBDb21tYW5kIGhhcyBhIG5hbWUgYW5kIGEgZGVzY3JpcHRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIEphdmEyV1NETENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9KQVZBX1dTRExfQ09NTUFORCI7Ci0JcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0pBVkFfV1NETF9DT01NQU5EIjsKLQotCXB1YmxpYyBKYXZhMldTRExDb21tYW5kKCkgewotCQlzdXBlcigpOwotCSAgICBzZXROYW1lIChnZXRNZXNzYWdlKExBQkVMKSk7Ci0JCXNldERlc2NyaXB0aW9uKGdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQl9CQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhMldTRExDb21tYW5kLgotCSAqLwotCXB1YmxpYyBKYXZhMldTRExDb21tYW5kKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJc3VwZXIoKTsKLQkgICAgc2V0TmFtZSAoZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbihnZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlTdGF0dXMgc3RhdHVzOwotCQlpZiAoamF2YVdTRExQYXJhbV8gPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJaWYgKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkgPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJZW52aXJvbm1lbnQuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KAotCQkJZ2V0TWVzc2FnZSgiTVNHX0dFTkVSQVRFX1dTREwiLCBqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpICkgKTsKLQotCQlyZXR1cm4gZXhlY3V0ZUFudFRhc2soZW52aXJvbm1lbnQpOwotCX0KLQotCXByb3RlY3RlZCBTdGF0dXMgZXhlY3V0ZUFudFRhc2soRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQotCQlmaW5hbCBjbGFzcyBFbWl0dGVyIGV4dGVuZHMgSmF2YTJXc2RsQW50VGFzayB7Ci0JCQlwdWJsaWMgRW1pdHRlcigpIHsKLQkJCQlwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLQkJCQlwcm9qZWN0LmluaXQoKTsKLQkJCQl0YXNrVHlwZSA9ICJheGlzIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRhc2tOYW1lID0gImF4aXMtamF2YTJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRhcmdldCA9IG5ldyBUYXJnZXQoKTsKLQkJCX0KLQkJfQotCi0JCUVtaXR0ZXIgZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7Ci0JCWVtaXR0ZXIuY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UGF0aChqYXZhV1NETFBhcmFtXy5nZXRDbGFzc3BhdGgoKSk7Ci0JCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTAwOCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIkNsYXNzIFBhdGggPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRDbGFzc3BhdGgoKSk7Ci0JCQotCQllbWl0dGVyLnNldFBvcnRUeXBlTmFtZShqYXZhV1NETFBhcmFtXy5nZXRQb3J0VHlwZU5hbWUoKSk7Ci0JCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTAwOSwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIlBvcnQgVHlwZSBOYW1lID0gIisgamF2YVdTRExQYXJhbV8uZ2V0UG9ydFR5cGVOYW1lKCkpOwotCQkKLQkJZW1pdHRlci5zZXRTZXJ2aWNlRWxlbWVudE5hbWUoamF2YVdTRExQYXJhbV8uZ2V0U2VydmljZU5hbWUoKSk7Ci0JCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTAxMCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIlNlcnZpY2UgTmFtZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldFNlcnZpY2VOYW1lKCkpOwotCQkKLQkJZW1pdHRlci5zZXRMb2NhdGlvbihqYXZhV1NETFBhcmFtXy5nZXRVcmxMb2NhdGlvbigpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDExLCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiVVJMIExvY2F0aW9uID0gIisgamF2YVdTRExQYXJhbV8uZ2V0VXJsTG9jYXRpb24oKSk7Ci0JCQotCQllbWl0dGVyLnNldE1ldGhvZHMoamF2YVdTRExQYXJhbV8uZ2V0TWV0aG9kU3RyaW5nKCkpOwotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMTIsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJNZXRob2RzID0gIisgamF2YVdTRExQYXJhbV8uZ2V0TWV0aG9kU3RyaW5nKCkpOwotCQkKLQkJZW1pdHRlci5zZXRTdHlsZShqYXZhV1NETFBhcmFtXy5nZXRTdHlsZSgpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDEzLCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiU3R5bGUgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRTdHlsZSgpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0VXNlKGphdmFXU0RMUGFyYW1fLmdldFVzZSgpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDE0LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiVXNlID0gIisgamF2YVdTRExQYXJhbV8uZ2V0VXNlKCkpOwotCQkKLQkJZW1pdHRlci5zZXRPdXRwdXQobmV3IEZpbGUoamF2YVdTRExQYXJhbV8uZ2V0T3V0cHV0V3NkbExvY2F0aW9uKCkpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDE1LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiV1NETCBMb2NhdGlvbiA9ICIrIGphdmFXU0RMUGFyYW1fLmdldE91dHB1dFdzZGxMb2NhdGlvbigpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0TmFtZXNwYWNlKGphdmFXU0RMUGFyYW1fLmdldE5hbWVzcGFjZSgpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDE2LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiTmFtZSBTcGFjZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0Q2xhc3NOYW1lKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkpOwotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMTcsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJCZWFuIG5hbWUgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0SW1wbENsYXNzKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkpOwotCQkKLQkJSGFzaE1hcCBtYXBwaW5ncyA9IGphdmFXU0RMUGFyYW1fLmdldE1hcHBpbmdzKCk7Ci0JCWlmKG1hcHBpbmdzICE9IG51bGwpewotCQkJSXRlcmF0b3Iga2V5cyA9IG1hcHBpbmdzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShrZXlzLmhhc05leHQoKSl7Ci0JCQkJU3RyaW5nIHBha2FnZSA9IChTdHJpbmcpa2V5cy5uZXh0KCk7Ci0JCQkJU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpbWFwcGluZ3MuZ2V0KHBha2FnZSk7Ci0JCQkJTmFtZXNwYWNlTWFwcGluZyBtYXAgPSBuZXcgTmFtZXNwYWNlTWFwcGluZygpOwotCQkJCW1hcC5zZXRQYWNrYWdlKHBha2FnZSk7Ci0JCQkJbWFwLnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkJCWVtaXR0ZXIuYWRkTWFwcGluZyhtYXApOwkJCi0JCQl9Ci0JCX0KLQkJCi0JCi0JCXRyeSB7Ci0JCQllbWl0dGVyLmV4ZWN1dGUoKTsKLQkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotCQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5FUlJPUiwgNTAxOCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgZSk7Ci0JCQlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfR0VORVJBVEUiKSArICIgIiAvLyROT04tTkxTLTEkCi0JCQkrZS5nZXRDYXVzZSgpLnRvU3RyaW5nKCksIFN0YXR1cy5FUlJPUik7Ci0JCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0KLQl9Ci0JCi0JcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgcmVkbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBqYXZhV1NETFBhcmFtLgotCSAqIEByZXR1cm4gSmF2YVdTRExQYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpIHsKLQkJcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIHBhcm0xKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gcmVzb3VyY2UuZ2V0U3RyaW5nKG1lc3NhZ2VJZCk7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlLCBuZXcgU3RyaW5nW10geyBwYXJtMSB9KTsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0JKiBwbHVnaW4ucHJvcGVydGllcy4KLQkqIEByZXR1cm4gVGhlIFN0cmluZyBtZXNzYWdlLgotCSovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIHJlc291cmNlLmdldFN0cmluZyhrZXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJtKSB7Ci0JCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcm07Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0JewotCSAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZ2V0SmF2YVdTRExQYXJhbSgpLmdldE91dHB1dFdzZGxMb2NhdGlvbigpKTsgCi0JICAgIFN0cmluZyB1cmwgPSAiIjsKLQkJICB0cnkgewotCSAgICAJdXJsID0gZmlsZS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JICAgIH0KLQkJICBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKXt9Ci0JCXJldHVybiB1cmw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvV1NETDJKYXZhQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvV1NETDJKYXZhQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI1MjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL1dTREwySmF2YUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy53c2RsLnRvSmF2YS5FbWl0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy53c2RsLnRvSmF2YS5HZW5lcmF0ZWRGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVQTE9ZX1RZUEUgPSAiZGVwbG95IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFVOREVQTE9ZX1RZUEUgPSAidW5kZXBsb3kiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotCXByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotCXByaXZhdGUgU3RyaW5nIGh0dHBCYXNpY0F1dGhQYXNzd29yZDsKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1dTRExfSkFWQV9DT01NQU5EIjsKLQlwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfV1NETF9KQVZBX0NPTU1BTkQiOwotCQotCi0JcHVibGljIFdTREwySmF2YUNvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE5hbWUoZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbihnZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JfQotCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCVN0YXR1cyBzdGF0dXM7Ci0JCWlmIChqYXZhV1NETFBhcmFtID09IG51bGwpIHsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIldTREwySmF2YUNvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJaWYgKHdzZGxVUkkgIT0gbnVsbCkgLy9ib3R0b20gdXAgY2FzZSBoYXMgYWxyZWFkeSBoYXMgdGhlIGNvcnJlY3QgV1NETCBvbiBqYXZhV1NETFBhcmFtCi0JCXsKLQkJCWphdmFXU0RMUGFyYW0uc2V0SW5wdXRXc2RsTG9jYXRpb24od3NkbFVSSSk7Ci0JCX0KLQkJamF2YVdTRExQYXJhbS5zZXRIVFRQVXNlcm5hbWUoaHR0cEJhc2ljQXV0aFVzZXJuYW1lKTsKLQkJamF2YVdTRExQYXJhbS5zZXRIVFRQUGFzc3dvcmQoaHR0cEJhc2ljQXV0aFBhc3N3b3JkKTsKLQkJCi0JCUVtaXR0ZXIgd3NkbDJKYXZhID0gbmV3IEVtaXR0ZXIoKTsKLQkJaWYgKGVudmlyb25tZW50LmdldExvZygpLmlzRW5hYmxlZCgiZW1pdHRlciIpKSB7Ci0JCQl3c2RsMkphdmEuc2V0VmVyYm9zZSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXdzZGwySmF2YS5zZXRWZXJib3NlKGZhbHNlKTsKLQkJfQotCQlib29sZWFuIHNlcnZlclNpZGUgPSBqYXZhV1NETFBhcmFtLmdldFNlcnZlclNpZGUoKSA9PSBKYXZhV1NETFBhcmFtZXRlci5TRVJWRVJfU0lERV9CRUFOOwotCQl3c2RsMkphdmEuc2V0U2VydmVyU2lkZShzZXJ2ZXJTaWRlKTsKLQkJaWYgKHNlcnZlclNpZGUpIHsKLQkJCXdzZGwySmF2YS5zZXRTa2VsZXRvbldhbnRlZChqYXZhV1NETFBhcmFtLmlzU2tlbGV0b25EZXBsb3koKSk7Ci0JCX0KLQkJaWYgKGphdmFXU0RMUGFyYW0uaXNNZXRhSW5mT25seSgpKSB7Ci0JCQkvLyBmb3IgdGhlIGNhc2UgSmF2YTJXU0RMLVdTREwySmF2YQotCQkJd3NkbDJKYXZhLnNldE91dHB1dERpcihyZW1vdmVGaWxlUHJvdG9jb2woamF2YVdTRExQYXJhbS5nZXRPdXRwdXQoKSkpOwotCQkJSGFzaE1hcCBwY2sybnNNYXAgPSBqYXZhV1NETFBhcmFtLmdldE1hcHBpbmdzKCk7Ci0JCQlpZiAocGNrMm5zTWFwICE9IG51bGwpIHsKLQkJCQlIYXNoTWFwIG5zMnBja01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJSXRlcmF0b3Iga2V5cyA9IHBjazJuc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJCQlTdHJpbmcgcGFrYWdlID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQkJCVN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKSBwY2sybnNNYXAuZ2V0KHBha2FnZSk7Ci0JCQkJCW5zMnBja01hcC5wdXQobmFtZXNwYWNlLCBwYWthZ2UpOwotCQkJCX0KLQkJCQl3c2RsMkphdmEuc2V0TmFtZXNwYWNlTWFwKG5zMnBja01hcCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyAgZm9yIHRoZSBjYXNlIFdTREwySmF2YQotCQkJd3NkbDJKYXZhLnNldE91dHB1dERpcihyZW1vdmVGaWxlUHJvdG9jb2woamF2YVdTRExQYXJhbS5nZXRKYXZhT3V0cHV0KCkpKTsKLQkJCWlmIChqYXZhV1NETFBhcmFtLmdldE1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJCXdzZGwySmF2YS5zZXROYW1lc3BhY2VNYXAoamF2YVdTRExQYXJhbS5nZXRNYXBwaW5ncygpKTsKLQkJCX0KLQkJfQotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMTksIHRoaXMsICJleGVjdXRlIiwgIkphdmEgb3V0cHV0ID0gIiArIGphdmFXU0RMUGFyYW0uZ2V0SmF2YU91dHB1dCgpKTsKLQkJaWYgKGphdmFXU0RMUGFyYW0uZ2V0SFRUUFBhc3N3b3JkKCkgIT0gbnVsbCkgewotCQkJd3NkbDJKYXZhLnNldFBhc3N3b3JkKGphdmFXU0RMUGFyYW0uZ2V0SFRUUFBhc3N3b3JkKCkpOwotCQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDgxLCB0aGlzLCAiZXhlY3V0ZSIsICJwYXNzd29yZDogIiArIGphdmFXU0RMUGFyYW0uZ2V0SFRUUFBhc3N3b3JkKCkpOwotCQl9Ci0JCWlmIChqYXZhV1NETFBhcmFtLmdldEhUVFBVc2VybmFtZSgpICE9IG51bGwpIHsKLQkJCXdzZGwySmF2YS5zZXRVc2VybmFtZShqYXZhV1NETFBhcmFtLmdldEhUVFBVc2VybmFtZSgpKTsKLQkJCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTA4MiwgdGhpcywgImV4ZWN1dGUiLCAidXNlcm5hbWU6ICIgKyBqYXZhV1NETFBhcmFtLmdldEhUVFBVc2VybmFtZSgpKTsKLQkJfQotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMjAsIHRoaXMsICJleGVjdXRlIiwgIldTREwgTG9jYXRpb24gPSAiICsgamF2YVdTRExQYXJhbS5nZXRJbnB1dFdzZGxMb2NhdGlvbigpKTsKLQkJZW52aXJvbm1lbnQuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KGdldE1lc3NhZ2UoIk1TR19QQVJTSU5HX1dTREwiLCBqYXZhV1NETFBhcmFtLmdldElucHV0V3NkbExvY2F0aW9uKCkgKSApOwotCQl0cnkgewotCQkJd3NkbDJKYXZhLnJ1bihqYXZhV1NETFBhcmFtLmdldElucHV0V3NkbExvY2F0aW9uKCkpOwotCQkJaWYgKHNlcnZlclNpZGUpIHsKLQkJCQkvLyBzZXQgZGVwbG95bWVudCBmaWxlcwotCQkJCUxpc3QgZGVwbG95bWVudEZpbGVzMSA9IHdzZGwySmF2YS5nZXRHZW5lcmF0ZWRGaWxlSW5mbygpLmZpbmRUeXBlKERFUExPWV9UWVBFKTsKLQkJCQlMaXN0IGRlcGxveW1lbnRGaWxlczIgPSB3c2RsMkphdmEuZ2V0R2VuZXJhdGVkRmlsZUluZm8oKS5maW5kVHlwZShVTkRFUExPWV9UWVBFKTsKLQkJCQlBcnJheUxpc3QgZGVwbEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChkZXBsb3ltZW50RmlsZXMxICE9IG51bGwgJiYgZGVwbG95bWVudEZpbGVzMiAhPSBudWxsKSB7Ci0JCQkJCWRlcGxveW1lbnRGaWxlczEuYWRkQWxsKGRlcGxveW1lbnRGaWxlczIpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcGxveW1lbnRGaWxlczEuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCUdlbmVyYXRlZEZpbGVJbmZvLkVudHJ5IGVudHJ5ID0gKEdlbmVyYXRlZEZpbGVJbmZvLkVudHJ5KSBkZXBsb3ltZW50RmlsZXMxLmdldChpKTsKLQkJCQkJCWRlcGxGaWxlcy5hZGQoZW50cnkuZmlsZU5hbWUpOwotCQkJCQl9Ci0JCQkJCVN0cmluZ1tdIGRlcGxGaWxlc0FycmF5ID0gbmV3IFN0cmluZ1tkZXBsRmlsZXMuc2l6ZSgpXTsKLQkJCQkJZGVwbEZpbGVzLnRvQXJyYXkoZGVwbEZpbGVzQXJyYXkpOwotCQkJCQlqYXZhV1NETFBhcmFtLnNldERlcGxveW1lbnRGaWxlcyhkZXBsRmlsZXNBcnJheSk7Ci0JCQkJfQotCQkJCS8vIHNldCBqYXZhIGZpbGVzCi0JCQkJTGlzdCBqYXZhRmlsZXMgPSB3c2RsMkphdmEuZ2V0R2VuZXJhdGVkRmlsZU5hbWVzKCk7Ci0JCQkJamF2YUZpbGVzLnJlbW92ZUFsbChkZXBsRmlsZXMpOwotCQkJCVN0cmluZ1tdIGphdmFGaWxlTmFtZXMgPSBuZXcgU3RyaW5nW2phdmFGaWxlcy5zaXplKCldOwotCQkJCWphdmFGaWxlcy50b0FycmF5KGphdmFGaWxlTmFtZXMpOwotCQkJCWphdmFXU0RMUGFyYW0uc2V0SmF2YUZpbGVzKGphdmFGaWxlTmFtZXMpOwotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLkVSUk9SLCA1MDIxLCB0aGlzLCAiZXhlY3V0ZSIsIGUpOwotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dTRExfSkFWQV9HRU5FUkFURSIpICsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwgU3RhdHVzLkVSUk9SKTsKLQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JfQotCi0JLyoKLQkgKiBIYWNrOiBBeGlzIGRvZXNuJ3QgbGlrZSBmaWxlIFVSTHMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZW1vdmVGaWxlUHJvdG9jb2woU3RyaW5nIHMpIHsKLQkJaWYgKHMuc3RhcnRzV2l0aCgiZmlsZToiKSkgewotCQkJU3RyaW5nIG5ld1MgPSBzLnN1YnN0cmluZyg1LCBzLmxlbmd0aCgpKTsKLQkJCWludCBpID0gbmV3Uy5pbmRleE9mKCc6Jyk7Ci0JCQlpZiAoaSAhPSAtMSkgewotCQkJCVN0cmluZyBwcm90b2NvbCA9IG5ld1Muc3Vic3RyaW5nKDAsIGkpOwotCQkJCWludCBqID0gcHJvdG9jb2wuaW5kZXhPZignLycpOwotCQkJCWludCBrID0gcHJvdG9jb2wuaW5kZXhPZignXFwnKTsKLQkJCQlpbnQgbWF4ID0gTWF0aC5tYXgoaiwgayk7Ci0JCQkJaWYgKG1heCAhPSAtMSkKLQkJCQkJbmV3UyA9IG5ld1Muc3Vic3RyaW5nKG1heCArIDEsIG5ld1MubGVuZ3RoKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ld1M7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgcmVkbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBwYXJtMSkgewotCQlTdHJpbmcgbWVzc2FnZSA9IHJlc291cmNlLmdldFN0cmluZyhtZXNzYWdlSWQpOwotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgbmV3IFN0cmluZ1tde3Bhcm0xfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLQkgKiBwbHVnaW4ucHJvcGVydGllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JCXRoaXMuamF2YVdTRExQYXJhbSA9IGphdmFXU0RMUGFyYW07Ci0JfQotCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBodHRwQmFzaWNBdXRoUGFzc3dvcmQKLQkgKiAgICAgICAgICAgIFRoZSBodHRwQmFzaWNBdXRoUGFzc3dvcmQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh0dHBCYXNpY0F1dGhQYXNzd29yZChTdHJpbmcgaHR0cEJhc2ljQXV0aFBhc3N3b3JkKSB7Ci0JCXRoaXMuaHR0cEJhc2ljQXV0aFBhc3N3b3JkID0gaHR0cEJhc2ljQXV0aFBhc3N3b3JkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBodHRwQmFzaWNBdXRoVXNlcm5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBodHRwQmFzaWNBdXRoVXNlcm5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh0dHBCYXNpY0F1dGhVc2VybmFtZShTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lKSB7Ci0JCXRoaXMuaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpIHsKLQkJdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tb24vSmF2YVdTRExQYXJhbWV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tb24vSmF2YVdTRExQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkYTc4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL2NvcmUvY29tbW9uL0phdmFXU0RMUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhV1NETFBhcmFtZXRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VSVkVSX1NJREVfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNFUlZFUl9TSURFX0JFQU4gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVJWRVJfU0lERV9FSkIgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfUlBDID0gIlJQQyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9ET0NVTUVOVCA9ICJET0NVTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9XUkFQUEVEID0gIldSQVBQRUQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfTElURVJBTCA9ICJMSVRFUkFMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FTkNPREVEID0gIkVOQ09ERUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBiZWFuTmFtZSA9IG51bGw7IC8vIFRoZSBuYW1lIG9mIHRoZSBKYXZhIGJlYW4KLQlwcml2YXRlIFN0cmluZyBjbGFzc3BhdGggPSBudWxsOwotCS8vIFRoZSBjbGFzcyBwYXRoIGZvciBsb2FkaW5nIHRoZSBiZWFuIGFuZCBjb21tYW5kIGV4ZWN1dGlvbgotCXByaXZhdGUgU3RyaW5nIGJlYW5QYWNrYWdlID0gbnVsbDsgLy8gVGhlIHBhY2thZ2UgbG9jYXRpb24gb2YgdGhlIGJlYW4KLQlwcml2YXRlIFN0cmluZyBwb3J0VHlwZU5hbWUgPSBudWxsOyAvLyBUaGUgbmFtZSBvZiB0aGUgcG9ydCB0eXBlIGVsZW1lbnQKLQlwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7IC8vIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGVsZW1lbnQKLQlwcml2YXRlIFN0cmluZyBvdXRwdXRXc2RsTG9jYXRpb24gPSBudWxsOwotCS8vIFRoZSBvdXRwdXQgbG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZQotCXByaXZhdGUgU3RyaW5nIGlucHV0V3NkbExvY2F0aW9uID0gbnVsbDsKLQkvLyBUaGUgaW5wdXQgbG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZQotCXByaXZhdGUgU3RyaW5nIHVybExvY2F0aW9uID0gbnVsbDsgLy8gVGhlIFVSTCBsb2NhdGlvbiBvZiB0aGUgd2ViIHNlcnZpY2UKLQlwcml2YXRlIEhhc2h0YWJsZSBtZXRob2RzID0gbnVsbDsgLy8gVGhlIGFycmF5IG9mIG1ldGhvZCBuYW1lcwotCXByaXZhdGUgU3RyaW5nIHN0eWxlID0gbnVsbDsKLQkvLyBUaGUgc3R5bGUgKFJQQyB8IERPQ1VNRU5UIHwgV1JBUFBFRCkgYXR0cmlidXRlIGZvciB0aGUgZ2VuZXJhdGVkIFdTREwKLQlwcml2YXRlIFN0cmluZyB1c2UgPSBudWxsOwotCS8vIFRoZSB1c2UgKExJVEVSQUwgfCBFTkNPREVEKSBhdHRyaWJ0dWUgZm9yIHRoZSBnZW5lcmF0ZWQgV1NETAotCXByaXZhdGUgU3RyaW5nIG91dHB1dCA9IG51bGw7Ci0JLy8gVGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgZGVwbG95bWVudCBkZXNjcmlwdG9ycyAmIEphdmEgY29kZSAob3V0cHV0IGZyb20gV1NETDJKYXZhIGNvbW1hbmQpCi0JcHJpdmF0ZSBTdHJpbmcgamF2YU91dHB1dCA9IG51bGw7Ci0JLy8gVGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgSmF2YSBjb2RlIChvdXRwdXQgZnJvbSBXU0RMMkphdmEgY29tbWFuZCkKLQlwcml2YXRlIGJvb2xlYW4gbWV0YUluZk9ubHkgPSBmYWxzZTsgLy8gTUVUQS1JTkYtT05MWSBmbGFnCi0JcHJpdmF0ZSBieXRlIHNlcnZlclNpZGUgPSBTRVJWRVJfU0lERV9OT05FOwotCS8vIHNlcnZlci1zaWRlIGZsYWcgKFNFUlZFUl9TSURFX05PTkUgfCBTRVJWRVJfU0lERV9CRUFOIHwgU0VSVkVSX1NJREVfRUpCKQotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHNrZWxldG9uRGVwbG95ID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBjb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nW10gZGVwbG95bWVudEZpbGVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIGphdmFGaWxlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdFVSTCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIG1hcHBpbmdQYWlyczsKLQlwcml2YXRlIFN0cmluZyBodHRwVXNlcm5hbWVfID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBodHRwUGFzc3dvcmRfID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihTdHJpbmcgY29udGFpbmVyKSB7Ci0JCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhV1NETFBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmVhbk5hbWUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJlYW5OYW1lKCkgewotCQlyZXR1cm4gYmVhbk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCZWFuUGFja2FnZSgpIHsKLQkJcmV0dXJuIGJlYW5QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvcnRUeXBlTmFtZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydFR5cGVOYW1lKCkgewotCQlyZXR1cm4gcG9ydFR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZpY2VOYW1lLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG91dHB1dC4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0KCkgewotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZHMuCi0JICogQHJldHVybiBTdHJpbmdbXQotCSAqLwotCXB1YmxpYyBIYXNodGFibGUgZ2V0TWV0aG9kcygpIHsKLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWEgc2VwZXJhdGVkIHN0cmluZyByZXByZXNldGF0aW9uIG9mIHRoZSBtZXRob2RzLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2RTdHJpbmcoKSB7Ci0JCVN0cmluZyBtZXRob2RTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlFbnVtZXJhdGlvbiBlID0gbWV0aG9kcy5rZXlzKCk7Ci0gCQlmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICAJewotCi0JCQlTdHJpbmcgc2lnbmF0dXJlID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCgoQm9vbGVhbikgbWV0aG9kcy5nZXQoc2lnbmF0dXJlKSkuYm9vbGVhblZhbHVlKCkpewotCQkJCQkJCWludCBpbmRleCA9IHNpZ25hdHVyZS5pbmRleE9mKCcoJyk7Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSBzaWduYXR1cmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCQltZXRob2RTdHJpbmcgKz0gbmFtZTsKLQkJCX0KLQkgICAgCWlmIChpICE9IG1ldGhvZHMuc2l6ZSgpIC0xKSAvLyB0aGlzIGlzIG5vdCB0aGUgbGFzdCBhcnJheSBpdGVtCQotCQkJewotCQkJCW1ldGhvZFN0cmluZyArPSAiLCI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHlsZSBhdHRyaWJ1dGUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0eWxlKCkgewotCQlyZXR1cm4gc3R5bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXJsTG9jYXRpb24uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybExvY2F0aW9uKCkgewotCQlyZXR1cm4gdXJsTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlKCkgewotCQlyZXR1cm4gdXNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG91dHB1dFdzZGxMb2NhdGlvbi4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0V3NkbExvY2F0aW9uKCkgewotCQlyZXR1cm4gb3V0cHV0V3NkbExvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJlYW5OYW1lLgotCSAqIEBwYXJhbSBiZWFuTmFtZSBUaGUgYmVhbk5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QmVhbk5hbWUoU3RyaW5nIGJlYW5OYW1lKSB7Ci0JCXRoaXMuYmVhbk5hbWUgPSBiZWFuTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCZWFuUGFja2FnZShTdHJpbmcgYmVhblBhY2thZ2UpIHsKLQkJdGhpcy5iZWFuUGFja2FnZSA9IGJlYW5QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBvcnRUeXBlTmFtZS4KLQkgKiBAcGFyYW0gcG9ydFR5cGVOYW1lIFRoZSBwb3J0VHlwZU5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UG9ydFR5cGVOYW1lKFN0cmluZyBwb3J0VHlwZU5hbWUpIHsKLQkJdGhpcy5wb3J0VHlwZU5hbWUgPSBwb3J0VHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VydmljZU5hbWUuCi0JICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBzZXJ2aWNlTmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLQkJdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG91dHB1dC4KLQkgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKLQkJdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kcy4KLQkgKiBAcGFyYW0gbWV0aG9kcyBUaGUgbWV0aG9kcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RzKEhhc2h0YWJsZSBtZXRob2RzKSB7Ci0JCXRoaXMubWV0aG9kcyA9IG1ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3R5bGUuCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHJpbmcgc3R5bGUpIHsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVybExvY2F0aW9uLgotCSAqIEBwYXJhbSB1cmxMb2NhdGlvbiBUaGUgdXJsTG9jYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsTG9jYXRpb24oU3RyaW5nIHVybExvY2F0aW9uKSB7Ci0JCXRoaXMudXJsTG9jYXRpb24gPSB1cmxMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2UuCi0JICogQHBhcmFtIHVzZSBUaGUgdXNlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgdXNlKSB7Ci0JCXRoaXMudXNlID0gdXNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG91dHB1dFdzZGxMb2NhdGlvbi4KLQkgKiBAcGFyYW0gb3V0cHV0V3NkbExvY2F0aW9uIFRoZSBvdXRwdXRXc2RsTG9jYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0V3NkbExvY2F0aW9uKFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLQkJdGhpcy5vdXRwdXRXc2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YUluZk9ubHkuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRhSW5mT25seSgpIHsKLQkJcmV0dXJuIG1ldGFJbmZPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGFJbmZPbmx5LgotCSAqIEBwYXJhbSBtZXRhSW5mT25seSBUaGUgbWV0YUluZk9ubHkgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0YUluZk9ubHkoYm9vbGVhbiBtZXRhSW5mT25seSkgewotCQl0aGlzLm1ldGFJbmZPbmx5ID0gbWV0YUluZk9ubHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyU2lkZS4KLQkgKiBAcmV0dXJuIGJ5dGUKLQkgKi8KLQlwdWJsaWMgYnl0ZSBnZXRTZXJ2ZXJTaWRlKCkgewotCQlyZXR1cm4gc2VydmVyU2lkZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZXJ2ZXJTaWRlLgotCSAqIEBwYXJhbSBzZXJ2ZXJTaWRlIFRoZSBzZXJ2ZXJTaWRlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlclNpZGUoYnl0ZSBzZXJ2ZXJTaWRlKSB7Ci0JCXRoaXMuc2VydmVyU2lkZSA9IHNlcnZlclNpZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5wdXRXc2RsTG9jYXRpb24uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0V3NkbExvY2F0aW9uKCkgewotCQlyZXR1cm4gaW5wdXRXc2RsTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5wdXRXc2RsTG9jYXRpb24uCi0JICogQHBhcmFtIGlucHV0V3NkbExvY2F0aW9uIFRoZSBpbnB1dFdzZGxMb2NhdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dFdzZGxMb2NhdGlvbihTdHJpbmcgaW5wdXRXc2RsTG9jYXRpb24pIHsKLQkJdGhpcy5pbnB1dFdzZGxMb2NhdGlvbiA9IGlucHV0V3NkbExvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzcGFjZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVzcGFjZS4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBvdXRwdXQuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFPdXRwdXQoKSB7Ci0JCXJldHVybiBqYXZhT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGphdmFPdXRwdXQuCi0JICogQHBhcmFtIGphdmFPdXRwdXQgVGhlIEphdmEgb3V0cHV0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFPdXRwdXQoU3RyaW5nIGphdmFPdXRwdXQpIHsKLQkJdGhpcy5qYXZhT3V0cHV0ID0gamF2YU91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChTdHJpbmcgc3RyaW5nKSB7Ci0JCWNsYXNzcGF0aCA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTa2VsZXRvbkRlcGxveSgpIHsKLQkJcmV0dXJuIHNrZWxldG9uRGVwbG95OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2tlbGV0b25EZXBsb3koYm9vbGVhbiBiKSB7Ci0JCXNrZWxldG9uRGVwbG95ID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldERlcGxveW1lbnRGaWxlcygpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnRGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnRGaWxlcyhTdHJpbmdbXSBzdHJpbmdzKSB7Ci0JCWRlcGxveW1lbnRGaWxlcyA9IHN0cmluZ3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRKYXZhRmlsZXMoKSB7Ci0JCXJldHVybiBqYXZhRmlsZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhRmlsZXMoU3RyaW5nW10gc3RyaW5ncykgewotCQlqYXZhRmlsZXMgPSBzdHJpbmdzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RVUkwoKSB7Ci0JCXJldHVybiBwcm9qZWN0VVJMOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0VVJMKFN0cmluZyBzdHJpbmcpIHsKLQkJcHJvamVjdFVSTCA9IHN0cmluZzsKLQl9Ci0JCi0JcHVibGljIEhhc2hNYXAgZ2V0TWFwcGluZ3MoKQotCXsKLQkJCXJldHVybiBtYXBwaW5nUGFpcnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ3MoSGFzaE1hcCBtYXApCi0JewotCQkJbWFwcGluZ1BhaXJzID0gbWFwOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VyIG5hbWUgZm9yIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SFRUUFVzZXJuYW1lKCkKLQl7Ci0JICByZXR1cm4gaHR0cFVzZXJuYW1lXzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIG5hbWUgZm9yIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24KLQkgKiBAcGFyYW0gU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SFRUUFVzZXJuYW1lKFN0cmluZyBodHRwVXNlcm5hbWUpCi0JewotCSAgaHR0cFVzZXJuYW1lXyA9IGh0dHBVc2VybmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXNzd29yZCBmb3IgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIVFRQUGFzc3dvcmQoKQotCXsKLQkgIHJldHVybiBodHRwUGFzc3dvcmRfOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIVFRQUGFzc3dvcmQoU3RyaW5nIGh0dHBQYXNzd29yZCkgewotCQlodHRwUGFzc3dvcmRfID0gaHR0cFBhc3N3b3JkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3dzZmluZGVyL1dTRmluZGVyQXhpcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3dzZmluZGVyL1dTRmluZGVyQXhpcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGNkNWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS93c2ZpbmRlci9XU0ZpbmRlckF4aXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkoyRUVXZWJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ud3NmaW5kZXIuTGl2ZVdTRExGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLndzZmluZGVyLldTRmluZGVyQ29tbW9uOwotCi1wdWJsaWMgY2xhc3MgV1NGaW5kZXJBeGlzIGV4dGVuZHMgV1NGaW5kZXJDb21tb24KLXsKLSAgcHVibGljIFdTRmluZGVyQXhpcygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZmluZCgpCi0gIHsKLSAgICBmaW5hbCBWZWN0b3Igd3NkbFVSTHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IGdldFdvcmtzcGFjZVByb2plY3RzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJOYXR1cmUgPSBnZXRXZWJOYXR1cmUocHJvamVjdHNbaV0pOwotICAgICAgaWYgKHdlYk5hdHVyZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgd2ViUHJvamVjdFVSTCA9IFJlc291cmNlVXRpbHMuZ2V0V2ViUHJvamVjdFVSTChwcm9qZWN0c1tpXSk7Ci0gICAgICAgIGlmICh3ZWJQcm9qZWN0VVJMICE9IG51bGwgJiYgd2ViUHJvamVjdFVSTC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBmaW5hbCBJRm9sZGVyIGZvbGRlcldTREwgPSBnZXRGb2xkZXJSb290UHVibGlzaGFibGUod2ViTmF0dXJlKS5nZXRGb2xkZXIoIndzZGwiKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb2xkZXJXU0RMLmFjY2VwdCgKLSAgICAgICAgICAgICAgbmV3IElSZXNvdXJjZVZpc2l0b3IoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHQgPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHQgIT0gbnVsbCAmJiBleHQuZXF1YWxzSWdub3JlQ2FzZSgid3NkbCIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc1BhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvbGRlclBhdGggPSBmb2xkZXJXU0RMLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSByZXNQYXRoLmluZGV4T2YoZm9sZGVyUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzUGF0aCA9IHJlc1BhdGguc3Vic3RyaW5nKGluZGV4K2ZvbGRlclBhdGgubGVuZ3RoKCksIHJlc1BhdGgubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIod2ViUHJvamVjdFVSTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvd3NkbCIpOwotICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChyZXNQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICB3c2RsVVJMcy5hZGQoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBMaXZlV1NETEZpbHRlcltdIGZpbHRlcnMgPSBuZXcgTGl2ZVdTRExGaWx0ZXJbd3NkbFVSTHMuc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZmlsdGVyc1tpXSA9IG5ldyBMaXZlV1NETEZpbHRlcigoU3RyaW5nKXdzZGxVUkxzLmdldChpKSk7Ci0gICAgICBmaWx0ZXJzW2ldLnN0YXJ0KCk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIWZpbHRlcnNbaV0uaXNGaW5pc2goKSkKLSAgICAgIHsKLSAgICAgICAgVGhyZWFkLnlpZWxkKCk7Ci0gICAgICAgIGkgPSAtMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghZmlsdGVyc1tpXS5pc1dTRExMaXZlKCkpCi0gICAgICAgIHdzZGxVUkxzLnJlbW92ZShmaWx0ZXJzW2ldLmdldFdTRExVUkwoKSk7Ci0gICAgfQotICAgIHJldHVybiB3c2RsVVJMczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWU5ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzYy1heGlzLXVpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMGVlMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5kaXNjb3ZlcnkuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3NkbDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlcjwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY0ODdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLndzYy1heGlzLXVpLmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHdzYy1heGlzLXVpLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiN2E4M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYnNlcnZpY2UgQXhpcyBDb25zdW1wdGlvbiBVSQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLVdFQlNFUlZJQ0VDTElFTlRUWVBFX05BTUVfSkFWQV9BWElTPUphdmEgcHJveHkKLUxBQkVMX1JVTlRJTUVfQVhJU18xMT1BcGFjaGUgQXhpcyAxLjEKLURFU0NfUlVOVElNRV9BWElTXzExPUFwYWNoZSBBeGlzIDEuMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDIyMjZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIG5hbWU9IiVQTFVHSU5fTkFNRSIKLSAgIHByb3ZpZGVyLW5hbWU9IiVQTFVHSU5fUFJPVklERVIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0id3NjLWF4aXMtdWkuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud2ViIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS5heGlzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8IS0tIFdlYiBTZXJ2aWNlIENsaWVudCBUeXBlcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlQ2xpZW50VHlwZSI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMi5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQzMl9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MC5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ0MF9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MS5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ0MV9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MC5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ1MF9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlUnVudGltZQotICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9SVU5USU1FX0FYSVNfMTEiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJURFU0NfUlVOVElNRV9BWElTXzExIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIGoyZWV2ZXJzaW9uPSIxMyAxNCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiPgotICAgICAgPC93ZWJTZXJ2aWNlUnVudGltZT4KLQotICAgICAgPHdlYlNlcnZpY2VDbGllbnRUeXBlCi0gICAgICAgICAgICBuYW1lPSIlV0VCU0VSVklDRUNMSUVOVFRZUEVfTkFNRV9KQVZBX0FYSVMiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBjbGllbnRUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50LnR5cGUuamF2YSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5XZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQzMl9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LldlYlNlcnZpY2VDbGllbnRBeGlzVHlwZS5heGlzMTEuVG9tY2F0MzJMb2NhbCI+Ci0gICAgICA8L3dlYlNlcnZpY2VDbGllbnRUeXBlPgotCi0gICAgICA8d2ViU2VydmljZUNsaWVudFR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVXRUJTRVJWSUNFQ0xJRU5UVFlQRV9OQU1FX0pBVkFfQVhJUyIKLSAgICAgICAgICAgIHJ1bnRpbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSIKLSAgICAgICAgICAgIGNsaWVudFR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgYXNzZW1ibHlCaW5kaW5nPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LldlYlNlcnZpY2VDbGllbnRBeGlzVHlwZSIKLSAgICAgICAgICAgIHNlcnZlcj0iU0VSVkVSX0lEX1RPTUNBVDQwX0xPQ0FMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuV2ViU2VydmljZUNsaWVudEF4aXNUeXBlLmF4aXMxMS5Ub21jYXQ0MExvY2FsIj4KLSAgICAgIDwvd2ViU2VydmljZUNsaWVudFR5cGU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlQ2xpZW50VHlwZQotICAgICAgICAgICAgbmFtZT0iJVdFQlNFUlZJQ0VDTElFTlRUWVBFX05BTUVfSkFWQV9BWElTIgotICAgICAgICAgICAgcnVudGltZT0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIgotICAgICAgICAgICAgY2xpZW50VHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudC50eXBlLmphdmEiCi0gICAgICAgICAgICBhc3NlbWJseUJpbmRpbmc9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuV2ViU2VydmljZUNsaWVudEF4aXNUeXBlIgotICAgICAgICAgICAgc2VydmVyPSJTRVJWRVJfSURfVE9NQ0FUNDFfTE9DQUwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5XZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUuYXhpczExLlRvbWNhdDQxTG9jYWwiPgotICAgICAgPC93ZWJTZXJ2aWNlQ2xpZW50VHlwZT4KLQotICAgICAgPHdlYlNlcnZpY2VDbGllbnRUeXBlCi0gICAgICAgICAgICBuYW1lPSIlV0VCU0VSVklDRUNMSUVOVFRZUEVfTkFNRV9KQVZBX0FYSVMiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBjbGllbnRUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50LnR5cGUuamF2YSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5XZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQ1MF9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LldlYlNlcnZpY2VDbGllbnRBeGlzVHlwZS5heGlzMTEuVG9tY2F0NTBMb2NhbCI+Ci0gICAgICA8L3dlYlNlcnZpY2VDbGllbnRUeXBlPgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBKMkVFIFNlcnZpY2UgUmVmZXJlbmNlIEdlbmVyYXRvciAtLT4KLSAgICAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLldlYlNlcnZpY2VDbGllbnRHZW5lcmF0b3IiPgotICAgICA8Z2VuZXJhdG9yCi0gICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5BeGlzQ2xpZW50R2VuZXJhdG9yIj4KLSAgICAgICAgPHJ1bnRpbWUKLSAgICAgICAgICAgICAgc2VydmVyVGFyZ2V0PSJHZW5lcmljIEoyRUUgQ29udGFpbmVyIj4KLSAgICAgICAgPC9ydW50aW1lPiAgICAgICAgIAotICAgICA8L2dlbmVyYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jb25zdW1wdGlvbi91aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzJkOWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLQotTVNHX0VSUk9SX0RFRkFVTFRfQkVBTj1JV0FCMDQ5MUUgRXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgc2V0dGluZyB1cCBkZWZhdWx0IHZhbHVlcyBmb3IgSmF2YSBiZWFuCi1NU0dfRVJST1JfUkVBRF9XU0RMPUlXQUIwNDk0RSBFcnJvciBpbiByZWFkaW5nIFdTREwgZmlsZSB7MH0KLU1TR19FUlJPUl9XU0RMX05PX0RFRklOSVRJT049SVdBQjA0OTVFIFdTREwgZmlsZSBhdCB7MH0gaGFzIG5vIGRlZmluaXRpb24gZWxlbWVudAotTVNHX0VSUk9SX1dTRExfTk9fUE9SVD1JV0FCMDQ5NkUgV1NETCBmaWxlIGF0IHswfSBoYXMgbm8gcG9ydCBlbGVtZW50Ci1NU0dfRVJST1JfV1JJVEVfV1NETD1JV0FCMDQ5N0UgRXJyb3IgaW4gd3JpdGluZyBXU0RMIGZpbGUgezB9Ci0KLQotCi0jCi0jIE1lc3NhZ2VzIGZvciBDb3B5Q2xpZW50V1NETFRhc2sKLSMKLU1TR19FUlJPUl9JTVBPUlRfV1NETD1JV0FCMDUzMUUgRXJyb3IgaW4gcmVzb2x2aW5nIFdTREwgZmlsZSB7MH0sIGltcG9ydCBXU0RMIGZpbGUgbXVzdCBoYXZlIGFic29sdXRlIFVSTCBvciByZWxhdGl2ZSBVUkwgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Ci0KLQotIwotI0RlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kCi0jCi1UQVNLX0xBQkVMX0NMSUVOVF9KQVZBX1dTRExfREVGQVVMVFM9RGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETAotVEFTS19ERVNDX0NMSUVOVF9KQVZBX1dTRExfREVGQVVMVFM9QnVpbGRzIHRoZSBKYXZhV1NETFBhcmFtZXRlciBmb3IgY2xpZW50IHNpZGUuCi1NU0dfRVJST1JfV1NETF9MT0NBVElPTl9OT1RfU0VUPUlXQUIwNTAxRSBXU0RMIGxvY2F0aW9uIG5vdCBzZXQuCi0KLSMKLSNBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzawotIwotVEFTS19MQUJFTF9KQVJTX1RPX1BST0pFQ1Q9QWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2sKLVRBU0tfREVTQ19KQVJTX1RPX1BST0pFQ1Q9QWRkIEphcnMgdG8gcHJvamVjdCBidWlsZCBwYXRoLgotTVNHX1dBUk5fTk9fSkFWQV9OQVRVUkU9SVdBQjA1MDJXIFRoZSBwcm9qZWN0IGlzIG5vdCBhIEphdmEgcHJvamVjdC4KLU1TR19FUlJPUl9CQURfQlVJTERQQVRIPUlXQUIwNTAzRSBVbmFibGUgdG8gdXBkYXRlIEphdmEgYnVpbGQgcGF0aC4gUGxlYXNlIGNoZWNrIHlvdXIgc3lzdGVtIGVudmlyb25tZW50LgotCi0jCi0jQ29weUF4aXNKYXJDb21tYW5kCi0jCi1UQVNLX0RFU0NfQ09QWV9KQVJTX1RPX1BST0pFQ1Q9Q29weUF4aXNKYXJDb21tYW5kCi1UQVNLX0xBQkVMX0NPUFlfSkFSU19UT19QUk9KRUNUPUNvcHkgcmVxdWlyZWQgQXhpcyBydW50aW1lIGphcnMgZnJvbSBwbHVnaW4gdG8gd2ViIHByb2plY3QuCi1QUk9HUkVTU19JTkZPX0NPUFlfQVhJU19DRkc9SVdBQjA1MDVJIENvcHlpbmcgQXhpcyBqYXIgZmlsZXMgdG8gd2ViIHByb2plY3QuCi1NU0dfRVJST1JfRklMRUNPUFk9SVdBQjA1MDZFIEVycm9yIHdoZW4gY29weWluZyBBeGlzIGphciBmaWxlcyB0byB3ZWIgcHJvamVjdAotCi0jCi0jUmVmcmVzaFByb2plY3RUYXNrCi0jCi1UQVNLX0xBQkVMX1JFRkVTSF9QUk9KRUNUPVJlZnJlc2hQcm9qZWN0VGFzawotVEFTS19ERVNDX1JFRkVTSF9QUk9KRUNUPVJlZnJlc2ggdGhlIGZpbGVzIG9uIHRoZSBwcm9qZWN0IHdpdGggdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotTVNHX0VSUk9SX1JFRlJFU0hfUFJPSkVDVD1JV0FCMDUwOEUgVW5hYmxlIHRvIHJlZnJlc2ggcHJvamVjdC4KLQotCi0jCi0jV2ViU2VydmljZUF4aXNQcm94eUZyYWdtZW50Ci0jCi0KLSMKLSNXZWJTZXJ2aWNlQXhpc1Byb3h5UGFnZQotIwotVE9PTFRJUF9QV0pCX1BBR0U9UGFnZQotVE9PTFRJUF9QV0pCX1RFWFRfRk9MREVSPUZvbGRlciBmb3IgcHJveHkgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGUgc2VsZWN0ZWQgYmluZGluZy4KLVRPT0xUSVBfUFdKQl9DSEVDS0JPWF9HRU5QUk9YWT1DaGVjayB0byBlbmFibGUvZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBhIHByb3h5LgotCi1QQUdFX1RJVExFX1dTX0FYSVNfUFJPWFk9V2ViIFNlcnZpY2UgUHJveHkgUGFnZQotUEFHRV9ERVNDX1dTX0FYSVNfUFJPWFk9U2VsZWN0IGdlbmVyYXRlIHByb3h5IGlmIHlvdSB3YW50IHRvIGdlbmVyYXRlIHByb3h5IGZvciB5b3VyIHNlcnZpY2UuCi1DSEVDS0JPWF9HRU5QUk9YWT1HZW5lcmF0ZSBwcm94eQotTEFCRUxfRk9MREVSX05BTUU9T3V0cHV0IGZvbGRlcgotCi0jCi0jIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sKLSMKLUNIRUNLX1dTX0REX1RBU0tfREVTQ1JJUFRJT049Q2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzawotQ0hFQ0tfV1NfRERfVEFTS19MQUJFTD1DaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrCi0KLSMKLSNDbGFzc3BhdGhVdGlscwotIwotTVNHX0VSUk9SX0NMQVNTUEFUSF9VVElMU19JT0VYQ0VQVElPTj1JV0FCMDUwOUUgSU9FeGNlcHRpb24gaW4gQ2xhc3NwYXRoVXRpbHMKLQotIwotIyBNZXNzYWdlcyBmb3IgV2ViU2VyaXZjZUF4aXNNYXBwaW5nc1BhZ2UKLSMKLVBBR0VfVElUTEVfV1NfQkVBTjJYTUw9V2ViIFNlcnZpY2UgcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwcGluZwotUEFHRV9USVRMRV9XU19YTUwyUFJPWFk9V2ViIFNlcnZpY2UgQ2xpZW50IG5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmcKLVBBR0VfREVTQ19QMk5fTUFQUElOR1M9RGVmaW5lIGN1c3RvbSBtYXBwaW5nIGZvciBwYWNrYWdlIHRvIG5hbWVzcGFjZS4KLUxBQkVMX01BUFBJTkdfUEFJUlM9TWFwcGluZyBwYWlycwotVEFCTEVfQ09MVU1OX0xBQkVMX1BBQ0tBR0U9cGFja2FnZQotVEFCTEVfQ09MVU1OX0xBQkVMX05BTUVTUEFDRT1uYW1lc3BhY2UKLUxBQkVMX0VYUExPUkVfTUFQUElOR1NfWE1MMkJFQU49RGVmaW5lIGN1c3RvbSBtYXBwaW5nIGZvciBuYW1lc3BhY2UgdG8gcGFja2FnZS4KLVRPT0xUSVBfTjJQX1NIT1dfTUFQUElOR1M9RGVmaW5lIG5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmcgZm9yIGN1c3RvbWl6YXRpb24uCi0KLSMKLSMgTWVzc2FnZXMgZm9yIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sKLSMKLU1TR19FUlJPUl9YTUxfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQ9SVdBQjA1MzJFIERvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgQXBhY2hlIEF4aXMgZGVwbG95bWVudCBkZXNjcmlwdG9yPwotCi0jCi0jTWVzc2FnZXMgZm9yIENvcHlDbGllbnRXU0RMQ29tbWFuZAotIwotVEFTS19ERVNDX0NPUFlfQ0xJRU5UX1dTREw9Q29waWVzIFdTREwgdG8gQ2xpZW50IHByb2plY3QKLVRBU0tfTEFCRUxfQ09QWV9DTElFTlRfV1NETD1Db3B5IFdTREwgdG8gQ2xpZW50IHByb2plY3QKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQWRkQXhpc0pBUlRvQnVpbGRQYXRoQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BZGRBeGlzSkFSVG9CdWlsZFBhdGhDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzFlMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BZGRBeGlzSkFSVG9CdWlsZFBhdGhDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENvbW1hbmQgdG8gYWRkIGF4aXMuamFyIHRvIHRoZSBidWlsZCBwYXRoIG9mIGEgcHJvamVjdCBhcyBhbiBleHRlcm5hbCB2YXJpYWJsZQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotICogQGF1dGhvciByc2luaGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRBeGlzSkFSVG9CdWlsZFBhdGhDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLSAgcHJpdmF0ZSBTdHJpbmcgamFyUGx1Z2luSWQgPSAib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS5heGlzIjsKLSAgcHJpdmF0ZSBTdHJpbmcgamFyUGx1Z2luUmVsUGF0aCA9ICJsaWIiOwotICBwcml2YXRlIFN0cmluZyBqYXJOYW1lID0gImF4aXMuamFyIjsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2V4ZWN1dGUob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50KQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICAvL0FkZCBKQVJzIHRvIHRoZSBjbGFzc3BhdGgKLSAgICBJQ2xhc3NwYXRoRW50cnlbXSBvbGRDbGFzc3BhdGg7Ci0gICAgSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoOwotICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLSAgICAKLSAgICAvL0dldCB0aGUgb2xkIGNsYXNzcGF0aAotICAgIHRyeQotICAgIHsgICAgCi0gICAgICBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsgICAgCi0gICAgICBpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RhdHVzIHdTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfV0FSTklOR19OT1RfQ09NUElMRSIpLCBTdGF0dXMuV0FSTklORyk7Ci0gICAgICAgIHJldHVybiB3U3RhdHVzOwotICAgICAgfQotCi0gICAgICBvbGRDbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN0YXR1cyB3U3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1dBUk5JTkdfTk9UX0NPTVBJTEUiKSwgU3RhdHVzLldBUk5JTkcpOwotICAgICAgcmV0dXJuIHdTdGF0dXM7Ci0gICAgfQotICAgIAotICAgIC8vQ2hlY2sgaWYgdGhlIGF4aXMuamFyIGlzIGFscmVhZHkgb24gdGhlIGJ1aWxkIHBhdGgKLSAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JZm9yIChpbnQgaT0wOyBpPG9sZENsYXNzcGF0aC5sZW5ndGg7IGkrKykKLQl7Ci0JICBmb3VuZCA9IGZvdW5kIHx8IG9sZENsYXNzcGF0aFtpXS5nZXRQYXRoKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGphck5hbWUudG9Mb3dlckNhc2UoKSk7Ci0gICAgfQotCi0JaWYgKGZvdW5kKSAKLQl7Ci0JICByZXR1cm4gc3RhdHVzOwotCX0gICAgCi0gICAgCi0JLy9BZGQgYXhpcy5qYXIgdG8gdGhlIGJ1aWxkIHBhdGgKLQluZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENsYXNzcGF0aC5sZW5ndGggKyAxXTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChpPTAgOyBpIDwgb2xkQ2xhc3NwYXRoLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIG5ld0NsYXNzcGF0aFtpXSA9IG9sZENsYXNzcGF0aFtpXTsKLSAgICB9Ci0gICAgCi0gICAgSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gZ2V0Q2xhc3NwYXRoRW50cnkoKTsKLSAgICBpZiAobmV3RW50cnk9PW51bGwpCi0gICAgewotICAgICAgU3RhdHVzIHdTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfV0FSTklOR19OT1RfQ09NUElMRSIpLCBTdGF0dXMuV0FSTklORyk7Ci0gICAgICByZXR1cm4gd1N0YXR1czsKLSAgICB9Ci0gICAgbmV3Q2xhc3NwYXRoW2ldID0gbmV3RW50cnk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCxudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN0YXR1cyB3U3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1dBUk5JTkdfTk9UX0NPTVBJTEUiKSwgU3RhdHVzLldBUk5JTkcpOwotICAgICAgcmV0dXJuIHdTdGF0dXM7Ci0gICAgfQotICAgIAotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgSUNsYXNzcGF0aEVudHJ5IGdldENsYXNzcGF0aEVudHJ5KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElQbHVnaW5SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0gICAgICBJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gcGx1Z2luUmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcihqYXJQbHVnaW5JZCk7Ci0KLSAgICAgIFN0cmluZ0J1ZmZlciB0aGVKYXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICB0aGVKYXIuYXBwZW5kKGphclBsdWdpblJlbFBhdGgpOwotCi0gICAgICBpZiAoamFyUGx1Z2luUmVsUGF0aC5sZW5ndGgoKT4wKQotICAgICAgICB0aGVKYXIuYXBwZW5kKElQYXRoLlNFUEFSQVRPUik7Ci0KLSAgICAgIHRoZUphci5hcHBlbmQoamFyTmFtZSk7Ci0gICAgICAKLSAgICAgIFVSTCBsb2NhbFVSTCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKSx0aGVKYXIudG9TdHJpbmcoKSkpOwotICAgICAgUGF0aCBqYXJQYXRoID0gIG5ldyBQYXRoKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0gICAgICBJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShqYXJQYXRoLCBudWxsLCBudWxsKTsKLSAgICAgIHJldHVybiBjcEVudHJ5OwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICB9Ci0gCi0gIAotICAvKioKLSAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZWI0YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLS8qKgotICogCi0gKiBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50U2NlbmFyaW9fICA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGN1c3RvbWl6ZU1hcHBpbmdzXyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVByb3h5XyA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgY2xpZW50UnVudGltZUlkXzsKLQlwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCXByaXZhdGUgSVByb2plY3QgcHJveHlQcm9qZWN0XyA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBjbGllbnRQcm9qZWN0RUFSXyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgd3NkbFVSTF87Ci0JcHJpdmF0ZSBib29sZWFuIHRlc3RQcm94eVNlbGVjdGVkXzsKLQlwcml2YXRlIElTZXJ2ZXIgY2xpZW50RXhpc3RpbmdTZXJ2ZXJfOwotCXByaXZhdGUgU3RyaW5nIGNsaWVudFNlcnZlcl87Ci0JcHJpdmF0ZSBTdHJpbmcgY2xpZW50U2VydmVyVHlwZUlkXzsKLQlwcml2YXRlIGJvb2xlYW4gY2xpZW50SXNFeGlzdGluZ1NlcnZlcl87Ci0JcHJpdmF0ZSBTdHJpbmcgcHJveHlQcm9qZWN0Rm9sZGVyXzsKLQlwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyXzsKLQkKLQkKLQlwdWJsaWMgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNleGVjdXRlKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCkKLQkgKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQkKLQkJY2xpZW50RXhpc3RpbmdTZXJ2ZXJfID0gZ2V0U2VydmVyRnJvbVNlcnZlckxhYmVsKCk7Ci0JCWlmIChjbGllbnRFeGlzdGluZ1NlcnZlcl8gIT0gbnVsbCkgewotCQkJY2xpZW50U2VydmVyVHlwZUlkXyA9IGNsaWVudEV4aXN0aW5nU2VydmVyXy5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJfSBlbHNlIHsKLQkJCS8vVE9ETyBnZXQgdGhlIGZhY3RvcnkgaWQgZm9yIHRoZSB0eXBlLgotCQl9Ci0JCS8vamF2YVdTRExQYXJhbQotCQlqYXZhV1NETFBhcmFtXyA9IG5ldyBKYXZhV1NETFBhcmFtZXRlcigpOwotCQkKLQkJLy8gcHJveHlQcm9qZWN0Rm9sYmVyXwotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRSdW50aW1lSUQoU3RyaW5nIGNsaWVudFJ1bnRpbWVJZCkgewotCQljbGllbnRSdW50aW1lSWRfID0gY2xpZW50UnVudGltZUlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UnVudGltZUlEKCkgewotCQlyZXR1cm4gdGhpcy5jbGllbnRSdW50aW1lSWRfOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpIHsKLQkJcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0Q2xpZW50UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb3h5UHJvamVjdF87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsaWVudFByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBjbGllbnRQcm9qZWN0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KElQcm9qZWN0IGNsaWVudFByb2plY3QpIHsKLQkJdGhpcy5wcm94eVByb2plY3RfID0gY2xpZW50UHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsaWVudFByb2plY3RFQVIuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldENsaWVudFByb2plY3RFQVIoKSB7Ci0JCXJldHVybiBjbGllbnRQcm9qZWN0RUFSXzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xpZW50UHJvamVjdEVBUgotCSAqICAgICAgICAgICAgVGhlIGNsaWVudFByb2plY3RFQVIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3RFQVIoSVByb2plY3QgY2xpZW50UHJvamVjdEVBUikgewotCQl0aGlzLmNsaWVudFByb2plY3RFQVJfID0gY2xpZW50UHJvamVjdEVBUjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRlc3RQcm94eVNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFRlc3RQcm94eVNlbGVjdGVkKCkgewotCQlyZXR1cm4gdGVzdFByb3h5U2VsZWN0ZWRfOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0ZXN0UHJveHlTZWxlY3RlZAotCSAqICAgICAgICAgICAgVGhlIHRlc3RQcm94eVNlbGVjdGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXN0UHJveHlTZWxlY3RlZChib29sZWFuIHRlc3RQcm94eVNlbGVjdGVkKSB7Ci0JCXRoaXMudGVzdFByb3h5U2VsZWN0ZWRfID0gdGVzdFByb3h5U2VsZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsVVJMLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSTCgpIHsKLQkgIHJldHVybiB3c2RsVVJMXzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3NkbFVSTAotCSAqICAgICAgICAgICAgVGhlIHdzZGxVUkwgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdzZGxVUkwoU3RyaW5nIHdzZGxVUkwpIHsKLQkJdGhpcy53c2RsVVJMXyA9IHdzZGxVUkw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRTZXJ2ZXIuCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXIoKSB7Ci0JCXJldHVybiBjbGllbnRFeGlzdGluZ1NlcnZlcl87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsaWVudFNlcnZlcgotCSAqICAgICAgICAgICAgVGhlIGNsaWVudFNlcnZlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50U2VydmVyKFN0cmluZyBjbGllbnRTZXJ2ZXIpIHsKLQkJdGhpcy5jbGllbnRTZXJ2ZXJfID0gY2xpZW50U2VydmVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50SXNFeGlzdGluZ1NlcnZlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsaWVudElzRXhpc3RpbmdTZXJ2ZXIoKSB7Ci0JCXJldHVybiBjbGllbnRJc0V4aXN0aW5nU2VydmVyXzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xpZW50SXNFeGlzdGluZ1NlcnZlcgotCSAqICAgICAgICAgICAgVGhlIGNsaWVudElzRXhpc3RpbmdTZXJ2ZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaWVudElzRXhpc3RpbmdTZXJ2ZXIoYm9vbGVhbiBjbGllbnRJc0V4aXN0aW5nU2VydmVyKSB7Ci0JCXRoaXMuY2xpZW50SXNFeGlzdGluZ1NlcnZlcl8gPSBjbGllbnRJc0V4aXN0aW5nU2VydmVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzKCkgewotCQlyZXR1cm4gY3VzdG9taXplTWFwcGluZ3NfOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzKGJvb2xlYW4gdmFsdWUpIHsKLQkJY3VzdG9taXplTWFwcGluZ3NfID0gdmFsdWU7Ci0JfQotCi0JcHJpdmF0ZSBJU2VydmVyIGdldFNlcnZlckZyb21TZXJ2ZXJMYWJlbCgpIHsKLQkJaWYgKHRydWUpCi0JCS8vIHJzayByZXZpc2l0IGlmIChjbGllbnRJc0V4aXN0aW5nU2VydmVyXykKLQkJewotCQkJLy8gTWF5YmUgdGhpcyBzaG91bGQgYmUgaW4gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkKLQkJCVZlY3RvciBzZXJ2ZXJJZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCQl7Ci0JCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJCQlpZiAoc2VydmVycyAhPSBudWxsICYmIHNlcnZlcnMubGVuZ3RoIT0wKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgc2VydmVyc1tpXTsKLQkJCQkJCWlmICgoc2VydmVyLmdldE5hbWUoKSkuZXF1YWxzKGNsaWVudFNlcnZlcl8pKQotCQkJCQkJCXJldHVybiBzZXJ2ZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLwotCQl9IGVsc2UgewotCQkJLy9UT0RPIGNyZWF0ZSB0aGUgc2VydmVyCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJveHlQcm9qZWN0Rm9sZGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJveHlQcm9qZWN0Rm9sZGVyKCkgewotCQlpZiAocHJveHlQcm9qZWN0XyE9bnVsbCkgewotCQkJcHJveHlQcm9qZWN0Rm9sZGVyXyA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKHByb3h5UHJvamVjdF8pLnRvU3RyaW5nKCk7Ci0JCX0JCQotCQlyZXR1cm4gcHJveHlQcm9qZWN0Rm9sZGVyXzsgIAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkgewotCQlyZXR1cm4gd2ViU2VydmljZXNQYXJzZXJfOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikgewotCQl0aGlzLndlYlNlcnZpY2VzUGFyc2VyXyA9IHdlYlNlcnZpY2VzUGFyc2VyOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdlbmVyYXRlUHJveHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpIHsKLQkJcmV0dXJuIGdlbmVyYXRlUHJveHlfOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZ2VuZXJhdGVQcm94eSBUaGUgZ2VuZXJhdGVQcm94eSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHkpIHsKLQkJdGhpcy5nZW5lcmF0ZVByb3h5XyA9IGdlbmVyYXRlUHJveHk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNDbGllbnRTY2VuYXJpb18uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SXNDbGllbnRTY2VuYXJpbygpCi0gICAgewotICAgICAgcmV0dXJuIGlzQ2xpZW50U2NlbmFyaW9fOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaXNDbGllbnRTY2VuYXJpb18gVGhlIGlzQ2xpZW50U2NlbmFyaW9fIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0NsaWVudFNjZW5hcmlvKGJvb2xlYW4gaXNDbGllbnRTY2VuYXJpbykKLSAgICB7Ci0gICAgICBpc0NsaWVudFNjZW5hcmlvXyA9IGlzQ2xpZW50U2NlbmFyaW87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXRFbmRwb2ludE1ldGhvZCBUaGUgc2V0RW5kcG9pbnRNZXRob2QgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2V0RW5kcG9pbnRNZXRob2QoKQotICAgIHsKLSAgICAgIHJldHVybiAic2V0RW5kcG9pbnQiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQXhpc0NsaWVudEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDhhZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VDbGllbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmVudi5KMkVFRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkNvcHlBeGlzSmFyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5SZWZyZXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzQ2xpZW50R2VuZXJhdG9yIGV4dGVuZHMgV2ViU2VydmljZUNsaWVudEdlbmVyYXRvciAKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGdlbldlYlNlcnZpY2VDbGllbnRBcnRpZmFjdHMoV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyIGRhdGFNb2RlbCkKLSAgewotICAJLy9nZXQgaW5mbyBmcm9tIHRoZSBtb2RlbAotICAJU3RyaW5nIHdzZGxVUkwgPSBkYXRhTW9kZWwuZ2V0V1NETFVybCgpOwotICAgIFN0cmluZyBwcm9qZWN0ID0gZGF0YU1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgU3RyaW5nIG91dHB1dFdTRExGaWxlUGF0aE5hbWUgPSBkYXRhTW9kZWwuZ2V0T3V0cHV0V1NETEZpbGVOYW1lKCk7Ci0gICAgU3RyaW5nIHNlcnZpY2VRTmFtZSA9IGRhdGFNb2RlbC5nZXRTZXJ2aWNlUU5hbWUoKTsKLSAgICBib29sZWFuIHNob3VsZERlcGxveSA9IGRhdGFNb2RlbC5zaG91bGREZXBsb3koKTsKLSAgICAKLSAgICAKLSAgICAvL0dlbmVyYXRlIHRoZSBhcnRpZmFjdHMKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgLy9BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQKLSAgICBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kID0gbmV3IEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLnNldFdzZGxVUkwod3NkbFVSTCk7Ci0gICAgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLnNldFdlYlNlcnZpY2VzUGFyc2VyKG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpKTsKLSAgICBheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuc2V0Q2xpZW50UHJvamVjdCgoSVByb2plY3QpKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0ocHJvamVjdCkpKTsKLSAgICBheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuc2V0VGVzdFByb3h5U2VsZWN0ZWQoZmFsc2UpOwotICAgIGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5zZXRJc0NsaWVudFNjZW5hcmlvKHRydWUpOwotICAgIGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5zZXRHZW5lcmF0ZVByb3h5KHRydWUpOwotICAgIEoyRUVFbnZpcm9ubWVudCBqMmVlRW52aXJvbm1lbnQgPSBuZXcgSjJFRUVudmlyb25tZW50KCk7Ci0gICAgc3RhdHVzID0gYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmV4ZWN1dGUoajJlZUVudmlyb25tZW50KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgICB9Ci0gICAgCi0vLyAgRmlndXJlIG91dCBpZiB0aGlzIGlzIGEgV2ViLCBFSkIsIG9yIEFwcENsaWVudCBwcm9qZWN0Ci0gICAgYm9vbGVhbiBpc1dlYlByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0Q2xpZW50UHJvamVjdCgpKTsKLSAgICAKLSAgICAvL0RlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQKLSAgICBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kIGh0dHBDb21tYW5kID0gbmV3IERlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQoKTsKLSAgICBodHRwQ29tbWFuZC5zZXRKYXZhV1NETFBhcmFtKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRKYXZhV1NETFBhcmFtKCkpOwotICAgIGh0dHBDb21tYW5kLnNldFdzZGxTZXJ2aWNlVVJMKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXc2RsVVJMKCkpOwotICAgIGh0dHBDb21tYW5kLnNldFdlYlNlcnZpY2VzUGFyc2VyKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXZWJTZXJ2aWNlc1BhcnNlcigpKTsKLSAgICBzdGF0dXMgPSBodHRwQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfQotICAgIAotICAgIC8vQ29weUF4aXNKYXJDb21tYW5kCi0gICAgLy9UaGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIEF4aXMgV1NETDJKYXZhIGVtaXR0ZXIgcmVxdWlyZXMgYXhpcy5qYXIgaW4gb3JkZXIgdG8gY29tcGlsZS4KLSAgICAvL0luIHRoZSBjYXNlIG9mIGEgV2ViIHByb2plY3QsIHdlIGFkZCBpdCB0byB0aGUgbGliIGRpcmVjdG9yeS4KLSAgICAvL0luIHRoZSBjYXNlIG9mIGFuIEVKQiBvciBBcHAgQ2xpZW50IHByb2plY3QsIHdlIGFkZCBpdCBhcyBhbiBleHRlcm5hbCBKQVIuIFRoaXMgYnJlYWtzCi0gICAgLy90aGUgdGVhbSBlbnZpcm9ubWVudCBzY2VuYXJpby4gV2Ugd2lsbCBoYXZlIHRvIHRoaW5rIG9mIGEgYmV0dGVyIHdheSB0byBkZWFsIHdpdGggdGhpcyAKLSAgICAvL2luIHRoZSBmdXR1cmUuCi0gICAgaWYgKGlzV2ViUHJvamVjdCkKLSAgICB7Ci0JICAgIENvcHlBeGlzSmFyQ29tbWFuZCBheGpDb21tYW5kID0gbmV3IENvcHlBeGlzSmFyQ29tbWFuZCgpOwotCSAgICBheGpDb21tYW5kLnNldFByb2plY3QoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldENsaWVudFByb2plY3QoKSk7Ci0JICAgIHN0YXR1cyA9IGF4akNvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotCSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLQkgICAgewotCSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotCSAgICB9Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgQWRkQXhpc0pBUlRvQnVpbGRQYXRoQ29tbWFuZCBhZGRBeGlzQ29tbWFuZCA9IG5ldyBBZGRBeGlzSkFSVG9CdWlsZFBhdGhDb21tYW5kKCk7Ci0gICAgICBhZGRBeGlzQ29tbWFuZC5zZXRQcm9qZWN0KGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRDbGllbnRQcm9qZWN0KCkpOwotICAgICAgc3RhdHVzID0gYWRkQXhpc0NvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotCSAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IFN0YXR1cy5PSykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIC8vQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2sKLSAgICBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzayBhZGRKYXJzQ29tbWFuZCA9IG5ldyBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzaygpOwotICAgIGFkZEphcnNDb21tYW5kLnNldFByb2plY3QoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldENsaWVudFByb2plY3QoKSk7Ci0gICAgc3RhdHVzID0gYWRkSmFyc0NvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotICAgIH0gICAgCi0gICAgCi0gICAgLy9EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZAotICAgIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kIGRlZkNsaWVudENvbW1hbmQgPSBuZXcgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQoKTsKLSAgICBkZWZDbGllbnRDb21tYW5kLnNldEphdmFXU0RMUGFyYW0oYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldEphdmFXU0RMUGFyYW0oKSk7Ci0gICAgZGVmQ2xpZW50Q29tbWFuZC5zZXRQcm94eVByb2plY3QoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldENsaWVudFByb2plY3QoKSk7Ci0gICAgZGVmQ2xpZW50Q29tbWFuZC5zZXRXU0RMU2VydmljZVVSTChheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0V3NkbFVSTCgpKTsKLSAgICBzdGF0dXMgPSBkZWZDbGllbnRDb21tYW5kLmV4ZWN1dGUoajJlZUVudmlyb25tZW50KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgICB9ICAgICAgICAKLSAgICAKLSAgICAvL1ZhbGlkYXRlV1NETENvbW1hbmQKLSAgICBWYWxpZGF0ZVdTRExDb21tYW5kIHZhbFdTRExDb21tYW5kID0gbmV3IFZhbGlkYXRlV1NETENvbW1hbmQoKTsKLSAgICB2YWxXU0RMQ29tbWFuZC5zZXRXc2RsVVJJKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXc2RsVVJMKCkpOwotICAgIHZhbFdTRExDb21tYW5kLnNldFdlYlNlcnZpY2VzUGFyc2VyKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXZWJTZXJ2aWNlc1BhcnNlcigpKTsKLSAgICBzdGF0dXMgPSB2YWxXU0RMQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvL1dTREwySmF2YUNvbW1hbmQKLSAgICBXU0RMMkphdmFDb21tYW5kIHcyakNvbW1hbmQgPSBuZXcgV1NETDJKYXZhQ29tbWFuZCgpOwotICAgIHcyakNvbW1hbmQuc2V0SmF2YVdTRExQYXJhbShheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0SmF2YVdTRExQYXJhbSgpKTsKLSAgICB3MmpDb21tYW5kLnNldFdzZGxVUkkoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldFdzZGxVUkwoKSk7Ci0gICAgc3RhdHVzID0gdzJqQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfSAgICAKLQotICAgIC8vUmVmcmVzaFByb2plY3RDb21tYW5kCi0gICAgUmVmcmVzaFByb2plY3RDb21tYW5kIHJlZnJlc2hDb21tYW5kID0gbmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpOwotICAgIHJlZnJlc2hDb21tYW5kLnNldFByb2plY3QoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldENsaWVudFByb2plY3QoKSk7Ci0gICAgc3RhdHVzID0gcmVmcmVzaENvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotICAgIH0gICAgCi0gICAgCi0gICAgU3R1YjJCZWFuQ29tbWFuZCBzMmJDb21tYW5kID0gbmV3IFN0dWIyQmVhbkNvbW1hbmQoKTsKLSAgICBzMmJDb21tYW5kLnNldEphdmFXU0RMUGFyYW0oYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldEphdmFXU0RMUGFyYW0oKSk7Ci0gICAgczJiQ29tbWFuZC5zZXRXZWJTZXJ2aWNlc1BhcnNlcihheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0V2ViU2VydmljZXNQYXJzZXIoKSk7Ci0gICAgczJiQ29tbWFuZC5zZXRDbGllbnRQcm9qZWN0KGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRDbGllbnRQcm9qZWN0KCkpOwotICAgIHN0YXR1cyA9IHMyYkNvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOyAKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgICB9Ci0KLSAgICAvL0NvcHlDbGllbnRXU0RMQ29tbWFuZAotICAgIENvcHlDbGllbnRXU0RMQ29tbWFuZCBjb3B5Q29tbWFuZCA9IG5ldyBDb3B5Q2xpZW50V1NETENvbW1hbmQoKTsKLSAgICBjb3B5Q29tbWFuZC5zZXRXc2RsVVJMKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXc2RsVVJMKCkpOwotICAgIGNvcHlDb21tYW5kLnNldENsaWVudFdTRExQYXRoTmFtZShvdXRwdXRXU0RMRmlsZVBhdGhOYW1lKTsKLSAgICBjb3B5Q29tbWFuZC5zZXRXc1BhcnNlcihheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0V2ViU2VydmljZXNQYXJzZXIoKSk7Ci0gICAgc3RhdHVzID0gY29weUNvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotICAgIH0gICAgCi0gICAgCi0gICAgCi0gICAgLy9CdWlsZFByb2plY3RDb21tYW5kCi0gICAgQnVpbGRQcm9qZWN0Q29tbWFuZCBidWlsZENvbW1hbmQgPSBuZXcgQnVpbGRQcm9qZWN0Q29tbWFuZCgpOwotICAgIGJ1aWxkQ29tbWFuZC5zZXRQcm9qZWN0KGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRDbGllbnRQcm9qZWN0KCkpOwotICAgIGJ1aWxkQ29tbWFuZC5zZXRGb3JjZUJ1aWxkKHRydWUpOwotICAgIHN0YXR1cyA9IGJ1aWxkQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfSAgICAKLSAgICAgICAgCi0gICAgLy9DYWxjdWxhdGUgdGhlIHNlcnZpY2UgaW50ZXJmYWNlIGFuZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBuYW1lcwotICAgIEludGVyZmFjZU5hbWVzIGludGVyZmFjZU5hbWVzID0gY2FsY3VsYXRlU0lhbmRTRUlOYW1lKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXc2RsVVJMKCksIHNlcnZpY2VRTmFtZSwgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldFdlYlNlcnZpY2VzUGFyc2VyKCkpOwotICAgIFN0cmluZyBzaU5hbWUgPSBpbnRlcmZhY2VOYW1lcy5nZXRTaU5hbWUoKTsgCi0gICAgU3RyaW5nW10gc2VpTmFtZXMgPSBpbnRlcmZhY2VOYW1lcy5nZXRTZWlOYW1lcygpOwotICAgIGlmIChzaU5hbWU9PW51bGwgfHwgc2lOYW1lLmxlbmd0aCgpPT0wIHx8IHNlaU5hbWVzPT1udWxsIHx8IHNlaU5hbWVzLmxlbmd0aD09MCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMoSVN0YXR1cy5FUlJPUixwbHVnaW5JZF8sMCwiUHJvYmxlbXMhISIsbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8vU2V0IGluZm8gb24gdGhlIGRhdGFNb2RlbAotICAgIGRhdGFNb2RlbC5zZXRTZXJ2aWNlSW50ZXJmYWNlTmFtZShzaU5hbWUpOwotICAgIGRhdGFNb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lcyhzZWlOYW1lcyk7Ci0gICAgZGF0YU1vZGVsLnNldERpZEdlbkRlc2NyaXB0b3JzKGZhbHNlKTsKLSAgICAKLSAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBJbnRlcmZhY2VOYW1lcyBjYWxjdWxhdGVTSWFuZFNFSU5hbWUoU3RyaW5nIHdzZGxVUkwsIFN0cmluZyBzZXJ2aWNlUU5hbWUsIFdlYlNlcnZpY2VzUGFyc2VyIHdzUGFyc2VyKQotICB7Ci0gICAgSW50ZXJmYWNlTmFtZXMgaU5hbWVzID0gbmV3IEludGVyZmFjZU5hbWVzKCk7Ci0gICAgU3RyaW5nIHNlcnZpY2VMb2NhbFBhcnQgPSBzZXJ2aWNlUU5hbWUuc3Vic3RyaW5nKHNlcnZpY2VRTmFtZS5sYXN0SW5kZXhPZignOicpKzEpOwotICAgIE1hcCBwa2cybnNNYXBwaW5nID0gbnVsbDsKLSAgICBEZWZpbml0aW9uIGRlZiA9IHdzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotIAotICAgIE1hcCBzZXJ2aWNlcyA9IGRlZi5nZXRTZXJ2aWNlcygpOwotICAgIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgc2VydmljZSA9IChTZXJ2aWNlKWl0Lm5leHQoKTsKLSAgICAgIGlmIChzZXJ2aWNlTG9jYWxQYXJ0LmVxdWFscyhzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKQotICAgICAgICBicmVhazsKLSAgICB9ICAgICAgICAKLSAgICAgIAotICAgIGlmIChzZXJ2aWNlIT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBzZXJ2aWNlUGtnTmFtZSA9IFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZShzZXJ2aWNlLCBwa2cybnNNYXBwaW5nKTsKLSAgICAgIFN0cmluZyBzZXJ2aWNlQ2xhc3NOYW1lID0gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgU3RyaW5nIGpuZGlOYW1lID0gc2VydmljZUNsYXNzTmFtZTsKLSAgICAgIE1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXJ2aWNlQ2xhc3NOYW1lLmVxdWFscygoKFBvcnQpaXQyLm5leHQoKSkuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlQ2xhc3NOYW1lID0gc2VydmljZUNsYXNzTmFtZSArICJfU2VydmljZSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIEFycmF5TGlzdCBzZWlOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KWl0Mi5uZXh0KCk7Ci0gICAgICAgIFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzID0gbnVsbDsKLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0MyA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOyBpdDMuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXQzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc29hcEFkZHJlc3MgPSAoU09BUEFkZHJlc3Mpb2JqZWN0OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvYXBBZGRyZXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IHBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCk7Ci0gICAgICAgICAgUU5hbWUgcG9ydFR5cGVRTmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHBvcnRUeXBlUGtnTmFtZSA9IFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZShwb3J0VHlwZSwgcGtnMm5zTWFwcGluZyk7Ci0gICAgICAgICAgU3RyaW5nIHBvcnRUeXBlQ2xhc3NOYW1lID0gcG9ydFR5cGVRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICBpZiAoam5kaU5hbWUuZXF1YWxzKHBvcnRUeXBlQ2xhc3NOYW1lKSkKLSAgICAgICAgICAgICAgcG9ydFR5cGVDbGFzc05hbWUgPSBwb3J0VHlwZUNsYXNzTmFtZSArICJfUG9ydCI7Ci0gICAgICAgICAgc2VpTmFtZXMuYWRkKHBvcnRUeXBlUGtnTmFtZSsiLiIrcG9ydFR5cGVDbGFzc05hbWUpOyAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaU5hbWVzLnNldFNpTmFtZShzZXJ2aWNlUGtnTmFtZSsiLiIrc2VydmljZUNsYXNzTmFtZSk7Ci0gICAgICBpTmFtZXMuc2V0U0VJTmFtZXMoY29udmVydFRvU3RyaW5nQXJyYXkoc2VpTmFtZXMudG9BcnJheSgpKSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gaU5hbWVzOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZ1tdIGNvbnZlcnRUb1N0cmluZ0FycmF5KE9iamVjdFtdIGEpCi0gIHsKLSAgCWlmIChhPT1udWxsKSByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgCQotICAJaW50IGxlbmd0aCA9IGEubGVuZ3RoOwotICAJU3RyaW5nW10gc2EgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0gIAlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspCi0gIAl7Ci0gIAkJT2JqZWN0IG9iaiA9IGFbaV07Ci0gIAkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykKLSAgCQl7Ci0gIAkJCXNhW2ldID0gKFN0cmluZylvYmo7Ci0gIAkJfQotICAJfQotICAJcmV0dXJuIHNhOwotICB9ICAKLSAgcHJpdmF0ZSBjbGFzcyBJbnRlcmZhY2VOYW1lcwotICB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2lOYW1lXzsKLSAgICBwcml2YXRlIFN0cmluZ1tdIHNlaU5hbWVzXzsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuIHNpTmFtZV87Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFNlaU5hbWVzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2VpTmFtZXNfOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTaU5hbWUoU3RyaW5nIHNpTmFtZSkKLSAgICB7Ci0gICAgICBzaU5hbWVfID0gc2lOYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTRUlOYW1lcyhTdHJpbmdbXSBzZWlOYW1lcykKLSAgICB7Ci0gICAgICBzZWlOYW1lc18gPSBzZWlOYW1lczsKLSAgICB9Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQ29weUNsaWVudFdTRExDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9jb21tYW5kL0NvcHlDbGllbnRXU0RMQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjE5YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQ29weUNsaWVudFdTRExDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29weUNsaWVudFdTRExDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfQ09QWV9DTElFTlRfV1NETCI7Ci0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfQ09QWV9DTElFTlRfV1NETCI7Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsgIAotICBwcml2YXRlIFN0cmluZyB3c2RsVVJMXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50V1NETFBhdGhOYW1lXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3c1BhcnNlcl87Ci0gIAotICBwdWJsaWMgQ29weUNsaWVudFdTRExDb21tYW5kKCkKLSAgewotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgRGVmaW5pdGlvbiBkZWYgPSB3c1BhcnNlcl8uZ2V0V1NETERlZmluaXRpb24od3NkbFVSTF8pOwotICAgIGlmKGRlZj09bnVsbCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKHBsdWdpbklkXywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XU0RMX05PX0RFRklOSVRJT04iLG5ldyBTdHJpbmdbXXt3c2RsVVJMX30pLFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBJUGF0aCBjbGllbnRXU0RMUGF0aCA9IG5ldyBQYXRoKGNsaWVudFdTRExQYXRoTmFtZV8pOwotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBGaWxlUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCk7Ci0gICAgc3RhdHVzID0gcmVzb2x2ZVdTREwod29ya3NwYWNlUm9vdCwgZGVmLCBjbGllbnRXU0RMUGF0aCxlbnYpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotCXByaXZhdGUgU3RhdHVzIHJlc29sdmVXU0RMKAotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2UsCi0JCURlZmluaXRpb24gd3NkbERlZiwKLQkJSVBhdGggd3NkbFBhdGgsCi0JCUVudmlyb25tZW50IGVudikgewotCQl0cnkgewotCQkJd3JpdGVXU0RMRmlsZSh3b3Jrc3BhY2UsIHdzZGxEZWYsIHdzZGxQYXRoLCBlbnYpOwotCQkJTWFwIGltcG9ydERlZnMgPSB3c2RsRGVmLmdldEltcG9ydHMoKTsKLQkJCVNldCBrZXlzU2V0ID0gaW1wb3J0RGVmcy5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgZSA9IGtleXNTZXQuaXRlcmF0b3IoKTsgZS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleU5hbWUgPSBlLm5leHQoKTsKLQkJCQlWZWN0b3IgdmVjdG9yID0gKFZlY3RvcikgaW1wb3J0RGVmcy5nZXQoa2V5TmFtZSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3Iuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSW1wb3J0IGltcG9ydERlZiA9IChJbXBvcnQpIHZlY3Rvci5nZXQoaSk7Ci0JCQkJCURlZmluaXRpb24gZGVmID0gaW1wb3J0RGVmLmdldERlZmluaXRpb24oKTsKLQkJCQkJU3RyaW5nIG5ld1BhdGhTdHJpbmcgPQotCQkJCQkJd3NkbFBhdGgudG9TdHJpbmcoKS5zdWJzdHJpbmcoCi0JCQkJCQkJMCwKLQkJCQkJCQl3c2RsUGF0aC50b1N0cmluZygpLmxhc3RJbmRleE9mKCIvIikgKyAxKTsJIC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGlzSW52YWxpZEltcG9ydFdTREwoaW1wb3J0RGVmLmdldExvY2F0aW9uVVJJKCkpKSB7Ci0JCQkJCSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhwbHVnaW5JZF8sIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU1QT1JUX1dTREwiLG5ldyBTdHJpbmdbXXtpbXBvcnREZWYuZ2V0TG9jYXRpb25VUkkoKX0pLCBTdGF0dXMuRVJST1IpOwotCQkJCQl9Ci0JCQkJCUlQYXRoIG5ld1BhdGggPQotCQkJCQkJbmV3IFBhdGgobmV3UGF0aFN0cmluZyArIGltcG9ydERlZi5nZXRMb2NhdGlvblVSSSgpKTsKLQkJCQkJU3RhdHVzIHN0YXR1cyA9IHJlc29sdmVXU0RMKHdvcmtzcGFjZSwgZGVmLCBuZXdQYXRoLCBlbnYpOwotCQkJCQlpZiAoc3RhdHVzICE9IG51bGwKLQkJCQkJCSYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgewotCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKHBsdWdpbklkXywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XUklURV9XU0RMIixuZXcgU3RyaW5nW10geyB3c2RsUGF0aC50b1N0cmluZygpIH0pLCBTdGF0dXMuRVJST1IsIGUpOwotCQl9Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnZhbGlkSW1wb3J0V1NETChTdHJpbmcgd3NkbFBhdGgpIHsKLQotCQkvLyByZWxhdGl2ZSB1cmwKLQkJaWYgKCF3c2RsUGF0aC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICh3c2RsUGF0aC5pbmRleE9mKCIvIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICghd3NkbFBhdGguc3RhcnRzV2l0aCgiLi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVXU0RMRmlsZSgKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlLAotCQlEZWZpbml0aW9uIHdzZGxEZWYsCi0JCUlQYXRoIHdzZGxQYXRoLAotCQlFbnZpcm9ubWVudCBlbnYpCi0JCXRocm93cyBFeGNlcHRpb24gewotCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkvL1dTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJLy9XU0RMV3JpdGVyIHdzZGxXcml0ZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMV3JpdGVyKCk7Ci0JCVdTRExXcml0ZXIgd3NkbFdyaXRlciA9IChuZXcgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsKCkpLm5ld1dTRExXcml0ZXIoKTsKLQkJd3NkbFdyaXRlci53cml0ZVdTREwod3NkbERlZiwgYmFvcyk7Ci0JCWJ5dGVbXSBiID0gYmFvcy50b0J5dGVBcnJheSgpOwotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpOwotCi0JCVJlc291cmNlQ29udGV4dCBjb250ZXh0ID0KLQkJCVdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZUNvbnRleHQoKTsKLQkJRmlsZVJlc291cmNlVXRpbHMuY3JlYXRlRmlsZSgKLQkJCWNvbnRleHQsCi0JCQl3c2RsUGF0aC5tYWtlQWJzb2x1dGUoKSwKLQkJCWJhaXMsCi0JCQllbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksCi0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpKTsKLQotCQliYW9zLmNsb3NlKCk7Ci0JCWJhaXMuY2xvc2UoKTsKLQotCX0gIAotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBjbGllbnRXU0RMUGF0aE5hbWVfIFRoZSBjbGllbnRXU0RMUGF0aE5hbWVfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFdTRExQYXRoTmFtZShTdHJpbmcgY2xpZW50V1NETFBhdGhOYW1lKQotICB7Ci0gICAgdGhpcy5jbGllbnRXU0RMUGF0aE5hbWVfID0gY2xpZW50V1NETFBhdGhOYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd3NkbFVSTF8gVGhlIHdzZGxVUkxfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkwoU3RyaW5nIHdzZGxVUkwpCi0gIHsKLSAgICB0aGlzLndzZGxVUkxfID0gd3NkbFVSTDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHdzUGFyc2VyXyBUaGUgd3NQYXJzZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53c1BhcnNlcl8gPSB3c1BhcnNlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ5NjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWwuUGxhdGZvcm1VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm94eVByb2plY3RfOwotCXByaXZhdGUgU3RyaW5nIFdTRExTZXJ2aWNlVVJMXzsKLQlwcml2YXRlIFN0cmluZyBXU0RMU2VydmljZVBhdGhuYW1lXzsKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLQkKLQlwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0NMSUVOVF9KQVZBX1dTRExfREVGQVVMVFMiOwotCXByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19DTElFTlRfSkFWQV9XU0RMX0RFRkFVTFRTIjsKLQotCXB1YmxpYyBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZCgpIHsKLQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsJCQotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuCi0JICovCi0JcHVibGljIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kKAotCQlKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtLAotCQlNb2RlbCBtb2RlbCkgewotCQkvL3N1cGVyKCk7Ci0JCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlTdGF0dXMgc3RhdHVzOwotCQlpZiAoamF2YVdTRExQYXJhbV8gPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWNvcmVNc2dVdGlsc18uZ2V0TWVzc2FnZSgKLQkJCQkiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksCi0JCQkJU3RhdHVzLkVSUk9SKTsKLQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCWphdmFXU0RMUGFyYW1fLnNldE1ldGFJbmZPbmx5KGZhbHNlKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0U2VydmVyU2lkZShKYXZhV1NETFBhcmFtZXRlci5TRVJWRVJfU0lERV9OT05FKTsKLQkJCi0JCUlQYXRoIHdlYk1vZHVsZVNlcnZlclJvb3QgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbihwcm94eVByb2plY3RfKTsKLQkJLy9TdHJpbmcgb3V0cHV0ID0gUGxhdGZvcm1VdGlscy5nZXRQbGF0Zm9ybVVSTCh3ZWJNb2R1bGVTZXJ2ZXJSb290KTsKLQkJU3RyaW5nIG91dHB1dCA9CVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHdlYk1vZHVsZVNlcnZlclJvb3QpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRKYXZhT3V0cHV0KG91dHB1dCk7Ci0KLQotCQlJQ29udGFpbmVyIHdlYk1vZHVsZUNvbnRhaW5lciA9IFJlc291cmNlVXRpbHMuZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChwcm94eVByb2plY3RfKTsKLQkJaWYgKHdlYk1vZHVsZUNvbnRhaW5lciAhPW51bGwpCi0JCXsKLQkJICBJUGF0aCB3ZWJNb2R1bGVQYXRoID0gd2ViTW9kdWxlQ29udGFpbmVyLmdldEZ1bGxQYXRoKCk7Ci0JCSAgLy9vdXRwdXQgPSAgUGxhdGZvcm1VdGlscy5nZXRQbGF0Zm9ybVVSTCh3ZWJNb2R1bGVQYXRoKTsKLQkJICBvdXRwdXQgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh3ZWJNb2R1bGVQYXRoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCSAgamF2YVdTRExQYXJhbV8uc2V0T3V0cHV0KG91dHB1dCk7Ci0JCX0KLQotCi0JCWlmIChXU0RMU2VydmljZVBhdGhuYW1lXyA9PSBudWxsKSB7Ci0JCQkKLQkJCWlmIChXU0RMU2VydmljZVVSTF8gPT0gbnVsbCkgewotCQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkRlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCSJNU0dfRVJST1JfV1NETF9MT0NBVElPTl9OT1RfU0VUIiksCi0JCQkJCVN0YXR1cy5FUlJPUik7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVdTRExTZXJ2aWNlVVJMXyA9IFBsYXRmb3JtVXRpbHMuZ2V0RmlsZUZyb21QbGF0Zm9ybShXU0RMU2VydmljZVBhdGhuYW1lXyk7Ci0JCX0KLQotCQlqYXZhV1NETFBhcmFtXy5zZXRJbnB1dFdzZGxMb2NhdGlvbihXU0RMU2VydmljZVVSTF8pOwotCi0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGphdmFXU0RMUGFyYW0uCi0JICogQHJldHVybiBKYXZhV1NETFBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotCQlyZXR1cm4gamF2YVdTRExQYXJhbV87Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLQkgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJdGhpcy5qYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3h5UHJvamVjdF8gVGhlIHByb3h5UHJvamVjdF8gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3h5UHJvamVjdChJUHJvamVjdCBwcm94eVByb2plY3QpIHsKLQkJdGhpcy5wcm94eVByb2plY3RfID0gcHJveHlQcm9qZWN0OwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc2VydmljZVVSTF8gVGhlIHdTRExTZXJ2aWNlVVJMXyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0V1NETFNlcnZpY2VVUkwoU3RyaW5nIHNlcnZpY2VVUkwpIHsKLQkJV1NETFNlcnZpY2VVUkxfID0gc2VydmljZVVSTDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNlcnZpY2VQYXRobmFtZV8gVGhlIHdTRExTZXJ2aWNlUGF0aG5hbWVfIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXU0RMU2VydmljZVBhdGhuYW1lKFN0cmluZyBzZXJ2aWNlUGF0aG5hbWUpIHsKLQkJV1NETFNlcnZpY2VQYXRobmFtZV8gPSBzZXJ2aWNlUGF0aG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVDb21tYW5kTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVDb21tYW5kTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjRjMWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFQ29tbWFuZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuZW52OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZE1hbmFnZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFQ29tbWFuZE1hbmFnZXIgaW1wbGVtZW50cyBDb21tYW5kTWFuYWdlcgotewotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZE1hbmFnZXIjaXNVbmRvRW5hYmxlZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9FbmFibGVkKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVFbnZpcm9ubWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI3MmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmVudjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uSmF2YUNvbXBpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuU2ltcGxlVVJJRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJRmFjdG9yeTsKLQotCi0vKioKLSoKLSovCi1wdWJsaWMgY2xhc3MgSjJFRUVudmlyb25tZW50IGltcGxlbWVudHMgRW52aXJvbm1lbnQKLXsKLSAgSjJFRUxvZyBqMmVlTG9nXzsKLSAgSjJFRVByb2dyZXNzTW9uaXRvciBqMmVlUHJvZ3Jlc3NNb25pdG9yXzsKLSAgSjJFRVN0YXR1c0hhbmRsZXIgajJlZVN0YXR1c0hhbmRsZXJfOwotICBTaW1wbGVVUklGYWN0b3J5IHNpbXBsZVVSSUZhY3RvcnlfOwotICBKMkVFQ29tbWFuZE1hbmFnZXIgajJlZUNvbW1hbmRNYW5hZ2VyXzsKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0TG9nKCkKLSAgICovCi0gIHB1YmxpYyBMb2cgZ2V0TG9nKCkKLSAgewotICAgIGlmIChqMmVlTG9nXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGoyZWVMb2dfID0gbmV3IEoyRUVMb2coKTsKLSAgICB9Ci0gICAgcmV0dXJuIGoyZWVMb2dfOwotICAgIAotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLSAgICovCi0gIHB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLSAgewotICAgIGlmIChqMmVlUHJvZ3Jlc3NNb25pdG9yXz09bnVsbCkKLSAgICB7Ci0gICAgICBqMmVlUHJvZ3Jlc3NNb25pdG9yXyA9IG5ldyBKMkVFUHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIGoyZWVQcm9ncmVzc01vbml0b3JfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldFN0YXR1c0hhbmRsZXIoKQotICAgKi8KLSAgcHVibGljIFN0YXR1c0hhbmRsZXIgZ2V0U3RhdHVzSGFuZGxlcigpCi0gIHsKLSAgICBpZiAoajJlZVN0YXR1c0hhbmRsZXJfPT1udWxsKQotICAgIHsKLSAgICAgIGoyZWVTdGF0dXNIYW5kbGVyXyA9IG5ldyBKMkVFU3RhdHVzSGFuZGxlcigpOwotICAgIH0KLSAgICByZXR1cm4gajJlZVN0YXR1c0hhbmRsZXJfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldFVSSUZhY3RvcnkoKQotICAgKi8KLSAgcHVibGljIFVSSUZhY3RvcnkgZ2V0VVJJRmFjdG9yeSgpCi0gIHsKLSAgICBpZiAoc2ltcGxlVVJJRmFjdG9yeV8gPT0gbnVsbCkKLSAgICB7IAotICAgICAgc2ltcGxlVVJJRmFjdG9yeV8gPSBuZXcgU2ltcGxlVVJJRmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gc2ltcGxlVVJJRmFjdG9yeV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0SmF2YUNvbXBpbGVyKCkKLSAgICovCi0gIHB1YmxpYyBKYXZhQ29tcGlsZXIgZ2V0SmF2YUNvbXBpbGVyKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldENvbW1hbmRNYW5hZ2VyKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kTWFuYWdlciBnZXRDb21tYW5kTWFuYWdlcigpCi0gIHsKLSAgICBpZihqMmVlQ29tbWFuZE1hbmFnZXJfID09IG51bGwpCi0gICAgewotICAgICAgajJlZUNvbW1hbmRNYW5hZ2VyXyA9IG5ldyBKMkVFQ29tbWFuZE1hbmFnZXIoKTsgCi0gICAgfQotICAgIHJldHVybiBqMmVlQ29tbWFuZE1hbmFnZXJfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9lbnYvSjJFRUxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVMb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3ZDZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9lbnYvSjJFRUxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5lbnY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLS8qKgotKgotKi8KLXB1YmxpYyBjbGFzcyBKMkVFTG9nIGltcGxlbWVudHMgTG9nCi17Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZyNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjaXNFbmFibGVkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKFN0cmluZyBvcHRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLAotCQkJU3RhdHVzIHN0YXR1cykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuVGhyb3dhYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLAotCQkJVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgU3RhdHVzIHN0YXR1cykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuVGhyb3dhYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVQcm9ncmVzc01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWE4ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVQcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuZW52OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIHJzaW5oYQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVQcm9ncmVzc01vbml0b3IgaW1wbGVtZW50cyBQcm9ncmVzc01vbml0b3IKLXsKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3IjcmVwb3J0KGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnQoU3RyaW5nIHByb2dyZXNzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yI2dldENoaWxkUHJvZ3Jlc3NNb25pdG9yKCkKLSAgICovCi0gIHB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0Q2hpbGRQcm9ncmVzc01vbml0b3IoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsUmVxdWVzdGVkKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsUmVxdWVzdGVkKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFU3RhdHVzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVTdGF0dXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTljOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVTdGF0dXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmVudjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSjJFRVN0YXR1c0hhbmRsZXIgaW1wbGVtZW50cyBTdGF0dXNIYW5kbGVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNob2ljZVtdKQotICAgKi8KLSAgcHVibGljIENob2ljZSByZXBvcnQoU3RhdHVzIHN0YXR1cywgQ2hvaWNlW10gY2hvaWNlcykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnQoU3RhdHVzIHN0YXR1cykgdGhyb3dzIFN0YXR1c0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlciNyZXBvcnRFcnJvcihvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RhdHVzIHN0YXR1cykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0SW5mbyhTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmI5MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBwbHVnaW4uCi0qIDxwPgotKiBUaGlzIHBsdWdpbiBjb250YWlucyB0aGUgZ3JhcGhpYyB1c2VyIGludGVyZmFjZSB0byB0aGUKLSogV2ViIFNlcnZpY2VzIHJ1bnRpbWUgZm91bmQgaW4gb3JnLmVjbGlwc2UuanN0LndzLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLQotCS8qKgotCSogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLQkqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0KLQkJIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLQotCS8qKgotCSogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSovCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luIGluc3RhbmNlXzsKLQlwcml2YXRlIExvZyBsb2dfOwotCi0JLyoqCi0JKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLQkqIFRoZSAicGx1Z2luIiBlbGVtZW50IGluIHBsdWdpbi54bWwgc2hvdWxkIGluY2x1ZGUgdGhlIGF0dHJpYnV0ZQotCSogY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luIi4KLQkqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luLgotCSovCi0JcHVibGljIFdlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbihJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXN1cGVyKGRlc2NyaXB0b3IpOwotCQlpZiAoaW5zdGFuY2VfID09IG51bGwpIHsKLQkJCWluc3RhbmNlXyA9IHRoaXM7Ci0JCX0KLQkJbG9nXyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0KLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4gRXF1aXZhbGVudCB0byBjYWxsaW5nCi0JKiAoV2ViU2VydmljZVdhc0NvbnN1bXB0aW9uUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuanN0LndzLndhcy52NS50cCIpOwotCSogQHJldHVybiBUaGUgV2ViU2VydmljZVdhc0NvbnN1bXB0aW9uUGx1Z2luIHNpbmdsZXRvbi4KLQkqLwotCXN0YXRpYyBwdWJsaWMgV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2VfOwotCX0KLQotCS8qKgotCSogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgZmlyc3QgbG9hZGVkLgotCSogQHRocm93cyBDb3JlRXhjZXB0aW9uIElmIHRoaXMgcGx1Z2luIGZhaWxzIHRvIHN0YXJ0LgotCSovCi0JcHVibGljIHZvaWQgc3RhcnR1cCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9nXy5sb2coTG9nLklORk8sIDUwNjYsIHRoaXMsICJzdGFydHVwIiwgIlN0YXJ0aW5nIHBsdWdpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSIpOwotCQlzdXBlci5zdGFydHVwKCk7Ci0JfQotCi0JLyoqCi0JKiBDYWxsZWQgb25jZSBieSB0aGUgcGxhdGZvcm0gd2hlbiB0aGlzIHBsdWdpbiBpcyB1bmxvYWRlZC4KLQkqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBJZiB0aGlzIHBsdWdpbiBmYWlscyB0byBzaHV0ZG93bi4KLQkqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsb2dfLmxvZyhMb2cuSU5GTywgNTA2NywgdGhpcywgInNodXRkb3duIiwgIlNodXR0aW5nIHBsdWdpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSIpOwotCQlzdXBlci5zaHV0ZG93bigpOwotCX0KLQotCS8qKgotCSogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLQkqIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvciB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLgotCSogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLQkqIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiCi0JKiB3aGVyZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlCi0JKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotCSogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGluc3RhbmNlXy5nZXREZXNjcmlwdG9yKCkuZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0JKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLQkqIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nCi0JKiBhcmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbiBvYmplY3RzICh3aGljaAotCSogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGZvcgotCSogZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLQkqIEBwYXJhbSBrZXkgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuCi0JKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotCSogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotCSogZm9ybTogIktFWSA9IHZhbHVlIi4KLQkqIEBwYXJhbSBhcmdzIFRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZQotCSogYXMgcmVxdWlyZWQgYnkgdGhlIG1lc3NhZ2UgaW4gcGx1Z2luLnByb3BlcnRpZXMgYW5kCi0JKiBieSB0aGUgcnVsZXMgb2YgY2xhc3MgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuCi0JKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLQkqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0TWVzc2FnZShrZXkpLCBhcmdzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpblN0YXRlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybQotCQkJLmdldFBsdWdpblN0YXRlTG9jYXRpb24odGhpcykKLQkJCS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpCi0JCQkudG9PU1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSW5zdGFsbExvY2F0aW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKSkuZ2V0RmlsZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0FkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0FkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmU5ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzazsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklXZWJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSjJFRVdlYk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVByb2dyZXNzTW9uaXRvcjsKLQotcHVibGljIGNsYXNzIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBWElTX1JVTlRJTUVfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLnJ0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0pBUlNfVE9fUFJPSkVDVCI7Ci0JcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9KQVJTX1RPX1BST0pFQ1QiOwotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3RfOwotCXByaXZhdGUgSUNsYXNzcGF0aEVudHJ5W10gb2xkQ2xhc3NwYXRoXzsKLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aF87Ci0JcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXzsKLQlwcml2YXRlIGJvb2xlYW4gaXNKMkVFXzEzID0gdHJ1ZTsKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHVibGljIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKCkKLSAgewotCQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotCQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQkJc2V0RGVzY3JpcHRpb24obXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkJc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCX0KLQotCS8qKgotCSogRXhlY3V0ZSBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzawotCSovCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkpIHsKLQkJCQlKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJOYXR1cmVSdW50aW1lID0KLQkJCQkJKEoyRUVXZWJOYXR1cmVSdW50aW1lKSBwcm9qZWN0LmdldE5hdHVyZSgKLQkJCQkJCUlXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpOwotCQkJCWlzSjJFRV8xMyA9IHdlYk5hdHVyZVJ1bnRpbWUuaXNKMkVFMV8zKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCWlmICghaXNKMkVFXzEzKQotCQl7Ci0JCS8vCUFkZEphcihwcm9qZWN0LCBudWxsLCAiWEVSQ0VTX0FQSV9KQVIiLCBzdGF0dXMsIGVudmlyb25tZW50KTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBBZGRKYXIoSVByb2plY3Qgd2ViUHJvamVjdCwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgamFyTmFtZSwgU3RhdHVzIHN0YXR1cywgRW52aXJvbm1lbnQgZW52KSAgewotCSAgIC8vCi0JICAgLy8gR2V0IHRoZSBjdXJyZW50IGNsYXNzcGF0aC4KLQkgICAvLwotCSAgIGphdmFQcm9qZWN0XyA9IG51bGw7Ci0JICAgb2xkQ2xhc3NwYXRoXyA9IG51bGw7Ci0JICAgdHJ5Ci0JICAgeyAgICAKLQkJIGphdmFQcm9qZWN0XyA9IEphdmFDb3JlLmNyZWF0ZSh3ZWJQcm9qZWN0KTsgICAgCi0JCSBpZiAoamF2YVByb2plY3RfICE9IG51bGwpCi0JCSB7Ci0JCSAgIG9sZENsYXNzcGF0aF8gPSBqYXZhUHJvamVjdF8uZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCSB9Ci0JCSBlbHNlCi0JCSB7Ci0JCSAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfV0FSTl9OT19KQVZBX05BVFVSRSIpLCBTdGF0dXMuRVJST1IpOwkKLQkJICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICByZXR1cm47Ci0JCSB9Ci0JICAgfQotCSAgIGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkKLQkgICB7Ci0JCSAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfV0FSTl9OT19KQVZBX05BVFVSRSIpLCBTdGF0dXMuRVJST1IpOwotCQkgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCSAgIHJldHVybjsJICAgCQotCSAgIH0KLQotCSAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkgICBmb3IgKGludCBpPTA7IGk8b2xkQ2xhc3NwYXRoXy5sZW5ndGg7IGkrKykKLQkgICB7Ci0JCSBmb3VuZCA9IGZvdW5kIHx8IG9sZENsYXNzcGF0aF9baV0uZ2V0UGF0aCgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChqYXJOYW1lLnRvTG93ZXJDYXNlKCkpOwotCSAgIH0KLQotCSAgIGlmIChmb3VuZCkgCi0JICAgewotCQkgcmV0dXJuOwotCSAgIH0KLQotCSAgIG5ld0NsYXNzcGF0aF8gPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENsYXNzcGF0aF8ubGVuZ3RoICsgMV07Ci0JICAgaW50IGk9MDsKLQkgICB3aGlsZSAoaTxvbGRDbGFzc3BhdGhfLmxlbmd0aCkKLQkgICB7Ci0JCSBuZXdDbGFzc3BhdGhfW2ldID0gb2xkQ2xhc3NwYXRoX1tpXTsKLQkJIGkrKzsKLQkgICB9Ci0KLQkgICB0cnkKLQkgICB7Ci0JCSBpZihwbHVnaW5JZCE9bnVsbCkKLQkJIHsKLQkJICAgbmV3Q2xhc3NwYXRoX1tpKytdID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGdldFRoZUphclBhdGgocGx1Z2luSWQsamFyTmFtZSksIG51bGwsIG51bGwpOwotCQkgfQotCQkgZWxzZQotCQkgewotCQkgICBuZXdDbGFzc3BhdGhfW2krK10gPSBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KGdldFRoZUphclBhdGgocGx1Z2luSWQsamFyTmFtZSksIG51bGwsIG51bGwpOwotCQkgfQotCSAgIH0KLQkgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCSAgIHsKLQkJIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQkFEX0JVSUxEUEFUSCIpLCBTdGF0dXMuV0FSTklORywgZSk7Ci0JCSB0cnkKLQkJIHsKLQkJIAllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotCQkgfQotCQkgY2F0Y2goU3RhdHVzRXhjZXB0aW9uIHNlKQotCQkgewotCQkgCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIlVzZXIgYWJvcnRlZCIsU3RhdHVzLkVSUk9SKTsKLQkJIH0KLQkJIHJldHVybjsKLQkgICB9Ci0KLQkgICAvLwotCSAgIC8vIFRoZW4gdXBkYXRlIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC4KLQkgICAvLwotCSAgIHRyeQotCSAgIHsKLQkgICAJIFByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gZW52LmdldFByb2dyZXNzTW9uaXRvcigpOwotCSAgIAkgSVByb2dyZXNzTW9uaXRvciBlY2xpcHNlTW9uaXRvciA9IG51bGw7Ci0JICAgCSBpZiAobW9uaXRvciBpbnN0YW5jZW9mIEVjbGlwc2VQcm9ncmVzc01vbml0b3IpCi0JICAgCSB7Ci0JICAgCSAJZWNsaXBzZU1vbml0b3IgPSAoKEVjbGlwc2VQcm9ncmVzc01vbml0b3IpbW9uaXRvcikuZ2V0TW9uaXRvcigpOwotCSAgIAkgfQotCQkgamF2YVByb2plY3RfLnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGhfLGVjbGlwc2VNb25pdG9yKTsKLQkgICB9Ci0JICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotCSAgIHsKLQkJIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQkFEX0JVSUxEUEFUSCIpLCBTdGF0dXMuV0FSTklORywgZSk7Ci0JCSB0cnkKLQkJIHsKLQkJIAllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwkKLQkJIH0KLQkJIGNhdGNoKFN0YXR1c0V4Y2VwdGlvbiBzZSkKLQkJIHsKLQkJIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCAiVXNlciBhYm9ydGVkIiwgU3RhdHVzLkVSUk9SKTsKLQkJIH0KLQkJIHJldHVybjsKLQkgICB9Ci0JIH0KLQotCS8vCi0JLy8gUmV0dXJucyB0aGUgbG9jYWwgbmF0aXZlIHBhdGhuYW1lIG9mIHRoZSBqYXIuCi0JLy8KLQlwcml2YXRlIElQYXRoIGdldFRoZUphclBhdGgoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgdGhlSmFyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAocGx1Z2luSWQgIT0gbnVsbCkgewotCQkJCUlQbHVnaW5SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9Ci0JCQkJCXBsdWdpblJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3IocGx1Z2luSWQpOwotCQkJCVVSTCBsb2NhbFVSTCA9Ci0JCQkJCVBsYXRmb3JtLmFzTG9jYWxVUkwoCi0JCQkJCQluZXcgVVJMKHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpLCB0aGVKYXIpKTsKLQkJCQlyZXR1cm4gbmV3IFBhdGgobG9jYWxVUkwuZ2V0RmlsZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBQYXRoKHRoZUphcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQluZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cygKLQkJCQkJSVN0YXR1cy5XQVJOSU5HLAotCQkJCQlXZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW4uSUQsCi0JCQkJCTAsCi0JCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfQkFEX0FYSVNfSkFSX1VSTCIpLAotCQkJCQllKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCW5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCVdlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbi5JRCwKLQkJCQkJMCwKLQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19CQURfQVhJU19KQVJfVVJMIiksCi0JCQkJCWUpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLQl7Ci0JICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9DaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OWEwNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9DaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSVdlYk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5KMkVFV2ViTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQkKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLQlwcml2YXRlIElQcm9qZWN0IHNlcnZlclByb2plY3Q7Ci0gICAgCi0gIHB1YmxpYyBDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrKCkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJDSEVDS19XU19ERF9UQVNLX0RFU0NSSVBUSU9OIikpOwotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkNIRUNLX1dTX0REX1RBU0tfTEFCRUwiKSk7ICAgICAgICAKLSAgfQotCQotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JCWlmKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudikuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSkgewotICAgICAgcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCUlQYXRoIGZpbGVQYXRoID0gbnVsbDsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLSAgICBmaWxlUGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSkgewotICAgICAgICBKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJQcm9qZWN0ID0gKEoyRUVXZWJOYXR1cmVSdW50aW1lKSBwcm9qZWN0LmdldE5hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLSAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5hcHBlbmQod2ViUHJvamVjdC5nZXRXRUJJTkZQYXRoKCkpOwotICAgICAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLmFwcGVuZCgiL3NlcnZlci1jb25maWcud3NkZCIpOwotICAgICAgfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfREVGQVVMVF9CRUFOIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJaWYoZmlsZVBhdGg9PW51bGwgfHwgZmlsZVBhdGguaXNFbXB0eSgpKQotCQl7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBjb3JlTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsJCQkKLQkJfQotCi0JCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQlpZiAoZmlsZS5leGlzdHMoKSAmJiAhRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KS5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKSAgIHsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfWE1MX0ZJTEVfT1ZFUldSSVRFX0RJU0FCTEVEIiksIFN0YXR1cy5XQVJOSU5HKTsKLQkJCXRyeQotCQkJewotCQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0JCQl9Ci0JCQljYXRjaChTdGF0dXNFeGNlcHRpb24gc2UpCi0JCQl7Ci0JCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgIlVzZXIgYWJvcnRlZCIsU3RhdHVzLkVSUk9SKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3QoSVByb2plY3Qgc2VydmVyUHJvamVjdCkKLQl7Ci0JICB0aGlzLnNlcnZlclByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svQ29weUF4aXNKYXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0NvcHlBeGlzSmFyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjM3YjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svQ29weUF4aXNKYXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIENvcHlBeGlzSmFyQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFYSVNfUlVOVElNRV9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS5heGlzIjsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19DT1BZX0pBUlNfVE9fUFJPSkVDVCI7Ci0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfQ09QWV9KQVJTX1RPX1BST0pFQ1QiOwotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgYmFzZUNvbk1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICBwcml2YXRlIEJvb2xlYW4gcHJvamVjdFJlc3RhcnRSZXF1aXJlZF8gPSBCb29sZWFuLkZBTFNFOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1I7Ci0gICAqLwotICBwdWJsaWMgQ29weUF4aXNKYXJDb21tYW5kKCkgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgYmFzZUNvbk1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgdGhpcyApOwotICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0gICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLnJlcG9ydChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiUFJPR1JFU1NfSU5GT19DT1BZX0FYSVNfQ0ZHIikpOwotICAgIGNvcHlBeGlzSmFyc1RvUHJvamVjdChwcm9qZWN0LCBzdGF0dXMsIGVudik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlBeGlzSmFyc1RvUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdGF0dXMgc3RhdHVzLCBFbnZpcm9ubWVudCBlbnYpIHsKLS8vICAgIElQYXRoIHdlYk1vZHVsZVBhdGggPSBSZXNvdXJjZVV0aWxzLmdldFdlYk1vZHVsZVNlcnZlclJvb3QocHJvamVjdCkuZ2V0RnVsbFBhdGgoKTsKLQlJUGF0aCB3ZWJNb2R1bGVQYXRoID0gSjJFRVV0aWxzLmdldEZpcnN0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0gICAgaWYgKHdlYk1vZHVsZVBhdGggPT0gbnVsbCkgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgYmFzZUNvbk1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9OT1RfRk9VTkQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb3B5SUZpbGUoImxpYi9heGlzLmphciIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViTW9kdWxlUGF0aCwgIldFQi1JTkYvbGliL2F4aXMuamFyIiwgc3RhdHVzLCBlbnYpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgIHJldHVybjsKLSAgICBjb3B5SUZpbGUoImxpYi9sb2c0ai0xLjIuOC5qYXIiLCAvLyROT04tTkxTLTEkCi0gICAgICAgIHdlYk1vZHVsZVBhdGgsICJXRUItSU5GL2xpYi9sb2c0ai0xLjIuOC5qYXIiLCBzdGF0dXMsIGVudik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgcmV0dXJuOwotICAgIGNvcHlJRmlsZSgibGliL2NvbW1vbnMtZGlzY292ZXJ5LmphciIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViTW9kdWxlUGF0aCwgIldFQi1JTkYvbGliL2NvbW1vbnMtZGlzY292ZXJ5LmphciIsIHN0YXR1cywgZW52KTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICByZXR1cm47Ci0gICAgY29weUlGaWxlKCJsaWIvY29tbW9ucy1sb2dnaW5nLmphciIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViTW9kdWxlUGF0aCwgIldFQi1JTkYvbGliL2NvbW1vbnMtbG9nZ2luZy5qYXIiLCBzdGF0dXMsIGVudik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgcmV0dXJuOwotICAgIGNvcHlJRmlsZSgibGliL3NhYWouamFyIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICB3ZWJNb2R1bGVQYXRoLCAiV0VCLUlORi9saWIvc2Fhai5qYXIiLCBzdGF0dXMsIGVudik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgcmV0dXJuOwotICAgIGNvcHlJRmlsZSgibGliL2pheHJwYy5qYXIiLCAvLyROT04tTkxTLTEkCi0gICAgICAgIHdlYk1vZHVsZVBhdGgsICJXRUItSU5GL2xpYi9qYXhycGMuamFyIiwgc3RhdHVzLCBlbnYpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgIHJldHVybjsKLSAgICBjb3B5SUZpbGUoImxpYi93c2RsNGouamFyIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICB3ZWJNb2R1bGVQYXRoLCAiV0VCLUlORi9saWIvd3NkbDRqLmphciIsIHN0YXR1cywgZW52KTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICByZXR1cm47Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyoqCi0gICAqICAKLSAgICovCi0gIHByaXZhdGUgdm9pZCBjb3B5SUZpbGUoU3RyaW5nIHNvdXJjZSwgSVBhdGggdGFyZ2V0UGF0aCwgU3RyaW5nIHRhcmdldEZpbGUsIFN0YXR1cyBzdGF0dXMsIEVudmlyb25tZW50IGVudikgewotICAgIElQYXRoIHRhcmdldCA9IHRhcmdldFBhdGguYXBwZW5kKG5ldyBQYXRoKHRhcmdldEZpbGUpKTsKLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KGJhc2VDb25Nc2dVdGlsc18uZ2V0TWVzc2FnZSgiUFJPR1JFU1NfSU5GT19DT1BZSU5HX0ZJTEUiKSk7Ci0KLSAgICB0cnkgewotICAgICAgUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgICBjb250ZXh0LnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCh0cnVlKTsKLSAgICAgIGNvbnRleHQuc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICBjb250ZXh0LnNldENoZWNrb3V0RmlsZXNFbmFibGVkKHRydWUpOwotICAgICAgSVBsdWdpblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLSAgICAgIElQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBwbHVnaW5SZWdpc3RyeS5nZXRQbHVnaW5EZXNjcmlwdG9yKEFYSVNfUlVOVElNRV9QTFVHSU5fSUQpOwotICAgICAgUGx1Z2luIGF4aXNydF9wbHVnaW4gPSBwbHVnaW5EZXNjcmlwdG9yLmdldFBsdWdpbigpOwotICAgICAgSUZpbGUgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRGaWxlKHRhcmdldCk7Ci0gICAgICBpZiAoIXJlc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgIElGaWxlIGZpbGUgPSBGaWxlUmVzb3VyY2VVdGlscy5jcmVhdGVGaWxlKGNvbnRleHQsIHRhcmdldCwgYXhpc3J0X3BsdWdpbi5vcGVuU3RyZWFtKG5ldyBQYXRoKHNvdXJjZSkpLCBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIGVudgotICAgICAgICAgICAgLmdldFN0YXR1c0hhbmRsZXIoKSk7Ci0gICAgICAgIGlmIChwcm9qZWN0UmVzdGFydFJlcXVpcmVkXy5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSAmJiBmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgcHJvamVjdFJlc3RhcnRSZXF1aXJlZF8gPSBCb29sZWFuLlRSVUU7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgSUZpbGUgZmlsZSA9IEZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGUoY29udGV4dCwgdGFyZ2V0LCBheGlzcnRfcGx1Z2luLm9wZW5TdHJlYW0obmV3IFBhdGgoc291cmNlKSksIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKSwgZW52Ci0gICAgICAgICAgLmdldFN0YXR1c0hhbmRsZXIoKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9GSUxFQ09QWSIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFByb2plY3RSZXN0YXJ0UmVxdWlyZWQoKSB7Ci0gICAgcmV0dXJuIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0RlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQyNjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsLkRpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyB3c2RsU2VydmljZVVSTDsKLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotICBwcml2YXRlIE1vZGVsIG1vZGVsOwotCi0gIHB1YmxpYyBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQiLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICAvL1dlYlNlcnZpY2VFbGVtZW50IHdzZSA9IFdlYlNlcnZpY2VFbGVtZW50LmdldFdlYlNlcnZpY2VFbGVtZW50KG1vZGVsKTsKLSAgICAvL3NldFdlYlNlcnZpY2VzUGFyc2VyKChXZWJTZXJ2aWNlc1BhcnNlcil3c2UuZ2V0V1NQYXJzZXIoKSk7Ci0gICAgLy9zZXRXc2RsU2VydmljZVVSTCh3c2UuZ2V0V1NETFNlcnZpY2VVUkwoKSk7Ci0gICAgLy9pZiAod3NkbFNlcnZpY2VVUkwgPT0gbnVsbCB8fCB3c2RsU2VydmljZVVSTC5sZW5ndGgoKSA8PSAwKQotICAgIC8vICBzZXRXc2RsU2VydmljZVVSTCgobmV3IFV0aWxzKCkpLnRvRmlsZVN5c3RlbVVSSSh3c2UuZ2V0V1NETFNlcnZpY2VQYXRobmFtZSgpKSk7Ci0gICAgCi0gICAgaWYgKHdzZGxTZXJ2aWNlVVJMICE9IG51bGwgJiYgd3NkbFNlcnZpY2VVUkwubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGlmICh3ZWJTZXJ2aWNlc1BhcnNlciA9PSBudWxsKQotICAgICAgewotICAgICAgICB3ZWJTZXJ2aWNlc1BhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAgICAgICAvL3dzZS5zZXRXU1BhcnNlcih3ZWJTZXJ2aWNlc1BhcnNlcik7Ci0gICAgICB9Ci0gICAgICBXZWJTZXJ2aWNlRW50aXR5IHdzRW50aXR5ID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdzZGxTZXJ2aWNlVVJMKTsKLSAgICAgIGlmICh3c0VudGl0eSA9PSBudWxsIHx8ICF3c0VudGl0eS5pc0VudGl0eVJlc29sdmVkKCkpCi0gICAgICB7Ci0gICAgICAgIHdlYlNlcnZpY2VzUGFyc2VyLnNldFVSSSh3c2RsU2VydmljZVVSTCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgd2ViU2VydmljZXNQYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfTk9ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlKQotICAgICAgICB7Ci0gICAgICAgICAgRGlhbG9nV1dXQXV0aGVudGljYXRpb24gZGlhbG9nID0gbmV3IERpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgZGlhbG9nLmhhbmRsZVdXV0F1dGhlbnRpY2F0aW9uKHd3d2FlKTsKLSAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBkaWFsb2cuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBkaWFsb2cuZ2V0UGFzc3dvcmQoKTsKLSAgICAgICAgICBpZiAodXNlcm5hbWUgIT0gbnVsbCAmJiBwYXNzd29yZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdlYlNlcnZpY2VzUGFyc2VyLnNldEhUVFBCYXNpY0F1dGhVc2VybmFtZSh1c2VybmFtZSk7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlc1BhcnNlci5zZXRIVFRQQmFzaWNBdXRoUGFzc3dvcmQocGFzc3dvcmQpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHdlYlNlcnZpY2VzUGFyc2VyLnBhcnNlKFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX05PTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2ViU2VydmljZXNQYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFVzZXJuYW1lKG51bGwpOwotICAgICAgICAgICAgd2ViU2VydmljZXNQYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKG51bGwpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICB3c0VudGl0eSA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3c2RsU2VydmljZVVSTCk7Ci0gICAgICB9Ci0gICAgICBpZiAod3NFbnRpdHkgIT0gbnVsbCAmJiB3c0VudGl0eS5nZXRUeXBlKCkgPT0gV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBodHRwVXNlcm5hbWUgPSB3c0VudGl0eS5nZXRIVFRQVXNlcm5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGh0dHBQYXNzd29yZCA9IHdzRW50aXR5LmdldEhUVFBQYXNzd29yZCgpOwotICAgICAgICBpZiAoaHR0cFVzZXJuYW1lICE9IG51bGwgJiYgaHR0cFBhc3N3b3JkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBqYXZhV1NETFBhcmFtLnNldEhUVFBVc2VybmFtZShodHRwVXNlcm5hbWUpOwotICAgICAgICAgIGphdmFXU0RMUGFyYW0uc2V0SFRUUFBhc3N3b3JkKGh0dHBQYXNzd29yZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLSAgICB0aGlzLmphdmFXU0RMUGFyYW0gPSBqYXZhV1NETFBhcmFtOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TW9kZWwoTW9kZWwgbW9kZWwpIHsKLSAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzZGxTZXJ2aWNlVVJMIFRoZSB3c2RsU2VydmljZVVSTCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsU2VydmljZVVSTChTdHJpbmcgd3NkbFNlcnZpY2VVUkwpIHsKLSAgICB0aGlzLndzZGxTZXJ2aWNlVVJMID0gd3NkbFNlcnZpY2VVUkw7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBqYXZhV1NETFBhcmFtLgotICAgKi8KLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0gICAgcmV0dXJuIGphdmFXU0RMUGFyYW07Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlc1BhcnNlci4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpIHsKLSAgICByZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyIFRoZSB3ZWJTZXJ2aWNlc1BhcnNlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1JlZnJlc2hQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9SZWZyZXNoUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwODgwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1JlZnJlc2hQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLQotcHVibGljIGNsYXNzIFJlZnJlc2hQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9SRUZFU0hfUFJPSkVDVCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19SRUZFU0hfUFJPSkVDVCI7Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotCXB1YmxpYyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKQotCXsKLQkJbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLnBsdWdpbiIsIHRoaXMgKTsKLQkJc2V0TmFtZSggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIExBQkVMICkgKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCBERVNDUklQVElPTiApKTsKLQl9Ci0KLQkvKioKLQkqIEV4ZWN1dGUgUmVmcmVzaFByb2plY3RUYXNrCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCXsKLQkJdHJ5Ci0JCXsKLQkJCWlmIChwcm9qZWN0IT1udWxsKQotCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVByb2plY3QuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUkVGUkVTSF9QUk9KRUNUIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1N0dWIyQmVhbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svU3R1YjJCZWFuQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODczNTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svU3R1YjJCZWFuQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTdHViMkJlYW5Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotICBwcml2YXRlIFN0cmluZyBkaXNjb3ZlcmVkV3NkbFBvcnRFbGVtZW50TmFtZTsKLSAgcHJpdmF0ZSBWZWN0b3IgcG9ydFR5cGVzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJveHlCZWFuXzsKLSAgCi0gIHByaXZhdGUgSVByb2plY3QgY2xpZW50UHJvamVjdF87Ci0KLSAgcHVibGljIFN0dWIyQmVhbkNvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy53YXMuY3JlYXRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy53YXMuY3JlYXRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kIik7Ci0gICAgcG9ydFR5cGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICAvL3NldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAqIEV4ZWN1dGUKLSAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgeyAgICAgICAgCi0gICAgU3RyaW5nIGlucHV0V3NkbExvY2F0aW9uID0gamF2YVdTRExQYXJhbV8uZ2V0SW5wdXRXc2RsTG9jYXRpb24oKTsKLSAgICBEZWZpbml0aW9uIGRlZiA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKGlucHV0V3NkbExvY2F0aW9uKTsKLSAgICAvKgotICAgICogSGFjazogQXhpcyBpcyBub3QgdXNpbmcgYSBwcm9wZXIgamF2YS5uZXQuVVJMIGFzIGl0cyBpbnB1dFdzZGxMb2NhdGlvbi4KLSAgICAqIFdlIG5lZWQgdG8gY29udmVydCBpdCB0byBhIHByb3BlciBmaWxlIFVSTC4KLSAgICAqLwotICAgIGlmIChkZWYgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbnB1dFdzZGxMb2NhdGlvbik7Ci0gICAgICBpZiAoZmlsZS5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBkZWYgPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbihmaWxlLnRvVVJMKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIE1hcCBwa2cybnNNYXBwaW5nID0gamF2YVdTRExQYXJhbV8uZ2V0TWFwcGluZ3MoKTsKLSAgICBNYXAgc2VydmljZXMgPSBkZWYuZ2V0U2VydmljZXMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlpdC5uZXh0KCk7Ci0gICAgICBTdHJpbmcgc2VydmljZVBrZ05hbWUgPSBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWUoc2VydmljZSwgcGtnMm5zTWFwcGluZyk7Ci0gICAgICBTdHJpbmcgc2VydmljZUNsYXNzTmFtZSA9IGNvbXB1dGVDbGFzc05hbWUoc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgIFN0cmluZyBqbmRpTmFtZSA9IHNlcnZpY2VDbGFzc05hbWU7Ci0gICAgICBNYXAgcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0MiA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBpZiAoc2VydmljZUNsYXNzTmFtZS5lcXVhbHMoY29tcHV0ZUNsYXNzTmFtZSgoKFBvcnQpaXQyLm5leHQoKSkuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmljZUNsYXNzTmFtZSA9IHNlcnZpY2VDbGFzc05hbWUgKyAiX1NlcnZpY2UiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0MiA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydClpdDIubmV4dCgpOwotICAgICAgICBpZiAoZGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWUgIT0gbnVsbCAmJiAhZGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWUuZXF1YWxzKHBvcnQuZ2V0TmFtZSgpKSkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgU09BUEFkZHJlc3Mgc29hcEFkZHJlc3MgPSBudWxsOwotICAgICAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cyA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQzID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0My5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBpdDMubmV4dCgpOwotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzb2FwQWRkcmVzcyA9IChTT0FQQWRkcmVzcylvYmplY3Q7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc29hcEFkZHJlc3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gcG9ydC5nZXRCaW5kaW5nKCkuZ2V0UG9ydFR5cGUoKTsKLSAgICAgICAgICBRTmFtZSBwb3J0VHlwZVFOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBTdHJpbmdCdWZmZXIgcG9ydFR5cGVJRCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBwb3J0VHlwZUlELmFwcGVuZChwb3J0VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICBwb3J0VHlwZUlELmFwcGVuZCgiIyIpOwotICAgICAgICAgIHBvcnRUeXBlSUQuYXBwZW5kKHBvcnRUeXBlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgIGlmICghcG9ydFR5cGVzXy5jb250YWlucyhwb3J0VHlwZUlELnRvU3RyaW5nKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvcnRUeXBlc18uYWRkKHBvcnRUeXBlSUQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBTdHViMkJlYW5JbmZvIHN0dWIyQmVhbkluZm8gPSBuZXcgU3R1YjJCZWFuSW5mbygpOwotICAgICAgICAgICAgc3R1YjJCZWFuSW5mby5zZXRDbGllbnRQcm9qZWN0KGNsaWVudFByb2plY3RfKTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0VHlwZVBrZ05hbWUgPSBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWUocG9ydFR5cGUsIHBrZzJuc01hcHBpbmcpOwotICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlQ2xhc3NOYW1lID0gY29tcHV0ZUNsYXNzTmFtZShwb3J0VHlwZVFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIHN0dWIyQmVhbkluZm8uc2V0UGFja2FnZShwb3J0VHlwZVBrZ05hbWUpOwotICAgICAgICAgICAgc3R1YjJCZWFuSW5mby5zZXRDbGFzcyhwb3J0VHlwZUNsYXNzTmFtZSArICJQcm94eSIpOwotICAgICAgICAgICAgcHJveHlCZWFuXyA9IHBvcnRUeXBlUGtnTmFtZSsiLiIrcG9ydFR5cGVDbGFzc05hbWUrIlByb3h5IjsKLSAgICAgICAgICAgIGlmIChqbmRpTmFtZS5lcXVhbHMocG9ydFR5cGVDbGFzc05hbWUpKQotICAgICAgICAgICAgICBwb3J0VHlwZUNsYXNzTmFtZSA9IHBvcnRUeXBlQ2xhc3NOYW1lICsgIl9Qb3J0IjsKLSAgICAgICAgICAgIHN0dWIyQmVhbkluZm8uYWRkU0VJKHBvcnRUeXBlUGtnTmFtZSwgcG9ydFR5cGVDbGFzc05hbWUsIHNlcnZpY2VQa2dOYW1lLCBzZXJ2aWNlQ2xhc3NOYW1lLCBqbmRpTmFtZSwgcG9ydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgc3R1YjJCZWFuSW5mby53cml0ZSggZW52LmdldFByb2dyZXNzTW9uaXRvcigpLCBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpICk7Ci0gICAgICAgICAgICAgIGlmIChkaXNjb3ZlcmVkV3NkbFBvcnRFbGVtZW50TmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGRpc2NvdmVyZWQgcG9ydCB3YXMgcHJvY2Vzc2VkLiBJZ25vcmUgYWxsIG90aGVyIHBvcnRzIGFuZCBzZXJ2aWNlcy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIGNoYXIgVU5ERVJTQ09SRSA9ICdfJzsKLQotICBwcml2YXRlIFN0cmluZyBjb21wdXRlQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICBTdHJpbmcgY2xhc3NOYW1lQ29weSA9IGNsYXNzTmFtZTsKLSAgICBpbnQgaSA9IGNsYXNzTmFtZUNvcHkuaW5kZXhPZihVTkRFUlNDT1JFKTsKLSAgICB3aGlsZSAoaSAhPSAtMSkKLSAgICB7Ci0gICAgICBjaGFyIGMgPSBjbGFzc05hbWVDb3B5LmNoYXJBdChpKzEpOwotICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoY2xhc3NOYW1lQ29weS5zdWJzdHJpbmcoMCwgaSsxKSk7Ci0gICAgICAgIHNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotICAgICAgICBzYi5hcHBlbmQoY2xhc3NOYW1lQ29weS5zdWJzdHJpbmcoaSsyLCBjbGFzc05hbWVDb3B5Lmxlbmd0aCgpKSk7Ci0gICAgICAgIGNsYXNzTmFtZUNvcHkgPSBzYi50b1N0cmluZygpOwotICAgICAgfQotICAgICAgaSA9IGNsYXNzTmFtZUNvcHkuaW5kZXhPZihVTkRFUlNDT1JFLCBpKzEpOwotICAgIH0KLSAgICBjaGFyW10gY0FycmF5ID0gbmV3IGNoYXJbY2xhc3NOYW1lQ29weS5sZW5ndGgoKV07Ci0gICAgYm9vbGVhbiBmb3VuZERpZ2l0ID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBjQXJyYXkubGVuZ3RoOyBqKyspCi0gICAgewotICAgICAgY2hhciBjID0gY2xhc3NOYW1lQ29weS5jaGFyQXQoaik7Ci0gICAgICBpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoYykpCi0gICAgICB7Ci0gICAgICAgIGNBcnJheVtqXSA9IGM7Ci0gICAgICAgIGZvdW5kRGlnaXQgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoZm91bmREaWdpdCkKLSAgICAgICAgICBjQXJyYXlbal0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjQXJyYXlbal0gPSBjOwotICAgICAgICBmb3VuZERpZ2l0ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgU3RyaW5nKGNBcnJheSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBqYXZhV1NETFBhcmFtLgotICAqIEByZXR1cm4gSmF2YVdTRExQYXJhbWV0ZXIKLSAgKi8KLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKQotICB7Ci0gICAgcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotICB9Ci0KLSAgLyoqCi0gICogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLSAgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKQotICB7Ci0gICAgamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2VzUGFyc2VyLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkgewotICAgIHJldHVybiB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKSB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLQotICAvKioKLSAgICogQHBhcmFtIGRpc2NvdmVyZWRXc2RsUG9ydEVsZW1lbnROYW1lIFRoZSBkaXNjb3ZlcmVkV3NkbFBvcnRFbGVtZW50TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREaXNjb3ZlcmVkV3NkbFBvcnRFbGVtZW50TmFtZShTdHJpbmcgZGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWUpIHsKLSAgICB0aGlzLmRpc2NvdmVyZWRXc2RsUG9ydEVsZW1lbnROYW1lID0gZGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWU7Ci0gIH0KLQotICAvKioKLQkqIEBwYXJhbSBjbGllbnRQcm9qZWN0IFRoZSBjbGllbnRQcm9qZWN0IHRvIHNldC4KLQkqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KElQcm9qZWN0IGNsaWVudFByb2plY3QpIHsKLQkJdGhpcy5jbGllbnRQcm9qZWN0XyA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb3h5QmVhbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3h5QmVhbigpIHsKLQkJcmV0dXJuIHByb3h5QmVhbl87Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svU3R1YjJCZWFuSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9TdHViMkJlYW5JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMzdjOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9TdHViMkJlYW5JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2s7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkphdmFQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWwuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBTdHViMkJlYW5JbmZvCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIE5FV19MSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0gIHByaXZhdGUgaW50IGluZGVudENvdW50OwotCi0gIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VfOwotICBwcml2YXRlIFN0cmluZ0J1ZmZlciBpbXBvcnRzXzsKLSAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgc2Vpc187Ci0gIHByaXZhdGUgU3RyaW5nQnVmZmVyIHNlcnZpY2VzXzsKLSAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgam5kaU5hbWVzXzsKLSAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgcG9ydHNfOwotICBwcml2YXRlIFN0cmluZyBjbGFzc187Ci0gIHByaXZhdGUgVmVjdG9yIHVzZWROYW1lczsKLSAgCi0gIHByaXZhdGUgSVByb2plY3QgY2xpZW50UHJvamVjdF87Ci0KLSAgcHVibGljIFN0dWIyQmVhbkluZm8oKQotICB7Ci0gICAgaW5kZW50Q291bnQgPSAwOwotICAgIHBhY2thZ2VfID0gbnVsbDsKLSAgICBpbXBvcnRzXyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzZWlzXyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzZXJ2aWNlc18gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgam5kaU5hbWVzXyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBwb3J0c18gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgY2xhc3NfID0gIlNFSUJlYW4iOwotICAgIHVzZWROYW1lcyA9IG5ldyBWZWN0b3IoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoSVByb2plY3QgY2xpZW50UHJvamVjdCkgewotICAJdGhpcy5jbGllbnRQcm9qZWN0XyA9ICBjbGllbnRQcm9qZWN0OwotICB9Ci0gIAotCi0gIHB1YmxpYyB2b2lkIHNldFBhY2thZ2UoU3RyaW5nIHBrZ05hbWUpCi0gIHsKLSAgICBpZiAocGtnTmFtZSAhPSBudWxsICYmIHBrZ05hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgcGFja2FnZV8gPSBtYW5nbGVQYWNrYWdlTmFtZShwa2dOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEltcG9ydHMoU3RyaW5nIHBrZ05hbWUsIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICBpbXBvcnRzXy5hcHBlbmQodG9GdWxseVF1YWxpZmllZENsYXNzTmFtZShwa2dOYW1lLCBjbGFzc05hbWUpKTsKLSAgICBpbXBvcnRzXy5hcHBlbmQoIjsiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNFSShTdHJpbmcgc2VpUGtnTmFtZSwgU3RyaW5nIHNlaUNsYXNzTmFtZSwgU3RyaW5nIHNlcnZpY2VQa2dOYW1lLCBTdHJpbmcgc2VydmljZUNsYXNzTmFtZSwgU3RyaW5nIHBvcnROYW1lKQotICB7Ci0gICAgYWRkU0VJKHNlaVBrZ05hbWUsIHNlaUNsYXNzTmFtZSwgc2VydmljZVBrZ05hbWUsIHNlcnZpY2VDbGFzc05hbWUsIHNlcnZpY2VDbGFzc05hbWUsIHBvcnROYW1lKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNFSShTdHJpbmcgc2VpUGtnTmFtZSwgU3RyaW5nIHNlaUNsYXNzTmFtZSwgU3RyaW5nIHNlcnZpY2VQa2dOYW1lLCBTdHJpbmcgc2VydmljZUNsYXNzTmFtZSwgU3RyaW5nIGpuZGlOYW1lLCBTdHJpbmcgcG9ydE5hbWUpCi0gIHsKLSAgICBzZWlzXy5hcHBlbmQodG9GdWxseVF1YWxpZmllZENsYXNzTmFtZShzZWlQa2dOYW1lLCBzZWlDbGFzc05hbWUpKTsKLSAgICBzZWlzXy5hcHBlbmQoIjsiKTsKLSAgICBzZXJ2aWNlc18uYXBwZW5kKHRvRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoc2VydmljZVBrZ05hbWUsIHNlcnZpY2VDbGFzc05hbWUpKTsKLSAgICBzZXJ2aWNlc18uYXBwZW5kKCI7Iik7Ci0gICAgam5kaU5hbWVzXy5hcHBlbmQoam5kaU5hbWUpOwotICAgIGpuZGlOYW1lc18uYXBwZW5kKCI7Iik7Ci0gICAgcG9ydHNfLmFwcGVuZChwb3J0TmFtZSk7Ci0gICAgcG9ydHNfLmFwcGVuZCgiOyIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgY2xhc3NfID0gbWFuZ2xlQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyB0b0Z1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKFN0cmluZyBwa2dOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHNiLmFwcGVuZChtYW5nbGVQYWNrYWdlTmFtZShwa2dOYW1lKSk7Ci0gICAgc2IuYXBwZW5kKCIuIik7Ci0gICAgc2IuYXBwZW5kKG1hbmdsZUNsYXNzTmFtZShjbGFzc05hbWUpKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFN0cmluZyBxbmFtZSkKLSAgewotICAgIGludCBpbmRleCA9IHFuYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgcmV0dXJuIHFuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHFuYW1lOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBxbmFtZSkKLSAgewotICAgIGludCBpbmRleCA9IHFuYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgcmV0dXJuIHFuYW1lLnN1YnN0cmluZyhpbmRleCsxLCBxbmFtZS5sZW5ndGgoKSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHFuYW1lOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgbWFuZ2xlUGFja2FnZU5hbWUoU3RyaW5nIHMpCi0gIHsKLSAgICByZXR1cm4gcmVwbGFjZUludmFsaWRKYXZhQ2hhcnMocyk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBtYW5nbGVDbGFzc05hbWUoU3RyaW5nIHMpCi0gIHsKLSAgICBzID0gZmlyc3RDaGFyVG9VcHBlckNhc2UoV1NETFV0aWxzLnJlc29sdmVEb3RJblBvcnROYW1lKHMpKTsKLSAgICByZXR1cm4gcmVwbGFjZUludmFsaWRKYXZhQ2hhcnMocyk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyByZXBsYWNlSW52YWxpZEphdmFDaGFycyhTdHJpbmcgcykKLSAgewotICAgIGNoYXJbXSBjID0gcy50b0NoYXJBcnJheSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjW2ldKSkKLSAgICAgICAgY1tpXSA9ICcuJzsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoYyk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBmaXJzdENoYXJUb1VwcGVyQ2FzZShTdHJpbmcgcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzYi5hcHBlbmQocy5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSk7Ci0gICAgc2IuYXBwZW5kKHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkpKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGZpcnN0Q2hhclRvTG93ZXJDYXNlKFN0cmluZyBzKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHNiLmFwcGVuZChzLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpKTsKLSAgICBzYi5hcHBlbmQocy5zdWJzdHJpbmcoMSwgcy5sZW5ndGgoKSkpOwotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgdHJpbUFycmF5U3ltYm9sKFN0cmluZyBzKQotICB7Ci0gICAgaW50IGluZGV4ID0gcy5pbmRleE9mKCJbIik7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gczsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkTmFtZShKYXZhSGVscGVycyBqYXZhSGVscGVycykKLSAgewotICAgIGlmIChqYXZhSGVscGVycy5pc1ByaW1pdGl2ZSgpKQotICAgICAgcmV0dXJuIGphdmFIZWxwZXJzLmdldEphdmFOYW1lKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGphdmFIZWxwZXJzLmdldFF1YWxpZmllZE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIFN0YXR1c0hhbmRsZXIgc3RhdHVzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKDIwNDgpOwotICAgIHdyaXRlUGFja2FnZShzdyk7Ci0gICAgd3JpdGVJbXBvcnRzKHN3KTsKLSAgICB3cml0ZUNsYXNzKHN3KTsKLSAgICBzdy5jbG9zZSgpOwotICAgIGJ5dGVbXSBieXRlcyA9IHN3LmdldEJ1ZmZlcigpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKHBhY2thZ2VfICE9IG51bGwgJiYgcGFja2FnZV8ubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIHNiLmFwcGVuZChwYWNrYWdlXyk7Ci0gICAgICBzYi5hcHBlbmQoIi4iKTsKLSAgICB9Ci0gICAgc2IuYXBwZW5kKGNsYXNzXyk7Ci0gICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHNiLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsICcvJykpOwotICAgIHNiLmFwcGVuZCgiLmphdmEiKTsKLS8vICAgIFdlYlNlcnZpY2VFbGVtZW50IHdzZSA9IFdlYlNlcnZpY2VFbGVtZW50LmdldFdlYlNlcnZpY2VFbGVtZW50KG1vZGVsXyk7Ci0vLyAgICBJUHJvamVjdCBjbGllbnRQcm9qZWN0ID0gd3NlLmdldFByb3h5UHJvamVjdCgpOwotICAgIEphdmFFTUZOYXR1cmUgamF2YU1PRiA9IChKYXZhRU1GTmF0dXJlKUphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShjbGllbnRQcm9qZWN0Xyk7Ci0gICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0gICAgRmlsZVJlc291cmNlVXRpbHMuY3JlYXRlRmlsZShXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCksIEphdmFQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUZvbGRlck9yRmlyc3QoamF2YU1PRi5nZXRQcm9qZWN0KCksIG51bGwpLmdldEZpbGUobmV3IFBhdGgoc2IudG9TdHJpbmcoKSkpLmdldEZ1bGxQYXRoKCksIGJhaXMsIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVQYWNrYWdlKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChwYWNrYWdlXyAhPSBudWxsICYmIHBhY2thZ2VfLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICB3LndyaXRlKCJwYWNrYWdlICIpOwotICAgICAgdy53cml0ZShwYWNrYWdlXyk7Ci0gICAgICB3LndyaXRlKCI7Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUltcG9ydHMoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbXBvcnRzXy50b1N0cmluZygpLCAiOyIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdy53cml0ZSgiaW1wb3J0ICIpOwotICAgICAgdy53cml0ZShzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICB3LndyaXRlKCI7Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUNsYXNzKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLSAgewotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgicHVibGljIGNsYXNzICIpOwotICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICB3LndyaXRlKCIgIik7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWlzXy50b1N0cmluZygpLCAiOyIpOwotICAgIGlmIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICB3LndyaXRlKCJpbXBsZW1lbnRzICIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdy53cml0ZShzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICBpZiAoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICB3LndyaXRlKCIsICIpOwotICAgIH0KLSAgICB3LndyaXRlKCIgeyIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgd3JpdGVGaWVsZHNEZWNsYXJhdGlvbnModyk7Ci0gICAgd3JpdGVDb25zdHJ1Y3Rvcih3KTsKLSAgICB3cml0ZUluaXQodyk7Ci0gICAgLyoKLSAgICAqIENhbm5vdCB1c2UgSk5ESSBsb29rdXAgZm9yIEFYSVMKLSAgICAqCi0gICAgd3JpdGVVc2VKTkRJKHcpOwotICAgICovCi0gICAgd3JpdGVHZXRTZXRFbmRwb2ludCh3KTsKLSAgICB3cml0ZVNFSUdldHRlcnModyk7Ci0gICAgd3JpdGVTRUlNZXRob2RzKHcpOwotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlRmllbGRzRGVjbGFyYXRpb25zKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8qCi0gICAgKiBDYW5ub3QgdXNlIEpOREkgbG9va3VwIGZvciBBWElTCi0gICAgKgotICAgIHcud3JpdGUoInByaXZhdGUgYm9vbGVhbiBfdXNlSk5ESSA9IHRydWU7Iik7Ci0gICAgbmV3TGluZSh3KTsKLSAgICAqLwotICAgIHcud3JpdGUoInByaXZhdGUgU3RyaW5nIF9lbmRwb2ludCA9IG51bGw7Iik7Ci0gICAgdXNlZE5hbWVzLmFkZCgiX2VuZHBvaW50Iik7Ci0gICAgbmV3TGluZSh3KTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlaXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB3LndyaXRlKCJwcml2YXRlICIpOwotICAgICAgU3RyaW5nIHNlaSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgdy53cml0ZShzZWkpOwotICAgICAgdy53cml0ZSgiICIpOwotICAgICAgU3RyaW5nIHN0dWJOYW1lID0gZmlyc3RDaGFyVG9Mb3dlckNhc2UoZ2V0Q2xhc3NOYW1lKHNlaSkpOwotICAgICAgdy53cml0ZShzdHViTmFtZSk7Ci0gICAgICB1c2VkTmFtZXMuYWRkKHN0dWJOYW1lKTsKLSAgICAgIHcud3JpdGUoIiA9IG51bGw7Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUNvbnN0cnVjdG9yKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgicHVibGljICIpOwotICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICB3LndyaXRlKCIoKSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJfaW5pdCIpOwotICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICB3LndyaXRlKCIoKTsiKTsKLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgICBuZXdMaW5lKHcpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlSW5pdChXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoInByaXZhdGUgdm9pZCBfaW5pdCIpOwotICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICB3LndyaXRlKCIoKSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJ0cnkgeyIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgLyoKLSAgICAqIENhbm5vdCB1c2UgSk5ESSBsb29rdXAgZm9yIEFYSVMKLSAgICAqCi0gICAgdy53cml0ZSgiaWYgKF91c2VKTkRJKSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICAqLwotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vpc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc2VydmljZVRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2VydmljZXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgU3RyaW5nVG9rZW5pemVyIGpuZGlOYW1lVG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihqbmRpTmFtZXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHBvcnRUb2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBvcnRzXy50b1N0cmluZygpLCAiOyIpOwotICAgIC8qCi0gICAgaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB3LndyaXRlKCJqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQgY3R4ID0gbmV3IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dCgpOyIpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICB9Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB3LndyaXRlKGZpcnN0Q2hhclRvTG93ZXJDYXNlKGdldENsYXNzTmFtZShzdC5uZXh0VG9rZW4oKSkpKTsKLSAgICAgIHcud3JpdGUoIiA9ICgoIik7Ci0gICAgICB3LndyaXRlKHNlcnZpY2VUb2tlbnMubmV4dFRva2VuKCkpOwotICAgICAgdy53cml0ZSgiKWN0eC5sb29rdXAoXCJqYXZhOmNvbXAvZW52L3NlcnZpY2UvIik7Ci0gICAgICB3LndyaXRlKGpuZGlOYW1lVG9rZW5zLm5leHRUb2tlbigpKTsKLSAgICAgIHcud3JpdGUoIlwiKSkuZ2V0Iik7Ci0gICAgICB3LndyaXRlKG1hbmdsZUNsYXNzTmFtZShwb3J0VG9rZW5zLm5leHRUb2tlbigpKSk7Ci0gICAgICB3LndyaXRlKCIoKTsiKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgfQotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgiZWxzZSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vpc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICBzZXJ2aWNlVG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZXJ2aWNlc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICBwb3J0VG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihwb3J0c18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICAqLwotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgU3RyaW5nIHNlaU5hbWUgPSBmaXJzdENoYXJUb0xvd2VyQ2FzZShnZXRDbGFzc05hbWUoc3QubmV4dFRva2VuKCkpKTsKLSAgICAgIHcud3JpdGUoc2VpTmFtZSk7Ci0gICAgICB3LndyaXRlKCIgPSAobmV3ICIpOwotICAgICAgdy53cml0ZShzZXJ2aWNlVG9rZW5zLm5leHRUb2tlbigpKTsKLSAgICAgIHcud3JpdGUoIkxvY2F0b3IoKSkuZ2V0Iik7Ci0gICAgICB3LndyaXRlKHJlcGxhY2VJbnZhbGlkSmF2YUNoYXJzKFdTRExVdGlscy5yZXNvbHZlRG90SW5Qb3J0TmFtZShwb3J0VG9rZW5zLm5leHRUb2tlbigpKSkpOwotICAgICAgdy53cml0ZSgiKCk7Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgiaWYgKCIpOwotICAgICAgdy53cml0ZShzZWlOYW1lKTsKLSAgICAgIHcud3JpdGUoIiAhPSBudWxsKSB7Iik7Ci0gICAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCJpZiAoX2VuZHBvaW50ICE9IG51bGwpIik7Ci0gICAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCIoKGphdmF4LnhtbC5ycGMuU3R1YikiKTsKLSAgICAgIHcud3JpdGUoc2VpTmFtZSk7Ci0gICAgICB3LndyaXRlKCIpLl9zZXRQcm9wZXJ0eShcImphdmF4LnhtbC5ycGMuc2VydmljZS5lbmRwb2ludC5hZGRyZXNzXCIsIF9lbmRwb2ludCk7Iik7Ci0gICAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCJlbHNlIik7Ci0gICAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCJfZW5kcG9pbnQgPSAoU3RyaW5nKSgoamF2YXgueG1sLnJwYy5TdHViKSIpOwotICAgICAgdy53cml0ZShzZWlOYW1lKTsKLSAgICAgIHcud3JpdGUoIikuX2dldFByb3BlcnR5KFwiamF2YXgueG1sLnJwYy5zZXJ2aWNlLmVuZHBvaW50LmFkZHJlc3NcIik7Iik7Ci0gICAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoIn0iKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgfQotICAgIC8qCi0gICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJ9Iik7Ci0gICAgKi8KLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIC8qCi0gICAgdy53cml0ZSgiY2F0Y2ggKGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb24gbmFtaW5nRXhjZXB0aW9uKSB7fSIpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgKi8KLSAgICB3LndyaXRlKCJjYXRjaCAoamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uIHNlcnZpY2VFeGNlcHRpb24pIHt9Iik7Ci0gICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJ9Iik7Ci0gICAgbmV3TGluZSh3KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZVNldFByb3BlcnR5RW5kcG9pbnQoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWlzXy50b1N0cmluZygpLCAiOyIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgU3RyaW5nIHNlaU5hbWUgPSBmaXJzdENoYXJUb0xvd2VyQ2FzZShnZXRDbGFzc05hbWUoc3QubmV4dFRva2VuKCkpKTsKLSAgICAgIHcud3JpdGUoImlmICgiKTsKLSAgICAgIHcud3JpdGUoc2VpTmFtZSk7Ci0gICAgICB3LndyaXRlKCIgIT0gbnVsbCkiKTsKLSAgICAgIGluY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoIigoamF2YXgueG1sLnJwYy5TdHViKSIpOwotICAgICAgdy53cml0ZShzZWlOYW1lKTsKLSAgICAgIHcud3JpdGUoIikuX3NldFByb3BlcnR5KFwiamF2YXgueG1sLnJwYy5zZXJ2aWNlLmVuZHBvaW50LmFkZHJlc3NcIiwgX2VuZHBvaW50KTsiKTsKLSAgICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVVc2VKTkRJKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgicHVibGljIHZvaWQgdXNlSk5ESShib29sZWFuIHVzZUpOREkpIHsiKTsKLSAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIl91c2VKTkRJID0gdXNlSk5ESTsiKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vpc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIHcud3JpdGUoZmlyc3RDaGFyVG9Mb3dlckNhc2UoZ2V0Q2xhc3NOYW1lKHN0Lm5leHRUb2tlbigpKSkpOwotICAgICAgdy53cml0ZSgiID0gbnVsbDsiKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgfQotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICAgIG5ld0xpbmUodyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVTRUlHZXR0ZXJzKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vpc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWkgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIFN0cmluZyBzZWlDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUoc2VpKTsKLSAgICAgIFN0cmluZyBzZWlGaWVsZE5hbWUgPSBmaXJzdENoYXJUb0xvd2VyQ2FzZShzZWlDbGFzc05hbWUpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoInB1YmxpYyAiKTsKLSAgICAgIHcud3JpdGUoc2VpKTsKLSAgICAgIHcud3JpdGUoIiBnZXQiKTsKLSAgICAgIHcud3JpdGUoc2VpQ2xhc3NOYW1lKTsKLSAgICAgIHcud3JpdGUoIigpIHsiKTsKLSAgICAgIGluY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoImlmICgiKTsKLSAgICAgIHcud3JpdGUoc2VpRmllbGROYW1lKTsKLSAgICAgIHcud3JpdGUoIiA9PSBudWxsKSIpOwotICAgICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgiX2luaXQiKTsKLSAgICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICAgIHcud3JpdGUoIigpOyIpOwotICAgICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgicmV0dXJuICIpOwotICAgICAgdy53cml0ZShzZWlGaWVsZE5hbWUpOwotICAgICAgdy53cml0ZSgiOyIpOwotICAgICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgifSIpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVTRUlNZXRob2RzKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLSAgewotICAgIG5ld0xpbmUodyk7Ci0gICAgLy9XZWJTZXJ2aWNlRWxlbWVudCB3c2UgPSBXZWJTZXJ2aWNlRWxlbWVudC5nZXRXZWJTZXJ2aWNlRWxlbWVudChtb2RlbF8pOwotICAgIGlmIChjbGllbnRQcm9qZWN0XyA9PSBudWxsKSByZXR1cm47Ly93c2UuZ2V0UHJveHlQcm9qZWN0KCk7Ci0gICAgSmF2YUVNRk5hdHVyZSBqYXZhTU9GID0gKEphdmFFTUZOYXR1cmUpSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKGNsaWVudFByb2plY3RfKTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlaXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VpID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcylKYXZhQ2xhc3NJbXBsLnJlZmxlY3QoZ2V0UGFja2FnZU5hbWUoc2VpKSwgZ2V0Q2xhc3NOYW1lKHNlaSksIGphdmFNT0YuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0gICAgICBpZiAoamF2YUNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3QgbWV0aG9kcyA9IGphdmFDbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClpdC5uZXh0KCk7Ci0gICAgICAgICAgaWYgKCFtZXRob2QuaXNDb25zdHJ1Y3RvcigpICYmICFtZXRob2QuaXNOYXRpdmUoKSAmJiBtZXRob2QuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpID09IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUMpCi0gICAgICAgICAgICB3cml0ZVNFSU1ldGhvZHModywgamF2YUNsYXNzLCBtZXRob2QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlU0VJTWV0aG9kcyhXcml0ZXIgdywgSmF2YUNsYXNzIGphdmFDbGFzcywgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICB3LndyaXRlKCJwdWJsaWMgIik7Ci0gICAgLy8gaXNWb2lkCi0gICAgaWYgKG1ldGhvZC5pc1ZvaWQoKSkKLSAgICAgIHcud3JpdGUoInZvaWQgIik7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHcud3JpdGUoZ2V0RnVsbHlRdWFsaWZpZWROYW1lKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKTsKLSAgICAgIHcud3JpdGUoIiAiKTsKLSAgICB9Ci0gICAgLy8gbWV0aG9kIG5hbWUKLSAgICB3LndyaXRlKG1ldGhvZC5nZXROYW1lKCkpOwotICAgIHcud3JpdGUoIigiKTsKLSAgICAvLyBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgSmF2YVBhcmFtZXRlcltdIGlucHV0UGFyYW1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRQYXJhbXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgPiAwKQotICAgICAgICB3LndyaXRlKCIsICIpOwotICAgICAgSmF2YUhlbHBlcnMgamF2YUhlbHBlcnMgPSBpbnB1dFBhcmFtc1tpXS5nZXRKYXZhVHlwZSgpOwotICAgICAgdy53cml0ZShnZXRGdWxseVF1YWxpZmllZE5hbWUoamF2YUhlbHBlcnMpKTsKLSAgICAgIHcud3JpdGUoIiAiKTsKLSAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBnZXRDbGFzc05hbWUoaW5wdXRQYXJhbXNbaV0uZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgIHcud3JpdGUoZ2V0VW51c2VkTmFtZShwYXJhbU5hbWUpKTsKLSAgICB9Ci0gICAgdy53cml0ZSgiKSIpOwotICAgIC8vIGV4Y2VwdGlvbnMKLSAgICBMaXN0IGV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLSAgICBpZiAoIWV4Y2VwdGlvbnMuaXNFbXB0eSgpKQotICAgICAgdy53cml0ZSgiIHRocm93cyAiKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWl0Lm5leHQoKTsKLSAgICAgIHcud3JpdGUoZXhjZXB0aW9uLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkpOwotICAgICAgaWYgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgdy53cml0ZSgiLCAiKTsKLSAgICB9Ci0gICAgLy8gbWV0aG9kIGJvZHkKLSAgICB3LndyaXRlKCJ7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICBTdHJpbmcgc3R1Yk5hbWUgPSBmaXJzdENoYXJUb0xvd2VyQ2FzZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB3LndyaXRlKCJpZiAoIik7Ci0gICAgdy53cml0ZShzdHViTmFtZSk7Ci0gICAgdy53cml0ZSgiID09IG51bGwpIik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJfaW5pdCIpOwotICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICB3LndyaXRlKCIoKTsiKTsKLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIGlmICghbWV0aG9kLmlzVm9pZCgpKQotICAgICAgdy53cml0ZSgicmV0dXJuICIpOwotICAgIHcud3JpdGUoc3R1Yk5hbWUpOwotICAgIHcud3JpdGUoIi4iKTsKLSAgICB3LndyaXRlKG1ldGhvZC5nZXROYW1lKCkpOwotICAgIHcud3JpdGUoIigiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0UGFyYW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpID4gMCkKLSAgICAgICAgdy53cml0ZSgiLCAiKTsKLSAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBnZXRDbGFzc05hbWUoaW5wdXRQYXJhbXNbaV0uZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgIHcud3JpdGUoZ2V0VW51c2VkTmFtZShwYXJhbU5hbWUpKTsKLSAgICB9Ci0gICAgdy53cml0ZSgiKTsiKTsKLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIG5ld0xpbmUodyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVHZXRTZXRFbmRwb2ludChXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoInB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoKSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJyZXR1cm4gX2VuZHBvaW50OyIpOwotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnQpIHsiKTsKLSAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIl9lbmRwb2ludCA9IGVuZHBvaW50OyIpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgd3JpdGVTZXRQcm9wZXJ0eUVuZHBvaW50KHcpOwotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICAgIG5ld0xpbmUodyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlUGFyZW50Rm9sZGVyKElSZXNvdXJjZSByZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcGFyZW50ID0gcmVzLmdldFBhcmVudCgpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gcmVzICYmIHBhcmVudCBpbnN0YW5jZW9mIElGb2xkZXIpCi0gICAgewotICAgICAgSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcilwYXJlbnQ7Ci0gICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgY3JlYXRlUGFyZW50Rm9sZGVyKGZvbGRlcik7Ci0gICAgICAgIGZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluY3JlbWVudEluZGVudCgpCi0gIHsKLSAgICBpbmRlbnRDb3VudCsrOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGRlY3JlbWVudEluZGVudCgpCi0gIHsKLSAgICBpbmRlbnRDb3VudC0tOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluZGVudChXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudENvdW50OyBpKyspCi0gICAgICB3LndyaXRlKCIgICIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG5ld0xpbmUoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdy53cml0ZShORVdfTElORSk7Ci0gICAgaW5kZW50KHcpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRVbnVzZWROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgaWYgKHVzZWROYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IChuZXcgU3RyaW5nQnVmZmVyKG5hbWUpKS5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoaSkpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmICghdXNlZE5hbWVzLmNvbnRhaW5zKG5ld05hbWUpKQotICAgICAgICAgIHJldHVybiBuZXdOYW1lOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9WYWxpZGF0ZVdTRExDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1ZhbGlkYXRlV1NETENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkNzdhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1ZhbGlkYXRlV1NETENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVXU0RMQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLQotICBwdWJsaWMgVmFsaWRhdGVXU0RMQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5WYWxpZGF0ZVdTRExDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZCIpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotCU1lc3NhZ2VVdGlscyBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkucGx1Z2luIiwgdGhpcyApOwotCQotICAgIGlmICh3c2RsVVJJICE9IG51bGwgJiYgd3NkbFVSSS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgbnVtU2VydmljZXMgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCkuc2l6ZSgpOwotICAgICAgICBpZiAobnVtU2VydmljZXMgPCAxKQotICAgICAgICB7Ci0gICAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1NETF9IQVNfTk9fU0VSVklDRV9FTEVNRU5UIiwgbmV3IE9iamVjdFtdIHt3c2RsVVJJfSksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2RsVVJJIFRoZSB3c2RsVVJJIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciBUaGUgd2ViU2VydmljZXNQYXJzZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzQ2xpZW50Q29tbWFuZHNGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzQ2xpZW50Q29tbWFuZHNGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzY5MzQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc0NsaWVudENvbW1hbmRzRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkNvcHlBeGlzSmFyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5SZWZyZXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQnVpbGRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzQ2xpZW50Q29tbWFuZHNGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudAotewotICBwcml2YXRlIGJvb2xlYW4gZ2VuUHJveHlfOwotICAKLSAgcHVibGljIEF4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50KCkKLSAgewotICAgIFNlcXVlbmNlRnJhZ21lbnQgcm9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgCi0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kKCksICIiKSk7Ci0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDb3B5QXhpc0phckNvbW1hbmQoKSwgIiIpKTsKLSAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKCksICIiKSk7Ci0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZCgpLCAiIikpOyAKLSAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFZhbGlkYXRlV1NETENvbW1hbmQoKSwgIiIpKTsKLSAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFdTREwySmF2YUNvbW1hbmQoKSwgIiIpKTsgCi0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFN0dWIyQmVhbkNvbW1hbmQoKSwgIiIpKTsKLSAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEJ1aWxkUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICAKLSAgICBzZXRDb25kaXRpb24oIG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuUHJveHlfOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9KTsKLSAgICBzZXRUcnVlRnJhZ21lbnQoIHJvb3QgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eSggYm9vbGVhbiBnZW5Qcm94eSApCi0gIHsKLSAgICBnZW5Qcm94eV8gPSBnZW5Qcm94eTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzQ2xpZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc0NsaWVudEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NTczOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzQ2xpZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuV1NETDJKYXZhQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kLkF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kLkRlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5Db3B5QXhpc0phckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suUmVmcmVzaFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suU3R1YjJCZWFuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLlZhbGlkYXRlV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkJ1aWxkUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEF4aXNDbGllbnRGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQgCi17Ci0KLQlwdWJsaWMgQXhpc0NsaWVudEZyYWdtZW50KCkgCi0JewotCQlhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLQkJYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiQXhpc0NsaWVudFN0YXJ0IikpOwotCQlhZGQobmV3IE1hcHBpbmdGcmFnbWVudCgpKTsKLQkJYWRkKG5ldyBBeGlzQ2xpZW50Q29tbWFuZHNGcmFnbWVudCgpKTsKLQkJLy8gVE9ETzogTG9vayBpbnRvIEFkZFdTREx0b1dTSUxDb21tYW5kIGZvciB0aGUgY2xpZW50IHNjZW5hcmlvCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkpIAotCXsKLQkJLy8gQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsCi0JCQkJbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFJ1bnRpbWUiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRSdW50aW1lSUQiLAotCQkJCW51bGwpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLQkJCQkiQ2xpZW50UHJvamVjdEVBUiIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSTCIsIG51bGwpOyAvLyBVUkkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCi0JCS8vIFVSTAotCQkvLyB0cmFuc2Zvcm1lcgotCQkvLyByZXEnZD8/Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0UHJveHlTZWxlY3RlZCIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLQkJCQkiVGVzdFByb3h5U2VsZWN0ZWQiLCBudWxsKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc0NsaWVudFNjZW5hcmlvIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotCQkvLyBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5jbGFzcyk7IC8vT0sKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJMIiwgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5jbGFzcywgIldzZGxTZXJ2aWNlVVJMIiwgbnVsbCk7IC8vT0sKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIERlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQuY2xhc3MpOyAvL09LCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ3VzdG9taXplQ2xpZW50TWFwcGluZ3MiLCBNYXBwaW5nRnJhZ21lbnQuY2xhc3MgKTsgICAgCi0JCS8vcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0JCS8vICJTZXJ2aWNlUHJvamVjdCIsCi0JCS8vIENyZWF0ZVdlYlByb2plY3RDb21tYW5kLmNsYXNzKTsKLQkJLy9yZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLQkJLy8gIkVKQlByb2plY3ROYW1lIiwKLQkJLy8gQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQuY2xhc3MpOwotCQkvLyBDb3B5QXhpc0phckNvbW1hbmQoKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBDb3B5QXhpc0phckNvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgbnVsbCk7Ci0JCS8vIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2suY2xhc3MsICJQcm9qZWN0IiwgbnVsbCk7Ci0JCS8vIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kKCkgLy8gamF2YVBhcmFtXywgbW9kZWxfCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3QiLAotCQkJCW51bGwpOwotCQkvLwkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJMIiwKLQkJLy8gRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuY2xhc3MsIldTRExTZXJ2aWNlUGF0aG5hbWUiLG51bGwpOwotCQkvLyAvLwotCQkvLyBVUkwgdG8gVVJMPz8KLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJMIiwgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuY2xhc3MsICJXU0RMU2VydmljZVVSTCIsIG51bGwpOyAvLyBVUkkKLQkJLy8gdG8KLQkJLy8gVVJMPz8KLQkJLy8gVmFsaWRhdGVXU0RMQ29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFZhbGlkYXRlV1NETENvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxTZXJ2aWNlVVJMIiwgVmFsaWRhdGVXU0RMQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBWYWxpZGF0ZVdTRExDb21tYW5kLmNsYXNzKTsKLQkJLy8gV1NETDJKYXZhQ29tbWFuZCgpIC8vIGphdmFQYXJhbV8KLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSTCIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgbnVsbCk7IC8vIFVSTAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0bwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBVUkk/PwotCQkvLyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBSZWZyZXNoUHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgbnVsbCk7Ci0JCS8vIFN0dWIyQmVhbkNvbW1hbmQoKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBTdHViMkJlYW5Db21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIFN0dWIyQmVhbkNvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBTdHViMkJlYW5Db21tYW5kLmNsYXNzKTsKLQkJLy8gQnVpbGRQcm9qZWN0Q29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgbnVsbCk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRm9yY2VCdWlsZCIsIEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlZhbGlkYXRpb25NYW5hZ2VyIiwgQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoU3R1YjJCZWFuQ29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJQcm94eUJlYW4iLCBudWxsKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQXhpc0NsaWVudENvbW1hbmRzRnJhZ21lbnQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXRFbmRwb2ludE1ldGhvZCIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBNYXBwaW5nRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQgewotCi0JCXByaXZhdGUgYm9vbGVhbiBzaG93TWFwcGluZ3NfOwotCQlwdWJsaWMgTWFwcGluZ0ZyYWdtZW50KCkgewotCi0JCQlzdXBlcigpOwotCQkJc2V0VHJ1ZUZyYWdtZW50KG5ldyBTaW1wbGVGcmFnbWVudCgiQXhpc0NsaWVudEJlYW5NYXBwaW5nIikpOwotCQkJc2V0Q29uZGl0aW9uKG5ldyBDb25kaXRpb24oKSB7Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpIHsKLQotCQkJCQlyZXR1cm4gc2hvd01hcHBpbmdzXzsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVDbGllbnRNYXBwaW5ncyhib29sZWFuIHNob3dNYXBwaW5ncykgewotCi0JCQlzaG93TWFwcGluZ3NfID0gc2hvd01hcHBpbmdzOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc01hcHBpbmdzRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc01hcHBpbmdzRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0YTY2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNNYXBwaW5nc0ZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQXhpc01hcHBpbmdzRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIHNob3dNYXBwaW5nc187Ci0KLSAgcHVibGljIEF4aXNNYXBwaW5nc0ZyYWdtZW50KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCBuZXcgU2ltcGxlRnJhZ21lbnQoICJBeGlzTWFwcGluZ3NXaWRnZXQiICkpOwotICAgIHNldENvbmRpdGlvbiggbmV3IENvbmRpdGlvbigpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaG93TWFwcGluZ3NfOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9ICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNob3dNYXBwaW5nKCBib29sZWFuIHNob3dNYXBwaW5ncyApCi0gIHsKLSAgICBzaG93TWFwcGluZ3NfID0gc2hvd01hcHBpbmdzOwotICB9ICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzTWFwcGluZ3NXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc01hcHBpbmdzV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTI1ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzTWFwcGluZ3NXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuVGFibGVWaWV3ZXJXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIEF4aXNNYXBwaW5nc1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICAKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlcldpZGdldCBtYXBwaW5nc187Ci0KLSAgcHJpdmF0ZSBieXRlIG1vZGVfOwotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJfOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX0JFQU4yWE1MID0gKGJ5dGUpMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfWE1MMkJFQU4gPSAoYnl0ZSkxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9YTUwyUFJPWFkgPSAoYnl0ZSkyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9YTUwyRUpCID0gKGJ5dGUpMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfRUpCMlhNTCA9IChieXRlKTQ7Ci0gIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBQ0tBR0UgPSAiZGVmYXVsdC5qYXZhcGFja2FnZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRVNQQUNFID0gImh0dHA6Ly9kZWZhdWx0Lm5hbWVzcGFjZSI7Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdKTTAwMDEgZm9yIHRoZSBXU0RMIHRvIEphdmEgTWFwcGluZ3MgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdKTV9QQUdFID0gIlBXSk0wMDAxIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIEF4aXNNYXBwaW5nc1dpZGdldCggYnl0ZSBtb2RlICkKLSAgewotICAgIG1vZGVfID0gbW9kZTsKLSAgfQotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBwbHVnaW5JZF8gKTsKLSAgICAgICAgCi0gICAgLy8gVE9ETyBUaGUgVE9PTFRJUF9QV0pNX1BBR0Uga2V5IGRvZXNuJ3Qgc2VlbSB0byBleGlzdCBhbnl3aGVyZT8/PwotCS8vcGFyZW50LnNldFRvb2xUaXBUZXh0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCAiVE9PTFRJUF9QV0pNX1BBR0UiICkgKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkXyArICIuIiArIElORk9QT1BfUFdKTV9QQUdFICk7Ci0gICAgCi0gICAgLy8gVE9ETyBObyB0b29sdGlwIG9yIGluZm9wb3AgZm9yIHRoaXMgZ3JvdXAuCi0gICAgR3JvdXAgbWFwcGluZ0dyb3VwID0gdWlVdGlscy5jcmVhdGVHcm91cCggcGFyZW50LCAiTEFCRUxfTUFQUElOR19QQUlSUyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCBpbml0VmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIGlmKCBtb2RlXyA9PSBNT0RFX0JFQU4yWE1MIHx8IG1vZGVfID09IE1PREVfRUpCMlhNTCkgCi0gICAgewotCQlTdHJpbmdbXSBjb2x1bW5zID0geyBtc2dVdGlscy5nZXRNZXNzYWdlKCJUQUJMRV9DT0xVTU5fTEFCRUxfUEFDS0FHRSIpLAotCQkgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJUQUJMRV9DT0xVTU5fTEFCRUxfTkFNRVNQQUNFIiApfTsKLQkJbWFwcGluZ3NfID0gbmV3IFRhYmxlVmlld2VyV2lkZ2V0KCBjb2x1bW5zLCBpbml0VmFsdWVzLCBuZXcgU3RyaW5nW10ge0RFRkFVTFRfUEFDS0FHRSwgREVGQVVMVF9OQU1FU1BBQ0V9LCBUYWJsZVZpZXdlcldpZGdldC5NQVBfT05FX1RPX09ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0JZWxzZSAKLQl7Ci0gICAgICAJU3RyaW5nW10gY29sdW1ucyA9IHsgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiVEFCTEVfQ09MVU1OX0xBQkVMX05BTUVTUEFDRSIpLAotCQkgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJUQUJMRV9DT0xVTU5fTEFCRUxfUEFDS0FHRSIpfTsKLQkJbWFwcGluZ3NfID0gbmV3IFRhYmxlVmlld2VyV2lkZ2V0KCBjb2x1bW5zLCBpbml0VmFsdWVzLCBuZXcgU3RyaW5nW10ge0RFRkFVTFRfTkFNRVNQQUNFLCBERUZBVUxUX1BBQ0tBR0UgfSwgVGFibGVWaWV3ZXJXaWRnZXQuTUFQX01BTllfVE9fT05FKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAgICAKLQltYXBwaW5nc18uYWRkQ29udHJvbHMoIG1hcHBpbmdHcm91cCwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gbWFwcGluZ3NfLmdldFN0YXR1cygpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEphdmFQYXJhbWV0ZXIoIEphdmFXU0RMUGFyYW1ldGVyIHBhcmFtZXRlciApCi0gIHsKLSAgICBqYXZhUGFyYW1ldGVyXyA9IHBhcmFtZXRlcjsKLSAgfQotICAKLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFQYXJhbWV0ZXIoKQotICB7Ci0gICAgaWYoIG1vZGVfID09IE1PREVfQkVBTjJYTUwgfHwgbW9kZV8gPT0gTU9ERV9FSkIyWE1MIHx8IG1vZGVfID09IE1PREVfWE1MMkJFQU4gfHwgbW9kZV8gPT0gTU9ERV9YTUwyUFJPWFkpCi0gICAgewotICAgICAgLy9TZXQgdGhlIG1hcHBpbmdzIG9uIGphdmFQYXJhbWV0ZXIKLSAgICAgIFRhYmxlSXRlbVtdIHBhaXJzID0gbWFwcGluZ3NfLmdldEl0ZW1zKCk7Ci0gIAkgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgCSAgZm9yIChpbnQgaT0wOyBpPHBhaXJzLmxlbmd0aDsgaSsrKQotICAJICB7Ci0gIAkJbWFwLnB1dChwYWlyc1tpXS5nZXRUZXh0KDApLHBhaXJzW2ldLmdldFRleHQoMSkpOwotICAJICB9Ci0gIAkgIGphdmFQYXJhbWV0ZXJfLnNldE1hcHBpbmdzKG1hcCk7Ci0gIAkgIAotICAJICAvL1NldCB0aGUgbmFtZXNwYWNlIG9uIHRoZSBqYXZhUGFyYW1ldGVyCi0gIAkgIFN0cmluZyBiZWFuTmFtZSA9IGphdmFQYXJhbWV0ZXJfLmdldEJlYW5OYW1lKCk7Ci0JICBpZihiZWFuTmFtZSAhPSBudWxsICYmICFiZWFuTmFtZS5lcXVhbHMoIiIpKQotCSAgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBiZWFuTmFtZS5zdWJzdHJpbmcoMCwgYmVhbk5hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JCWlmKG1hcC5jb250YWluc0tleShwYWNrYWdlTmFtZSkpCi0JCXsKLQkJICBTdHJpbmcgdG5zID0gKFN0cmluZyltYXAuZ2V0KHBhY2thZ2VOYW1lKTsKLQkJICBqYXZhUGFyYW1ldGVyXy5zZXROYW1lc3BhY2UodG5zKTsKLQkJfQkJCi0JICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIGphdmFQYXJhbWV0ZXJfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNQcm94eVdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzUHJveHlXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0MGNiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNQcm94eVdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIEF4aXNQcm94eVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICAKLSAgLypDT05URVhUX0lEIFBXSkIwMDAxIGZvciB0aGUgV1NETCB0byBKYXZhIEJpbmRpbmdzIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BXSkJfUEFHRSA9ICJQV0pCMDAwMSI7CS8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QV0pCX1BBR0UgPSAiVE9PTFRJUF9QV0pCX1BBR0UiOwotCQkKLSAgcHJpdmF0ZSBUZXh0IGZvbGRlclRleHRfOwotICAvKkNPTlRFWFRfSUQgUFdKQjAwMDMgZm9yIHRoZSBGb2xkZXIgZmllbGQgb2YgdGhlIFdTREwgdG8gSmF2YSBCaW5kaW5ncyBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QV0pCX1RFWFRfRk9MREVSID0gIlBXSkIwMDAzIjsJLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BXSkJfVEVYVF9GT0xERVIgPSAiVE9PTFRJUF9QV0pCX1RFWFRfRk9MREVSIjsKLQotICBwcml2YXRlIEJ1dHRvbiBnZW5Qcm94eUNoZWNrYm94XzsKLSAgLypDT05URVhUX0lEIFBXSkIwMDA5IEluZGljYXRlcyB3aGV0aGVyIHRvIGdlbmVyYXRlIGEgcHJveHkgb3Igbm90LiAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BXSkJfQ0hFQ0tCT1hfR0VOUFJPWFkgPSAiUFdKQjAwMDkiOwkvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUFdKQl9DSEVDS0JPWF9HRU5QUk9YWSA9ICJUT09MVElQX1BXSkJfQ0hFQ0tCT1hfR0VOUFJPWFkiOwotCQkKLSAgcHJpdmF0ZSBCdXR0b24gc2hvd01hcHBpbmdzQ2hlY2tib3hfOwotICAvKkNPTlRFWFRfSUQgUFdKQjAwMTYgZm9yIHRoZSBTaG93IE1hcHBpbmdzIGNoZWNrYm94IG9mIHRoZSBCZWFuIE1ldGhvZHMgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfTjJQX1NIT1dfTUFQUElOR1MgPSAiUFdKQjAwMTYiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHVpVXRpbHMgID0gbmV3IFVJVXRpbHMobXNnVXRpbHMsIHBsdWdpbklkXyApOwotICAgIAotCXBhcmVudC5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHMuZ2V0TWVzc2FnZSggVE9PTFRJUF9QV0pCX1BBR0UgKSApOwotCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIHBhcmVudCwgcGx1Z2luSWRfICsgIi4iICsgIElORk9QT1BfUFdKQl9QQUdFKTsKLSAgICAKLSAgICBnZW5Qcm94eUNoZWNrYm94XyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goIHBhcmVudCwgIkNIRUNLQk9YX0dFTlBST1hZIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUFdKQl9DSEVDS0JPWF9HRU5QUk9YWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdKQl9DSEVDS0JPWF9HRU5QUk9YWSApOwotICAgIGdlblByb3h5Q2hlY2tib3hfLmFkZExpc3RlbmVyKCBTV1QuU2VsZWN0aW9uLCBzdGF0dXNMaXN0ZW5lciApOwotICAgIAotICAgIGdlblByb3h5Q2hlY2tib3hfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVHZW5Qcm94eSgpOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICBDb21wb3NpdGUgdGV4dEdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMiwgNSwgMCApOwotICAgIAotICAgIGZvbGRlclRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCB0ZXh0R3JvdXAsICJMQUJFTF9GT0xERVJfTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUFdKQl9URVhUX0ZPTERFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV0pCX1RFWFRfRk9MREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICBmb2xkZXJUZXh0Xy5hZGRMaXN0ZW5lciggU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICBzaG93TWFwcGluZ3NDaGVja2JveF8gPSB1aVV0aWxzLmNyZWF0ZUNoZWNrYm94KCBwYXJlbnQsICJMQUJFTF9FWFBMT1JFX01BUFBJTkdTX1hNTDJCRUFOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9OMlBfU0hPV19NQVBQSU5HUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9OMlBfU0hPV19NQVBQSU5HUyApOwotICAgIC8vIFNpbmNlIHRoaXMgd2lkZ2V0IGFmZmVjdHMgd2hldGhlciB0aGUgbmV4dCBwYWdlIGlzIHNob3duIG9yIG5vdCB3ZQotICAgIC8vIG5lZWQgdG8gYWRkIHRoZSBzdGF0dXNMaXN0ZW5lci4KLSAgICBzaG93TWFwcGluZ3NDaGVja2JveF8uYWRkTGlzdGVuZXIoIFNXVC5TZWxlY3Rpb24sIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVHZW5Qcm94eSgpCi0gIHsKLSAgICBib29sZWFuIGVuYWJsZWQgPSBnZW5Qcm94eUNoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICBmb2xkZXJUZXh0Xy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgc2hvd01hcHBpbmdzQ2hlY2tib3hfLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlGb2xkZXIoIFN0cmluZyBwcm94eUZvbGRlciApCi0gIHsKLSAgICBmb2xkZXJUZXh0Xy5zZXRUZXh0KCBwcm94eUZvbGRlciApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHlGb2xkZXIoKQotICB7Ci0gICAgIHJldHVybiBmb2xkZXJUZXh0Xy5nZXRUZXh0KCk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eSggQm9vbGVhbiBnZW5Qcm94eSApCi0gIHsKLSAgICBnZW5Qcm94eUNoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIGdlblByb3h5LmJvb2xlYW5WYWx1ZSgpICk7Ci0gIH0gICAgCi0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2VuUHJveHlDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgfSAgIAotICAKLSAgcHVibGljIHZvaWQgc2V0Q3VzdG9taXplQ2xpZW50TWFwcGluZ3MoIGJvb2xlYW4gc2hvd01hcHBpbmdzICkKLSAgewotICAgIHNob3dNYXBwaW5nc0NoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIHNob3dNYXBwaW5ncyApOwotICB9ICAgICAgICAgICAgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDdXN0b21pemVDbGllbnRNYXBwaW5ncygpCi0gIHsKLSAgICByZXR1cm4gc2hvd01hcHBpbmdzQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpICYmIGdlblByb3h5Q2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9ICAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRJc0NsaWVudFNjZW5hcmlvKCBib29sZWFuIGlzQ2xpZW50U2NlbmFyaW8gKQotICB7Ci0gICAgZ2VuUHJveHlDaGVja2JveF8uc2V0RW5hYmxlZCggIWlzQ2xpZW50U2NlbmFyaW8gKTsgCi0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9EZWZhdWx0c0ZvckNsaWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9EZWZhdWx0c0ZvckNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTE5NzM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvRGVmYXVsdHNGb3JDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0c0ZvckNsaWVudCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIGN1c3RvbWl6ZU1hcHBpbmdzXyA9IHRydWU7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDdXN0b21pemVDbGllbnRNYXBwaW5ncygpCi0gIHsKLSAgICByZXR1cm4gY3VzdG9taXplTWFwcGluZ3NfOwotICB9IAotICAKLSAgcHVibGljIHZvaWQgc2V0Q3VzdG9taXplQ2xpZW50TWFwcGluZ3MoIGJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgY3VzdG9taXplTWFwcGluZ3NfID0gdmFsdWU7IAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb3h5Rm9sZGVyKCkKLSAgewotICAgICByZXR1cm4gIi9wcm94eXByb2plY3QvbXlmb2xkZXIiOyAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9jbGllbnQvV2ViU2VydmljZUNsaWVudEF4aXNUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aXphcmQvY2xpZW50L1dlYlNlcnZpY2VDbGllbnRBeGlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZhZWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9jbGllbnQvV2ViU2VydmljZUNsaWVudEF4aXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc0NsaWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc01hcHBpbmdzV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc1Byb3h5V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotLyoqCi0gICogRGV2ZWxvcGVycyB3aG8gYXJlIGFkZGluZyB3ZWIgc2VydmljZSBjbGllbnRzIGludG8gdGhlIHdpemFyZCBzaG91bGQgY3JlYXRlCi0gICogYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UuICAKLSoqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDbGllbnRBeGlzVHlwZSBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nIAotewotCi0JCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgCi0gIHsKLSAgCS8vIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZCAgCQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDdXN0b21pemVDbGllbnRNYXBwaW5ncyIsIEF4aXNQcm94eVdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3RGb2xkZXIiLCBBeGlzUHJveHlXaWRnZXQuY2xhc3MsICJQcm94eUZvbGRlciIsIG51bGwgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEF4aXNQcm94eVdpZGdldC5jbGFzcyk7ICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc0NsaWVudFNjZW5hcmlvIiwgQXhpc1Byb3h5V2lkZ2V0LmNsYXNzKTsgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgbnVsbCk7Ci0gICAgCi0gICAgLy8gQXhpc1Byb3h5V2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIEF4aXNQcm94eVdpZGdldC5jbGFzcywgIkN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzIiwgQXhpc0NsaWVudEZyYWdtZW50Lk1hcHBpbmdGcmFnbWVudC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzUHJveHlXaWRnZXQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQXhpc0NsaWVudENvbW1hbmRzRnJhZ21lbnQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQXhpc1Byb3h5V2lkZ2V0LmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MgKTsKLSAgICAKLSAgICAvL0F4aXNNYXBwaW5nc1dpZGdldAotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOyAvL09LCi0JZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOyAvL09LCi0JZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIFZhbGlkYXRlV1NETENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7IC8vT0sKLQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsgLy9PSwotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBTdHViMkJlYW5Db21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOyAvL09LCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkgCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfICAgICA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIFN0cmluZyAgICAgICBheGlzUGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBNZXNzYWdlVXRpbHMgYXhpc01zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggYXhpc1BsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkF4aXNDbGllbnRTdGFydCIsIAotICAgICAgICBheGlzTXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19BWElTX1BST1hZIiksCi0gICAgICAgIGF4aXNNc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfQVhJU19QUk9YWSIpLAotICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXhpc1Byb3h5V2lkZ2V0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQXhpc0NsaWVudEJlYW5NYXBwaW5nIiwgCi0gICAgICAgIGF4aXNNc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1hNTDJQUk9YWSIpLAotICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfTjJQX01BUFBJTkdTIiksCi0gICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBeGlzTWFwcGluZ3NXaWRnZXQoQXhpc01hcHBpbmdzV2lkZ2V0Lk1PREVfWE1MMlBST1hZICk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXhpc0NsaWVudEZyYWdtZW50KCk7IAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkgCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2l6YXJkL3Rlc3QvVGVzdFdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC90ZXN0L1Rlc3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjcyZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2l6YXJkL3Rlc3QvVGVzdFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQXhpc0NsaWVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLS8qCi0gKiBBZGQgdGhlIHN0dWZmIGJlbG93IHRvIHRoZSBwcm9wZXJ0aWVzIGZpbGUgdG8gbWFrZSB0aGlzIHdvcmsuIAotIwotI1Rlc3Qgb25seSAtIGRvIG5vdCBjb21taXQKLSMKLXdzZGxVUkk9d3NkbFVSSQotY2xpZW50UHJvamVjdD1jbGllbnRQcm9qZWN0Ci1zZXJ2aWNlUU5hbWU9c2VydmljZVFOYW1lCi1vdXRwdXRXU0RMcGF0aD1vdXRwdXRXU0RMcGF0aAotR089R08KLXBvcDE9cG9wMQotcG9wMj1wb3AyCi0qLwotcHVibGljIGNsYXNzIFRlc3RXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF89ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgCi0gIHByaXZhdGUgVGV4dCB3c2RsVVJJVGV4dF87Ci0gIHByaXZhdGUgVGV4dCBjbGllbnRQcm9qZWN0VGV4dF87Ci0gIHByaXZhdGUgVGV4dCBzZXJ2aWNlUU5hbWVUZXh0XzsKLSAgcHJpdmF0ZSBUZXh0IG91dHB1dFdTRExQYXRoVGV4dF87Ci0gIHByaXZhdGUgQnV0dG9uIGdvQnV0dG9uXzsKLSAgcHJpdmF0ZSBCdXR0b24gcG9wMUJ1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIHBvcDJCdXR0b25fOwotICAKLSAgcHVibGljIFRlc3RXaXphcmRQYWdlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gICAgc2V0VGl0bGUoIlRlc3QgUGFnZSIpOwotICAgIHNldERlc2NyaXB0aW9uKCJUZXN0IHBhZ2UgZGVzY3JpcHRpb24iKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIHBhZ2UgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHBhZ2Uuc2V0TGF5b3V0KGdsKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBwYWdlLnNldExheW91dERhdGEoZ2QpOwotICAgIHBhZ2Uuc2V0U2l6ZSg1MDAsNTAwKTsKLQotICAgCi0JLy9Db21wb3NpdGUgb3V0ZXJHcm91cF8gPSBuZXcgQ29tcG9zaXRlKHBhZ2UsU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlDb21wb3NpdGUgb3V0ZXJHcm91cF8gPSBuZXcgQ29tcG9zaXRlKHBhZ2UsU1dULk5PTkUpOwotCUdyaWRMYXlvdXQgZ2wyID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlnbDIubnVtQ29sdW1ucyA9IDI7Ci0JZ2wyLm1hcmdpbkhlaWdodCA9IDA7Ci0JZ2wyLm1hcmdpbldpZHRoID0gMDsKLQlvdXRlckdyb3VwXy5zZXRMYXlvdXQoZ2wyKTsKLQkvL0dyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCW91dGVyR3JvdXBfLnNldExheW91dERhdGEoZ2QyKTsKLQkKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgVUlVdGlscyB1aVV0aWxzID0gbmV3IFVJVXRpbHMobXNnVXRpbHNfLCBwbHVnaW5JZF8pOwotICAgIAotICAgIHdzZGxVUklUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dChvdXRlckdyb3VwXywid3NkbFVSSSIsIndzZGxVUkkiLCJ3c2RsVVJJIixTV1QuU0lOR0xFfFNXVC5CT1JERVIpOwotICAgIGNsaWVudFByb2plY3RUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dChvdXRlckdyb3VwXywiY2xpZW50UHJvamVjdCIsImNsaWVudFByb2plY3QiLCJjbGllbnRQcm9qZWN0IixTV1QuU0lOR0xFfFNXVC5CT1JERVIpOwotICAgIHNlcnZpY2VRTmFtZVRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KG91dGVyR3JvdXBfLCJzZXJ2aWNlUU5hbWUiLCJzZXJ2aWNlUU5hbWUiLCIiLFNXVC5TSU5HTEV8U1dULkJPUkRFUik7Ci0gICAgb3V0cHV0V1NETFBhdGhUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dChvdXRlckdyb3VwXywib3V0cHV0V1NETHBhdGgiLCJvdXRwdXRXU0RMcGF0aCIsIiIsU1dULlNJTkdMRXxTV1QuQk9SREVSKTsKLSAgICBnb0J1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZUJ1dHRvbihTV1QuUFVTSCxvdXRlckdyb3VwXywiR08iLCJHTyIsIiIpOwotICAgIGdvQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVHT1B1c2hlZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVHT1B1c2hlZCgpOwotICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIHBvcDFCdXR0b25fID0gdWlVdGlscy5jcmVhdGVCdXR0b24oU1dULlBVU0gsb3V0ZXJHcm91cF8sInBvcDEiLCJwb3AxIiwiIik7Ci0gICAgcG9wMUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlUG9wMVB1c2hlZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVQb3AxUHVzaGVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgfSk7ICAgIAotICAgIHBvcDJCdXR0b25fID0gdWlVdGlscy5jcmVhdGVCdXR0b24oU1dULlBVU0gsb3V0ZXJHcm91cF8sInBvcDIiLCJwb3AyIiwiIik7Ci0gICAgcG9wMkJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlUG9wMlB1c2hlZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVQb3AyUHVzaGVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgfSk7ICAgIAotIAotICAgIHNldENvbnRyb2wocGFnZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVQb3AxUHVzaGVkKCkKLSAgewotICAgIHdzZGxVUklUZXh0Xy5zZXRUZXh0KCJodHRwOi8vd3d3LnhtZXRob2RzLm5ldC9zZC8yMDAxL1RlbXBlcmF0dXJlU2VydmljZS53c2RsIik7Ci0gICAgY2xpZW50UHJvamVjdFRleHRfLnNldFRleHQoImN3cCIpOwotICAgIHNlcnZpY2VRTmFtZVRleHRfLnNldFRleHQoImh0dHA6Ly93d3cueG1ldGhvZHMubmV0L3NkL1RlbXBlcmF0dXJlU2VydmljZS53c2RsOlRlbXBlcmF0dXJlU2VydmljZSIpOwotICAgIG91dHB1dFdTRExQYXRoVGV4dF8uc2V0VGV4dCgiL2N3cC9XZWIgQ29udGVudC9XRUItSU5GL3dzZGwvVGVtcGVyYXR1cmVTZXJ2aWNlLndzZGwiKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBvcDJQdXNoZWQoKQotICB7Ci0gICAgd3NkbFVSSVRleHRfLnNldFRleHQoImZpbGU6L0Q6L0VjbGlwc2UvZWNsaXBzZS9ydW50aW1lLXdvcmtzcGFjZV90MS93cDIvV2ViIENvbnRlbnQvQ29udmVydGVycy53c2RsIik7Ci0gICAgY2xpZW50UHJvamVjdFRleHRfLnNldFRleHQoImN3cDIiKTsKLSAgICBzZXJ2aWNlUU5hbWVUZXh0Xy5zZXRUZXh0KCJodHRwOi8vc2FtcGxlLmNvbnZlcnRlcnM6Q29udmVydERpc3RhbmNlU2VydmljZSIpOwotICAgIG91dHB1dFdTRExQYXRoVGV4dF8uc2V0VGV4dCgiL2N3cDIvV2ViIENvbnRlbnQvV0VCLUlORi93c2RsL0NvbnZlcnRlcnMud3NkbCIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUdPUHVzaGVkKCkKLSAgewotICAgIEF4aXNDbGllbnRHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IEF4aXNDbGllbnRHZW5lcmF0b3IoKTsKLSAgICBUZXN0V1NDRGF0YUhlbHBlciBkYXRhTW9kZWwgPSBuZXcgVGVzdFdTQ0RhdGFIZWxwZXIoKTsKLSAgICBkYXRhTW9kZWwucG9wdWxhdGUod3NkbFVSSVRleHRfLmdldFRleHQoKSwgc2VydmljZVFOYW1lVGV4dF8uZ2V0VGV4dCgpLCBjbGllbnRQcm9qZWN0VGV4dF8uZ2V0VGV4dCgpLCBvdXRwdXRXU0RMUGF0aFRleHRfLmdldFRleHQoKSxmYWxzZSk7Ci0gICAgCi0gICAgZ2VuZXJhdG9yLmdlbldlYlNlcnZpY2VDbGllbnRBcnRpZmFjdHMoZGF0YU1vZGVsKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRlZCBzZXJ2aWNlIGludGVyZmFjZT0gIitkYXRhTW9kZWwuZ2V0U2VydmljZUludGVyZmFjZU5hbWUoKSk7Ci0gICAgU3RyaW5nW10gc2VpcyA9IGRhdGFNb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lcygpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2VuZXJhdGVkIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlczoiKTsKLSAgICBmb3IgKGludCBpPTA7aTxzZWlzLmxlbmd0aDtpKyspCi0gICAgewotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oc2Vpc1tpXSk7Ci0gICAgfQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG91Y2hlZCBkZXNjcmlwdG9ycz8gIitkYXRhTW9kZWwuc2hvdWxkR2VuRGVzY3JpcHRvcnMoKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgVGVzdFdTQ0RhdGFIZWxwZXIgaW1wbGVtZW50cyBXZWJTZXJ2aWNlc0NsaWVudERhdGFIZWxwZXIKLSAgewotICAJcHJpdmF0ZSBTdHJpbmcgd3NkbFVybF87Ci0gIAlwcml2YXRlIFN0cmluZyBzZXJ2aWNlUU5hbWVfOwotICAJcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWVfOwotICAJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0V1NETEZpbGVOYW1lXzsKLSAgCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VJbnRlcmZhY2VOYW1lXzsKLSAgCXByaXZhdGUgU3RyaW5nW10gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZXNfOwotICAJcHJpdmF0ZSBib29sZWFuIHNob3VsZERlcGxveV87Ci0gIAlwcml2YXRlIGJvb2xlYW4gc2hvdWxkR2VuRGVzY3JpcHRvcnNfOwotICAJCi0gIAlwdWJsaWMgdm9pZCBwb3B1bGF0ZShTdHJpbmcgd3NkbFVSTCwgU3RyaW5nIHNlcnZpY2VRTmFtZSwgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgb3V0cHV0V1NETEZpbGVOYW1lLCBib29sZWFuIHNob3VsZERlcGxveSkKLSAgCXsKLSAgCQl3c2RsVXJsXyA9IHdzZGxVUkw7Ci0gIAkJc2VydmljZVFOYW1lXyA9IHNlcnZpY2VRTmFtZTsKLSAgCQlwcm9qZWN0TmFtZV8gPSBwcm9qZWN0TmFtZTsKLSAgCQlvdXRwdXRXU0RMRmlsZU5hbWVfID0gb3V0cHV0V1NETEZpbGVOYW1lOwotICAJCXNob3VsZERlcGxveV8gPSBzaG91bGREZXBsb3k7Ci0gIAl9Ci0JLyoqCi0JICogQHJldHVybiB0aGUgVVJMIGZvciB0aGUgYXNzb2NpYXRlZCBvcmlnaW5hbCBXU0RMIGZpbGUgcmVmZXJlbmNlZCBieSB0aGUgY2xpZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRXU0RMVXJsKCkKLQl7Ci0JCXJldHVybiB3c2RsVXJsXzsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgUU5hbWUgZm9yIHRoZSBhc3NvY2lhdGVkIHdlYiBzZXJ2aWNlIGZvciB0aGUgY2xpZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUU5hbWUoKQotCXsKLQkJcmV0dXJuIHNlcnZpY2VRTmFtZV87Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBwcm9qZWN0IGZvciB0aGUgd2ViIHNlcnZpY2UgY2xpZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpCi0JewotCQlyZXR1cm4gcHJvamVjdE5hbWVfOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBmaWxlTmFtZSBsb2NhdGlvbiBmb3IgdGhlIGNvcGllZCBXU0RMIGZpbGUgaW50byB0aGUgY2xpZW50IHByb2plY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dFdTRExGaWxlTmFtZSgpCi0JewotCQlyZXR1cm4gb3V0cHV0V1NETEZpbGVOYW1lXzsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSW50ZXJmYWNlTmFtZSgpCi0JewotCQlyZXR1cm4gc2VydmljZUludGVyZmFjZU5hbWVfOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZXMoKQotCXsKLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWVzXzsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBzaG91bGQgZ2VuZXJhdGUgY29kZSBmb3IgZGVwbG95bWVudD8KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZXBsb3koKQotCXsKLQkJcmV0dXJuIHNob3VsZERlcGxveV87Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZXh0ZW5zaW9uIGdlbmVyYXRlZCB0aGUgZGVzY3JpcHRvcnMgb3Igbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuRGVzY3JpcHRvcnMoKQotCXsKLQkJcmV0dXJuIHNob3VsZEdlbkRlc2NyaXB0b3JzXzsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBTSSBjbGFzc25hbWUgZm9yIHRoZSB3ZWIgc2VydmljZSBjbGllbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlTmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCXNlcnZpY2VJbnRlcmZhY2VOYW1lXyA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBTRUkgY2xhc3NuYW1lcyBmb3IgdGhlIHdlYiBzZXJ2aWNlIGNsaWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWVzKFN0cmluZ1tdIG5hbWVzKQotCXsKLQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZXNfID0gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgZGVzY3JpcHRvcnMgd2VyZSBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWRHZW5EZXNjcmlwdG9ycyhib29sZWFuIGIpCi0JewotCQlzaG91bGRHZW5EZXNjcmlwdG9yc18gPSBiOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGludm9rZSBhbnkgb3BlcmF0aW9ucyByZXF1aXJlZCB0byBzZXQgdXAgd2ViIHNlcnZpY2VzIGNsaWVudCwgU0ksIGFuZCBTRUkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZW5XZWJTZXJ2aWNlQ2xpZW50QXJ0aWZhY3RzKFdlYlNlcnZpY2VzQ2xpZW50RGF0YUhlbHBlciBkYXRhTW9kZWwpCi0JewotCQkvLyBEbyBub3RoaW5nLiBUaGlzIHNob3VsZG4ndCBiZSBvbiB0aGUgaW50ZXJmYWNlIQotCX0KLQkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2l6YXJkL3Rlc3QvV2ViU2VydmljZVRlc3RXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC90ZXN0L1dlYlNlcnZpY2VUZXN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MWM4ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2l6YXJkL3Rlc3QvV2ViU2VydmljZVRlc3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVRlc3RXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkCi17Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VUZXN0V2l6YXJkKCkKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICBUZXN0V2l6YXJkUGFnZSBwYWdlID0gbmV3IFRlc3RXaXphcmRQYWdlKCJUZXN0IHBhZ2UiKTsKLSAgfQotCi0KLQotICAvKioKLSAgKiBJbml0aWFsaXplcyB0aGlzICJOZXciIHdpemFyZC4KLSAgKiBAcGFyYW0gd29ya2JlbmNoIFRoZSB3b3JrYmVuY2ggdGhhdCBsYXVuY2hlZCB0aGlzIHdpemFyZC4KLSAgKiBAcGFyYW0gc2VsZWN0aW9uIFRoZSBzZWxlY3Rpb24gY29udGV4dCBvZiB0aGlzIHdpemFyZC4KLSAgKiBAcmV0dXJuIFRoaXMgd2l6YXJkLgotICAqLwotICBwdWJsaWMgdm9pZCBpbml0ICggSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsKLSAgICAvL0RvIG5vdGhpbmcKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0KLSAgICBUZXN0V2l6YXJkUGFnZSBwYWdlID0gbmV3IFRlc3RXaXphcmRQYWdlKCJUZXN0IHBhZ2UiKTsKLSAgICBhZGRQYWdlKHBhZ2UpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgICAvL0Fsd2F5cyBhbGxvdyBmaW5pc2gKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3V0aWwvQ2xhc3NwYXRoVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3V0aWwvQ2xhc3NwYXRoVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2Njc5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91dGlsL0NsYXNzcGF0aFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uSUVBUk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklXZWJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSjJFRVdlYk5hdHVyZVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhVdGlscyB7Ci0KLQkvLwlDb3B5cmlnaHQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMy4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBDbGFzc3BhdGhVdGlscyBpbnN0YW5jZV87IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRElSX0NMQVNTRVMgPSAiY2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRElSX0xJQiA9ICJsaWIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERPVF9KQVIgPSAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ2xhc3NwYXRoVXRpbHMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGhVdGlscyBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlXyA9PSBudWxsKQotCQkJaW5zdGFuY2VfID0gbmV3IENsYXNzcGF0aFV0aWxzKCk7Ci0JCXJldHVybiBpbnN0YW5jZV87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhTdHJpbmcoSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmdCdWZmZXIgY2xhc3NwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdbXSBjbGFzc3BhdGhFbnRyaWVzID0gZ2V0Q2xhc3NwYXRoKHByb2plY3QsIGZhbHNlKTsKLQkJVmVjdG9yIGNsYXNzcGF0aFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWNsYXNzcGF0aFZlY3Rvci5jb250YWlucyhjbGFzc3BhdGhFbnRyaWVzW2ldKSkgewotCQkJCWNsYXNzcGF0aFZlY3Rvci5hZGQoY2xhc3NwYXRoRW50cmllc1tpXSk7Ci0JCQkJY2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGhFbnRyaWVzW2ldKTsKLQkJCQljbGFzc3BhdGguYXBwZW5kKCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFVSTFtdIGdldENsYXNzcGF0aFVSTChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZ1tdIGNsYXNzcGF0aEVudHJpZXMgPSBnZXRDbGFzc3BhdGgocHJvamVjdCwgZmFsc2UpOwotCQlWZWN0b3IgY2xhc3NwYXRoVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY2xhc3NwYXRoRW50cmllc1tpXSk7Ci0JCQkJLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIHByb2plY3QgQ1BbIitpKyJdID0gIitmaWxlKTsKLQkJCQlVUkwgdXJsID0gZmlsZS50b1VSTCgpOwotCQkJCWlmICghY2xhc3NwYXRoVmVjdG9yLmNvbnRhaW5zKHVybCkpCi0JCQkJCWNsYXNzcGF0aFZlY3Rvci5hZGQodXJsKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl9Ci0JCX0KLQkJYWRkTGliQ2xhc3NzcGF0aChjbGFzc3BhdGhWZWN0b3IpOwotCQkvLyBhZGQgdGhlIHBsdWdpbiBsaWIgZGlyZWN0b3J5IGphcnMgdG8gY2xhc3NwYXRoCi0JCVVSTFtdIGNsYXNzcGF0aCA9IG5ldyBVUkxbY2xhc3NwYXRoVmVjdG9yLnNpemUoKV07Ci0JCWNsYXNzcGF0aFZlY3Rvci5jb3B5SW50byhjbGFzc3BhdGgpOwotCQlyZXR1cm4gY2xhc3NwYXRoOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaWJDbGFzc3NwYXRoKFZlY3RvciBjbGFzc3BhdGhWZWN0b3IpIHsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldENsYXNzcGF0aChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzRGVwZW5kZW50KSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdbXSBjbGFzc3BhdGg7Ci0JCQlFQVJOYXR1cmVSdW50aW1lIGVhclByb2plY3QgPSBjYXN0VG9FQVJQcm9qZWN0KHByb2plY3QpOwotCQkJaWYgKGVhclByb2plY3QgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoRm9yRUFSUHJvamVjdChlYXJQcm9qZWN0KTsKLQkJCWVsc2UgaWYgKHByb2plY3QuaGFzTmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpKQotCQkJCXJldHVybiBnZXRDbGFzc3BhdGhGb3JXZWJQcm9qZWN0KAotCQkJCQkoSjJFRVdlYk5hdHVyZVJ1bnRpbWUpIHByb2plY3QuZ2V0TmF0dXJlKAotCQkJCQkJSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCksCi0JCQkJCWlzRGVwZW5kZW50KTsKLQkJCWVsc2UgaWYgKHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpCi0JCQkJcmV0dXJuIGdldENsYXNzcGF0aEZvckphdmFQcm9qZWN0KAotCQkJCQkoSUphdmFQcm9qZWN0KSBwcm9qZWN0LmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVBUk5hdHVyZVJ1bnRpbWUgY2FzdFRvRUFSUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdbXSBlYXJOYXR1cmVzID0gSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSURTOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJOYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKGVhck5hdHVyZXNbaV0pKQotCQkJCQlyZXR1cm4gKEVBUk5hdHVyZVJ1bnRpbWUpIHByb2plY3QuZ2V0TmF0dXJlKGVhck5hdHVyZXNbaV0pOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRDbGFzc3BhdGhGb3JFQVJQcm9qZWN0KEVBUk5hdHVyZVJ1bnRpbWUgZWFyUHJvamVjdCkgewotCQlJUGF0aCBlYXJQYXRoID0KLQkJCWVhclByb2plY3QuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJcmV0dXJuIGdldERpcmVjdG9yeUphckZpbGVzKGVhclBhdGgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0RGlyZWN0b3J5SmFyRmlsZXMoSVBhdGggaVBhdGgpIHsKLQkJRmlsZSBkaXIgPSBpUGF0aC50b0ZpbGUoKTsKLQkJVmVjdG9yIGphcnNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmIChkaXIuZXhpc3RzKCkgJiYgZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIGZpbGVuYW1lcyA9IGRpci5saXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlbmFtZXNbaV0uZW5kc1dpdGgoRE9UX0pBUikpCi0JCQkJCWphcnNWZWN0b3IuYWRkKHBhdGgyU3RyaW5nKGlQYXRoKSArIGZpbGVuYW1lc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gamFycyA9IG5ldyBTdHJpbmdbamFyc1ZlY3Rvci5zaXplKCldOwotCQlqYXJzVmVjdG9yLmNvcHlJbnRvKGphcnMpOwotCQlyZXR1cm4gamFyczsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldENsYXNzcGF0aEZvcldlYlByb2plY3QoCi0JCUoyRUVXZWJOYXR1cmVSdW50aW1lIHdlYlByb2plY3QsCi0JCWJvb2xlYW4gaXNEZXBlbmRlbnQpIHsKLQkJU3RyaW5nW10gd2ViaW5mQ2xhc3NlcyA9IGdldFdFQklORkNsYXNzZXMod2ViUHJvamVjdCk7Ci0JCVN0cmluZ1tdIHdlYmluZkxpYjsKLQkJU3RyaW5nW10gamF2YUNsYXNzcGF0aDsKLQkJaWYgKGlzRGVwZW5kZW50KSB7Ci0JCQl3ZWJpbmZMaWIgPSBuZXcgU3RyaW5nWzBdOwotCQkJamF2YUNsYXNzcGF0aCA9IG5ldyBTdHJpbmdbMF07Ci0JCX0gZWxzZSB7Ci0JCQl3ZWJpbmZMaWIgPSBnZXRXRUJJTkZMaWIod2ViUHJvamVjdCk7Ci0JCQlqYXZhQ2xhc3NwYXRoID0KLQkJCQlnZXRDbGFzc3BhdGhGb3JKYXZhUHJvamVjdCh3ZWJQcm9qZWN0LmdldEoyRUVKYXZhUHJvamVjdCgpKTsKLQkJfQotCQlTdHJpbmdbXSB3ZWJDbGFzc3BhdGggPQotCQkJbmV3IFN0cmluZ1t3ZWJpbmZDbGFzc2VzLmxlbmd0aAotCQkJCSsgd2ViaW5mTGliLmxlbmd0aAotCQkJCSsgamF2YUNsYXNzcGF0aC5sZW5ndGhdOwotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdlYmluZkNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCXdlYkNsYXNzcGF0aFtpbmRleF0gPSB3ZWJpbmZDbGFzc2VzW2ldOwotCQkJaW5kZXgrKzsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHdlYmluZkxpYi5sZW5ndGg7IGkrKykgewotCQkJd2ViQ2xhc3NwYXRoW2luZGV4XSA9IHdlYmluZkxpYltpXTsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhQ2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQl3ZWJDbGFzc3BhdGhbaW5kZXhdID0gamF2YUNsYXNzcGF0aFtpXTsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJcmV0dXJuIHdlYkNsYXNzcGF0aDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldFdFQklORkNsYXNzZXMoSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViUHJvamVjdCkgewotCQlJUGF0aCB3ZWJpbmYgPQotCQkJd2ViUHJvamVjdAotCQkJCS5nZXRQcm9qZWN0KCkKLQkJCQkuZ2V0TG9jYXRpb24oKQotCQkJCS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpCi0JCQkJLmFwcGVuZCgKLQkJCQl3ZWJQcm9qZWN0LmdldFdFQklORlBhdGgoKSk7Ci0JCUlQYXRoIGNsYXNzZXMgPQotCQkJKChJUGF0aCkgd2ViaW5mLmNsb25lKCkpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKERJUl9DTEFTU0VTKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IHBhdGgyU3RyaW5nKGNsYXNzZXMpfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldFdFQklORkxpYihKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJQcm9qZWN0KSB7Ci0JCUlQYXRoIHdlYmluZiA9Ci0JCQl3ZWJQcm9qZWN0Ci0JCQkJLmdldFByb2plY3QoKQotCQkJCS5nZXRMb2NhdGlvbigpCi0JCQkJLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkKLQkJCQkuYXBwZW5kKAotCQkJCXdlYlByb2plY3QuZ2V0V0VCSU5GUGF0aCgpKTsKLQkJSVBhdGggbGliID0KLQkJCSgoSVBhdGgpIHdlYmluZi5jbG9uZSgpKQotCQkJCS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpCi0JCQkJLmFwcGVuZChESVJfTElCKQotCQkJCS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQlyZXR1cm4gZ2V0RGlyZWN0b3J5SmFyRmlsZXMobGliKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldENsYXNzcGF0aEZvckphdmFQcm9qZWN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlTdHJpbmdbXSBqYXZhQnVpbGRQYXRoOwotCQl0cnkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gYnVpbGRQYXRoID0KLQkJCQlqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidWlsZFBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmdbXSBidWlsZFBhdGhTdHJpbmcgPQotCQkJCQljbGFzc3BhdGhFbnRyeTJTdHJpbmcoCi0JCQkJCQlidWlsZFBhdGhbaV0sCi0JCQkJCQlqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYnVpbGRQYXRoU3RyaW5nLmxlbmd0aDsgaisrKSB7Ci0JCQkJCXYuYWRkKGJ1aWxkUGF0aFN0cmluZ1tqXSk7Ci0JCQkJfQotCQkJfQotCQkJamF2YUJ1aWxkUGF0aCA9IG5ldyBTdHJpbmdbdi5zaXplKCldOwotCQkJdi5jb3B5SW50byhqYXZhQnVpbGRQYXRoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJamF2YUJ1aWxkUGF0aCA9IG5ldyBTdHJpbmdbMF07Ci0JCX0KLQotCQlTdHJpbmdbXSBlYXJDbGFzc3BhdGg7Ci0JCVZlY3RvciB1dGlsaXR5SmFyc1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJSVByb2plY3RbXSByZWZlcmVuY2luZ1Byb2plY3RzID0gcHJvamVjdC5nZXRSZWZlcmVuY2luZ1Byb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNpbmdQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJRUFSTmF0dXJlUnVudGltZSBlYXJQcm9qZWN0ID0KLQkJCQljYXN0VG9FQVJQcm9qZWN0KHJlZmVyZW5jaW5nUHJvamVjdHNbaV0pOwotCQkJaWYgKGVhclByb2plY3QgIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHV0aWxpdHlKYXJzID0gZ2V0Q2xhc3NwYXRoRm9yRUFSUHJvamVjdChlYXJQcm9qZWN0KTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHV0aWxpdHlKYXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCXV0aWxpdHlKYXJzVmVjdG9yLmFkZCh1dGlsaXR5SmFyc1tqXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVhckNsYXNzcGF0aCA9IG5ldyBTdHJpbmdbdXRpbGl0eUphcnNWZWN0b3Iuc2l6ZSgpXTsKLQkJdXRpbGl0eUphcnNWZWN0b3IuY29weUludG8oZWFyQ2xhc3NwYXRoKTsKLQotCQlTdHJpbmdbXSBqYXZhQ2xhc3NwYXRoID0KLQkJCW5ldyBTdHJpbmdbamF2YUJ1aWxkUGF0aC5sZW5ndGggKyBlYXJDbGFzc3BhdGgubGVuZ3RoXTsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhQnVpbGRQYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlqYXZhQ2xhc3NwYXRoW2luZGV4XSA9IGphdmFCdWlsZFBhdGhbaV07Ci0JCQlpbmRleCsrOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyQ2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlqYXZhQ2xhc3NwYXRoW2luZGV4XSA9IGVhckNsYXNzcGF0aFtpXTsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJcmV0dXJuIGphdmFDbGFzc3BhdGg7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjbGFzc3BhdGhFbnRyeTJTdHJpbmcoCi0JCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSwKLQkJSVByb2plY3QgcHJvamVjdCkgewotCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IHBhdGgyU3RyaW5nKGVudHJ5LmdldFBhdGgoKSl9OwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCXJldHVybiBnZXRDbGFzc3BhdGgoCi0JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLQkJCQkJCWVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKSwKLQkJCQkJdHJ1ZSk7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQl7Ci0JCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChwYXRoLnNlZ21lbnQoMCkuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkKLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJCQkJcGF0aDJTdHJpbmcoCi0JCQkJCQkJcHJvamVjdAotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKQotCQkJCQkJCQkuYXBwZW5kKAotCQkJCQkJCQlwYXRoKSl9OwotCQkJCX0KLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6Ci0JCQkJcmV0dXJuIGNsYXNzcGF0aEVudHJ5MlN0cmluZygKLQkJCQkJSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShlbnRyeSksCi0JCQkJCXByb2plY3QpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IHBhdGgyU3RyaW5nKGVudHJ5LmdldFBhdGgoKSl9OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDJTdHJpbmcoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gcGF0aC50b09TU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdXRpbC9GaWxlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdXRpbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGQ5YjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3V0aWwvRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbAotewotICBwdWJsaWMgRmlsZVV0aWwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc3JjLCBTdHJpbmcgZGVzdCkKLSAgewotICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0gICAgICBieXRlIGJ1ZmZbXSA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7Ci0gICAgICBpbnQgYyA9IDA7Ci0gICAgICBieXRlW10gYXJyYXkgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgIHdoaWxlICgoYyA9IGlzLnJlYWQoYXJyYXkpKSA+PSAwKQotICAgICAgewotICAgICAgICBmb3Mud3JpdGUoYXJyYXksIDAsIGMpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVGaWxlQW5kUGFyZW50RGlyZWN0b3JpZXMoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0gICAgRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICBpZiAoIXBhcmVudC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgfQotICAgIGZpbGUuY3JlYXRlTmV3RmlsZSgpOwotICAgIHJldHVybiBmaWxlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yaWVzKEZpbGUgZGlyKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlW10gY2hpbGRyZW4gPSBkaXIubGlzdEZpbGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoY2hpbGRyZW5baV0ubGlzdCgpICE9IG51bGwgJiYgY2hpbGRyZW5baV0ubGlzdCgpLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIGRlbGV0ZURpcmVjdG9yaWVzKGNoaWxkcmVuW2ldKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGVsZXRlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGRpci5kZWxldGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgZm9sZGVyIGFuZCBhbGwgcGFyZW50IGZvbGRlcnMgaWYgbm90IGV4aXN0aW5nIFByb2plY3QgbXVzdCBleGlzdAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUZvbGRlcihJRm9sZGVyIGZvbGRlciwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBsb2NhbCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIGlmICghZm9sZGVyLmV4aXN0cygpKQotICAgIHsKLSAgICAgIElDb250YWluZXIgcGFyZW50ID0gZm9sZGVyLmdldFBhcmVudCgpOwotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElGb2xkZXIpCi0gICAgICB7Ci0gICAgICAgIGNyZWF0ZUZvbGRlcigoSUZvbGRlcilwYXJlbnQsIGZvcmNlLCBsb2NhbCk7Ci0gICAgICB9Ci0gICAgICBmb2xkZXIuY3JlYXRlKGZvcmNlLCBsb2NhbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVRhcmdldEZpbGUoU3RyaW5nIHNvdXJjZUZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0RmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGNyZWF0ZVRhcmdldEZpbGUoc291cmNlRmlsZU5hbWUsIHRhcmdldEZpbGVOYW1lLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlVGFyZ2V0RmlsZShTdHJpbmcgc291cmNlRmlsZU5hbWUsIFN0cmluZyB0YXJnZXRGaWxlTmFtZSwgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIEZpbGUgaWRlYWxSZXN1bHRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RmlsZU5hbWUpOwotICAgIGlmIChvdmVyd3JpdGUgfHwgIWlkZWFsUmVzdWx0RmlsZS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBGaWxlVXRpbC5jcmVhdGVGaWxlQW5kUGFyZW50RGlyZWN0b3JpZXModGFyZ2V0RmlsZU5hbWUpOwotICAgICAgRmlsZVV0aWwuY29weUZpbGUoc291cmNlRmlsZU5hbWUsIHRhcmdldEZpbGVOYW1lKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3V0aWwvUGxhdGZvcm1VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdXRpbC9QbGF0Zm9ybVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTFlMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdXRpbC9QbGF0Zm9ybVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsOwotCi0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1wdWJsaWMgY2xhc3MgUGxhdGZvcm1VdGlscyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9ST09UID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOX0ZJTEVfUFJPVE9DT0wgPSAiZmlsZTovIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMTlhfRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8vIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STSA9ICJwbGF0Zm9ybSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0UgPSAiL3Jlc291cmNlIjsKLQotCXByaXZhdGUgUGxhdGZvcm1VdGlscygpIHsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBwbGF0Zm9ybSBVUkwgZ2l2ZW4gYW4gSVBhdGgKLQkqIEBwYXJhbSBJUGF0aCBwYXRoCi0JKiBAcmV0dXJuIFN0cmluZyBwbGF0Zm9ybVVSTAotCSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1VUkwoSVBhdGggcGF0aCkgewotCQlTdHJpbmcgcGxhdGZvcm1VUkw7Ci0JCXBsYXRmb3JtVVJMID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocGF0aC50b1N0cmluZygpKS50b1N0cmluZygpOwotCQkvLyBvbGQgbWV0aG9kOiBmaWxlIHN5c3RlbSByZXByZXNlbnRhdGlvbgotCQkvLyAJcGxhdGZvcm1VUkwgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlyZXR1cm4gcGxhdGZvcm1VUkw7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBVUkwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFBsYXRmb3JtIFVSTCBnaXZlbiBhbiBJUGF0aAotCSogVGhlIFBsYXRmb3JtUmVzb3VyY2VNYW5hZ2VyIHVuZGVyZHN0YW5kcyB0aGlzIGZvcm1hdCBhbmQgdGhlcmVmb3JlCi0JKiB0aGlzIGlzIHN1aXRlZCBmb3IgY29tbWFuZCBVUkwncwotCSogQHBhcmFtIElQYXRoIHBhdGgKLQkqIEByZXR1cm4gVVJMIFBsYXRmb3JtIFVSTAotCSovCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0Q29tbWFuZFBsYXRmb3JtVVJMKElQYXRoIHBhdGgpIHsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKFBMQVRGT1JNLCBudWxsLCBSRVNPVVJDRSArIHBhdGgudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgcGF0aCBnaXZlbiBwbGF0Zm9ybSBVUkwgc3RyaW5nCi0JKiBAcGFyYW0gU3RyaW5nIHBsYXRmb3JtIFVSTCBzdHJpbmcKLQkqIEByZXR1cm4gU3RyaW5nIHBhdGggc3RyaW5nCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoRnJvbVBsYXRmb3JtKFN0cmluZyBwbGF0Zm9ybVN0cikgewotCQlTdHJpbmcgcGF0aFN0ciA9IHBsYXRmb3JtU3RyOwotCi0JCVN0cmluZyByb290TG9jYXRpb247Ci0JCXJvb3RMb2NhdGlvbiA9IFBMQVRGT1JNX1JPT1Q7Ci0JCS8vIG9sZCBtZXRob2Q6IGZpbGUgc3lzdGVtIHJlcHJlc2VudGF0aW9uCi0JCS8vCXJvb3RMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlpZiAocGxhdGZvcm1TdHIuc3RhcnRzV2l0aChyb290TG9jYXRpb24pKQotCQkJcGF0aFN0ciA9IHBsYXRmb3JtU3RyLnN1YnN0cmluZyhyb290TG9jYXRpb24ubGVuZ3RoKCkpOwotCQlyZXR1cm4gcGF0aFN0cjsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBwbGF0Zm9ybSBVUkwgZ2l2ZW4gdGhlIHBhdGggc3RyaW5nCi0JKiBAcGFyYW0gU3RyaW5nIHBhdGggc3RyaW5nCi0JKiBAcmV0dXJuIFN0cmluZyBwbGF0Zm9ybSBVUkwgc3RyaW5nCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybUZyb21QYXRoKFN0cmluZyBwYXRoU3RyKSB7Ci0JCVN0cmluZyBwbGF0Zm9ybVN0ciA9IHBhdGhTdHI7Ci0KLQkJU3RyaW5nIHJvb3RMb2NhdGlvbjsKLQkJcm9vdExvY2F0aW9uID0gUExBVEZPUk1fUk9PVDsKLQkJLy8gb2xkIG1ldGhvZDogZmlsZSBzeXN0ZW0gcmVwcmVzZW50YXRpb24KLQkJLy8Jcm9vdExvY2F0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCXBsYXRmb3JtU3RyID0gcm9vdExvY2F0aW9uICsgcGF0aFN0cjsKLQkJcmV0dXJuIHBsYXRmb3JtU3RyOwotCX0KLQotCS8qKgotCSogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBmaWxlIGdpdmVuIHBsYXRmb3JtIFVSTCBzdHJpbmcKLQkqIEBwYXJhbSBTdHJpbmcgcGxhdGZvcm0gVVJMIHN0cmluZwotCSogQHJldHVybiBTdHJpbmcgZmlsZSBzdHJpbmcKLQkqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVGcm9tUGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtU3RyKSB7Ci0JCVN0cmluZyBmaWxlU3RyID0gcGxhdGZvcm1TdHI7Ci0JCVN0cmluZyBwYXRoU3RyID0gZ2V0UGF0aEZyb21QbGF0Zm9ybShwbGF0Zm9ybVN0cik7Ci0KLQkJZmlsZVN0ciA9Ci0JCQlSZXNvdXJjZXNQbHVnaW4KLQkJCQkuZ2V0V29ya3NwYWNlKCkKLQkJCQkuZ2V0Um9vdCgpCi0JCQkJLmdldEZpbGUobmV3IFBhdGgocGF0aFN0cikpCi0JCQkJLmdldExvY2F0aW9uKCkKLQkJCQkudG9TdHJpbmcoKTsKLQotCQkvLyBvbGQgbWV0aG9kOiBmaWxlIHN5c3RlbSByZXByZXNlbnRhdGlvbgotCQkvLwlEbyBub3RoaW5nCi0KLQkJcmV0dXJuIGZpbGVTdHI7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBmaWxlIHByb3RvY29sIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBmaWxlIGdpdmVuIHBsYXRmb3JtIFVSTCBzdHJpbmcKLQkqIEBwYXJhbSBTdHJpbmcgcGxhdGZvcm0gVVJMIHN0cmluZwotCSogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcHJvdG9jb2wgdXJpCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlVVJMRnJvbVBsYXRmb3JtKFN0cmluZyBwbGF0Zm9ybVN0cikgewotCQlTdHJpbmcgZmlsZVN0ciA9IHBsYXRmb3JtU3RyOwotCQlTdHJpbmcgcGF0aFN0ciA9IGdldFBhdGhGcm9tUGxhdGZvcm0ocGxhdGZvcm1TdHIpOwotCQl0cnkgewotCQkJZmlsZVN0ciA9Ci0JCQkJUmVzb3VyY2VzUGx1Z2luCi0JCQkJCS5nZXRXb3Jrc3BhY2UoKQotCQkJCQkuZ2V0Um9vdCgpCi0JCQkJCS5nZXRGaWxlKG5ldyBQYXRoKHBhdGhTdHIpKQotCQkJCQkuZ2V0TG9jYXRpb24oKQotCQkJCQkudG9GaWxlKCkKLQkJCQkJLnRvVVJMKCkKLQkJCQkJLnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkgewotCQkJZmlsZVN0ciA9IGdldEZpbGVVUkxGcm9tUGF0aChuZXcgUGF0aChwYXRoU3RyKSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGVTdHI7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBmaWxlIHByb3RvY29sIHJlcHJlc2VudGF0aW9uIG9mIGEgbG9jYWwgZmlsZQotCSogQHBhcmFtIElQYXRoIHRoZSBQYXRoIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZpbGUKLQkqIEByZXR1cm4gU3RyaW5nIHRoZSBmaWxlIHByb3RvY29sIHVyaQotCSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZVVSTEZyb21QYXRoKElQYXRoIHBhdGgpIHsKLQotCQlTdHJpbmcgZmlsZSA9IG51bGw7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWlmICghcGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCQlmaWxlID0KLQkJCQkJUmVzb3VyY2VzUGx1Z2luCi0JCQkJCQkuZ2V0V29ya3NwYWNlKCkKLQkJCQkJCS5nZXRSb290KCkKLQkJCQkJCS5nZXRGaWxlKHBhdGgpCi0JCQkJCQkuZ2V0TG9jYXRpb24oKQotCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKGZpbGUuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCQlmaWxlID0gTE5YX0ZJTEVfUFJPVE9DT0wgKyBmaWxlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpbGUgPSBXSU5fRklMRV9QUk9UT0NPTCArIGZpbGU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmaWxlID0gcGF0aC50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmNoYXJBdCgwKSA9PSBJUGF0aC5TRVBBUkFUT1IpIHsKLQkJCQlmaWxlID0gTE5YX0ZJTEVfUFJPVE9DT0wgKyBmaWxlOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxlID0gV0lOX0ZJTEVfUFJPVE9DT0wgKyBmaWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlID09IG51bGwgPyBudWxsIDogZmlsZTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3V0aWwvV1NETFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91dGlsL1dTRExVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzc1MTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3V0aWwvV1NETFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLndzZGwudG9KYXZhLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqLldTRExGYWN0b3J5SW1wbDsKLQotcHVibGljIGNsYXNzIFdTRExVdGlscyB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNMQVNIID0gIi8iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfU1VGRklYID0gIjovLyI7Ci0KLSAgLyoqCi0gICAqIFRva2VucyBpbiBhIG5hbWVzcGFjZSB0aGF0IGFyZSB0cmVhdGVkIGFzIHBhY2thZ2UgbmFtZSBwYXJ0IHNlcGFyYXRvcnMuCi0gICAqIFVzZWQgYnkgbm9ybWFsaXplUGFja2FnZU5hbWUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcGtnU2VwYXJhdG9ycyA9IHsgJzonLCAnXFwnLCAnLycgfTsKLQotICAvKioKLSAgKiBUaGVzZSBhcmUgamF2YSBrZXl3b3JkcyBhcyBzcGVjaWZpZWQgYXQgdGhlIGZvbGxvd2luZyBVUkwgKHNvcnRlZCBhbHBoYWJldGljYWxseSkuCi0gICogaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2xleGljYWwuZG9jLmh0bWwjMjI5MzA4Ci0gICogTm90ZSB0aGF0IGZhbHNlLCB0cnVlLCBhbmQgbnVsbCBhcmUgbm90IHN0cmljdGx5IGtleXdvcmRzOyB0aGV5IGFyZSBsaXRlcmFsIHZhbHVlcywKLSAgKiBidXQgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGFycmF5LCB0aGV5IGNhbiBiZSB0cmVhdGVkIGFzIGxpdGVyYWxzLgotICAqLwotICBzdGF0aWMgZmluYWwgU3RyaW5nIGtleXdvcmRzW10gPQotICB7Ci0gICAgICAiYWJzdHJhY3QiLCAgImJvb2xlYW4iLCAgICAgICJicmVhayIsICAgICAgImJ5dGUiLCAgICAgICJjYXNlIiwKLSAgICAgICJjYXRjaCIsICAgICAiY2hhciIsICAgICAgICAgImNsYXNzIiwgICAgICAiY29uc3QiLCAgICAgImNvbnRpbnVlIiwKLSAgICAgICJkZWZhdWx0IiwgICAiZG8iLCAgICAgICAgICAgImRvdWJsZSIsICAgICAiZWxzZSIsICAgICAgImV4dGVuZHMiLAotICAgICAgImZhbHNlIiwgICAgICJmaW5hbCIsICAgICAgICAiZmluYWxseSIsICAgICJmbG9hdCIsICAgICAiZm9yIiwKLSAgICAgICJnb3RvIiwgICAgICAiaWYiLCAgICAgICAgICAgImltcGxlbWVudHMiLCAiaW1wb3J0IiwgICAgImluc3RhbmNlb2YiLAotICAgICAgImludCIsICAgICAgICJpbnRlcmZhY2UiLCAgICAibG9uZyIsICAgICAgICJuYXRpdmUiLCAgICAibmV3IiwKLSAgICAgICJudWxsIiwgICAgICAicGFja2FnZSIsICAgICAgInByaXZhdGUiLCAgICAicHJvdGVjdGVkIiwgInB1YmxpYyIsCi0gICAgICAicmV0dXJuIiwgICAgInNob3J0IiwgICAgICAgICJzdGF0aWMiLCAgICAgInN0cmljdGZwIiwgICJzdXBlciIsCi0gICAgICAic3dpdGNoIiwgICAgInN5bmNocm9uaXplZCIsICJ0aGlzIiwgICAgICAgInRocm93IiwgICAgICJ0aHJvd3MiLAotICAgICAgInRyYW5zaWVudCIsICJ0cnVlIiwgICAgICAgICAidHJ5IiwgICAgICAgICJ2b2lkIiwgICAgICAidm9sYXRpbGUiLAotICAgICAgIndoaWxlIgotICB9OwotCi0gIC8qKiBDb2xsYXRvciBmb3IgY29tcGFyaW5nIHRoZSBzdHJpbmdzICovCi0gIHN0YXRpYyBmaW5hbCBDb2xsYXRvciBlbmdsaXNoQ29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuRU5HTElTSCk7Ci0KLSAgLyoqIFVzZSB0aGlzIGNoYXJhY3RlciBhcyBzdWZmaXggKi8KLSAgc3RhdGljIGZpbmFsIGNoYXIga2V5d29yZFByZWZpeCA9ICdfJzsKLQotICBwcml2YXRlIFdTRExVdGlscygpIHsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IHNlcnZpY2UgZWxlbWVudCBpbiB0aGUgV1NETCBkZWZpbml0aW9uLgotICAqIEByZXR1cm4gU3RyaW5nIHNlcnZpY2UgZWxlbWVudCBuYW1lCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VFbGVtZW50TmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgCVNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gIAlyZXR1cm4gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcG9ydCB0eXBlIGVsZW1lbnQgcG9pbnRzIHRvIGJ5IHRoZSBmaXJzdCBzZXJ2aWNlIGFuZCBwb3J0IGVsZW1lbnQgaW4gdGhlIFdTREwgZGVmaW5pdGlvbi4KLSAgKiBAcmV0dXJuIFN0cmluZyBwb3J0IHR5cGUgZWxlbWVudCBuYW1lCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBvcnRUeXBlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgCVNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgCi0gICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8cG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCk7aSsrKSB7Ci0gICAgICAgIGlmIChwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLmdldChpKSBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKSB7Ci0gICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotICAgICAgICAgICByZXR1cm4gYmluZGluZy5nZXRQb3J0VHlwZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICAKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBvcnQgZWxlbWVudCBpbiB0aGUgV1NETCBkZWZpbml0aW9uLgotICAqIEByZXR1cm4gU3RyaW5nIHBvcnQgbmFtZQotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0TmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgCVNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgCi0gICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8cG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCk7aSsrKSB7Ci0gICAgICAgIGlmIChwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLmdldChpKSBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKSAKLSAgICAgICAgICByZXR1cm4gcG9ydC5nZXROYW1lKCk7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgIHJldHVybiAiIjsKLSAgfQotCi0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlTmFtZXNwYWNlIChTdHJpbmcgY2xzTmFtZSkgewotCSAgcmV0dXJuIG1ha2VOYW1lc3BhY2UoY2xzTmFtZSwgImh0dHAiKTsKLSAgfQotCi0gIC8qKgotICAgKiBNYWtlIG5hbWVzcGFjZSBmcm9tIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICogYW5kIHRoZSBnaXZlbiBwcm90b2NvbAotICAgKgotICAgKiBAcGFyYW0gY2xzTmFtZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgKiBAcGFyYW0gcHJvdG9jb2wgcHJvdG9jb2wgU3RyaW5nCi0gICAqIEByZXR1cm4gbmFtZXNwYWNlIG5hbWVzcGFjZSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VOYW1lc3BhY2UgKFN0cmluZyBjbHNOYW1lLCBTdHJpbmcgcHJvdG9jb2wpIHsKLQkgIGlmIChjbHNOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpCi0JCSAgcmV0dXJuIHByb3RvY29sICsgIjovLyIgKyAiRGVmYXVsdE5hbWVzcGFjZSI7Ci0JICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjbHNOYW1lLnN1YnN0cmluZygwLCBjbHNOYW1lLmxhc3RJbmRleE9mKCcuJykpOwotCSAgcmV0dXJuIG1ha2VOYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUocGFja2FnZU5hbWUsIHByb3RvY29sKTsgICAgICAgCi0gIH0KLQotICAgIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZU5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBwcm90b2NvbCkgewotCSAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUuZXF1YWxzKCIiKSkKLQkJICByZXR1cm4gcHJvdG9jb2wgKyAiOi8vIiArICJEZWZhdWx0TmFtZXNwYWNlIjsKLQkgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIHBhY2thZ2VOYW1lLCAiLiIgKTsKLQkgIFN0cmluZ1tdIHdvcmRzID0gbmV3IFN0cmluZ1sgc3QuY291bnRUb2tlbnMoKSBdOwotCSAgZm9yKGludCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKQotCQkgIHdvcmRzW2ldID0gc3QubmV4dFRva2VuKCk7Ci0KLQkgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoODApOwotCSAgZm9yKGludCBpID0gd29yZHMubGVuZ3RoLTE7IGkgPj0gMDsgLS1pKSB7Ci0JCSAgU3RyaW5nIHdvcmQgPSB3b3Jkc1tpXTsKLQkJICAvLyBzZXBlcmF0ZSB3aXRoIGRvdAotCQkgIGlmKCBpICE9IHdvcmRzLmxlbmd0aC0xICkKLQkJCSAgc2IuYXBwZW5kKCcuJyk7Ci0JCSAgc2IuYXBwZW5kKCB3b3JkICk7Ci0JICB9Ci0JICByZXR1cm4gcHJvdG9jb2wgKyAiOi8vIiArIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm4gYSBEZWZpbml0aW9uIGZvciB0aGUgd3NkbCB1cmwgZ2l2ZW4gCi0gICoKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBEZWZpbml0aW9uIGdldFdTRExEZWZpbml0aW9uKFN0cmluZyB3c2RsVVJMKQotICB7Ci0gICAgaWYod3NkbFVSTCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5OwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgIHdzZGxGYWN0b3J5ID0gbmV3IFdTRExGYWN0b3J5SW1wbCgpOwotICAgICAgV1NETFJlYWRlciB3c2RsUmVhZGVyID0gd3NkbEZhY3RvcnkubmV3V1NETFJlYWRlcigpOwotICAgICAgZGVmaW5pdGlvbiA9IHdzZGxSZWFkZXIucmVhZFdTREwod3NkbFVSTCk7Ci0gICAgfSAKLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gY2FuIGJlIFdTRExFeGNlcHRpb24gb3IgSU9FeGNlcHRpb24KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICByZXR1cm4gbmFtZXNwYWNlVVJJMlBhY2thZ2VOYW1lKG5hbWVzcGFjZSk7Ci0gICAgIH0KLSAgICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVGb3JCaW5kaW5nSW1wbChQb3J0IHBvcnQsIE1hcCBuczJwa2dNYXApCi0gIHsKLSAgICBpZiAocG9ydCAhPSBudWxsICYmIG5zMnBrZ01hcCAhPSBudWxsKQotICAgIHsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotICAgICAgUU5hbWUgYm5kUU5hbWUgPSBiaW5kaW5nLmdldFFOYW1lKCk7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gYm5kUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBPYmplY3QgcGtnID0gbnMycGtnTWFwLmdldChuYW1lc3BhY2UpOwotICAgICAgaWYgKHBrZyAhPSBudWxsKQotICAgICAgICByZXR1cm4gKFN0cmluZylwa2c7Ci0gICAgfQotICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZUZvckJpbmRpbmdJbXBsKHBvcnQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVGb3JCaW5kaW5nSW1wbChEZWZpbml0aW9uIGRlZmluaXRpb24sIE1hcCBuczJwa2dNYXApCi0gIHsKLSAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsICYmIG5zMnBrZ01hcCAhPSBudWxsKQotICAgIHsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgc2VydmljZS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgcmV0dXJuIGdldFBhY2thZ2VOYW1lRm9yQmluZGluZ0ltcGwocG9ydCwgbnMycGtnTWFwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldFBhY2thZ2VOYW1lRm9yQmluZGluZ0ltcGwoZGVmaW5pdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZUZvckJpbmRpbmdJbXBsKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIFBvcnQgcG9ydCA9IG51bGw7Ci0gICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlkZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICBwb3J0ID0gKFBvcnQpc2VydmljZS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgIH0KLSAgICByZXR1cm4gZ2V0UGFja2FnZU5hbWVGb3JCaW5kaW5nSW1wbChwb3J0KTsKLSAgfQotCi0vLyBUaGlzIGlzIHlldCBhbm90aGVyIG5hbWluZyBhbGdvcml0aG0gYmFzZWQgb24gd2Vic2VydmljZXMuamFyCi0vLyBUaGV5IGFsd2F5cyB1c2UgdGhlIGJpbmRpbmcgbmFtZXNwYWNlIGFzIHRoZSBwYWNrYWdlIG5hbWUKLS8vIG9mIHRoZSBCaW5kaW5nSW1wbCBjbGFzcy4KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lRm9yQmluZGluZ0ltcGwoUG9ydCBwb3J0KQotewotICAgaWYgKHBvcnQgIT0gbnVsbCkKLSAgIHsKLQkgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotLy8JICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0UG9ydFR5cGUoKTsKLQkgIFFOYW1lIGJuZFFOYW1lID0gYmluZGluZy5nZXRRTmFtZSgpOwotCSAgU3RyaW5nIG5hbWVzcGFjZSA9IGJuZFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCSAgcmV0dXJuIG5hbWVzcGFjZVVSSTJQYWNrYWdlTmFtZShuYW1lc3BhY2UpOwotICAgfQotICAgcmV0dXJuICIiOwotfQotCi0vKioKLSogR2V0IHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBQb3J0IFR5cGUKLSogCi0qLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UG9ydFR5cGVOYW1lc3BhY2UoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotewotICBTdHJpbmcgbmFtZXNwYWNlID0gIiI7Ci0gIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gIHsKLQlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IAotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuc2l6ZSgpO2krKykgewotICAgICAgICBpZiAocG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcyl7IAotCSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gcG9ydC5nZXRCaW5kaW5nKCkuZ2V0UG9ydFR5cGUoKTsKLQkgICAgICBRTmFtZSBibmRRTmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCk7Ci0JICAgICAgbmFtZXNwYWNlID0gYm5kUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAJfSAgCi0JICB9Ci0gIAl9Ci0gIH0gIAotICByZXR1cm4gbmFtZXNwYWNlOwotfQotCi0vLyBUaGlzIGlzIHlldCBhbm90aGVyIG5hbWluZyBhbGdvcml0aG0gYmFzZWQgb24gd2Vic2VydmljZXMuamFyCi0vLyBUaGV5IGFsd2F5cyB1c2UgdGhlIHBvcnR0eXBlIG5hbWVzcGFjZSBhcyB0aGUgcGFja2FnZSBuYW1lCi0vLyBvZiB0aGUgSmF2YSBjbGFzcyAoaW4gZWpiKS4KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lRm9yUG9ydFR5cGUoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotewotICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgIHsKLQkgIFN0cmluZyBuYW1lc3BhY2UgPSBnZXRQb3J0VHlwZU5hbWVzcGFjZShkZWZpbml0aW9uKTsKLQkgIHJldHVybiBuYW1lc3BhY2VVUkkyUGFja2FnZU5hbWUobmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotfQotCi0gIC8qKgotICAqIGNoZWNrcyBpZiB0aGUgaW5wdXQgc3RyaW5nIGlzIGEgdmFsaWQgamF2YSBrZXl3b3JkLgotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlL2ZhbHNlCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFLZXl3b3JkKFN0cmluZyBrZXl3b3JkKSB7Ci0gICAgcmV0dXJuIChBcnJheXMuYmluYXJ5U2VhcmNoKGtleXdvcmRzLCBrZXl3b3JkLCBlbmdsaXNoQ29sbGF0b3IpID49IDApOwotICB9Ci0KLSAgLyoqCi0gICogVHVybiBhIGphdmEga2V5d29yZCBzdHJpbmcgaW50byBhIG5vbi1KYXZhIGtleXdvcmQgc3RyaW5nLiAgKFJpZ2h0IG5vdwotICAqIHRoaXMgc2ltcGx5IG1lYW5zIGFwcGVuZGluZyBhbiB1bmRlcnNjb3JlLikKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZU5vbkphdmFLZXl3b3JkKFN0cmluZyBrZXl3b3JkKXsKLSAgICByZXR1cm4gIGtleXdvcmRQcmVmaXggKyBrZXl3b3JkOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRQb3J0VHlwZU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGJlYW5OYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGJlYW5OYW1lLmFwcGVuZChnZXRQYWNrYWdlTmFtZUZvclBvcnRUeXBlKGRlZmluaXRpb24pKTsgCi0gICAgYmVhbk5hbWUuYXBwZW5kKERPVCk7Ci0gICAgYmVhbk5hbWUuYXBwZW5kKGdldFBvcnRUeXBlTmFtZShkZWZpbml0aW9uKSk7Ci0gICAgcmV0dXJuIGJlYW5OYW1lLnRvU3RyaW5nKCk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBnZXROYW1lCi0gICAqIEBwYXJhbSB1cmkgU3RyaW5nCi0gICAqIEByZXR1cm4gZ2V0IHRoZSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIGxhc3QgXCBhbmQgLwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShTdHJpbmcgdXJpKSB7Ci0KLQkvLyBHZXQgZXZlcnl0aGluZyBhZnRlciBsYXN0IHNsYXNoIG9yIGJhY2tzbGFzaAotCWludCBic2xhc2ggPSB1cmkubGFzdEluZGV4T2YoIlxcIik7Ci0JaW50IHNsYXNoID0gdXJpLmxhc3RJbmRleE9mKCIvIik7Ci0JaW50IGkgPSAgYnNsYXNoID4gc2xhc2ggPyBic2xhc2ggOiBzbGFzaDsKLQlTdHJpbmcgZmlsZU5hbWUgPSB1cmkuc3Vic3RyaW5nKGkrMSkucmVwbGFjZSgnPycsICcuJyk7Ci0KLQlyZXR1cm4gZmlsZU5hbWU7Ci0gIH0KLQotCi0vKioKLSAqIGdldFdTRExOYW1lCi0gKiBAcGFyYW0gdXJpIFN0cmluZwotICogQHJldHVybiBnZXQgdGhlIGZpbGUgbmFtZSBhZnRlciB0aGUgbGFzdCBcIGFuZCAvLCB0cmltbWVkLCBkZWZhdWx0ZWQgdG8KLSAqICAgICAgICAgImRlZmF1bHQud3NkbCIgaWYgdGhlcmUgaXMgbm8gbmFtZSwgYW5kIGVuZGluZyB3aXRoICIud3NkbCIuCi0gKi8KLSBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMTmFtZShTdHJpbmcgdXJpKSB7Ci0KLQkvLyBHZXQgZXZlcnl0aGluZyBhZnRlciBsYXN0IHNsYXNoIG9yIGJhY2tzbGFzaCBmcm9tIGlucHV0IFVSSQotCS8vIHdpdGggbm8gd2hpdGVzcGFjZS4KLQlTdHJpbmcgV1NETE5hbWUgPSBnZXROYW1lKHVyaSkudHJpbSgpOwotCi0JLy8gaWYgZW1wdHksIHJldHVybiB0aGUgZGVmYXVsdCAiZGVmYXVsdC53c2RsIgotCWlmICggV1NETE5hbWUuZXF1YWxzKCAiIiApICkgewotCQlXU0RMTmFtZSA9ICJkZWZhdWx0LndzZGwiOwotCX0KLQotCS8vIG1ha2Ugc3VyZSBuYW1lIGVuZHMgd2l0aCAiLndzZGwiLCBsb3dlciBjYXNlLgotCWVsc2UgewotCQlpZiAoICEgV1NETE5hbWUuZW5kc1dpdGgoICIud3NkbCIgKSApIHsKLQkJCWlmICggV1NETE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCggIi53c2RsIiApICkgewotCQkJCWludCBsYXN0RG90ID0gV1NETE5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQkJCQlXU0RMTmFtZSA9IFdTRExOYW1lLnN1YnN0cmluZyggMCwgbGFzdERvdCApICsgIi53c2RsIjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVdTRExOYW1lID0gV1NETE5hbWUgKyAiLndzZGwiOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIFdTRExOYW1lOwotIH0KLQotIC8qKgotICAqIGdldFBvcnRUeXBlTmFtZUZyb21CZWFuTmFtZQotICAqIEBwYXJhbSBiZWFubmFtZSBTdHJpbmcKLSAgKiBAcmV0dXJuIGdldCB0aGUgcG9ydCB0eXBlIG5hbWUgYmFzZWQgb24gdGhlIGJlYW4gbmFtZQotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0VHlwZU5hbWVGcm9tQmVhbk5hbWUoU3RyaW5nIGJlYW5OYW1lKSB7Ci0gICAgcmV0dXJuIGJlYW5OYW1lLnN1YnN0cmluZyhiZWFuTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7CQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU2VydmljZSBzZXJ2aWNlLCBNYXAgbnMycGtnTWFwKQotICB7Ci0gICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gc2VydmljZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5zMnBrZ01hcCAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3QgcGtnID0gbnMycGtnTWFwLmdldChuYW1lc3BhY2UpOwotICAgICAgICBpZiAocGtnICE9IG51bGwpCi0gICAgICAgICAgcmV0dXJuIChTdHJpbmcpcGtnOwotICAgICAgfQotICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTJQYWNrYWdlTmFtZShuYW1lc3BhY2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShQb3J0IHBvcnQsIE1hcCBuczJwa2dNYXApCi0gIHsKLSAgICBpZiAocG9ydCAhPSBudWxsKQotICAgICAgcmV0dXJuIGdldFBhY2thZ2VOYW1lKHBvcnQuZ2V0QmluZGluZygpLCBuczJwa2dNYXApOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKEJpbmRpbmcgYmluZGluZywgTWFwIG5zMnBrZ01hcCkKLSAgewotICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuczJwa2dNYXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IHBrZyA9IG5zMnBrZ01hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKHBrZyAhPSBudWxsKQotICAgICAgICAgIHJldHVybiAoU3RyaW5nKXBrZzsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lc3BhY2VVUkkyUGFja2FnZU5hbWUobmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoUG9ydFR5cGUgcG9ydFR5cGUsIE1hcCBuczJwa2dNYXApCi0gIHsKLSAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuczJwa2dNYXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IHBrZyA9IG5zMnBrZ01hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKHBrZyAhPSBudWxsKQotICAgICAgICAgIHJldHVybiAoU3RyaW5nKXBrZzsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lc3BhY2VVUkkyUGFja2FnZU5hbWUobmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICIiOwotICB9Ci0KLQotICAvKioKLSAgICogbmFtZXNwYWNlVVJJMlBhY2thZ2VOYW1lCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLSAgICogQHJldHVybiBwYWNrYWdlIG5hbWUgYmFzZWQgb24gbmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lc3BhY2VVUkkyUGFja2FnZU5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAJLyoqCi0gIAkgKiBUT0RPOiAgVGhlIG1ha2VQYWNrYWdlTmFtZSBtZXRob2QgZnJvbSAKLSAgCSAqIG9yZy5hcGFjaGUuYXhpcy53c2RsLnRvSmF2YS5VdGlscyBpbiBheGlzLTFfMSBpcyBjYWxsZWQgdG8gbWFwIG5hbWVzcGFjZSB0byBwYWNrYWdlIG5hbWUuICAKLSAgCSAqIFRoaXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGFuIGV4dGVuc2lvbiBwb2ludCB0byBwbHVnIGluIHJ1bnRpbWUgZW1pdHRlciBzcGVjaWZpYyBuYW1lc3BhY2UgdG8gCi0gIAkgKiBwYWNrYWdlIG1hcHBpbmcgYWxnb3JpdGhtIAotICAJICovCi0gIAlyZXR1cm4gVXRpbHMubWFrZVBhY2thZ2VOYW1lKG5hbWVzcGFjZVVSSSk7Ci0gIAkKLS8vICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoODApOwotLy8gICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsICYmIG5hbWVzcGFjZVVSSS5sZW5ndGgoKSA+IDApCi0vLyAgICB7Ci0vLyAgICAgIFN0cmluZyBob3N0bmFtZSA9IG51bGw7Ci0vLyAgICAgIHRyeQotLy8gICAgICB7Ci0vLyAgICAgICAgaG9zdG5hbWUgPSBuZXcgVVJMKG5hbWVzcGFjZVVSSSkuZ2V0SG9zdCgpOwotLy8gICAgICB9Ci0vLyAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLS8vICAgICAgewotLy8gICAgICAgIGludCBpbmRleCA9IG5hbWVzcGFjZVVSSS5pbmRleE9mKCI6Iik7Ci0vLyAgICAgICAgaWYgKGluZGV4ID4gLTEpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgaG9zdG5hbWUgPSBuYW1lc3BhY2VVUkkuc3Vic3RyaW5nKGluZGV4KzEpOwotLy8gICAgICAgICAgaW5kZXggPSBob3N0bmFtZS5pbmRleE9mKCIvIik7Ci0vLyAgICAgICAgICBpZiAoaW5kZXggPiAtMSkKLS8vICAgICAgICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlCi0vLyAgICAgICAgICBob3N0bmFtZSA9IG5hbWVzcGFjZVVSSTsKLS8vICAgICAgfQotLy8gICAgICAKLS8vCSAgLy8gaWYgd2UgZGlkbid0IGZpbGUgYSBob3N0bmFtZSwgYmFpbAotLy8JICBpZiAoaG9zdG5hbWUgPT0gbnVsbCkgewotLy8JCSAgcmV0dXJuIG51bGw7Ci0vLwkgIH0KLS8vCi0vLyAgICAgIC8vY29udmVydCBpbGxlZ2FsIGphdmEgaWRlbnRpZmllcgotLy8gICAgICBob3N0bmFtZSA9IGhvc3RuYW1lLnJlcGxhY2UoJy0nLCAnXycpOwotLy8gICAgICAvLyB0b2tlbml6ZSB0aGUgaG9zdG5hbWUgYW5kIHJldmVyc2UgaXQKLS8vICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihob3N0bmFtZSwgIi4iKTsKLS8vICAgICAgU3RyaW5nW10gd29yZHMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotLy8gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKQotLy8gICAgICAgIHdvcmRzW2ldID0gc3QubmV4dFRva2VuKCk7Ci0vLyAgICAgIGZvcihpbnQgaSA9IHdvcmRzLmxlbmd0aC0xOyBpID49IDA7IC0taSkKLS8vICAgICAgewotLy8gICAgICAgIFN0cmluZyB3b3JkID0gd29yZHNbaV07Ci0vLyAgICAgICAgaWYgKGlzSmF2YUtleXdvcmQod29yZCkpCi0vLyAgICAgICAgICB3b3JkID0gbWFrZU5vbkphdmFLZXl3b3JkKHdvcmQpOwotLy8gICAgICAgIC8vIHNlcGVyYXRlIHdpdGggZG90Ci0vLyAgICAgICAgaWYgKGkgIT0gd29yZHMubGVuZ3RoLTEpCi0vLyAgICAgICAgICBzYi5hcHBlbmQoJy4nKTsKLS8vICAgICAgICAvLyBjb252ZXJ0IGRpZ2l0cyB0byB1bmRlcnNjb3JlcwotLy8gICAgICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdCh3b3JkLmNoYXJBdCgwKSkpCi0vLyAgICAgICAgICBzYi5hcHBlbmQoJ18nKTsKLS8vICAgICAgICAgIHNiLmFwcGVuZCh3b3JkKTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgcmV0dXJuIG5vcm1hbGl6ZVBhY2thZ2VOYW1lKHNiLnRvU3RyaW5nKCksIERPVC5jaGFyQXQoMCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIG5vcm1hbGl6ZVBhY2thZ2VOYW1lCi0gICAqIEBwYXJhbSBwa2cKLSAgICogQHBhcmFtIHNlcGFyYXRvcgotICAgKiBAcmV0dXJuIG5vcm1hbGl6ZSBhIFN0cmluZyAocGFja2FnZSBuYW1lKSBhbmQgcmVwYWxjaW5nIAotICAgKiAgICAgICAgICc6JywgJ1xcJywgJy8nIGJ5IHNlcGFyYXRvciAoRE9UKS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBub3JtYWxpemVQYWNrYWdlTmFtZShTdHJpbmcgcGtnLCBjaGFyIHNlcGFyYXRvcikKLSAgewotCWlmIChwa2cgPT0gbnVsbCkgewotCQlyZXR1cm4gcGtnOwotCX0KLQlmb3IoaW50IGk9MDsgaTxwa2dTZXBhcmF0b3JzLmxlbmd0aDsgaSsrKQotCSAgIHBrZyA9IHBrZy5yZXBsYWNlKHBrZ1NlcGFyYXRvcnNbaV0sIHNlcGFyYXRvcik7Ci0JcmV0dXJuIHBrZzsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZURvdEluUG9ydE5hbWUoU3RyaW5nIG5hbWUpIHsKLQlpZihuYW1lLmluZGV4T2YoIi4iKTwwKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBib29sZWFuIGFmdGVyRG90ID0gZmFsc2U7Ci0gICAgZm9yKGludCBpPTA7IGk8bmFtZS5sZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAJaWYobmFtZS5jaGFyQXQoaSk9PScuJykKLSAgICAJewotICAgIAkJYWZ0ZXJEb3QgPSB0cnVlOwotICAgIAl9Ci0gICAgCWVsc2UgaWYoYWZ0ZXJEb3QpCi0gICAgCXsKLSAgICAJCXNiLmFwcGVuZChuYW1lLnN1YnN0cmluZyhpLGkrMSkudG9VcHBlckNhc2UoKSk7Ci0gICAgCQlhZnRlckRvdD1mYWxzZTsKLSAgICAJfQotICAgIAllbHNlCi0gICAgCXsKLSAgICAJCXNiLmFwcGVuZChuYW1lLmNoYXJBdChpKSk7Ci0gICAgCX0KLSAgICB9Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmI1OWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13c3MtYXhpcy11aS5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNkMWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3M8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb248L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuZGlzY292ZXJ5LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzZGw8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXI8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmZmE4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2Uud3NzLWF4aXMtdWkuamFyID0gc3JjLwotYmluLmluY2x1ZGVzID0gd3NzLWF4aXMtdWkuamFyLFwKLSAgICAgICAgICAgICAgIGRlcGxveS54c2wsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGRlcGxveS54c2wsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL2RlcGxveS54c2wgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL2RlcGxveS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGYxNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9kZXBsb3kueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgIHhtbG5zOm5zMT0iaHR0cDovL3htbC5hcGFjaGUub3JnL2F4aXMvd3NkZC8iCi0gICAgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL2F4aXMvd3NkZC9wcm92aWRlcnMvamF2YSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGVuY29kaW5nPSJVVEYtOCIvPgotICAKLSAgIDx4c2w6cGFyYW0gbmFtZT0ibmV3Q2xhc3NOYW1lIiBzZWxlY3Q9InNzIi8+Ci0gICAKLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvbnMxOmRlcGxveW1lbnQvbnMxOnNlcnZpY2UvbnMxOnBhcmFtZXRlcltAbmFtZT0nY2xhc3NOYW1lJ10iPgotICAgIDx4c2w6Y29weT4KLSAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj5jbGFzc05hbWU8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgCSA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+IAkKLSAgCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuZXdDbGFzc05hbWUiLz4gIAkgCQotICAgICAgIAkgPC94c2w6YXR0cmlidXRlPgotICAgICAgIAk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICAgCTwveHNsOmNvcHk+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICAJPHhzbDpjb3B5PgotICAgIAkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICAJPC94c2w6Y29weT4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0ZGQ3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2Vic2VydmljZSBBeGlzIENyZWF0aW9uIFVJCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotTEFCRUxfUlVOVElNRV9BWElTXzExPUFwYWNoZSBBeGlzIDEuMQotREVTQ19SVU5USU1FX0FYSVNfMTE9QXBhY2hlIEF4aXMgMS4xCi0KLSMKLSNXU1dTRExBeGlzVHlwZQotIwotV1NfTkFNRV9XU0RMQVhJUz1Ta2VsZXRvbiBKYXZhIGJlYW4gQXhpcyBXZWIgc2VydmljZQotCi0jCi0jV1NCZWFuQXhpc1R5cGUKLSMKLVdTX05BTUVfQkVBTkFYSVM9SmF2YSBiZWFuIEF4aXMgV2ViIHNlcnZpY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwYTZjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9Indzcy1heGlzLXVpLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPCEtLSBXZWIgU2VydmljZSBTZXJ2ZXIgVHlwZXMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIj4KLQotICAgICAgPHdlYlNlcnZpY2VSdW50aW1lCi0gICAgICAgICAgICBsYWJlbD0iJUxBQkVMX1JVTlRJTUVfQVhJU18xMSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlREVTQ19SVU5USU1FX0FYSVNfMTEiCi0gICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgajJlZXZlcnNpb249IjEzIDE0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSI+Ci0gICAgICA8L3dlYlNlcnZpY2VSdW50aW1lPgotCi0gICAgICA8d2ViU2VydmljZVNlcnZlcgotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMiIKLSAgICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuMzIucnVudGltZSIKLSAgICAgICAgICAgIGlkPSJTRVJWRVJfSURfVE9NQ0FUMzJfTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU2VydmVyPgotCi0gICAgICA8d2ViU2VydmljZVNlcnZlcgotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCIKLSAgICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDAucnVudGltZSIKLSAgICAgICAgICAgIGlkPSJTRVJWRVJfSURfVE9NQ0FUNDBfTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU2VydmVyPgotCi0gICAgICA8d2ViU2VydmljZVNlcnZlcgotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MSIKLSAgICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEucnVudGltZSIKLSAgICAgICAgICAgIGlkPSJTRVJWRVJfSURfVE9NQ0FUNDFfTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU2VydmVyPiAKLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXIKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiCi0gICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgcnVudGltZVR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwLnJ1bnRpbWUiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDUwX0xPQ0FMIj4gIAotICAgICAgPC93ZWJTZXJ2aWNlU2VydmVyPiAgICAKLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAgICAgICAgICAgcmVxdWlyZUVKQk1vZHVsZT0iZmFsc2UiCi0gICAgICAgICAgICByZXF1aXJlV2ViTW9kdWxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVdTX05BTUVfQkVBTkFYSVMiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS5qYXZhIgotICAgICAgICAgICAgcnVudGltZT0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIgotICAgICAgICAgICAgYXNzZW1ibHlCaW5kaW5nPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQuYmVhbnMuV1NCZWFuQXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQ1MF9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQuYmVhbnMuV1NCZWFuQXhpc1R5cGUuVE9NQ0FUNTBMT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZT4KLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAgICAgICAgICAgcmVxdWlyZUVKQk1vZHVsZT0iZmFsc2UiCi0gICAgICAgICAgICByZXF1aXJlV2ViTW9kdWxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVdTX05BTUVfV1NETEFYSVMiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS53c2RsIgotICAgICAgICAgICAgcnVudGltZT0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIgotICAgICAgICAgICAgYXNzZW1ibHlCaW5kaW5nPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQud3NkbC5XU1dTRExBeGlzVHlwZSIKLSAgICAgICAgICAgIHNlcnZlcj0iU0VSVkVSX0lEX1RPTUNBVDUwX0xPQ0FMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC53c2RsLldTV1NETEF4aXNUeXBlLlRPTUNBVDUwTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgICAgICAgICAgIHJlcXVpcmVFSkJNb2R1bGU9ImZhbHNlIgotICAgICAgICAgICAgcmVxdWlyZVdlYk1vZHVsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVXU19OQU1FX0JFQU5BWElTIgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUuamF2YSIKLSAgICAgICAgICAgIHJ1bnRpbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLmJlYW5zLldTQmVhbkF4aXNUeXBlIgotICAgICAgICAgICAgc2VydmVyPSJTRVJWRVJfSURfVE9NQ0FUNDFfTE9DQUwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLmJlYW5zLldTQmVhbkF4aXNUeXBlLlRPTUNBVDQxTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgICAgICAgICAgIHJlcXVpcmVFSkJNb2R1bGU9ImZhbHNlIgotICAgICAgICAgICAgcmVxdWlyZVdlYk1vZHVsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVXU19OQU1FX1dTRExBWElTIgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUud3NkbCIKLSAgICAgICAgICAgIHJ1bnRpbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLndzZGwuV1NXU0RMQXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQ0MV9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQud3NkbC5XU1dTRExBeGlzVHlwZS5UT01DQVQ0MUxPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPgotCi0gICAgICA8d2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICAgICAgICAgICByZXF1aXJlRUpCTW9kdWxlPSJmYWxzZSIKLSAgICAgICAgICAgIHJlcXVpcmVXZWJNb2R1bGU9InRydWUiCi0gICAgICAgICAgICBuYW1lPSIlV1NfTkFNRV9CRUFOQVhJUyIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLmphdmEiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBhc3NlbWJseUJpbmRpbmc9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC5iZWFucy5XU0JlYW5BeGlzVHlwZSIKLSAgICAgICAgICAgIHNlcnZlcj0iU0VSVkVSX0lEX1RPTUNBVDQwX0xPQ0FMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC5iZWFucy5XU0JlYW5BeGlzVHlwZS5UT01DQVQ0MExPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPgotCi0gICAgICA8d2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICAgICAgICAgICByZXF1aXJlRUpCTW9kdWxlPSJmYWxzZSIKLSAgICAgICAgICAgIHJlcXVpcmVXZWJNb2R1bGU9InRydWUiCi0gICAgICAgICAgICBuYW1lPSIlV1NfTkFNRV9XU0RMQVhJUyIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLndzZGwiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBhc3NlbWJseUJpbmRpbmc9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC53c2RsLldTV1NETEF4aXNUeXBlIgotICAgICAgICAgICAgc2VydmVyPSJTRVJWRVJfSURfVE9NQ0FUNDBfTE9DQUwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLndzZGwuV1NXU0RMQXhpc1R5cGUuVE9NQ0FUNDBMT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gU2VydmVyIERlZmF1bHRlcnMgLS0+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi5zZXJ2ZXJEZWZhdWx0ZXIiPgotICAgICAgPHNlcnZlckRlZmF1bHRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuQXhpc1NlcnZlckRlZmF1bHRlciI+Ci0gICAgICA8L3NlcnZlckRlZmF1bHRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jcmVhdGlvbi91aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJmOGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLQotIwotIyBFcnJvciBtZXNzYWdlcyB1c2VkIGluIHRoaXMgcGx1Z2luCi0jCi1NU0dfRVJST1JfSU5URVJBTD1JV0FCMDUxMkUgSW50ZXJuYWwgZXJyb3IKLU1TR19FUlJPUl9QUk9KRUNUX1VSTD1JV0FCMDUxNEUgVW5hYmxlIHRvIGdldCBVUkwgZm9yIHByb2plY3QgezB9Ci1NU0dfRVJST1JfUkVBRF9XU0RMPUlXQUIwNTE2RSBFcnJvciBpbiByZWFkaW5nIFdTREwgZmlsZSB7MH0KLU1TR19FUlJPUl9XU0RMX05PX1BPUlQ9SVdBQjA1MThFIFdTREwgZmlsZSBhdCB7MH0gaGFzIG5vIHBvcnQgZWxlbWVudAotTVNHX0VSUk9SX0NBTk5PVF9OT19KQVZBX0JFQU49SVdBQjAwMTVFIEEgSmF2YSBiZWFuIHdhcyBub3Qgc2VsZWN0ZWQKLU1TR19FUlJPUl9OT19QUk9KRUNUPUlXQUIwMDE2RSBBIHByb2plY3Qgd2FzIG5vdCBzZWxlY3RlZAotTVNHX0VSUk9SX0NBTk5PVF9MT0FEX0pBVkFfQkVBTj1JV0FCMDAxN0UgVGhlIEphdmEgYmVhbiwgezB9LCBjYW5ub3QgYmUgbG9hZGVkIGZyb20gezF9Ci1NU0dfRVJST1JfSkFWQV9NT0ZfUkVGTEVDVF9GQUlMRUQ9SVdBQjA1MjFFIEZhaWxlZCB0byBhbmFseXplIHRoZSBKYXZhIGJlYW46IHswfS4KLU1TR19FUlJPUl9SRUFEX0JFQU49SVdBQjA1MjJFIEVycm9yIGluIHJlYWRpbmcgbWV0aG9kcyBmcm9tIEphdmEgYmVhbi4KLU1TR19FUlJPUl9NT1ZFX1JFU09VUkNFPUlXQUIwNTIzRSBFcnJvciBtb3ZpbmcgcmVzb3VyY2UKLU1TR19FUlJPUl9VUERBVEVfQVhJU19XU0REPUlXQUIwNTI0RSBFcnJvciB1cGRhdGluZyBBeGlzIGRlcGxveS53c2RkIGZpbGUKLU1TR19FUlJPUl9MSVRFUkFMX1NVUFBPUlRfTUVTU0FHRT1JV0FCMDUzNkUgQXhpcyAxLjAgc3VwcG9ydCBmb3IgRG9jdW1lbnQvTGl0ZXJhbCBhbmQgRG9jdW1lbnQvTGl0ZXJhbCAoV3JhcHBlZCkgaXMgbWluaW1hbCwgdGh1cyB0aGUgZ2VuZXJhdGVkIGNvZGUgbWF5IGNvbnRhaW4gZXJyb3JzLiBSUEMvRW5jb2RlZCBpcyB0aGUgcmVjb21tZW5kZWQgc3R5bGUgYW5kIGVuY29kaW5nIHNlbGVjdGlvbi4KLU1TR19FUlJPUl9JTklUSUFMX1NFTEVDVElPTj1JV0FCMDAxOEUgRXJyb3IgZ2V0dGluZyBpbml0aWFsIHNlbGVjdGlvbi4KLQotCi0jCi0jSmF2YVRvV1NETE1ldGhvZENvbW1hbmQKLSMKLVRBU0tfTEFCRUxfSkFWQV9UT19XU0RMPUNyZWF0ZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZG9jdW1lbnQgbW9kZWwgZnJvbSBKYXZhIGJlYW4uCi1UQVNLX0RFU0NfSkFWQV9UT19XU0RMPUNyZWF0aW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBkb2N1bWVudCBtb2RlbCBmcm9tIEphdmEgYmVhbi4KLU1TR19FUlJPUl9KQVZBX1RPX01FVEhPRD1JV0FCMDAxOUUgRXJyb3IgaW4gZ2V0dGluZyBtZXRob2QgZnJvbSBKYXZhIGJlYW4uCi0KLSMKLSNEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMVGFzawotIwotVEFTS19MQUJFTF9TRVJWRVJfSkFWQV9XU0RMX0RFRkFVTFRTPURlZmF1bHRzRm9ySmF2YVdTRExTZXJ2ZXIKLVRBU0tfREVTQ19TRVJWRVJfSkFWQV9XU0RMX0RFRkFVTFRTPUJ1aWxkcyB0aGUgSmF2YVdTRExQYXJhbWV0ZXIgZm9yIHNlcnZlciBzaWRlLgotCi0jCi0jVXBkYXRlV0VCWE1MQ29tbWFuZAotIwotVEFTS19MQUJFTF9VUERBVEVfV0VCX1hNTD1VcGRhdGVXRUJYTUxDb21tYW5kCi1UQVNLX0RFU0NfVVBEQVRFX1dFQl9YTUw9VXBkYXRlIHByb2plY3QncyB3ZWIueG1sIGZpbGUgd2l0aCBBeGlzIHNlcnZsZXRzCi1NU0dfRVJST1JfVVBEQVRFX1dFQl9YTUw9SVdBQjAwMjBFIEVycm9yIGluIGFkZGluZyBzZXJ2bGV0IGluIHdlYi54bWwuCi0KLSMKLSNEZWZhdWx0c0ZvcldTREwyU2tlbGV0b25UYXNrCi0jCi0KLSMKLSNNb3ZlRGVwbG95bWVudEZpbGVzVGFzawotIwotVEFTS19MQUJFTF9NT1ZFX0RFUExPWU1FTlRfRklMRVM9TW92ZURlcGxveW1lbnRGaWxlc1Rhc2sKLVRBU0tfREVTQ19NT1ZFX0RFUExPWU1FTlRfRklMRVM9TW92ZSBkZXBsb3kud3NkZCBhbmQgdW5kZXBsb3kud3NkZCBmcm9tIEphdmEgU291cmNlIHRvIFdlYiBDb250ZW50L1dFQi1JTkYKLQotIwotI01vdmVKYXZhRmlsZXNUYXNrCi0jCi1UQVNLX0xBQkVMX01PVkVfSkFWQV9GSUxFUz1Nb3ZlSmF2YUZpbGVzVGFzawotVEFTS19ERVNDX01PVkVfSkFWQV9GSUxFUz1Nb3ZlIHNlcnZlciBzaWRlIGphdmEgZmlsZXMKLQotIwotI1NrZWxldG9uMldTRExUYXNrCi0jCi1UQVNLX0xBQkVMX1NLRUxFVE9OX1dTREw9RGVmYXVsdHNGb3JTa2VsZXRvbjJXU0RMVGFzawotVEFTS19ERVNDX1NLRUxFVE9OX1dTREw9Q3JlYXRlcyBXU0RMIGZvciBhIEphdmEgYmVhbiBza2VsZXRvbi4KLQotIwotI1VwZGF0ZUF4aXNXU0RERmlsZVRhc2sKLSMKLVRBU0tfTEFCRUxfVVBEQVRFX0FYSVNfV1NERD1VcGRhdGVBeGlzV1NEREZpbGVUYXNrCi1UQVNLX0RFU0NfVVBEQVRFX0FYSVNfV1NERD1VcGRhdGUgQXhpcyBkZXBsb3kud3NkZCB3aXRoIGFjdHVhbCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUKLU1TR19QTFVHSU5fRklMRV9VUkw9UHJvYmxlbSBsb2NhdGluZyBwbHVnaW4gZmlsZQotCi0jCi0jV2ViU2VydmljZVdTRExBeGlzU2VsZWN0aW9uUGFnZQotIwotUEFHRV9NU0dfTk9fRklMRV9TUEVDSUZJRUQ9Tm8gZmlsZSBzcGVjaWZpZWQuCi1QQUdFX01TR19OT19NRVRIT0RfU0VMRUNURUQ9Tm8gbWV0aG9kcyBzZWxlY3RlZC4KLQotIwotI1dlYlNlcnZpY2VTa2VsZXRvbkF4aXNDb25maWdGcmFnbWVudAotIwotCi0jCi0jV2ViU2VydmljZVNrZWxldG9uQXhpc0NvbmZpZ1BhZ2UKLSMKLVRPT0xUSVBfUEJTQ19QQUdFPQotVE9PTFRJUF9QQkNGX1RFWFRfVVJJPVRoZSBTT0FQIGJvZHkgbmFtZXNwYWNlIGFuZCB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgV2ViIHNlcnZpY2UuCi1UT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUj1UaGUgZm9sZGVyIG9mIHRoZSBXU0RMIGZpbGUuCi1UT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEU9VGhlIG5hbWUgb2YgdGhlIFdTREwgZmlsZS4KLUxBQkVMX1VSST1XZWIgc2VydmljZSBVUkk6Ci1MQUJFTF9PVVRQVVRfRk9MREVSX05BTUU9V1NETCBGb2xkZXI6Ci1MQUJFTF9PVVRQVVRfRklMRV9OQU1FPVdTREwgRmlsZToKLQotCi0jCi0jV1NXU0RMQXhpc1R5cGUKLSMKLVdTX05BTUVfV1NETEFYSVM9U2tlbGV0b24gSmF2YSBiZWFuIEF4aXMgV2ViIHNlcnZpY2UKLVdTX0RFU0NfV1NETEFYSVM9U2tlbGV0b24gSmF2YSBiZWFuIEF4aXMgV2ViIHNlcnZpY2UKLQotIwotI1dTQmVhbkF4aXNUeXBlCi0jCi0KLSMKLSNXZWJTZXJ2aWNlQXhpc0JlYW5DbGFzc0ZyYWdtZW50Ci0jCi0KLSMKLSNXZWJTZXJ2aWNlQXhpc0JlYW5DbGFzc1BhZ2UKLSMKLVBBR0VfVElUTEVfV1NCRUFOX0NMQVNTPVdlYiBTZXJ2aWNlIEphdmEgQmVhbiBTZWxlY3Rpb24KLVBBR0VfREVTQ19XU0JFQU5fQ0xBU1M9U2VsZWN0IGEgSmF2YSBiZWFuCi1MQUJFTF9FWFBMT1JFX01BUFBJTkdTX0JFQU4yWE1MPURlZmluZSBjdXN0b20gbWFwcGluZyBmb3IgcGFja2FnZSB0byBuYW1lc3BhY2UuCi1UT09MVElQX1AyTl9TSE9XX01BUFBJTkdTPURlZmluZSBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5nIGZvciBjdXN0b21pemF0aW9uLgotCi0jCi0jV2ViU2VydmljZUF4aXNCZWFuQ29uZmlnRnJhZ21lbnQKLSMKLQotIwotI1dlYlNlcnZpY2VBeGlzQmVhbkNvbmZpZ1BhZ2UKLSMKLVRPT0xUSVBfUEJDRl9QQUdFPQotVE9PTFRJUF9QQkNGX1RFWFRfVVJJPVRoZSBTT0FQIGJvZHkgbmFtZXNwYWNlIGFuZCB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgV2ViIHNlcnZpY2UuCi1UT09MVElQX1BCTUVfVFJFRV9NRVRIT0RTPUphdmEgYmVhbiBtZXRob2RzIHRvIGluY2x1ZGUuCi1QQUdFX1RJVExFX1dTQkVBTl9DT05GSUc9V2ViIFNlcnZpY2UgSmF2YSBCZWFuIElkZW50aXR5Ci1QQUdFX0RFU0NfV1NCRUFOX0NPTkZJRz1Db25maWd1cmUgdGhlIEphdmEgYmVhbiBhcyBhIFdlYiBzZXJ2aWNlLgotTEFCRUxfU1RZTEVfVVNFPVN0eWxlIGFuZCBVc2UKLVNUWUxFX1JQQ19MSVRFUkFMPURvY3VtZW50LyBMaXRlcmFsCi1TVFlMRV9ET0NfTElURVJBTD1Eb2N1bWVudC8gTGl0ZXJhbCAoV3JhcHBlZCkKLVNUWUxFX1JQQ19FTkNPREVEPVJQQy8gRW5jb2RlZAotCi0jCi0jV1NETENvbnN1bXB0aW9uVGFza0ZhY3RvcnkKLSMKLQotIwotI0NvcHlBeGlzU2VydmVyQ29uZmlnVGFzawotIwotCi1UQVNLX0xBQkVMX0NPUFlfU0VSVkVSX0NPTkZJR19GSUxFUz1Db3B5IHNlcnZlci1jb25maWcud3NkZCBmcm9tIHRoZSBzZXJ2ZXIgbG9jYXRpb24gdG8gdGhlIFdlYiBQcm9qZWN0Ci1UQVNLX0RFU0NfQ09QWV9TRVJWRVJfQ09ORklHX0ZJTEVTPUNvcGluZyBzZXJ2ZXItY29uZmlnLndzZGQgZnJvbSB0aGUgc2VydmVyIGxvY2F0aW9uIHRvIHRoZSBXZWIgUHJvamVjdAotCi0KLSMKLSNMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrCi0jCi1UQVNLX0xBQkVMX0xJVEVSQUxfU1VQUE9SVF9NRVNTQUdFPUF4aXMgc3VwcG9ydCBmb3IgTGl0ZXJhbCBlbmNvZGluZyBtZXNzYWdlIHRhc2sKLVRBU0tfREVTQ19MSVRFUkFMX1NVUFBPUlRfTUVTU0FHRT1BeGlzIHN1cHBvcnQgZm9yIExpdGVyYWwgZW5jb2RpbmcgbWVzc2FnZSB0YXNrCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0F4aXNTZXJ2ZXJEZWZhdWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQXhpc1NlcnZlckRlZmF1bHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzc4YjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQXhpc1NlcnZlckRlZmF1bHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLklTZXJ2ZXJEZWZhdWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5TZXJ2ZXJJbmZvOwotCi0KLQotcHVibGljIGNsYXNzIEF4aXNTZXJ2ZXJEZWZhdWx0ZXIgaW1wbGVtZW50cyBJU2VydmVyRGVmYXVsdGVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLklTZXJ2ZXJEZWZhdWx0ZXIjcmVjb21tZW5kRGVmYXVsdFNlcnZlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLSAgICovCi0gIHB1YmxpYyBTZXJ2ZXJJbmZvIHJlY29tbWVuZERlZmF1bHRTZXJ2ZXIoSVByb2plY3QgcHJvamVjdCkKLSAgeyAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9Db21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZGIyMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9Db21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgTGlzdCBjbGFzc05hbWVzOwotICAvL3ByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0gIC8vcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtZXRlcjsKLQotICBwdWJsaWMgQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kKCkKLSAgewotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgY2xhc3NOYW1lcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAoamF2YVdTRExQYXJhbWV0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYmVhbk5hbWUgPSBqYXZhV1NETFBhcmFtZXRlci5nZXRCZWFuTmFtZSgpOwotICAgICAgaWYgKGJlYW5OYW1lICE9IG51bGwpCi0gICAgICAgIGNsYXNzTmFtZXMuYWRkKGJlYW5OYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0Q2xhc3NOYW1lcygpCi0gIHsKLSAgICByZXR1cm4gY2xhc3NOYW1lczsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgLy90aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzZGxVUkkgVGhlIHdzZGxVUkkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIC8vdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtZXRlcikKLSAgewotICAgIHRoaXMuamF2YVdTRExQYXJhbWV0ZXIgPSBqYXZhV1NETFBhcmFtZXRlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9KYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9KYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTk1M2MxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIEphdmFUb1dTRExNZXRob2RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9KQVZBX1RPX1dTREwiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfSkFWQV9UT19XU0RMIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFWQV9FWFRFTlNJT04gPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENMQVNTX0VYVEVOU0lPTiA9ICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEhhc2h0YWJsZSBmTWV0aG9kTmFtZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmQmVhbk5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZmJlYW5CYXNlTmFtZTsKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OwotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0JLyoqCi0JKiBEZWZhdWx0IENUT1IKLQkqLwotCXB1YmxpYyBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZCgpIHsKLQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JfQotCS8qKgotCSogRGVmYXVsdCBDVE9SCi0JKi8KLQlwdWJsaWMgSmF2YVRvV1NETE1ldGhvZENvbW1hbmQoCi0JCUphdmFXU0RMUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIsCi0JCUlQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KSB7Ci0JCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JICAgIHNldE5hbWUgKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0JCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQlqYXZhV1NETFBhcmFtXyA9IGphdmFQYXJhbWV0ZXI7Ci0JCXNlcnZpY2VQcm9qZWN0XyA9IHNlcnZpY2VQcm9qZWN0OwotCi0JfQotCi0JLyoqCi0JKiBKYXZhVG9Ub1dTRExNZXRob2QgZXhlY3V0ZQotCSovCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCWZiZWFuQmFzZU5hbWUgPSBqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpOwotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwNzAsIHRoaXMsICJleGVjdXRlIiwgImJlYW5CYXNlTmFtZSA9ICIrZmJlYW5CYXNlTmFtZSk7Ci0JCVN0YXR1cyBzdGF0dXM7Ci0JCXRyeSB7Ci0JCQkvL0dldCB0aGUgcXVhbGlmaWVkIGJlYW4gbmFtZTsgbXkucGFja2FnZS5NeUNsYXNzCi0JCQlmTWV0aG9kTmFtZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQlIYXNodGFibGUgb2xkTWV0aG9kc05hbWVzID0gamF2YVdTRExQYXJhbV8uZ2V0TWV0aG9kcygpOwotCQkJU3RyaW5nIHFOYW1lID0gZmJlYW5CYXNlTmFtZTsKLQotCQkJaWYgKHFOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoSkFWQV9FWFRFTlNJT04pCi0JCQkJfHwgcU5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChDTEFTU19FWFRFTlNJT04pKSB7Ci0JCQkJcU5hbWUgPSBxTmFtZS5zdWJzdHJpbmcoMCwgcU5hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JCQl9Ci0KLQkJCUphdmFFTUZOYXR1cmUgak1PRiA9Ci0JCQkJKEphdmFFTUZOYXR1cmUpIEphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZSgKLQkJCQkJc2VydmljZVByb2plY3RfKTsKLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPQotCQkJCShKYXZhQ2xhc3MpIEphdmFDbGFzc0ltcGwucmVmbGVjdChxTmFtZSwgak1PRi5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWlmICghamF2YUNsYXNzLmlzRXhpc3RpbmdUeXBlKCkpIHsKLQkJCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLkVSUk9SLCA1MDIyLCB0aGlzLCAiZXhlY3V0ZSIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKAotCQkJCQkJIk1TR19FUlJPUl9KQVZBX01PRl9SRUZMRUNUX0ZBSUxFRCIsCi0JCQkJCQluZXcgU3RyaW5nW10geyBxTmFtZSB9KSk7Ci0JCQkJCi0JCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YVRvV1NETE1ldGhvZENvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgKLQkJCQkJIk1TR19FUlJPUl9KQVZBX01PRl9SRUZMRUNUX0ZBSUxFRCIsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IHFOYW1lIH0pLAotCQkJCQlTdGF0dXMuRVJST1IpOwotCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0KLQkJCS8vIEdldCB0aGUgcXVhbGlmaWVkIG5hbWUKLQkJCWZDbGFzc05hbWUgPSBqYXZhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJZkJlYW5OYW1lID0gZkNsYXNzTmFtZTsKLQkJCVN0cmluZyBiZWFuTmFtZTsKLQkJCWlmIChmQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCQliZWFuTmFtZSA9Ci0JCQkJCWZDbGFzc05hbWUuc3Vic3RyaW5nKAotCQkJCQkJZkNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSwKLQkJCQkJCWZDbGFzc05hbWUubGVuZ3RoKCkpOwotCQkJfSBlbHNlCi0JCQkJYmVhbk5hbWUgPSBmQ2xhc3NOYW1lOwotCi0JCQkvLyBXYWxrIHRoZSBqYXZhIGNsYXNzIGFuZCBnZXQgdGhlIG1ldGhvZCBuYW1lcwotCQkJZ2F0aGVyTWV0aG9kcyhqYXZhQ2xhc3MsIGJlYW5OYW1lLCBvbGRNZXRob2RzTmFtZXMpOwotCQkJLyoKLQkJCUl0ZXJhdG9yIG0gPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChtLmhhc05leHQoKSkgewotCQkJCU1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBtLm5leHQoKTsgIAotCQkJCWlmICggISBtZXRob2QuaXNDb25zdHJ1Y3RvcigpKXsgCi0JCQkJaWYgKCFiZWFuTmFtZS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkKLQkJCQkJJiYgIShpc0R1cGxpY2F0ZU1ldGhvZE5hbWUobWV0aG9kCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKSkKLQkJCQkJJiYgIShtZXRob2QKLQkJCQkJCS5nZXRDb250YWluaW5nSmF2YUNsYXNzKCkKLQkJCQkJCS5nZXRKYXZhTmFtZSgpCi0JCQkJCQkuZXF1YWxzSWdub3JlQ2FzZSgiamF2YXguZWpiLkVKQk9iamVjdCIpKQkvLyROT04tTkxTLTEkCi0JCQkJCSYmICEobWV0aG9kCi0JCQkJCQkuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpCi0JCQkJCQkuZ2V0SmF2YU5hbWUoKQotCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoImphdmF4LmVqYi5FSkJPYmplY3RbXSIpKQkvLyROT04tTkxTLTEkCi0JCQkJCSYmICEobWV0aG9kCi0JCQkJCQkuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpCi0JCQkJCQkuZ2V0SmF2YU5hbWUoKQotCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoImphdmEubGFuZy5PYmplY3QiKSkJLy8kTk9OLU5MUy0xJAotCQkJCQkmJiAhKG1ldGhvZAotCQkJCQkJLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKQotCQkJCQkJLmdldEphdmFOYW1lKCkKLQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhLmxhbmcuT2JqZWN0W10iKSkpIHsJLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBhZGQgdGhlIG1ldGhvZCBuYW1lIHRvIG91ciBsaXN0IG9mIG1ldGhvZCBuYW1lcwotCQkJCQlTdHJpbmcgbWV0aG9kTmFtZSA9bWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKTsKLQkJICAgICAgICAgIEJvb2xlYW4gaXNTZWxlY3RlZCA9IG5ldyBCb29sZWFuKHRydWUpOwotICAgICAgICAJCSAgaWYgKG9sZE1ldGhvZHNOYW1lcyAhPSBudWxsICYmIG9sZE1ldGhvZHNOYW1lcy5jb250YWluc0tleShtZXRob2ROYW1lKSkKLSAgICAgICAgICAJCQlpc1NlbGVjdGVkID0gKEJvb2xlYW4pb2xkTWV0aG9kc05hbWVzLmdldChtZXRob2ROYW1lKTsKLQkJICAgICAgICAgIGZNZXRob2ROYW1lcy5wdXQobWV0aG9kTmFtZSwgaXNTZWxlY3RlZCk7Ci0JCQkJfSAKLQkJCQl9Ci0JCQl9Ci0JCQkqLwotCQkJamF2YVdTRExQYXJhbV8uc2V0TWV0aG9kcyhmTWV0aG9kTmFtZXMpOwotCQkJCi0JCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5FUlJPUiwgNTAyMywgdGhpcywgImV4ZWN1dGUiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JFQURfQkVBTiIpKTsKLQkJCi0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJIk1TR19FUlJPUl9KQVZBX1RPX01FVEhPRCIpLAotCQkJCVN0YXR1cy5FUlJPUiwgZSk7Ci0JCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQl9Ci0KLSAgcHJpdmF0ZSB2b2lkIGdhdGhlck1ldGhvZHMoSmF2YUNsYXNzIGphdmFDbGFzcywgU3RyaW5nIGJlYW5OYW1lLCBIYXNodGFibGUgb2xkTWV0aG9kc05hbWVzKQotICB7Ci0gICAgU3RyaW5nIGphdmFOYW1lID0gamF2YUNsYXNzLmdldEphdmFOYW1lKCk7Ci0gICAgaWYgKCFqYXZhQ2xhc3MuaXNJbnRlcmZhY2UoKQotICAgICAgICAmJiAhamF2YU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YXguZWpiLkVKQk9iamVjdFtdIikKLSAgICAgICAgJiYgIWphdmFOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImphdmF4LmVqYi5FSkJPYmplY3QiKQotICAgICAgICAmJiAhamF2YU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YS5sYW5nLk9iamVjdFtdIikKLSAgICAgICAgJiYgIWphdmFOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImphdmEubGFuZy5PYmplY3QiKSkKLSAgICB7Ci0gICAgICBMaXN0IHB1YmxpY01ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kcygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHB1YmxpY01ldGhvZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpaXQubmV4dCgpOwotICAgICAgICBpZiAoIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkKLSAgICAgICAgICAgICYmICFiZWFuTmFtZS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkKLSAgICAgICAgICAgICYmICEoaXNEdXBsaWNhdGVNZXRob2ROYW1lKG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGFkZCB0aGUgbWV0aG9kIG5hbWUgdG8gb3VyIGxpc3Qgb2YgbWV0aG9kIG5hbWVzCi0gICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpOwotICAgICAgICAgIEJvb2xlYW4gaXNTZWxlY3RlZCA9IG5ldyBCb29sZWFuKHRydWUpOwotICAgICAgICAgIGlmIChvbGRNZXRob2RzTmFtZXMgIT0gbnVsbCAmJiBvbGRNZXRob2RzTmFtZXMuY29udGFpbnNLZXkobWV0aG9kTmFtZSkpCi0gICAgICAgICAgICBpc1NlbGVjdGVkID0gKEJvb2xlYW4pb2xkTWV0aG9kc05hbWVzLmdldChtZXRob2ROYW1lKTsKLSAgICAgICAgICBmTWV0aG9kTmFtZXMucHV0KG1ldGhvZE5hbWUsIGlzU2VsZWN0ZWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBnYXRoZXJNZXRob2RzKGphdmFDbGFzcy5nZXRTdXBlcnR5cGUoKSwgYmVhbk5hbWUsIG9sZE1ldGhvZHNOYW1lcyk7Ci0gICAgfQotICB9Ci0JICAKLQkvL1JldHVybnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgbWV0aG9kIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIAotCS8vZk1ldGhvZE5hbWVzIHZlY3Rvci4gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkZXRlY3Qgb3ZlcmxvYWRlZCAKLQkvL21ldGhvZHMgaW4gQmVhbnMgYW5kIEVKQnMsIHdoaWNoIGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuCi0JcHJpdmF0ZSBib29sZWFuIGlzRHVwbGljYXRlTWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gKGZNZXRob2ROYW1lcyA9PSBudWxsID8gZmFsc2U6IGZNZXRob2ROYW1lcy5jb250YWluc0tleShtZXRob2ROYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGphdmFXU0RMUGFyYW0uCi0JICogQHJldHVybiBKYXZhV1NETFBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotCQlyZXR1cm4gamF2YVdTRExQYXJhbV87Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLQkgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJdGhpcy5qYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KQotCXsKLQkgIHNlcnZpY2VQcm9qZWN0XyA9IHNlcnZpY2VQcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvVXBkYXRlV0VCWE1MQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9VcGRhdGVXRUJYTUxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjUwNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9VcGRhdGVXRUJYTUxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5jb21tYW5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5JV2ViTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkoyRUVXZWJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLldlYkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVXRUJYTUxDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1VQREFURV9XRUJfWE1MIjsKLQlwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfVVBEQVRFX1dFQl9YTUwiOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHdlYlByb2plY3ROYXR1cmUgPSBJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEOwotCi0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCXByaXZhdGUgSVByb2plY3Qgc2VydmVyUHJvamVjdDsKLQotICBwdWJsaWMgVXBkYXRlV0VCWE1MQ29tbWFuZCgpCi0gIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgICBzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLSAgfQotCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCWlmIChzZXJ2ZXJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJc3RhdHVzID0gYWRkU2VydmxldChzZXJ2ZXJQcm9qZWN0LCBnZXRBeGlzU2VydmxldERlc2NyaXB0b3IoKSk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSB7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHsKLQkJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQkJYWRkU2VydmxldChzZXJ2ZXJQcm9qZWN0LCBnZXRBZG1pbnRTZXJ2bGV0RGVzY3JpcHRvcigpKTsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHsKLQkJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotCX0KLQotCXByaXZhdGUgU2VydmxldERlc2NyaXB0b3IgZ2V0QXhpc1NlcnZsZXREZXNjcmlwdG9yKCkgewotCi0JCVNlcnZsZXREZXNjcmlwdG9yIHNkID0gbmV3IFNlcnZsZXREZXNjcmlwdG9yKCk7Ci0JCXNkLl9uYW1lID0gIkF4aXNTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fZGlzcGxheU5hbWUgPSAiQXBhY2hlLUF4aXMgU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2NsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMudHJhbnNwb3J0Lmh0dHAuQXhpc1NlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JCXNkLl9tYXBwaW5ncyA9IG5ldyBTdHJpbmdbXSB7ICIvc2VydmxldC9BeGlzU2VydmxldCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiKi5qd3MiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIi9zZXJ2aWNlcy8qIiB9OyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzZDsKLQl9Ci0KLQlwcml2YXRlIFNlcnZsZXREZXNjcmlwdG9yIGdldEFkbWludFNlcnZsZXREZXNjcmlwdG9yKCkgewotCQlTZXJ2bGV0RGVzY3JpcHRvciBzZCA9IG5ldyBTZXJ2bGV0RGVzY3JpcHRvcigpOwotCQlzZC5fbmFtZSA9ICJBZG1pblNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JCXNkLl9kaXNwbGF5TmFtZSA9ICJBeGlzIEFkbWluIFNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JCXNkLl9jbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzLnRyYW5zcG9ydC5odHRwLkFkbWluU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX21hcHBpbmdzID0gbmV3IFN0cmluZ1tdIHsgIi9zZXJ2bGV0L0FkbWluU2VydmxldCIgfTsgLy8kTk9OLU5MUy0xJAotCQlzZC5fbG9hZE9uU3RhcnR1cCA9IG5ldyBJbnRlZ2VyKDEwMCk7Ci0JCXJldHVybiBzZDsKLQl9Ci0KLQlwcml2YXRlIFNlcnZsZXREZXNjcmlwdG9yIGdldFNvYXBNb25pdG9yU2VydmxldERlc2NyaXB0b3IoKSB7Ci0JCVNlcnZsZXREZXNjcmlwdG9yIHNkID0gbmV3IFNlcnZsZXREZXNjcmlwdG9yKCk7Ci0JCXNkLl9uYW1lID0gIlNPQVBNb25pdG9yU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2Rpc3BsYXlOYW1lID0gIlNPQVBNb25pdG9yU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2NsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMubW9uaXRvci5TT0FQTW9uaXRvclNlcnZpY2UiOyAvLyROT04tTkxTLTEkCi0JCXNkLl9tYXBwaW5ncyA9IG5ldyBTdHJpbmdbXSB7ICIvU09BUE1vbml0b3IiIH07IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2xvYWRPblN0YXJ0dXAgPSBuZXcgSW50ZWdlcigxMDApOwotCQlNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQkJcGFyYW1zLnB1dCgiU09BUE1vbml0b3JQb3J0IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkgIjUwMDEiKTsgICAvLyROT04tTkxTLTEkCi0JCXNkLl9wYXJhbXMgPSBwYXJhbXM7Ci0JCXJldHVybiBzZDsKLQl9Ci0KLQlwdWJsaWMgU3RhdHVzIGFkZFNlcnZsZXQoCi0JCUlQcm9qZWN0IHdlYlByb2plY3QsCi0JCVNlcnZsZXREZXNjcmlwdG9yIHNlcnZsZXREZXNjcmlwdG9yKSB7Ci0JCUoyRUVXZWJOYXR1cmVSdW50aW1lIG5hdHVyZSA9IG51bGw7Ci0JCVdlYkVkaXRNb2RlbCByZXNvdXJjZSA9IG51bGw7Ci0JCU9iamVjdCBhY2Nlc3NvcktleSA9IG5ldyBPYmplY3QoKTsKLQkJdHJ5IHsKLQkJCW5hdHVyZSA9Ci0JCQkJKEoyRUVXZWJOYXR1cmVSdW50aW1lKSAod2ViUHJvamVjdC5nZXROYXR1cmUod2ViUHJvamVjdE5hdHVyZSkpOwotCQkJcmVzb3VyY2UgPSBuYXR1cmUuZ2V0V2ViQXBwRWRpdE1vZGVsRm9yV3JpdGUoYWNjZXNzb3JLZXkpOwotCQkJV2ViQXBwIHdlYmFwcCA9IHJlc291cmNlLmdldFdlYkFwcCgpOwotCi0JCQlib29sZWFuIGZvdW5kU2VydmxldCA9IGZhbHNlOwotCi0JCQlMaXN0IHRoZVNlcnZsZXRzID0gd2ViYXBwLmdldFNlcnZsZXRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZVNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU2VydmxldCBhU2VydmxldCA9IChTZXJ2bGV0KSB0aGVTZXJ2bGV0cy5nZXQoaSk7Ci0JCQkJaWYgKGFTZXJ2bGV0LmdldFNlcnZsZXROYW1lKCkuZXF1YWxzKHNlcnZsZXREZXNjcmlwdG9yLl9uYW1lKSkgewotCQkJCQlmb3VuZFNlcnZsZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGZvdW5kU2VydmxldCkgewotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSByZXNvdXJjZS5yZWxlYXNlQWNjZXNzKGFjY2Vzc29yS2V5KTsKLQkJCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLQkJCX0KLQotCQkJV2ViYXBwbGljYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFOwotCi0JCQlTZXJ2bGV0IHNlcnZsZXQgPSBmYWN0b3J5LmNyZWF0ZVNlcnZsZXQoKTsKLQkJCVNlcnZsZXRUeXBlIHNlcnZsZXRUeXBlID0gZmFjdG9yeS5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotCQkJc2VydmxldC5zZXRXZWJUeXBlKHNlcnZsZXRUeXBlKTsKLQkJCXNlcnZsZXQuc2V0U2VydmxldE5hbWUoc2VydmxldERlc2NyaXB0b3IuX25hbWUpOwotCQkJc2VydmxldFR5cGUuc2V0Q2xhc3NOYW1lKHNlcnZsZXREZXNjcmlwdG9yLl9jbGFzc05hbWUpOwotCQkJaWYoc2VydmxldERlc2NyaXB0b3IuX2Rpc3BsYXlOYW1lICE9IG51bGwpewotCQkJICAgc2VydmxldC5zZXREaXNwbGF5TmFtZShzZXJ2bGV0RGVzY3JpcHRvci5fZGlzcGxheU5hbWUpOwotCQkJfQotCQkJaWYoc2VydmxldERlc2NyaXB0b3IuX2xvYWRPblN0YXJ0dXAgIT0gbnVsbCl7Ci0JCQkJc2VydmxldC5zZXRMb2FkT25TdGFydHVwKHNlcnZsZXREZXNjcmlwdG9yLl9sb2FkT25TdGFydHVwKTsKLQkJCX0KLQkJCWlmKHNlcnZsZXREZXNjcmlwdG9yLl9wYXJhbXMgIT0gbnVsbCl7Ci0JCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gc2VydmxldC5nZXRQYXJhbXNBc1Byb3BlcnRpZXMoKTsKLQkJCQlwcm9wZXJ0aWVzLnB1dEFsbChzZXJ2bGV0RGVzY3JpcHRvci5fcGFyYW1zKTsKLQkJCX0KLQkJCXdlYmFwcC5nZXRTZXJ2bGV0cygpLmFkZChzZXJ2bGV0KTsKLQkJCQotCQkJaWYoc2VydmxldERlc2NyaXB0b3IuX21hcHBpbmdzICE9IG51bGwpewotCQkJCWZvcihpbnQgaT0wOyBpPHNlcnZsZXREZXNjcmlwdG9yLl9tYXBwaW5ncy5sZW5ndGg7IGkrKyl7Ci0JCQkJCVNlcnZsZXRNYXBwaW5nIHNlcnZsZXRNYXBwaW5nID0gZmFjdG9yeS5jcmVhdGVTZXJ2bGV0TWFwcGluZygpOwotCQkJCQlzZXJ2bGV0TWFwcGluZy5zZXRTZXJ2bGV0KHNlcnZsZXQpOwotCQkJCQlzZXJ2bGV0TWFwcGluZy5zZXRVcmxQYXR0ZXJuKHNlcnZsZXREZXNjcmlwdG9yLl9tYXBwaW5nc1tpXSk7Ci0JCQkJCXdlYmFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKS5hZGQoc2VydmxldE1hcHBpbmcpOwkJCQkJCi0JCQkJfQotCQkJfQotCQkJcmVzb3VyY2Uuc2F2ZShhY2Nlc3NvcktleSk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgcmVzb3VyY2UucmVsZWFzZUFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSByZXNvdXJjZS5yZWxlYXNlQWNjZXNzKGFjY2Vzc29yS2V5KTsKLQkJCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKAotCQkJCQkiVXBkYXRlV0VCWE1MQ29tbWFuZC5hZGRTZXJ2bGV0IiwgLy8kTk9OLU5MUy0xJAotCQkJCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VQREFURV9XRUJfWE1MIiksCi0JCQkJCVN0YXR1cy5FUlJPUiwgZSk7Ci0JCX0KLQl9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLSAgfQotCi0JcHVibGljIGNsYXNzIFNlcnZsZXREZXNjcmlwdG9yIHsKLQkJU3RyaW5nIF9uYW1lOwotCQlTdHJpbmcgX2NsYXNzTmFtZTsKLQkJU3RyaW5nIF9kaXNwbGF5TmFtZTsKLQkJTWFwIF9wYXJhbXM7Ci0JCVN0cmluZ1tdIF9tYXBwaW5nczsKLQkJSW50ZWdlciBfbG9hZE9uU3RhcnR1cDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlMmViMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5wbHVnaW47Ci0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIHBsdWdpbi4KLSogPHA+Ci0qIFRoaXMgcGx1Z2luIGNvbnRhaW5zIHRoZSBncmFwaGljIHVzZXIgaW50ZXJmYWNlIHRvIHRoZQotKiBXZWIgU2VydmljZXMgcnVudGltZSBmb3VuZCBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQkKLQkvLyBDb3B5cmlnaHQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMy4iOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwkvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotICAqLwotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4gaW5zdGFuY2VfOwotICBwcml2YXRlIExvZyBsb2dfOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAqIFRoZSAicGx1Z2luIiBlbGVtZW50IGluIHBsdWdpbi54bWwgc2hvdWxkIGluY2x1ZGUgdGhlIGF0dHJpYnV0ZQotICAqIGNsYXNzID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbiIuCi0gICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4gKCBJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yICkKLSAgewotICAgIHN1cGVyKGRlc2NyaXB0b3IpOwotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSB0aGlzOwotICAgIH0KLSAgICBsb2dfID0gbmV3IEVjbGlwc2VMb2coKTsKLQotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgKiAoV2ViU2VydmljZVdhc0NyZWF0aW9uVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3Mud2FzLnY1LnRwLnVpIik7Ci0gICogQHJldHVybiBUaGUgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4gc2luZ2xldG9uLgotICAqLwotICBzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbiBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCBvbmNlIGJ5IHRoZSBwbGF0Zm9ybSB3aGVuIHRoaXMgcGx1Z2luIGlzIGZpcnN0IGxvYWRlZC4KLSAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc3RhcnQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0dXAgKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAJbG9nXy5sb2coTG9nLklORk8sIDUwNjgsIHRoaXMsICJzdGFydHVwIiwgIlN0YXJ0aW5nIHBsdWdpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSIpOwotICAgIHN1cGVyLnN0YXJ0dXAoKTsKLSAgICBzZXRQcmVmZXJlbmNlcygpOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgdW5sb2FkZWQuCi0gICogQHRocm93cyBDb3JlRXhjZXB0aW9uIElmIHRoaXMgcGx1Z2luIGZhaWxzIHRvIHNodXRkb3duLgotICAqLwotICBwdWJsaWMgdm9pZCBzaHV0ZG93biAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gIAlsb2dfLmxvZyhMb2cuSU5GTywgNTA2OSwgdGhpcywgInNodXRkb3duIiwgIlNodXR0aW5nIHBsdWdpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSIpOwotICAgIHN1cGVyLnNodXRkb3duKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBnZW5lcmFsIHByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHN0b3JlLgotICAqKi8KLSAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZXMoKQotICB7Ci0gICAvLyBzZXREaWFsb2dzUHJlZmVyZW5jZXMoKTsKLSAgfQotCi0gLyoqCi0gICAqIEBzZWUgQWJzdHJhY3RVSVBsdWdpbiNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlKSB7Ci0KLQkvLyBTZXQgdGhlIGRlZmF1bHRzIFByZWZlcmVuY2UKLS8vCUFjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlSGVscGVyLmluaXRpYWxpemVEZWZhdWx0cyhwcmVmZXJlbmNlU3RvcmUpOwotICB9Ci0gCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0gICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSApCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfLmdldERlc2NyaXB0b3IoKS5nZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAgKiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGZvcgotICAqIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICAqIEBwYXJhbSBhcmdzIFRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZQotICAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBtZXNzYWdlIGluIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZAotICAqIGJ5IHRoZSBydWxlcyBvZiBjbGFzcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSxhcmdzKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlCi0gICogYXMgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uLgotICAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIGluc3RhbGxVUkwgPSBpbnN0YW5jZV8uZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKLSAgICAgIFVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCxuYW1lKTsKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpIHsKLSAgICByZXR1cm4gUGxhdGZvcm0uZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbih0aGlzKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLnRvT1NTdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSW5zdGFsbExvY2F0aW9uKCkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZShnZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpKS5nZXRGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0gIH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0NvcHlBeGlzU2VydmVyQ29uZmlnVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGFkODBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9DT1BZX1NFUlZFUl9DT05GSUdfRklMRVMiOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0iVEFTS19ERVNDX0NPUFlfU0VSVkVSX0NPTkZJR19GSUxFUyI7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVQTE9ZRURTRVJWSUNFUyA9ICJXRUItSU5GIiArIEZpbGUuc2VwYXJhdG9yICsgInNlcnZlci1jb25maWcud3NkZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gICAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLSAgICBwcml2YXRlIE1lc3NhZ2VVdGlscyBiYXNlQ29uTXNnVXRpbHNfOwotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JcHJpdmF0ZSBCb29sZWFuIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfOwotCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSURfOwotCXByaXZhdGUgSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotCS8vIHJtIHByaXZhdGUgTW9kZWwgbW9kZWxfOwotCi0JcHVibGljIENvcHlBeGlzU2VydmVyQ29uZmlnVGFzaygpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgYmFzZUNvbk1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgdGhpcyApOwotCQlzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQlzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CSAKLQotCX0KLQkKLQlwdWJsaWMgQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgYmFzZUNvbk1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgdGhpcyApOwotCQlzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQlzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CSAgCi0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQotCX0KLQotCS8qKgotCSogRXhlY3V0ZSBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2sKLQkqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQkgIAotCSAgLy8gcm0gCi0JICAvKgotCSAgICAvL0JlZ2luIHNldHRlcnMKLQkgIFdlYlNlcnZpY2VFbGVtZW50IHdlYlNlcnZpY2VFbGVtZW50ID0KLQkJV2ViU2VydmljZUVsZW1lbnQuZ2V0V2ViU2VydmljZUVsZW1lbnQobW9kZWxfKTsKLQkgIHNldFNlcnZpY2VQcm9qZWN0KHdlYlNlcnZpY2VFbGVtZW50LmdldFNlcnZpY2VQcm9qZWN0KCkpOwotCSAgc2V0U2VydmljZVNlcnZlclR5cGVJRCh3ZWJTZXJ2aWNlRWxlbWVudC5nZXRTZXJ2aWNlU2VydmVyVHlwZUlEKCkpOwotCSAgc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKHdlYlNlcnZpY2VFbGVtZW50LmdldFNlcnZpY2VFeGlzdGluZ1NlcnZlcigpKTsKLQkgIAotCSAgICAvL0VuZCBTZXR0ZXJzCi0JICAgICAqLwotCSAgCi0JICAKLQkgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JICAgIAotCQlpZiAoamF2YVdTRExQYXJhbV8gPT0gbnVsbCkgewotCQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgY29yZU1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSkFWQV9XU0RMX1BBUkFNX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICAgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQkvLyBybSAKLQkJLyoKLQkJaWYgKG1vZGVsXyA9PSBudWxsKSB7Ci0JCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX01PREVMX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJICAgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQkJKi8KLQkJCi0JCXRyeSB7Ci0KLQkJICAgIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfID0gQm9vbGVhbi5UUlVFOwotCQkJLy8gcm0gd2ViU2VydmljZUVsZW1lbnQuc2V0UHJvamVjdFJlc3RhcnRSZXF1aXJlZCh0cnVlKTsKLQotCQkJSVByb2plY3QgcHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0XzsKLQkJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBiYXNlQ29uTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX05PVF9GT1VORCIpLCBTdGF0dXMuRVJST1IpOwotCQkJICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCSAgICByZXR1cm4gc3RhdHVzOwotCQkJfQotCi0JCQlJU2VydmVyIGluc3RhbmNlID0KLQkJCQlTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUoCi0JCQkJCVJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLAotCQkJCQlzZXJ2aWNlU2VydmVyVHlwZUlEXywKLQkJCQkJc2VydmljZUV4aXN0aW5nU2VydmVyXywKLQkJCQkJdHJ1ZSwKLQkJCQkJRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBiYXNlQ29uTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlNUQU5DRV9OT1RfRk9VTkQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJCSAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkgICAgcmV0dXJuIHN0YXR1czsKLQkJCX0KLQotLy8gTTUgUG9ydDogIHJlcGxhY2luZyBpbnN0YW5jZS5pc0xvY2FsKCkgd2l0aCBpbnN0YW5jZS5nZXRGYWN0b3J5SWQoKS5pbmRleE9mKCJ0ZXN0IikgPiAwCi0JCQlpZiAoIShpbnN0YW5jZS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKS5pbmRleE9mKCIudGUiKSA+IDApKSB7Ci0JCQkJSVBhdGggaW5zdGFsbFBhdGggPSBpbnN0YW5jZS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQkJCQlJUGF0aCBzb3VyY2VQYXRoID0gaW5zdGFsbFBhdGguYXBwZW5kKAotCQkJCQkJIndlYmFwcHMiKS5hcHBlbmQoICAvLyROT04tTkxTLTEkCi0JCQkJCQlwcm9qZWN0LmdldE5hbWUoKSk7Ci0KLS8vCQkJCUlQYXRoIHdlYk1vZHVsZVBhdGggPSBSZXNvdXJjZVV0aWxzLmdldFdlYk1vZHVsZVNlcnZlclJvb3QocHJvamVjdCkuZ2V0RnVsbFBhdGgoKTsKLQkJCQlJUGF0aCB3ZWJNb2R1bGVQYXRoID0gSjJFRVV0aWxzLmdldEZpcnN0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQkJUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0KCk7Ci0JCQkJY29udGV4dC5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0JCQkJY29udGV4dC5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZCh0cnVlKTsKLQkJCQljb250ZXh0LnNldENoZWNrb3V0RmlsZXNFbmFibGVkKHRydWUpOwotCQkJCUlGaWxlIGZpbGUgPQotCQkJCQlGaWxlUmVzb3VyY2VVdGlscy5jcmVhdGVGaWxlKAotCQkJCQkJY29udGV4dCwKLQkJCQkJCXdlYk1vZHVsZVBhdGguYXBwZW5kKERFUExPWUVEU0VSVklDRVMpLAotCQkJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkJCQlzb3VyY2VQYXRoLmFwcGVuZChERVBMT1lFRFNFUlZJQ0VTKS50b09TU3RyaW5nKCkpLAotCQkJCQkJZW52LmdldFByb2dyZXNzTW9uaXRvcigpLAotCQkJCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCSAgcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkqIFNldHMgdGhlIGphdmFXU0RMUGFyYW0uCi0JKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLQkqLwotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkgewotCQlqYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KQotCXsKLQkgIHNlcnZpY2VQcm9qZWN0XyA9IHNlcnZpY2VQcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEKQotCXsKLQkgIHNlcnZpY2VTZXJ2ZXJUeXBlSURfID0gc2VydmljZVNlcnZlclR5cGVJRDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKQotCXsKLQkgIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7Ci0JfQkKLQotCS8vIHJtIAotCS8qCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTW9kZWwgbW9kZWwpCi0JewotCSAgbW9kZWxfID0gbW9kZWw7Ci0JfQotCSovCi0JCi0JcHVibGljIEJvb2xlYW4gZ2V0UHJvamVjdFJlc3RhcnRSZXF1aXJlZCgpCi0JewotCSAgcmV0dXJuIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0RlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0RlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDI0ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9EZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLkNsYXNzcGF0aFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbC5QbGF0Zm9ybVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWwuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBjb25Nc2dVdGlsc187Ci0JCi0JLy8gcm0gcHJpdmF0ZSBNb2RlbCBtb2RlbF87Ci0JcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXyA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JcHJpdmF0ZSBTdHJpbmcgamF2YUJlYW5OYW1lXzsgLy8gdGhpcyBuZWVkcyB0byBiZSBzZXQgYnkgdGhlIGV4dGVuc2lvbiB3aXRoIGluaXRpYWwgc2VsZWN0aW9uCi0JcHJpdmF0ZSBTdHJpbmcgV1NETFNlcnZpY2VVUkxfOwotCXByaXZhdGUgU3RyaW5nIFdTRExTZXJ2aWNlUGF0aG5hbWVfOwotCXByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgV1NQYXJzZXJfOwotCS8vIHJtIHByaXZhdGUgV2ViU2VydmljZUVsZW1lbnQgd3NlXzsgLy8gdGVtcG9yYXJ5Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9TRVJWRVJfSkFWQV9XU0RMX0RFRkFVTFRTIjsKLQlwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfU0VSVkVSX0pBVkFfV1NETF9ERUZBVUxUUyI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NETF9GT0xERVIgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRVhUID0gIi9zZXJ2aWNlcy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NETF9FWFQgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgYnl0ZSBNT0RFX0JFQU4gPSAoYnl0ZSkgMDsKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9FWFQgPSAiU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZCgpIHsKLQotCQlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCSAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0JICAgIGNvbk1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS5wbHVnaW4iLCB0aGlzICk7Ci0KLQkJc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JfQotCQotCi0JcHVibGljIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kKAotCQlKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtLAotCQlNb2RlbCBtb2RlbCkgewotCi0JCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQotCQlzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkJLy9ybSBzZXRNb2RlbChtb2RlbCk7Ci0JCXNldEphdmFXU0RMUGFyYW0oamF2YVdTRExQYXJhbSk7Ci0JCi0JfQotCi0JLyoqCi0JKiBFeGVjdXRlIERlZmF1bHRzRm9ySmF2YVRvV1NETFRhc2sKLQkqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZSggRW52aXJvbm1lbnQgZW52ICkgewotCi0JCVN0YXR1cyBzdGF0dXM7Ci0JCWlmIChqYXZhV1NETFBhcmFtXyA9PSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETFRhc2siLCBjb3JlTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IgKTsKLQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCWlmIChqYXZhQmVhbk5hbWVfID09IG51bGwpIHsgIC8vIGVpdGhlciBzZXQgYnkgZXh0ZW5zaW9uIHBvaW50IG9yIGJlYW4gY2xhc3MgcGFnZQotCQkJamF2YUJlYW5OYW1lXyA9IGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCk7Ci0JCQlpZiAoamF2YUJlYW5OYW1lXyA9PSBudWxsKSB7Ci0JCQkJLy9ybSBqYXZhQmVhbk5hbWVfID0gaXNkRWxlbWVudC5nZXRKYXZhQmVhbk5hbWUoKTsKLQkJCQlqYXZhV1NETFBhcmFtXy5zZXRCZWFuTmFtZShqYXZhQmVhbk5hbWVfKTsKLQkJCX0KLQkJfQotCQkvLyBybSBXU1BhcnNlcl8gPQkoV2ViU2VydmljZXNQYXJzZXIpIHdzZV8uZ2V0V1NQYXJzZXIoKTsKLQkJCi0JCWphdmFXU0RMUGFyYW1fLnNldFNlcnZlclNpZGUoSmF2YVdTRExQYXJhbWV0ZXIuU0VSVkVSX1NJREVfQkVBTik7Ci0JCWphdmFXU0RMUGFyYW1fLnNldFNrZWxldG9uRGVwbG95KGZhbHNlKTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRCZWFuTmFtZShqYXZhQmVhbk5hbWVfKTsKLQkJU3RyaW5nIGNsYXNzcGF0aCA9IENsYXNzcGF0aFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0Q2xhc3NwYXRoU3RyaW5nKHNlcnZpY2VQcm9qZWN0Xyk7Ci0JCWphdmFXU0RMUGFyYW1fLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOwotCi0JCVN0cmluZyBzaW1wbGVCZWFuTmFtZSA9IGphdmFCZWFuTmFtZV87Ci0JCVN0cmluZyBiZWFuUGFja2FnZU5hbWUgPSBudWxsOwotCQlpZiAoamF2YUJlYW5OYW1lXyAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBqYXZhQmVhbk5hbWVfLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlzaW1wbGVCZWFuTmFtZSA9IGphdmFCZWFuTmFtZV8uc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJYmVhblBhY2thZ2VOYW1lID0gamF2YUJlYW5OYW1lXy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBuYW1lc3BhY2UgPSBXU0RMVXRpbHMubWFrZU5hbWVzcGFjZShqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0KLQkJamF2YVdTRExQYXJhbV8uc2V0UG9ydFR5cGVOYW1lKHNpbXBsZUJlYW5OYW1lKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0U2VydmljZU5hbWUoc2ltcGxlQmVhbk5hbWUgKyBTRVJWSUNFX05BTUVfRVhUKTsKLQotCQlJUGF0aCBtb2R1bGVTZXJ2ZXJSb290ID0gbnVsbDsKLQotCQlJUGF0aCBtb2R1bGVQYXRoID0gc2VydmljZVByb2plY3RfLmdldEZ1bGxQYXRoKCk7Ci0JCUlQYXRoIHdlYmluZlBhdGggPSBzZXJ2aWNlUHJvamVjdF8uZ2V0RnVsbFBhdGgoKTsKLQkJdHJ5IHsKLQkJCWlmICggUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3Qoc2VydmljZVByb2plY3RfKSkgewotCQkJCW1vZHVsZVNlcnZlclJvb3QgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbihzZXJ2aWNlUHJvamVjdF8pOwotCQkJCS8vIHNob3VsZCB1c2UgTW9kdWxlQ29yZS5nZXRTb3VyY2VDb250YWluZXJzKCk7Ci0vLwkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IFJlc291cmNlVXRpbHMuZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChzZXJ2aWNlUHJvamVjdF8pOwotLy8JCQkJaWYgKGNvbnRhaW5lciE9bnVsbCkgewotLy8JCQkJCW1vZHVsZVNlcnZlclJvb3QgPSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKTsKLS8vCQkJCX0KLQkJCQkKLQkJCQltb2R1bGVQYXRoID0gbW9kdWxlUGF0aC5hcHBlbmQoSjJFRVV0aWxzLmdldEZpcnN0V2ViTW9kdWxlTmFtZShzZXJ2aWNlUHJvamVjdF8pKTsKLQkJCQl3ZWJpbmZQYXRoID0gSjJFRVV0aWxzLmdldEZpcnN0V2ViSW5mUGF0aChzZXJ2aWNlUHJvamVjdF8pOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSAgbmV3IFNpbXBsZVN0YXR1cyggIkRlZmF1bHRzRm9yU2VydmVySmF2YVdTRExUYXNrIiwgY29uTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ERUZBVUxUX0JFQU4iKSwgU3RhdHVzLkVSUk9SLCBlICk7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJSVBhdGggd3NkbFBhdGggPQotCQkJbW9kdWxlUGF0aC5hcHBlbmQoV1NETF9GT0xERVIpLmFwcGVuZChzaW1wbGVCZWFuTmFtZSkuYWRkRmlsZUV4dGVuc2lvbihXU0RMX0VYVCk7Ci0KLQkJdHJ5ewotCQkJSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRGb2xkZXIobW9kdWxlUGF0aC5hcHBlbmQoV1NETF9GT0xERVIpKTsKLQkJCUZpbGVVdGlsLmNyZWF0ZUZvbGRlcihmb2xkZXIsIHRydWUsIHRydWUpOwotCQkKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIkRlZmF1bHRzRm9yU2VydmVySmF2YVdTRExUYXNrIiwgY29uTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XUklURV9XU0RMIiksIFN0YXR1cy5FUlJPUiwgZSApOwotCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkKLQkJU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZpbGUod3NkbFBhdGgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRPdXRwdXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0SW5wdXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLQkJV1NETFNlcnZpY2VQYXRobmFtZV8gPSB3c2RsUGF0aC50b1N0cmluZygpOwotCi0JCWlmICh3c2RsUGF0aCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgd3NkbFVSTCA9IFBsYXRmb3JtVXRpbHMuZ2V0RmlsZVVSTEZyb21QYXRoKG5ldyBQYXRoKHdzZGxMb2NhdGlvbikpOwotCQkJV1NETFNlcnZpY2VVUkxfID0gd3NkbFVSTDsKLQkJCS8vIHNldCBwYXJzZXIgCi0JCQlpZiAod3NkbFVSTCA9PSBudWxsIHx8IHdzZGxVUkwubGVuZ3RoKCkgPD0gMCkgewotCQkJCUlSZXNvdXJjZSByZXMgPQotCQkJCQlSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShXU0RMU2VydmljZVBhdGhuYW1lXyk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCQl3c2RsVVJMID0gKG5ldyBVdGlscygpKS50b0ZpbGVTeXN0ZW1VUkkocmVzKTsKLQkJCX0KLQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0JCQlpZiAod3NkbFVSTCAhPSBudWxsICYmIHdzZGxVUkwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaWYgKFdTUGFyc2VyXyA9PSBudWxsKSB7Ci0JCQkJCVdTUGFyc2VyXyA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotCQkJCX0KLQkJCQlkZWZpbml0aW9uID0gV1NQYXJzZXJfLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotCQkJfQotCQl9Ci0KLQkJamF2YVdTRExQYXJhbV8uc2V0U3R5bGUoSmF2YVdTRExQYXJhbWV0ZXIuU1RZTEVfUlBDKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0VXNlKEphdmFXU0RMUGFyYW1ldGVyLlVTRV9FTkNPREVEKTsKLQotCQlTdHJpbmcgcHJvamVjdFVSTCA9CVJlc291cmNlVXRpbHMuZ2V0RW5jb2RlZFdlYlByb2plY3RVUkwoc2VydmljZVByb2plY3RfKTsKLQkJU3RyaW5nIHNlcnZpY2VVUkwgPSBudWxsOwotCQlpZiAocHJvamVjdFVSTCA9PSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETFRhc2siLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BST0pFQ1RfVVJMIiksIFN0YXR1cy5FUlJPUik7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCXNlcnZpY2VVUkwgPSBwcm9qZWN0VVJMICsgU0VSVklDRV9FWFQgKyBzaW1wbGVCZWFuTmFtZTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRVcmxMb2NhdGlvbihzZXJ2aWNlVVJMKTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRNZXRhSW5mT25seSh0cnVlKTsKLQotCQkvLwkJU3RyaW5nIGphdmFPdXRwdXQgPSBQbGF0Zm9ybVV0aWxzLmdldFBsYXRmb3JtVVJMKG1vZHVsZVNlcnZlclJvb3QpOwotCQkvLwkJU3RyaW5nIG91dHB1dCA9IFBsYXRmb3JtVXRpbHMuZ2V0UGxhdGZvcm1VUkwobW9kdWxlUGF0aCk7Ci0KLQkJU3RyaW5nIGphdmFPdXRwdXQgPQlSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShtb2R1bGVTZXJ2ZXJSb290KS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCi0JCVN0cmluZyBzZXJ2aWNlTmFtZSA9IGphdmFXU0RMUGFyYW1fLmdldFNlcnZpY2VOYW1lKCk7Ci0JCUlQYXRoIG91dHB1dFBhdGggPQlSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh3ZWJpbmZQYXRoKS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgb3V0cHV0ID0gc2VydmljZVByb2plY3RfLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJaWYgKG91dHB1dFBhdGghPW51bGwpCi0JCSBvdXRwdXQgPSBvdXRwdXRQYXRoLmFwcGVuZChzZXJ2aWNlTmFtZSkudG9TdHJpbmcoKTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRKYXZhT3V0cHV0KGphdmFPdXRwdXQpOwotCQlqYXZhV1NETFBhcmFtXy5zZXRPdXRwdXQob3V0cHV0KTsKLQkJCi0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGphdmFXU0RMUGFyYW0uCi0JICogQHJldHVybiBKYXZhV1NETFBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotCQlyZXR1cm4gamF2YVdTRExQYXJhbV87Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLQkgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJdGhpcy5qYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0JfQotCi0JLy8gcm0KLQkvKgotCXB1YmxpYyB2b2lkIHNldE1vZGVsKE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWxfID0gbW9kZWw7Ci0JfQotCSovCi0JCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpIHsKLQkJdGhpcy5zZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SmF2YUJlYW5OYW1lKFN0cmluZyBqYXZhQmVhbk5hbWUpIHsKLQkJdGhpcy5qYXZhQmVhbk5hbWVfID0gamF2YUJlYW5OYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFdTRExTZXJ2aWNlVVJMKCkgewotCQlyZXR1cm4gV1NETFNlcnZpY2VVUkxfOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFdTRExTZXJ2aWNlUGF0aG5hbWUoKSB7Ci0JCXJldHVybiBXU0RMU2VydmljZVBhdGhuYW1lXzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdzUGFyc2VyKSB7Ci0JCXRoaXMuV1NQYXJzZXJfID0gd3NQYXJzZXI7Ci0JfQotCQotCXB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBXU1BhcnNlcl87Ci0JfQotCi0gIHB1YmxpYyB2b2lkIHNldE9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAob2JqZWN0U2VsZWN0aW9uICE9IG51bGwgJiYgIW9iamVjdFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IG9iamVjdFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHNldEphdmFCZWFuTmFtZSgoU3RyaW5nKW9iamVjdCk7Ci0gICAgfQotICB9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9MaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0xpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzZjM0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0xpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIExpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfTElURVJBTF9TVVBQT1JUX01FU1NBR0UiOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0KLQkJIlRBU0tfREVTQ19MSVRFUkFMX1NVUFBPUlRfTUVTU0FHRSI7Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIGNvcmVNc2dVdGlsc187Ci0KLQlwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCi0JcHVibGljIExpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2soKSB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQrIi5wbHVnaW4iLCB0aGlzKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CQotCX0KLQkKLQlwdWJsaWMgTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzayhKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQrIi5wbHVnaW4iLCB0aGlzKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CQotCQlqYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0KLQl9Ci0KLQotCS8qKgotCSogRXhlY3V0ZSBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkJaWYgKGphdmFXU0RMUGFyYW1fID09IG51bGwpIHsKLQkJICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsY29yZU1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSkFWQV9XU0RMX1BBUkFNX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICAgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlTdHJpbmcgdXNlID0gamF2YVdTRExQYXJhbV8uZ2V0VXNlKCk7Ci0JCWlmKHVzZSAhPSBudWxsICYmIAotCQkJdXNlLmVxdWFscyhKYXZhV1NETFBhcmFtZXRlci5VU0VfTElURVJBTCkpewotCQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0xJVEVSQUxfU1VQUE9SVF9NRVNTQUdFIiksIFN0YXR1cy5XQVJOSU5HKTsKLQkJICAgIHRyeQotCQkJewotCQkgICAgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0JCSAgICB9Ci0JCSAgICBjYXRjaChTdGF0dXNFeGNlcHRpb24gc2UpCi0JCQl7Ci0JCSAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwiVXNlciBhYm9ydGVkIixTdGF0dXMuRVJST1IpOwotCQkgICAgfQotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLQl7Ci0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL01vdmVEZXBsb3ltZW50RmlsZXNUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL01vdmVEZXBsb3ltZW50RmlsZXNUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOGJjMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9Nb3ZlRGVwbG95bWVudEZpbGVzVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSVdlYk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5KMkVFV2ViTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIE1vdmVEZXBsb3ltZW50RmlsZXNUYXNrIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX01PVkVfREVQTE9ZTUVOVF9GSUxFUyI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX01PVkVfREVQTE9ZTUVOVF9GSUxFUyI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsJLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIGNvcmVNc2dVdGlsc187Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OwotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCQotCXB1YmxpYyBNb3ZlRGVwbG95bWVudEZpbGVzVGFzaygpCi0gIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgfQotCi0gIC8qKgotCSogRXhlY3V0ZSBEZWZhdWx0c0ZvckphdmFUb1dTRExUYXNrCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkJaWYgKGphdmFXU0RMUGFyYW1fID09IG51bGwpIHsKLQkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLGNvcmVNc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLQkJU3RyaW5nIHByb2plY3RVUkwgPSBSZXNvdXJjZVV0aWxzLmdldEVuY29kZWRXZWJQcm9qZWN0VVJMKHByb2plY3QpOwotCQlpZiAocHJvamVjdFVSTCA9PSBudWxsKSB7Ci0JCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9VUkwiLG5ldyBTdHJpbmdbXSB7IHByb2plY3QudG9TdHJpbmcoKX0pLCBTdGF0dXMuRVJST1IpOwotCQkgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICAgcmV0dXJuIHN0YXR1czsJCSAgCi0JCX0gZWxzZSB7Ci0JCQlqYXZhV1NETFBhcmFtXy5zZXRQcm9qZWN0VVJMKHByb2plY3RVUkwpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkpCi0JCQkJcmV0dXJuIHN0YXR1czsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCSAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVEVSQUwiKSwgU3RhdHVzLkVSUk9SLCBleCk7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7CQkgIAotCQl9Ci0JCVN0cmluZ1tdIGRlcGxveUZpbGVzID0gamF2YVdTRExQYXJhbV8uZ2V0RGVwbG95bWVudEZpbGVzKCk7Ci0JCVN0cmluZyBqYXZhT3V0cHV0ID0gamF2YVdTRExQYXJhbV8uZ2V0SmF2YU91dHB1dCgpOwotCi0JCWlmIChkZXBsb3lGaWxlcyA9PSBudWxsIHx8IGphdmFPdXRwdXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0KLQkJSVBhdGggd2ViaW5mUGF0aCA9IHByb2plY3QuZ2V0TG9jYXRpb24oKTsKLQkJdHJ5IHsKLQotCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpKSB7Ci0JCQkJSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViUHJvamVjdCA9Ci0JCQkJCShKMkVFV2ViTmF0dXJlUnVudGltZSkgcHJvamVjdC5nZXROYXR1cmUoCi0JCQkJCQlJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLQkJCQl3ZWJpbmZQYXRoID0gd2ViaW5mUGF0aC5hcHBlbmQod2ViUHJvamVjdC5nZXRXRUJJTkZQYXRoKCkpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBsb3lGaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkZXBsb3lGaWxlc1tpXSk7Ci0gICAgICAgIFN0cmluZyByZXNvdXJjZVRvTW92ZSA9IGYuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyB0YXJnZXRGaWxlTmFtZSA9IHdlYmluZlBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQocmVzb3VyY2VUb01vdmUpLnRvU3RyaW5nKCk7Ci0JCQkJRmlsZVV0aWwuY3JlYXRlVGFyZ2V0RmlsZShkZXBsb3lGaWxlc1tpXSwgdGFyZ2V0RmlsZU5hbWUsIHRydWUpOwotCQkJCUZpbGUgZGVwbG95bWVudEZpbGUgPSBuZXcgRmlsZShkZXBsb3lGaWxlc1tpXSk7Ci0JCQkJZGVwbG95bWVudEZpbGUuZGVsZXRlKCk7Ci0JCQkJZGVwbG95RmlsZXNbaV0gPSB0YXJnZXRGaWxlTmFtZTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NT1ZFX1JFU09VUkNFIixuZXcgU3RyaW5nW10geyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBTdGF0dXMuRVJST1IsIGUpOwotCQkgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICByZXR1cm4gc3RhdHVzOwkJICAKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpCi0JewotCQlyZXR1cm4gamF2YVdTRExQYXJhbV87Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLQl7Ci0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0KQotCXsKLQkgIHRoaXMuc2VydmVyUHJvamVjdCA9IHNlcnZlclByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9Nb3ZlSmF2YUZpbGVzVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9Nb3ZlSmF2YUZpbGVzVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQ4M2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svTW92ZUphdmFGaWxlc1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2s7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgTW92ZUphdmFGaWxlc1Rhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfTU9WRV9KQVZBX0ZJTEVTIjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfTU9WRV9KQVZBX0ZJTEVTIjsKLQotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIGNvcmVNc2dVdGlsc187Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JLy8gcm0gcHJpdmF0ZSBNb2RlbCBtb2RlbF87Ci0KLQlwdWJsaWMgTW92ZUphdmFGaWxlc1Rhc2soKSB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCSAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0JICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsJICAKLQl9Ci0JCi0KLQlwdWJsaWMgTW92ZUphdmFGaWxlc1Rhc2soSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkgewotCSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CSAgCi0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQotCX0KLQotCS8qKgotCSogRXhlY3V0ZSBEZWZhdWx0c0ZvckphdmFUb1dTRExUYXNrCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0JICAKLQkgIC8vIHJtIAotCSAgLyoKLQkgIC8vQmVnaW4gU2V0dGVycwotCSAgV2ViU2VydmljZUVsZW1lbnQgd3NlID0KLQkJCVdlYlNlcnZpY2VFbGVtZW50LmdldFdlYlNlcnZpY2VFbGVtZW50KG1vZGVsXyk7Ci0JICBzZXRTZXJ2aWNlUHJvamVjdCh3c2UuZ2V0U2VydmljZVByb2plY3QoKSk7Ci0JICAvL0VuZCBTZXR0ZXJzCi0JICAqLwotCSAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCSAgCi0JCWlmIChqYXZhV1NETFBhcmFtXyA9PSBudWxsKSB7Ci0JCSAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixjb3JlTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICByZXR1cm4gc3RhdHVzOwkJICAKLQkJfQotCi0JCS8vIHJtIAotCQkvKgotCQlpZiAobW9kZWxfID09IG51bGwpIHsKLQkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTU9ERUxfTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkgIHJldHVybiBzdGF0dXM7CQkgIAotCQl9Ci0JCSovCi0KLQkJSVByb2plY3QgcHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0XzsKLQkJU3RyaW5nIHByb2plY3RVUkwgPSBSZXNvdXJjZVV0aWxzLmdldEVuY29kZWRXZWJQcm9qZWN0VVJMKHByb2plY3QpOwotCQlpZiAocHJvamVjdFVSTCA9PSBudWxsKSB7Ci0JCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9VUkwiLG5ldyBTdHJpbmdbXSB7cHJvamVjdC50b1N0cmluZygpfSksIFN0YXR1cy5FUlJPUik7Ci0JCSAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCSAgICByZXR1cm4gc3RhdHVzOwkJICAKLQotCQl9IGVsc2UgewotCQkJamF2YVdTRExQYXJhbV8uc2V0UHJvamVjdFVSTChwcm9qZWN0VVJMKTsKLQkJfQotCi0JCVN0cmluZ1tdIGphdmFGaWxlcyA9IGphdmFXU0RMUGFyYW1fLmdldEphdmFGaWxlcygpOwotCQlTdHJpbmcgamF2YW91dHB1dCA9IGphdmFXU0RMUGFyYW1fLmdldEphdmFPdXRwdXQoKTsgIC8vIDx3ZWJwcm9qZWN0Pi9KYXZhU291cmNlCi0JCVN0cmluZyBvdXRwdXQgPSBqYXZhV1NETFBhcmFtXy5nZXRPdXRwdXQoKTsgIAkJIC8vIDx3ZWJwcm9qZWN0Pi9XZWJDb250ZW50L01FVEFfSU5GCi0KLQkJaWYoamF2YUZpbGVzID09IG51bGwgfHwgamF2YW91dHB1dCA9PSBudWxsICYmIG91dHB1dCA9PSBudWxsICl7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyByZXNvdXJjZVRvTW92ZSA9IGphdmFGaWxlc1tpXS5zdWJzdHJpbmcob3V0cHV0Lmxlbmd0aCgpKTsKLQkJCQlTdHJpbmcgdGFyZ2V0RmlsZU5hbWUgPSBqYXZhb3V0cHV0ICsgcmVzb3VyY2VUb01vdmU7Ci0JCQkJRmlsZSByZXN1bHRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RmlsZU5hbWUpOwotCQkJCS8vIGNvcHkgamF2YSBmaWxlcyB0aGF0IHdpdGhvdXQgb3Zlcnd0cml0aW5nIGV4aXN0aW5nIG9uZXMKLS8vCQkJCWlmICghcmVzdWx0RmlsZS5leGlzdHMoKSkgewotLy8JCQkJCUZpbGVVdGlsLmNyZWF0ZVRhcmdldEZpbGUoCi0vLwkJCQkJCWphdmFGaWxlc1tpXSwKLS8vCQkJCQkJamF2YW91dHB1dCArIHJlc291cmNlVG9Nb3ZlKTsKLS8vCQkJCX0KLQkJCQkvLyBkZWxldGUgamF2YSBmaWxlcyBmcm9tIHRoZSBvdXRwdXQgZGlyZWN0b3J5Ci0JCQkJRmlsZSBzb3VyY2UgPSBuZXcgRmlsZShqYXZhRmlsZXNbaV0pOwotCQkJCXNvdXJjZS5kZWxldGUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTU9WRV9SRVNPVVJDRSIsbmV3IFN0cmluZ1tde2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIFN0YXR1cy5FUlJPUiwgZSk7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7CQkgIAotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLQl7Ci0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0JCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtXzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpCi0JewotCSAgc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci0JfQotCQotCS8vIHJtCi0JLyoKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChNb2RlbCBtb2RlbCkKLQl7Ci0JICBtb2RlbF8gPSBtb2RlbDsKLQl9Ci0JKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svU2tlbGV0b24yV1NETENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svU2tlbGV0b24yV1NETENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxYTU1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL1NrZWxldG9uMldTRExDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvamVjdC5FSkJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSUVKQk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklXZWJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSjJFRVdlYk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLlBsYXRmb3JtVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbC5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNvcHlXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgU2tlbGV0b24yV1NETENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1NLRUxFVE9OX1dTREwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX1NLRUxFVE9OX1dTREwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTCA9ICJJbXBsIjsJLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9FWFQgPSAiL3NlcnZpY2VzLyI7CS8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRVhUID0gIndzZGwiOwkvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1QgPSAiLiI7CS8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNMQVNIID0gIi8iOwkvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9TVUZGSVggPSAiOi8vIjsJLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBXU0RMX0ZPTERFUiA9ICJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW07Ci0gIHByaXZhdGUgSVByb2plY3Qgc2VydmVyUHJvamVjdDsKLSAgcHJpdmF0ZSBIYXNoTWFwIHZpc2l0ZWRMaW5rczsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0gIHB1YmxpYyBTa2VsZXRvbjJXU0RMQ29tbWFuZCgpIHsKLSAgICBzdXBlcihXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZShMQUJFTCksIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBzZXROYW1lKCBMQUJFTCApOwotICAgIHNldERlc2NyaXB0aW9uKCBERVNDUklQVElPTiApOwotICB9Ci0KLSAgLyoqCi0gICogRXhlY3V0ZSBTa2VsZXRvbjJXU0RMQ29tbWFuZAotICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgaWYgKCEoZW52IGluc3RhbmNlb2YgRWNsaXBzZUVudmlyb25tZW50KSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9UX0lOX0VDTElQU0VfRU5WSVJPTk1FTlQiLCBuZXcgU3RyaW5nW10geyJTa2VsZXRvbjJXU0RMQ29tbWFuZCJ9KSwgU3RhdHVzLkVSUk9SLCBudWxsKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGlmIChqYXZhV1NETFBhcmFtID09IG51bGwpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAvLyBSZWFkIFdTREwKLSAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQlTdHJpbmcgd3NkbFVSTCA9IGphdmFXU0RMUGFyYW0uZ2V0SW5wdXRXc2RsTG9jYXRpb24oKTsKLQl0cnkKLQl7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKHdzZGxVUkwpOwotCQlkZWZpbml0aW9uID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24odXJsLnRvU3RyaW5nKCkpOwotCX0KLQljYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQl7Ci0JCXdzZGxVUkwgPSBQbGF0Zm9ybVV0aWxzLmdldEZpbGVVUkxGcm9tUGF0aChuZXcgUGF0aCh3c2RsVVJMKSk7Ci0JCWRlZmluaXRpb24gPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLQl9Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBiZWFuIHNrZWxldG9uCi0gICAgU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICBQb3J0IHBvcnQgPSBudWxsOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBiZWFuTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGJlYW5OYW1lLmFwcGVuZChXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWUoZGVmaW5pdGlvbikpOwotICAgICAgYmVhbk5hbWUuYXBwZW5kKERPVCk7Ci0gICAgICB0cnl7Ci0gICAgICBzZXJ2aWNlID0gKFNlcnZpY2UpIGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgIHBvcnQgPSAoUG9ydCkgc2VydmljZS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0gICAgICBiZWFuTmFtZS5hcHBlbmQoYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgIGJlYW5OYW1lLmFwcGVuZChJTVBMKTsKLSAgICAgIGphdmFXU0RMUGFyYW0uc2V0QmVhbk5hbWUoYmVhbk5hbWUudG9TdHJpbmcoKSk7Ci0KLSAgICAgIGphdmFXU0RMUGFyYW0uc2V0UG9ydFR5cGVOYW1lKFdTRExVdGlscy5nZXRQb3J0VHlwZU5hbWUoZGVmaW5pdGlvbikpOwotICAgICAgamF2YVdTRExQYXJhbS5zZXRTZXJ2aWNlTmFtZSgKLSAgICAgICAgV1NETFV0aWxzLmdldFNlcnZpY2VFbGVtZW50TmFtZShkZWZpbml0aW9uKSk7Ci0gICAgICBqYXZhV1NETFBhcmFtLnNldEJlYW5QYWNrYWdlKFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZShkZWZpbml0aW9uKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChUaHJvd2FibGUgZSl7Ci0gICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICB9IAotICAgIGVsc2UgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dTRExfTk9fREVGSU5JVElPTiIsIG5ldyBTdHJpbmdbXSB7d3NkbFVSTH0pLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvLyBNb2RpZnkgV1NETCBlbmRwb2ludAotICAgIGlmIChwb3J0ID09IG51bGwpIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XU0RMX05PX1BPUlQiLCBuZXcgU3RyaW5nW10ge3dzZGxVUkx9KSwgU3RhdHVzLkVSUk9SLCBudWxsKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIE1hcCBzZXJ2aWNlcyA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXQgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzID0gKFNlcnZpY2Upc2VydmljZXNJdC5uZXh0KCk7Ci0gICAgICBNYXAgcG9ydHMgPSBzLmdldFBvcnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIHBvcnRzSXQgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBwb3J0c0l0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcCA9IChQb3J0KXBvcnRzSXQubmV4dCgpOwotICAgICAgICBtb2RpZnlFbmRwb2ludChwKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2aXNpdGVkTGlua3MgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLy8gU2V0IFdTREwgZmlsZSBuYW1lOiBqYXZhV1NETFBhcmFtLnNldE91dHB1dFdzZGxMb2NhdGlvbigpOwotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLSAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gamF2YVdTRExQYXJhbS5nZXRPdXRwdXRXc2RsTG9jYXRpb24oKTsKLSAgICBJUGF0aCB3c2RsUGF0aCA9IG51bGw7Ci0gICAgSUZpbGUgb3V0cHV0RmlsZSA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgaWYod3NkbExvY2F0aW9uICE9IG51bGwpewotCQlvdXRwdXRGaWxlID0gd29ya3NwYWNlLmdldEZpbGVGb3JMb2NhdGlvbiggbmV3IFBhdGgod3NkbExvY2F0aW9uKSk7Ci0gICAgIH0KLSAgICAgZWxzZXsKLQkJd3NkbFBhdGggPSBzZXJ2ZXJQcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCWlmIChzZXJ2ZXJQcm9qZWN0Lmhhc05hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSkgewotCQkJICAgSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViUHJvamVjdCA9Ci0JCQkJIChKMkVFV2ViTmF0dXJlUnVudGltZSkgc2VydmVyUHJvamVjdC5nZXROYXR1cmUoCi0JCQkJICAgSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCk7Ci0JCQkgICB3c2RsUGF0aCA9IHdlYlByb2plY3QuZ2V0V2ViTW9kdWxlUGF0aCgpOwotCQkJICAgLy93c2RsUGF0aCA9IHdzZGxQYXRoLmFwcGVuZCh3ZWJQcm9qZWN0LmdldFdFQklORlBhdGgoKSk7Ci0JCQkgfQotCQllbHNlIGlmIChzZXJ2ZXJQcm9qZWN0Lmhhc05hdHVyZShJRUpCTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpCi0JCXsKLQkJCUVKQk5hdHVyZVJ1bnRpbWUgZWpiUHJvamVjdCA9IEVKQk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShzZXJ2ZXJQcm9qZWN0KTsKLQkJCXdzZGxQYXRoID0gd3NkbFBhdGguYXBwZW5kKGVqYlByb2plY3QuZ2V0TWV0YUZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpKTsKLQkJfQkJCi0KLQkJCSBJUGF0aCB3c2RsRmlsZVBhdGggPSB3c2RsUGF0aC5hcHBlbmQoV1NETF9GT0xERVIpLmFwcGVuZChwb3J0LmdldE5hbWUoKSkuYWRkRmlsZUV4dGVuc2lvbihXU0RMX0VYVCk7Ci0JCSAgICAgSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZVV0aWxzCi0JCQkJCQkJCS5nZXRXb3Jrc3BhY2VSb290KCkKLQkJCQkJCQkJLmdldEZvbGRlcih3c2RsUGF0aC5hcHBlbmQoV1NETF9GT0xERVIpKTsKLQkJCSBGaWxlVXRpbC5jcmVhdGVGb2xkZXIoZm9sZGVyLCB0cnVlLCB0cnVlKTsJCi0JCSAgICAgb3V0cHV0RmlsZSA9IHdvcmtzcGFjZS5nZXRGaWxlKHdzZGxGaWxlUGF0aCk7Ci0JCQkgd3NkbExvY2F0aW9uID0gb3V0cHV0RmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkgamF2YVdTRExQYXJhbS5zZXRPdXRwdXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLQkJCSAKLSAgICAgfQotCi0gICAgIC8vIGNvcHkgV1NETAotICAgICBDb3B5V1NETENvbW1hbmQgY29weVdTRExDb21tYW5kID0gbmV3IENvcHlXU0RMQ29tbWFuZCgpOwotICAgICBjb3B5V1NETENvbW1hbmQuc2V0V2ViU2VydmljZXNQYXJzZXIod2ViU2VydmljZXNQYXJzZXIpOwotICAgICBjb3B5V1NETENvbW1hbmQuc2V0V3NkbFVSSSh3c2RsVVJMKTsKLSAgICAgY29weVdTRExDb21tYW5kLnNldERlc3RpbmF0aW9uVVJJKG91dHB1dEZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotICAgICBjb3B5V1NETENvbW1hbmQuc2V0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgU3RhdHVzIHN0YXR1cyA9IGNvcHlXU0RMQ29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgIGlmKHN0YXR1cyE9bnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKSB7Ci0gICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgfQotICAgIH0gCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1JJVEVfV1NETCIsIG5ldyBTdHJpbmdbXSB7IHdzZGxMb2NhdGlvbiB9KSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RhdHVzIG1vZGlmeUVuZHBvaW50KFBvcnQgcG9ydCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzID0gbnVsbDsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0gICAgICB7Ci0gICAgICAgIHNvYXBBZGRyZXNzID0gKFNPQVBBZGRyZXNzKW9iajsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChzb2FwQWRkcmVzcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwcm9qZWN0VVJMID0gUmVzb3VyY2VVdGlscy5nZXRFbmNvZGVkV2ViUHJvamVjdFVSTChzZXJ2ZXJQcm9qZWN0KTsKLSAgICAgIGlmIChwcm9qZWN0VVJMID09IG51bGwpCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX1VSTCIsIG5ldyBTdHJpbmdbXSB7c2VydmVyUHJvamVjdC50b1N0cmluZygpfSksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2VydmljZVVSTCA9IG5ldyBTdHJpbmdCdWZmZXIocHJvamVjdFVSTCk7Ci0gICAgICBzZXJ2aWNlVVJMLmFwcGVuZChTRVJWSUNFX0VYVCkuYXBwZW5kKHBvcnQuZ2V0TmFtZSgpKTsKLSAgICAgIGphdmFXU0RMUGFyYW0uc2V0VXJsTG9jYXRpb24oc2VydmljZVVSTC50b1N0cmluZygpKTsKLSAgICAgIHNvYXBBZGRyZXNzLnNldExvY2F0aW9uVVJJKHNlcnZpY2VVUkwudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLSAgKiBAcmV0dXJuIEphdmFXU0RMUGFyYW1ldGVyCi0gICovCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotICAgIHJldHVybiBqYXZhV1NETFBhcmFtOwotICB9Ci0KLSAgLyoqCi0gICogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLSAgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0gICAgdGhpcy5qYXZhV1NETFBhcmFtID0gamF2YVdTRExQYXJhbTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2VydmVyUHJvamVjdCBUaGUgc2VydmVyUHJvamVjdCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KElQcm9qZWN0IHNlcnZlclByb2plY3QpIHsKLSAgICB0aGlzLnNlcnZlclByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKSB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciBUaGUgd2ViU2VydmljZXNQYXJzZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEphdmFXU0RMUGFyYW0oKS5nZXRPdXRwdXRXc2RsTG9jYXRpb24oKSk7IAotICAgIFN0cmluZyB1cmwgPSAiIjsKLQkgIHRyeSB7Ci0gICAgCXVybCA9IGZpbGUudG9VUkwoKS50b1N0cmluZygpOwotICAgIH0KLQkgIGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpe30KLQlyZXR1cm4gdXJsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svVXBkYXRlQXhpc1dTRERGaWxlVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9VcGRhdGVBeGlzV1NEREZpbGVUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjA0NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9VcGRhdGVBeGlzV1NEREZpbGVUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklXZWJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQkKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1VQREFURV9BWElTX1dTREQiOwkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfVVBEQVRFX0FYSVNfV1NERCI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVQTE9ZX1hTTCA9ICJkZXBsb3kueHNsIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIERFUExPWV9CQUsgPSAiZGVwbG95LndzZGQuYmFrIjsJCS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfUEFSQU0gPSAibmV3Q2xhc3NOYW1lIjsJCS8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gICAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLQlwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCXByaXZhdGUgSVByb2plY3Qgc2VydmljZVByb2plY3RfOwotCS8vIHJtIHByaXZhdGUgTW9kZWwgbW9kZWxfOwotCi0JcHVibGljIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2soKSB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCSAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0JICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsJICAgIAotCX0KLQkKLQlwdWJsaWMgVXBkYXRlQXhpc1dTRERGaWxlVGFzayhKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCSAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0JICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsJICAgIAotCQlqYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0JfQotCi0JLyoqCi0JKiBFeGVjdXRlIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2sKLQkqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQkgIAotCSAgLy8gcm0KLQkgIC8qCi0JICAvL0JlZ2luIFNldHRlcnMKLQkgIFdlYlNlcnZpY2VFbGVtZW50IHdzZSA9Ci0JCVdlYlNlcnZpY2VFbGVtZW50LmdldFdlYlNlcnZpY2VFbGVtZW50KG1vZGVsXyk7Ci0JICBzZXRTZXJ2aWNlUHJvamVjdCh3c2UuZ2V0U2VydmljZVByb2plY3QoKSk7Ci0JICAvL0VuZCBTZXR0ZXJzCi0JICAqLwotCSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7CQkKLQkJaWYgKGphdmFXU0RMUGFyYW1fID09IG51bGwpIHsKLQkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLGNvcmVNc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7CQkgIAotCQl9Ci0KLQkJLy8gcm0gCi0JCS8qCi0JCWlmIChtb2RlbF8gPT0gbnVsbCkgewotCQkgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NT0RFTF9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0JCSAgcmV0dXJuIHN0YXR1czsJCSAgCi0JCX0KLQkJKi8KLQkKLQkJSVByb2plY3QgcHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0XzsKLQkJU3RyaW5nIHByb2plY3RVUkwgPSBSZXNvdXJjZVV0aWxzLmdldEVuY29kZWRXZWJQcm9qZWN0VVJMKHByb2plY3QpOwotCQlpZiAocHJvamVjdFVSTCA9PSBudWxsKSB7Ci0JCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9VUkwiLG5ldyBTdHJpbmdbXSB7cHJvamVjdC50b1N0cmluZygpfSksIFN0YXR1cy5FUlJPUik7Ci0JCSAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCSAgICByZXR1cm4gc3RhdHVzOwkJICAKLQkJfSBlbHNlIHsKLQkJCWphdmFXU0RMUGFyYW1fLnNldFByb2plY3RVUkwocHJvamVjdFVSTCk7Ci0JCX0KLQkJU3RyaW5nIG91dHB1dExvY2F0aW9uID0gamF2YVdTRExQYXJhbV8uZ2V0SmF2YU91dHB1dCgpOwotCQlpZiAob3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQl0cnkgewotCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSkKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlRFUkFMIiksIFN0YXR1cy5FUlJPUiwgZXgpOwotCQkgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICAgcmV0dXJuIHN0YXR1czsJCSAgCi0JCX0KLQkJU3RyaW5nW10gamF2YUZpbGVzID0gamF2YVdTRExQYXJhbV8uZ2V0SmF2YUZpbGVzKCk7Ci0JCVN0cmluZyBqYXZhb3V0cHV0ID0gamF2YVdTRExQYXJhbV8uZ2V0SmF2YU91dHB1dCgpOwotCQlTdHJpbmcgb3V0cHV0ID0gamF2YVdTRExQYXJhbV8uZ2V0T3V0cHV0KCk7Ci0KLS8vCQlTdHJpbmcgd2ViQ29udGVudFBhdGggPQlSZXNvdXJjZVV0aWxzLmdldFdlYk1vZHVsZVNlcnZlclJvb3QocHJvamVjdCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlTdHJpbmcgd2ViQ29udGVudFBhdGggPQlKMkVFVXRpbHMuZ2V0Rmlyc3RXZWJDb250ZW50Q29udGFpbmVyKHByb2plY3QpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJdHJ5IHsKLQotCQkJaWYgKGphdmFXU0RMUGFyYW1fLmdldERlcGxveW1lbnRGaWxlcygpICE9IG51bGwKLQkJCQkmJiBqYXZhV1NETFBhcmFtXy5nZXREZXBsb3ltZW50RmlsZXMoKS5sZW5ndGggPiAwKSB7Ci0KLQkJCQlTdHJpbmcgd3NkZF9kZXBsb3kgPSBqYXZhV1NETFBhcmFtXy5nZXREZXBsb3ltZW50RmlsZXMoKVswXTsKLQkJCQlQYXRoIGRlcGxveVBhdGggPSBuZXcgUGF0aCh3c2RkX2RlcGxveSk7Ci0JCQkJU3RyaW5nIGRlcGxveUJhY2t1cCA9Ci0JCQkJCWRlcGxveVBhdGgKLQkJCQkJCS5yZW1vdmVMYXN0U2VnbWVudHMoMSkKLQkJCQkJCS5hcHBlbmQoREVQTE9ZX0JBSykKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCUZpbGVVdGlsLmNyZWF0ZVRhcmdldEZpbGUod3NkZF9kZXBsb3ksIGRlcGxveUJhY2t1cCwgdHJ1ZSk7Ci0JCQkJU3RyaW5nIGRlcGxveVhTTCA9IGdldFBsdWdpbkZpbGVQYXRoKERFUExPWV9YU0wpLnRvU3RyaW5nKCk7Ci0KLQkJCQlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCQkJCS8vIFVzZSB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IHRvIGluc3RhbnRpYXRlIGEgVHJhbnNmb3JtZXIgdGhhdCB3aWxsIHdvcmsgd2l0aCAgCi0JCQkJLy8gdGhlIHN0eWxlc2hlZXQgeW91IHNwZWNpZnkuIFRoaXMgbWV0aG9kIGNhbGwgYWxzbyBwcm9jZXNzZXMgdGhlIHN0eWxlc2hlZXQKLQkJCQkvLyBpbnRvIGEgY29tcGlsZWQgVGVtcGxhdGVzIG9iamVjdC4KLQkJCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9Ci0JCQkJCXRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoZGVwbG95WFNMKSk7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKENMQVNTTkFNRV9QQVJBTSwgamF2YVdTRExQYXJhbV8uZ2V0QmVhbk5hbWUoKSk7Ci0KLQkJCQkvLyBVc2UgdGhlIFRyYW5zZm9ybWVyIHRvIGFwcGx5IHRoZSBhc3NvY2lhdGVkIFRlbXBsYXRlcyBvYmplY3QgdG8gYW4gWE1MIGRvY3VtZW50Ci0JCQkJLy8gKGZvby54bWwpIGFuZCB3cml0ZSB0aGUgb3V0cHV0IHRvIGEgZmlsZSAoZm9vLm91dCkuCi0JCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKAotCQkJCQluZXcgU3RyZWFtU291cmNlKGRlcGxveUJhY2t1cCksCi0JCQkJCW5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0od3NkZF9kZXBsb3kpKSk7Ci0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgICAgU3RyaW5nW10gZXJyb3JNc2dTdHJpbmdzID0gbmV3IFN0cmluZ1tde3Byb2plY3QudG9TdHJpbmcoKSwgb3V0cHV0TG9jYXRpb24udG9TdHJpbmcoKSwgd2ViQ29udGVudFBhdGgudG9TdHJpbmcoKX07IAotCQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VQREFURV9BWElTX1dTREQiLCBlcnJvck1zZ1N0cmluZ3MpLCBTdGF0dXMuRVJST1IsIGUpOwotCQkgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICAgcmV0dXJuIHN0YXR1czsJCSAgCQkgIAotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0UGx1Z2luRmlsZVBhdGgoU3RyaW5nIHBsdWdpbmZpbGVOYW1lKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUGx1Z2luUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9Ci0JCQkJcGx1Z2luUmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcihXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uSUQpOwotCi0JCQlVUkwgbG9jYWxVUkwgPQotCQkJCVBsYXRmb3JtLmFzTG9jYWxVUkwoCi0JCQkJCW5ldyBVUkwocGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCksIHBsdWdpbmZpbGVOYW1lKSk7Ci0JCQlyZXR1cm4gbmV3IFBhdGgobG9jYWxVUkwuZ2V0RmlsZSgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCW5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCVdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwKLQkJCQkJMCwKLQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCQkiTVNHX1BMVUdJTl9GSUxFX1VSTCIpLAotCQkJCQllKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCW5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCVdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwKLQkJCQkJMCwKLQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCQkiTVNHX1BMVUdJTl9GSUxFX1VSTCIpLAotCQkJCQllKSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLQkqIEBwYXJhbSBqYXZhV1NETFBhcmFtIFRoZSBqYXZhV1NETFBhcmFtIHRvIHNldAotCSovCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0JCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKQotCXsKLQkJcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotCX0JCi0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkKLQl7Ci0JICBzZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLQl9Ci0JCi0JLy8gcm0gCi0JLyoKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChNb2RlbCBtb2RlbCkKLQl7Ci0JICBtb2RlbF8gPSBtb2RlbDsKLQl9Ci0JKi8JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQXhpc0JlYW5GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0F4aXNCZWFuRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmYzI1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQXhpc0JlYW5GcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXNEZXBsb3lDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5KYXZhMldTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5DaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ29weUF4aXNKYXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suUmVmcmVzaFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuSmF2YVRvV1NETE1ldGhvZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5VcGRhdGVXRUJYTUxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5MaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suTW92ZUphdmFGaWxlc1Rhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5VcGRhdGVBeGlzV1NEREZpbGVUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLldTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uV2FpdEZvckF1dG9CdWlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLQotICAKLXB1YmxpYyBjbGFzcyBBeGlzQmVhbkZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotIAotICBwdWJsaWMgQXhpc0JlYW5GcmFnbWVudCgpCi0gIHsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFZhbGlkYXRlT2JqZWN0U2VsZWN0aW9uQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IEJVQXhpc0NvbW1hbmRzRnJhZ21lbnQxKCkpOwotICAgIGFkZCggbmV3IEJVQXhpc0NvbW1hbmRzRnJhZ21lbnQyKCkpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQmVhbkNvbmZpZyIgICAgKSApOwotICAgIGFkZCggbmV3IE1hcHBpbmdGcmFnbWVudCgpICk7Ci0gICAgYWRkKCBuZXcgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDMoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkpIAotICB7Ci0gICAgLy9WYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBWYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCJTZXJ2aWNlUHJvamVjdE5hbWUiLCBudWxsICk7Ci0gICAgCi0gICAgLy9CVUF4aXNEZWZhdWx0aW5nQ29tbWFuZAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgIAotICAgIC8vV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFdTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIAotICAgIC8vQlVBeGlzQ29tbWFuZHMyIC0gdGhlc2UgcnVuIGFmdGVyIEJlYW5DbGFzc1dpZGdldAotICAgIC8vRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhQmVhbk5hbWUiLCBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlBhcnNlciIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ3VzdG9taXplU2VydmljZU1hcHBpbmdzIiwgQXhpc0JlYW5GcmFnbWVudC5NYXBwaW5nRnJhZ21lbnQuY2xhc3MpOwotICAgIAotICAgIC8vSmF2YVdTRExNZXRob2RDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQotICAgIC8vIEJVQXhpc0NvbW1hbmRzMyAtIHRoZXNlIHJ1biBhZnRlciBCZWFuQ29uZmlnV2lkZ2V0Ci0gICAgLy9MaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrLmNsYXNzKTsKLSAgICAKLSAgICAvL0NoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sKLSAgICAvL3JlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9Db3B5QXhpc0phckNvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIENvcHlBeGlzSmFyQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIAotICAgIC8vQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2sKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9KYXZhMldTRExDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBKYXZhMldTRExDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvL1JlZnJlc2hQcm9qZWN0Q29tbWFuZAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgUmVmcmVzaFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9XU0RMMkphdmFDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLSAgICAKLQotICAgIC8vTW92ZUphdmFGaWxlc1Rhc2sKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgTW92ZUphdmFGaWxlc1Rhc2suY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgTW92ZUphdmFGaWxlc1Rhc2suY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9VcGRhdGVBeGlzV1NEREZpbGVUYXNrCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhNb3ZlSmF2YUZpbGVzVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBVcGRhdGVBeGlzV1NEREZpbGVUYXNrLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2suY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9VcGRhdGVXRUJYTUxDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBVcGRhdGVXRUJYTUxDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9CdWlsZFByb2plY3RDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkZvcmNlQnVpbGQiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVmFsaWRhdGlvbk1hbmFnZXIiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvL1N0YXJ0UHJvamVjdENvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7ICAgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VTZXJ2ZXJUeXBlSUQiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2FtcGxlU2VydmVyVHlwZUlEIiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlciIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkIixTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAgICAgCi0gICAgLy9BeGlzRGVwbG95Q29tbWFuZAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoVXBkYXRlQXhpc1dTRERGaWxlVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBBeGlzRGVwbG95Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy9Db3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2sKLSAgICAvKgotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoVXBkYXRlQXhpc1dTRERGaWxlVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2suY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIiLCBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2suY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlU2VydmVyVHlwZUlEIiwgQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrLmNsYXNzKTsKLSAgICAqLwotICAgIAotICAgIC8vIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NETENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIEJVQXhpc0NvbW1hbmRzRnJhZ21lbnQxIGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotICB7ICAgIAotICAgIHB1YmxpYyBCVUF4aXNDb21tYW5kc0ZyYWdtZW50MSgpCi0gICAgewotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQoKSwgIiIpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDIgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci0gIHsKLSAgICBwdWJsaWMgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDIoKQotICAgIHsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZCgpLCAiIikpOwotICAgIH0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDMgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci0gIHsKLSAgICBwdWJsaWMgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDMoKQotICAgIHsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IExpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2soKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2soKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENvcHlBeGlzSmFyQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2soKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFdhaXRGb3JBdXRvQnVpbGRDb21tYW5kKCksICIiICkpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgSmF2YTJXU0RMQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBXU0RMMkphdmFDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBNb3ZlSmF2YUZpbGVzVGFzaygpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgVXBkYXRlQXhpc1dTRERGaWxlVGFzaygpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgVXBkYXRlV0VCWE1MQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBTdGFydFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBBeGlzRGVwbG95Q29tbWFuZCgpLCAiIikpOwotICAgICAgLy9hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2soKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgIH0gICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBjbGFzcyBNYXBwaW5nRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLSAgewotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93TWFwcGluZ3NfOwotICAgIAotICAgIHB1YmxpYyBNYXBwaW5nRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICAKLSAgICAgIHNldFRydWVGcmFnbWVudCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQXhpc1NlcnZpY2VCZWFuTWFwcGluZyIgKSk7Ci0gICAgICBzZXRDb25kaXRpb24oIG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaG93TWFwcGluZ3NfOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVTZXJ2aWNlTWFwcGluZ3MoIGJvb2xlYW4gc2hvd01hcHBpbmdzICkKLSAgICB7Ci0gICAgICBzaG93TWFwcGluZ3NfID0gc2hvd01hcHBpbmdzOwotICAgIH0gICAgICAKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0JVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZGEyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkphdmFSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLnZhbGlkYXRlLlZhbGlkYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICAvL05lZWQKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBzZXJ2aWNlSWRzXzsKLSAgCi0gIC8vUHJvdmlkZQotICBwcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRF87ICAvLyByc2sgcmV2aXNpdAotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotICBwcml2YXRlIFN0cmluZyBqYXZhQmVhbk5hbWVfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcl87Ci0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZUJ1aWxkXyA9IHRydWU7Ci0gIHByaXZhdGUgQm9vbGVhbiBJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkID0gQm9vbGVhbi5UUlVFOyAvLyByc2sgcmV2aXNpdAotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIHZhbGlkYXRpb25NYW5hZ2VyXzsKLSAgcHJpdmF0ZSBib29sZWFuIGN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5nc18gPSBmYWxzZTsKLSAgCi0gIC8vVGhpcyBpcyBwcm94eSBhbmQgY2xpZW50IHJlbGF0ZWQgaW5mb3JtYXRpb24KLSAgLy93aGljaCBjYW4gYmUgbnVsbGVkIGZvciBjb21tYW5kcyBkZWFsaW5nCi0gIC8vd2l0aCBzZXJ2aWNlIGNyZWF0aW9uLgotICAvL3JzayByZXZpc2l0Ci0gIHByaXZhdGUgQm9vbGVhbiBpc1Byb3h5UHJvamVjdF8gPSBCb29sZWFuLkZBTFNFOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRSdW50aW1lSURfID0gbnVsbDsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm94eVByb2plY3RfID0gbnVsbDsKLSAgcHJpdmF0ZSBJUHJvamVjdCBzYW1wbGVQcm9qZWN0XyA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRF8gPSBudWxsOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICAKLSAgCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICAKLSAgICBpZiAoc2VydmljZUlkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGwpIHsgLy8gc2VydmVyIGV4aXN0cwotICAgIAlzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZpY2VJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0gICAgfQotICAgIGlmIChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfICE9IG51bGwpCi0gICAgewotICAgICAgc2VydmljZVNlcnZlclR5cGVJRF8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIAlzZXJ2aWNlU2VydmVyVHlwZUlEXyA9IHNlcnZpY2VJZHNfLmdldFNlcnZlcklkKCk7Ci0gICAgICAvLyBzZXJ2ZXIgd2lsbCBiZSBjcmVhdGVkIGluIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZAotICAgIH0KLSAgICAKLSAgICAvL2phdmFXU0RMUGFyYW0KLSAgICBqYXZhV1NETFBhcmFtXyA9IG5ldyBKYXZhV1NETFBhcmFtZXRlcigpOwotICAgICAKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbl8gPT0gbnVsbCkgewotICAgIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTklUSUFMX1NFTEVDVElPTiIpLCBTdGF0dXMuRVJST1IpOwotCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIAotICAgIHRyeSB7Ci0JCQotCQlqYXZhQmVhbk5hbWVfID0gZ2V0SmF2YUJlYW5Gcm9tSW5pdGlhbFNlbGVjdGlvbihlbnYpOwotCQkKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkJVQXhpc0RlZmF1bHRpbmdDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5JVElBTF9TRUxFQ1RJT04iKSArICIgIiAvLyROT04tTkxTLTEkCi0JCQkJK2UuZ2V0Q2F1c2UoKS50b1N0cmluZygpLCBTdGF0dXMuRVJST1IpOwotCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotICAgIAotICAgIC8vcGFyc2VyCi0gICAgcGFyc2VyXyA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAgIAotICAgIAotICAgIAotICAgIC8vdmFsaWRhdGlvbk1hbmFnZXIKLSAgICB2YWxpZGF0aW9uTWFuYWdlcl8gPSBuZXcgVmFsaWRhdGlvbk1hbmFnZXIoKTsKLSAgICAKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEphdmFCZWFuRnJvbUluaXRpYWxTZWxlY3Rpb24oRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGJlYW5DbGFzcyA9ICIiOwotICAgIEphdmFSZXNvdXJjZUZpbHRlciBmaWx0ZXIgPSBuZXcgSmF2YVJlc291cmNlRmlsdGVyKCk7IAotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGluaXRpYWxTZWxlY3Rpb25fOwotICAgIC8vCi0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIGdldCB0aGUgSVJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoZSBzZWxlY3Rpb24KLSAgICAgICAgSVJlc291cmNlIHJlcyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICByZXMgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAKLSAgICAgICAgaWYgKGZpbHRlci5hY2NlcHRzKHJlcykpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIHBhY2thZ2UtcXVhbGlmaWVkIGNsYXNzIG5hbWUgd2l0aG91dCBmaWxlIGV4dGVuc2lvbnMKLSAgICAgICAgICBTdHJpbmcgYmVhblBhY2thZ2UgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKHJlcy5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICBpZiAoYmVhblBhY2thZ2U9PW51bGwpCi0gICAgICAgICAgICBiZWFuUGFja2FnZSA9ICIiOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJlYW5QYWNrYWdlID0gYmVhblBhY2thZ2UgKyAiLiI7Ci0KLSAgICAgICAgICBiZWFuQ2xhc3MgPSBiZWFuUGFja2FnZSArIHJlcy5nZXROYW1lKCk7Ci0KLSAgICAgICAgICBpZiAoYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIikgfHwgYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICBiZWFuQ2xhc3MgPSBiZWFuQ2xhc3Muc3Vic3RyaW5nKDAsYmVhbkNsYXNzLmxhc3RJbmRleE9mKCcuJykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLwotICAgIHJldHVybiBiZWFuQ2xhc3M7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UnVudGltZUlEXy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UnVudGltZUlEKCkKLSAgewotICAgIHJldHVybiBjbGllbnRSdW50aW1lSURfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcmNlQnVpbGRfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yY2VCdWlsZCgpCi0gIHsKLSAgICByZXR1cm4gZm9yY2VCdWlsZF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNQcm94eVByb2plY3RfLgotICAgKi8KLSAgcHVibGljIEJvb2xlYW4gZ2V0SXNQcm94eVByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIGlzUHJveHlQcm9qZWN0XzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBqYXZhQmVhbk5hbWVfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRKYXZhQmVhbk5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGphdmFCZWFuTmFtZV87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbV8uCi0gICAqLwotICBwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpCi0gIHsKLSAgICByZXR1cm4gamF2YVdTRExQYXJhbV87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyc2VyXy4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRQYXJzZXIoKQotICB7Ci0gICAgcmV0dXJuIHBhcnNlcl87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJveHlQcm9qZWN0Xy4KLSAgICovCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm94eVByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHByb3h5UHJvamVjdF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfLgotICAgKi8KLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNhbXBsZUV4aXN0aW5nU2VydmVyXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1wbGVQcm9qZWN0Xy4KLSAgICovCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRTYW1wbGVQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBzYW1wbGVQcm9qZWN0XzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1wbGVTZXJ2ZXJUeXBlSURfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoKQotICB7Ci0gICAgcmV0dXJuIHNhbXBsZVNlcnZlclR5cGVJRF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsaWRhdGlvbk1hbmFnZXJfLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NYW5hZ2VyIGdldFZhbGlkYXRpb25NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0aW9uTWFuYWdlcl87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIGluaXRpYWxTZWxlY3Rpb25fID0gaW5pdGlhbFNlbGVjdGlvbjsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfLgotICAgKi8KLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2VydmljZUV4aXN0aW5nU2VydmVyKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VTZXJ2ZXJUeXBlSURfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDdXN0b21pemVTZXJ2aWNlTWFwcGluZ3MoKQotICB7Ci0gICAgcmV0dXJuIGN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5nc187Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZC4KLSAgICovCi0gIHB1YmxpYyBCb29sZWFuIGdldElzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQoKQotICB7Ci0gICAgcmV0dXJuIElzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBpZHMpCi0gIHsKLSAgICBzZXJ2aWNlSWRzXyA9IGlkczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0JlYW5DbGFzc1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0JlYW5DbGFzc1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWI4YjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9CZWFuQ2xhc3NXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkphdmFSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmRpYWxvZy5EaWFsb2dVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIEJlYW5DbGFzc1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICBwbHVnaW5JZF8gID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIHRoaXNQbHVnaW4gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotICBwcml2YXRlIElQcm9qZWN0ICAgICAgICAgICBzZXJ2ZXJQcm9qZWN0XyA9IG51bGw7Ci0gIHByaXZhdGUgQ29tcG9zaXRlICAgICAgICAgIHBhcmVudF8gPSBudWxsOwotICBwcml2YXRlIElXaXphcmRDb250YWluZXIgICBjb250ZXh0XyA9IG51bGw7Ci0gIHByaXZhdGUgSmF2YVJlc291cmNlRmlsdGVyIGZpbHRlcl8gPSBuZXcgSmF2YVJlc291cmNlRmlsdGVyKCk7Ci0gIHByaXZhdGUgSVJlc291cmNlICAgICAgICAgIGluaXRpYWxSZXNvdXJjZV8gPSBudWxsOwotICAKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAxIGZvciB0aGUgQmVhbiBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEJDTF9QQUdFID0gIlBCQ0wwMDAxIjsKLSAgCi0gIHByaXZhdGUgVGV4dCBiZWFuQ2xhc3NUZXh0XzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAyIGZvciB0aGUgQmVhbiBTZWxlY3Rpb24gZmllbGQgb2YgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfVEVYVF9CRUFOX0NMQVNTID0gIlBCQ0wwMDAyIjsKLQotICBwcml2YXRlIEJ1dHRvbiBiZWFuQ2xhc3NCcm93c2VCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUEJDTDAwMDMgZm9yIHRoZSBCZWFuIENsYXNzIEJyb3dzZSBidXR0b24gb2YgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFID0gIlBCQ0wwMDAzIjsKLQotICBwcml2YXRlIEJ1dHRvbiBiZWFuUmVzb3VyY2VCcm93c2VCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUEJDTDAwMDQgZm9yIHRoZSBCZWFuIFJlc291cmNlIEJyb3dzZSBidXR0b24gb2YgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fUkVTT1VSQ0VfQlJPV1NFID0gIlBCQ0wwMDA0IjsKLSAgIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHVpVXRpbHMgID0gbmV3IFVJVXRpbHMobXNnVXRpbHMsIHRoaXNQbHVnaW4gKTsgCi0gICAgCi0gICAgcGFyZW50XyA9IHBhcmVudDsKLSAgICAKLSAgICBDb21wb3NpdGUgZ3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCA0ICk7Ci0gICAgCi0gICAgZ3JvdXAuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUEJDTF9QQUdFIikgKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBncm91cCwgcGx1Z2luSWRfICsgIi4iICsgSU5GT1BPUF9QQkNMX1BBR0UgKTsKLSAgICAKLSAgICBiZWFuQ2xhc3NUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggZ3JvdXAsICJMQUJFTF9CRUFOX0NMQVNTX05BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QQkNMX1RFWFRfQkVBTl9DTEFTUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDTF9URVhUX0JFQU5fQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAKLSAgICBiZWFuQ2xhc3NCcm93c2VCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBncm91cCwgIkJVVFRPTl9CUk9XU0VfQ0xBU1NFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0UgKTsKLSAgICBiZWFuQ2xhc3NCcm93c2VCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUJyb3dzZUNsYXNzZXMoKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICAKLSAgICBiZWFuUmVzb3VyY2VCcm93c2VCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBncm91cCwgIkJVVFRPTl9CUk9XU0VfRklMRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BCQ0xfQlVUVE9OX0JFQU5fUkVTT1VSQ0VfQlJPV1NFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fUkVTT1VSQ0VfQlJPV1NFICk7Ci0gICAgYmVhblJlc291cmNlQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCcm93c2VGaWxlcygpOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlQ2xhc3NlcygpCi0gIHsKLSAgICBTdHJpbmcgY2xhc3NOYW1lID0gRGlhbG9nVXRpbHMuYnJvd3NlQ2xhc3NlcyggcGFyZW50Xy5nZXRTaGVsbCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUHJvamVjdF8sIGNvbnRleHRfICk7Ci0KLSAgICBpZiAoY2xhc3NOYW1lIT1udWxsKSBiZWFuQ2xhc3NUZXh0Xy5zZXRUZXh0KGNsYXNzTmFtZSk7Ci0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2VGaWxlcygpCi0gIHsKLSAgICBJUmVzb3VyY2UgdG9wUmVzb3VyY2UgPSBzZXJ2ZXJQcm9qZWN0XzsKLSAgICAKLSAgICBpZiAodG9wUmVzb3VyY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0b3BSZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpOwotICAgIH0KLSAgICAKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgCi0gICAgICA9IERpYWxvZ1V0aWxzLmJyb3dzZVJlc291cmNlcyggcGFyZW50Xy5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFJlc291cmNlLAotCQkJCSAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxSZXNvdXJjZV8sCi0JCQkJICAgICAgICAgICAgICAgICAgICAgZmlsdGVyXyApOwotICAgIAotICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBJUGF0aCAgcGF0aCAgICAgPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgICAgU3RyaW5nIGJhc2VuYW1lID0gcGF0aC5sYXN0U2VnbWVudCgpOwotICAgICAgCi0gICAgICBpZiggYmFzZW5hbWUgIT0gbnVsbCAmJiBiYXNlbmFtZS5sZW5ndGgoKSA+IDAgKQotICAgICAgewotICAgICAgICBTdHJpbmcgYmVhblBhY2thZ2UgPSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHMuZ2V0SmF2YVJlc291cmNlUGFja2FnZU5hbWUocGF0aCk7Ci0gICAgICAgIFN0cmluZyBiZWFuQ2xhc3MgPSAoYmVhblBhY2thZ2UgPT0gbnVsbCA/IGJhc2VuYW1lIDogKGJlYW5QYWNrYWdlICsgIi4iICsgYmFzZW5hbWUpKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSB8fCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIiApICkKLSAgICAgICAgewotICAgICAgICAgIGJlYW5DbGFzcyA9IGJlYW5DbGFzcy5zdWJzdHJpbmcoIDAsIGJlYW5DbGFzcy5sYXN0SW5kZXhPZignLicpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJlYW5DbGFzc1RleHRfLnNldFRleHQoYmVhbkNsYXNzKTsKLSAgICAgIH0KLSAgICB9ICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRQYWdlKCBJV2l6YXJkUGFnZSBwYWdlICkKLSAgewotICAgIGNvbnRleHRfID0gcGFnZS5nZXRXaXphcmQoKS5nZXRDb250YWluZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEJlYW5DbGFzc05hbWUoU3RyaW5nIGJlYW5DbGFzc05hbWUpCi0gIHsKLSAgICBiZWFuQ2xhc3NUZXh0Xy5zZXRUZXh0KGJlYW5DbGFzc05hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEJlYW5DbGFzc05hbWUoKQotICB7Ci0gICAgcmV0dXJuIGJlYW5DbGFzc1RleHRfLmdldFRleHQoKS50cmltKCk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdE5hbWUoIFN0cmluZyBuYW1lICkKLSAgewotICAgIHNlcnZlclByb2plY3RfID0gKElQcm9qZWN0KVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKCBuZXcgUGF0aCggbmFtZSApLm1ha2VBYnNvbHV0ZSgpICk7ICAKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsUmVzb3VyY2UoIElSZXNvdXJjZSByZXNvdXJjZSApCi0gIHsKLSAgICBpbml0aWFsUmVzb3VyY2VfID0gcmVzb3VyY2U7ICAKLSAgfSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0JlYW5Db25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9CZWFuQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMWE5ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0JlYW5Db25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWwuUGxhdGZvcm1VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIEJlYW5Db25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgCi17Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0gIAotICBwcml2YXRlIEJ1dHRvbiAgIHJwY0VuY29kZWRCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiAgIHJwY0xpdGVyYWxCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiAgIGRvY0xpdGVyYWxCdXR0b25fOwotICAKLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcl87Ci0gIAotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJfOwotICAKLSAgLyogQ09OVEVYVF9JRCBQQkNGMDAwMSBmb3IgdGhlIEJlYW4gQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQkNGX1BBR0UgPSAiUEJDRjAwMDEiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJDRl9QQUdFID0gIlRPT0xUSVBfUEJDRl9QQUdFIjsKLQkKLSAgcHJpdmF0ZSBUZXh0IHVyaVRleHRfOwotICAvKiBDT05URVhUX0lEIFBCQ0YwMDAyIGZvciB0aGUgVVJJIGZpZWxkIG9mIHRoZSBCZWFuIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUEJDRl9URVhUX1VSSSA9ICJQQkNGMDAwMiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QQkNGX1RFWFRfVVJJID0gIlRPT0xUSVBfUEJDRl9URVhUX1VSSSI7Ci0JCi0gIHByaXZhdGUgVGV4dCB3c2RsRm9sZGVyVGV4dF87Ci0gIC8qIENPTlRFWFRfSUQgUEJDRjAwMDYgZm9yIHRoZSBXU0RMIEZvbGRlciBmaWVsZCBpbiB0aGUgQmVhbiBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUiA9ICJQQkNGMDAwNiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QQkNGX1RFWFRfV1NETF9GT0xERVIgPSAiVE9PTFRJUF9QQkNGX1RFWFRfV1NETF9GT0xERVIiOwotCQotICBwcml2YXRlIFRleHQgd3NkbEZpbGVUZXh0XzsKLSAgLyogQ09OVEVYVF9JRCBQQkNGMDAwNyBmb3IgdGhlIFdTREwgRmlsZSBmaWVsZCBvZiB0aGUgQmVhbiBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUgPSAiUEJDRjAwMDciOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJDRl9URVhUX1dTRExfRklMRSA9ICJUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUiOwotCQotICBwcml2YXRlIFRyZWUgbWV0aG9kc1RyZWVfOwotICAvKiBDT05URVhUX0lEIFBCTUUwMDAyIGZvciB0aGUgTWV0aG9kcyB0cmVlIG9mIHRoZSBCZWFuIE1ldGhvZHMgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCTUVfVFJFRV9NRVRIT0RTID0gIlBCTUUwMDAyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCTUVfVFJFRV9NRVRIT0RTID0gIlRPT0xUSVBfUEJNRV9UUkVFX01FVEhPRFMiOwotCQotICBwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxNZXRob2RzQnV0dG9uXzsKLSAgLyogQ09OVEVYVF9JRCBQQk1FMDAxMCBmb3IgdGhlIFNlbGVjdCBBbGwgYnV0dG9uIG9mIHRoZSBCZWFuIE1ldGhvZHMgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCTUVfQlVUVE9OX1NFTEVDVF9BTEwgPSAiUEJNRTAwMTAiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJNRV9CVVRUT05fU0VMRUNUX0FMTCA9ICJUT09MVElQX1BCTUVfQlVUVE9OX1NFTEVDVF9BTEwiOwotCQotICBwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fOwotICAvKiBDT05URVhUX0lEIFBCTUUwMDExIGZvciB0aGUgRGVzZWxlY3QgQWxsIGJ1dHRvbiBvZiB0aGUgQmVhbiBNZXRob2RzIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQk1FX0JVVFRPTl9ERVNFTEVDVF9BTEwgPSAiUEJNRTAwMTEiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJNRV9CVVRUT05fREVTRUxFQ1RfQUxMID0gIlRPT0xUSVBfUEJNRV9CVVRUT05fREVTRUxFQ1RfQUxMIjsKLQkKLSAgcHJpdmF0ZSBCdXR0b24gc2hvd01hcHBpbmdzQ2hlY2tib3hfOwotICAvKiBDT05URVhUX0lEIFBCQ0YwMDE2IGZvciB0aGUgU2hvdyBNYXBwaW5ncyBjaGVja2JveCBvZiB0aGUgQmVhbiBNZXRob2RzIFBhZ2UgKi8gICAKLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QMk5fU0hPV19NQVBQSU5HUyA9ICJQQkNGMDAxNiI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgU3RyaW5nICAgICAgIGJhc2VDb25QbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyAgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBNZXNzYWdlVXRpbHMgYmFzZUNvblV0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggYmFzZUNvblBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHVpVXRpbHMgICAgICAgID0gbmV3IFVJVXRpbHMobXNnVXRpbHMsIHBsdWdpbklkXyApOwotICAgIFVJVXRpbHMgICAgICBiYXNlQ29uVWlVdGlscyA9IG5ldyBVSVV0aWxzKCBiYXNlQ29uVXRpbHMsIHBsdWdpbklkXyApOwotICAgIAotICAgIHN0YXR1c0xpc3RlbmVyXyA9IHN0YXR1c0xpc3RlbmVyOyAgICAKLQlwYXJlbnQuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIFRPT0xUSVBfUEJDRl9QQUdFICkgKTsKLQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkXyArICIuIiArIElORk9QT1BfUEJDRl9QQUdFICk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGNvbmZpZ0dyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMiApOwotICAgIAotICAgIHVyaVRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCBjb25maWdHcm91cCwgIkxBQkVMX1VSSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUEJDRl9URVhUX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNGX1RFWFRfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICAKLSAgICB3c2RsRm9sZGVyVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIGNvbmZpZ0dyb3VwLCAiTEFCRUxfT1VUUFVUX0ZPTERFUl9OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUEJDRl9URVhUX1dTRExfRk9MREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GT0xERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICAKLSAgICB3c2RsRmlsZVRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCBjb25maWdHcm91cCwgIkxBQkVMX09VVFBVVF9GSUxFX05BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUEJDRl9URVhUX1dTRExfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgICk7Ci0gICAgd3NkbEZpbGVUZXh0Xy5hZGRMaXN0ZW5lciggU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICBMYWJlbCBzZXBhcmF0b3IgPSB1aVV0aWxzLmNyZWF0ZUhvcml6b250YWxTZXBhcmF0b3IoIHBhcmVudCwgNiApOwotICAgIAotICAgIC8vIFRPRE8gdGhpcyBncm91cCBoYXMgbm8gVE9PTFRJUCBvciBJTkZPUE9QLgotICAgIEdyb3VwICAgIG1ldGhvZHNHcm91cCA9IGJhc2VDb25VaVV0aWxzLmNyZWF0ZUdyb3VwKCBwYXJlbnQsICJMQUJFTF9NRVRIT0RTIiwgbnVsbCwgbnVsbCApOwotCW1ldGhvZHNHcm91cC5zZXRMYXlvdXREYXRhKCB1aVV0aWxzLmNyZWF0ZUZpbGxBbGwoKSApOwotCQotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCW1ldGhvZHNHcm91cC5zZXRMYXlvdXQoIGxheW91dCApOwotCQotCW1ldGhvZHNUcmVlXyA9IHVpVXRpbHMuY3JlYXRlVHJlZSggbWV0aG9kc0dyb3VwLCBUT09MVElQX1BCTUVfVFJFRV9NRVRIT0RTLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJNRV9UUkVFX01FVEhPRFMsCi0JICAgICAgICAgICAgICAgICAgIAkJCQkgICBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMCXwgU1dULkNIRUNLICk7Ci0JbWV0aG9kc1RyZWVfLmFkZExpc3RlbmVyKCBTV1QuU2VsZWN0aW9uLCBzdGF0dXNMaXN0ZW5lciApOwotCi0gICAgQ29tcG9zaXRlIHNlbGVjdEJ1dHRvbnMgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggbWV0aG9kc0dyb3VwLCAyICk7Ci0gICAgCi0gICAgc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8gCi0gICAgICA9IGJhc2VDb25VaVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIHNlbGVjdEJ1dHRvbnMsICJCVVRUT05fU0VMRUNUX0FMTCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUEJNRV9CVVRUT05fU0VMRUNUX0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCTUVfQlVUVE9OX1NFTEVDVF9BTEwgKTsKLSAgICBzZWxlY3RBbGxNZXRob2RzQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdEFsbCggdHJ1ZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgZGVzZWxlY3RBbGxNZXRob2RzQnV0dG9uXyAKLSAgICAgID0gYmFzZUNvblVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggc2VsZWN0QnV0dG9ucywgIkJVVFRPTl9ERVNFTEVDVF9BTEwiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCTUVfQlVUVE9OX0RFU0VMRUNUX0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCTUVfQlVUVE9OX0RFU0VMRUNUX0FMTCApOwotICAgIGRlc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdEFsbCggZmFsc2UgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICAvLyBUT0RPIHRoaXMgZ3JvdXAgaGFzIG5vIFRPT0xUSVAgb3IgSU5GT1BPUC4KLSAgICBHcm91cCBzdHlsZUdyb3VwID0gdWlVdGlscy5jcmVhdGVHcm91cCggcGFyZW50LCAiTEFCRUxfU1RZTEVfVVNFIiwgbnVsbCwgbnVsbCApOwotICAgIAotICAgIC8vIFRPRE8gcmFkaW8gYnV0dG9ucyBoYXZlIG5vIFRPT0xUSVAgb3IgSU5GT1BPUC4KLSAgICBkb2NMaXRlcmFsQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUmFkaW9CdXR0b24oIHN0eWxlR3JvdXAsICJTVFlMRV9ET0NfTElURVJBTCIsIG51bGwsIG51bGwgKTsKLSAgICBycGNMaXRlcmFsQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUmFkaW9CdXR0b24oIHN0eWxlR3JvdXAsICJTVFlMRV9SUENfTElURVJBTCIsIG51bGwsIG51bGwgKTsKLSAgICBycGNFbmNvZGVkQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUmFkaW9CdXR0b24oIHN0eWxlR3JvdXAsICJTVFlMRV9SUENfRU5DT0RFRCIsIG51bGwsIG51bGwgKTsKLSAgICAKLSAgICBzaG93TWFwcGluZ3NDaGVja2JveF8gPSB1aVV0aWxzLmNyZWF0ZUNoZWNrYm94KCBwYXJlbnQsICJMQUJFTF9FWFBMT1JFX01BUFBJTkdTX0JFQU4yWE1MIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QMk5fU0hPV19NQVBQSU5HUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QMk5fU0hPV19NQVBQSU5HUyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlU2VsZWN0QWxsKCBib29sZWFuIHZhbHVlICkKLSAgewotCVRyZWVJdGVtW10gaXRlbXMgPSBtZXRob2RzVHJlZV8uZ2V0SXRlbXMoKTsKLQkKLQlmb3IoIGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrICkgCi0JewotCSAgaXRlbXNbaV0uc2V0Q2hlY2tlZCh2YWx1ZSk7Ci0JfQotCQotCXN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudCggbnVsbCApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVTZXJ2aWNlTWFwcGluZ3MoIGJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgc2hvd01hcHBpbmdzQ2hlY2tib3hfLnNldFNlbGVjdGlvbiggdmFsdWUgKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0Q3VzdG9taXplU2VydmljZU1hcHBpbmdzKCkKLSAgewotICAgIHJldHVybiBzaG93TWFwcGluZ3NDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEphdmFQYXJhbWV0ZXIoIEphdmFXU0RMUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgKQotICB7Ci0gICAgamF2YVBhcmFtZXRlcl8gPSBqYXZhUGFyYW1ldGVyOwotICAgIAotCVN0cmluZyB3c2RsTG9jYXRpb24gPSBqYXZhUGFyYW1ldGVyLmdldE91dHB1dFdzZGxMb2NhdGlvbigpOwotCi0JLy8gVE9ETyBWZXJpZnkgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIFdTREwgaW4gdGhlIGVjbGlwc2UgZmlsZSBzeXN0ZW0uCi0JLy9JRmlsZSBmaWxlIAotCS8vICA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aCh3c2RsTG9jYXRpb24pKTsKLQkvL0lQYXRoIHdzZGxQYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpOwotCUlQYXRoIHdzZGxQYXRoID0gbmV3IFBhdGgoIHdzZGxMb2NhdGlvbiApOwotCQotCXdzZGxGb2xkZXJUZXh0Xy5zZXRUZXh0KHdzZGxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpKTsKLQl3c2RsRmlsZVRleHRfLnNldFRleHQod3NkbFBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCi0JU3RyaW5nIGxvY2F0aW9uID0gamF2YVBhcmFtZXRlci5nZXRVcmxMb2NhdGlvbigpOwotCXVyaVRleHRfLnNldFRleHQobG9jYXRpb24gPT0gbnVsbCA/ICIiIDogbG9jYXRpb24pOyAgCi0JCi0JbWV0aG9kc1RyZWVfLnJlbW92ZUFsbCgpOwotCUhhc2h0YWJsZSBtZXRob2RzID0gamF2YVBhcmFtZXRlci5nZXRNZXRob2RzKCk7Ci0JRW51bWVyYXRpb24gZSA9IG1ldGhvZHMua2V5cygpOwotCQotCXdoaWxlKCBlLmhhc01vcmVFbGVtZW50cygpICkKLQl7Ci0JICBTdHJpbmcgICBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbShtZXRob2RzVHJlZV8sIFNXVC5OVUxMKTsKLSAgICAgIAotICAgCSAgaXRlbS5zZXREYXRhKG5hbWUpOwotICAgICAgaXRlbS5zZXRUZXh0KG5hbWUpOwotICAgICAgaXRlbS5zZXRDaGVja2VkKCgoKEJvb2xlYW4pIG1ldGhvZHMuZ2V0KG5hbWUpKS5ib29sZWFuVmFsdWUoKSkpOwotCX0KLQkKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbWV0aG9kc1RyZWVfLmdldEl0ZW1zKCk7Ci0JCi0JaWYoIGl0ZW1zLmxlbmd0aCA+IDAgKSAKLQl7Ci0JICBtZXRob2RzVHJlZV8uc2V0U2VsZWN0aW9uKCBuZXcgVHJlZUl0ZW1bXXsgaXRlbXNbMF0gfSApOwotCX0KLQkKLQlTdHJpbmcgc3R5bGUgPSBqYXZhUGFyYW1ldGVyLmdldFN0eWxlKCk7Ci0JCi0JaWYoIHN0eWxlLmVxdWFscyggSmF2YVdTRExQYXJhbWV0ZXIuU1RZTEVfUlBDICkgKQotCXsKLQkgIHJwY0VuY29kZWRCdXR0b25fLnNldFNlbGVjdGlvbih0cnVlKTsKLQl9Ci0JZWxzZSBpZiggc3R5bGUuZXF1YWxzKCBKYXZhV1NETFBhcmFtZXRlci5TVFlMRV9ET0NVTUVOVCApICkKLQl7Ci0JICBycGNMaXRlcmFsQnV0dG9uXy5zZXRTZWxlY3Rpb24odHJ1ZSk7CSAgCi0JfQotCWVsc2UKLQl7Ci0JICBkb2NMaXRlcmFsQnV0dG9uXy5zZXRTZWxlY3Rpb24odHJ1ZSk7ICAKLQl9Ci0gIH0KLSAgCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhUGFyYW1ldGVyKCkKLSAgewotICAgIElQYXRoIHdzZGxQYXRoIAotICAgICAgPSBuZXcgUGF0aCggd3NkbEZvbGRlclRleHRfLmdldFRleHQoKS50cmltKCkgKS5hcHBlbmQoIHdzZGxGaWxlVGV4dF8uZ2V0VGV4dCgpLnRyaW0oKSApOwotCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpOwotICAgIAotCS8vIFRPRE8gRG8gd2UgbmVlZCB0byBnbyB0byB0aGUgZWNsaXBzZSBmaWxlIHN5c3RlbT8/Ci0JLy9TdHJpbmcgd3NkbExvY2F0aW9uID0gd29ya3NwYWNlLmdldEZpbGUod3NkbFBhdGgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQlTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbFBhdGgudG9TdHJpbmcoKTsKLQkKLQlqYXZhUGFyYW1ldGVyXy5zZXRPdXRwdXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLQlqYXZhUGFyYW1ldGVyXy5zZXRJbnB1dFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotCQotCVN0cmluZyBmaWxlVVJMID0gUGxhdGZvcm1VdGlscy5nZXRGaWxlVVJMRnJvbVBhdGgobmV3IFBhdGgod3NkbExvY2F0aW9uKSk7Ci0KLQlIYXNodGFibGUgbWV0aG9kcyA9IG5ldyBIYXNodGFibGUoKTsKLQotCVRyZWVJdGVtW10gaXRlbXMgPSBtZXRob2RzVHJlZV8uZ2V0SXRlbXMoKTsKLQkKLQlmb3IoIGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrICkgCi0JewotCSAgVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCSAgbWV0aG9kcy5wdXQoKFN0cmluZylpdGVtLmdldERhdGEoKSwgbmV3IEJvb2xlYW4oaXRlbS5nZXRDaGVja2VkKCkpKTsKLQl9Ci0JCi0JamF2YVBhcmFtZXRlcl8uc2V0TWV0aG9kcyhtZXRob2RzKTsKLQkKLQlpZiggcnBjRW5jb2RlZEJ1dHRvbl8uZ2V0U2VsZWN0aW9uKCkpIAotCXsKLQkgIGphdmFQYXJhbWV0ZXJfLnNldFN0eWxlKEphdmFXU0RMUGFyYW1ldGVyLlNUWUxFX1JQQyk7Ci0JICBqYXZhUGFyYW1ldGVyXy5zZXRVc2UoSmF2YVdTRExQYXJhbWV0ZXIuVVNFX0VOQ09ERUQpOwotCX0gCi0JZWxzZSBpZiggcnBjTGl0ZXJhbEJ1dHRvbl8uZ2V0U2VsZWN0aW9uKCkpIAotCXsKLQkgIGphdmFQYXJhbWV0ZXJfLnNldFN0eWxlKEphdmFXU0RMUGFyYW1ldGVyLlNUWUxFX0RPQ1VNRU5UKTsKLQkgIGphdmFQYXJhbWV0ZXJfLnNldFVzZShKYXZhV1NETFBhcmFtZXRlci5VU0VfTElURVJBTCk7Ci0JfSAKLQllbHNlIAotCXsKLQkgIGphdmFQYXJhbWV0ZXJfLnNldFN0eWxlKEphdmFXU0RMUGFyYW1ldGVyLlNUWUxFX1dSQVBQRUQpOwotCSAgamF2YVBhcmFtZXRlcl8uc2V0VXNlKEphdmFXU0RMUGFyYW1ldGVyLlVTRV9MSVRFUkFMKTsKLQl9Ci0gICAgCi0JcmV0dXJuIGphdmFQYXJhbWV0ZXJfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjZ2V0U3RhdHVzKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkgCi0gIHsKLSAgICBTdGF0dXMgICAgICAgcmVzdWx0ICAgPSBudWxsOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotICAgIGlmKCB3c2RsRmlsZVRleHRfLmdldFRleHQoKS5lcXVhbHMoICIiICkgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCAiUEFHRV9NU0dfTk9fRklMRV9TUEVDSUZJRUQiICksIFN0YXR1cy5FUlJPUiApOyAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFRyZWVJdGVtW10gaXRlbXMgICAgICAgID0gbWV0aG9kc1RyZWVfLmdldEl0ZW1zKCk7Ci0gICAgICBib29sZWFuICAgIGl0ZW1TZWxlY3RlZCA9IGZhbHNlOwotICAgICAgCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgaXRlbXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgaWYoIGl0ZW1zW2luZGV4XS5nZXRDaGVja2VkKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgaXRlbVNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBpZiggIWl0ZW1TZWxlY3RlZCApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCAiUEFHRV9NU0dfTk9fTUVUSE9EX1NFTEVDVEVEIiApLCBTdGF0dXMuRVJST1IgKTsgCi0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9EZWZhdWx0c0ZvckNvbmZpZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0RlZmF1bHRzRm9yQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjc2YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0RlZmF1bHRzRm9yQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0c0ZvckNvbmZpZyBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFQYXJhbWV0ZXIoKQotICB7Ci0gICAgSmF2YVdTRExQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IEphdmFXU0RMUGFyYW1ldGVyKCk7Ci0gICAgSGFzaHRhYmxlICAgICAgICAgbWV0aG9kcyAgID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIAotICAgIG1ldGhvZHMucHV0KCAibWV0aG9kMSIsIG5ldyBCb29sZWFuKCB0cnVlICkgKTsKLSAgICBtZXRob2RzLnB1dCggIm1ldGhvZDIiLCBuZXcgQm9vbGVhbiggZmFsc2UgKSApOwotICAgIG1ldGhvZHMucHV0KCAibWV0aG9kMyIsIG5ldyBCb29sZWFuKCB0cnVlICkgKTsKLSAgICAKLSAgICBwYXJhbWV0ZXIuc2V0TWV0aG9kcyggbWV0aG9kcyApOwotICAgIHBhcmFtZXRlci5zZXRPdXRwdXRXc2RsTG9jYXRpb24oICIvU29tZVByb2ovU29tZUZvbGRlci9Tb21lRmlsZSIgKTsKLSAgICBwYXJhbWV0ZXIuc2V0VXJsTG9jYXRpb24oICJTb21lVVJMTG9jYXRpb24iICk7Ci0gICAgcGFyYW1ldGVyLnNldFN0eWxlKCBKYXZhV1NETFBhcmFtZXRlci5TVFlMRV9ET0NVTUVOVCApOwotICAgICAgCi0gICAgcmV0dXJuIHBhcmFtZXRlcjsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0Q3VzdG9taXplU2VydmljZU1hcHBpbmdzKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9ICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODhlZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL1ZhbGlkYXRlT2JqZWN0U2VsZWN0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uSmF2YVJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIEpBVkFfRVhURU5TSU9OID0gIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIFN0cmluZyBDTEFTU19FWFRFTlNJT04gPSAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUHJvamVjdE5hbWU7Ci0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgc2VsZWN0ZWQgSmF2YSBiZWFuIGNhbiBiZSBsb2FkZWQgZnJvbSB0aGUgc2VydmljZSBwcm9qZWN0LiBJZiBpdCBjYW4ndCwgYW4gZXJyb3IgaXMgZGlzcGxheWVkLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRlT2JqZWN0U2VsZWN0aW9uQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gIH0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIC8vTWFrZSBzdXJlIGEgYmVhbiBpcyBzZWxlY3RlZAotICAgIFN0cmluZyBqYXZhQmVhbk5hbWUgPSBudWxsOwotICAgIGlmIChvYmplY3RTZWxlY3Rpb24gIT0gbnVsbCAmJiAhb2JqZWN0U2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gb2JqZWN0U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgamF2YUJlYW5OYW1lID0gKChTdHJpbmcpb2JqZWN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgIAkvL1RoZSBPYmplY3RTZWxlY3Rpb25XaWRnZXQgbmV2ZXIgYXBwZWFyZWQgYW5kIHNvIHRoZSBJU3R1Y3R1cmVkU2VsZWN0aW9uIGZyb20gCi0gICAgICAJLy9PYmplY3RTZWxlY3Rpb25XaWRnZXRPdXRwdXRDb21tYW5kIGlzIHRoZSBpbml0aWFsIHNlbGVjdGlvbi4gCi0gICAgICAJLy9HZXQgdGhlIEphdmEgYmVhbiBuYW1lIGZyb20gdGhlIHNlbGVjdGlvbi4KLSAgICAgIAl0cnkKLQkJewotICAgICAgCSAgU3lzdGVtLm91dC5wcmludGxuKG9iamVjdC5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOwotICAgICAgCSAgamF2YUJlYW5OYW1lID0gZ2V0SmF2YUJlYW5Gcm9tT2JqZWN0U2VsZWN0aW9uKG9iamVjdFNlbGVjdGlvbik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0JCXsKLQkJICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX05PX0pBVkFfQkVBTiIpLFN0YXR1cy5FUlJPUik7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0JCSAgcmV0dXJuIGVycm9yU3RhdHVzOwkJCQotCQl9Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICAKLSAgICBpZiAoamF2YUJlYW5OYW1lPT1udWxsIHx8IGphdmFCZWFuTmFtZS5sZW5ndGgoKT09MCkKLSAgICB7Ci0gICAgICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX05PX0pBVkFfQkVBTiIpLFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLSAgICAgIHJldHVybiBlcnJvclN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgLy9NYWtlIHN1cmUgYSBwcm9qZWN0IGlzIHNlbGVjdGVkCi0gICAgSVByb2plY3Qgc2VydmljZVByb2plY3QgPSAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpLnRyYW5zZm9ybShzZXJ2aWNlUHJvamVjdE5hbWUpKTsKLSAgICBpZiAoc2VydmljZVByb2plY3Q9PW51bGwpCi0gICAgewotICAgICAgU3RhdHVzIGVycm9yU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX1BST0pFQ1QiKSxTdGF0dXMuRVJST1IpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0gICAgICByZXR1cm4gZXJyb3JTdGF0dXM7ICAgICAgCi0gICAgfQotICAgIAotICAgIC8vTWFrZSBzdXJlIHRoZSBzZWxlY3RlZCBiZWFuIGNhbiBiZSBsb2FkZWQgZnJvbSB0aGUgc2VsZWN0ZWQgcHJvamVjdAotCWlmIChqYXZhQmVhbk5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChKQVZBX0VYVEVOU0lPTikKLQkJfHwgamF2YUJlYW5OYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoQ0xBU1NfRVhURU5TSU9OKSkgewotCQlqYXZhQmVhbk5hbWUgPSBqYXZhQmVhbk5hbWUuc3Vic3RyaW5nKDAsIGphdmFCZWFuTmFtZS5sYXN0SW5kZXhPZignLicpKTsKLQl9Ci0JCi0gICAgdHJ5Ci0gICAgewotCSAgSmF2YUVNRk5hdHVyZSBqTU9GID0gKEphdmFFTUZOYXR1cmUpIEphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShzZXJ2aWNlUHJvamVjdCk7Ci0JICBKYXZhQ2xhc3MgamF2YUNsYXNzID0oSmF2YUNsYXNzKSBKYXZhQ2xhc3NJbXBsLnJlZmxlY3QoamF2YUJlYW5OYW1lLCBqTU9GLmdldFJlc291cmNlU2V0KCkpOwotCSAgaWYgKCFqYXZhQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkgCi0JICB7CQkKLQkJU3RhdHVzIGVycm9yU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YVRvV1NETE1ldGhvZENvbW1hbmQiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0NBTk5PVF9MT0FEX0pBVkFfQkVBTiIsIG5ldyBTdHJpbmdbXSB7IGphdmFCZWFuTmFtZSwgc2VydmljZVByb2plY3ROYW1lIH0pLFN0YXR1cy5FUlJPUik7Ci0JCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoZXJyb3JTdGF0dXMpOwotCQlyZXR1cm4gZXJyb3JTdGF0dXM7Ci0JICB9Ci0gICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0JICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZCIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX0xPQURfSkFWQV9CRUFOIiwgbmV3IFN0cmluZ1tdIHsgamF2YUJlYW5OYW1lLCBzZXJ2aWNlUHJvamVjdE5hbWUgfSksU3RhdHVzLkVSUk9SKTsKLQkgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoZXJyb3JTdGF0dXMpOwotICAgICAgcmV0dXJuIGVycm9yU3RhdHVzOyAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gc2VydmljZVByb2plY3ROYW1lIFRoZSBzZXJ2aWNlUHJvamVjdE5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3ROYW1lKFN0cmluZyBzZXJ2aWNlUHJvamVjdE5hbWUpCi0gIHsKLSAgICB0aGlzLnNlcnZpY2VQcm9qZWN0TmFtZSA9IHNlcnZpY2VQcm9qZWN0TmFtZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBvYmplY3RTZWxlY3Rpb24gVGhlIG9iamVjdFNlbGVjdGlvbiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPYmplY3RTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5vYmplY3RTZWxlY3Rpb24gPSBvYmplY3RTZWxlY3Rpb247Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRKYXZhQmVhbkZyb21PYmplY3RTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGJlYW5DbGFzcyA9ICIiOwotICAgIEphdmFSZXNvdXJjZUZpbHRlciBmaWx0ZXIgPSBuZXcgSmF2YVJlc291cmNlRmlsdGVyKCk7IAotICAgIC8vSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbl87Ci0gICAgLy8KLSAgICBpZiAob2JqZWN0U2VsZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IG9iamVjdFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBJUmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhlIHNlbGVjdGlvbgotICAgICAgICBJUmVzb3VyY2UgcmVzID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHJlcyA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgIAotICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdHMocmVzKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGdldCB0aGUgcGFja2FnZS1xdWFsaWZpZWQgY2xhc3MgbmFtZSB3aXRob3V0IGZpbGUgZXh0ZW5zaW9ucwotICAgICAgICAgIFN0cmluZyBiZWFuUGFja2FnZSA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YVJlc291cmNlUGFja2FnZU5hbWUocmVzLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgIGlmIChiZWFuUGFja2FnZT09bnVsbCkKLSAgICAgICAgICAgIGJlYW5QYWNrYWdlID0gIiI7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYmVhblBhY2thZ2UgPSBiZWFuUGFja2FnZSArICIuIjsKLQotICAgICAgICAgIGJlYW5DbGFzcyA9IGJlYW5QYWNrYWdlICsgcmVzLmdldE5hbWUoKTsKLQotICAgICAgICAgIGlmIChiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSB8fCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLSAgICAgICAgICAgIGJlYW5DbGFzcyA9IGJlYW5DbGFzcy5zdWJzdHJpbmcoMCxiZWFuQ2xhc3MubGFzdEluZGV4T2YoJy4nKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgcmV0dXJuIGJlYW5DbGFzczsKLSAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiZTkzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL3NrZWxldG9uL0F4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb247Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIHRoaXMuaW5pdGlhbFNlbGVjdGlvbiA9IGluaXRpYWxTZWxlY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPYmplY3RTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5vYmplY3RTZWxlY3Rpb24gPSBvYmplY3RTZWxlY3Rpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VzUGFyc2VyID09IG51bGwpCi0gICAgICB3ZWJTZXJ2aWNlc1BhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAgIHJldHVybiB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVVSSSgpCi0gIHsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmICFpbml0aWFsU2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBPYmplY3QgZmlyc3RFbGVtZW50ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHsKLSAgICAgICAgSUZpbGUgaWZpbGUgPSAoSUZpbGUpZmlyc3RFbGVtZW50OwotICAgICAgICBTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGlmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICAgICAgaWYgKGZpbGVFeHRlbnNpb24uZXF1YWxzKCJ3c2RsIikgfHwKLSAgICAgICAgICAgIGZpbGVFeHRlbnNpb24uZXF1YWxzKCJ3c2lsIikgfHwKLSAgICAgICAgICAgIGZpbGVFeHRlbnNpb24uZXF1YWxzKCJodG1sIikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gaWZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOyAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkkoKQotICB7Ci0gICAgaWYgKG9iamVjdFNlbGVjdGlvbiAhPSBudWxsICYmICFvYmplY3RTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBvYmplY3RTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICByZXR1cm4gKChJUmVzb3VyY2Upb2JqZWN0KS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5XU0lMKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXc2lsVVJJKCkKLSAgewotICAgIFN0cmluZyB3c1VSSSA9IGdldFdzZGxVUkkoKTsKLSAgICBpbnQgaW5kZXggPSB3c1VSSS5sYXN0SW5kZXhPZignLicpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHdzVVJJLnN1YnN0cmluZygwLCBpbmRleCkpOwotICAgICAgc2IuYXBwZW5kKCIud3NpbCIpOwotICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotICAKLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKQotICB7Ci0gICAgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSA9IG5ldyBKYXZhV1NETFBhcmFtZXRlcigpOwotICAgIGphdmFXU0RMUGFyYW0uc2V0U2VydmVyU2lkZShKYXZhV1NETFBhcmFtZXRlci5TRVJWRVJfU0lERV9CRUFOKTsKLSAgICBqYXZhV1NETFBhcmFtLnNldFNrZWxldG9uRGVwbG95KHRydWUpOwotICAgIGphdmFXU0RMUGFyYW0uc2V0TWV0YUluZk9ubHkoZmFsc2UpOwotICAgIHJldHVybiBqYXZhV1NETFBhcmFtOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRIdHRwQmFzaWNBdXRoUGFzc3dvcmQoKQotICB7Ci0gICAgcmV0dXJuIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkuZ2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEh0dHBCYXNpY0F1dGhVc2VybmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0V2ViU2VydmljZXNQYXJzZXIoKS5nZXRIVFRQQmFzaWNBdXRoVXNlcm5hbWUoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vQXhpc1NrZWxldG9uRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vQXhpc1NrZWxldG9uRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhNGIxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL3NrZWxldG9uL0F4aXNTa2VsZXRvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXNEZXBsb3lDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5DaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ29weUF4aXNKYXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suUmVmcmVzaFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXNNYXBwaW5nc0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuVXBkYXRlV0VCWE1MQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrLk1vdmVEZXBsb3ltZW50RmlsZXNUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suU2tlbGV0b24yV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkJ1aWxkUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0UHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuT3BlbkphdmFFZGl0b3JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGEuUHJvamVjdE5hbWUySVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5kYXRhLlNlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzU2tlbGV0b25GcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLSAgcHVibGljIEF4aXNTa2VsZXRvbkZyYWdtZW50KCkKLSAgewotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgVmFsaWRhdGVXU0RMQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiU2tlbGV0b25Db25maWciKSApOwotICAgIGFkZCggbmV3IEF4aXNNYXBwaW5nc0ZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2soKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDb3B5QXhpc0phckNvbW1hbmQoKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdTREwySmF2YUNvbW1hbmQoKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IE1vdmVEZXBsb3ltZW50RmlsZXNUYXNrKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTa2VsZXRvbjJXU0RMQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgVXBkYXRlV0VCWE1MQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTdGFydFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgLy8gdGhlIHNlY29uZCBidWlsZCBwcm9qZWN0IGNvbW1hbmQgaXMgbmVlZGVkIHRvIHN5bmNocm9uaXplIHdpdGggd29ya3NwYWNlIGF1dG8gYnVpbGQKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEJ1aWxkUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEF4aXNEZXBsb3lDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICBhZGQgKG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgT3BlbkphdmFFZGl0b3JDb21tYW5kKCksICIiKSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICAvLyBUcmFuc2Zvcm1lcnMKLSAgICBQcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyIHByb2plY3RUcmFuc2Zvcm1lciA9IG5ldyBQcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyKCk7Ci0KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gVmFsaWRhdGVXU0RMQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBWYWxpZGF0ZVdTRExDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBWYWxpZGF0ZVdTRExDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzawotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2suY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLQotICAgIC8vIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2suY2xhc3MsICJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLSAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0LmNsYXNzLCAiV3NkbFVSSSIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSHR0cEJhc2ljQXV0aFVzZXJuYW1lIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJIdHRwQmFzaWNBdXRoUGFzc3dvcmQiLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLQotICAgIC8vIE1vdmVEZXBsb3ltZW50RmlsZXNUYXNrCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgTW92ZURlcGxveW1lbnRGaWxlc1Rhc2suY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIE1vdmVEZXBsb3ltZW50RmlsZXNUYXNrLmNsYXNzKTsKLQotICAgIC8vIENvcHlBeGlzSmFyQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIENvcHlBeGlzSmFyQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotCi0gICAgLy8gU2tlbGV0b24yV1NETENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgU2tlbGV0b24yV1NETENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFNrZWxldG9uMldTRExDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBTa2VsZXRvbjJXU0RMQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAvLyBVcGRhdGVXRUJYTUxDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgVXBkYXRlV0VCWE1MQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotCi0gICAgLy8gUmVmcmVzaFByb2plY3RDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgUmVmcmVzaFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0gICAgCi0gICAgLy8gQnVpbGRQcm9qZWN0Q29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLQotICAgIC8vIFN0YXJ0UHJvamVjdENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyU2VydmVyIiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJOYW1lMklTZXJ2ZXJUcmFuc2Zvcm1lcigpKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb3B5QXhpc0phckNvbW1hbmQuY2xhc3MsICJQcm9qZWN0UmVzdGFydFJlcXVpcmVkIiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIklzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQiLCBudWxsKTsKLQotICAgIC8vIEF4aXNEZXBsb3lDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBBeGlzRGVwbG95Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uMldTRExDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBDb21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZC5jbGFzcyk7Ci0gICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbjJXU0RMQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDb21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQuY2xhc3MpOwotICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gT3BlbkphdmFFZGl0b3JDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kLmNsYXNzLCAiQ2xhc3NOYW1lcyIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgT3BlbkphdmFFZGl0b3JDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vU2tlbGV0b25Db25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vU2tlbGV0b25Db25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlMGY3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL3NrZWxldG9uL1NrZWxldG9uQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIFNrZWxldG9uQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbTsKLQotICAvKiBDT05URVhUX0lEIFBCU0MwMDAxIGZvciB0aGUgU2tlbGV0b24gQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9QT1BfUEJTQ19QQUdFID0gIlBCU0MwMDAxIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QQlNDX1BBR0UgPSAiVE9PTFRJUF9QQlNDX1BBR0UiOwotICAKLSAgLy8gcHJpdmF0ZSBUZXh0IHVyaVRleHRfOwotICAvKiBDT05URVhUX0lEIFBCQ0YwMDAyIGZvciB0aGUgVVJJIGZpZWxkIG9mIHRoZSBCZWFuIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUEJDRl9URVhUX1VSSSA9ICJQQkNGMDAwMiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QQkNGX1RFWFRfVVJJID0gIlRPT0xUSVBfUEJDRl9URVhUX1VSSSI7Ci0gIAotICBwcml2YXRlIFRleHQgd3NkbEZvbGRlclRleHRfOwotICAvKiBDT05URVhUX0lEIFBCQ0YwMDA2IGZvciB0aGUgV1NETCBGb2xkZXIgZmllbGQgaW4gdGhlIEJlYW4gQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GT0xERVIgPSAiUEJDRjAwMDYiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJDRl9URVhUX1dTRExfRk9MREVSID0gIlRPT0xUSVBfUEJDRl9URVhUX1dTRExfRk9MREVSIjsKLSAgCi0gIHByaXZhdGUgVGV4dCB3c2RsRmlsZVRleHRfOwotICAvKiBDT05URVhUX0lEIFBCQ0YwMDA3IGZvciB0aGUgV1NETCBGaWxlIGZpZWxkIG9mIHRoZSBCZWFuIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUEJDRl9URVhUX1dTRExfRklMRSA9ICJQQkNGMDAwNyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QQkNGX1RFWFRfV1NETF9GSUxFID0gIlRPT0xUSVBfUEJDRl9URVhUX1dTRExfRklMRSI7Ci0gIAotICBwcml2YXRlIENvbWJvIHNrZWxldG9uRm9sZGVyVGV4dF87Ci0gIC8qIENPTlRFWFRfSUQgUEJTQzAwMDQgZm9yIHRoZSBTa2VsZXRvbiBGb2xkZXIgZmllbGQgb2YgdGhlIFNrZWxldG9uIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCU0NfVEVYVF9TS0VMRVRPTl9GT0xERVIgPSAiUEJTQzAwMDQiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MVElQX1BCU0NfVEVYVF9TS0VMRVRPTl9GT0xERVIgPSAiVE9PTFRJUF9QQlNDX1RFWFRfU0tFTEVUT05fRk9MREVSIjsKLSAgLy8KLQotICAvKiBDT05URVhUX0lEIFBCU0MwMDA1IGZvciB0aGUgU2tlbGV0b24gRm9sZGVyIEJyb3dzZSBidXR0b24gb2YgdGhlIFNrZWxldG9uIENvbmZpZyBQYWdlICovCi0gIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCU0NfQlVUVE9OX1NLRUxFVE9OX0ZPTERFUl9CUk9XU0UgPSAiUEJTQzAwMDUiOyAvLyROT04tTkxTLTEkCi0gIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MVElQX1BCU0NfQlVUVE9OX1NLRUxFVE9OX0ZPTERFUl9CUk9XU0UgPSAiVE9PTFRJUF9QQlNDX0JVVFRPTl9TS0VMRVRPTl9GT0xERVJfQlJPV1NFIjsKLSAgCi0gIHByaXZhdGUgQnV0dG9uIHNob3dNYXBwaW5nc0NoZWNrYm94XzsKLSAgLyogQ09OVEVYVF9JRCBQQlNDMDAxNiBmb3IgdGhlIFNob3cgTWFwcGluZ3MgY2hlY2tib3ggb2YgdGhlIEJlYW4gTWV0aG9kcyBQYWdlICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX04yUF9TSE9XX01BUFBJTkdTID0gIlBCU0MwMDE2IjsgLy8kTk9OLU5MUy0xJAotCQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgICAgICAgID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLSAgICBTdHJpbmcgICAgICAgY29uUGx1Z2luSWQgICAgID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBTdHJpbmcgICAgICAgYmFzZUNvblBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgCi0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzICAgICAgICA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgTWVzc2FnZVV0aWxzIGNvbk1zZ1V0aWxzICAgICA9IG5ldyBNZXNzYWdlVXRpbHMoIGNvblBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgTWVzc2FnZVV0aWxzIGJhc2VDb25Nc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIGJhc2VDb25QbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICAgICAgICAgPSBuZXcgVUlVdGlscyggbXNnVXRpbHMsIHBsdWdpbklkICk7Ci0gICAgVUlVdGlscyAgICAgIGNvblVpVXRpbHMgICAgICA9IG5ldyBVSVV0aWxzKCBjb25Nc2dVdGlscywgcGx1Z2luSWQgKTsKLSAgICBVSVV0aWxzICAgICAgYmFzZUNvblVpVXRpbHMgID0gbmV3IFVJVXRpbHMoIGJhc2VDb25Nc2dVdGlscywgcGx1Z2luSWQgKTsKLQotICAJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggcGFyZW50LCBwbHVnaW5JZCArICIuIiArICBJTkZPUE9QX1BCU0NfUEFHRSApOwotICAJcGFyZW50LnNldFRvb2xUaXBUZXh0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCBUT09MVElQX1BCU0NfUEFHRSApICk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIHRleHRHcm91cCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDIsIDAsIDAgKTsKLQotICAgIC8qCi0gICAgdXJpVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIHRleHRHcm91cCwgIkxBQkVMX1VSSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUEJDRl9URVhUX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNGX1RFWFRfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICAqLwotCi0gICAgd3NkbEZvbGRlclRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCB0ZXh0R3JvdXAsICJMQUJFTF9PVVRQVVRfRk9MREVSX05BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9PTFRJUF9QQkNGX1RFWFRfV1NETF9GT0xERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotCi0gICAgd3NkbEZpbGVUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggdGV4dEdyb3VwLCAiTEFCRUxfT1VUUFVUX0ZJTEVfTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9PTFRJUF9QQkNGX1RFWFRfV1NETF9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDRl9URVhUX1dTRExfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLQotICAgIHNrZWxldG9uRm9sZGVyVGV4dF8gPSBiYXNlQ29uVWlVdGlscy5jcmVhdGVDb21ibyggdGV4dEdyb3VwLCAiTEFCRUxfU0tFTEVUT05fUk9PVF9OQU1FIiwKLSAgICAgICAgVE9PTFRJUF9QQlNDX1RFWFRfU0tFTEVUT05fRk9MREVSLAotICAgICAgICBJTkZPUE9QX1BCU0NfVEVYVF9TS0VMRVRPTl9GT0xERVIsCi0gICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gdWlVdGlscy5jcmVhdGVIb3Jpem9udGFsU2VwYXJhdG9yKCBwYXJlbnQsIDUgKTsKLQotICAgIHNob3dNYXBwaW5nc0NoZWNrYm94XyA9IGNvblVpVXRpbHMuY3JlYXRlQ2hlY2tib3goIHBhcmVudCwgIkxBQkVMX0VYUExPUkVfTUFQUElOR1NfWE1MMkJFQU4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX04yUF9TSE9XX01BUFBJTkdTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX04yUF9TSE9XX01BUFBJTkdTICk7Ci0gICAgICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludFVSSShTdHJpbmcgZW5kcG9pbnRVUkkpCi0gIHsKLSAgCS8qCi0gICAgaWYgKGVuZHBvaW50VVJJICE9IG51bGwpCi0gICAgICB1cmlUZXh0Xy5zZXRUZXh0KGVuZHBvaW50VVJJKTsKLSAgICAqLwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRXU0RMRm9sZGVyKFN0cmluZyBvdXRwdXRXU0RMRm9sZGVyKQotICB7Ci0gICAgaWYgKG91dHB1dFdTRExGb2xkZXIgIT0gbnVsbCkKLSAgICAgIHdzZGxGb2xkZXJUZXh0Xy5zZXRUZXh0KG91dHB1dFdTRExGb2xkZXIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRXU0RMRmlsZShTdHJpbmcgb3V0cHV0V1NETEZpbGUpCi0gIHsKLSAgICBpZiAob3V0cHV0V1NETEZpbGUgIT0gbnVsbCkKLSAgICAgIHdzZGxGaWxlVGV4dF8uc2V0VGV4dChvdXRwdXRXU0RMRmlsZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dEphdmFGb2xkZXIoU3RyaW5nIG91dHB1dEphdmFGb2xkZXIpCi0gIHsKLSAgICBpZiAob3V0cHV0SmF2YUZvbGRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHNrZWxldG9uRm9sZGVyVGV4dF8uaW5kZXhPZihvdXRwdXRKYXZhRm9sZGVyKTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgc2tlbGV0b25Gb2xkZXJUZXh0Xy5zZWxlY3QoaW5kZXgpOwotICAgICAgZWxzZSBpZiAoc2tlbGV0b25Gb2xkZXJUZXh0Xy5nZXRJdGVtQ291bnQoKSA8PSAwKQotICAgICAgewotICAgICAgICBTdHJpbmcgcm9vdCA9IGdldFdvcmtzcGFjZVJvb3RMb2NhdGlvbigpOwotICAgICAgICBpZiAob3V0cHV0SmF2YUZvbGRlci5zdGFydHNXaXRoKHJvb3QpKQotICAgICAgICAgIHNrZWxldG9uRm9sZGVyVGV4dF8uc2V0VGV4dChvdXRwdXRKYXZhRm9sZGVyLnN1YnN0cmluZyhyb290Lmxlbmd0aCgpKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBza2VsZXRvbkZvbGRlclRleHRfLnNldFRleHQob3V0cHV0SmF2YUZvbGRlcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTaG93TWFwcGluZyhib29sZWFuIHNob3dNYXBwaW5nKQotICB7Ci0gICAgc2hvd01hcHBpbmdzQ2hlY2tib3hfLnNldFNlbGVjdGlvbihzaG93TWFwcGluZyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dNYXBwaW5nKCkKLSAgewotICAgIHJldHVybiBzaG93TWFwcGluZ3NDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBqYXZhV1NETFBhcmFtLgotICAgKi8KLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0gICAgU3RyaW5nIHJvb3QgPSBnZXRXb3Jrc3BhY2VSb290TG9jYXRpb24oKTsKLSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShyb290KTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByb290ID0gZmlsZS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICBjaGFyIGxhc3RDaGFyID0gcm9vdC5jaGFyQXQocm9vdC5sZW5ndGgoKS0xKTsKLSAgICAgIGlmIChsYXN0Q2hhciA9PSAnLycgfHwgbGFzdENoYXIgPT0gJ1xcJykKLSAgICAgICAgcm9vdCA9IHJvb3Quc3Vic3RyaW5nKDAsIHJvb3QubGVuZ3RoKCktMSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgewotICAgIH0KLSAgICBqYXZhV1NETFBhcmFtLnNldE91dHB1dChyb290ICsgd3NkbEZvbGRlclRleHRfLmdldFRleHQoKSk7Ci0gICAgamF2YVdTRExQYXJhbS5zZXRKYXZhT3V0cHV0KHJvb3QgKyBza2VsZXRvbkZvbGRlclRleHRfLmdldFRleHQoKSk7Ci0JICByZXR1cm4gamF2YVdTRExQYXJhbTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkgIHRoaXMuamF2YVdTRExQYXJhbSA9IGphdmFXU0RMUGFyYW07Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpCi0gIHsKLSAgICBTdHJpbmcgb3JpZ2luYWxTa2VsZXRvbkZvbGRlciA9IHNrZWxldG9uRm9sZGVyVGV4dF8uZ2V0VGV4dCgpOwotICAgIHNrZWxldG9uRm9sZGVyVGV4dF8ucmVtb3ZlQWxsKCk7Ci0gICAgSVBhdGhbXSBwYXRocyA9IFJlc291cmNlVXRpbHMuZ2V0QWxsSmF2YVNvdXJjZUxvY2F0aW9ucyhzZXJ2aWNlUHJvamVjdCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGggOyBpKyspCi0gICAgICBza2VsZXRvbkZvbGRlclRleHRfLmFkZChwYXRoc1tpXS50b1N0cmluZygpKTsKLSAgICBpbnQgaW5kZXggPSBza2VsZXRvbkZvbGRlclRleHRfLmluZGV4T2Yob3JpZ2luYWxTa2VsZXRvbkZvbGRlcik7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgc2tlbGV0b25Gb2xkZXJUZXh0Xy5zZWxlY3QoaW5kZXgpOwotICAgIGVsc2UKLSAgICAgIHNrZWxldG9uRm9sZGVyVGV4dF8uc2VsZWN0KDApOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRXb3Jrc3BhY2VSb290TG9jYXRpb24oKQotICB7Ci0gIAlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCkudG9TdHJpbmcoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9Ta2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzN2RiMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9Ta2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5JV2ViTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkoyRUVXZWJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIElQcm9qZWN0IHNlcnZlclByb2plY3Q7Ci0gIHByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbTsKLQotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChTdHJpbmcgc2VydmVyUHJvamVjdCkKLSAgewotICAgIHRoaXMuc2VydmVyUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChzZXJ2ZXJQcm9qZWN0KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnRVUkkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0V1NETEZvbGRlcigpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBKMkVFV2ViTmF0dXJlUnVudGltZSBuYXR1cmUgPSAoSjJFRVdlYk5hdHVyZVJ1bnRpbWUpc2VydmVyUHJvamVjdC5nZXROYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCk7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG5hdHVyZS5nZXRNb2R1bGVTZXJ2ZXJSb290KCkuZ2V0RnVsbFBhdGgoKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLnRvU3RyaW5nKCkpOwotICAgICAgc2IuYXBwZW5kKCJ3c2RsIik7Ci0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRXU0RMRmlsZSgpCi0gIHsKLSAgICBpbnQgaW5kZXggPSB3c2RsVVJJLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgaW5kZXggPSB3c2RsVVJJLmxhc3RJbmRleE9mKCdcXCcpOwotICAgIHJldHVybiB3c2RsVVJJLnN1YnN0cmluZyhpbmRleCsxLCB3c2RsVVJJLmxlbmd0aCgpKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRKYXZhRm9sZGVyKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGNwID0gSmF2YUNvcmUuY3JlYXRlKHNlcnZlclByb2plY3QpLmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykKLSAgICAgICAgaWYgKGNwW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKQotICAgICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQoY3BbaV0uZ2V0UGF0aCgpKS50b1N0cmluZygpOwotICAgIH0KLSAgICBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd01hcHBpbmcoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dNYXBwaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRTaG93TWFwcGluZygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pCi0gIHsKLSAgCXRoaXMuamF2YVdTRExQYXJhbSA9IGphdmFXU0RMUGFyYW07Ci0gIH0KLSAgCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkKLSAgewotICAgIGphdmFXU0RMUGFyYW0uc2V0T3V0cHV0KGdldE91dHB1dFdTRExGb2xkZXIoKSk7Ci0gICAgamF2YVdTRExQYXJhbS5zZXRKYXZhT3V0cHV0KGdldE91dHB1dEphdmFGb2xkZXIoKSk7Ci0gICAgcmV0dXJuIGphdmFXU0RMUGFyYW07Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aXphcmQvYmVhbnMvV1NCZWFuQXhpc1R5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpemFyZC9iZWFucy9XU0JlYW5BeGlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGE5OWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpemFyZC9iZWFucy9XU0JlYW5BeGlzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLmJlYW5zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuSmF2YTJXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuV1NETDJKYXZhQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXNNYXBwaW5nc1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5jb21tYW5kLkphdmFUb1dTRExNZXRob2RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5EZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrLkxpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuLkF4aXNCZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuLkJlYW5Db25maWdXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5KYXZhUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIGNsYXNzIGZvciB0aGUKLSogSmF2YSBCZWFuCi0qIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3Mud2FzLmNyZWF0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlfS4KLSovCi1wdWJsaWMgY2xhc3MgV1NCZWFuQXhpc1R5cGUgaW1wbGVtZW50cyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUsIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17CQotICBwcml2YXRlIEphdmFSZXNvdXJjZUZpbHRlciBmaWx0ZXJfID0gbmV3IEphdmFSZXNvdXJjZUZpbHRlcigpOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJOYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgcnVudGltZU5hbWVfOwotICBwcml2YXRlIGJvb2xlYW4gaXNXZWJNb2R1bGVSZXF1aXJlZF87Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKCIlV1NfTkFNRV9CRUFOV0FYSVMiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIiVXU19ERVNDX0JFQU5XQVhJUyIpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBsYWJlbCBmb3IgdGhlIFNlcnZlciBzdXBwb3J0ZWQgYnkgdGhpcyBXZWIgU2VydmljZSB0eXBlCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBzZXJ2ZXIgbGFiZWwgZnJvbSBzZXJ2ZXIgcGx1Z2lucwotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckxhYmVsKCkKLSAgewotICAgIHJldHVybiBzZXJ2ZXJOYW1lXzsKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIHNlcnZlciBsYWJlbCB0byB0aGUgYXBwcm9wcmlhdGUgbmFtZSBmb3VuZCBpbiB0aGUgc2VydmVyIHBsdWdpbnMuCi0gICogQHBhcmFtIHNlcnZlciBuYW1lCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckxhYmVsKFN0cmluZyBzZXJ2ZXJMYWJlbCkKLSAgewotICAgIHNlcnZlck5hbWVfID0gc2VydmVyTGFiZWw7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgbGFiZWwgZm9yIHRoZSBkZXBsb3ltZW50IHJ1bnRpbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBsYWJlbCBmb3IgdGhlIGRlcGxveW1lbnQgcnVudGltZQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gcnVudGltZU5hbWVfOwotICB9Ci0KLSAgLyoqCi0gICogU2V0cyB0aGUgcnVudGltZSBsYWJlbCBmb3IgdGhlIGFwcHJvcHJpYXRlIHJ1bnRpbWUKLSAgKiBAcGFyYW0gc2VydmVyIG5hbWUKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UnVudGltZUxhYmVsKFN0cmluZyBydW50aW1lTGFiZWwpCi0gIHsKLSAgICBydW50aW1lTmFtZV8gPSBydW50aW1lTGFiZWw7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbGFiZWwgZm9yIHRoZSBXZWIgU2VydmljZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAqIEByZXR1cm4gQSBsYWJlbCBmb3IgdGhlIFdlYiBTZXJ2aWNlIHR5cGUKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZUxhYmVsKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJVdFQlNFUlZJQ0VUWVBFX05BTUVfSkFWQV9BWElTIik7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgV2ViIE1vZHVsZSBpcyByZXF1aXJlZCBmb3IgdGhpcyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgKiBAcmV0dXJuIHRydWUgaWYgcmVxdWlyZVdlYk1vZHVsZQotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dlYk1vZHVsZVJlcXVpcmVkKCkKLSAgewotICAgIHJldHVybiBpc1dlYk1vZHVsZVJlcXVpcmVkXzsKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIGJvb2xlYW4gdmFsdWUgYXQgcnVudGltZSBhY2NvcmRpbmcgdG8gcmVxdWlyZVdlYk1vZHVsZSBhdHRyaWJ1dGUgZnJvbSB0aGUgbWFuaWZlc3QgZmlsZQotICAqIEBwYXJhbSByZXF1aXJlV2ViTW9kdWxlIAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJNb2R1bGVSZXF1aXJlZChib29sZWFuIHJlcXVpcmVXZWJNb2R1bGUpCi0gIHsKLSAgICBpc1dlYk1vZHVsZVJlcXVpcmVkXyA9IHJlcXVpcmVXZWJNb2R1bGU7Ci0gIH0KLQotICAKLSAgLyoqCi0gICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUjaXNFSkJNb2R1bGVSZXF1aXJlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkJNb2R1bGVSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlI3NldEVKQk1vZHVsZVJlcXVpcmVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RUpCTW9kdWxlUmVxdWlyZWQoYm9vbGVhbiBhcmcwKSB7Ci0JCXJldHVybjsKLQotCX0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkgCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSAKLSAgewotICAgIC8qCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIEN1cnJlbnRQYWdlQ29tbWFuZC5jbGFzcywgIkN1cnJlbnRQYWdlIiwgQmVhbkNsYXNzV2lkZ2V0LmNsYXNzICk7Ci0gICAgLy9CZWFuQ2xhc3NXaWRnZXQgLSBhcyB0YXJnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFCZWFuTmFtZSIsIEJlYW5DbGFzc1dpZGdldC5jbGFzcywgIkJlYW5DbGFzc05hbWUiLCBudWxsKTsKLSAgICAvL0JlYW5DbGFzc1dpZGdldCAtIGFzIHNvdXJjZQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEJlYW5DbGFzc1dpZGdldC5jbGFzcywgIkJlYW5DbGFzc05hbWUiLCBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5jbGFzcywgIkphdmFCZWFuTmFtZSIsIG51bGwpOyAgICAvL0JlYW5Db25maWdXaWRnZXQKLSAgICAqLwotICAgIC8vIE9iamVjdFNlbGVjdGlvbldpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbldpZGdldC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvL0JlYW5Db25maWdXaWRnZXQgLSBhcyB0YXJnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBCZWFuQ29uZmlnV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIG51bGwgKTsKLSAgICAvL0JlYW5Db25maWdXaWRnZXQgLSBhcyBzb3VyY2UKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhCZWFuQ29uZmlnV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIExpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2suY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQmVhbkNvbmZpZ1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEJlYW5Db25maWdXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2suY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQmVhbkNvbmZpZ1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBKYXZhMldTRExDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOyAgICAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhCZWFuQ29uZmlnV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7Ci0gICAgICAgIAotICAgIC8vTWFwcGluZ0ZyYWdtZW50IChvcHRpb25hbGx5IGRpc3BsYXlzIHRoZSBBeGlzTWFwcGluZ3NXaWRnZXQpIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEJlYW5Db25maWdXaWRnZXQuY2xhc3MsICJDdXN0b21pemVTZXJ2aWNlTWFwcGluZ3MiLCBBeGlzQmVhbkZyYWdtZW50Lk1hcHBpbmdGcmFnbWVudC5jbGFzcyk7Ci0KLSAgICAvL0F4aXNNYXBwaW5nc1dpZGdldCAtIGFzIHRhcmdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEJlYW5Db25maWdXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzKTsKLSAgICAKLSAgICAvL0F4aXNNYXBwaW5nc1dpZGdldCAtIGFzIHNvdXJjZQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgSmF2YTJXU0RMQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsgICAgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7ICAgIAotICAgIAotICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIERlZmF1bHRzRm9yQ29uZmlnLmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIEJlYW5Db25maWdXaWRnZXQuY2xhc3MgKTsKLSAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBEZWZhdWx0c0ZvckNvbmZpZy5jbGFzcywgIkN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5ncyIsIEJlYW5Db25maWdXaWRnZXQuY2xhc3MgKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpIAotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0gICAgLyoKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJCZWFuU2VsZWN0aW9uIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTQkVBTl9DTEFTUyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTQkVBTl9DTEFTUyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCZWFuQ2xhc3NXaWRnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICAgICovCi0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJCZWFuQ29uZmlnIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTQkVBTl9DT05GSUciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU0JFQU5fQ09ORklHIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJlYW5Db25maWdXaWRnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotCi0gICAgU3RyaW5nICAgICAgIGNvbnNQbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBjb25zTXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBjb25zUGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJBeGlzU2VydmljZUJlYW5NYXBwaW5nIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zTXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19CRUFOMlhNTCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc01zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19QMk5fTUFQUElOR1MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXhpc01hcHBpbmdzV2lkZ2V0KEF4aXNNYXBwaW5nc1dpZGdldC5NT0RFX0JFQU4yWE1MICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5I2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKSAKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgewotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IEF4aXNCZWFuRnJhZ21lbnQoKTsgCi0gICAgICB9Ci0gICAgfTsKLSAgfQotICAgIAotfQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2l6YXJkL3dzZGwvV1NXU0RMQXhpc1R5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpemFyZC93c2RsL1dTV1NETEF4aXNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZjI0Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2l6YXJkL3dzZGwvV1NXU0RMQXhpc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC53c2RsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuV1NETDJKYXZhQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXNNYXBwaW5nc0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc01hcHBpbmdzV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbi5BeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uLkF4aXNTa2VsZXRvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b24uU2tlbGV0b25Db25maWdXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbi5Ta2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV1NETFJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGEuUHJvamVjdE5hbWUySVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGNsYXNzIGZvciB0aGUgQXhpcyBXZWIgc2VydmljZSB0eXBlLgotKi8KLXB1YmxpYyBjbGFzcyBXU1dTRExBeGlzVHlwZSBpbXBsZW1lbnRzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSwgQ29tbWFuZFdpZGdldEJpbmRpbmcgCi17Ci0JcHJpdmF0ZSBXU0RMUmVzb3VyY2VGaWx0ZXIgZmlsdGVyXyA9IG5ldyBXU0RMUmVzb3VyY2VGaWx0ZXIoKTsKLQotCXByaXZhdGUgU3RyaW5nIHNlcnZlck5hbWVfOwotCXByaXZhdGUgU3RyaW5nIHJ1bnRpbWVOYW1lXzsKLQlwcml2YXRlIGJvb2xlYW4gaXNXZWJNb2R1bGVSZXF1aXJlZF87Ci0JLyoqCi0JKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLQkqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotCSovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIiVXU19OQU1FX1dTRExBWElTIik7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLQkqIEByZXR1cm4gQSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotCSovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKCIlV1NfREVTQ19XU0RMQVhJUyIpOwotCX0KLQotCS8qKgotCSogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBsYWJlbCBmb3IgdGhlIFNlcnZlciBzdXBwb3J0ZWQgYnkgdGhpcyBXZWIgU2VydmljZSB0eXBlCi0JKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIHNlcnZlciBsYWJlbCBmcm9tIHNlcnZlciBwbHVnaW5zCi0JKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlckxhYmVsKCkgewotCQlyZXR1cm4gc2VydmVyTmFtZV87Ci0JfQotCi0JLyoqCi0JKiBTZXRzIHRoZSBzZXJ2ZXIgbGFiZWwgdG8gdGhlIGFwcHJvcHJpYXRlIG5hbWUgZm91bmQgaW4gdGhlIHNlcnZlciBwbHVnaW5zLgotCSogQHBhcmFtIHNlcnZlciBuYW1lCi0JKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJMYWJlbChTdHJpbmcgc2VydmVyTGFiZWwpIHsKLQkJc2VydmVyTmFtZV8gPSBzZXJ2ZXJMYWJlbDsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgbGFiZWwgZm9yIHRoZSBkZXBsb3ltZW50IHJ1bnRpbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlCi0JKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGxhYmVsIGZvciB0aGUgZGVwbG95bWVudCBydW50aW1lCi0JKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbCgpIHsKLQkJcmV0dXJuIHJ1bnRpbWVOYW1lXzsKLQl9Ci0KLQkvKioKLQkqIFNldHMgdGhlIHJ1bnRpbWUgbGFiZWwgZm9yIHRoZSBhcHByb3ByaWF0ZSBydW50aW1lCi0JKiBAcGFyYW0gc2VydmVyIG5hbWUKLQkqLwotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVMYWJlbChTdHJpbmcgcnVudGltZUxhYmVsKSB7Ci0JCXJ1bnRpbWVOYW1lXyA9IHJ1bnRpbWVMYWJlbDsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgYSBsYWJlbCBmb3IgdGhlIFdlYiBTZXJ2aWNlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0JKiBAcmV0dXJuIEEgbGFiZWwgZm9yIHRoZSBXZWIgU2VydmljZSB0eXBlCi0JKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZSgKLQkJCSIlV0VCU0VSVklDRVRZUEVfTkFNRV9XU0RMX0FYSVMiKTsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgd2hldGhlciBvciBub3QgYSBXZWIgTW9kdWxlIGlzIHJlcXVpcmVkIGZvciB0aGlzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotCSogQHJldHVybiB0cnVlIGlmIHJlcXVpcmVXZWJNb2R1bGUKLQkqLwotCXB1YmxpYyBib29sZWFuIGlzV2ViTW9kdWxlUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBpc1dlYk1vZHVsZVJlcXVpcmVkXzsKLQl9Ci0KLQkvKioKLQkqIFNldHMgdGhlIGJvb2xlYW4gdmFsdWUgYXQgcnVudGltZSBhY2NvcmRpbmcgdG8gcmVxdWlyZVdlYk1vZHVsZSBhdHRyaWJ1dGUgZnJvbSB0aGUgbWFuaWZlc3QgZmlsZQotCSogQHBhcmFtIHJlcXVpcmVXZWJNb2R1bGUgCi0JKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJNb2R1bGVSZXF1aXJlZChib29sZWFuIHJlcXVpcmVXZWJNb2R1bGUpIHsKLQkJaXNXZWJNb2R1bGVSZXF1aXJlZF8gPSByZXF1aXJlV2ViTW9kdWxlOwotCX0KLQotCS8qKgotCSogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlI2lzRUpCTW9kdWxlUmVxdWlyZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCTW9kdWxlUmVxdWlyZWQoKSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUjc2V0RUpCTW9kdWxlUmVxdWlyZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFSkJNb2R1bGVSZXF1aXJlZChib29sZWFuIGFyZzApIHsKLQkJcmV0dXJuOwotCi0JfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KSAKLSAgewotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgCi0gIHsKLSAgICAvLyBTa2VsZXRvbkNvbmZpZ1dpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0LmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIG5ldyBQcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRW5kcG9pbnRVUkkiLCBTa2VsZXRvbkNvbmZpZ1dpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIk91dHB1dFdTRExGb2xkZXIiLCBTa2VsZXRvbkNvbmZpZ1dpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIk91dHB1dFdTRExGaWxlIiwgU2tlbGV0b25Db25maWdXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJPdXRwdXRKYXZhRm9sZGVyIiwgU2tlbGV0b25Db25maWdXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTaG93TWFwcGluZyIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0LmNsYXNzKTsKLQotICAgIC8vIEF4aXNNYXBwaW5nc0ZyYWdtZW50Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNob3dNYXBwaW5nIiwgQXhpc01hcHBpbmdzRnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0LmNsYXNzLCAiU2hvd01hcHBpbmciLCBBeGlzTWFwcGluZ3NGcmFnbWVudC5jbGFzcyk7Ci0KLSAgICAvLyBBeGlzTWFwcGluZ3NXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgbnVsbCk7Ci0KLSAgICAvLyBXU0RMMkphdmFDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KSAKLSAgewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICAKLSAgICAvKgotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIldTRExTZWxlY3Rpb24iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfU0VMRUNUSU9OIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfU0VMRUNUSU9OIiksCi0JCSAgICAgICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkJICAgICAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JCSAgICAgICAgICAgICAgICAgIHsKLQkJICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdTRExTZWxlY3Rpb25XaWRnZXQoKTsKLQkJICAgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgfSApOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiV1NETFNlbGVjdGlvblRyZWVXaWRnZXQiLCAKLSAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU0RMX1NFTEVDVElPTiIpLAotICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NETF9TRUxFQ1RJT04iKSwKLSAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBXU0RMU2VsZWN0aW9uVHJlZVdpZGdldCgpOwotICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICovCi0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJTa2VsZXRvbkNvbmZpZyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU1NLRUxfQ09ORklHIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NTS0VMX0NPTkZJRyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTa2VsZXRvbkNvbmZpZ1dpZGdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJBeGlzTWFwcGluZ3NXaWRnZXQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfWE1MMkJFQU4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19OMlBfTUFQUElOR1MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXhpc01hcHBpbmdzV2lkZ2V0KEF4aXNNYXBwaW5nc1dpZGdldC5NT0RFX1hNTDJCRUFOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICB7Ci0gICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQXhpc1NrZWxldG9uRnJhZ21lbnQoKTsgCi0gICAgICB9Ci0gICAgfTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxYzE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzYy11aS5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZDJlOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb248L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5kaXNjb3ZlcnkuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3NkbDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlcjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS53c2lsPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwYjNiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotc291cmNlLndzYy11aS5qYXIgPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSB3c2MtdWkuamFyLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGRvYy8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jb25maWdfaGFuZGxlcl93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY29uZmlnX2hhbmRsZXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhM2EyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jb25maWdfaGFuZGxlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L2NvbmZpZ3VyZV9oYW5kbGVycy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvY29uZmlndXJlX2hhbmRsZXJzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExM2M4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvY29uZmlndXJlX2hhbmRsZXJzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9nZW5lcmF0ZWRfc2FtcGxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9nZW5lcmF0ZWRfc2FtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiYTUxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvZ2VuZXJhdGVkX3NhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjbGllbnRfd2Vic2Vydl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUwNWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjbGllbnRfd2Vic2Vydl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9kdG9vbC9jb25maWd1cmVfaGFuZGxlcnMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9kdG9vbC9jb25maWd1cmVfaGFuZGxlcnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDYwZGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvZHRvb2wvY29uZmlndXJlX2hhbmRsZXJzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvZHRvb2wvZ2VuZXJhdGVkX3NhbXBsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2R0b29sL2dlbmVyYXRlZF9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTBkMzk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvZHRvb2wvZ2VuZXJhdGVkX3NhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc2NsaWVudF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiN2EyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc2NsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZ2VuX3NhbXBsZV93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZ2VuX3NhbXBsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdhZDVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2dlbl9zYW1wbGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2ltcG9ydF93cy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9pbXBvcnRfd3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDFmZTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2ltcG9ydF93cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9pbXBvcnRfd3Nfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2ltcG9ydF93c193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzA2MWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2ltcG9ydF93c193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvcmVnaXN0cnkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvcmVnaXN0cnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQzY2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3JlZ2lzdHJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NlcnZlcnMvZXhpc3Rpbmdfc2VydmVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zZXJ2ZXJzL2V4aXN0aW5nX3NlcnZlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI2Y2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NlcnZlcnMvZXhpc3Rpbmdfc2VydmVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zZXJ2ZXJzL3NlcnZlcnNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NlcnZlcnMvc2VydmVyc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI2Y2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NlcnZlcnMvc2VydmVyc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9odG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaHRtbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZTdkYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9odG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaW1wb3J0X3dpel9iYW5uZXJfd3NpbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2ltcG9ydF93aXpfYmFubmVyX3dzaWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWIzNGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaW1wb3J0X3dpel9iYW5uZXJfd3NpbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2ltcG9ydF93c2lsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaW1wb3J0X3dzaWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MThhOTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaW1wb3J0X3dzaWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC93c2RsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC93c2RsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvd3NpbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL3dzaWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzU5MTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvd3NpbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2QzNzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBDb25zdW1wdGlvbiBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1GRUFUVVJFX0RFU0NSSVBUSU9OPVdlYiBzZXJ2aWNlcwotCi1YUF9QVUJMSUNfVURESV9SRUdJU1RSWV9UWVBFUz1QdWJsaWMgVURESSBSZWdpc3RyeSBUeXBlcwotWFBfUFJJVkFURV9VRERJX1JFR0lTVFJZX1RZUEVTPVByaXZhdGUgVURESSBSZWdpc3RyeSBUeXBlcwotWFBfV0VCX1NFUlZJQ0VfQ0xJRU5UX1RZUEVTPVdlYiBTZXJ2aWNlIENsaWVudCBUeXBlcwotWFBfV0VCX1NFUlZJQ0VfVEVTVD1XZWIgU2VydmljZSBUZXN0Ci1YUF9XRUJfU0VSVklDRV9TRVJWRVJfUlVOVElNRV9UWVBFUz1XZWIgU2VydmljZSBTZXJ2ZXIgUnVudGltZSBUeXBlcwotWFBfV0VCX1NFUlZJQ0VfQ0xJRU5UX1BST0pFQ1RfVFlQRT1jbGllbnRQcm9qZWN0VHlwZQotWFBfT0JKRUNUX1NFTEVDVElPTl9XSURHRVQ9b2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0KLSMKLSMgV2l6YXJkcy4KLSMKLVdJWkFSRF9USVRMRV9XU0M9V2ViIFNlcnZpY2UgQ2xpZW50Ci0KLVBMVUdJTl9ORVdfV0laQVJEX05BTUVfV1NfQ0xJRU5UPVdlYiBTZXJ2aWNlIENsaWVudAotUExVR0lOX0lNUE9SVF9XSVpBUkRfTkFNRV9XUz1XZWIgU2VydmljZQotUExVR0lOX05FV19XSVpBUkRfREVTQ19XU19DTElFTlQ9QWNjZXNzIGFuIGV4aXN0aW5nIFhNTCB3ZWIgc2VydmljZQotUExVR0lOX0lNUE9SVF9XSVpBUkRfREVTQ19XUz1BIHdpemFyZCBmb3IgaW1wb3J0aW5nIGEgd2ViIHNlcnZpY2UKLUlNUE9SVF9XSVpBUkRfREVTQ19XU0lMPUltcG9ydCBXU0RMIHJlZmVyZW5jZXMgdG8gYSBXU0lMIGRvY3VtZW50Ci0KLSMKLSMgV2ViIFNhbXBsZXMgSURzCi0jCi1TQU1QTEVfVFlQRV9XRUJTRVJWSUNFU19JRD1XZWIgc2VydmljZSBzYW1wbGUgSlNQcwotCi0jCi0jIFBvcC11cCBhY3Rpb25zCi0jCi1BQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWT1HZW5lcmF0ZSBDbGllbnQKLUFDVElPTl9HRU5fU0FNUExFPUdlbmVyYXRlIFNhbXBsZSBKU1BzCi0KLSMKLSMgRGlhbG9ncwotIwotQ0hFQ0tCT1hfU0hPV19HRU5FUkFURV9KQVZBX1BST1hZX0RJQUxPRz1IaWRlIEdlbmVyYXRlIEphdmEgYmVhbiBQcm94eSBEaWFsb2cKLUNIRUNLQk9YX1NIT1dfUFJPWFkyU0FNUExFX0RJQUxPRz1IaWRlIFByb3h5IFRvIFNhbXBsZSBHZW5lcmF0aW9uIERpYWxvZwotVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1dTREwyUFJPWFk9SGlkZSB0aGUgZGlhbG9nIGZvciBnZW5lcmF0aW5nIHRoZSBKYXZhIGJlYW4gcHJveHkgYWN0aW9uLgotVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1BST1hZMlNBTVBMRT1IaWRlIHRoZSBkaWFsb2cgZm9yIGdlbmVyYXRpbmcgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBhY3Rpb24uCi0KLSMKLSMgICAgICAgV2ViIFNlcnZpY2VzIFByZWZlcmFuY2UgUGFnZXMKLSMKLSMgQ2F0ZWdvcmllcwotCi1QUkVGRVJFTkNFX0NBVEVHT1JZX1NFUlZFUl9SVU5USU1FPVNlcnZlciBhbmQgUnVudGltZQotUFJFRkVSRU5DRV9DQVRFR09SWV9QUk9KRUNUX1RPUE9MT0dZPVByb2plY3QgVG9wb2xvZ3kKLVBSRUZFUkVOQ0VfQ0FURUdPUllfVEVTVF9GQUNJTElUWT1UZXN0IEZhY2lsaXR5IERlZmF1bHRzCi1QUkVGRVJFTkNFX0NBVEVHT1JZX0RJQUxPR1M9UG9wdXAgRGlhbG9nIFNlbGVjdGlvbgotCi0KLSMKLSMgUG9wLXVwIGFjdGlvbnMKLSMKLU1FTlVfUlVOPSZSdW4KLQotIwotIyBXZWJTZXJ2aWNlVGVzdFBhZ2UKLSMKLVdTRVhQTE9SRVJfSUQ9V2ViIFNlcnZpY2VzIEV4cGxvcmVyCi0KLSMKLSMgV2ViU2VydmljZVB1Ymxpc2hQYWdlCi0jCi1UT09MVElQX0xBVU5DSF9XU19FWFBMT1JFUj1MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotQ09NTUFORF9MQVVOQ0hfV1NfRVhQTE9SRVI9TGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIKLQotIwotIyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlCi0jCi1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfSUJNPUlCTSBVRERJIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfSUJNX1RFU1Q9SUJNIFVEREkgVGVzdCBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX01JQ1JPU09GVD1NaWNyb3NvZnQgVURESSBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX01JQ1JPU09GVF9URVNUPU1pY3Jvc29mdCBVRERJIFRlc3QgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9TQVA9U0FQIFVEREkgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9TQVBfVEVTVD1TQVAgVURESSBUZXN0IFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfWE1FVEhPRFM9WE1ldGhvZHMgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9OVFRDT01NPU5UVCBDb21tdW5pY2F0aW9ucyBSZWdpc3RyeQotCi0jCi0jIFdTSUwgcHJveHkKLSMKLUlNUE9SVF9XSVpBUkRfTkFNRV9XU0lMPVdTSUwKLVBPUFVQX0dFTkVSQVRFX1dTSUw9R2VuZXJhdGUgV1NJTAotCi0jCi0jIFdlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIFR5cGUKLSMKLVdFQlNFUlZJQ0VUWVBFX05BTUVfV1NETD1Ta2VsZXRvbiBKYXZhIGJlYW4gV2ViIFNlcnZpY2UKLVdFQlNFUlZJQ0VUWVBFX05BTUVfSkFWQT1KYXZhIGJlYW4gV2ViIFNlcnZpY2UKLQotIwotIyBDbGllbnQgcHJvamVjdCB0eXBlCi0jCi1MQUJFTF9DTElFTlRfVFlQRV9XRUI9V2ViCi1MQUJFTF9DTElFTlRfVFlQRV9FSkI9RUpCCi1MQUJFTF9DTElFTlRfVFlQRV9BUFBfQ0xJRU5UPUFwcGxpY2F0aW9uIENsaWVudAotTEFCRUxfQ0xJRU5UX1RZUEVfQ09OVEFJTkVSTEVTUz1KYXZhCi0KLSMKLSMgSGFuZGxlcnMgQ29uZmlndXJhdGlvbiB3aXphcmQgcGFnZQotIwotUE9QVVBfQUREX0hBTkRMRVJTPUNvbmZpZ3VyZSBoYW5kbGVycwotTEFCRUxfSEFORExFUlNfQ09ORklHPUNvbmZpZ3VyZSBIYW5kbGVycwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMDFhMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzYy11aS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiLz4KLSAgICAgIDwhLS0KLSAgICAgIFNob3VsZCBub3QgbmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCwgYnV0IGFic2VuY2UgY2F1c2VzCi0gICAgICBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQgdG8gZmFpbCB0byBjb21waWxlIGR1ZSB0bwotICAgICAgbWlzc2luZyBpbmRpcmVjdCBkZXBlbmRlbmN5IG9uCi0gICAgICBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5Xb3JraW5nQ29weVByb3ZpZGVyCi0gICAgICAtLT4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuZXhwbG9yZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0iLz4KLQkgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLndzaWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC53ZWJicm93c2VyIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2VzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5kZXBlbmRlbmN5Y2hlY2tlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cy51aSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPCEtLSBUaGlyZCBwYXJ0eSBmaWxlIGRlcGVuZGVuY2llcyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZGVwZW5kZW5jeWNoZWNrZXIuZGVwZW5kZW5jaWVzIj4KLSAgICAgIDxkZXBlbmRlbmN5IGRlc2NyaXB0aW9uPSIlRkVBVFVSRV9ERVNDUklQVElPTiI+Ci0gICAgICAgICA8cmVxdWlyZWRQbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUuYXhpcyIvPgotICAgICAgICAgPHJlcXVpcmVkUGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLndzaWwiLz4KLSAgICAgICAgIDxyZXF1aXJlZFBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLnVkZGk0aiIvPgotICAgICAgICAgPHJlcXVpcmVkUGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotICAgICAgPC9kZXBlbmRlbmN5PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJwdWJsaWNVRERJUmVnaXN0cnlUeXBlIgotICAgICAgbmFtZT0iJVhQX1BVQkxJQ19VRERJX1JFR0lTVFJZX1RZUEVTIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJwcml2YXRlVURESVJlZ2lzdHJ5VHlwZSIKLSAgICAgIG5hbWU9IiVYUF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVMiLz4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9IndlYlNlcnZpY2VDbGllbnRUeXBlIgotICAgICAgbmFtZT0iJVhQX1dFQl9TRVJWSUNFX0NMSUVOVF9UWVBFUyIKLSAgICAgIHNjaGVtYT0ic2NoZW1hL3dlYlNlcnZpY2VDbGllbnRUeXBlLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9IndlYlNlcnZpY2VUZXN0IgotICAgICAgbmFtZT0iJVhQX1dFQl9TRVJWSUNFX1RFU1QiCi0gICAgICBzY2hlbWE9InNjaGVtYS93ZWJTZXJ2aWNlVGVzdC5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJ3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUiCi0gICAgICBuYW1lPSIlWFBfV0VCX1NFUlZJQ0VfU0VSVkVSX1JVTlRJTUVfVFlQRVMiCi0gICAgICBzY2hlbWE9InNjaGVtYS93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0iY2xpZW50UHJvamVjdFR5cGUiCi0gICAgICBuYW1lPSIlWFBfV0VCX1NFUlZJQ0VfQ0xJRU5UX1BST0pFQ1RfVFlQRSIKLSAgICAgIHNjaGVtYT0ic2NoZW1hL2NsaWVudFByb2plY3RUeXBlLmV4c2QiLz4gICAKLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9Im9iamVjdFNlbGVjdGlvbldpZGdldCIKLSAgICAgIG5hbWU9IiVYUF9PQkpFQ1RfU0VMRUNUSU9OX1dJREdFVCIKLSAgICAgIHNjaGVtYT0ic2NoZW1hL29iamVjdFNlbGVjdGlvbldpZGdldC5leHNkIi8+Ci0KLQotICAgPCEtLSBUaGlyZCBwYXJ0eSBmaWxlIGRlcGVuZGVuY2llcyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZGVwZW5kZW5jeWNoZWNrZXIuZGVwZW5kZW5jaWVzIj4KLSAgICAgPGRlcGVuZGVuY3kgZGVzY3JpcHRpb249IiVGRUFUVVJFX0RFU0NSSVBUSU9OIj4KLSAgICAgICA8cmVxdWlyZWRQbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUuYXhpcyIvPgotICAgICAgIDxyZXF1aXJlZFBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS53c2lsIi8+Ci0gICAgICAgPHJlcXVpcmVkUGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MudWRkaTRqIi8+Ci0gICAgICAgPHJlcXVpcmVkUGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotICAgICA8L2RlcGVuZGVuY3k+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSBVRERJIFJlZ2lzdHJ5IFR5cGVzIC0tPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfSUJNX1RFU1QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeUlCTVRlc3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeUlCTVRlc3QiPgotICAgICAgPC9wdWJsaWNVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucHVibGljVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHVibGljVURESVJlZ2lzdHJ5VHlwZQotICAgICAgICAgICAgbmFtZT0iJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9JQk0iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeUlCTSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5SUJNIj4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUX1RFU1QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QiPgotICAgICAgPC9wdWJsaWNVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucHVibGljVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHVibGljVURESVJlZ2lzdHJ5VHlwZQotICAgICAgICAgICAgbmFtZT0iJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0Ij4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQX1RFU1QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVNBUFRlc3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVNBUFRlc3QiPgotICAgICAgPC9wdWJsaWNVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucHVibGljVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHVibGljVURESVJlZ2lzdHJ5VHlwZQotICAgICAgICAgICAgbmFtZT0iJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9TQVAiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVNBUCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5U0FQIj4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfWE1FVEhPRFMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVhNZXRob2RzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlYTWV0aG9kcyI+Ci0gICAgICA8L3B1YmxpY1VERElSZWdpc3RyeVR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5wdWJsaWNVRERJUmVnaXN0cnlUeXBlIj4KLSAgICAgIDxwdWJsaWNVRERJUmVnaXN0cnlUeXBlCi0gICAgICAgICAgICBuYW1lPSIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX05UVENPTU0iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU5UVENvbW0iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU5UVENvbW0iPgotICAgICAgPC9wdWJsaWNVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gVGVzdCBGYWNpbGl0aWVzIC0tPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndlYlNlcnZpY2VUZXN0Ij4KLQotICAgICAgPHdlYlNlcnZpY2VUZXN0Ci0gICAgICAgICAgICBtZXRob2RzbmVlZGVkPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVNBTVBMRV9UWVBFX1dFQlNFUlZJQ0VTX0lEIgotICAgICAgICAgICAgamF2YT0idHJ1ZSIKLSAgICAgICAgICAgIGNvZGVnZW49InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC53c3NhbXBsZS5XZWJTZXJ2aWNlV1NTYW1wbGVFeGVjdXRhYmxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZVNhbXBsZVRlc3QiPgotICAgICAgPC93ZWJTZXJ2aWNlVGVzdD4KLQotICAgICAgPHdlYlNlcnZpY2VUZXN0Ci0gICAgICAgICAgICBtZXRob2RzbmVlZGVkPSJmYWxzZSIKLSAgICAgICAgICAgIG5hbWU9IiVXU0VYUExPUkVSX0lEIgotICAgICAgICAgICAgamF2YT0iZmFsc2UiCi0gICAgICAgICAgICBjb2RlZ2VuPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyLldlYlNlcnZpY2VFeHBsb3JlckV4ZWN1dGFibGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5leHBsb3Jlci5XZWJTZXJ2aWNlRXhwbG9yZXJFeGVjdXRhYmxlIj4KLSAgICAgIDwvd2ViU2VydmljZVRlc3Q+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIEphdmEgQmVhbnMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIj4KLQotICAgICAgPHdlYlNlcnZpY2VUeXBlCi0gICAgICAgICAgICBsYWJlbD0iJVdFQlNFUlZJQ0VUWVBFX05BTUVfSkFWQSIKLSAgICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFkYXRhPSJGaWxlIElSZXNvdXJjZSBDb21waWxhdGlvblVuaXQiCi0gICAgICAgICAgICBleHRlbnNpb25NZXRhZGF0YT0iLmphdmEgLmNsYXNzIgotICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0PSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSmF2YUJlYW5TZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICBpbmNsdWRlTmF0dXJlcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSIKLSAgICAgICAgICAgIGV4Y2x1ZGVOYXR1cmVzPSIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUuamF2YSI+Ci0gICAgICA8L3dlYlNlcnZpY2VUeXBlPgotCi0gICAgICA8d2ViU2VydmljZVR5cGUKLSAgICAgICAgICAgIGxhYmVsPSIlV0VCU0VSVklDRVRZUEVfTkFNRV9XU0RMIgotICAgICAgICAgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGE9IkZpbGUgSVJlc291cmNlIFN0cmluZyBTZXJ2aWNlSW1wbCBTZXJ2aWNlUmVmSW1wbCBXU0RMUmVzb3VyY2VJbXBsIgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii53c2RsIC53c2lsIC5odG1sIC5TZXJ2aWNlSW1wbCAuU2VydmljZVJlZkltcGwgLldTRExSZXNvdXJjZUltcGwiCi0gICAgICAgICAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5XU0RMU2VsZWN0aW9uV2lkZ2V0IgotICAgICAgICAgICAgaW5jbHVkZU5hdHVyZXM9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlTmF0dXJlcz0iIiAgICAgICAgICAgIAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLndzZGwiPgotICAgICAgPC93ZWJTZXJ2aWNlVHlwZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gRHluYW1pYyBXaXphcmRzIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19DTElFTlQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVQTFVHSU5fTkVXX1dJWkFSRF9ERVNDX1dTX0NMSUVOVAotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZy5DbGllbnRXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgdGl0bGU9IiVXSVpBUkRfVElUTEVfV1NDIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9nZW5fc2FtcGxlX3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZy5HZW5TYW1wbGVXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgdGl0bGU9IiVXSVpBUkRfVElUTEVfV1NDIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbnNhbXBsZXdpemFyZCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9jb25maWdfaGFuZGxlcl93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuQ29uZmlnU2VydmljZUhhbmRsZXJzV2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIHRpdGxlPSIlTEFCRUxfSEFORExFUlNfQ09ORklHIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuc2VydmljZSI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9jb25maWdfaGFuZGxlcl93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuQ29uZmlnQ2xpZW50SGFuZGxlcnNXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgdGl0bGU9IiVMQUJFTF9IQU5ETEVSU19DT05GSUciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5jbGllbnQiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvY29uZmlnX2hhbmRsZXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkNvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIHRpdGxlPSIlTEFCRUxfSEFORExFUlNfQ09ORklHIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+ICAgCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fSU1QT1JUX1dJWkFSRF9OQU1FX1dTIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvaW1wb3J0X3dzLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICAgICAgICAgICAgaWQ9IndzaW1wb3J0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVQTFVHSU5fSU1QT1JUX1dJWkFSRF9ERVNDX1dTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9pbXBvcnRfd3Nfd2l6LmdpZiIKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fSU1QT1JUX1dJWkFSRF9OQU1FX1dTIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuSW1wb3J0V1NXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgaWQ9IndzaW1wb3J0Ij4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlSU1QT1JUX1dJWkFSRF9OQU1FX1dTSUwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy93c2lsL2ltcG9ydF93c2lsLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICAgICAgICAgICAgaWQ9IndzaWxpbXBvcnQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJUlNUE9SVF9XSVpBUkRfREVTQ19XU0lMCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy93c2lsL2ltcG9ydF93aXpfYmFubmVyX3dzaWwuZ2lmIgotICAgICAgICAgICAgbmFtZT0iJUlNUE9SVF9XSVpBUkRfTkFNRV9XU0lMIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuSW1wb3J0V1NJTFdpZGdldEJpbmRpbmciCi0gICAgICAgICAgICBpZD0id3NpbGltcG9ydCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBQcmVmZXJlbmNlIFBhZ2VzIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX1NFUlZFUl9SVU5USU1FIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlNlcnZlclJ1bnRpbWVQcmVmZXJlbmNlUGFnZSI+ICAgICAgICAgICAgCi0gICAgICA8L3BhZ2U+Ci0gICAgICAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9ESUFMT0dTIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5wcmVmZXJlbmNlcy5BY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0Lndzcy5wb3B1cC5jYXRlZ29yeSI+Ci0gICAgICA8L3BhZ2U+Ci0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9URVNUX0ZBQ0lMSVRZIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLlNjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9QUk9KRUNUX1RPUE9MT0dZIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9qZWN0VG9wb2xvZ3lQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPC9wYWdlPgotICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBNYWluIE1lbnUgQWN0aW9ucyAtLT4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlQ09NTUFORF9MQVVOQ0hfV1NfRVhQTE9SRVIiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVNRU5VX1JVTiIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5ydW4iPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJleHBsb3JlciI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQ09NTUFORF9MQVVOQ0hfV1NfRVhQTE9SRVIiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9yZWdpc3RyeS5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9MQVVOQ0hfV1NfRVhQTE9SRVIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbi5MYXVuY2hXU0VBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkucnVuL2V4cGxvcmVyIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYWN0aW9uLkxhdW5jaFdTRUFjdGlvbiI+Ci0gICAgICAgIDwvYWN0aW9uPgotICAgICA8L2FjdGlvblNldD4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gIkRvbid0IFNob3cgTWUiIEV4dGVuc2lvbnMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUiPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIHNob3djaGVja2JveD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVDSEVDS0JPWF9TSE9XX0dFTkVSQVRFX0pBVkFfUFJPWFlfRElBTE9HIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1dTREwyUFJPWFkiCi0gICAgICAgICAgICBpbmZvcG9wPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuUFBBRDAwMDQiCi0gICAgICAgICAgICBhbHdheXNoaWRlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBuYW1lPSIlQ0hFQ0tCT1hfU0hPV19QUk9YWTJTQU1QTEVfRElBTE9HIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1BST1hZMlNBTVBMRSIKLSAgICAgICAgICAgIGluZm9wb3A9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5QUEFEMDAwNSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW5zYW1wbGV3aXphcmQiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBzaG93Y2hlY2tib3g9ImZhbHNlIgotICAgICAgICAgICAgYWx3YXlzaGlkZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vud3NpbCI+Ci0gICAgICA8L2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIHNob3djaGVja2JveD0iZmFsc2UiCi0gICAgICAgICAgICBhbHdheXNoaWRlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICA8L2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlPgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBQb3B1cHMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbndzaWwiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9HRU5FUkFURV9XU0lMIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJ3c2lsaW1wb3J0Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NpbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IiouamF2YSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW5zYW1wbGV3aXphcmQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VOX1NBTVBMRSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vuc2FtcGxld2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLmphdmEiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vuc2FtcGxld2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTl9TQU1QTEUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbnNhbXBsZXdpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbndzaWwiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9HRU5FUkFURV9XU0lMIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0id3NpbGltcG9ydCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSJ3ZWJzZXJ2aWNlcy54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuc2VydmljZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLnNlcnZpY2UiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0FERF9IQU5ETEVSUyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLQkJCTxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgbmFtZT0idHlwZSIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJIYW5kbGVycyI+Ci0gICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLnNlcnZpY2UiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAgICAgICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0id2Vic2VydmljZXNjbGllbnQueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuZWRpdG9yIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfQUREX0hBTkRMRVJTIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmNsaWVudCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSJlamItamFyLnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0FERF9IQU5ETEVSUyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5jbGllbnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgCi0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IndlYi54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuY2xpZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iYXBwbGljYXRpb24tY2xpZW50LnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0FERF9IQU5ETEVSUyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5jbGllbnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gCi0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuZWRpdG9yIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfQUREX0hBTkRMRVJTIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5jbGllbnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAKLSAgICAgIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vud3NpbCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0dFTkVSQVRFX1dTSUwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJ3c2lsaW1wb3J0Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiCi0gICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbndzaWwiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9HRU5FUkFURV9XU0lMIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICBpZD0id3NpbGltcG9ydCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBDbGllbnQgUHJvamVjdCBUeXBlcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZSI+Ci0gICAgICA8Y2xpZW50UHJvamVjdFR5cGUKLSAgICAgICAgICAgIGluY2x1ZGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlPSIiCi0gICAgICAgICAgICBsYWJlbD0iJUxBQkVMX0NMSUVOVF9UWVBFX1dFQiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIj4KLSAgICAgIDwvY2xpZW50UHJvamVjdFR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZSI+Ci0gICAgICA8Y2xpZW50UHJvamVjdFR5cGUKLSAgICAgICAgICAgIGluY2x1ZGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUgb3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiCi0gICAgICAgICAgICBsYWJlbD0iJUxBQkVMX0NMSUVOVF9UWVBFX0NPTlRBSU5FUkxFU1MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLkNvbnRhaW5lcmxlc3MiPgotICAgICAgPC9jbGllbnRQcm9qZWN0VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlIj4KLSAgICAgIDxjbGllbnRQcm9qZWN0VHlwZQotICAgICAgICAgICAgaW5jbHVkZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZSIKLSAgICAgICAgICAgIGV4Y2x1ZGU9IiIKLSAgICAgICAgICAgIGxhYmVsPSIlTEFCRUxfQ0xJRU5UX1RZUEVfRUpCIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5FSkIiPgotICAgICAgPC9jbGllbnRQcm9qZWN0VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlIj4KLSAgICAgIDxjbGllbnRQcm9qZWN0VHlwZQotICAgICAgICAgICAgaW5jbHVkZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlPSIiCi0gICAgICAgICAgICBsYWJlbD0iJUxBQkVMX0NMSUVOVF9UWVBFX0FQUF9DTElFTlQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLkFwcENsaWVudCI+Ci0gICAgICA8L2NsaWVudFByb2plY3RUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gT2JqZWN0IFNlbGVjdGlvbiBXaWRnZXRzIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLm9iamVjdFNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8b2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkphdmFCZWFuU2VsZWN0aW9uV2lkZ2V0IgotICAgICAgICAgICAgdHJhbnNmb3JtZXI9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5KYXZhQmVhblNlbGVjdGlvblRyYW5zZm9ybWVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5KYXZhQmVhblNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8L29iamVjdFNlbGVjdGlvbldpZGdldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLm9iamVjdFNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8b2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkVKQlNlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuRUpCU2VsZWN0aW9uV2lkZ2V0Ij4KLSAgICAgIDwvb2JqZWN0U2VsZWN0aW9uV2lkZ2V0PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkub2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ij4KLSAgICAgIDxvYmplY3RTZWxlY3Rpb25XaWRnZXQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvblRyYW5zZm9ybWVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5XU0RMU2VsZWN0aW9uV2lkZ2V0Ij4KLSAgICAgIDwvb2JqZWN0U2VsZWN0aW9uV2lkZ2V0PgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL2NsaWVudFByb2plY3RUeXBlLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvY2xpZW50UHJvamVjdFR5cGUuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5NTIxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvY2xpZW50UHJvamVjdFR5cGUuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIgaWQ9ImNsaWVudFByb2plY3RUeXBlIiBuYW1lPSJjbGllbnRQcm9qZWN0VHlwZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGRlZmluZXMgY2xpZW50IGNvbnRhaW5lciB0eXBlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2xpZW50UHJvamVjdFR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwb2ludCBhdHRyaWJ1dGUgc3RyaW5nIG11c3QgYmUgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjbGllbnRQcm9qZWN0VHlwZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImluY2x1ZGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgYSBibGFuayBkZWxpbWl0ZWQgbGlzdCBvZiBQcm9qZWN0IE5hdHVyZSBJZHMuICBUaGUgbGlzdGVkIElEcyBpbmRpY2F0ZSB0aGF0IHRoaXMgdHlwZSBvbmx5IHdvcmtzIHdpdGggdGhlc2UgcGFydGljdWxhciBwcm9qZWN0IHR5cGVzLiAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgdHlwZSBvbmx5IHdvcmtzIHdpdGggd2ViIHByb2plY3RzIGFuIElEIG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUgd291bGQgYmUgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgYSBibGFuayBkZWxpbWl0ZWQgbGlzdCBvZiBQcm9qZWN0IE5hdHVyZSBJZHMuICBUaGUgbGlzdGVkIElEcyBpbmRpY2F0ZSB0aGF0IHRoaXMgdHlwZSBET0VTIE5PVCB3b3JrIHdpdGggdGhlc2UgcGFydGljdWxhciBwcm9qZWN0IHR5cGVzLiAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgdHlwZSBkb2VzIG5vdCB3b3JrIHdpdGggd2ViIHByb2plY3RzIGFuIElEIG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUgd291bGQgYmUgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgbGFiZWwgcmVwcmVzZW50cyB0aGlzIGNsaWVudCBwcm9qZWN0IHR5cGUuICBJdCBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgc28gaXQgbXVzdCBiZSB0cmFuc2xhdGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgY2xpZW50IHByb2plY3QgdHlwZS4gIFRoaXMgaWRlbnRpZmllciBpcyByZWZlcmVuY2VkIGluIHRoZSBjbGllbnRQcm9qZWN0VHlwZSBhdHRyaWJ1dGUgb2YgdGhlIHdlYlNlcnZpY2VDbGllbnRUeXBlIGVsZW1lbnQgb2YgYW4gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndlYlNlcnZpY2VDbGllbnRUeXBlIGV4dGVuc2lvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS9vYmplY3RTZWxlY3Rpb25XaWRnZXQuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS9vYmplY3RTZWxlY3Rpb25XaWRnZXQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1NmZkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvb2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiIGlkPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiIG5hbWU9Im9iamVjdFNlbGVjdGlvbldpZGdldCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwb2ludCBhdHRyaWJ1dGUgc3RyaW5nIG11c3QgYmUgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLm9iamVjdFNlbGVjdGlvbldpZGdldC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBlbnRyeSBhbGxvd3MgYW4gZXh0ZW5kZXIgdG8gYWRkIG5ldyB3YXlzIG9mIGJyb3dzaW5nL2ZpbmRpbmcgYXJ0aWZhY3RzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIFdlYiBzZXJ2aWNlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBjbGFzcyBkZWZpbmVzIFNlbGVjdGlvbiBXaWRnZXQgdG8gYmUgZGlzcGxheWVkIG9uIHRoZSBPYmplY3QgU2VsZWN0aW9uIHBhZ2Ugb2YgdGhlIFdlYiBzZXJ2aWNlcyB3aXphcmRzLiAgVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LklPYmplY3RTZWxlY3Rpb25XaWRnZXQgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaWQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIG9iamVjdFNlbGVjdGlvbldpZGdldCBlbGVtZW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBhIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXIgaW50ZXJmYWNlLiAgVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgYSB0cmFuc2Zvcm0gbWV0aG9kLiAgRXZlbiB0aG91Z2ggdGhlIHR5cGUgb2YgdGhlIGlucHV0IHBhcmFtZXRlciBhbmQgdGhlIHJldHVybiB2YWx1ZSBhcmUgb2YgdHlwZSBPYmplY3QgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGV5IHdpbGwgYmUgdXNlZCB3aXRoIHRoZSB0eXBlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24uICBUaGlzIHRyYW5zZm9ybWF0aW9uIG1ldGhvZCBhbGxvd3MgdGhlIGV4dGVuZGVyIHRvIG1vZGlmeSB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gdG8gYW4gSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0IHRoYXQgaXMgbW9yZSByZWFkaWx5IHVzYWJsZSBieSB0aGUgcnVudGltZSBzZXJ2ZXIgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlQ2xpZW50VHlwZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VDbGllbnRUeXBlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYmUyZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VDbGllbnRUeXBlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSIiIGlkPSJ3ZWJTZXJ2aWNlQ2xpZW50VHlwZSIgbmFtZT0iV2ViIFNlcnZpY2UgQ2xpZW50IFR5cGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGRlZmluZXMgV2ViIFNlcnZpY2UgQ2xpZW50IHR5cGVzLiAgVGhpcyBpcyBkb25lIGJ5IGRlZmluaW5nIHdlYlNlcnZpY2VDbGllbnRUeXBlIGVsZW1lbnRzLiAgVGhlc2UgZWxlbWVudHMgcmVmZXIgdG8gYSBzZXJ2ZXIgYW5kIGEgV2ViIFNlcnZpY2UgcnVudGltZS4gIFRoZXNlIGFyZSByZXNwZWN0aXZlbHkgZGVmaW5lZCBpbiB0aGUgd2ViU2VydmljZVNlcnZlciBlbGVtZW50IGFuZCB0aGUgd2ViU2VydmljZVJ1bnRpbWUgZWxlbWVudC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVNlcnZlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlUnVudGltZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlQ2xpZW50VHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHBvaW50IGF0dHJpYnV0ZSBzdHJpbmcgbXVzdCBiZSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2ViU2VydmljZUNsaWVudFR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndlYlNlcnZpY2VTZXJ2ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIHNlcnZlciB0eXBlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5SWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZmFjdG9yeSBpZCBmb3IgYSBzZXJ2ZXIuICBUaGlzIGlkIGlzIGRlZmluZWQgYnkKLXRoZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyVHlwZXMgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzRGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHRoaXMgc2VydmVyIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHNlcnZlci4gIE5vdGU6ICB0aGlzIGRlZmF1bHQgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBpbiB0aGUgYWJzZW5jZSBvZiBvdGhlciBpbmZvcm1hdGlvbi4gIElmIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgcGFydGljdWxhciBzZXJ2ZXIgYXMgdGhlaXIgZGVmYXVsdCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuICBTaG91bGQgY29udGFpbiBhIHZhbHVlIG9mIGVpdGhlciAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBsb2NhbCBJRCBmb3IgdGhpcyBzZXJ2ZXIuICBUaGUgc2VydmVyIGF0dHJpYnV0ZSBvZiB0aGUgd2Vic2VydmljZUNsaWVudFR5cGUgZWxlbWVudCByZWZlcnMgdG8gdGhpcyBJRC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lVHlwZUlkcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyBjdXJyZW50bHkgYSBwbGFjZSBob2xkZXIgZm9yIGZ1dHVyZSBkZXZlbG9wbWVudC4gIFBsZWFzZSwgZG8gbm90IHVzZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVJ1bnRpbWUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIFdlYiBTZXJ2aWNlcyBydW50aW1lLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGxhYmVsIGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyBydW50aW1lLiAgVGhlcmVmb3JlLCBpcyBtdXN0IGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlcyBydW50aW1lLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzRGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHRoaXMgcnVudGltZSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBydW50aW1lLiAgTm90ZTogIHRoaXMgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIG90aGVyIGluZm9ybWF0aW9uLiAgSWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBwYXJ0aWN1bGFyIHJ1bnRpbWUgYXMgdGhlaXIgZGVmYXVsdCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuICBTaG91bGQgY29udGFpbiBhIHZhbHVlIG9mIGVpdGhlciAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImoyZWV2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgSjJFRSB2ZXJzaW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBydW50aW1lLiAgVGhlIGFsbG93YWJsZSB2YWx1ZXMgYXJlIDEyLCAxMywgYW5kIDE0LiAgSWYgbW9yZSB0aGFuIG9uZSBKMkVFIHZlcnNpb24gaXMgc3VwcG9ydGVkIGVhY2ggSjJFRSBsZXZlbCBzaG91bGQgYmUgc3BlY2lmaWVkIHdpdGggYSBibGFuayBkZWxpbWl0ZXIuKGVnLiBpZiBKMkVFIHZlcnNpb24gMS4yIGFuZCAxLjMgYXJlIHN1cHBvcnRlZCB0aGVuIHRoaXMgYXR0cmlidXRlIHN0cmluZyB3b3VsZCBiZSAmcXVvdDsxMiAxMyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZUNsaWVudFR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIFdlYiBTZXJ2aWNlcyBjbGllbnQgdHlwZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgSUQgZm9yIHRoaXMgV2ViIFNlcnZpY2UgQ2xpZW50IHR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIGZvciB0aGlzIFdlYiBTZXJ2aWNlIENsaWVudCB0eXBlLiAgSXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHNvIGl0IG11c3QgYmUgdHJhbnNsYXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnRUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGtpbmQgb2YgV2ViIFNlcnZpY2UgQ2xpZW50IHR5cGUgYmVpbmcgZGVmaW5lZC4gKGllLiB0aGUgdmFsdWUgb2YgdGhlIEphdmEgY2xpZW50IGlzIG9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcnVudGltZSBJRCBmb3IgdGhpcyBXZWIgU2VydmljZSBjbGllbnQgdHlwZS4gIFRoZXJlIHNob3VsZCBiZSBhIGNvcnJlc3BvbmRpbmcgd2ViU2VydmljZVJ1bnRpbWUgZWxlbWVudCB3aXRoIGFuIGF0dHJpYnV0ZSBjYWxsZWQgaWQgdGhhdCBoYXMgdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXIiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBzZXJ2ZXIgZm9yIHRoaXMgV2ViIFNlcnZpY2UgY2xpZW50IHR5cGUuICBUaGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nIHdlYlNlcnZpY2VTZXJ2ZXIgZWxlbWVudCB3aXRoIGFuIGF0dHJpYnV0ZSBjYWxsZWQgaWQgdGhhdCBoYXMgdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnRQcm9qZWN0VHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjb250YWlucyBhIHNwYWNlIGRlbGltaXRlZCBsaXN0IG9mIGNsaWVudCBwcm9qZWN0IHR5cGUgaWRzIHN1cHBvcnRlZCBieSB0aGlzIGJ5IHRoaXMgd2ViU2VydmljZUNsaWVudFR5cGUgZWxlbWVudC4gIFRoZSBjbGllbnQgcHJvamVjdCB0eXBlIGlkcyBhcmUgZGVmaW5lZCBieSB0aGUgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXZlbG9wQmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBkZXZlbG9wbWVudCBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgZmlyc3QgaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhc3NlbWJseUJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgYXNzZW1ibHkgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBkZXZlbG9wbWVudCBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95QmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBkZXBsb3kgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBhc3NlbWJseSBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5zdGFsbEJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgaW5zdGFsbCBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgYWZ0ZXIgdGhlIGRlcGxveSBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQ0YmNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIgaWQ9IndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSIgbmFtZT0iV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgVHlwZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZGVmaW5lcyBXZWIgU2VydmljZSBTZXJ2ZXIgdHlwZXMuICBUaGlzIGlzIGRvbmUgYnkgZGVmaW5pbmcgd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIGVsZW1lbnRzLiAgVGhlc2UgZWxlbWVudHMgcmVmZXIgdG8gYSBzZXJ2ZXIgYW5kIGEgV2ViIFNlcnZpY2UgcnVudGltZS4gIFRoZXNlIGFyZSByZXNwZWN0aXZlbHkgZGVmaW5lZCBpbiB0aGUgd2ViU2VydmljZVNlcnZlciBlbGVtZW50IGFuZCB0aGUgd2ViU2VydmljZVJ1bnRpbWUgZWxlbWVudC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVNlcnZlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlUnVudGltZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwb2ludCBhdHRyaWJ1dGUgc3RyaW5nIG11c3QgYmUgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVNlcnZlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgc2VydmVyIHR5cGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY3RvcnlJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBmYWN0b3J5IGlkIGZvciBhIHNlcnZlci4gIFRoaXMgaWQgaXMgZGVmaW5lZCBieQotdGhlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNEZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhpcyBzZXJ2ZXIgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgc2VydmVyLiAgTm90ZTogIHRoaXMgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIG90aGVyIGluZm9ybWF0aW9uLiAgSWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBwYXJ0aWN1bGFyIHNlcnZlciBhcyB0aGVpciBkZWZhdWx0IHRoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gIFNob3VsZCBjb250YWluIGEgdmFsdWUgb2YgZWl0aGVyICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGxvY2FsIElEIGZvciB0aGlzIHNlcnZlci4gIFRoZSBzZXJ2ZXIgYXR0cmlidXRlIG9mIHRoZSB3ZWJzZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgZWxlbWVudCByZWZlcnMgdG8gdGhpcyBJRC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lVHlwZUlkcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyBjdXJyZW50bHkgYSBwbGFjZSBob2xkZXIgZm9yIGZ1dHVyZSBkZXZlbG9wbWVudC4gIFBsZWFzZSwgZG8gbm90IHVzZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVJ1bnRpbWUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIFdlYiBTZXJ2aWNlcyBydW50aW1lLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGxhYmVsIGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyBydW50aW1lLiAgVGhlcmVmb3JlLCBpcyBtdXN0IGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlcyBydW50aW1lLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzRGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHRoaXMgcnVudGltZSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBydW50aW1lLiAgTm90ZTogIHRoaXMgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIG90aGVyIGluZm9ybWF0aW9uLiAgSWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBwYXJ0aWN1bGFyIHJ1bnRpbWUgYXMgdGhlaXIgZGVmYXVsdCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuICBTaG91bGQgY29udGFpbiBhIHZhbHVlIG9mIGVpdGhlciAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImoyZWV2ZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgSjJFRSB2ZXJzaW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBydW50aW1lLiAgVGhlIGFsbG93YWJsZSB2YWx1ZXMgYXJlIDEyLCAxMywgYW5kIDE0LiAgSWYgbW9yZSB0aGFuIG9uZSBKMkVFIHZlcnNpb24gaXMgc3VwcG9ydGVkIGVhY2ggSjJFRSBsZXZlbCBzaG91bGQgYmUgc3BlY2lmaWVkIHdpdGggYSBibGFuayBkZWxpbWl0ZXIuKGVnLiBpZiBKMkVFIHZlcnNpb24gMS4yIGFuZCAxLjMgYXJlIHN1cHBvcnRlZCB0aGVuIHRoaXMgYXR0cmlidXRlIHN0cmluZyB3b3VsZCBiZSAmcXVvdDsxMiAxMyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBXZWIgU2VydmljZXMgc2VydmVyIHJ1bnRpbWUgdHlwZS4gIEFuIGVudHJ5IGZvciB0aGlzIGVsZW1lbnQgZGVmaW5lcyBhIHZhbGlkIGNvbWJpbmF0aW9uIG9mIHNlcnZlciwgcnVudGltZSwgYW5kIHdlYnNlcnZpY2UgdHlwZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgSUQgZm9yIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgZm9yIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgdHlwZS4gIEl0IGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBzbyBpdCBtdXN0IGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBydW50aW1lIElEIGZvciB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIHR5cGUuICBUaGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nIHdlYlNlcnZpY2VSdW50aW1lIGVsZW1lbnQgd2l0aCBhbiBhdHRyaWJ1dGUgY2FsbGVkIGlkIHRoYXQgaGFzIHRoaXMgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVyIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgc2VydmVyIGZvciB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIHR5cGUuICBUaGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nIHdlYlNlcnZpY2VTZXJ2ZXIgZWxlbWVudCB3aXRoIGFuIGF0dHJpYnV0ZSBjYWxsZWQgaWQgdGhhdCBoYXMgdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGtpbmQgb2YgV2ViIFNlcnZpY2UgUnVudGltZSB0eXBlIGJlaW5nIGRlZmluZWQuIChlZy4gdGhlIHZhbHVlIG9mIGEgSmF2YSBCZWFuIFdlYnNlcnZpY2UgaXMgb3JnLmVjbGlwc2UuanN0LndzLnR5cGUuamF2YSkKLVRoZXJlIHNob3VsZCBiZSBhIGNvcnJlc3BvbmRpbmcgd2ViU2VydmljZVR5cGUgZWxlbWVudCB3aXRoIGFuIGF0dHJpYnV0ZSBjYWxsZWQgaWQgdGhhdCBoYXMgdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXZlbG9wQmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBkZXZlbG9wbWVudCBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgZmlyc3QgaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhc3NlbWJseUJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgYXNzZW1ibHkgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBkZXZlbG9wbWVudCBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95QmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBkZXBsb3kgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBhc3NlbWJseSBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5zdGFsbEJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgaW5zdGFsbCBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgYWZ0ZXIgdGhlIGRlcGxveSBwaGFzZSBiaW5kaW5nIGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZUVKQk1vZHVsZSIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWYgdGhlIFdlYnNlcnZpY2UgZm9yIHRoaXMgU2VydmVyIFJ1bnRpbWUgVHlwZSBpcyByZXF1aXJlZCB0byBiZSBpbiBhbiBFSkIgbW9kdWxlIHRoZW4gdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIHNob3VsZCBiZSB0cnVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcXVpcmVXZWJNb2R1bGUiIHR5cGU9ImJvb2xlYW4iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElmIHRoZSBXZWJzZXJ2aWNlIGZvciB0aGlzIFNlcnZlciBSdW50aW1lIFR5cGUgaXMgcmVxdWlyZWQgdG8gYmUgaW4gYW4gV2ViIG1vZHVsZSB0aGVuIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBzaG91bGQgYmUgdHJ1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIGEgcGFydGljdWxhciBXZWIgc2VydmljZSBraW5kLiAgU3VjaCBhcyBhIEphdmEgQmVhbiB3ZWIgc2VydmljZSwgYSBTa2VsZXRvbiBXZWIgc2VydmljZSwgYW4gRUpCICBXZWIgc2VydmljZSwgZXRjLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGEgdW5pcXVlIElEIGZvciB0aGlzIFdlYiBzZXJ2aWNlIHR5cGUuICBJdCBpcyByZWZlcmVuY2VkIGluIHRoZSB3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgZWxlbWVudCB3aXRoIHRoZSB0eXBlIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgdHJhbnNsYXRhYmxlIGxhYmVsIGZvciB0aGlzIHdlYiBzZXJ2aWNlIHR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb3VyY2VUeXBlTWV0YWRhdGEiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgYSBibGFuayBkZWxpbWl0ZWQgbGlzdCBjbGFzcyBOYW1lcy4gKGllLk5vIHBhY2thZ2UgcHJlZml4KSAgVGhlIGNsYXNzZXMgbGlzdGVkIGRlZmluZSB0aGUgYWxsb3dhYmxlIEVjbGlwc2UgcmVzb3VyY2VzIHRoYXQgdGhpcyB3ZWIgc2VydmljZSB0eXBlIHVuZGVyc3RhbmRzIGFuZCB0dXJuIGludG8gYSBXZWIgc2VydmljZS4gIEZvciBleGFtcGxlLCBpZiBhIHVzZXIgc2VsZWN0cyBhIEphdmEgc291cmNlIGZpbGUgaW4gdGhlIHBhY2thZ2UgZXhwbG9yZXIgdmlldyBhbmQgdGhlbiBzdGFydHMgdGhlIFdlYiBzZXJ2aWNlcyB3aXphcmQgYSBDb21waWxhdGlvblVuaXQgb2JqZWN0IHdpbGwgYmUgcGFzc2VkIGluIGFzIHBhcnQgb2YgYW4gSVN0cnVjdHVyZWRTZWxlY3Rpb24uICBCeSBwdXR0aW5nICZxdW90O0NvbXBpbGF0aW9uVW5pdCZxdW90OyBhcyBvbmUgb2YgdGhlIGNsYXNzZXMgaW4gdGhpcyBhdHRyaWJ1dGUgaXQgaW5kaWNhdGVzIHRoYXQgdGhpcyB0eXBlIGNhbiBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIHRoZSBDb21waWxhdGlvblVuaXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uTWV0YWRhdGEiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgYWxsb3dzIHRoaXMgV2ViIHNlcnZpY2UgdHlwZSB0byByZXN0cmljdCBuYW1lcyBvZiB0aGUgaW5wdXQgZmlsZXMgdGhhdCBpdCB1bmRlcnN0YW5kcy4gIEZvciBleGFtcGxlLCBpZiB0aGUgdmFsdWUgaXMgc2V0IHRvICZxdW90Oy5qYXZhIC5jbGFzcyZxdW90OyBpdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIFdlYiBzZXJ2aWNlIHR5cGUgb25seSB1bmRlcnN0YW5kcyByZXNvdXJjZSBuYW1lcyB0aGF0IGVuZCB3aXRoIC5qYXZhIG9yIGVuZCB3aXRoIC5jbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgT24gcGFnZSAyIG9mIHRoZSBXZWIgc2VydmljZSB3aXphcmQgdGhlcmUgaXMgYW4gT2JqZWN0IHNlbGVjdGlvbiBwYWdlLiAgVGhpcyBzZWxlY3Rpb24gcGFnZSBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGlzIGF0dHJpYnV0ZSwgc2luY2UgZGlmZmVyZW50IFdlYiBzZXJ2aWNlIHR5cGVzIG1heSBuZWVkIGRpZmZlcmVudCBtZXRob2RzIG9mIHNlbGVjdGluZyB0aGVtLiAgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIHNob3VsZCBiZSB0aGUgaWQgb2YgYSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkub2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGV4dGVuc2lvbi4gIFRoZSBwcmVkZWZpbmVkIGlkIGZvciBhIEphdmEgc2VsZWN0aW9uIHdpZGdldCBpcyBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSmF2YUJlYW5TZWxlY3Rpb25XaWRnZXQuICBUaGUgcHJlZGVmaW5lZCBpZCBmb3IgYSBXU0RMIHNlbGVjdGlvbiB3aWRnZXQgaXMgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LldTRExTZWxlY3Rpb25XaWRnZXQuICBUaGUgcHJlZGVmaW5lZCBpZCBmb3IgYW4gRUpCIHNlbGVjdGlvbiB3aWRnZXQgaXMgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkVKQlNlbGVjdGlvbldpZGdldC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlTmF0dXJlcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjb250YWlucyBhIGJsYW5rIGRlbGltaXRlZCBsaXN0IG9mIFByb2plY3QgTmF0dXJlIElkcy4gIFRoZSBsaXN0ZWQgSURzIGluZGljYXRlIHRoYXQgdGhpcyB0eXBlIG9ubHkgd29ya3Mgd2l0aCB0aGVzZSBwYXJ0aWN1bGFyIHByb2plY3QgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgdGhpcyB0eXBlIG9ubHkgd29ya3Mgd2l0aCB3ZWIgcHJvamVjdHMgYW4gSUQgb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSB3b3VsZCBiZSBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZU5hdHVyZXMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgYSBibGFuayBkZWxpbWl0ZWQgbGlzdCBvZiBQcm9qZWN0IE5hdHVyZSBJZHMuICBUaGUgbGlzdGVkIElEcyBpbmRpY2F0ZSB0aGF0IHRoaXMgdHlwZSBET0VTIE5PVCB3b3JrIHdpdGggdGhlc2UgcGFydGljdWxhciBwcm9qZWN0IHR5cGVzLiAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgdHlwZSBkb2VzIG5vdCB3b3JrIHdpdGggd2ViIHByb2plY3RzIGFuIElEIG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUgd291bGQgYmUgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlVGVzdC5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VUZXN0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NjJiMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VUZXN0LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiIGlkPSJ3ZWJTZXJ2aWNlVGVzdCIgbmFtZT0iV2ViIFNlcnZpY2UgVGVzdCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGRlZmluZXMgV2ViIHNlcnZpY2UgdGVzdCBmYWNpbGl0aWVzIHRoYXQgY2FuIGJlIHBsdWdnZWQgaW50byB0aGUgV2ViIHNlcnZpY2VzIHdpemFyZHMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndlYlNlcnZpY2VUZXN0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcG9pbnQgYXR0cmlidXRlIHN0cmluZyBtdXN0IGJlIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlVGVzdC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVRlc3QiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZXRob2RzbmVlZGVkIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgaWYgdGhpcyB0ZXN0IGZhY2lsaXR5IG5lZWQgdG8gbWV0aG9kcyBmcm9tIGEgcHJveHkgYmVhbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgZm9yIHRoaXMgdGVzdCBmYWNpbGl0eS4gIEl0IG11c3QgYmUgdHJhbnNsYXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqYXZhIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRlc3QgZmFjaWxpdHkgaXMgaW50ZW5kZWQgZm9yIGNsaWVudHMgdGhhdCBnZW5lcmF0ZSBhIEphdmEgYmVhbiBhcyBvdXRwdXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29kZWdlbiIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaW5kaWNhdGVzIGlmIHRoaXMgdGVzdCBmYWNpbGl0eSBnZW5lcmF0ZXMgY29kZSBvciBub3QsIHN1Y2ggYXMgSlNQIGZpbGVzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIGEgY2xhc3MgbmFtZS4gIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBvcmcuZWNsaXBzZS5qc3Qud3MuZXh0LldlYlNlcnZpY2VFeGVjdXRhYmxlLiAgVGhpcyBjbGFzcyBhbGxvd3MgdGhlIGV4dGVuZGVyIHRvIHByb3ZpZGUgdGhlIENvbW1hbmRzIHRoYXQgd2lsbCBleGVjdXRlIGZvciB0aGlzIHRlc3QgZmFjaWxpdHkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHRlc3QgZmFjaWxpdHkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jb25zdW1wdGlvbi91aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiYTE5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLQotUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19DTElFTlQ9V2ViIFNlcnZpY2UgQ2xpZW50Ci0jCi0jIFdlYiBzZXJ2aWNlcyAiSW50ZXJuZXQiIHByZWZlcmVuY2VzIGV4dGVuc2lvbi4KLSMKLQotIwotIyBXZWIgU2FtcGxlcyBJRHMKLSMKLQotIwotIyBQb3AtdXAgYWN0aW9ucwotIwotQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFk9R2VuZXJhdGUgQ2xpZW50Ci0KLSMKLSMgRGlhbG9ncwotIwotQ0hFQ0tCT1hfU0hPV19HRU5FUkFURV9KQVZBX1BST1hZX0RJQUxPRz1TaG93IEdlbmVyYXRlIEphdmEgYmVhbiBQcm94eSBEaWFsb2cKLVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9XU0RMMlBST1hZPVNob3cgdGhlIGRpYWxvZyBmb3IgZ2VuZXJhdGluZyB0aGUgSmF2YSBiZWFuIHByb3h5IGFjdGlvbi4KLQotIwotIyAgICAgICBXZWIgU2VydmljZXMgUHJlZmVyYW5jZSBQYWdlcwotIwotIyBDYXRlZ29yaWVzCi0jCi0KLSMKLSMgUHJlZmVyZW5jZXMgVG9vbHRpcHMKLSMKLQotIwotI1NlcnZlciBSdW50aW1lIFByZWZlcmVuY2VzCi0jCi1UT09MVElQX1NSUEZfQ09NQk9fU0VSVkVSPVRoZSBwcmVmZXJyZWQgc2VydmVyIHR5cGUKLVRPT0xUSVBfU1JQRl9DT01CT19SVU5USU1FPVRoZSBwcmVmZXJyZWQgV2ViIHNlcnZpY2UgcnVudGltZQotVE9PTFRJUF9TUlBGX0NPTUJPX0oyRUU9VGhlIHByZWZlcnJlZCBKMkVFIHZlcnNpb24KLQotIwotIyBQb3AtdXAgYWN0aW9ucwotIwotCi0jCi0jIEdlbmVyYWwgbWVzc2FnZXMuCi0jCi1NU0dfRVJST1JfVEFTS19FWENFUFRFRD1JV0FCMDIzNEUgQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIERldGFpbHM6IHswfQotCi0KLQotCi0jCi0jUnVudGltZSBsYWJlbHMKLSMKLQotCi0jCi0jIFdpemFyZCBwYWdlIHRhc2sgbGFiZWxzIGFuZCBkZXNjcmlwdGlvbnMKLSMgKHVzZWQgb25seSBmb3IgcHJvZ3Jlc3MgaW5kaWNhdGlvbikuCi0jCi0KLSMKLSMgQ29tbW9uIHdpemFyZCBzdHJpbmdzLgotIwotTEFCRUxfRk9MREVSX05BTUU9Rm9sZGVyOgotTEFCRUxfSlNQX0ZPTERFUl9OQU1FPUpTUCBmb2xkZXI6Ci1MQUJFTF9XRUJfUFJPSkVDVF9OQU1FPVdlYiBwcm9qZWN0OgotTEFCRUxfV0VCU0VSVklDRVRZUEU9V2ViIHNlcnZpY2UgdHlwZToKLUxBQkVMX0oyRUVfVkVSU0lPTj1KMkVFIHZlcnNpb246Ci1MQUJFTF9OQT1OL0EKLQotQlVUVE9OX0JST1dTRT1Ccm93c2UuLi4KLUJVVFRPTl9CUk9XU0VfRklMRVM9QnJvd3NlIGZpbGVzLi4uCi1CVVRUT05fVVNFX0FCU09MVVRFX0xPQ0FUSU9OPVVzZSBhYnNvbHV0ZSBsb2NhdGlvbiBVUkkgZm9yIFdTREwgaW5wdXQgc3RhdGVtZW50cwotQlVUVE9OX1VTRV9JTkxJTkVfU0NIRU1BPVVzZSBpbmxpbmUgc2NoZW1hCi0KLQotCi0KLSMKLSMgV2l6YXJkcy4KLSMKLVdJWkFSRF9USVRMRV9XU0M9V2ViIFNlcnZpY2UgQ2xpZW50Ci0KLSMKLSMgV2ViU2VydmljZUNsaWVudFNlbGVjdGlvblBhZ2UKLSMKLQotIwotIyBXZWJTZXJ2aWNlU2VydmVyU2VsZWN0aW9uUGFnZQotIwotCi0jCi0jIFdlYlNlcnZpY2VQcm9qZWN0UGFnZQotIwotUEFHRV9USVRMRV9XU19QUk9KRUNUPVdlYiBTZXJ2aWNlcwotUEFHRV9ERVNDX1dTX1BST0pFQ1Q9UmV2aWV3IHlvdXIgV2ViIHNlcnZpY2Ugb3B0aW9ucyBhbmQgbWFrZSBhbnkgbmVjZXNzYXJ5IGNoYW5nZXMgYmVmb3JlIHByb2NlZWRpbmcgdG8gdGhlIG5leHQgcGFnZS4KLUJVVFRPTl9TVEFSVF9XRUJfUFJPSkVDVD1TdGFydCBXZWIgc2VydmljZSBpbiBXZWIgcHJvamVjdAotR1JPVVBfU0NFTkFSSU9fU0VSVklDRT1TZXJ2aWNlCi1HUk9VUF9TQ0VOQVJJT19DTElFTlQ9Q2xpZW50IHByb3h5Ci1MQUJFTF9XRUJTRVJWSUNFQ0xJRU5UVFlQRT1DbGllbnQgcHJveHkgdHlwZToKLQotCi0KLSMgSXRlbXMgY29tbW9uIHRvIFdlYlNlcnZpY2VSdW50aW1lU2VsZWN0aW9uUGFnZSBhbmQgV2ViU2VydmljZUNsaWVudFJ1bnRpbWVTZWxlY3Rpb25QYWdlCi0jIFdlYlNlcnZpY2VSdW50aW1lU2VsZWN0aW9uUGFnZQotUEFHRV9USVRMRV9XU19SVU5USU1FX1NFTEVDVElPTj1TZXJ2aWNlIERlcGxveW1lbnQgQ29uZmlndXJhdGlvbgotUEFHRV9ERVNDX1dTX1JVTlRJTUVfU0VMRUNUSU9OPUNob29zZSBmcm9tIHRoZSBsaXN0IG9mIHJ1bnRpbWUgcHJvdG9jb2xzIGFuZCBkZXBsb3ltZW50IHNlcnZlcnMsIG9yIHVzZSB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KLUxBQkVMX1JVTlRJTUVTX0xJU1Q9V2ViIHNlcnZpY2UgcnVudGltZToKLUxBQkVMX1NFUlZFUlNfTElTVD1TZXJ2ZXI6Ci1MQUJFTF9TRVJWSUNFX1dFQl9NT0RVTEU9U2VydmljZSBwcm9qZWN0OgotTEFCRUxfRURJVF9CVVRUT049RWRpdC4uLgotTEFCRUxfU0VSVklDRV9FQVJfUFJPSkVDVD1FQVIgcHJvamVjdDoKLUxBQkVMX0VBUl9QUk9KRUNUPUVBUiBwcm9qZWN0OgotTEFCRUxfQ0xJRU5UX1BST0pFQ1Q9Q2xpZW50IHByb2plY3Q6Ci0KLVRPT0xUSVBfUFdSU19URVhUX1JVTlRJTUU9VGhlIHJ1bnRpbWUgdG8gYmUgdXNlZC4KLVRPT0xUSVBfUFdSU19URVhUX1NFUlZFUj1UaGUgc2VydmVyIHRvIGJlIHVzZWQuCi1UT09MVElQX1BXUlNfSjJFRV9WRVJTSU9OPUoyRUUgdmVyc2lvbiB0byBiZSB1c2VkLgotCi1MQUJFTF9TRUxFQ1RJT05fVklFV19USVRMRT1TZXJ2ZXItU2lkZSBEZXBsb3ltZW50IFNlbGVjdGlvbjoKLUxBQkVMX1NFTEVDVElPTl9WSUVXX1JVTlRJTUU9Q2hvb3NlIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgcHJvdG9jb2wgZmlyc3QKLUxBQkVMX1NFTEVDVElPTl9WSUVXX1NFUlZFUj1DaG9vc2Ugc2VydmVyIGZpcnN0Ci1MQUJFTF9TRUxFQ1RJT05fVklFV19FWFBMT1JFPUV4cGxvcmUgb3B0aW9ucwotCi1MQUJFTF9UUkVFX0VYSVNUSU5HX1NFUlZFUlM9RXhpc3RpbmcgU2VydmVycwotTEFCRUxfVFJFRV9TRVJWRVJfVFlQRVM9U2VydmVyIFR5cGVzCi0KLU1TR19JTlZBTElEX1NSVF9TRUxFQ1RJT05TPVRoaXMgc2VydmVyIGFuZCBydW50aW1lIGNvbWJpbmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICBDaG9vc2UgYSBkaWZmZXJlbnQgc2VydmVyIG9yIHJ1bnRpbWUgdG8gcHJvY2VlZCB0aHJvdWdoIHRoZSBXZWIgc2VydmljZXMgd2l6YXJkLgotTVNHX05PX1JVTlRJTUU9Tm8gcnVudGltZSBzcGVjaWZpZWQgZm9yIHRoZSB7MH0gc2NlbmFyaW8uCi1NU0dfTk9fU0VSVkVSPU5vIHNlcnZlciBzcGVjaWZpZWQgZm9yIHRoZSB7MH0gc2NlbmFyaW8uCi0KLU1TR19TRVJWRVJfVEFSR0VUX01JU01BVENIPVRoZSBwcm9qZWN0LCB7MH0sIGhhcyBhIHNlcnZlciB0YXJnZXQgd2hpY2ggaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc2VsZWN0ZWQgc2VydmVyIHR5cGUKLU1TR19KMkVFX01JU01BVENIPVRoZSBwcm9qZWN0LCB7MH0sIGhhcyBhIGRpZmZlcmVudCBKMkVFIGxldmVsIGZyb20gdGhlIHNlbGVjdGVkIEoyRUUgbGV2ZWwKLU1TR19TRVJWSUNFX1BST0pFQ1RfRU1QVFk9VGhlIHNlcnZpY2UgcHJvamVjdCBjYW5ub3QgYmUgZW1wdHkuIFNlbGVjdCBhIHNlcnZpY2UgcHJvamVjdAotTVNHX1NFUlZJQ0VfRUFSX0VNUFRZPVRoZSBzZXJ2aWNlIEVBUiBjYW5ub3QgYmUgZW1wdHkuIFNlbGVjdCBhIHNlcnZpY2UgRUFSLgotTVNHX0NMSUVOVF9QUk9KRUNUX0VNUFRZPVRoZSBjbGllbnQgcHJvamVjdCBjYW5ub3QgYmUgZW1wdHkuIFNlbGVjdCBhIGNsaWVudCBwcm9qZWN0Ci1NU0dfQ0xJRU5UX0VBUl9FTVBUWT1UaGUgY2xpZW50IEVBUiBjYW5ub3QgYmUgZW1wdHkuIFNlbGVjdCBhIGNsaWVudCBFQVIuCi1NU0dfSU5WQUxJRF9FSkJfUFJPSkVDVD17MH0gaXMgbm90IGFuIEVKQiBwcm9qZWN0LiBDaG9vc2UgYW4gRUpCIHByb2plY3QsIG9yIGVudGVyIGEgbmV3IEVKQiBwcm9qZWN0IG5hbWUuCi1NU0dfSU5WQUxJRF9XRUJfUFJPSkVDVD17MH0gaXMgbm90IGEgV2ViIHByb2plY3QuIENob29zZSBhIFdlYiBwcm9qZWN0LCBvciBlbnRlciBhIG5ldyBXZWIgcHJvamVjdCBuYW1lLgotCi1NU0dfU0FNRV9DTElFTlRfQU5EX1NFUlZJQ0VfRUFSUz1Zb3VyIHNlbGVjdGVkIHNlcnZpY2UgYW5kIGNsaWVudCB7MH0gcHJvamVjdHMgYXJlIHRoZSBzYW1lLiAgUHJvY2VlZGluZyB3aXRoIHRoaXMgY29uZmlndXJhdGlvbiBtYXkgcmVzdWx0IGluIHJ1bnRpbWUgZXJyb3JzIHdoZW4gaW52b2tpbmcgdGhlIFdlYiBzZXJ2aWNlLgotTVNHX1dST05HX0NMSUVOVF9QUk9KRUNUX1RZUEU9VGhlIHNlbGVjdGVkIGNsaWVudCBwcm9qZWN0LCB7MH0sIGlzIG5vdCBhIHsxfSBwcm9qZWN0LiBQbGVhc2Ugc2VsZWN0IGEgezF9IHByb2plY3Qgb3IgZW50ZXIgYSBuZXcgcHJvamVjdCBuYW1lLgotTVNHX0NMSUVOVF9TVUI9Y2xpZW50Ci1NU0dfU0VSVklDRV9TVUI9c2VydmljZQotTVNHX0dFTkVSQUxfUFJPSkVDVF9BTkRfRUFSPVNlbGVjdCB0aGUgezB9IHByb2plY3QgYW5kIHRoZSBFQVIgcHJvamVjdCB3aXRoIHdoaWNoIHlvdSB3YW50IGl0IHRvIGJlIGFzc29jaWF0ZWQuCi1NU0dfRUFSX1BST0pFQ1RfV0lMTF9CRV9DUkVBVEVEPUlmIGFuIEVBUiBvciBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIGN1cnJlbnRseSB1bmFzc29jaWF0ZWQsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgXG5hc3NvY2lhdGVkIGFzIHJlcXVpcmVkIHdoZW4geW91IGNsaWNrIE5leHQuCi0KLU1TR19FQVJfV0lMTF9CRV9BU1NPQ0lBVEVEPVRoZSBzZWxlY3RlZCB7MH0gcHJvamVjdCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgRUFSIHByb2plY3QuCi1NU0dfUFJPSkVDVF9XSUxMX0JFX0NSRUFURUQ9VGhlIHswfSBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBhbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBFQVIgcHJvamVjdC4KLU1TR19FQVJfV0lMTF9CRV9DUkVBVEVEPVRoZSB7MH0gRUFSIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuCi1NU0dfUFJPSkVDVF9BTkRfRUFSX0NSRUFURUQ9VGhlIHswfSBwcm9qZWN0IGFuZCBFQVIgcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCBvbmUgYW5vdGhlci4KLQotIyBXZWJTZXJ2aWNlQ2xpZW50UnVudGltZVNlbGVjdGlvblBhZ2UKLVBBR0VfVElUTEVfV1NfQ0xJRU5UX1JVTlRJTUVfU0VMRUNUSU9OPUNsaWVudCBFbnZpcm9ubWVudCBDb25maWd1cmF0aW9uCi1QQUdFX0RFU0NfV1NfQ0xJRU5UX1JVTlRJTUVfU0VMRUNUSU9OPUNob29zZSBmcm9tIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBydW50aW1lIHByb3RvY29scyBhbmQgc2VydmVycyBmb3IgdGhlIGNsaWVudCBlbnZpcm9ubWVudCwgb3IgdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzLgotCi1MQUJFTF9DTElFTlRfU0VMRUNUSU9OX1ZJRVdfVElUTEU9Q2xpZW50LVNpZGUgRW52aXJvbm1lbnQgU2VsZWN0aW9uOgotTEFCRUxfQ0xJRU5UX1RZUEU9Q2xpZW50IHR5cGU6Ci1MQUJFTF9XRUI9V2ViCi1MQUJFTF9FSkI9RUpCCi1MQUJFTF9OT19MQUJFTD0KLQotCi0jCi0jIEl0ZW1zIGNvbW1vbiB0byBXZWJTZXJ2aWNlTWFwcGluZ3NQYWdlLCBXZWJTZXJ2aWNlTWFwcGluZ3NQYWdlIChjbGllbnQpLCBhbmQgV2ViU2VydmljZVNPQVBCaW5kaW5nUGFnZQotIwotUEFHRV9NU0dfVkFMSURBVElPTl9JTlRFUk5BTF9FUlJPUj1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcGFnZSB2YWxpZGF0aW9uLiBTZWUgbG9ncyBmb3IgZGV0YWlscy4KLQotIwotIyBXZWJTZXJ2aWNlTWFwcGluZ3NQYWdlCi0jCi1QQUdFX1RJVExFX1dTX1hNTDJCRUFOPVdlYiBTZXJ2aWNlIFNrZWxldG9uIFhNTCB0byBKYXZhIE1hcHBpbmdzCi1QQUdFX0RFU0NfTjJQX01BUFBJTkdTPURlZmluZSBjdXN0b20gbWFwcGluZyBmb3IgbmFtZXNwYWNlIHRvIHBhY2thZ2UuCi1NU0dfTUFQUElOR19EVVBMSUNBVEVfRU5UUklFUz1EdXBsaWNhdGUgezB9IG1hcHBlZCB0byB0aGUgc2FtZSB7MX0uCi0KLQotIwotIyBUaGUgdHdvIElURU1fKiBzdHJpbmdzIGFyZSBlbnRyaWVzIGluIGEgbGlzdCBib3ggb2YgbWFwcGluZ3MuCi0jIFRoZXJlIGFyZSB0d28gZm9ybXMsIG9uZSB3aGVuIHRoZSBwYWdlIGlzIGluIEphdmEtdG8tWE1MIG1vZGU6Ci0jICAgPGphdmEtYmVhbi1uYW1lPiwgPGVuY29kaW5nLXN0eWxlPgotIyBhbmQgb25lIHdoZW4gdGhlIHBhZ2UgaXMgaW4gWE1MLXRvLUphdmEgbW9kZToKLSMgICA8eG1sLW5hbWVzcGFjZS11cmk+Ojx4bWwtc2hvcnQtbmFtZT4sIDxlbmNvZGluZy1zdHlsZT4KLSMgd2hlcmU6Ci0jICAgPGphdmEtYmVhbi1uYW1lPiBpcyBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLSMgICA8eG1sLW5hbWVzcGFjZS11cmk+IGlzIHRoZSBuYW1lc3BhY2Ugb2YgYW4gWE1MIHR5cGUKLSMgICA8eG1sLXNob3J0LW5hbWU+IGlzIHRoZSBYTUwgdHlwZSBuYW1lIHdpdGhpbiB0aGUgbmFtZXNwYWNlCi0jICAgPGVuY29kaW5nLXN0eWxlPiBpcyB0aGUgZW5jb2Rpbmcgc3R5bGUgKFNPQVAgb3IgTGl0ZXJhbCBYTUwpCi0jCi0KLSMKLSMgV2ViU2VydmljZVByb3h5UGFnZQotIwotQlVUVE9OX0dFTkVSQVRFX1BST1hZPUdlbmVyYXRlIGEgcHJveHkKLQotIwotIyBXZWJTZXJ2aWNlU2tlbGV0b25Db25maWdQYWdlCi0jCi1QQUdFX0RFU0NfV1NTS0VMX0NPTkZJRz1EZWZpbmUgYSBza2VsZXRvbiBKYXZhIGJlYW4gYXMgYSBXZWIgc2VydmljZS4KLVBBR0VfVElUTEVfV1NTS0VMX0NPTkZJRz1XZWIgU2VydmljZSBTa2VsZXRvbiBKYXZhIEJlYW4gQ29uZmlndXJhdGlvbgotVE9PTFRJUF9QQlNDX1RFWFRfU0tFTEVUT05fRk9MREVSPUZvbGRlciBmb3IgZ2VuZXJhdGVkIEphdmEgc2tlbGV0b24uCi1UT09MVElQX1BCU0NfQlVUVE9OX1NLRUxFVE9OX0ZPTERFUl9CUk9XU0U9QnJvd3NlIGZvbGRlcnMuCi1MQUJFTF9TS0VMRVRPTl9ST09UX05BTUU9U2tlbGV0b24gZm9sZGVyOgotCi0jCi0jIFdlYlNlcnZpY2VCZWFuQ2xhc3NQYWdlCi0jCi1MQUJFTF9CRUFOX0NMQVNTX05BTUU9QmVhbjoKLVBBR0VfTVNHX0JFQU5fQ0FOTk9UX0JFX0VNUFRZPVBsZWFzZSBzZWxlY3QgYSBKYXZhIGJlYW4gY2xhc3MuCi1CVVRUT05fQlJPV1NFX0NMQVNTRVM9QnJvd3NlIGNsYXNzZXMuLi4KLQotCi0jCi0jIFdlYlNlcnZpY2VUZXN0UGFnZQotIwotUEFHRV9USVRMRV9XU1RFU1Q9V2ViIFNlcnZpY2UgVGVzdCBQYWdlCi1QQUdFX0RFU0NfV1NURVNUPVNlbGVjdCBhIHRlc3QgZmFjaWxpdHkKLUxBQkVMX1RFU1RfVFlQRVM9VGVzdCBGYWNpbGl0eQotQ0hFQ0tCT1hfVEVTVF9XRUJTRVJWSUNFPVRlc3QgdGhlIFdlYiBzZXJ2aWNlCi1DSEVDS0JPWF9NT05JVE9SX1dFQlNFUlZJQ0U9TW9uaXRvciB0aGUgV2ViIHNlcnZpY2UKLU1TR19FUlJPUl9VTkFCTEVfVE9fTEFVTkNIX1dTRExfVEVTVD1BbiBlcnJvciBvY2N1cnJlZC4gVW5hYmxlIHRvIGxhdW5jaCBXU0RMIHRlc3QgZmFjaWxpdHkuCi0KLSMKLSMgV2ViU2VydmljZUV4cGxvcmVyUGFnZQotIwotQlVUVE9OX0xBVU5DSF9TRVJWSUNFX1RFU1Q9TGF1bmNoCi0KLSMKLSMgV2ViU2VydmljZUNsaWVudFRlc3RQYWdlCi0jCi1QQUdFX1RJVExFX1dTX1NBTVBMRT1XZWIgU2VydmljZSBDbGllbnQgVGVzdAotUEFHRV9ERVNDX1dTX1NBTVBMRT1EbyB5b3Ugd2FudCB0byB0ZXN0IHRoZSBnZW5lcmF0ZWQgcHJveHk/Ci1CVVRUT05fVEVTVD1UZXN0IHRoZSBnZW5lcmF0ZWQgcHJveHkKLUxBQkVMX1RFU1RfVFlQRVM9VGVzdCBmYWNpbGl0eQotQlVUVE9OX1JVTl9URVNUPVJ1biB0ZXN0IG9uIHNlcnZlcgotTEFCRUxfTUVUSE9EUz1NZXRob2RzCi1NU0dfRVJST1JfSlRTX0pTUF9HRU49SVdBQjAzMTNFIEVycm9yIGVuY291bnRlcmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIHNhbXBsZS4KLUxBQkVMX0pTUF9QUk9KRUNUX05BTUU9SlNQIHByb2plY3Q6Ci1NU0dfRVJST1JfSlRTX1BST1hZX05PVF9DT01QSUxFRD1JV0FCMDM1N0UgVGhlIEdlbmVyYXRlZCBwcm94eSB3YXMgbm90IGZvdW5kLiBXZWJTZXJ2aWNlIHNhbXBsZSBqc3BzIGNhbm5vdCBiZSBnZW5lcmF0ZWQuCi1NU0dfRVJST1JfTUFMRk9STUVEX1VSTD1JV0FCMDM1OEUgVGVzdCBjbGllbnQgVVJMIGlzIG1hbGZvcm1lZC4KLQotIwotIyBXZWJTZXJ2aWNlSVNEUGFnZQotIwotCi0jCi0jIFdlYlNlcnZpY2VCZWFuQ29uZmlnUGFnZQotIwotCi0jCi0jIFdlYlNlcnZpY2VCZWFuTWV0aG9kc1BhZ2UKLSMKLUJVVFRPTl9TRUxFQ1RfQUxMPVNlbGVjdCBBbGwKLUJVVFRPTl9ERVNFTEVDVF9BTEw9RGVzZWxlY3QgQWxsCi1UT09MVElQX1BCTUVfQlVUVE9OX1NFTEVDVF9BTEw9U2VsZWN0IGFsbCBtZXRob2RzCi1UT09MVElQX1BCTUVfQlVUVE9OX0RFU0VMRUNUX0FMTD1EZXNlbGVjdCBhbGwgbWV0aG9kcwotCi0jCi0jIFdlYlNlcnZpY2VFSkJDb25maWdQYWdlCi0jCi0KLSMKLSMgV2ViU2VydmljZVdTRExTZWxlY3Rpb25QYWdlCi0jCi1QQUdFX1RJVExFX1dTRExfU0VMRUNUSU9OPVdlYiBTZXJ2aWNlIFdTREwgRmlsZSBTZWxlY3Rpb24KLVBBR0VfREVTQ19XU0RMX1NFTEVDVElPTj1TZWxlY3QgYSBXU0RMIGZpbGUuCi0KLQotIwotIyBXZWJTZXJ2aWNlUHVibGlzaFBhZ2UKLSMKLVBBR0VfVElUTEVfV1NfUFVCTElTSD1XZWIgU2VydmljZSBQdWJsaWNhdGlvbgotUEFHRV9ERVNDX1dTX1BVQkxJU0g9RG8geW91IHdhbnQgdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlPwotUEFHRV9USVRMRV9XU19GSU5EPUZpbmQgYSBXZWIgc2VydmljZQotUEFHRV9ERVNDX1dTX0ZJTkQ9RG8geW91IHdhbnQgdG8gZmluZCBhIFdlYiBzZXJ2aWNlPwotQlVUVE9OX1dTX1BVQkxJU0g9TGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIgdG8gcHVibGlzaCB0aGlzIFdlYiBzZXJ2aWNlIHRvIGEgVURESSBSZWdpc3RyeQotQlVUVE9OX1dTX1BVQkxJU0hfUFJJVkFURV9VRERJPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIHRvIHB1Ymxpc2ggdGhpcyBXZWIgc2VydmljZSB0byB0aGUgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkKLUJVVFRPTl9XU19GSU5EPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIHRvIGZpbmQgYSBXZWIgc2VydmljZSBmcm9tIGEgVURESSBSZWdpc3RyeQotQlVUVE9OX1dTX0ZJTkRfUFJJVkFURV9VRERJPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIHRvIGZpbmQgYSBXZWIgc2VydmljZSBmcm9tIHRoZSBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotTEFCRUxfUFVCTElDX1VERElfUkVHSVNUUklFUz1QdWJsaWMgVURESSBSZWdpc3RyeQotCi0jCi0jIEVKQiBVSSBzdHJpbmdzCi0jCi1MQUJFTF9FSkJfQkVBTl9OQU1FPUVKQiBiZWFuCi1UQUJMRV9USVRMRV9FSkJfQkVBTl9OQU1FUz1TdGF0ZWxlc3MgRUpCIGJlYW5zCi1UQUJMRV9USVRMRV9FSkJfUFJPSkVDVF9OQU1FPUVKQiBwcm9qZWN0Ci1MQUJFTF9FQVJfUFJPSkVDVFM9RUFSIHByb2plY3RzCi1UT09MVElQX0VBUl9QUk9KRUNUUz1FbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3RzLgotVE9PTFRJUF9UQUJMRV9CRUFOX05BTUVTPVNlbGVjdCBhbiBFSkIuCi0KLSMKLSMgVG9vbHRpcHMgZm9yIFdlYlNlcnZpY2VXU0RMU2VsZWN0aW9uUGFnZQotIwotVE9PTFRJUF9QV1dTX1BBR0U9Ci0KLSMKLSMgVG9vbHRpcHMgZm9yIGJlYW5zLldlYlNlcnZpY2VCZWFuQ2xhc3NQYWdlCi0jCi1UT09MVElQX1BCQ0xfUEFHRT0KLVRPT0xUSVBfUEJDTF9URVhUX0JFQU5fQ0xBU1M9U2VsZWN0ZWQgSmF2YSBiZWFuLgotVE9PTFRJUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRT1Ccm93c2UgY2xhc3Nlcy4KLVRPT0xUSVBfUEJDTF9CVVRUT05fQkVBTl9SRVNPVVJDRV9CUk9XU0U9QnJvd3NlIEphdmEgZmlsZXMuCi0KLQotIwotIyBUb29sdGlwcyBmb3IgYmVhbnMuV2ViU2VydmljZVRlc3RQYWdlCi0jCi1UT09MVElQX1BTVFBfQ09NQk9CT1hfVEVTVD1UZXN0IGZhY2lsaXRpZXMgYXZhaWxhYmxlIHRvIHRlc3QgdGhlIHNlcnZpY2UuCi1UT09MVElQX1BTVFBfTEFVTkNIX0JVVFRPTj1MYXVuY2ggdGhlIHNlbGVjdGVkIHRlc3QgZmFjaWxpdHkuCi0KLQotCi0KLSMKLSMgVG9vbHRpcHMgZm9yIFdlYlNlcnZpY2VSdW50aW1lU2VsZWN0aW9uUGFnZQotIwotVE9PTFRJUF9QV1JTX1BBR0U9Ci1UT09MVElQX1BXUlNfTElTVF9SVU5USU1FUz1TZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIGRlcGxveW1lbnQgcnVudGltZShzKS4KLVRPT0xUSVBfUFdSU19MSVNUX1NFUlZFUlM9U2VsZWN0IGZyb20gYXBwbGljYXRpb24gc2VydmVyKHMpLgotVE9PTFRJUF9QV1JTX1JBRElPX1NFUlZFUj1TZXJ2ZXIgb3JpZW50ZWQgc2VsZWN0aW9uLgotVE9PTFRJUF9QV1JTX1JBRElPX1JVTlRJTUU9UnVudGltZSBwcm90b2NvbCBvcmllbnRlZCBzZWxlY3Rpb24uCi1UT09MVElQX1BXUlNfUkFESU9fRVhQTE9SRT1FeHBsb3JlIGNvbWJpbmF0aW9ucy4KLVRPT0xUSVBfUFdSU19DT01CT19QUk9KRUNUPVdlYiBwcm9qZWN0LgotCi0jCi0jIFRvb2x0aXBzIGZvciBXZWJTZXJ2aWNlQ2xpZW50UnVudGltZVNlbGVjdGlvblBhZ2UKLSMKLVRPT0xUSVBfUFdDUl9DT01CT19DTElFTlRfVFlQRT1DbGllbnQgdHlwZS4KLQotCi0jCi0jIFRvb2x0aXBzIGZvciBXZWJTZXJ2aWNlUHJvamVjdFBhZ2UKLSMKLVRPT0xUSVBfUFdQUl9DT01CT19UWVBFPVdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHR5cGUuCi1UT09MVElQX1BXUFJfR1JPVVBfU0NFTkFSSU9fU0VSVklDRT1TZXJ2aWNlIGRlZmF1bHRzIGZvciB0aGlzIHdpemFyZCBzY2VuYXJpby4KLVRPT0xUSVBfUFdQUl9DSEVDS0JPWF9HRU5FUkFURV9QUk9YWT1FbmFibGUvZGlzYWJsZSBwcm94eSBnZW5lcmF0aW9uIGZvciB0aGlzIHNjZW5hcmlvLgotVE9PTFRJUF9QV1BSX0NIRUNLQk9YX1NUQVJUX1dFQl9QUk9KRUNUPVN0YXJ0IFdlYiBzZXJ2aWNlIGluIFdlYiBwcm9qZWN0IGZvciB0aGlzIHNjZW5hcmlvLgotVE9PTFRJUF9QV1BSX0NIRUNLQk9YX0xBVU5DSF9XUz1MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciB0byBwdWJsaXNoIHRoZSBXZWIgc2VydmljZSBpbiB0aGlzIHNjZW5hcmlvIHRvIGEgVURESSBSZWdpc3RyeS4KLVRPT0xUSVBfUFdQUl9DSEVDS0JPWF9URVNUX1NFUlZJQ0U9U2VsZWN0IHRoaXMgdG8gZXhwbG9yZSB0aGUgV2ViIHNlcnZpY2UgY3JlYXRlZC4KLVRPT0xUSVBfUFdQUl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0U9U2VsZWN0IHRoaXMgdG8gbW9uaXRvciB0aGUgU09BUCB0cmFmZmljcyBvZiB0aGlzIFdlYiBzZXJ2aWNlLgotVE9PTFRJUF9QV1BSX0dST1VQX1NDRU5BUklPX0NMSUVOVD1DbGllbnQgcHJveHkgZGVmYXVsdHMgZm9yIHRoaXMgd2l6YXJkIHNjZW5hcmlvLgotVE9PTFRJUF9QV1BSX0NPTUJPX0NMSUVOVFRZUEU9Q2xpZW50IHByb3h5IHNlbGVjdGlvbiB0eXBlLgotCi0jCi0jIFRvb2x0aXBzIGZvciBXZWJTZXJ2aWNlUHVibGlzaFBhZ2UKLSMKLVRPT0xUSVBfUFdQQl9QQUdFPQotVE9PTFRJUF9QV1BCX0NIRUNLQk9YX1dTX0xBVU5DSD1QdWJsaXNoIHRoZSBXZWIgc2VydmljZS4KLQotCi0jCi0jIFdTSUwgcHJveHkKLSMKLQotUEFHRV9XU0lMX0lNUE9SVD1XU0lMIEltcG9ydCBQYWdlCi1USVRMRV9XU0lMX0lNUE9SVD1XU0lMIEltcG9ydAotREVTQ19XU0lMX0lNUE9SVD1JbXBvcnQgV1NETCByZWZlcmVuY2VzIHRvIGEgV1NJTCBkb2N1bWVudAotUEFHRV9USVRMRV9XU19TRUxFQ1RJT049V2ViIFNlcnZpY2UgU2VsZWN0aW9uIFBhZ2UKLVBBR0VfREVTQ19XU19TRUxFQ1RJT049RW50ZXIgYSB3ZWIgc2VydmljZSBVUkkuCi0KLVBBR0VfTVNHX0xPQURJTkdfV0VCX1NFUlZJQ0VfVVJJPUxvYWRpbmcgV2ViIHNlcnZpY2UgVVJJLi4uCi1QQUdFX01TR19JTlZBTElEX1dFQl9TRVJWSUNFX1VSST1JbnZhbGlkIFdlYiBzZXJ2aWNlIFVSSS4gIEVudGVyIGFuIFVSSSB0byBhIFdTREwsIFdTSUwgb3IgSFRNTCBkb2N1bWVudC4KLVBBR0VfTVNHX05PX1NVQ0hfRklMRT1GaWxlICJ7MH0iIGRvZXMgbm90IGV4aXN0cy4KLVBBR0VfTVNHX1NFTEVDVElPTl9NVVNUX0JFX1dTREw9U2VsZWN0aW9uIG11c3QgYmUgV1NETC4KLVBBR0VfTVNHX0lOVkFMSURfV1NJTF9GSUxFX05BTUU9SW52YWxpZCBXU0lMIGZpbGUgbmFtZS4gIFdTSUwgZmlsZSBuYW1lIG11c3QgZW5kIHdpdGggLndzaWwKLQotCi0KLU1TR19FUlJPUl9VUklfTk9UX1JFU09MVkFCTEU9SVdBQjA0NjlFICJ7MH0iIGlzIG5vdCByZXNvbHZhYmxlLgotTVNHX0VSUk9SX1dTRExfSEFTX05PX1NFUlZJQ0VfRUxFTUVOVD1JV0FCMDU1MUUgV1NETCBmaWxlIGF0IHswfSBoYXMgbm8gc2VydmljZSBlbGVtZW50LgotCi1MQUJFTF9XU0lMX1VSST1XU0lMIFVSSToKLUxBQkVMX0JST1dTRT1Ccm93c2UKLUxBQkVMX1dTREw9V1NETDoKLUxBQkVMX1dTRExfVVJJPVdTREwgVVJJCi1MQUJFTF9JTVBPUlQ9SW1wb3J0Li4uCi1MQUJFTF9BREQ9QWRkCi1MQUJFTF9SRU1PVkU9UmVtb3ZlCi1MQUJFTF9XU19TRUxFQ1RJT049RW50ZXIgYW4gVVJJIHRvIGEgV1NETCwgV1NJTCBvciBIVE1MIGRvY3VtZW50OgotTEFCRUxfU0VMRUNUX1dTREw9U2VsZWN0IGEgV1NETAotCi0KLVRPT0xUSVBfV1NJTF9JTVBPUlRfUEFHRT1UaGlzIHBhZ2UgYWxsb3dzIHlvdSB0byBhZGQgV1NETCByZWZlcmVuY2VzIHRvIGEgV1NJTCBkb2N1bWVudC4KLVRPT0xUSVBfV1NJTF9URVhUX1dTSUw9RW50ZXIgdGhlIGxvY2F0aW9uIG9mIGEgbmV3IG9yIGV4aXN0aW5nIFdTSUwgZG9jdW1lbnQuCi1UT09MVElQX1dTSUxfQlVUVE9OX0JST1dTRV9XU0lMPUJyb3dzZSBmb3IgYSBXU0lMIGRvY3VtZW50LgotVE9PTFRJUF9XU0lMX1RBQkxFX1dTREw9RW50ZXIgdGhlIFVSSXMgb2YgdGhlIFdTRExzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGFkZGVkIGFzIHNlcnZpY2UgcmVmZXJlbmNlcy4KLVRPT0xUSVBfUENPTl9QQUdFPVNlbGVjdCBhIHdlYiBzZXJ2aWNlIGZvciBjb25zdW1wdGlvbi4KLVRPT0xUSVBfUENPTl9URVhUX1dTPUVudGVyIGFuIFVSSSB0byBhIFdTREwsIFdTSUwgb3IgSFRNTCBkb2N1bWVudC4KLVRPT0xUSVBfUENPTl9CVVRUT05fQlJPV1NFX1dTPUJyb3dzZSBmb3IgYSB3ZWIgc2VydmljZSByZXNvdXJjZS4KLQotIwotIyBUb29sdGlwcyBmb3IgY2xpZW50LldlYlNlcnZpY2VDbGllblRlc3RQYWdlCi0jCi1UT09MVElQX1BXU01fUEFHRT0KLVRPT0xUSVBfUFdTTV9DSEVDS0JPWF9URVNUPUVuYWJsZS9kaXNhYmxlIFRlc3QuCi1UT09MVElQX1BXU01fQ09NQk9CT1hfVEVTVD1TZWxlY3QgdGhlIHRlc3QgdHlwZS4KLVRPT0xUSVBfUFdTTV9DSEVDS0JPWF9MQVVOQ0g9UnVuIHRlc3Qgb24gYSBzZXJ2ZXIuCi1UT09MVElQX1BXU01fVEVYVF9KU1BfRk9MREVSPURlc3RpbmF0aW9uIGZvbGRlciBvZiBnZW5lcmF0ZWQgc2FtcGxlIGZpbGVzLgotVE9PTFRJUF9QV1NNX0JVVFRPTl9KU1BfRk9MREVSX0JST1dTRT1Ccm93c2UgZm9sZGVycy4KLVRPT0xUSVBfUFdTTV9CVVRUT05fU0VMRUNUX0FMTD1TZWxlY3QgYWxsIG1ldGhvZHMuCi1UT09MVElQX1BXU01fQlVUVE9OX0RFU0VMRUNUX0FMTD1EZXNlbGVjdCBhbGwgbWV0aG9kcy4KLVRPT0xUSVBfUFdTTV9DT01CT19QUk9KRUNUPVdlYiBwcm9qZWN0IGZvciBnZW5lcmF0ZWQgc2FtcGxlLgotVE9PTFRJUF9QV1NNX1RFWFRfU0FNUExFX0ZPTERFUj1EZXN0aW5hdGlvbiBmb2xkZXIgb2YgZ2VuZXJhdGVkIHNhbXBsZSBmaWxlcy4KLVRPT0xUSVBfUFdTTV9UUkVFX01FVEhPRFM9TWV0aG9kcyB0byBnZW5lcmF0ZSBpbnRvIHRoZSBzYW1wbGUuCi1UT09MVElQX1BXU01fRUFSX1BST0pFQ1Q9RUFSIHByb2plY3QgZm9yIHRoZSBnZW5lcmF0ZWQgc2FtcGxlLgotCi0jCi0jIEhUVFAgQmFzaWMgQXV0aAotIwotRElBTE9HX1RJVExFX0hUVFBfQkFTSUNfQVVUSD1IVFRQIEJhc2ljIEF1dGhlbnRpY2F0aW9uCi1MQUJFTF9VUkw9VVJMOgotTEFCRUxfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FPVVzZXIgbmFtZToKLUxBQkVMX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRD1QYXNzd29yZDoKLQotVE9PTFRJUF9IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUU9RW50ZXIgeW91ciBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHVzZXIgbmFtZS4KLVRPT0xUSVBfSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEPUVudGVyIHlvdXIgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiBwYXNzd29yZC4KLQotIwotIyBXZWIgU2VydmljZSBTZXJ2ZXIgUnVudGltZSBUeXBlCi0jCi0KLQotIwotIyBDbGllbnQgcHJvamVjdCB0eXBlCi0jCi0KLSMKLSMgR2VuZXJhdGUgSGFuZGxlciBTa2VsZXRvbgotIwotVEFTS19MQUJFTF9HRU5fSEFORExFUl9TS0VMRVRPTj1HZW5lcmF0ZSBoYW5kbGVyIHNrZWxldG9uIGNvbW1hbmQKLVRBU0tfREVTQ19HRU5fSEFORExFUl9TS0VMRVRPTj1HZW5lcmF0ZSBoYW5kbGVyIHNrZWxldG9uIGNvbW1hbmQKLU1TR19FUlJPUl9HRU5FUkFURV9IQU5ETEVSX1NLRUxFVE9OPUlXQUIwMzU5RSBFcnJvciBpbiBnZW5lcmF0aW5nIGhhbmRsZXIgc2tlbGV0b24uCi1NU0dfRVJST1JfV1JJVEVfRklMRT1JV0FCMDM2MEUgRXJyb3IgaW4gd3JpdGluZyBmaWxlIHswfS4KLQotIwotIyBIYW5kbGVycyBDb25maWd1cmF0aW9uIHdpemFyZCBwYWdlCi0jCi1MQUJFTF9IQU5ETEVSU19DT05GSUc9SGFuZGxlciBDb25maWd1cmF0aW9uCi1MQUJFTF9CVVRUT05fQUREPUFkZAotTEFCRUxfQlVUVE9OX1JFTU9WRT1SZW1vdmUKLUxBQkVMX0JVVFRPTl9NT1ZFX1VQPU1vdmUgVXAKLUxBQkVMX0JVVFRPTl9NT1ZFX0RPV049TW92ZSBEb3duCi1MQUJFTF9CVVRUT05fR0VOX1NLRUxFVE9OPUdlbmVyYXRlIHNrZWxldG9uIGNsYXNzZXMgZm9yIG5ldyBoYW5kbGVycwotTEFCRUxfQ09NQk9fU09VUkNFX0xPQz1PdXRwdXQgZm9sZGVyOgotTEFCRUxfQ09NQk9fV1NfQ0xJRU5UX1JFRj1DbGllbnQgU2VydmljZSBSZWZlcmVuY2U6Ci1MQUJFTF9DT01CT19XU19TRVJWSUNFX0RFU0M9U2VydmljZSBEZXNjcmlwdGlvbjoKLQotTEFCRUxfSEFORExFUl9OQU1FPU5hbWUKLUxBQkxFX0hBTkRMRVJfQ0xBU1M9Q2xhc3MgTmFtZQotTEFCRUxfSEFORExFUl9QT1JUPVBvcnQgTmFtZQotCi1ESUFMT0dfVElUTEVfV1NfQUREX0hBTkRMRVI9QWRkIE5ldyBIYW5kbGVyCi1MQUJFTF9URVhUX0hBTkRMRVJfTkFNRT1OYW1lOgotTEFCRUxfVEVYVF9IQU5ETEVSX0NMQVNTPUNsYXNzIG5hbWU6Ci1MQUJFTF9URVhUX0hBTkRMRVJfUE9SVD1Qb3J0IG5hbWU6Ci0KLVBBR0VfVElUTEVfU0VSVklDRV9IRExSX0NPTkZJRz1TZXJ2aWNlIEhhbmRsZXJzIENvbmZpZ3VyYXRpb24KLVBBR0VfREVTQ19TRVJWSUNFX0hETFJfQ09ORklHPUNvbmZpZ3VyZSBzZXJ2aWNlLXNpZGUgaGFuZGxlcnMKLVBBR0VfVElUTEVfQ0xJRU5UX0hETFJfQ09ORklHPUNsaWVudCBIYW5kbGVycyBDb25maWd1cmF0aW9uCi1QQUdFX0RFU0NfQ0xJRU5UX0hETFJfQ09ORklHPUNvbmZpZ3VyZSBjbGllbnQtc2lkZSBoYW5kbGVycwotCi1UT09MVElQX0VESVRfV1NfSEFORExFUlM9Q29uZmlndXJlIFdlYiBTZXJ2aWNlIEhhbmRsZXJzCi1UT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT049U2VsZWN0IHRvIGdlbmVyYXRlIHNrZWxldG9uIGNsYXNzZXMgZm9yIG5ldyBoYW5kbGVycy4KLVRPT0xUSVBfQ09NQk9fU09VUkNFX0xPQz1TZWxlY3QgdGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgZmlsZSBnZW5lcmF0aW9uLgotVE9PTFRJUF9URVhUX0hBTkRMRVJfTkFNRT1IYW5kbGVyIG5hbWUKLVRPT0xUSVBfVEVYVF9IQU5ETEVSX0NMQVNTPUhhbmRsZXIgY2xhc3MgbmFtZQotVE9PTFRJUF9URVhUX0hBTkRMRVJfUE9SVD1IYW5kbGVyIHBvcnQgY29tcG9uZW50IG5hbWUKLVRPT0xUSVBfV1NfQ0xJRU5UX1JFRj1TZWxlY3QgYSBjbGllbnQgc2VydmljZS1yZWZlcmVuY2UgdG8gc2hvdyBpdHMgaGFuZGxlcnMuCi1UT09MVElQX1dTX1NFUlZJQ0VfREVTQz1TZWxlY3QgYSBzZXJ2aWNlIGRlc2NyaXB0aW9uIHRvIHNob3cgaXRzIGhhbmRsZXJzLgotCi0jCi0jIE9wZW5KYXZhRWRpdG9yQ29tbWFuZAotIwotTVNHX0VSUk9SX1VOQUJMRV9UT19PUEVOX0pBVkFfRURJVE9SPUlXQUIwMDI5RSBVbmFibGUgdG8gb3BlbiBjbGFzcyB7MH0gZnJvbSBwcm9qZWN0IHsxfSBpbiB0aGUgSmF2YSBlZGl0b3IuCi0KLSMKLSMgQ2hlY2tJZlNlcnZpY2VQcm9qZWN0Ci0jIAotTVNHX1dBUk5fSVNfU0VSVklDRV9QUk9KRUNUPVRoZSBzZWxlY3RlZCBjbGllbnQgcHJvamVjdCwgezB9LCBjb250YWlucyB0aGUgV2ViIHNlcnZpY2UuIFByb2NlZWRpbmcgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24gbWF5IHJlc3VsdCBpbiBydW50aW1lIGVycm9ycyB3aGVuIGludm9raW5nIHRoZSBXZWIgc2VydmljZS4gV291bGQgeW91IGxpa2UgdG8gcHJvY2VlZD8KLU1TR19VU0VSX0FCT1JURUQ9VXNlciBwcmVzc2VkIGNhbmNlbCBpbiB3YXJuaW5nIGRpYWxvZyB3aGljaCB3YXJuZWQgYWJvdXQgdGhlIHNlbGVjdGVkIGNsaWVudCBwcm9qZWN0IGJlaW5nIHRoZSBzZXJ2aWNlIHByb2plY3QuCi0KLQotIwotIyBNaXNzaW5nIHRoaXJkIHBhcnR5IGZpbGUgZXJyb3IgbWVzc2FnZQotIwotTVNHX01JU1NJTkdfVEhJUkRfUEFSVFlfRklMRVM9TWlzc2luZyB0aGlyZCBwYXJ0eSBmaWxlcy4gIFJlZmVyIHRvIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMvd3MvZG93bmxvYWRfaW5zdHJ1Y3Rpb25zX2Zvcl9qYXJzLmh0bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2FjdGlvbi9MYXVuY2hXU0VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvYWN0aW9uL0xhdW5jaFdTRUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDJmYjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvYWN0aW9uL0xhdW5jaFdTRUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVjbGlwc2UuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5lY2xpcHNlLkVjbGlwc2VQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVN0YXR1c0hhbmRsZXI7Ci0KLQotcHVibGljIGNsYXNzIExhdW5jaFdTRUFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZQotewotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICBFY2xpcHNlU3RhdHVzSGFuZGxlciAgICAgICAgICAgICBoYW5kbGVyICAgICA9IG5ldyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpOwotICAgIEVjbGlwc2VQcm9ncmVzc01vbml0b3IgICAgICAgICAgIG1vbml0b3IgICAgID0gbmV3IEVjbGlwc2VQcm9ncmVzc01vbml0b3IoKTsKLSAgICBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQgICAgICAgICBjb250ZXh0ICAgICA9IG5ldyBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQoKTsKLSAgICBFY2xpcHNlRW52aXJvbm1lbnQgICAgICAgICAgICAgICBlbnZpcm9ubWVudCA9IG5ldyBFY2xpcHNlRW52aXJvbm1lbnQoIG51bGwsIGNvbnRleHQsIG1vbml0b3IsIGhhbmRsZXIgKTsgCi0gICAgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCAgICAgICAgY21kICAgICAgICAgPSBuZXcgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCgpOwotICAgIAotICAgIGNtZC5leGVjdXRlKCBlbnZpcm9ubWVudCApOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsgIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgeyAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0NoZWNrRm9yTWlzc2luZ0ZpbGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQ2hlY2tGb3JNaXNzaW5nRmlsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlOTVhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQ2hlY2tGb3JNaXNzaW5nRmlsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmRlcGVuZGVuY3ljaGVja2VyLkNoZWNrTWlzc2luZ0ZpbGVzOwotCi1wdWJsaWMgY2xhc3MgQ2hlY2tGb3JNaXNzaW5nRmlsZXMgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmQjZXhlY3V0ZShvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotICB7Ci0gICAgU3RhdHVzICBzdGF0dXMgICAgICAgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIFN0cmluZyAgcGx1Z2luSWQgICAgID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgYm9vbGVhbiBtaXNzaW5nRmlsZXMgPSBDaGVja01pc3NpbmdGaWxlcy5oYXNNaXNzaW5nRmlsZXMoIHBsdWdpbklkICk7Ci0gICAgCi0gICAgaWYoIG1pc3NpbmdGaWxlcyApCi0gICAgewotICAgICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7ICAKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCAiTVNHX01JU1NJTkdfVEhJUkRfUEFSVFlfRklMRVMiICksIFN0YXR1cy5FUlJPUiApOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKCBzdGF0dXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0NoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4Yzg5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5WYWxpZGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLS8qKgotICogVGhpcyBjb21tYW5kIGNoZWNrcyB0byBzZWUgaWYgdGhlIHNlbGVjdGVkIGNsaWVudCBwcm9qZWN0IGlzIHRoZQotICogc2VydmljZSBwcm9qZWN0LiBJZiBzbywgdGhlIHVzZXIgaXMgd2FybmVkLgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLSAgU2VsZWN0aW9uTGlzdENob2ljZXMgcnVudGltZTJDbGllbnRUeXBlczsKLSAgU3RyaW5nIHdzZGxVUkk7Ci0gIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICAgIAotICBwdWJsaWMgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQoKQotICB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lMkNsaWVudFR5cGVzKCBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBydW50aW1lMkNsaWVudFR5cGVzICkKLSAgewotICAgIHRoaXMucnVudGltZTJDbGllbnRUeXBlcyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLSAgCi0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNleGVjdXRlKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBpZiAocnVudGltZTJDbGllbnRUeXBlcz09bnVsbCB8fCB3c2RsVVJJPT1udWxsIHx8IHdzZGxVUkkubGVuZ3RoKCk9PTAgfHwgd2ViU2VydmljZXNQYXJzZXI9PW51bGwpCi0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIAotICAgIFN0cmluZyBjbGllbnRQcm9qZWN0TmFtZSA9IHJ1bnRpbWUyQ2xpZW50VHlwZXMuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChjbGllbnRQcm9qZWN0TmFtZT09bnVsbCB8fCBjbGllbnRQcm9qZWN0TmFtZS5sZW5ndGgoKT09MCkKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gICAgSVByb2plY3QgY2xpZW50UHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGNsaWVudFByb2plY3ROYW1lKSk7Ci0gICAgVmFsaWRhdGlvblV0aWxzIHZ1ID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotICAgIENhbGVuZGFyIGNhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgIGJvb2xlYW4gaXNTZXJ2aWNlUHJvamVjdCA9IHZ1LmlzUHJvamVjdFNlcnZpY2VQcm9qZWN0KGNsaWVudFByb2plY3QsIHdzZGxVUkksIHdlYlNlcnZpY2VzUGFyc2VyKTsKLSAgICBpZiAoaXNTZXJ2aWNlUHJvamVjdCkKLSAgICB7Ci0gICAgICBTdGF0dXMgd1N0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19XQVJOX0lTX1NFUlZJQ0VfUFJPSkVDVCIsIG5ldyBTdHJpbmdbXXtjbGllbnRQcm9qZWN0TmFtZX0pLCBTdGF0dXMuV0FSTklORyk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydCh3U3RhdHVzKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChTdGF0dXNFeGNlcHRpb24gc2UpCi0gICAgICB7Ci0gICAgICAgIC8vVXNlciBkZWNpZGVkIHRvIGFib3J0LiBSZXR1cm4gYW4gZXJyb3Igc3RhdHVzCi0gICAgICAgIFN0YXR1cyBlU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1VTRVJfQUJPUlRFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICByZXR1cm4gZVN0YXR1czsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0dlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0dlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTI2YTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9HZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0KLSAgcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAKLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9HRU5fSEFORExFUl9TS0VMRVRPTiI7Ci0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19HRU5fSEFORExFUl9TS0VMRVRPTiI7Ci0gIAotICBwcml2YXRlIElQYXRoIG91dHB1dExvY2F0aW9uXzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBoYW5kbGVyTmFtZXNfOwotICBwcml2YXRlIGJvb2xlYW4gZ2VuU2tlbGV0b25fOwotICBwcml2YXRlIFN0cmluZyBoYW5kbGVyTmFtZUZvckVkaXRfID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQoKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIAltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAJc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOyAgICAKLSAgfQotICAKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUgKEVudmlyb25tZW50IGVudikKLSAgewotICAJCi0gIAlpZiAoIWdlblNrZWxldG9uXykKLSAgCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7IAotICAJCi0gIAlpbnQgaTsKLSAgCWJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgCWJvb2xlYW4gd2FybmluZyA9IGZhbHNlOwotICAJCi0gIAlTaW1wbGVTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgCVN0YXR1cyB3cml0ZVN0YXR1czsJCi0gIAkKLSAgCQotICAgIGZvciAoaT0wOyBpPGhhbmRsZXJOYW1lc18ubGVuZ3RoOyBpKyspIHsKLSAgICAJd3JpdGVTdGF0dXMgPSB3cml0ZUZpbGUoZW52LCBoYW5kbGVyTmFtZXNfW2ldLCBvdXRwdXRMb2NhdGlvbl8pOwotICAgIAkvLyBoYW5kbGUgc3RhdHVzIHJldHVybgotICAgIAlpZiAod3JpdGVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHsgIC8vIHdyaXRlIHN0YXR1cyBpcyBPSyBvciBFUlJPUgotICAgIAkJZXJyb3IgPSB0cnVlOwotICAgIAkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0gICAgCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImV4ZWN1dGUiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0dFTkVSQVRFX0hBTkRMRVJfU0tFTEVUT04iKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAJCX0KLSAgICAJCXN0YXR1cy5hZGRDaGlsZCh3cml0ZVN0YXR1cyk7Ci0gICAgCX0gCi0gICAgfQotICAgIGlmIChlcnJvcikgewotICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICB9IGVsc2UgewotICAgIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIH0KLSAgCXJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgd3JpdGVGaWxlIChFbnZpcm9ubWVudCBlbnYsIFN0cmluZyBjbGFzc05hbWUsIElQYXRoIG91dHB1dExvY2F0aW9uKSAKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAJaW50IGluZGV4OwotICAJCi0gIAlTdHJpbmcgc2ltcGxlQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAJU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLSAgCUlQYXRoIGZpbGVQYXRoID0gb3V0cHV0TG9jYXRpb247Ci0gIAlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLSAgCQlpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAJCWlmIChpbmRleCAhPSAtMSkgewotICAJCQlzaW1wbGVDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gIAkJCXBhY2thZ2VOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gIAkJCQotICAJCSAgCVN0cmluZyBwYWNrYWdlU2VnbWVudCA9IHBhY2thZ2VOYW1lOwotICAJCSAgCWludCBqID0gMDsKLSAgCQkgIAlqID0gcGFja2FnZVNlZ21lbnQuaW5kZXhPZignLicpOwotICAJCSAgCXdoaWxlIChqICE9IC0xKSB7Ci0gIAkJICAJCWZpbGVQYXRoID0gZmlsZVBhdGguYXBwZW5kKHBhY2thZ2VTZWdtZW50LnN1YnN0cmluZygwLCBqKSk7Ci0gIAkJICAJCXBhY2thZ2VTZWdtZW50ID0gcGFja2FnZVNlZ21lbnQuc3Vic3RyaW5nKGogKyAxKTsKLSAgCQkgIAkJaiA9IHBhY2thZ2VTZWdtZW50LmluZGV4T2YoJy4nKTsKLSAgCQkgIAl9Ci0gIAkJICAgIGZpbGVQYXRoID0gZmlsZVBhdGguYXBwZW5kKHBhY2thZ2VTZWdtZW50KTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkJICBwYWNrYWdlTmFtZSA9ICIiOwotICAJCX0KLSAgCX0KLSAgCQotICAJZmlsZVBhdGggPSBmaWxlUGF0aC5hcHBlbmQoc2ltcGxlQ2xhc3NOYW1lKTsKLSAgCQotICAJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKCJqYXZhIik7Ci0KLSAgCS8vIGNoZWNrIGlmIEhhbmRsZXIgYWxyZWFkeSBleGlzdHM7IGRvIG5vdCBvdmVyd3JpdGUgZXhpc3RpbmcgSGFuZGxlcnMKLSAgCUlSZXNvdXJjZSB3b3Jrc3BhY2VSZXMgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShmaWxlUGF0aCk7Ci0gIAlpZiAod29ya3NwYWNlUmVzIT1udWxsICYmIHdvcmtzcGFjZVJlcy5leGlzdHMoKSkgewotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9Ci0gIAkKLSAgCWlmIChoYW5kbGVyTmFtZUZvckVkaXRfID09IG51bGwpewotICAJCWhhbmRsZXJOYW1lRm9yRWRpdF8gPSBjbGFzc05hbWU7Ci0gIAl9Ci0gIAkKLSAgCU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBGaWxlUmVzb3VyY2VVdGlscy5uZXdGaWxlT3V0cHV0U3RyZWFtKCBFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLCBmaWxlUGF0aCwgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLCBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpKTsKLSAgCS8vIGNyZWF0ZSBidWZmZXJlZCB3cml0ZXIgZm9yIHdyaXRpbmcgZmlsZQotICAJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0pKTsKLSAgCXRyeSB7Ci0gIAkJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpICE9IDApIHsKLSAgCQkJYncud3JpdGUoInBhY2thZ2UgIiArcGFja2FnZU5hbWUrIjsiKTsKLSAgCQkJYncubmV3TGluZSgpOwotICAJCQlidy5uZXdMaW5lKCk7Ci0gIAkJfQotICAJCWJ3LndyaXRlKCJpbXBvcnQgamF2YXgueG1sLnJwYy5oYW5kbGVyLkdlbmVyaWNIYW5kbGVyOyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiaW1wb3J0IGphdmF4LnhtbC5ycGMuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoImltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJCi0gIAkJYncud3JpdGUoInB1YmxpYyBjbGFzcyAiK3NpbXBsZUNsYXNzTmFtZSsiIGV4dGVuZHMgR2VuZXJpY0hhbmRsZXIiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoInsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCQotICAJCWJ3LndyaXRlKCIgICBwdWJsaWMgUU5hbWVbXSBnZXRIZWFkZXJzICgpIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICB7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICAvLyBGaWxsIGluIG1ldGhvZCBib2R5Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICByZXR1cm4gbnVsbDsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIH0iKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXF1ZXN0KCBNZXNzYWdlQ29udGV4dCBjb250ZXh0ICkiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIHsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIC8vIEZpbGwgaW4gbWV0aG9kIGJvZHkgb3IgZGVsZXRlIG1ldGhvZCB0byB1c2UgR2VuZXJpY0hhbmRsZXIiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIHJldHVybiB0cnVlOyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgfSIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVJlc3BvbnNlKCBNZXNzYWdlQ29udGV4dCBjb250ZXh0ICkiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIHsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIC8vIEZpbGwgaW4gbWV0aG9kIGJvZHkgb3IgZGVsZXRlIG1ldGhvZCB0byB1c2UgR2VuZXJpY0hhbmRsZXIgIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICByZXR1cm4gdHJ1ZTsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIH0iKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdCggTWVzc2FnZUNvbnRleHQgY29udGV4dCApIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICB7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICAvLyBGaWxsIGluIG1ldGhvZCBib2R5IG9yIGRlbGV0ZSBtZXRob2QgdG8gdXNlIEdlbmVyaWNIYW5kbGVyIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICByZXR1cm4gdHJ1ZTsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIH0iKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJCi0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCJ9Iik7Ci0gIAkJYncuY2xvc2UoKTsKLSAgCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwkKLSAgCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAid3JpdGVGaWxlIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XUklURV9GSUxFIiwgbmV3IFN0cmluZ1tdeyBjbGFzc05hbWUgfSksIFN0YXR1cy5FUlJPUiwgZSApOwotICAJCWlmIChidyAhPSBudWxsKSB7Ci0gIAkJCXRyeSB7Ci0gIAkJCQlidy5jbG9zZSgpOwotICAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotICAJCQl9Ci0gIAkJfQotICAJfQotICAJcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyByZWRvKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dExvY2F0aW9uKElQYXRoIG91dHB1dExvY2F0aW9uKSAKLSAgewotCXRoaXMub3V0cHV0TG9jYXRpb25fID0gb3V0cHV0TG9jYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJOYW1lcyAoU3RyaW5nW10gaGFuZGxlck5hbWVzKQotICB7Ci0gIAl0aGlzLmhhbmRsZXJOYW1lc18gPSBoYW5kbGVyTmFtZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlblNrZWxldG9uRW5hYmxlZChib29sZWFuIGdlblNrZWxldG9uKQotICB7Ci0gIAl0aGlzLmdlblNrZWxldG9uXyA9IGdlblNrZWxldG9uOwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpewotICAJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0gIAlpZiAob3V0cHV0TG9jYXRpb25fIT1udWxsKXsKLSAgCQlwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2Yob3V0cHV0TG9jYXRpb25fKTsKLSAgCX0KLSAgCXJldHVybiBwcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRDbGFzc05hbWVzKCl7Ci0gIAlMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAlpZiAoaGFuZGxlck5hbWVGb3JFZGl0XyE9bnVsbCl7Ci0gIAkJY2xhc3Nlcy5hZGQoaGFuZGxlck5hbWVGb3JFZGl0Xyk7Ci0gIAl9Ci0gIAlyZXR1cm4gY2xhc3NlczsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9PcGVuSmF2YUVkaXRvckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9PcGVuSmF2YUVkaXRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5ODc2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvT3BlbkphdmFFZGl0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBPcGVuSmF2YUVkaXRvckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgTGlzdCBjbGFzc05hbWVzOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLSAgcHVibGljIE9wZW5KYXZhRWRpdG9yQ29tbWFuZCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIE9wZW5KYXZhRWRpdG9ySm9iIGpvYiA9IG5ldyBPcGVuSmF2YUVkaXRvckpvYihjbGFzc05hbWVzLCBwcm9qZWN0KTsKLSAgICBqb2Iuc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotICAgIGpvYi5zY2hlZHVsZSgpOwotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZXMoTGlzdCBjbGFzc05hbWVzKQotICB7Ci0gICAgdGhpcy5jbGFzc05hbWVzID0gY2xhc3NOYW1lczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgT3BlbkphdmFFZGl0b3JKb2IgZXh0ZW5kcyBVSUpvYgotICB7Ci0gICAgcHJpdmF0ZSBMaXN0IGNsYXNzTmFtZXM7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0gICAgcHVibGljIE9wZW5KYXZhRWRpdG9ySm9iKExpc3QgY2xhc3NOYW1lcywgSVByb2plY3QgcHJvamVjdCkKLSAgICB7Ci0gICAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuT3BlbkphdmFFZGl0b3JKb2IiKTsKLSAgICAgIHRoaXMuY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7Ci0gICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICB7Ci0gICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIGNsYXNzTmFtZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY2xhc3NOYW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpaXQubmV4dCgpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShjbGFzc05hbWUpOwotICAgICAgICAgICAgSmF2YVVJLm9wZW5JbkVkaXRvcih0eXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzLkVSUk9SLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCwgMCwgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VOQUJMRV9UT19PUEVOX0pBVkFfRURJVE9SIiwgbmV3IFN0cmluZ1tde2NsYXNzTmFtZSwgcHJvamVjdC5nZXROYW1lKCl9KSwgdCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzLk9LLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCwgMCwgIiIsIG51bGwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cy5FUlJPUiwgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsIDAsIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkFCTEVfVE9fT1BFTl9KQVZBX0VESVRPUiIsIG5ldyBTdHJpbmdbXXtjbGFzc05hbWVzICE9IG51bGwgPyBjbGFzc05hbWVzLnRvU3RyaW5nKCkgOiAiIiwgcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXROYW1lKCkgOiAiIn0pLCBudWxsKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9XU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL1dTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjQ5NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL1dTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSUFQQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLldTSUNvbXBsaWFuY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0KLXB1YmxpYyBjbGFzcyBXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLQotICBwcml2YXRlIElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0XzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotIAotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1dTSV9OT05DT01QTElBTlQiOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfV1NJX05PTkNPTVBMSUFOVCI7Ci0JCi0gIHB1YmxpYyBXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCgpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2Uud3N0LndzLnVpIjsKLSAgCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gIAlzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotICAJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7ICAgIAotICB9Ci0gIAotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZSAoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICAKLSAgCVBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dCB3c2lTU0JQQ29udGV4dCA9IFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lTU0JQQ29udGV4dCgpOyAKLSAgCVBlcnNpc3RlbnRXU0lBUENvbnRleHQgd3NpQVBDb250ZXh0ID0gV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSUFQQ29udGV4dCgpOyAKLSAgICBWZWN0b3Igc3RhdHVzU1NCUCA9IG5ldyBWZWN0b3IoKTsKLSAgICBzdGF0dXNTU0JQLmFkZChuZXcgU2ltcGxlU3RhdHVzKCJXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCIsIAotICAgIAkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIldTSV9TU0JQX0lOQ09NUExJQU5UX1JVTlRJTUUiKSwgV1NJQ29tcGxpYW5jZVV0aWxzLmdldFdTSVNldmVyaXR5KHNlcnZpY2VQcm9qZWN0Xywgd3NpU1NCUENvbnRleHQpKSk7Ci0gICAgU3RhdHVzW10gc3RhdHVzZXNTU0JQID0gKFN0YXR1c1tdKSBzdGF0dXNTU0JQLnRvQXJyYXkobmV3IFN0YXR1c1tzdGF0dXNTU0JQLnNpemUoKV0pOwotICAgIAotICAgIFZlY3RvciBzdGF0dXNBUCA9IG5ldyBWZWN0b3IoKTsKLSAgICBzdGF0dXNBUC5hZGQobmV3IFNpbXBsZVN0YXR1cygiV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQiLCAKLSAgICAJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJXU0lfQVBfSU5DT01QTElBTlRfUlVOVElNRSIpLCBXU0lDb21wbGlhbmNlVXRpbHMuZ2V0V1NJU2V2ZXJpdHkoc2VydmljZVByb2plY3RfLCB3c2lBUENvbnRleHQpKSk7Ci0gICAgU3RhdHVzW10gc3RhdHVzZXNBUCA9IChTdGF0dXNbXSkgc3RhdHVzQVAudG9BcnJheShuZXcgU3RhdHVzW3N0YXR1c0FQLnNpemUoKV0pOwotCi0gICAgaWYgKFdTSUNvbXBsaWFuY2VVdGlscy5jaGVja1dTSUNvbXBsaWFuY2UgKGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKSwgc3RhdHVzZXNTU0JQLCBzZXJ2aWNlUHJvamVjdF8sIHdzaVNTQlBDb250ZXh0KSkgewotICAgIAlpZiAoV1NJQ29tcGxpYW5jZVV0aWxzLmNoZWNrV1NJQ29tcGxpYW5jZSAoZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLCBzdGF0dXNlc0FQLCBzZXJ2aWNlUHJvamVjdF8sIHdzaUFQQ29udGV4dCkpIHsKLSAgICAJCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIAl9IGVsc2UgewotICAgIAkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoCi0gICAgCQkJCSJXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCIsCi0gICAgCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJOT1RfT0siKSwKLSAgICAJCQkJU3RhdHVzLkVSUk9SKTsKLSAgICAJfQotICAgIH0gZWxzZSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKAotCQkJCSJXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCIsCi0JCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk5PVF9PSyIpLAotCQkJCVN0YXR1cy5FUlJPUik7Ci0JCX0KLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyByZWRvKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KSB7Ci0JdGhpcy5zZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL2RhdGEvRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9FY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1MjYzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9FY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIKLXsKLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgU3RyaW5nIHMgPSB2YWx1ZS50b1N0cmluZygpOwotICAgIGlmIChzLmluZGV4T2YoIjoiKSA8IDApCi0gICAgewotICAgICAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcih2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgIGlmIChyZXMuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcyA9IHJlcy5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1Byb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1Byb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyNTg4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9Qcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIFByb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHZhbHVlLnRvU3RyaW5nKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1NlcnZlckluc3RUb0lTZXJ2ZXJUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTIyYjg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1NlcnZlckluc3RUb0lTZXJ2ZXJUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIwLCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLS8qCi0gKiBUcmFuc2Zvcm1zIGEgc2VydmVyIGluc3RhbmNlIGlkIHRvIGFuIElTZXJ2ZXIKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckluc3RUb0lTZXJ2ZXJUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyIHsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lciN0cmFuc2Zvcm0oamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotICAgIAotICAgIFN0cmluZyBleGlzdGluZ1NlcnZlckluc3RJZCA9IChTdHJpbmcpdmFsdWU7Ci0gICAgSVNlcnZlciBzZXJ2ZXJJbnN0ID0gbnVsbDsKLSAgICBpZiAoZXhpc3RpbmdTZXJ2ZXJJbnN0SWQgIT0gbnVsbCkgewotICAgIAlzZXJ2ZXJJbnN0ID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGV4aXN0aW5nU2VydmVySW5zdElkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZlckluc3Q7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL2RhdGEvU2VydmVyTmFtZTJJU2VydmVyVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1NlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTQ2YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL2RhdGEvU2VydmVyTmFtZTJJU2VydmVyVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyTmFtZTJJU2VydmVyVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBWZWN0b3Igc2VydmVySWRzID0gbmV3IFZlY3RvcigpOwotICAgIHsKLSAgICAgIFN0cmluZyBzZXJ2ZXJOYW1lID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgICBpZiAoc2VydmVycyAhPSBudWxsICYmIHNlcnZlcnMubGVuZ3RoIT0wKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICAgICAgaWYgKChzZXJ2ZXIuZ2V0TmFtZSgpKS5lcXVhbHMoc2VydmVyTmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gc2VydmVyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9DbGllbnRTZXJ2ZXJTZWxlY3Rpb25VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2YmUwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9DbGllbnRTZXJ2ZXJTZWxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQuSVNlcnZlclRhcmdldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQuU2VydmVyVGFyZ2V0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uSVNlcnZlckRlZmF1bHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLlNlcnZlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRTZXJ2ZXJTZWxlY3Rpb25VdGlscwotewotICAvKgotICAgKiBSZXR1cm5zIHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIHNlcnZlciBmYWN0b3J5IGlkIGFuZCBpbnN0YW5jZSBpZCBiYXNlZCBvbiAKLSAgICogYW4gZXhpc3RpbmcgcHJvamVjdAotICAgKiBpbmRleCBbMF0gY29udGFpbnMgZmFjdG9yeUlkLCBpbmRleFsxXSBjb250YWlucyBpbnN0YW5jZSBJZC4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVySW5mb0Zyb21FeGlzdGluZ1Byb2plY3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHR5cGVJZCwgYm9vbGVhbiBhc2tFeHRlbmRlcnMpCi0gIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gbmV3IFN0cmluZ1syXTsgLy9zZXJ2ZXJJbmZwWzBdIGNvbnRhaW5zIGZhY3RvcnlJZCwgc2VydmVySW5mb1sxXSBjb250YWlucyBpbnN0YW5jZSBJZAotICAgIAotICAgIC8vIElmIHRoZSBwcm9qZWN0IGhhcyBiZWVuIGFkZGVkIHRvIGFuIGV4aXN0aW5nIHNlcnZlciwgcGljayB0aGF0IHNlcnZlcgotICAgIElTZXJ2ZXJbXSBjb25maWd1cmVkU2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKLSAgICBJU2VydmVyIGZpcnN0U3VwcG9ydGVkU2VydmVyID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoY29uZmlndXJlZFNlcnZlcnMsIHR5cGVJZCApOwotICAgIGlmIChmaXJzdFN1cHBvcnRlZFNlcnZlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHNlcnZlckluZm9bMF0gPSBmaXJzdFN1cHBvcnRlZFNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIHNlcnZlckluZm9bMV0gPSBmaXJzdFN1cHBvcnRlZFNlcnZlci5nZXRJZCgpOwotICAgICAgcmV0dXJuIHNlcnZlckluZm87ICAgICAgCQotICAgIH0KLSAgICAKLSAgICAvL0RvZXMgdGhlIHByb2plY3QgaGF2ZSBhIHJ1bnRpbWUtdGFyZ2V0PwotICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSBnZXRSdW50aW1lVGFyZ2V0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICBpZiAocnVudGltZVRhcmdldCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vTG9vayBmb3IgYW4gZXhpc3Rpbmcgc2VydmVyIHdoaWNoIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcnVudGltZS10YXJnZXQKLSAgICAgIElTZXJ2ZXJbXSBjb21wYXRpYmxlU2VydmVycyA9IGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcnMocnVudGltZVRhcmdldCk7Ci0gICAgICBpZiAoY29tcGF0aWJsZVNlcnZlcnMhPW51bGwgJiYgY29tcGF0aWJsZVNlcnZlcnMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbXBhdGlibGVTZXJ2ZXJzLCB0eXBlSWQpOwotICAgICAgICBpZiAoZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgICAgICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vTm8gZXhpc3RpbmcgY29tcGF0aWJsZSBzZXJ2ZXIgd2FzIGZvdW5kLiBDaG9vc2UgYSBjb21wYXRpYmxlIHNlcnZlciB0eXBlLgotICAgICAgCi0gICAgICAvL0lmIHRoZSBwcmVmZXJyZWQgc2VydmVyIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvamVjdCdzIHJ1bnRpbWUgdGFyZ2V0LCB1c2UgaXQuCi0gICAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY3R4ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgICAgU3RyaW5nIHBGYWN0b3J5SWQgPSBjdHguZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShwRmFjdG9yeUlkKTsKLSAgICAgIGlmIChzZXJ2ZXJUeXBlIT1udWxsKXsKLSAgICAgIAlTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAJaWYgKHNlcnZlclJ1bnRpbWVJZC5lcXVhbHMocnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpKQotICAgICAgCXsKLSAgICAgIAkgIHNlcnZlckluZm9bMF0gPSBwRmFjdG9yeUlkOwotICAgICAgCSAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAJfQotICAgICAgfSAgICAgCi0gICAgICAKLSAgICAgIC8vVGhlIHByZWZlcnJlZCBzZXJ2ZXIgd2FzIG5vdCBjb21wYXRpYmxlLiBQaWNrIHRoZSBmaXJzdCB2YWxpZCBjb21wYXRpYmxlIHNlcnZlciB0eXBlLiAgICAgIAotICAgICAgU3RyaW5nIGZhY3RvcnlJZCA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyVHlwZShydW50aW1lVGFyZ2V0LCB0eXBlSWQpOwotICAgICAgaWYgKGZhY3RvcnlJZCAhPSBudWxsKSBzZXJ2ZXJJbmZvWzBdID0gZmFjdG9yeUlkOwotICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgaWYgKGFza0V4dGVuZGVycykKLSAgICB7Ci0gICAgICBTZXJ2ZXJJbmZvIHJlY29tbWVuZGVkU2VydmVySW5mbyA9IGdldEV4dGVuZGVyUmVjb21tZW5kYXRpb24ocHJvamVjdCk7Ci0gICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpIT1udWxsICYmIHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKS5sZW5ndGgoKT4wKQotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKSE9bnVsbCAmJiByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpLmxlbmd0aCgpPjApCi0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7IAotCi0gICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL1VzZSBTZXJ2ZXJUYXJnZXRIZWxwZXIgdG8gZ2V0IGEgbGlzdCBvZiB2YWxpZCBydW50aW1lLXRhcmdldHMgYW5kIHVzZSB0aGVzZSB0byBkZXRlcm1pbmUgYSBkZWZhdWx0IHNlcnZlciB0eXBlLgotICAgIFN0cmluZ1tdIHByb2plY3RBdHRycyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRQcm9qZWN0VHlwZUFuZEoyRUVMZXZlbChwcm9qZWN0KTsKLSAgICBMaXN0IHJ1bnRpbWVzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFNlcnZlclRhcmdldHMocHJvamVjdEF0dHJzWzBdLCBwcm9qZWN0QXR0cnNbMV0pOwotICAgIFN0cmluZ1tdIGNvbXBhdFNlcnZlckluZm8gPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXIocnVudGltZXMsdHlwZUlkKTsgCi0gICAgaWYgKCBjb21wYXRTZXJ2ZXJJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGNvbXBhdFNlcnZlckluZm87Ci0gICAgfQotICAgIAotICAgIC8vTm8gZXhpc3RpbmcgY29tcGF0aWJsZSBzZXJ2ZXIsIHBpY2sgYSB0eXBlLgotICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUocnVudGltZXMsIHR5cGVJZCk7Ci0gICAgaWYgKGZhY3RvcnlJZCAhPSBudWxsKSBzZXJ2ZXJJbmZvWzBdID0gZmFjdG9yeUlkOyAKLSAgICByZXR1cm4gc2VydmVySW5mbzsgICAKLQotICB9Ci0KLSAgLyoKLSAgICogUmV0dXJucyByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBzZXJ2ZXIgZmFjdG9yeSBpZCBhbmQgaW5zdGFuY2UgaWQgYmFzZWQgb24gCi0gICAqIGFuIGV4aXN0aW5nIHByb2plY3QKLSAgICogaW5kZXggWzBdIGNvbnRhaW5zIGZhY3RvcnlJZCwgaW5kZXhbMV0gY29udGFpbnMgaW5zdGFuY2UgSWQuCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNlcnZlckluZm9Gcm9tRXhpc3RpbmdQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSWQsIFN0cmluZyBydW50aW1lSWQsIGJvb2xlYW4gYXNrRXh0ZW5kZXJzKQotICB7Ci0gICAgU3RyaW5nW10gc2VydmVySW5mbyA9IG5ldyBTdHJpbmdbMl07IC8vc2VydmVySW5mcFswXSBjb250YWlucyBmYWN0b3J5SWQsIHNlcnZlckluZm9bMV0gY29udGFpbnMgaW5zdGFuY2UgSWQKLSAgICAKLSAgICAvLyBJZiB0aGUgcHJvamVjdCBoYXMgYmVlbiBhZGRlZCB0byBhbiBleGlzdGluZyBzZXJ2ZXIsIHBpY2sgdGhhdCBzZXJ2ZXIKLSAgICBJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbmZpZ3VyZWRTZXJ2ZXJzLCB0eXBlSWQgKTsKLSAgICBpZiAoZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICBzZXJ2ZXJJbmZvWzFdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOyAgICAgIAkKLSAgICB9Ci0gICAgCi0gICAgLy9Eb2VzIHRoZSBwcm9qZWN0IGhhdmUgYSBydW50aW1lLXRhcmdldD8KLSAgICBJUnVudGltZSBydW50aW1lVGFyZ2V0ID0gZ2V0UnVudGltZVRhcmdldChwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgaWYgKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL0xvb2sgZm9yIGFuIGV4aXN0aW5nIHNlcnZlciB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJ1bnRpbWUtdGFyZ2V0Ci0gICAgICBJU2VydmVyW10gY29tcGF0aWJsZVNlcnZlcnMgPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXJzKHJ1bnRpbWVUYXJnZXQpOwotICAgICAgaWYgKGNvbXBhdGlibGVTZXJ2ZXJzIT1udWxsICYmIGNvbXBhdGlibGVTZXJ2ZXJzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb21wYXRpYmxlU2VydmVycywgdHlwZUlkKTsKLSAgICAgICAgaWYgKGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyLmdldElkKCk7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgCi0gICAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyIHdhcyBmb3VuZC4gQ2hvb3NlIGEgY29tcGF0aWJsZSBzZXJ2ZXIgdHlwZS4KLSAgICAgIAotICAgICAgLy9JZiB0aGUgcHJlZmVycmVkIHNlcnZlciBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHByb2plY3QncyBydW50aW1lIHRhcmdldCwgdXNlIGl0LgotICAgICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGN0eCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgICAgIFN0cmluZyBwRmFjdG9yeUlkID0gY3R4LmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUocEZhY3RvcnlJZCk7Ci0gICAgICBpZiAoc2VydmVyVHlwZSE9bnVsbCl7Ci0gICAgICAJU3RyaW5nIHNlcnZlclJ1bnRpbWVJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgCWlmIChzZXJ2ZXJSdW50aW1lSWQuZXF1YWxzKHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKSkKLSAgICAgIAl7Ci0gICAgICAJICBzZXJ2ZXJJbmZvWzBdID0gcEZhY3RvcnlJZDsKLSAgICAgIAkgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCX0KLSAgICAgIH0gICAgIAotICAgICAgCi0gICAgICAvL1RoZSBwcmVmZXJyZWQgc2VydmVyIHdhcyBub3QgY29tcGF0aWJsZS4gUGljayB0aGUgZmlyc3QgdmFsaWQgY29tcGF0aWJsZSBzZXJ2ZXIgdHlwZS4gICAgICAKLSAgICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUocnVudGltZVRhcmdldCwgdHlwZUlkKTsKLSAgICAgIGlmIChmYWN0b3J5SWQgIT0gbnVsbCkgc2VydmVySW5mb1swXSA9IGZhY3RvcnlJZDsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIGlmIChhc2tFeHRlbmRlcnMpCi0gICAgewotICAgICAgU2VydmVySW5mbyByZWNvbW1lbmRlZFNlcnZlckluZm8gPSBnZXRFeHRlbmRlclJlY29tbWVuZGF0aW9uKHByb2plY3QpOwotICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mbyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKSE9bnVsbCAmJiByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCkubGVuZ3RoKCk+MCkKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkhPW51bGwgJiYgcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKS5sZW5ndGgoKT4wKQotICAgICAgICAgIHNlcnZlckluZm9bMV0gPSByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpOyAKLQotICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9Vc2UgU2VydmVyVGFyZ2V0SGVscGVyIHRvIGdldCBhIGxpc3Qgb2YgdmFsaWQgcnVudGltZS10YXJnZXRzIGFuZCB1c2UgdGhlc2UgdG8gZGV0ZXJtaW5lIGEgZGVmYXVsdCBzZXJ2ZXIgdHlwZS4KLSAgICBTdHJpbmdbXSBwcm9qZWN0QXR0cnMgPSBTZXJ2ZXJUYXJnZXRIZWxwZXIuZ2V0UHJvamVjdFR5cGVBbmRKMkVFTGV2ZWwocHJvamVjdCk7Ci0gICAgTGlzdCBydW50aW1lcyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRTZXJ2ZXJUYXJnZXRzKHByb2plY3RBdHRyc1swXSwgcHJvamVjdEF0dHJzWzFdKTsKLSAgICBMaXN0IHN1cHBSdW50aW1lcyA9IGdldFJ1bnRpbWVUYXJnZXRzU3VwcG9ydGVkQnlXU1J1bnRpbWUocnVudGltZXMsIHJ1bnRpbWVJZCk7Ci0gICAgU3RyaW5nW10gY29tcGF0U2VydmVySW5mbyA9IGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcihzdXBwUnVudGltZXMsdHlwZUlkKTsgCi0gICAgaWYgKCBjb21wYXRTZXJ2ZXJJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGNvbXBhdFNlcnZlckluZm87Ci0gICAgfQotICAgIAotICAgIC8vTm8gZXhpc3RpbmcgY29tcGF0aWJsZSBzZXJ2ZXIsIHBpY2sgYSB0eXBlLgotICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUoc3VwcFJ1bnRpbWVzLCB0eXBlSWQpOwotICAgIGlmIChmYWN0b3J5SWQgIT0gbnVsbCkgc2VydmVySW5mb1swXSA9IGZhY3RvcnlJZDsgCi0gICAgcmV0dXJuIHNlcnZlckluZm87ICAgCi0KLSAgfQotICAKLSAgLyoKLSAgICogR2l2ZW4gYSBsaXN0IG9mIGV4aXN0aW5nIHNlcnZlcnMsIHRoaXMgcmV0dXJucyB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgc3VwcG9ydGVkCi0gICAqIGJ5IHRoZSBnaXZlbiBXZWIgc2VydmljZSB0eXBlIGlkLiAKLSAgICogUmV0dXJucyBudWxsIG9mIHRoZXJlIGFyZSBubyBzdXBwb3J0ZWQgc2VydmVycyBpbiB0aGUgYXJyYXkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoSVNlcnZlcltdIHNlcnZlcnMsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHdzY3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBpZiAoc2VydmVycyAhPSBudWxsICYmIHNlcnZlcnMubGVuZ3RoID4gMCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgc2VydmVyRmFjdG9yeUlkID0gc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgaWYgKHdzY3RSZWdpc3RyeS5pc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUodHlwZUlkLCBzZXJ2ZXJGYWN0b3J5SWQpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlcnNbaV07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gIAotICAKLSAgLyoKLSAgICogUmV0dXJucyB0aGUgZmFjdG9yeSBpZCBvZiBhIHNlcnZlciB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgV2ViIHNlcnZpY2UgdHlwZSBhbmQgdGhlIHJ1bnRpbWUgdGFyZ2V0LgotICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vbmUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUoSVJ1bnRpbWUgcnVudGltZVRhcmdldCwgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFN0cmluZyBydW50aW1lSWQgPSBydW50aW1lVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHdzY3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJGYWN0b3J5SWRzID0gd3NjdFJlZ2lzdHJ5LmdldFNlcnZlckZhY3RvcnlJZHNCeVR5cGUodHlwZUlkKTsKLSAgCi0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlckZhY3RvcnlJZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkc1tpXSk7Ci0gICAgICBpZiAoc2VydmVyVHlwZSE9bnVsbCApewotICAgICAgCVN0cmluZyBzZXJ2ZXJSdW50aW1lSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIAlpZiAoc2VydmVyUnVudGltZUlkLmVxdWFscyhydW50aW1lSWQpKQotICAgICAgCXsKLSAgICAgIAkJcmV0dXJuIHNlcnZlckZhY3RvcnlJZHNbaV07Ci0gICAgICAJfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoKLSAgICogUmV0dXJuIHRoZSBmYWN0b3J5IGlkIG9mIHRoZSBmaXJzdCBzZXJ2ZXIgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIHJ1bnRpbWVUYXJnZXRzIGFuZCB0eXBlSWQuCi0gICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm9uZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpcnN0U3VwcG9ydGVkU2VydmVyVHlwZShMaXN0IHJ1bnRpbWVUYXJnZXRzLCBTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHJ1bnRpbWVUYXJnZXRzLnNpemUoKTsgaSsrICkKLSAgICB7Ci0gICAgICBJUnVudGltZSBydW50aW1lVGFyZ2V0ID0gKElSdW50aW1lKXJ1bnRpbWVUYXJnZXRzLmdldChpKTsKLSAgICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUocnVudGltZVRhcmdldCwgdHlwZUlkKTsKLSAgICAgIGlmIChmYWN0b3J5SWQgIT0gbnVsbCAmJiBmYWN0b3J5SWQubGVuZ3RoKCk+MCkKLSAgICAgICAgcmV0dXJuIGZhY3RvcnlJZDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGdldFJ1bnRpbWVUYXJnZXQoU3RyaW5nIHByb2plY3ROYW1lKQotICB7Ci0gIAlpZiggcHJvamVjdE5hbWUgIT0gbnVsbCAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSA+IDAgKXsgLy8kTk9OLU5MUy0xJAotICAJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAJCWlmKCBwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSApewotICAJCQlyZXR1cm4gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5nZXRSdW50aW1lVGFyZ2V0KCk7IAotICAJCX0KLSAgCX0KLSAgCXJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIElTZXJ2ZXJbXSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXJzKElSdW50aW1lIHJ1bnRpbWUpCi0gIHsKLSAgICBpZiAocnVudGltZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLSAgICBpZiAoc2VydmVycz09bnVsbCB8fCBzZXJ2ZXJzLmxlbmd0aCE9MCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIEFycmF5TGlzdCBjb21wYXRpYmxlU2VydmVyc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIHJ1bnRpbWVJZCA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgICAgIFN0cmluZyBzZXJ2ZXJSdW50aW1lSWQgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIGlmIChzZXJ2ZXJSdW50aW1lSWQuZXF1YWxzKHJ1bnRpbWVJZCkpCi0gICAgICAgIGNvbXBhdGlibGVTZXJ2ZXJzTGlzdC5hZGQoc2VydmVyKTsKLSAgICAgIAotICAgIH0KLSAgICBpZiAoY29tcGF0aWJsZVNlcnZlcnNMaXN0LnNpemUoKTwxKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgCi0gICAgT2JqZWN0W10gY29tcGF0aWJsZVNlcnZlcnNBcnJheSA9IGNvbXBhdGlibGVTZXJ2ZXJzTGlzdC50b0FycmF5KCk7Ci0gICAgSVNlcnZlcltdIGNvbXBhdGlibGVTZXJ2ZXJzID0gbmV3IElTZXJ2ZXJbY29tcGF0aWJsZVNlcnZlcnNBcnJheS5sZW5ndGhdOwotICAgIGZvciAoaW50IGo9MDsgajxjb21wYXRpYmxlU2VydmVyc0FycmF5Lmxlbmd0aDsgaisrKQotICAgIHsKLSAgICAgIGNvbXBhdGlibGVTZXJ2ZXJzW2pdID0gKElTZXJ2ZXIpY29tcGF0aWJsZVNlcnZlcnNBcnJheVtqXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGNvbXBhdGlibGVTZXJ2ZXJzOwotICB9ICAKLSAgLyoKLSAgICogUmV0dXJucyB0aGUgZmFjdG9yeSBJZCBhbmQgaW5zdGFuY2UgaWQgb2YgdGhlIGZpcnN0IGV4aXRpbmcgc2VydmVyIGNvbXBhdGlibGUKLSAgICogd2l0aCB0aGUgcnVudGltZSB0YXJnZXRzIGFuZCB0eXBlSWQKLSAgICogUmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSBub25lLgotICAgKiBUaGUgaXRlbSBhdCBbMF0gaXMgdGhlIGZhY3RvcnkgaWQuCi0gICAqIFRoZSBpdGVtIGF0IFsxXSBpcyB0aGUgaW5zdGFuY2UgaWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcihMaXN0IHJ1bnRpbWVUYXJnZXRzLCBTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgU3RyaW5nW10gc2VydmVySW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgZm9yIChpbnQgaT0wOyBpPHJ1bnRpbWVUYXJnZXRzLnNpemUoKTsgaSsrICkKLSAgICB7Ci0gICAgICBJUnVudGltZSBydW50aW1lVGFyZ2V0ID0gKElSdW50aW1lKXJ1bnRpbWVUYXJnZXRzLmdldChpKTsKLSAgICAgIElTZXJ2ZXJbXSBleGlzdGluZ0NvbXBhdFNlcnZlcnMgPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXJzKHJ1bnRpbWVUYXJnZXQpOwotICAgICAgSVNlcnZlciBjb21wYXRTZXJ2ZXIgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihleGlzdGluZ0NvbXBhdFNlcnZlcnMsIHR5cGVJZCk7Ci0gICAgICBpZiAoY29tcGF0U2VydmVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNlcnZlckluZm9bMF0gPSBjb21wYXRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIHNlcnZlckluZm9bMV0gPSBjb21wYXRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFNlcnZlckluZm8gZ2V0RXh0ZW5kZXJSZWNvbW1lbmRhdGlvbihJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0Zvcigib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIiwgInNlcnZlckRlZmF1bHRlciIpOwotICAgIGZvciAoaW50IGk9MDsgaTxlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VydmVyRGVmYXVsdGVyT2JqZWN0ID0gZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgIGlmIChzZXJ2ZXJEZWZhdWx0ZXJPYmplY3QgaW5zdGFuY2VvZiBJU2VydmVyRGVmYXVsdGVyKQotICAgICAgewotICAgICAgICBJU2VydmVyRGVmYXVsdGVyIHNlcnZlckRlZmF1bHRlciA9IChJU2VydmVyRGVmYXVsdGVyKXNlcnZlckRlZmF1bHRlck9iamVjdDsKLSAgICAgICAgU2VydmVySW5mbyBzZXJ2ZXJJbmZvID0gc2VydmVyRGVmYXVsdGVyLnJlY29tbWVuZERlZmF1bHRTZXJ2ZXIocHJvamVjdCk7Ci0gICAgICAgIGlmIChzZXJ2ZXJJbmZvICE9IG51bGwpCi0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIExpc3QgZ2V0UnVudGltZVRhcmdldHNTdXBwb3J0ZWRCeVdTUnVudGltZShMaXN0IHJ1bnRpbWVUYXJnZXRzLCBTdHJpbmcgd2ViU2VydmljZVJ1bnRpbWVJZCkKLSAgewotICAgIEFycmF5TGlzdCBzdXBwUnVudGltZVRhcmdldHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lVGFyZ2V0cy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBJUnVudGltZSBydW50aW1lVGFyZ2V0ID0gKElSdW50aW1lKXJ1bnRpbWVUYXJnZXRzLmdldChpKTsKLSAgICAgIFN0cmluZyBydElkID0gcnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICBpZiAod3NjdFJlZy5kb2VzUnVudGltZVN1cHBvcnRTZXJ2ZXJUYXJnZXQocnRJZCwgd2ViU2VydmljZVJ1bnRpbWVJZCkpCi0gICAgICB7Ci0gICAgICAgIHN1cHBSdW50aW1lVGFyZ2V0cy5hZGQocnVudGltZVRhcmdldCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdXBwUnVudGltZVRhcmdldHM7Ci0gIH0KLQotICAvKioKLSAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGdldCBhIHNlcnZlciBmYWN0b3J5IGlkIGFuZCBpbnN0YW5jZSBpZCB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZ2l2ZW4gV2ViCi0gICAqIHNlcnZpY2UgcnVudGltZS4KLSAgICogQHBhcmFtIGNsaWVudFJ1bnRpbWVJZAotICAgKiBAcGFyYW0gajJlZVZlcnNpb24gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnQgdmFsdWVzIGluIEoyRUVWZXJzaW9uQ29uc3RhbnRzIGkuZS4gIjEyIiwgIjEzIiwgIjE0IgotICAgKiBAcmV0dXJuIFN0cmluZ1tdIGluZGV4IFswXSBjb250YWlucyBmYWN0b3J5SWQsIGluZGV4WzFdIGNvbnRhaW5zIGluc3RhbmNlIElkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJGcm9tQ2xpZW50UnVudGltZUFuZEoyRUUoU3RyaW5nIGNsaWVudFJ1bnRpbWVJZCwgU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgU3RyaW5nW10gc2VydmVySW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIAotICAgIC8vR2V0IGFsbCBwb3NzaWJsZSB2YWxpZCBzZXJ2ZXJzLiBJZiB0aGVyZSBhcmUgbm9uZSwgd2UgY2FuJ3QgZGVmYXVsdCBpbnRlbGxpZ2VudGx5LCByZXR1cm4gbnVsbC4KLSAgICBTdHJpbmdbXSB2YWxpZFNlcnZlckZhY3RvcnlJZHMgPSB3c2N0UmVnLmdldFNlcnZlckZhY3RvcnlJZHNCeVJ1bnRpbWVJZChjbGllbnRSdW50aW1lSWQpOwotICAgIGlmICh2YWxpZFNlcnZlckZhY3RvcnlJZHM9PW51bGwgfHwgdmFsaWRTZXJ2ZXJGYWN0b3J5SWRzLmxlbmd0aDwxKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgLy9HZXQgYWxsIGV4aXN0aW5nIHNlcnZlcnMKLSAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOyAvL0dldCBhbGwgZXhpc3Rpbmcgc2VydmVycwotICAgIAotICAgIC8vR2V0IHRoZSBwcmVmZXJyZWQgc2VydmVyLgotICAJUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gIAlTdHJpbmcgcHJlZlNlcnZlckZhY3RvcnlJZCA9IGNvbnRleHQuZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gIAkKLSAgICBib29sZWFuIHByZWZlcnJlZElzVmFsaWQgPSAgY29udGFpbnNTdHJpbmcodmFsaWRTZXJ2ZXJGYWN0b3J5SWRzLCBwcmVmU2VydmVyRmFjdG9yeUlkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1NlcnZlclZhbGlkKHByZWZTZXJ2ZXJGYWN0b3J5SWQsIGoyZWVWZXJzaW9uKTsKLSAgICBpZiAocHJlZmVycmVkSXNWYWxpZCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAgICAgICBTdHJpbmcgdGhpc0ZhY3RvcnlJZCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh0aGlzRmFjdG9yeUlkLmVxdWFscyhwcmVmU2VydmVyRmFjdG9yeUlkKSkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSBwcmVmU2VydmVyRmFjdG9yeUlkOwotICAgICAgICAgIHNlcnZlckluZm9bMV0gPSBzZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9FaXRoZXIgdGhlIHByZWZlcnJlZCBzZXJ2ZXIgd2FzIG5vdCB2YWxpZCBvciBpdCB3YXMgdmFsaWQgYnV0IGRvZXMgbm90IGV4aXN0LgotICAgIC8vQ2hlY2sgdGhlIGV4aXN0aW5nIHNlcnZlcnMgZm9yIHZhbGlkaXR5Ci0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAgICAgU3RyaW5nIHRoaXNGYWN0b3J5SWQgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAKLSAgICAgIGJvb2xlYW4gdGhpc1NlcnZlclZhbGlkID0gY29udGFpbnNTdHJpbmcodmFsaWRTZXJ2ZXJGYWN0b3J5SWRzLCB0aGlzRmFjdG9yeUlkKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTZXJ2ZXJWYWxpZCh0aGlzRmFjdG9yeUlkLCBqMmVlVmVyc2lvbik7Ci0gICAgICBpZiAodGhpc1NlcnZlclZhbGlkKQotICAgICAgewotICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gdGhpc0ZhY3RvcnlJZDsKLSAgICAgICAgc2VydmVySW5mb1sxXSA9IHNlcnZlci5nZXRJZCgpOwotICAgICAgICByZXR1cm4gc2VydmVySW5mbzsgICAgICAgIAotICAgICAgfQotICAgIH0gICAgICAgICAgCi0KLSAgICAvL05vbmUgb2YgdGhlIGV4aXN0aW5nIHNlcnZlcnMgaXMgdmFsaWQuIFBpY2sgdGhlIHByZWZlcnJlZCBvbmUgaWYgdmFsaWQuIE90aGVyd2lzZSwgcGljayB0aGUKLSAgICAvL2ZpcnN0IHZhbGlkIHNlcnZlciB0eXBlLgotICAgIGlmIChwcmVmZXJyZWRJc1ZhbGlkKQotICAgIHsKLSAgICAgIHNlcnZlckluZm9bMF0gPSBwcmVmU2VydmVyRmFjdG9yeUlkOwotICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8dmFsaWRTZXJ2ZXJGYWN0b3J5SWRzLmxlbmd0aDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0gaXNTZXJ2ZXJWYWxpZCh2YWxpZFNlcnZlckZhY3RvcnlJZHNbaV0sIGoyZWVWZXJzaW9uKTsKLSAgICAgICAgaWYgKGlzVmFsaWQpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gdmFsaWRTZXJ2ZXJGYWN0b3J5SWRzWzBdOwotICAgICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIC8vV2UgY2FuJ3QgZGV0ZXJtaW5lIGEgdmFsaWQgc2VydmVyIHNlbGVjdGlvbi4gUmV0dXJuIG51bGwuCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTZXJ2ZXJWYWxpZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgIGlmIChzZXJ2ZXJGYWN0b3J5SWQ9PW51bGwgfHwgc2VydmVyRmFjdG9yeUlkLmxlbmd0aCgpPT0wIHx8IGoyZWVWZXJzaW9uPT1udWxsIHx8IGoyZWVWZXJzaW9uLmxlbmd0aCgpPT0wKQotICAgICByZXR1cm4gdHJ1ZTsKLSAgIAotICAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFJ1bnRpbWVUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkKTsKLSAgIGlmIChydW50aW1lVGFyZ2V0SWQgPT0gbnVsbCB8fCBydW50aW1lVGFyZ2V0SWQubGVuZ3RoKCk9PTApCi0gICAgIHJldHVybiBmYWxzZTsKLSAgIFN0cmluZyB3ZWJNb2R1bGVUeXBlID0gSVNlcnZlclRhcmdldENvbnN0YW50cy5XRUJfVFlQRTsKLSAgIGJvb2xlYW4gaXNWYWxpZCA9IFNlcnZlclV0aWxzLmlzVGFyZ2V0VmFsaWRGb3JQcm9qZWN0VHlwZShydW50aW1lVGFyZ2V0SWQsIGoyZWVWZXJzaW9uLCB3ZWJNb2R1bGVUeXBlKTsKLSAgIHJldHVybiBpc1ZhbGlkOwotICB9Ci0gIC8qCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBhIGNvbnRhaW5zIGIsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNTdHJpbmcoU3RyaW5nW10gYSwgU3RyaW5nIGIpCi0gIHsKLSAgICBpZiAoYT09bnVsbCB8fCBhLmxlbmd0aDwwIHx8IGIgPT0gbnVsbCB8fCBiLmxlbmd0aCgpPT0wICkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBmb3IgKGludCBpPTA7IGk8YS5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgcyA9IGFbaV07Ci0gICAgICBpZiAocy5lcXVhbHMoYikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vRmluaXNoRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0ZpbmlzaEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MmRiZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vRmluaXNoRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBGaW5pc2hGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLSAgcHVibGljIEZpbmlzaEZyYWdtZW50KCkKLSAgewkKLQlhZGQobmV3IEZpbmlzaFRlc3RGcmFnbWVudCgpICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL1NlcnZlclNlbGVjdGlvblV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9TZXJ2ZXJTZWxlY3Rpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEwYWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL1NlcnZlclNlbGVjdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LklTZXJ2ZXJUYXJnZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LlNlcnZlclRhcmdldEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLklTZXJ2ZXJEZWZhdWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5TZXJ2ZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlclNlbGVjdGlvblV0aWxzCi17Ci0gIC8qCi0gICAqIFJldHVybnMgcmVhc29uYWJsZSBkZWZhdWx0cyBmb3Igc2VydmVyIGZhY3RvcnkgaWQgYW5kIGluc3RhbmNlIGlkIGJhc2VkIG9uIAotICAgKiBhbiBleGlzdGluZyBwcm9qZWN0Ci0gICAqIGluZGV4IFswXSBjb250YWlucyBmYWN0b3J5SWQsIGluZGV4WzFdIGNvbnRhaW5zIGluc3RhbmNlIElkLgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJJbmZvRnJvbUV4aXN0aW5nUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdHlwZUlkLCBib29sZWFuIGFza0V4dGVuZGVycykKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOyAvL3NlcnZlckluZnBbMF0gY29udGFpbnMgZmFjdG9yeUlkLCBzZXJ2ZXJJbmZvWzFdIGNvbnRhaW5zIGluc3RhbmNlIElkCi0KLSAgICAvLyBJZiB0aGUgcHJvamVjdCBoYXMgYmVlbiBhZGRlZCB0byBhbiBleGlzdGluZyBzZXJ2ZXIsIHBpY2sgdGhhdCBzZXJ2ZXIKLSAgICBJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbmZpZ3VyZWRTZXJ2ZXJzLCB0eXBlSWQgKTsKLSAgICBpZiAoZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICBzZXJ2ZXJJbmZvWzFdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvL0RvZXMgdGhlIHByb2plY3QgaGF2ZSBhIHJ1bnRpbWUtdGFyZ2V0PwotICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSBnZXRSdW50aW1lVGFyZ2V0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICBpZiAocnVudGltZVRhcmdldCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vTG9vayBmb3IgYW4gZXhpc3Rpbmcgc2VydmVyIHdoaWNoIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcnVudGltZS10YXJnZXQKLSAgICAgIElTZXJ2ZXJbXSBjb21wYXRpYmxlU2VydmVycyA9IGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcnMocnVudGltZVRhcmdldCk7Ci0gICAgICBpZiAoY29tcGF0aWJsZVNlcnZlcnMhPW51bGwgJiYgY29tcGF0aWJsZVNlcnZlcnMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbXBhdGlibGVTZXJ2ZXJzLCB0eXBlSWQpOwotICAgICAgICBpZiAoZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgICAgICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vTm8gZXhpc3RpbmcgY29tcGF0aWJsZSBzZXJ2ZXIgd2FzIGZvdW5kLiBDaG9vc2UgYSBjb21wYXRpYmxlIHNlcnZlciB0eXBlLgotICAgICAgCi0gICAgICAvL0lmIHRoZSBwcmVmZXJyZWQgc2VydmVyIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvamVjdCdzIHJ1bnRpbWUgdGFyZ2V0LCB1c2UgaXQuCi0gICAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY3R4ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgICAgU3RyaW5nIHBGYWN0b3J5SWQgPSBjdHguZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShwRmFjdG9yeUlkKTsKLSAgICAgIGlmIChzZXJ2ZXJUeXBlIT1udWxsKXsKLSAgICAgIAlTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAJaWYgKHNlcnZlclJ1bnRpbWVJZC5lcXVhbHMocnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpKQotICAgICAgCXsKLSAgICAgIAkgIHNlcnZlckluZm9bMF0gPSBwRmFjdG9yeUlkOwotICAgICAgCSAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAJfQotICAgICAgfSAgICAgCi0gICAgICAKLSAgICAgIC8vVGhlIHByZWZlcnJlZCBzZXJ2ZXIgd2FzIG5vdCBjb21wYXRpYmxlLiBQaWNrIHRoZSBmaXJzdCB2YWxpZCBjb21wYXRpYmxlIHNlcnZlciB0eXBlLgotICAgICAgU3RyaW5nIGZhY3RvcnlJZCA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyVHlwZShydW50aW1lVGFyZ2V0LCB0eXBlSWQpOwotICAgICAgaWYgKGZhY3RvcnlJZCAhPSBudWxsKSBzZXJ2ZXJJbmZvWzBdID0gZmFjdG9yeUlkOwotICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGFza0V4dGVuZGVycykKLSAgICB7Ci0gICAgICBTZXJ2ZXJJbmZvIHJlY29tbWVuZGVkU2VydmVySW5mbyA9IGdldEV4dGVuZGVyUmVjb21tZW5kYXRpb24ocHJvamVjdCk7Ci0gICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpIT1udWxsICYmIHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKS5sZW5ndGgoKT4wKQotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKSE9bnVsbCAmJiByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpLmxlbmd0aCgpPjApCi0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7IAotCi0gICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotCi0gICAgfQotICAgIAotICAgIC8vVXNlIFNlcnZlclRhcmdldEhlbHBlciB0byBnZXQgYSBsaXN0IG9mIHZhbGlkIHJ1bnRpbWUtdGFyZ2V0cyBhbmQgdXNlIHRoZXNlIHRvIGRldGVybWluZSBhIGRlZmF1bHQgc2VydmVyIHR5cGUuCi0gICAgU3RyaW5nW10gcHJvamVjdEF0dHJzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFByb2plY3RUeXBlQW5kSjJFRUxldmVsKHByb2plY3QpOwotICAgIExpc3QgcnVudGltZXMgPSBTZXJ2ZXJUYXJnZXRIZWxwZXIuZ2V0U2VydmVyVGFyZ2V0cyhwcm9qZWN0QXR0cnNbMF0sIHByb2plY3RBdHRyc1sxXSk7Ci0gICAgU3RyaW5nW10gY29tcGF0U2VydmVySW5mbyA9IGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcihydW50aW1lcyx0eXBlSWQpOyAKLSAgICBpZiAoIGNvbXBhdFNlcnZlckluZm8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gY29tcGF0U2VydmVySW5mbzsKLSAgICB9Ci0gICAgCi0gICAgLy9ObyBleGlzdGluZyBjb21wYXRpYmxlIHNlcnZlciwgcGljayBhIHR5cGUuCi0gICAgU3RyaW5nIGZhY3RvcnlJZCA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyVHlwZShydW50aW1lcywgdHlwZUlkKTsKLSAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwpIHNlcnZlckluZm9bMF0gPSBmYWN0b3J5SWQ7IAotICAgIHJldHVybiBzZXJ2ZXJJbmZvOyAgIAotICAgIAotICB9Ci0KLSAgLyoKLSAgICogUmV0dXJucyByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBzZXJ2ZXIgZmFjdG9yeSBpZCBhbmQgaW5zdGFuY2UgaWQgYmFzZWQgb24gCi0gICAqIGFuIGV4aXN0aW5nIHByb2plY3QKLSAgICogaW5kZXggWzBdIGNvbnRhaW5zIGZhY3RvcnlJZCwgaW5kZXhbMV0gY29udGFpbnMgaW5zdGFuY2UgSWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNlcnZlckluZm9Gcm9tRXhpc3RpbmdQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSWQsIFN0cmluZyBydW50aW1lSWQsIGJvb2xlYW4gYXNrRXh0ZW5kZXJzKQotICB7Ci0gICAgU3RyaW5nW10gc2VydmVySW5mbyA9IG5ldyBTdHJpbmdbMl07IC8vc2VydmVySW5mcFswXSBjb250YWlucyBmYWN0b3J5SWQsIHNlcnZlckluZm9bMV0gY29udGFpbnMgaW5zdGFuY2UgSWQKLQotICAgIC8vIElmIHRoZSBwcm9qZWN0IGhhcyBiZWVuIGFkZGVkIHRvIGFuIGV4aXN0aW5nIHNlcnZlciwgcGljayB0aGF0IHNlcnZlcgotICAgIElTZXJ2ZXJbXSBjb25maWd1cmVkU2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKLSAgICBJU2VydmVyIGZpcnN0U3VwcG9ydGVkU2VydmVyID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoY29uZmlndXJlZFNlcnZlcnMsIHR5cGVJZCApOwotICAgIGlmIChmaXJzdFN1cHBvcnRlZFNlcnZlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHNlcnZlckluZm9bMF0gPSBmaXJzdFN1cHBvcnRlZFNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIHNlcnZlckluZm9bMV0gPSBmaXJzdFN1cHBvcnRlZFNlcnZlci5nZXRJZCgpOwotICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAJCi0gICAgfQotICAgIAotICAgIAotICAgIC8vRG9lcyB0aGUgcHJvamVjdCBoYXZlIGEgcnVudGltZS10YXJnZXQ/Ci0gICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IGdldFJ1bnRpbWVUYXJnZXQocHJvamVjdC5nZXROYW1lKCkpOwotICAgIGlmIChydW50aW1lVGFyZ2V0ICE9IG51bGwpCi0gICAgewotICAgICAgLy9Mb29rIGZvciBhbiBleGlzdGluZyBzZXJ2ZXIgd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBydW50aW1lLXRhcmdldAotICAgICAgSVNlcnZlcltdIGNvbXBhdGlibGVTZXJ2ZXJzID0gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhydW50aW1lVGFyZ2V0KTsKLSAgICAgIGlmIChjb21wYXRpYmxlU2VydmVycyE9bnVsbCAmJiBjb21wYXRpYmxlU2VydmVycy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBJU2VydmVyIGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoY29tcGF0aWJsZVNlcnZlcnMsIHR5cGVJZCk7Ci0gICAgICAgIGlmIChmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVySW5mb1swXSA9IGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAgIHNlcnZlckluZm9bMV0gPSBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlci5nZXRJZCgpOwotICAgICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgICAgIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9ObyBleGlzdGluZyBjb21wYXRpYmxlIHNlcnZlciB3YXMgZm91bmQuIENob29zZSBhIGNvbXBhdGlibGUgc2VydmVyIHR5cGUuCi0gICAgICAKLSAgICAgIC8vSWYgdGhlIHByZWZlcnJlZCBzZXJ2ZXIgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm9qZWN0J3MgcnVudGltZSB0YXJnZXQsIHVzZSBpdC4KLSAgICAgIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjdHggPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICBTdHJpbmcgcEZhY3RvcnlJZCA9IGN0eC5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHBGYWN0b3J5SWQpOwotICAgICAgaWYgKHNlcnZlclR5cGUhPW51bGwpewotICAgICAgCVN0cmluZyBzZXJ2ZXJSdW50aW1lSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIAlpZiAoc2VydmVyUnVudGltZUlkLmVxdWFscyhydW50aW1lVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSkpCi0gICAgICAJewotICAgICAgCSAgc2VydmVySW5mb1swXSA9IHBGYWN0b3J5SWQ7Ci0gICAgICAJICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIAl9Ci0gICAgICB9ICAgICAKLSAgICAgIAotICAgICAgLy9UaGUgcHJlZmVycmVkIHNlcnZlciB3YXMgbm90IGNvbXBhdGlibGUuIFBpY2sgdGhlIGZpcnN0IHZhbGlkIGNvbXBhdGlibGUgc2VydmVyIHR5cGUuCi0gICAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHJ1bnRpbWVUYXJnZXQsIHR5cGVJZCk7Ci0gICAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwpIHNlcnZlckluZm9bMF0gPSBmYWN0b3J5SWQ7Ci0gICAgICByZXR1cm4gc2VydmVySW5mbzsKLQotICAgIH0KLSAgICAKLSAgICBpZiAoYXNrRXh0ZW5kZXJzKQotICAgIHsKLSAgICAgIFNlcnZlckluZm8gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvID0gZ2V0RXh0ZW5kZXJSZWNvbW1lbmRhdGlvbihwcm9qZWN0KTsKLSAgICAgIGlmIChyZWNvbW1lbmRlZFNlcnZlckluZm8hPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChyZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCkhPW51bGwgJiYgcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpLmxlbmd0aCgpPjApCi0gICAgICAgICAgc2VydmVySW5mb1swXSA9IHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChyZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpIT1udWxsICYmIHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkubGVuZ3RoKCk+MCkKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKTsgCi0KLSAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgCi0gICAgLy9Vc2UgU2VydmVyVGFyZ2V0SGVscGVyIHRvIGdldCBhIGxpc3Qgb2YgdmFsaWQgcnVudGltZS10YXJnZXRzIGFuZCB1c2UgdGhlc2UgdG8gZGV0ZXJtaW5lIGEgZGVmYXVsdCBzZXJ2ZXIgdHlwZS4KLSAgICBTdHJpbmdbXSBwcm9qZWN0QXR0cnMgPSBTZXJ2ZXJUYXJnZXRIZWxwZXIuZ2V0UHJvamVjdFR5cGVBbmRKMkVFTGV2ZWwocHJvamVjdCk7Ci0gICAgTGlzdCBydW50aW1lcyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRTZXJ2ZXJUYXJnZXRzKHByb2plY3RBdHRyc1swXSwgcHJvamVjdEF0dHJzWzFdKTsKLSAgICBMaXN0IHN1cHBSdW50aW1lcyA9IGdldFJ1bnRpbWVUYXJnZXRzU3VwcG9ydGVkQnlXU1J1bnRpbWUocnVudGltZXMsIHJ1bnRpbWVJZCk7Ci0gICAgU3RyaW5nW10gY29tcGF0U2VydmVySW5mbyA9IGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcihzdXBwUnVudGltZXMsdHlwZUlkKTsgCi0gICAgaWYgKCBjb21wYXRTZXJ2ZXJJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGNvbXBhdFNlcnZlckluZm87Ci0gICAgfQotICAgIAotICAgIC8vTm8gZXhpc3RpbmcgY29tcGF0aWJsZSBzZXJ2ZXIsIHBpY2sgYSB0eXBlLgotICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUoc3VwcFJ1bnRpbWVzLCB0eXBlSWQpOwotICAgIGlmIChmYWN0b3J5SWQgIT0gbnVsbCkgc2VydmVySW5mb1swXSA9IGZhY3RvcnlJZDsgCi0gICAgcmV0dXJuIHNlcnZlckluZm87ICAgCi0gICAgCi0gIH0KLSAgCi0gIC8qCi0gICAqIEdpdmVuIGEgbGlzdCBvZiBleGlzdGluZyBzZXJ2ZXJzLCB0aGlzIHJldHVybnMgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIHN1cHBvcnRlZAotICAgKiBieSB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgdHlwZSBpZC4gCi0gICAqIFJldHVybnMgbnVsbCBvZiB0aGVyZSBhcmUgbm8gc3VwcG9ydGVkIHNlcnZlcnMgaW4gdGhlIGFycmF5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKElTZXJ2ZXJbXSBzZXJ2ZXJzLCBTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgd3NzcnRSZWdpc3RyeSA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCA9IHNlcnZlcnNbaV0uZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIGlmICh3c3NydFJlZ2lzdHJ5LmlzU2VydmVyU3VwcG9ydGVkRm9yQ2hvc2VuVHlwZSh0eXBlSWQsIHNlcnZlckZhY3RvcnlJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc2VydmVyc1tpXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0gIAotICAvKgotICAgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IGlkIG9mIGEgc2VydmVyIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBXZWIgc2VydmljZSB0eXBlIGFuZCB0aGUgcnVudGltZSB0YXJnZXQuCi0gICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm9uZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpcnN0U3VwcG9ydGVkU2VydmVyVHlwZShJUnVudGltZSBydW50aW1lVGFyZ2V0LCBTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgU3RyaW5nIHJ1bnRpbWVJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZ1tdIHNlcnZlckZhY3RvcnlJZHMgPSB3c3NydFJlZ2lzdHJ5LmdldFNlcnZlckZhY3RvcnlJZHNCeVR5cGUodHlwZUlkKTsKLSAgICBmb3IgKGludCBpPTA7IGk8c2VydmVyRmFjdG9yeUlkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJGYWN0b3J5SWRzW2ldKTsKLSAgICAgIGlmIChzZXJ2ZXJUeXBlIT1udWxsKXsKLSAgICAgIAlTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAJaWYgKHNlcnZlclJ1bnRpbWVJZC5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgIAl7Ci0gICAgICAJCXJldHVybiBzZXJ2ZXJGYWN0b3J5SWRzW2ldOwotICAgICAgCX0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJldHVybiB0aGUgZmFjdG9yeSBpZCBvZiB0aGUgZmlyc3Qgc2VydmVyIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBydW50aW1lVGFyZ2V0cyBhbmQgdHlwZUlkLgotICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vbmUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUoTGlzdCBydW50aW1lVGFyZ2V0cywgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lVGFyZ2V0cy5zaXplKCk7IGkrKyApCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IChJUnVudGltZSlydW50aW1lVGFyZ2V0cy5nZXQoaSk7Ci0gICAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHJ1bnRpbWVUYXJnZXQsIHR5cGVJZCk7Ci0gICAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwgJiYgZmFjdG9yeUlkLmxlbmd0aCgpPjApCi0gICAgICAgIHJldHVybiBmYWN0b3J5SWQ7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJUnVudGltZSBnZXRSdW50aW1lVGFyZ2V0KFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgewotICAJaWYoIHByb2plY3ROYW1lICE9IG51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwICl7IC8vJE5PTi1OTFMtMSQKLSAgCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgCQlpZiggcHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgKXsKLSAgCQkJcmV0dXJuIFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOyAKLSAgCQl9Ci0gIAl9Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGdldEZpcnN0RXhpc3RpbmdTZXJ2ZXJGcm9tRmFjdG9yeUlkKFN0cmluZyBmYWN0b3J5SWQpCi0gIHsKLSAgCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gIAlpZiAoc2VydmVycz09bnVsbCB8fCBzZXJ2ZXJzLmxlbmd0aCE9MCkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gIAllbHNlCi0gIAl7Ci0gIAkgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAJICB7Ci0gIAkgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAJICAgIGlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkuZXF1YWxzKGZhY3RvcnlJZCkpCi0gIAkgICAgewotICAJICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgCSAgICB9Ci0gIAkgIH0KLSAgCX0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBJU2VydmVyW10gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhJUnVudGltZSBydW50aW1lKQotICB7Ci0gICAgaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgaWYgKHNlcnZlcnM9PW51bGwgfHwgc2VydmVycy5sZW5ndGghPTApCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBBcnJheUxpc3QgY29tcGF0aWJsZVNlcnZlcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBydW50aW1lSWQgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICBpZiAoc2VydmVyUnVudGltZUlkLmVxdWFscyhydW50aW1lSWQpKQotICAgICAgICBjb21wYXRpYmxlU2VydmVyc0xpc3QuYWRkKHNlcnZlcik7Ci0gICAgICAKLSAgICB9Ci0gICAgaWYgKGNvbXBhdGlibGVTZXJ2ZXJzTGlzdC5zaXplKCk8MSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIAotICAgIE9iamVjdFtdIGNvbXBhdGlibGVTZXJ2ZXJzQXJyYXkgPSBjb21wYXRpYmxlU2VydmVyc0xpc3QudG9BcnJheSgpOwotICAgIElTZXJ2ZXJbXSBjb21wYXRpYmxlU2VydmVycyA9IG5ldyBJU2VydmVyW2NvbXBhdGlibGVTZXJ2ZXJzQXJyYXkubGVuZ3RoXTsKLSAgICBmb3IgKGludCBqPTA7IGo8Y29tcGF0aWJsZVNlcnZlcnNBcnJheS5sZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBjb21wYXRpYmxlU2VydmVyc1tqXSA9IChJU2VydmVyKWNvbXBhdGlibGVTZXJ2ZXJzQXJyYXlbal07Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjb21wYXRpYmxlU2VydmVyczsKLSAgfSAgCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIGZhY3RvcnkgSWQgYW5kIGluc3RhbmNlIGlkIG9mIHRoZSBmaXJzdCBleGl0aW5nIHNlcnZlciBjb21wYXRpYmxlCi0gICAqIHdpdGggdGhlIHJ1bnRpbWUgdGFyZ2V0cyBhbmQgdHlwZUlkCi0gICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm9uZS4KLSAgICogVGhlIGl0ZW0gYXQgWzBdIGlzIHRoZSBmYWN0b3J5IGlkLgotICAgKiBUaGUgaXRlbSBhdCBbMV0gaXMgdGhlIGluc3RhbmNlIGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXIoTGlzdCBydW50aW1lVGFyZ2V0cywgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOwotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lVGFyZ2V0cy5zaXplKCk7IGkrKyApCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IChJUnVudGltZSlydW50aW1lVGFyZ2V0cy5nZXQoaSk7Ci0gICAgICBJU2VydmVyW10gZXhpc3RpbmdDb21wYXRTZXJ2ZXJzID0gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhydW50aW1lVGFyZ2V0KTsKLSAgICAgIElTZXJ2ZXIgY29tcGF0U2VydmVyID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoZXhpc3RpbmdDb21wYXRTZXJ2ZXJzLCB0eXBlSWQpOwotICAgICAgaWYgKGNvbXBhdFNlcnZlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gY29tcGF0U2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gY29tcGF0U2VydmVyLmdldElkKCk7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTZXJ2ZXJJbmZvIGdldEV4dGVuZGVyUmVjb21tZW5kYXRpb24oSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiIsICJzZXJ2ZXJEZWZhdWx0ZXIiKTsKLSAgICBmb3IgKGludCBpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgT2JqZWN0IHNlcnZlckRlZmF1bHRlck9iamVjdCA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICBpZiAoc2VydmVyRGVmYXVsdGVyT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZlckRlZmF1bHRlcikKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlckRlZmF1bHRlciBzZXJ2ZXJEZWZhdWx0ZXIgPSAoSVNlcnZlckRlZmF1bHRlcilzZXJ2ZXJEZWZhdWx0ZXJPYmplY3Q7Ci0gICAgICAgIFNlcnZlckluZm8gc2VydmVySW5mbyA9IHNlcnZlckRlZmF1bHRlci5yZWNvbW1lbmREZWZhdWx0U2VydmVyKHByb2plY3QpOwotICAgICAgICBpZiAoc2VydmVySW5mbyAhPSBudWxsKQotICAgICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBMaXN0IGdldFJ1bnRpbWVUYXJnZXRzU3VwcG9ydGVkQnlXU1J1bnRpbWUoTGlzdCBydW50aW1lVGFyZ2V0cywgU3RyaW5nIHdlYlNlcnZpY2VSdW50aW1lSWQpCi0gIHsKLSAgICBBcnJheUxpc3Qgc3VwcFJ1bnRpbWVUYXJnZXRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZVRhcmdldHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IChJUnVudGltZSlydW50aW1lVGFyZ2V0cy5nZXQoaSk7Ci0gICAgICBTdHJpbmcgcnRJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgaWYgKHdzc3J0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydElkLCB3ZWJTZXJ2aWNlUnVudGltZUlkKSk7Ci0gICAgICB7Ci0gICAgICAgIHN1cHBSdW50aW1lVGFyZ2V0cy5hZGQocnVudGltZVRhcmdldCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdXBwUnVudGltZVRhcmdldHM7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBnZXQgYSBzZXJ2ZXIgZmFjdG9yeSBpZCBhbmQgaW5zdGFuY2UgaWQgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGdpdmVuIFdlYgotICAgKiBzZXJ2aWNlIHJ1bnRpbWUuCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlUnVudGltZUlkCi0gICAqIEBwYXJhbSBqMmVlVmVyc2lvbiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludCB2YWx1ZXMgaW4gSjJFRVZlcnNpb25Db25zdGFudHMgaS5lLiAiMTIiLCAiMTMiLCAiMTQiCi0gICAqIEByZXR1cm4gU3RyaW5nW10gaW5kZXggWzBdIGNvbnRhaW5zIGZhY3RvcnlJZCwgaW5kZXhbMV0gY29udGFpbnMgaW5zdGFuY2UgSWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNlcnZlckZyb21XZWJTZXJ2Y2VSdW50aW1lQW5kSjJFRShTdHJpbmcgd2ViU2VydmljZVJ1bnRpbWVJZCwgU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgU3RyaW5nW10gc2VydmVySW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgd3NzcnRSZWcgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIAotICAgIC8vR2V0IGFsbCBwb3NzaWJsZSB2YWxpZCBzZXJ2ZXJzLiBJZiB0aGVyZSBhcmUgbm9uZSwgd2UgY2FuJ3QgZGVmYXVsdCBpbnRlbGxpZ2VudGx5LCByZXR1cm4gbnVsbC4KLSAgICBTdHJpbmdbXSB2YWxpZFNlcnZlckZhY3RvcnlJZHMgPSB3c3NydFJlZy5nZXRTZXJ2ZXJGYWN0b3J5SURCeVJ1bnRpbWVJRCh3ZWJTZXJ2aWNlUnVudGltZUlkKTsKLSAgICBpZiAodmFsaWRTZXJ2ZXJGYWN0b3J5SWRzPT1udWxsIHx8IHZhbGlkU2VydmVyRmFjdG9yeUlkcy5sZW5ndGg8MSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIC8vR2V0IGFsbCBleGlzdGluZyBzZXJ2ZXJzCi0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsgLy9HZXQgYWxsIGV4aXN0aW5nIHNlcnZlcnMKLSAgICAKLSAgICAvL0dldCB0aGUgcHJlZmVycmVkIHNlcnZlci4KLSAgCVBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAJU3RyaW5nIHByZWZTZXJ2ZXJGYWN0b3J5SWQgPSBjb250ZXh0LmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAJCi0gICAgYm9vbGVhbiBwcmVmZXJyZWRJc1ZhbGlkID0gIGNvbnRhaW5zU3RyaW5nKHZhbGlkU2VydmVyRmFjdG9yeUlkcywgcHJlZlNlcnZlckZhY3RvcnlJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTZXJ2ZXJWYWxpZChwcmVmU2VydmVyRmFjdG9yeUlkLCBqMmVlVmVyc2lvbik7Ci0gICAgaWYgKHByZWZlcnJlZElzVmFsaWQpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgICAgICAgU3RyaW5nIHRoaXNGYWN0b3J5SWQgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAodGhpc0ZhY3RvcnlJZC5lcXVhbHMocHJlZlNlcnZlckZhY3RvcnlJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gcHJlZlNlcnZlckZhY3RvcnlJZDsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gc2VydmVyLmdldElkKCk7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIC8vRWl0aGVyIHRoZSBwcmVmZXJyZWQgc2VydmVyIHdhcyBub3QgdmFsaWQgb3IgaXQgd2FzIHZhbGlkIGJ1dCBkb2VzIG5vdCBleGlzdC4KLSAgICAvL0NoZWNrIHRoZSBleGlzdGluZyBzZXJ2ZXJzIGZvciB2YWxpZGl0eQotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgICAgIFN0cmluZyB0aGlzRmFjdG9yeUlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgCi0gICAgICBib29sZWFuIHRoaXNTZXJ2ZXJWYWxpZCA9IGNvbnRhaW5zU3RyaW5nKHZhbGlkU2VydmVyRmFjdG9yeUlkcywgdGhpc0ZhY3RvcnlJZCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzU2VydmVyVmFsaWQodGhpc0ZhY3RvcnlJZCwgajJlZVZlcnNpb24pOwotICAgICAgaWYgKHRoaXNTZXJ2ZXJWYWxpZCkKLSAgICAgIHsKLSAgICAgICAgc2VydmVySW5mb1swXSA9IHRoaXNGYWN0b3J5SWQ7Ci0gICAgICAgIHNlcnZlckluZm9bMV0gPSBzZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgICAgcmV0dXJuIHNlcnZlckluZm87ICAgICAgICAKLSAgICAgIH0KLSAgICB9ICAgICAgICAgIAotCi0gICAgLy9Ob25lIG9mIHRoZSBleGlzdGluZyBzZXJ2ZXJzIGlzIHZhbGlkLiBQaWNrIHRoZSBwcmVmZXJyZWQgb25lIGlmIHZhbGlkLiBPdGhlcndpc2UsIHBpY2sgdGhlCi0gICAgLy9maXJzdCB2YWxpZCBzZXJ2ZXIgdHlwZS4KLSAgICBpZiAocHJlZmVycmVkSXNWYWxpZCkKLSAgICB7Ci0gICAgICBzZXJ2ZXJJbmZvWzBdID0gcHJlZlNlcnZlckZhY3RvcnlJZDsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPHZhbGlkU2VydmVyRmFjdG9yeUlkcy5sZW5ndGg7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGlzU2VydmVyVmFsaWQodmFsaWRTZXJ2ZXJGYWN0b3J5SWRzW2ldLCBqMmVlVmVyc2lvbik7Ci0gICAgICAgIGlmIChpc1ZhbGlkKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVySW5mb1swXSA9IHZhbGlkU2VydmVyRmFjdG9yeUlkc1swXTsKLSAgICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgICAgfQotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL1dlIGNhbid0IGRldGVybWluZSBhIHZhbGlkIHNlcnZlciBzZWxlY3Rpb24uIFJldHVybiBudWxsLgotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2VydmVyVmFsaWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICBpZiAoc2VydmVyRmFjdG9yeUlkPT1udWxsIHx8IHNlcnZlckZhY3RvcnlJZC5sZW5ndGgoKT09MCB8fCBqMmVlVmVyc2lvbj09bnVsbCB8fCBqMmVlVmVyc2lvbi5sZW5ndGgoKT09MCkKLSAgICAgcmV0dXJuIHRydWU7Ci0gICAKLSAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZCk7Ci0gICBpZiAocnVudGltZVRhcmdldElkID09IG51bGwgfHwgcnVudGltZVRhcmdldElkLmxlbmd0aCgpPT0wKQotICAgICByZXR1cm4gZmFsc2U7Ci0gICBTdHJpbmcgd2ViTW9kdWxlVHlwZSA9IElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuV0VCX1RZUEU7Ci0gICBib29sZWFuIGlzVmFsaWQgPSBTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yUHJvamVjdFR5cGUocnVudGltZVRhcmdldElkLCBqMmVlVmVyc2lvbiwgd2ViTW9kdWxlVHlwZSk7Ci0gICByZXR1cm4gaXNWYWxpZDsKLSAgfQotICAvKgotICAgKiBSZXR1cm5zIHRydWUgaXMgYSBjb250YWlucyBiLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zU3RyaW5nKFN0cmluZ1tdIGEsIFN0cmluZyBiKQotICB7Ci0gICAgaWYgKGE9PW51bGwgfHwgYS5sZW5ndGg8MCB8fCBiID09IG51bGwgfHwgYi5sZW5ndGgoKT09MCApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZm9yIChpbnQgaT0wOyBpPGEubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHMgPSBhW2ldOwotICAgICAgaWYgKHMuZXF1YWxzKGIpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9WYWxpZGF0aW9uVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL1ZhbGlkYXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODBiNDMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL1ZhbGlkYXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLkNsaWVudFByb2plY3RUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVXRpbHMKLXsKLSAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uVXRpbHMoKQotICB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQ7IC8vIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlUHJvamVjdFRhcmdldEFuZEoyRUUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyTmFtZSwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIGoyZWVMZXZlbCkKLSAgewotICAgIElQcm9qZWN0IHAgPSBGaWxlUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JSVByb2plY3QgZWFyUCA9IG51bGw7Ci0JaWYgKGVhck5hbWUhPW51bGwgJiYgIWVhck5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiIikpIHsKLSAgICAJZWFyUCA9IEZpbGVSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGVhck5hbWUpOwotCX0KLSAgICBTdGF0dXMgdGFyZ2V0U3RhdHVzID0gZG9lc1Byb2plY3RUYXJnZXRNYXRjaFNlcnZlclR5cGUocCwgc2VydmVyRmFjdG9yeUlkKTsKLSAgICBpZiAoZWFyUCE9bnVsbCAmJiB0YXJnZXRTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIC8vY2hlY2sgdGhlIEVBUiAgICAgIAotICAgICAgU3RhdHVzIGVhclRhcmdldFN0YXR1cyA9IGRvZXNQcm9qZWN0VGFyZ2V0TWF0Y2hTZXJ2ZXJUeXBlKGVhclAsIHNlcnZlckZhY3RvcnlJZCk7Ci0gICAgICBpZihlYXJUYXJnZXRTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgewotICAgICAgICByZXR1cm4gZWFyVGFyZ2V0U3RhdHVzOwotICAgICAgfSAgICAgICAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHRhcmdldFN0YXR1czsKLSAgICB9Ci0gICAgCi0KLSAgICAvL1ZhbGlkYXRlIHNlcnZpY2Ugc2lkZSBKMkVFIGxldmVsICAgIAotICAgIFN0YXR1cyBqMmVlU3RhdHVzID0gZG9lc1Byb2plY3RNYXRjaEoyRUVMZXZlbChwLCBqMmVlTGV2ZWwpOwotICAgIGlmKGVhclAhPW51bGwgJiYgajJlZVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuT0spCi0gICAgewotICAgICAgU3RhdHVzIGVhckoyRUVTdGF0dXMgPSBkb2VzUHJvamVjdE1hdGNoSjJFRUxldmVsKGVhclAsIGoyZWVMZXZlbCk7Ci0gICAgICBpZihlYXJKMkVFU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGVhckoyRUVTdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gajJlZVN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwcml2YXRlIFN0YXR1cyBkb2VzUHJvamVjdFRhcmdldE1hdGNoU2VydmVyVHlwZShJUHJvamVjdCBwLCBTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gICAgaWYgKHAhPW51bGwgJiYgcC5leGlzdHMoKSkKLSAgICB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUC5nZXROYW1lID0gIitwLmdldE5hbWUoKSk7Ci0gICAgICBJUnVudGltZSBwcm9qZWN0VGFyZ2V0ID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0UnVudGltZVRhcmdldChwLmdldE5hbWUoKSk7Ci0gICAgICBpZiAocHJvamVjdFRhcmdldCE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3RUYXJnZXRJZCA9IHByb2plY3RUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgICBTdHJpbmcgc2VydmVyVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZCk7Ci0gICAgICAgIGlmIChzZXJ2ZXJUYXJnZXRJZCE9bnVsbCAmJiBzZXJ2ZXJUYXJnZXRJZC5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoIXByb2plY3RUYXJnZXRJZC5lcXVhbHMoc2VydmVyVGFyZ2V0SWQpKQotICAgICAgICAgIHsgCi0gICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfU0VSVkVSX1RBUkdFVF9NSVNNQVRDSCIsbmV3IFN0cmluZ1tde3AuZ2V0TmFtZSgpfSksU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOyAgICAgICAgCi0gIH0KLQotICBwcml2YXRlIFN0YXR1cyBkb2VzUHJvamVjdE1hdGNoSjJFRUxldmVsKElQcm9qZWN0IHAsIFN0cmluZyBqMmVlTGV2ZWwpCi0gIHsKLQlTdHJ1Y3R1cmVFZGl0IG1jID0gbnVsbDsKLSAgICB0cnkgewotCQlpZiAocCE9bnVsbCAmJiBwLmV4aXN0cygpKQotCQl7Ci0JCSAgbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHApOwotCQkgIFdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCSAgCi0JCQkKLQkJICBpbnQgcHJvamVjdEoyRUVMZXZlbCA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihwKTsKLQkJICBpZiAocHJvamVjdEoyRUVMZXZlbCE9LTEpCi0JCSAgewotCQkgICAgU3RyaW5nIHByb2plY3RKMkVFTGV2ZWxTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihwcm9qZWN0SjJFRUxldmVsKTsKLQkJICAgIGlmIChqMmVlTGV2ZWwhPW51bGwgJiYgajJlZUxldmVsLmxlbmd0aCgpPjApCi0JCSAgICB7Ci0JCSAgICAgIGlmICghcHJvamVjdEoyRUVMZXZlbFN0cmluZy5lcXVhbHMoajJlZUxldmVsKSkKLQkJICAgICAgewotCQkgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19KMkVFX01JU01BVENIIixuZXcgU3RyaW5nW117cC5nZXROYW1lKCl9KSwgU3RhdHVzLkVSUk9SKTsKLQkJICAgICAgfQotCQkgICAgfQotCQkgIH0KLQkJfQotCX0gZmluYWxseSB7Ci0JCWlmIChtYyAhPSBudWxsKQotCQkJbWMuZGlzcG9zZSgpOwotCX0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7ICAgICAgICAKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyB2YWxpZGF0ZVByb2plY3RUeXBlKFN0cmluZyBwcm9qZWN0TmFtZSwgU2VsZWN0aW9uTGlzdENob2ljZXMgcnVudGltZTJDbGllbnRUeXBlcykKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBJUHJvamVjdCBwID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKS50cmFuc2Zvcm0ocHJvamVjdE5hbWUpKTsKLSAgICBpZiAocD09bnVsbCB8fCAhcC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICAvL1Byb2plY3QgZG9lcyBub3QgZXhpc3Qgd2hpY2ggbWVhbnMgYSBuZXcgcHJvamVjdCBvZiB0aGUgY29ycmVjdCB0eXBlIHdpbGwgYmUgY3JlYXRlcwotICAgICAgLy9XZSdyZSBkb25lLiBBbGwgaXMgZ29vZC4KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgICAgCi0gICAgLy9JZiB0aGUgcHJvamVjdCBleGlzdHMsIHdlIHNob3VsZCBzZWUgaXQgaW4gdGhlIHByb2plY3QgbGlzdCBmb3IgdGhlIHNlbGVjdGVkIGNsaWVudAotICAgIC8vcHJvamVjdCB0eXBlLgotICAgIFN0cmluZ1tdIHByb2plY3ROYW1lcyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXMuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChwcm9qZWN0TmFtZS5lcXVhbHMocHJvamVjdE5hbWVzW2ldKSkKLSAgICAgIHsKLSAgICAgICAgLy9Gb3VuZCB0aGUgcHJvamVjdC4gQWxsIGlzIGdvb2QuCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vRGlkbid0IGZpbmQgdGhlIHByb2plY3QuIFJldHVybiBhbiBlcnJvci4KLSAgICAvL0dldCB0aGUgbGFiZWwgZm9yIHRoZSBjbGllbnQgdHlwZSBpZAotICAgIFN0cmluZyBjbGllbnRUeXBlTGFiZWwgPSBnZXRDbGllbnRUeXBlTGFiZWwocnVudGltZTJDbGllbnRUeXBlcy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCkpOwotICAgIFN0cmluZyBtZXNzYWdlID0gbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1dST05HX0NMSUVOVF9QUk9KRUNUX1RZUEUiLG5ldyBTdHJpbmdbXXtwcm9qZWN0TmFtZSwgY2xpZW50VHlwZUxhYmVsfSk7Ci0gICAgU3RhdHVzIGVTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1lc3NhZ2UsU3RhdHVzLkVSUk9SKTsKLSAgICByZXR1cm4gZVN0YXR1czsKLSAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xpZW50VHlwZUxhYmVsKCBTdHJpbmcgdHlwZSApCi0gIHsKLSAgICBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ICAgICAgICAgPSBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICBjbGllbnRUeXBlTGFiZWwgID0gbnVsbDsKLSAgICAKLSAgICBjbGllbnRUeXBlTGFiZWwgPSByZWdpc3RyeS5nZXRFbGVtZW50QnlJZCh0eXBlKS5nZXRBdHRyaWJ1dGUoImxhYmVsIik7Ci0gICAgCi0gICAgcmV0dXJuIGNsaWVudFR5cGVMYWJlbDsKLSAgfSAgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBwLCBTdHJpbmcgd3NkbFVSTCwgV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyKQotICB7Ci0gICAgaWYgKHA9PW51bGwgfHwgd3NkbFVSTD09bnVsbCB8fCB3c2RsVVJMLmxlbmd0aCgpPT0wIHx8IHBhcnNlcj09bnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBJUmVzb3VyY2Ugd3NYTUwgPSBnZXRXZWJTZXJ2Y2VzWE1MKHApOwotICAgIGlmICh3c1hNTD09bnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAKLSAgICAgIC8vTWFrZSBhIGxpc3Qgb2YgYWxsIHRoZSB3c2RsLXBvcnQncyBpbiB3ZWJzZXJ2aWNlcy54bWwKLSAgICBXZWJTZXJ2aWNlc01hbmFnZXIgd3NtID0gbmV3IFdlYlNlcnZpY2VzTWFuYWdlcigpOwotICAgIFdlYlNlcnZpY2VFZGl0TW9kZWwgd3NFZGl0TW9kZWwgPSB3c20uZ2V0V1NFZGl0TW9kZWwocCk7Ci0gICAgV2ViU2VydmljZXMgd3MgPSB3c0VkaXRNb2RlbC5nZXRXZWJTZXJ2aWNlcygpOwotICAgIEl0ZXJhdG9yIHdzRGVzY3MgPSB3cy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICBBcnJheUxpc3Qgd3NkbFBvcnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHdoaWxlKHdzRGVzY3MuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3c0Rlc2MgPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKXdzRGVzY3MubmV4dCgpOwotICAgICAgSXRlcmF0b3IgcGNzID0gd3NEZXNjLmdldFBvcnRDb21wb25lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKHBjcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFBvcnRDb21wb25lbnQgcGMgPSAoUG9ydENvbXBvbmVudClwY3MubmV4dCgpOwotICAgICAgICBXU0RMUG9ydCB3c2RsUG9ydCA9IHBjLmdldFdzZGxQb3J0KCk7Ci0gICAgICAgIHdzZGxQb3J0TGlzdC5hZGQobmV3IFF1YWxpZmllZE5hbWUod3NkbFBvcnQuZ2V0TmFtZXNwYWNlVVJJKCksIHdzZGxQb3J0LmdldExvY2FsUGFydCgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIEFycmF5TGlzdCBwb3J0TGlzdCA9IGdldFBvcnROYW1lc0Zyb21Xc2RsKHdzZGxVUkwsIHBhcnNlcik7Ci0KLSAgICAvL0lmIGFueSBvZiB0aGUgUXVhbGlmaWVkTmFtZXMgaW4gcG9ydExpc3QgZXF1YWxzIGFueSBvZiB0aGUgUXVhbGlmaWVkTmFtZXMKLSAgICAvL2luIHdzZGxQb3J0TGlzdCwgdGhpcyBpcyB0aGUgc2VydmljZSBwcm9qZWN0LiBSZXR1cm4gdHJ1ZS4KLSAgICBPYmplY3RbXSBwb3J0cyA9IHBvcnRMaXN0LnRvQXJyYXkoKTsKLSAgICBPYmplY3RbXSB3c2RsUG9ydHMgPSB3c2RsUG9ydExpc3QudG9BcnJheSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9ydHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgUXVhbGlmaWVkTmFtZSBwb3J0TmFtZSA9IChRdWFsaWZpZWROYW1lKSBwb3J0c1tpXTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgd3NkbFBvcnRzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBRdWFsaWZpZWROYW1lIHdzZGxQb3J0TmFtZSA9IChRdWFsaWZpZWROYW1lKSB3c2RsUG9ydHNbal07Ci0gICAgICAgIGlmIChwb3J0TmFtZS5lcXVhbHMod3NkbFBvcnROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKgotICAgKiBAZGVwcmVjYXRlZAotICAgKiAKLSAgICovCi0gIHByaXZhdGUgSVJlc291cmNlIGdldFdlYlNlcnZjZXNYTUwoSVByb2plY3QgcCkKLSAgewotCSAgLy8gCi0vLyAgICBKMkVFTmF0dXJlIG5hdHVyZSA9IChKMkVFTmF0dXJlKSBKMkVFTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lKHApOwotLy8gICAgaWYgKG5hdHVyZSA9PSBudWxsKQotLy8gICAgICByZXR1cm4gbnVsbDsKLQotLy8gICAgSVJlc291cmNlIG1vZHVsZVJvb3QgPSBuYXR1cmUuZ2V0TW9kdWxlU2VydmVyUm9vdCgpOwotLy8JSVJlc291cmNlIG1vZHVsZVJvb3QgPSBSZXNvdXJjZVV0aWxzLmdldFdlYk1vZHVsZVNlcnZlclJvb3QocCk7Ci0JSVJlc291cmNlIG1vZHVsZVJvb3QgPSBKMkVFVXRpbHMuZ2V0Rmlyc3RXZWJDb250ZW50Q29udGFpbmVyKHApOyAgCi0gICAgaWYgKCEobW9kdWxlUm9vdCBpbnN0YW5jZW9mIElDb250YWluZXIpKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBJUmVzb3VyY2Ugd2ViU2VydmljZXNYTUw9bnVsbDsKLS8vICAgIGlmIChuYXR1cmUgaW5zdGFuY2VvZiBKMkVFV2ViTmF0dXJlUnVudGltZSkKLQlpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocCkpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHdzUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIHdzUGF0aC5hcHBlbmQoIldFQi1JTkYvIik7Ci0gICAgICB3c1BhdGguYXBwZW5kKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9ERF9TSE9SVF9OQU1FKTsKLSAgICAgIHdlYlNlcnZpY2VzWE1MID0gKChJQ29udGFpbmVyKW1vZHVsZVJvb3QpLmZpbmRNZW1iZXIod3NQYXRoLnRvU3RyaW5nKCkpOyAKLSAgICB9Ci0gICAgZWxzZSAvL011c3QgYmUgYW4gQXBwbGljYXRpb24gQ2xpZW50IE1vZHVsZSBvciBhbiBFSkIgTW9kdWxlCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHdzUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIHdzUGF0aC5hcHBlbmQoIk1FVEEtSU5GLyIpOwotICAgICAgd3NQYXRoLmFwcGVuZChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSk7Ci0gICAgICB3ZWJTZXJ2aWNlc1hNTCA9ICgoSUNvbnRhaW5lciltb2R1bGVSb290KS5maW5kTWVtYmVyKHdzUGF0aC50b1N0cmluZygpKTsgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gd2ViU2VydmljZXNYTUw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgQXJyYXlMaXN0IGdldFBvcnROYW1lc0Zyb21Xc2RsKFN0cmluZyB3c2RsVVJMLCBXZWJTZXJ2aWNlc1BhcnNlciBwYXJzZXIpCi0gIHsKLSAgCUFycmF5TGlzdCBwb3J0TmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAlEZWZpbml0aW9uIGRlZiA9IHBhcnNlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICBNYXAgc2VydmljZXMgPSBkZWYuZ2V0U2VydmljZXMoKTsKLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHNlcnZpY2UgPSAoU2VydmljZSlpdC5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gc2VydmljZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgTWFwIHBvcnRzID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdDIgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgIAlQb3J0IHBvcnQgPSAoUG9ydClpdDIubmV4dCgpOwotICAgICAgCXBvcnROYW1lTGlzdC5hZGQobmV3IFF1YWxpZmllZE5hbWUobmFtZXNwYWNlLCBwb3J0LmdldE5hbWUoKSkpOwotICAgICAgfQotICAgIH0gICAgICAgIAotICAJCi0gIAlyZXR1cm4gcG9ydE5hbWVMaXN0OwotICAJCi0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgUXVhbGlmaWVkTmFtZQotICB7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQotICAgIFN0cmluZyBsb2NhbFBhcnQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0gICAgICogQHBhcmFtIGxvY2FsUGFydAotICAgICAqLwotICAgIHB1YmxpYyBRdWFsaWZpZWROYW1lKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbFBhcnQpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgICAgdGhpcy5sb2NhbFBhcnQgPSBsb2NhbFBhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhbFBhcnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbFBhcnQoKQotICAgIHsKLSAgICAgIHJldHVybiBsb2NhbFBhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxvY2FsUGFydAotICAgICAqICAgICAgICAgIFRoZSBsb2NhbFBhcnQgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsUGFydChTdHJpbmcgbG9jYWxQYXJ0KQotICAgIHsKLSAgICAgIHRoaXMubG9jYWxQYXJ0ID0gbG9jYWxQYXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZXNwYWNlVVJJLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmFtZXNwYWNlVVJJOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLSAgICAgKiAgICAgICAgICBUaGUgbmFtZXNwYWNlVVJJIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgICB7Ci0gICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoUXVhbGlmaWVkTmFtZSBxbikKLSAgICB7Ci0gICAgICByZXR1cm4gKHFuLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmIHFuLmdldExvY2FsUGFydCgpCi0gICAgICAgICAgLmVxdWFscyhsb2NhbFBhcnQpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzU3NDQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIHBsdWdpbi4KLSogPHA+Ci0qIFRoaXMgcGx1Z2luIGNvbnRhaW5zIHRoZSBncmFwaGljIHVzZXIgaW50ZXJmYWNlIHRvIHRoZQotKiBXZWIgU2VydmljZXMgcnVudGltZSBmb3VuZCBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbiBpbiBwbHVnaW4ueG1sLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCi0gIC8qKgotICAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4gaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IHNlcnZlclJ1bnRpbWVDb250ZXh0XzsKLSAgcHJpdmF0ZSBMb2cgbG9nXzsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4gKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgaW5zdGFuY2VfID0gdGhpczsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4gRXF1aXZhbGVudCB0byBjYWxsaW5nCi0gICogKFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuanN0LndzLnVpIik7Ci0gICogQHJldHVybiBUaGUgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4gc2luZ2xldG9uLgotICAqLwotICBzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luIGdldEluc3RhbmNlICgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvciB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLgotICAqIEBwYXJhbSBrZXkgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuCi0gICogVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4gbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIKLSAgKiB3aGVyZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlCi0gICogZm9ybTogIktFWSA9IHZhbHVlIi4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXkgKQotICB7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5wbHVnaW4iLCBpbnN0YW5jZV8gKTsKLSAgICAKLSAgICBpZigga2V5LnN0YXJ0c1dpdGgoIiUiKSkKLSAgICB7Ci0gICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKCAxLCBrZXkubGVuZ3RoKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG1zZ1V0aWxzLmdldE1lc3NhZ2Uoa2V5KTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0gICogU3Vic3RpdHV0aW9uIHNlcXVlbmNlcyBpbiB0aGUgbWVzc2FnZSBzdHJpbmcKLSAgKiBhcmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbiBvYmplY3RzICh3aGljaAotICAqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBmb3IKLSAgKiBmdXJ0aGVyIGRldGFpbHMgb24gc3Vic3RpdHV0aW9uLgotICAqIEBwYXJhbSBrZXkgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuCi0gICogVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4gbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIKLSAgKiB3aGVyZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlCi0gICogZm9ybTogIktFWSA9IHZhbHVlIi4KLSAgKiBAcGFyYW0gYXJncyBUaGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UKLSAgKiBhcyByZXF1aXJlZCBieSB0aGUgbWVzc2FnZSBpbiBwbHVnaW4ucHJvcGVydGllcyBhbmQKLSAgKiBieSB0aGUgcnVsZXMgb2YgY2xhc3MgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzICkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksYXJncyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZQotICAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAgKiBAcmV0dXJuIEFuIGltYWdlIGRlc2NyaXB0b3IsIHBvc3NpYmx5IG51bGwuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvciAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCBpbnN0YWxsVVJMID0gaW5zdGFuY2VfLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7OwotICAgICAgVVJMIGltYWdlVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLG5hbWUpOwotICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpIHsKLSAgICByZXR1cm4gUGxhdGZvcm0uZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbih0aGlzKS50b09TU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbigpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSkuZ2V0RmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIAotICBwdWJsaWMgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCkgCi0JewotCSAgaWYgKHNlcnZlclJ1bnRpbWVDb250ZXh0XyA9PSBudWxsKQotCSAgCXsKLQkgIAkJc2VydmVyUnVudGltZUNvbnRleHRfID0gbmV3IFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotCSAgCQlzZXJ2ZXJSdW50aW1lQ29udGV4dF8ubG9hZCgpOwotCSAgCX0KLQkgIHJldHVybiBzZXJ2ZXJSdW50aW1lQ29udGV4dF87Ci0JfSAgCi0gIH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQwMGIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0IHsKLQkKLQlwcml2YXRlIFN0cmluZyBQUkVGRVJFTkNFX1NFUlZFUiA9ICJQUkVGRVJFTkNFX1NFUlZFUiI7Ci0JcHJpdmF0ZSBTdHJpbmcgUFJFRkVSRU5DRV9SVU5USU1FID0gIlBSRUZFUkVOQ0VfUlVOVElNRSI7Ci0JcHJpdmF0ZSBTdHJpbmcgUFJFRkVSRU5DRV9KMkVFX1ZFUlNJT04gPSAiUFJFRkVSRU5DRV9KMkVFX1ZFUlNJT04iOwotCQotCXByaXZhdGUgU3RyaW5nIFNFUlZFUl9GQUNUT1JZX0lEX0RFRkFVTFQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDAiOwotCXByaXZhdGUgU3RyaW5nIFJVTlRJTUVfSURfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiOwotCXByaXZhdGUgU3RyaW5nIEoyRUVfVkVSU0lPTl9ERUZBVUxUID0gIjEzIjsKLQkKLQlwdWJsaWMgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0KCkKLQl7Ci0JCXN1cGVyKFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0I2xvYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoKSB7Ci0JCS8vRGVmYXVsdHMgd2lsbCBiZSBzZXQgdmlhIHRoZSAuaW5pIGN1c3RvbWl6YXRpb24uIFRoZXkgYXJlIGhhcmQgY29kZWQgdG8gZGVmYXVsdCB2YWx1ZXMgaW4gdGhlCi0JCS8vYWJzZW5jZSBvZiBhIC5pbmkgZmlsZS4KLQkJU3RyaW5nIHNlcnZlckRlZmF1bHQgPSBnZXREZWZhdWx0U3RyaW5nKFBSRUZFUkVOQ0VfU0VSVkVSKTsKLQkJaWYgKHNlcnZlckRlZmF1bHQ9PW51bGwgfHwgc2VydmVyRGVmYXVsdC5sZW5ndGgoKT09MCkKLQkJewotCQkgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9TRVJWRVIsIFNFUlZFUl9GQUNUT1JZX0lEX0RFRkFVTFQpOwotCQl9Ci0KLQkJU3RyaW5nIHJ1bnRpbWVEZWZhdWx0ID0gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX1JVTlRJTUUpOwotCQlpZiAocnVudGltZURlZmF1bHQ9PW51bGwgfHwgcnVudGltZURlZmF1bHQubGVuZ3RoKCk9PTApCi0JCXsKLQkJICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfUlVOVElNRSwgUlVOVElNRV9JRF9ERUZBVUxUKTsKLQkJfQotCi0JCVN0cmluZyBqMmVlRGVmYXVsdCA9IGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9KMkVFX1ZFUlNJT04pOwotCQlpZiAoajJlZURlZmF1bHQ9PW51bGwgfHwgajJlZURlZmF1bHQubGVuZ3RoKCk9PTApCi0JCXsKLQkJICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OLCBKMkVFX1ZFUlNJT05fREVGQVVMVCk7Ci0JCX0KLQotCQkJCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXJ2ZXJGYWN0b3J5SWQoKQotCXsKLQkJcmV0dXJuIGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9TRVJWRVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVJZCgpCi0JewotCQlyZXR1cm4gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX1JVTlRJTUUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEoyRUVWZXJzaW9uKCkKLQl7Ci0JCXJldHVybiBnZXREZWZhdWx0U3RyaW5nKFBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlckZhY3RvcnlJZCgpCi0JewotCQlTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfU0VSVkVSKTsgCi0JCS8qCi0JCWlmICh2YWx1ZT09bnVsbCB8fCB2YWx1ZS5sZW5ndGgoKT09MCkKLQkJewotCQkJdmFsdWUgPSBTRVJWRVJfRkFDVE9SWV9JRF9ERUZBVUxUOyAKLQkJCXNldFNlcnZlckZhY3RvcnlJZCh2YWx1ZSk7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVJZCgpCi0JewotCQlTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfUlVOVElNRSk7Ci0JCS8qCi0JCWlmICh2YWx1ZT09bnVsbCB8fCB2YWx1ZS5sZW5ndGgoKT09MCkKLQkJewotCQkJdmFsdWUgPSBSVU5USU1FX0lEX0RFRkFVTFQ7IAotCQkJc2V0UnVudGltZUlkKHZhbHVlKTsKLQkJfQotCQkqLwotCQlyZXR1cm4gdmFsdWU7CQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKMkVFVmVyc2lvbigpCi0JewotCQlTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OKTsKLQkJLyoKLQkJaWYgKHZhbHVlPT1udWxsIHx8IHZhbHVlLmxlbmd0aCgpPT0wKQotCQl7Ci0JCQl2YWx1ZSA9IEoyRUVfVkVSU0lPTl9ERUZBVUxUOyAKLQkJCXNldEoyRUVWZXJzaW9uKHZhbHVlKTsKLQkJfQotCQkqLwotCQlyZXR1cm4gdmFsdWU7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmVyRmFjdG9yeUlkKFN0cmluZyBpZCkKLQl7Ci0JCXNldFZhbHVlKFBSRUZFUkVOQ0VfU0VSVkVSLGlkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UnVudGltZUlkKFN0cmluZyBpZCkKLQl7Ci0JCXNldFZhbHVlKFBSRUZFUkVOQ0VfUlVOVElNRSwgaWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLQl7Ci0JCXNldFZhbHVlKFBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OLCB2ZXJzaW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1NlcnZlclJ1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjMjc4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1NlcnZlclJ1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyUnVudGltZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIExpc3RlbmVyIAotewotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkXz0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCQotCS8qIENPTlRFWFRfSUQgU1JQRjAwMDEgZm9yIHNlcnZlciBwcmVmZXJlbmNlIG9uIHRoZSBzZXJ2ZXIgcnVudGltZSBwcmVmZXJlbmNlIHBhZ2UgKi8KLQlwcml2YXRlIFN0cmluZyBJTkZPUE9QX1NSUEZfU0VSVkVSX1BSRUYgPSBwbHVnaW5JZF8gKyAiLlNSUEYwMDAxIjsKLQlwcml2YXRlIENvbWJvIHNlcnZlcl87Ci0KLQkvKiBDT05URVhUX0lEIFNSUEYwMDAyIGZvciBydW50aW1lIHByZWZlcmVuY2Ugb24gdGhlIHNlcnZlciBydW50aW1lIHByZWZlcmVuY2UgcGFnZSAqLwotCXByaXZhdGUgU3RyaW5nIElORk9QT1BfU1JQRl9SVU5USU1FX1BSRUYgPSBwbHVnaW5JZF8gKyAiLlNSUEYwMDAyIjsKLQlwcml2YXRlIENvbWJvIHJ1bnRpbWVfOwkKLQotCS8qIENPTlRFWFRfSUQgU1JQRjAwMDMgZm9yIEoyRUUgdmVyc2lvbiBwcmVmZXJlbmNlIG9uIHRoZSBzZXJ2ZXIgcnVudGltZSBwcmVmZXJlbmNlIHBhZ2UgKi8KLQlwcml2YXRlIFN0cmluZyBJTkZPUE9QX1NSUEZfSjJFRV9QUkVGID0gcGx1Z2luSWRfICsgIi5TUlBGMDAwMyI7Ci0JcHJpdmF0ZSBDb21ibyBqMmVlVmVyc2lvbl87Ci0JCi0JU2VsZWN0aW9uTGlzdENob2ljZXMgc2VydmVyVG9SdW50aW1lVG9KMkVFXzsKLQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgIHsgfQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAKLQl7Ci0JICAKLQkgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzKTsKLQkgIFVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzXywgcGx1Z2luSWRfKTsKLQkgIAotCSAgQ29tcG9zaXRlIHBhZ2UgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCSAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JICBnbC5udW1Db2x1bW5zID0gMjsKLQkgIHBhZ2Uuc2V0TGF5b3V0KGdsKTsKLQkgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCSAgcGFnZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkgIAotCSAgc2VydmVyXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFnZSwiTEFCRUxfU0VSVkVSU19MSVNUIiwKLQkgIAkJICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfU1JQRl9DT01CT19TRVJWRVIiLAotCQkJCQkJCQkJSU5GT1BPUF9TUlBGX1NFUlZFUl9QUkVGLAotCQkJCQkJCQkJU1dULlNJTkdMRXxTV1QuQk9SREVSfFNXVC5SRUFEX09OTFkpOwotCSAgCi0JICBydW50aW1lXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFnZSwiTEFCRUxfUlVOVElNRVNfTElTVCIsCi0JICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9TUlBGX0NPTUJPX1JVTlRJTUUiLAotCQkJCQkJCQkJIElORk9QT1BfU1JQRl9SVU5USU1FX1BSRUYsCi0JCQkJCQkJCQkgU1dULlNJTkdMRXxTV1QuQk9SREVSfFNXVC5SRUFEX09OTFkpOwotCSAgCi0JICBqMmVlVmVyc2lvbl8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhZ2UsIkxBQkVMX0oyRUVfVkVSU0lPTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1NSUEZfQ09NQk9fSjJFRSIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfU1JQRl9KMkVFX1BSRUYsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEV8U1dULkJPUkRFUnxTV1QuUkVBRF9PTkxZKTsJICAKLQotCSAgaW5pdGlhbGl6ZVZhbHVlcygpOwotCSAgc3RhcnRMaXN0ZW5pbmcoKTsKLQkgIHJldHVybiBwYWdlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkKLQl7Ci0JCVBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJUb1J1bnRpbWVUb0oyRUUoKTsKLQotCi0JCXNldFNlcnZlckl0ZW1zKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0TGlzdCgpLmdldExpc3QoKSk7Ci0JCVN0cmluZyBkZWZhdWx0U2VydmVyVGV4dCA9IGNvbnRleHQuZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0JCXNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGRlZmF1bHRTZXJ2ZXJUZXh0KTsKLQkJc2V0U2VydmVyU2VsZWN0aW9uKGRlZmF1bHRTZXJ2ZXJUZXh0KTsKLQkJCi0JCXNldFJ1bnRpbWVJdGVtcyhzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCkpOwotCQlTdHJpbmcgZGVmYXVsdFJ1bnRpbWVUZXh0ID0gY29udGV4dC5nZXRSdW50aW1lSWQoKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdFJ1bnRpbWVUZXh0KTsKLQkJc2V0UnVudGltZVNlbGVjdGlvbihkZWZhdWx0UnVudGltZVRleHQpOwotCQkKLQkJc2V0SjJFRUl0ZW1zKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKSk7Ci0JCVN0cmluZyBkZWZhdWx0SjJFRVZlcnNpb24gPSBjb250ZXh0LmdldEoyRUVWZXJzaW9uKCk7Ci0JCXNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGRlZmF1bHRKMkVFVmVyc2lvbik7Ci0JCXNldEoyRUVTZWxlY3Rpb24oZGVmYXVsdEoyRUVWZXJzaW9uKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotCXsKLQkJaWYgKHNlcnZlcl8gPT0gZXZlbnQud2lkZ2V0KQotCQl7Ci0JCQloYW5kbGVTZXJ2ZXJTZWxlY3RlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKHJ1bnRpbWVfID09IGV2ZW50LndpZGdldCkKLQkJewotCQkJaGFuZGxlUnVudGltZVNlbGVjdGVkKCk7Ci0JCX0KLQkJZWxzZSBpZiAoajJlZVZlcnNpb25fID09IGV2ZW50LndpZGdldCkKLQkJewkJCQotCQkJaGFuZGxlSjJFRVNlbGVjdGVkKCk7Ci0JCX0JCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VydmVyU2VsZWN0ZWQoKQotCXsKLQkJc3RvcExpc3RlbmluZygpOwotCQkKLQkJU3RyaW5nIHNlbGVjdGVkVGV4dCA9IGdldFNlcnZlclNlbGVjdGlvbigpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShzZWxlY3RlZFRleHQpOwotCQkKLQkJLy9VcGRhdGUgdGhlIHJ1bnRpbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlzZXRSdW50aW1lSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLQkJaWYgKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKS5sZW5ndGggPiAwKQotCQkgIHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldEluZGV4KDApOwotCQkKLQkJU3RyaW5nIG5ld1J1bnRpbWVUZXh0ID0gc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChuZXdSdW50aW1lVGV4dCE9bnVsbCAmJiBuZXdSdW50aW1lVGV4dC5sZW5ndGgoKT4wKQotCQkJc2V0UnVudGltZVNlbGVjdGlvbihuZXdSdW50aW1lVGV4dCk7Ci0JCQotCQkvL1VwZGF0ZSB0aGUgajJlZSB2ZXJzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJaWYgKG5ld1J1bnRpbWVUZXh0IT1udWxsICYmIG5ld1J1bnRpbWVUZXh0Lmxlbmd0aCgpPjApCi0JCXsKLQkJICBzZXRKMkVFSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLQkJICBpZiAoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpLmxlbmd0aCA+IDApCi0JCQkgIHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldEluZGV4KDApOwotCQkJCi0JCQlTdHJpbmcgbmV3SjJFRVRleHQgPSBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChuZXdKMkVFVGV4dCE9bnVsbCAmJiBuZXdKMkVFVGV4dC5sZW5ndGgoKT4wKQotCQkJCXNldEoyRUVTZWxlY3Rpb24obmV3SjJFRVRleHQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkgIHNldEoyRUVJdGVtcyhuZXcgU3RyaW5nWzBdKTsKLQkJfQotCQkKLQkJc3RhcnRMaXN0ZW5pbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJ1bnRpbWVTZWxlY3RlZCgpCi0JewotCQlzdG9wTGlzdGVuaW5nKCk7Ci0JCQotCQlTdHJpbmcgc2VsZWN0ZWRUZXh0ID0gZ2V0UnVudGltZVNlbGVjdGlvbigpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShzZWxlY3RlZFRleHQpOwotCQkKLQkJLy9VcGRhdGUgdGhlIGoyZWUgdmVyc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCXNldEoyRUVJdGVtcyhzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCkpOwotCQlpZiAoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpLmxlbmd0aCA+IDApCi0JCSAgc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0SW5kZXgoMCk7Ci0JCQotCQlTdHJpbmcgbmV3SjJFRVRleHQgPSBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKG5ld0oyRUVUZXh0IT1udWxsICYmIG5ld0oyRUVUZXh0Lmxlbmd0aCgpPjApCi0JCQlzZXRKMkVFU2VsZWN0aW9uKG5ld0oyRUVUZXh0KTsKLQkJCQkKLQkJc3RhcnRMaXN0ZW5pbmcoKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlSjJFRVNlbGVjdGVkKCkKLQl7Ci0JCXN0b3BMaXN0ZW5pbmcoKTsKLQkJCi0JCVN0cmluZyBzZWxlY3RlZFRleHQgPSBnZXRKMkVFU2VsZWN0aW9uKCk7Ci0JCXNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKHNlbGVjdGVkVGV4dCk7Ci0JCQotCQlzdGFydExpc3RlbmluZygpOwotCX0KLSAgICAvKioKLQkgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLQl7Ci0JICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkgIHNldFRvRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFRvRGVmYXVsdHMoKQotCXsKLQkJUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0KLQkJU3RyaW5nIGRlZmF1bHRTZXJ2ZXJUZXh0ID0gY29udGV4dC5nZXREZWZhdWx0U2VydmVyRmFjdG9yeUlkKCk7Ci0JCXNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGRlZmF1bHRTZXJ2ZXJUZXh0KTsKLQkJc2V0U2VydmVyU2VsZWN0aW9uKGRlZmF1bHRTZXJ2ZXJUZXh0KTsKLQkJCi0JCXNldFJ1bnRpbWVJdGVtcyhzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCkpOwotCQlTdHJpbmcgZGVmYXVsdFJ1bnRpbWVUZXh0ID0gY29udGV4dC5nZXREZWZhdWx0UnVudGltZUlkKCk7Ci0JCXNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGRlZmF1bHRSdW50aW1lVGV4dCk7Ci0JCXNldFJ1bnRpbWVTZWxlY3Rpb24oZGVmYXVsdFJ1bnRpbWVUZXh0KTsKLQkJCi0JCXNldEoyRUVJdGVtcyhzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCkpOwotCQlTdHJpbmcgZGVmYXVsdEoyRUVWZXJzaW9uID0gY29udGV4dC5nZXREZWZhdWx0SjJFRVZlcnNpb24oKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdEoyRUVWZXJzaW9uKTsKLQkJc2V0SjJFRVNlbGVjdGlvbihkZWZhdWx0SjJFRVZlcnNpb24pOwkJCi0JfQotCi0JLyoqCi0JICogRG8gYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLQl7Ci0JICBzdG9yZVZhbHVlcygpOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLQl7Ci0gICAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgICAgIGNvbnRleHQuc2V0U2VydmVyRmFjdG9yeUlkKGdldFNlcnZlclNlbGVjdGlvbigpKTsKLSAgICAgIGNvbnRleHQuc2V0UnVudGltZUlkKGdldFJ1bnRpbWVTZWxlY3Rpb24oKSk7Ci0gICAgICBjb250ZXh0LnNldEoyRUVWZXJzaW9uKGdldEoyRUVTZWxlY3Rpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpCi0JewotCSAgcGVyZm9ybU9rKCk7Ci0JfQotCQotICAJCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkKLQl7Ci0JICBzZXJ2ZXJfLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sdGhpcyk7Ci0JICBydW50aW1lXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLHRoaXMpOwotCSAgajJlZVZlcnNpb25fLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sdGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BMaXN0ZW5pbmcoKQotCXsKLQkgIHNlcnZlcl8ucmVtb3ZlTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JICBydW50aW1lXy5yZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkgIGoyZWVWZXJzaW9uXy5yZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VydmVySXRlbXMoU3RyaW5nW10gZmFjdG9yeUlkcykKLQl7Ci0JICAKLQkgIGlmIChmYWN0b3J5SWRzICE9IG51bGwpCi0JICB7Ci0JCS8vU3RyaW5nW10gc2VydmVyTGFiZWxzID0gbmV3IFN0cmluZ1tmYWN0b3J5SWRzLmxlbmd0aF07Ci0JICAgIEFycmF5TGlzdCBzZXJ2ZXJMYWJlbHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7aTxmYWN0b3J5SWRzLmxlbmd0aDtpKyspCi0JCXsKLQkJCVN0cmluZyB0aGlzRmFjdG9yeUlkID0gZmFjdG9yeUlkc1tpXTsKLQkJCVN0cmluZyB0aGlzU2VydmVyTGFiZWwgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFNlcnZlckxhYmVsKGZhY3RvcnlJZHNbaV0pOwotCQkJaWYgKHRoaXNTZXJ2ZXJMYWJlbCE9bnVsbCAmJiB0aGlzU2VydmVyTGFiZWwubGVuZ3RoKCk+MCkKLQkJCXsKLQkJCSAgc2VydmVyTGFiZWxzTGlzdC5hZGQodGhpc1NlcnZlckxhYmVsKTsKLQkJCX0KLQkJCQotCQl9Ci0JCVN0cmluZ1tdIHNlcnZlckxhYmVscyA9IGNvbnZlcnRUb1N0cmluZ0FycmF5KHNlcnZlckxhYmVsc0xpc3QudG9BcnJheSgpKTsgCi0JCXNlcnZlcl8uc2V0SXRlbXMoc2VydmVyTGFiZWxzKTsKLQkgIH0KLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRSdW50aW1lSXRlbXMoU3RyaW5nW10gaWRzKQotCXsKLQkgIGlmIChpZHMgIT0gbnVsbCkKLQkgIHsKLQkJU3RyaW5nW10gcnVudGltZUxhYmVscyA9IG5ldyBTdHJpbmdbaWRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGk9MDtpPGlkcy5sZW5ndGg7aSsrKQotCQl7Ci0JCSAgcnVudGltZUxhYmVsc1tpXSA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0UnVudGltZUxhYmVsKGlkc1tpXSk7Ci0JCX0KLQkJcnVudGltZV8uc2V0SXRlbXMocnVudGltZUxhYmVscyk7Ci0JICB9Ci0JCQotCX0KLQkKLSAgICBwcml2YXRlIHZvaWQgc2V0SjJFRUl0ZW1zKFN0cmluZ1tdIHZlcnNpb25zKQotICAgIHsKLSAgICAgIGlmICh2ZXJzaW9ucyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBqMmVlTGFiZWxzID0gbmV3IFN0cmluZ1t2ZXJzaW9ucy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVV0aWxzLmdldExhYmVsRnJvbUoyRUVWZXJzaW9uKHZlcnNpb25zW2ldKTsKLSAgICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCAmJiBsYWJlbC5sZW5ndGgoKT4wKQotICAgICAgICAgICAgajJlZUxhYmVsc1tpXSA9IGxhYmVsOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGoyZWVMYWJlbHNbaV0gPSBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfTkEiKTsKLSAgICAgICAgfQotICAgICAgICBqMmVlVmVyc2lvbl8uc2V0SXRlbXMoajJlZUxhYmVscyk7Ci0gICAgICAgIAotICAgICAgICAvL0Rpc2FibGUgdGhlIGNvbWJvIGlmIGl0IGhhcyBubyBpdGVtcy4KLSAgICAgICAgaWYgKGoyZWVMYWJlbHMubGVuZ3RoID4gMCkKLSAgICAgICAgICBqMmVlVmVyc2lvbl8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGoyZWVWZXJzaW9uXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFNlcnZlclNlbGVjdGlvbigpCi0JewotCSAgU3RyaW5nIHNlcnZlckxhYmVsID0gc2VydmVyXy5nZXRUZXh0KCk7Ci0JICByZXR1cm4gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyTGFiZWwpOwkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFJ1bnRpbWVTZWxlY3Rpb24oKQotCXsKLSAgICAgIFN0cmluZyBydW50aW1lTGFiZWwgPSBydW50aW1lXy5nZXRUZXh0KCk7Ci0JICByZXR1cm4gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRSdW50aW1lSWQocnVudGltZUxhYmVsKTsJCQkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEoyRUVTZWxlY3Rpb24oKQotCXsKLQkgIFN0cmluZyBqMmVlTGFiZWwgPSBqMmVlVmVyc2lvbl8uZ2V0VGV4dCgpOwotCSAgcmV0dXJuIEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbkZyb21MYWJlbChqMmVlTGFiZWwpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRTZXJ2ZXJTZWxlY3Rpb24oU3RyaW5nIGZhY3RvcnlJZCkKLQl7Ci0JCVN0cmluZyBsYWJlbCA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0U2VydmVyTGFiZWwoZmFjdG9yeUlkKTsKLQkJc2V0U2VsZWN0aW9uKHNlcnZlcl8sbGFiZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0UnVudGltZVNlbGVjdGlvbihTdHJpbmcgaWQpCi0JewotCQlTdHJpbmcgbGFiZWwgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJ1bnRpbWVMYWJlbChpZCk7Ci0JCXNldFNlbGVjdGlvbihydW50aW1lXyxsYWJlbCk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEoyRUVTZWxlY3Rpb24oU3RyaW5nIHZlcnNpb24pCi0JewotCSAgU3RyaW5nIGxhYmVsID0gSjJFRVV0aWxzLmdldExhYmVsRnJvbUoyRUVWZXJzaW9uKHZlcnNpb24pOwotICAgICAgc2V0U2VsZWN0aW9uKGoyZWVWZXJzaW9uXywgbGFiZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uKENvbWJvIGNvbWJvLCBTdHJpbmcgcykKLQl7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gY29tYm8uZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlpZiAoaXRlbXNbaV0uZXF1YWxzKHMpKQotCQkJewotCQkJCWNvbWJvLnNlbGVjdChpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb252ZXJ0VG9TdHJpbmdBcnJheShPYmplY3RbXSBhKQotCXsKLQkgIGlmIChhPT1udWxsKSByZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkgIAkKLQkgIGludCBsZW5ndGggPSBhLmxlbmd0aDsKLQkgIFN0cmluZ1tdIHNhID0gbmV3IFN0cmluZ1tsZW5ndGhdOwotCSAgZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKQotCSAgewotCSAgCU9iamVjdCBvYmogPSBhW2ldOwotCSAgCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpCi0JICAJewotCSAgICAgIHNhW2ldID0gKFN0cmluZylvYmo7Ci0JICAJfQotCSAgfQotCSAgcmV0dXJuIHNhOwotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQWJzdHJhY3RIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDbWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM5ZDQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSAqIEFic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kCi0gKgotICogSW5pdGlhbGl6ZSBhbmQgbG9hZCB0aGUgaGFuZGxlcnMgZGF0YQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDbWQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLSAgCi0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbl87IAotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3RfOwotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudil7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7ICAgIAotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBpbml0aWFsU2VsZWN0aW9uXzsKLSAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgfQotICAKLQotICBwdWJsaWMgTGlzdCBnZXRDbGllbnRIYW5kbGVycygpewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0U2VsZWN0aW9uKXsKLSAgICB0aGlzLmluaXRpYWxTZWxlY3Rpb25fID0gaW5pdFNlbGVjdGlvbjsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldEluaXRpYWxTZWxlY3Rpb24oKXsKLSAgICByZXR1cm4gdGhpcy5pbml0aWFsU2VsZWN0aW9uXzsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21Jbml0aWFsU2VsZWN0aW9uKCkKLSAgewotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uXyAhPSBudWxsICYmIGluaXRpYWxTZWxlY3Rpb25fLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBpbml0aWFsU2VsZWN0aW9uXy5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgcmV0dXJuIHJlc291cmNlOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gICAKLSAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKXsKLSAgICAKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZUZyb21Jbml0aWFsU2VsZWN0aW9uKCk7Ci0JaWYgKHJlc291cmNlICE9IG51bGwpCi0JewotCSAgcmV0dXJuIFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKCByZXNvdXJjZS5nZXRGdWxsUGF0aCgpICk7Ci0JfQotCSAKLQlyZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFdlYlNlcnZpY2VFZGl0TW9kZWwgZ2V0V2ViU2VydmljZUVkaXRNb2RlbCgpIHsKLSAgICBXZWJTZXJ2aWNlc01hbmFnZXIgd3NtID0gbmV3IFdlYlNlcnZpY2VzTWFuYWdlcigpOwotICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0gICAgcmV0dXJuIHdzbS5nZXRXU0VkaXRNb2RlbChwcm9qZWN0KTsgICAgCi0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQWRkSGFuZGxlckRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0FkZEhhbmRsZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwZDlkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQWRkSGFuZGxlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxMiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nLkRpYWxvZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLQotCi0KLXB1YmxpYyBjbGFzcyBBZGRIYW5kbGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZU9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50XzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIFN0cmluZ1tdIHBvcnROYW1lczsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRQb3J0TmFtZTsKLSAgCi0gIHByaXZhdGUgVGV4dCBjbGFzc05hbWVUZXh0OwotICBwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0gIHByaXZhdGUgQ29tYm8gcG9ydE5hbWVDb21ibzsKLSAgCi0gIC8vIC0tLS1UT09MVElQUyBTZWN0aW9uLS0tLQotICAvKiBDT05URVhUX0lEIEFIREwwMDAxIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1RFWFRfSEFORExFUl9OQU1FICA9ICJBSERMMDAwMSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9URVhUX0hBTkRMRVJfTkFNRSA9ICJUT09MVElQX1RFWFRfSEFORExFUl9OQU1FIjsKLSAgCi0gIC8qIENPTlRFWFRfSUQgQUhETDAwMDIgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfVEVYVF9IQU5ETEVSX0NMQVNTICA9ICJBSERMMDAwMiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9URVhUX0hBTkRMRVJfQ0xBU1MgPSAiVE9PTFRJUF9URVhUX0hBTkRMRVJfQ0xBU1MiOwotICAKLSAgLyogQ09OVEVYVF9JRCBBSERMMDAwMSBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9URVhUX0hBTkRMRVJfUE9SVCAgPSAiQUhETDAwMDMiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfVEVYVF9IQU5ETEVSX1BPUlQgPSAiVE9PTFRJUF9URVhUX0hBTkRMRVJfUE9SVCI7Ci0gICAgCi0gIHByaXZhdGUgQnV0dG9uIGJlYW5DbGFzc0Jyb3dzZUJ1dHRvbl87Ci0gIC8qQ09OVEVYVF9JRCBQQkNMMDAwMyBmb3IgdGhlIEJlYW4gQ2xhc3MgQnJvd3NlIGJ1dHRvbiBvZiB0aGUgQmVhbiBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0UgPSAiUEJDTDAwMDMiOwotICAKLSAgcHVibGljIEFkZEhhbmRsZXJEaWFsb2coIFNoZWxsIHNoZWxsLCBib29sZWFuIGlzQ2xpZW50SGFuZGxlcikKLSAgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgICBpc0NsaWVudF8gPSBpc0NsaWVudEhhbmRsZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgIHBhcmVudC5nZXRTaGVsbCgpLnBhY2soKTsKLSAgICByZXR1cm4gY29tcDsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIHZhbGlkYXRlT25fID0gZmFsc2U7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgVUlVdGlscyB1aVV0aWxzID0gbmV3IFVJVXRpbHMobXNnVXRpbHNfLCBwbHVnaW5JZF8pOwotICAgIAotICAgIFNoZWxsIHRoaXNTaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgIGlmICh0aGlzU2hlbGwgPT0gbnVsbCkgewotICAgICAgdGhpc1NoZWxsID0gY3JlYXRlU2hlbGwoKTsKLSAgICB9Ci0gICAgdGhpc1NoZWxsLnNldFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkRJQUxPR19USVRMRV9XU19BRERfSEFORExFUiIpKTsKLSAgICAKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOyAgICAKLSAgICAKLSAgICBDb21wb3NpdGUgc291cmNlTG9jYXRpb25Db21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlLCAzKTsKLSAgICAKLSAgICBjbGFzc05hbWVUZXh0ID0gdWlVdGlscy5jcmVhdGVUZXh0KHNvdXJjZUxvY2F0aW9uQ29tcCwgIkxBQkVMX1RFWFRfSEFORExFUl9DTEFTUyIsIFRPT0xUSVBfVEVYVF9IQU5ETEVSX0NMQVNTLCBJTkZPUE9QX1RFWFRfSEFORExFUl9DTEFTUywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIGNsYXNzTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSx0aGlzKTsKLSAgICAKLSAgICBiZWFuQ2xhc3NCcm93c2VCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBzb3VyY2VMb2NhdGlvbkNvbXAsICJCVVRUT05fQlJPV1NFX0NMQVNTRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFICk7Ci0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlQnJvd3NlQ2xhc3NlcygpOyAgCi0gICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgCi0gICAgbmFtZVRleHQgPSB1aVV0aWxzLmNyZWF0ZVRleHQoc291cmNlTG9jYXRpb25Db21wLCAiTEFCRUxfVEVYVF9IQU5ETEVSX05BTUUiLCBUT09MVElQX1RFWFRfSEFORExFUl9OQU1FLCBJTkZPUE9QX1RFWFRfSEFORExFUl9OQU1FLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOwotICAgIG5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIAotICAgIC8vIGR1bW15IGxhYmVsIGZvciBjb2x1bW4gMy4KLSAgICBuZXcgTGFiZWwoIHNvdXJjZUxvY2F0aW9uQ29tcCwgU1dULk5PTkUgKTsKLSAgICAKLSAgICBpZiAoIWlzQ2xpZW50Xyl7Ci0gICAgICBwb3J0TmFtZUNvbWJvID0gdWlVdGlscy5jcmVhdGVDb21ibyhzb3VyY2VMb2NhdGlvbkNvbXAsICJMQUJFTF9URVhUX0hBTkRMRVJfUE9SVCIsIFRPT0xUSVBfVEVYVF9IQU5ETEVSX1BPUlQsIElORk9QT1BfVEVYVF9IQU5ETEVSX1BPUlQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICk7Ci0gICAgICBwb3J0TmFtZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgICAgCi0gICAgICAvLyBkdW1teSBsYWJlbCBmb3IgY29sdW1uIDMuCi0gICAgICBuZXcgTGFiZWwoIHNvdXJjZUxvY2F0aW9uQ29tcCwgU1dULk5PTkUgKTsKLSAgICB9Ci0gICAgdmFsaWRhdGVPbl8gPSB0cnVlOwotICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZUNsYXNzZXMoKQotICB7Ci0gICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotICAgIElUeXBlIGl0eXBlID0gRGlhbG9nVXRpbHMuYnJvd3NlQ2xhc3Nlc0FzSVR5cGUoc2hlbGwsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSwgbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkpOwotICAgIAotICAgIGlmKCBpdHlwZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBjbGFzc05hbWVUZXh0LnNldFRleHQoaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICBpZiAoIXZhbGlkYXRlT25fKQotICAgICAgcmV0dXJuOwotICAgIGlmIChjbGFzc05hbWVUZXh0ID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlQ2xhc3NOYW1lVGV4dEV2ZW50KCk7Ci0gICAgICB2YWxpZGF0ZVRleHRGaWVsZEVudHJpZXMoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG5hbWVUZXh0ID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlTmFtZVRleHRFdmVudCgpOwotICAgICAgdmFsaWRhdGVUZXh0RmllbGRFbnRyaWVzKCk7ICAgICAgCi0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwb3J0TmFtZUNvbWJvID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlUG9ydE5hbWVUZXh0RXZlbnQoKTsKLSAgICAgIHZhbGlkYXRlVGV4dEZpZWxkRW50cmllcygpOyAgICAgIAotICAgICAgcmV0dXJuOwotICAgIH0gICAgCi0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQ2xhc3NOYW1lVGV4dEV2ZW50KCl7Ci0gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgaWYgKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLmphdmEiKSAhPSAtMSl7Ci0gICAgICBuYW1lVGV4dC5zZXRUZXh0KGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgbmFtZVRleHQuc2V0VGV4dChjbGFzc05hbWUpOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpewotICAgICAgbmFtZVRleHQuc2V0VGV4dChjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKzEsIGNsYXNzTmFtZS5sZW5ndGgoKSkpOwotICAgIH0KLSAgICBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlTmFtZVRleHRFdmVudCgpIHsKLSAgIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7IAotCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVQb3J0TmFtZVRleHRFdmVudCgpewotICAgIHNlbGVjdGVkUG9ydE5hbWUgPSBwb3J0TmFtZUNvbWJvLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGRpc2FibGVPS0J1dHRvbigpIHsKLSAgICBpZiAoZ2V0QnV0dG9uKDApICE9IG51bGwpCi0gICAgICBnZXRCdXR0b24oMCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlT0tCdXR0b24oKSB7Ci0gICAgaWYgKGdldEJ1dHRvbigwKSAhPSBudWxsKQotICAgICAgZ2V0QnV0dG9uKDApLnNldEVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVRleHRGaWVsZEVudHJpZXMoKXsKLSAgCWlmIChjbGFzc05hbWVUZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKXsKLSAgCQlkaXNhYmxlT0tCdXR0b24oKTsKLSAgCQlyZXR1cm47Ci0gIAl9Ci0gIAlpZiAobmFtZVRleHQuZ2V0VGV4dCgpLmVxdWFscygiIikpewotICAJCWRpc2FibGVPS0J1dHRvbigpOwotICAJCXJldHVybjsKLSAgCX0KLSAgCWlmICghaXNDbGllbnRfKXsKLSAgCQlpZiAocG9ydE5hbWVDb21iby5nZXRUZXh0KCkhPW51bGwgJiYgcG9ydE5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKCIiKSl7Ci0gIAkJCWRpc2FibGVPS0J1dHRvbigpOwotICAJCQlyZXR1cm47Ci0gIAkJfQotICAJCWVsc2UgaWYgKHBvcnROYW1lQ29tYm8uZ2V0VGV4dCgpPT1udWxsKSB7Ci0gIAkJCWRpc2FibGVPS0J1dHRvbigpOwotICAJCQlyZXR1cm47Ci0gIAkJfQotICAJfQotICAJCi0gIAllbmFibGVPS0J1dHRvbigpOwotICAJCi0JCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsYXNzTmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgIGlmIChjbGFzc05hbWUubGFzdEluZGV4T2YoIi5qYXZhIikgIT0gLTEpewotICAgICAgcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLSAgfQotICAvKioKLSAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgY2xhc3NOYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9ydE5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgIHJldHVybiBzZWxlY3RlZFBvcnROYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcG9ydE5hbWUgVGhlIHBvcnROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lcyhTdHJpbmdbXSBwb3J0TmFtZXMpIHsKLSAgICB0aGlzLnBvcnROYW1lcyA9IHBvcnROYW1lczsKLSAgICBwb3J0TmFtZUNvbWJvLnNldEl0ZW1zKHBvcnROYW1lcyk7Ci0gICAgcG9ydE5hbWVDb21iby5zZWxlY3QoMCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQ0NTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwbGljYXRpb25DbGllbnROYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0LkVKQk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSjJFRVdlYk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQKLSAqCi0gKiBJbml0aWFsaXplIGFuZCBsb2FkIHRoZSBoYW5kbGVycyBkYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDbWQgewotCi0gIHByaXZhdGUgSGFuZGxlclRhYmxlSXRlbVtdIGhhbmRsZXJzXzsKLQotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkXzsKLQotICBwcml2YXRlIElQYXRoIHNvdXJjZU91dHB1dExvY2F0aW9uXzsKLQotICBwcml2YXRlIEhhc2h0YWJsZSB3c1JlZnNUb0hhbmRsZXJzVGFibGVfOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIHJlZk5hbWVUb1NlcnZpY2VSZWZPYmpfOwotCi0gIHByaXZhdGUgV2ViU2VydmljZUVkaXRNb2RlbCB3c0VkaXRNb2RlbF87Ci0KLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc01hbmFnZXIgd2ViU2VydmljZXNNYW5hZ2VyXzsKLQotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3RfOwotCi0gIHByaXZhdGUgV2ViU2VydmljZXNSZXNvdXJjZSB3c0NsaWVudFJlc187Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVJlZk5hbWVfID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgQ29sbGVjdGlvbiB3c1NlcnZpY2VSZWZzXzsKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgd2ViU2VydmljZXNNYW5hZ2VyXyA9IG5ldyBXZWJTZXJ2aWNlc01hbmFnZXIoKTsKLQotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldEluaXRpYWxTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBwcm9jZXNzSGFuZGxlcnMoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHByb2Nlc3NIYW5kbGVycygpIHsKLSAgICB0cnkgewotICAgICAgVmVjdG9yIGhhbmRsZXJzID0gbmV3IFZlY3RvcigpOwotICAgICAgd3NSZWZzVG9IYW5kbGVyc1RhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIHJlZk5hbWVUb1NlcnZpY2VSZWZPYmpfID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgICB3c0VkaXRNb2RlbF8gPSBnZXRXZWJTZXJ2aWNlRWRpdE1vZGVsKCk7Ci0KLSAgICAgIHdzU2VydmljZVJlZnNfID0gZ2V0V1NTZXJ2aWNlUmVmc0Zyb21TZWxlY3Rpb24oKTsKLQotICAgICAgaWYgKHdzU2VydmljZVJlZnNfICE9IG51bGwpIHsKLSAgICAgICAgSXRlcmF0b3Igd3NSZWZzSXRlciA9IHdzU2VydmljZVJlZnNfLml0ZXJhdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NTZXJ2aWNlUmVmc18uc2l6ZSgpOyBpKyspIHsKLQotICAgICAgICAgIFNlcnZpY2VSZWYgd3NTZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpIHdzUmVmc0l0ZXIubmV4dCgpOwotCi0gICAgICAgICAgTGlzdCB3c0hhbmRsZXJzID0gd3NTZXJ2aWNlUmVmLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgSGFuZGxlclRhYmxlSXRlbVtdIGhhbmRsZXJJdGVtcyA9IG5ldyBIYW5kbGVyVGFibGVJdGVtW3dzSGFuZGxlcnMuc2l6ZSgpXTsKLSAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdzSGFuZGxlcnMuc2l6ZSgpOyBrKyspIHsKLQotICAgICAgICAgICAgSGFuZGxlciB3c0hhbmRsZXIgPSAoSGFuZGxlcikgd3NIYW5kbGVycy5nZXQoayk7Ci0KLSAgICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaGFuZGxlckl0ZW0gPSBuZXcgSGFuZGxlclRhYmxlSXRlbSgpOwotICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0SGFuZGxlcih3c0hhbmRsZXIpOwotICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0SGFuZGxlck5hbWUod3NIYW5kbGVyLmdldEhhbmRsZXJOYW1lKCkpOwotICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0SGFuZGxlckNsYXNzTmFtZSh3c0hhbmRsZXIuZ2V0SGFuZGxlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgICAgIGhhbmRsZXJJdGVtLnNldFdzRGVzY1JlZih3c1NlcnZpY2VSZWYpOwotICAgICAgICAgICAgaGFuZGxlckl0ZW1zW2tdID0gaGFuZGxlckl0ZW07Ci0gICAgICAgICAgICBoYW5kbGVycy5hZGQoaGFuZGxlckl0ZW0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBTdHJpbmcgd3NTZXJ2aWNlUmVmTmFtZSA9IHdzU2VydmljZVJlZi5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotICAgICAgICAgIHdzUmVmc1RvSGFuZGxlcnNUYWJsZV8ucHV0KHdzU2VydmljZVJlZk5hbWUsIGhhbmRsZXJJdGVtcyk7Ci0gICAgICAgICAgcmVmTmFtZVRvU2VydmljZVJlZk9ial8ucHV0KHdzU2VydmljZVJlZk5hbWUsIHdzU2VydmljZVJlZik7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGhhbmRsZXJzXyA9IChIYW5kbGVyVGFibGVJdGVtW10pIGhhbmRsZXJzLnRvQXJyYXkobmV3IEhhbmRsZXJUYWJsZUl0ZW1bMF0pOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHVibGljIEhhbmRsZXJUYWJsZUl0ZW1bXSBnZXRBbGxIYW5kbGVycygpIHsKLSAgICByZXR1cm4gdGhpcy5oYW5kbGVyc187Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGdldEhhbmRsZXJzKCkgewotICAgIHJldHVybiB3c1JlZnNUb0hhbmRsZXJzVGFibGVfOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNHZW5Ta2VsZXRvbkVuYWJsZWRfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuU2tlbGV0b25FbmFibGVkKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc291cmNlT3V0cHV0TG9jYXRpb25fLgotICAgKi8KLSAgcHVibGljIElQYXRoW10gZ2V0U291cmNlT3V0cHV0TG9jYXRpb24oKSB7Ci0gICAgSVBhdGhbXSBsb2NhdGlvbnMgPSBudWxsOwotICAgIGlmIChwcm9qZWN0Xz09bnVsbCkKLSAgICAgcHJvamVjdF8gPSBnZXRQcm9qZWN0KCk7Ci0gICAgaWYgKHByb2plY3RfICE9IG51bGwpIHsKLSAgICAgIGxvY2F0aW9ucyA9IFJlc291cmNlVXRpbHMuZ2V0QWxsSmF2YVNvdXJjZUxvY2F0aW9ucyhwcm9qZWN0Xyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxvY2F0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzRWRpdE1vZGVsLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VFZGl0TW9kZWwgZ2V0V3NFZGl0TW9kZWwoKSB7Ci0gICAgcmV0dXJuIHdzRWRpdE1vZGVsXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVJlZk5hbWUoKSB7Ci0gICAgcmV0dXJuIHRoaXMuc2VydmljZVJlZk5hbWVfOwotICB9Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VzUmVzb3VyY2UgZ2V0V3NDbGllbnRSZXNvdXJjZSgpIHsKLSAgICByZXR1cm4gd3NDbGllbnRSZXNfOwotICB9Ci0KLSAgcHVibGljIElQcm9qZWN0IGdldENsaWVudFByb2plY3QoKSB7Ci0gICAgcmV0dXJuIHByb2plY3RfOwotICB9Ci0KLSAgcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFdTU2VydmljZVJlZnNGcm9tU2VsZWN0aW9uKCkgewotCi0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdFNlbCA9IGdldEluaXRpYWxTZWxlY3Rpb24oKTsKLSAgICBpZiAoaW5pdFNlbCAhPSBudWxsICYmIGluaXRTZWwuc2l6ZSgpID09IDEpIHsKLSAgICAgIE9iamVjdCBvYmogPSBpbml0U2VsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gbnVsbDsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKSB7Ci0gICAgICAgIC8vIENsaWVudCBTZXJ2aWNlUmVmCi0gICAgICAgIHNlcnZpY2VSZWYgPSAoU2VydmljZVJlZikgb2JqOwotICAgICAgICBzZXJ2aWNlUmVmTmFtZV8gPSBzZXJ2aWNlUmVmLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0gICAgICAgIHByb2plY3RfID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2VSZWYpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgewotICAgICAgICBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIHdzbmd0ID0gKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIG9iajsKLSAgICAgICAgc2VydmljZVJlZiA9IHdzbmd0LmdldFNlcnZpY2VSZWYoKTsKLSAgICAgICAgc2VydmljZVJlZk5hbWVfID0gc2VydmljZVJlZi5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotICAgICAgICBwcm9qZWN0XyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzZXJ2aWNlUmVmKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHByb2plY3RfPT1udWxsKXsKLSAgICAgICAgcHJvamVjdF8gPSBnZXRQcm9qZWN0KCk7Ci0gICAgICB9Ci0gICAgICBpZiAocHJvamVjdF89PW51bGwpewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLQotICAgICAgd3NDbGllbnRSZXNfID0gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRXZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlKHByb2plY3RfKTsKLSAgCi0gICAgICBpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdF8pKSB7Ci0gICAgICAgIEoyRUVXZWJOYXR1cmVSdW50aW1lIHJ0ID0gSjJFRVdlYk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0Xyk7Ci0gICAgICAgIGlmIChydCAhPSBudWxsKSB7Ci0gICAgICAgICAgV2ViQXBwIHdlYkFwcCA9IHJ0LmdldFdlYkFwcCgpOwotICAgICAgICAgIGlmICh3ZWJBcHAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlcl8uZ2V0U2VydmljZVJlZnMod2ViQXBwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFJlc291cmNlVXRpbHMuaXNBcHBDbGllbnRQcm9qZWN0KHByb2plY3RfKSl7Ci0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlUnVudGltZSBydCA9IEFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3RfKTsKLSAgICAgICAgaWYgKHJ0IT1udWxsKSB7Ci0gICAgICAgICAgQXBwbGljYXRpb25DbGllbnQgYXBwQ2xpZW50ID0gcnQuZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLSAgICAgICAgICBpZiAoYXBwQ2xpZW50ICE9IG51bGwpewotICAgICAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlcl8uZ2V0U2VydmljZVJlZnMoYXBwQ2xpZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3RfKSl7Ci0gICAgICAgIEVKQk5hdHVyZVJ1bnRpbWUgcnQgPSBFSkJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUocHJvamVjdF8pOwotICAgICAgICBpZihydCE9bnVsbCl7Ci0gICAgICAgICAgRUpCSmFyIGVqYkphciA9IHJ0LmdldEVKQkphcigpOwotICAgICAgICAgIGlmIChlamJKYXIgIT1udWxsKXsKLSAgICAgICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlc01hbmFnZXJfLmdldFNlcnZpY2VSZWZzKGVqYkphcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGdldFJlZk5hbWVUb1NlcnZpY2VSZWYoKSB7Ci0gICAgcmV0dXJuIHRoaXMucmVmTmFtZVRvU2VydmljZVJlZk9ial87Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldFdzU2VydmljZVJlZnMoKXsKLSAgICByZXR1cm4gdGhpcy53c1NlcnZpY2VSZWZzXzsKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTAyZWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvamVjdC5FSkJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkoyRUVXZWJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2NsaWVudC5pbXBsLldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5IYW5kbGVyVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5VXRpbGl0eTsKLQotLyoKLSAqIFByb3ZpZGUgYSB3YXkgdG8gZXh0ZXJuYWxpemUgdGhlIGVkaXRlZCBmaWVsZHMgYW5kIGNyZWF0ZSBuZXcgaGFuZGxlcnMKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIC8vcHJpdmF0ZSBMaXN0IGhhbmRsZXJUYWJsZUl0ZW1zXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgb2xkV1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV87Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgbmV3V1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV87Ci0KLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlRWRpdE1vZGVsIHdzRWRpdE1vZGVsXzsKLQotICBwcml2YXRlIEhhc2h0YWJsZSBoYW5kbGVyc1RhYmxlXzsKLQotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3RfOwotCi0gIHByaXZhdGUgV2ViU2VydmljZXNSZXNvdXJjZSB3c0NsaWVudFJlc187Ci0KLSAgcHJpdmF0ZSBDb2xsZWN0aW9uIHdzU2VydmljZVJlZnNfOwotCi0gIHByaXZhdGUgSjJFRUVkaXRNb2RlbCBlZGl0TW9kZWxfOwotCi0gIHByaXZhdGUgT2JqZWN0IGFjY2Vzc29yS2V5XzsKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgIHRyeSB7Ci0KLSAgICAgIEphdmFFTUZOYXR1cmUgak1PRiA9IChKYXZhRU1GTmF0dXJlKSBKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUocHJvamVjdF8pOwotCi0gICAgICBvbGRXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIG5ld1dTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgICBpZiAod3NTZXJ2aWNlUmVmc18gIT0gbnVsbCkgewotICAgICAgICBJdGVyYXRvciB3c1JlZnNJdGVyID0gd3NTZXJ2aWNlUmVmc18uaXRlcmF0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c1NlcnZpY2VSZWZzXy5zaXplKCk7IGkrKykgewotCi0gICAgICAgICAgU2VydmljZVJlZiB3c1NlcnZpY2VSZWYgPSAoU2VydmljZVJlZikgd3NSZWZzSXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICBMaXN0IHdzSGFuZGxlcnMgPSB3c1NlcnZpY2VSZWYuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICBvbGRXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5wdXQod3NTZXJ2aWNlUmVmLCB3c0hhbmRsZXJzKTsKLSAgICAgICAgICBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5wdXQod3NTZXJ2aWNlUmVmLCBuZXcgQXJyYXlMaXN0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb24gZSA9IGhhbmRsZXJzVGFibGVfLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQotICAgICAgICAgIFN0cmluZyBzZXJ2aWNlUmVmTmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICBMaXN0IGhhbmRsZXJUYWJsZUl0ZW1zXyA9IChMaXN0KSBoYW5kbGVyc1RhYmxlXy5nZXQoc2VydmljZVJlZk5hbWUpOwotICAgICAgICAgIGlmIChoYW5kbGVyVGFibGVJdGVtc18gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZm9ybSBIYW5kbGVyIHRhYmxlcwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVyVGFibGVJdGVtc18uc2l6ZSgpOyBpKyspIHsKLQotICAgICAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKSBoYW5kbGVyVGFibGVJdGVtc18uZ2V0KGkpOwotICAgICAgICAgICAgICBPYmplY3Qgd3NNb2RlbFJlZiA9IGh0aS5nZXRXc0Rlc2NSZWYoKTsKLSAgICAgICAgICAgICAgaWYgKHdzTW9kZWxSZWYgIT0gbnVsbCAmJiB3c01vZGVsUmVmIGluc3RhbmNlb2YgU2VydmljZVJlZikgewotICAgICAgICAgICAgICAgIFNlcnZpY2VSZWYgd3NSZWYgPSAoU2VydmljZVJlZikgd3NNb2RlbFJlZjsKLQotICAgICAgICAgICAgICAgIE9iamVjdCBoYW5kbGVyID0gaHRpLmdldEhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsICYmIGhhbmRsZXIgaW5zdGFuY2VvZiBIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAvLyBjbG9uZSBpdAotICAgICAgICAgICAgICAgICAgSGFuZGxlciBjbG9uZWRIYW5kbGVyID0gKEhhbmRsZXIpIEV0b29sc0NvcHlVdGlsaXR5LmNyZWF0ZUNvcHkoKEhhbmRsZXIpIGhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgKChMaXN0KSBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5nZXQod3NSZWYpKS5hZGQoY2xvbmVkSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGl0Ci0gICAgICAgICAgICAgICAgICBXZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnkgd3NDbGllbnRGYWN0b3J5ID0gbmV3IFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeUltcGwoKTsKLSAgICAgICAgICAgICAgICAgIEhhbmRsZXIgbmV3SGFuZGxlciA9IHdzQ2xpZW50RmFjdG9yeS5jcmVhdGVIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgICBuZXdIYW5kbGVyLnNldEhhbmRsZXJOYW1lKGh0aS5nZXRIYW5kbGVyTmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpIEphdmFDbGFzc0ltcGwucmVmbGVjdChodGkuZ2V0SGFuZGxlckNsYXNzTmFtZSgpLCBqTU9GLmdldFJlc291cmNlU2V0KCkpOwotICAgICAgICAgICAgICAgICAgaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0hhbmRsZXIuc2V0SGFuZGxlckNsYXNzKGphdmFDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICgoTGlzdCkgbmV3V1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8uZ2V0KHdzUmVmKSkuYWRkKG5ld0hhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgaGFuZGxlcnMgdG8gcG9ydHMKLSAgICAgICAgYWRkSGFuZGxlcnNUb1NlcnZpY2VSZWZzKCk7Ci0gICAgICAgIGdldEoyRUVFZGl0TW9kZWwoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHNhdmUgdGhlIHJlc291cmNlCi0gICAgICAgIGlmIChKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb24ocHJvamVjdF8pID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSB7Ci0gICAgICAgICAgZWRpdE1vZGVsXy5zYXZlKGFjY2Vzc29yS2V5Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKHdzQ2xpZW50UmVzXyE9bnVsbCkKLSAgICAgICAgICAgIHdzQ2xpZW50UmVzXy5zYXZlKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgIH0KLSAgICBmaW5hbGx5IHsKLSAgICAgIGlmIChlZGl0TW9kZWxfICE9IG51bGwpIAotICAgICAgICBlZGl0TW9kZWxfLnJlbGVhc2VBY2Nlc3MoYWNjZXNzb3JLZXlfKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRIYW5kbGVyc1RvU2VydmljZVJlZnMoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGludCBrZXkgPSAwOwotICAgICAgRW51bWVyYXRpb24gcmVmc1RvSGFuZGxlcnMgPSBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5rZXlzKCk7Ci0gICAgICB3aGlsZSAocmVmc1RvSGFuZGxlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpIHJlZnNUb0hhbmRsZXJzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlUmVmICE9IG51bGwpIHsKLQotICAgICAgICAgIExpc3QgaGFuZGxlcnMgPSAoTGlzdCkgbmV3V1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8uZ2V0KHNlcnZpY2VSZWYpOwotICAgICAgICAgIExpc3QgbW9kZWxIYW5kbGVycyA9IChMaXN0KSBvbGRXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5nZXQoc2VydmljZVJlZik7Ci0gICAgICAgICAgbW9kZWxIYW5kbGVycy5jbGVhcigpOwotICAgICAgICAgIG1vZGVsSGFuZGxlcnMuYWRkQWxsKGhhbmRsZXJzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBoYW5kbGVyVGFibGVJdGVtcwotICAgKiAgICAgICAgICBUaGUgaGFuZGxlclRhYmxlSXRlbXMgdG8gc2V0LgotICAgKi8KLSAgLy8gIHB1YmxpYyB2b2lkIHNldEFsbEhhbmRsZXJzTGlzdChMaXN0IGhhbmRsZXJUYWJsZUl0ZW1zKSB7Ci0gIC8vICAgIHRoaXMuaGFuZGxlclRhYmxlSXRlbXNfID0gaGFuZGxlclRhYmxlSXRlbXM7Ci0gIC8vICB9Ci0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJzVGFibGUoSGFzaHRhYmxlIGhhbmRsZXJzVGFibGUpIHsKLSAgICB0aGlzLmhhbmRsZXJzVGFibGVfID0gaGFuZGxlcnNUYWJsZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd3NFZGl0TW9kZWwKLSAgICogICAgICAgICAgVGhlIHdzRWRpdE1vZGVsIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzRWRpdE1vZGVsKFdlYlNlcnZpY2VFZGl0TW9kZWwgd3NFZGl0TW9kZWwpIHsKLSAgICB0aGlzLndzRWRpdE1vZGVsXyA9IHdzRWRpdE1vZGVsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgdGhpcy5wcm9qZWN0XyA9IHByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXc0NsaWVudFJlc291cmNlKFdlYlNlcnZpY2VzUmVzb3VyY2Ugd3NSZXMpIHsKLSAgICB0aGlzLndzQ2xpZW50UmVzXyA9IHdzUmVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V3NTZXJ2aWNlUmVmcyhDb2xsZWN0aW9uIHdzUmVmcykgewotICAgIHRoaXMud3NTZXJ2aWNlUmVmc18gPSB3c1JlZnM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRKMkVFRWRpdE1vZGVsKCkgewotICAJYWNjZXNzb3JLZXlfID0gbmV3IE9iamVjdCgpOwotICAgIGlmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0XykpIHsKLSAgICAgIEoyRUVXZWJOYXR1cmVSdW50aW1lIHJ0ID0gSjJFRVdlYk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0Xyk7Ci0gICAgICBpZiAocnQgIT0gbnVsbCkgewotICAgICAgICBlZGl0TW9kZWxfID0gcnQuZ2V0V2ViQXBwRWRpdE1vZGVsRm9yV3JpdGUoYWNjZXNzb3JLZXlfKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3QocHJvamVjdF8pKXsKLSAgICAgIEFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlUnVudGltZSBydCA9IEFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3RfKTsKLSAgICAgIGlmIChydCE9bnVsbCkgewotICAgICAgICBlZGl0TW9kZWxfID0gcnQuZ2V0QXBwQ2xpZW50RWRpdE1vZGVsRm9yV3JpdGUoYWNjZXNzb3JLZXlfKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3QocHJvamVjdF8pKXsKLSAgICAgIEVKQk5hdHVyZVJ1bnRpbWUgcnQgPSBFSkJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUocHJvamVjdF8pOwotICAgICAgaWYocnQhPW51bGwpewotICAgICAgICBlZGl0TW9kZWxfID0gcnQuZ2V0RUpCRWRpdE1vZGVsRm9yV3JpdGUoYWNjZXNzb3JLZXlfKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1ZmEzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50V2l6YXJkV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17ICAKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldCBjbGllbnRXaWRnZXRfOwotICBwcml2YXRlIFByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0IHByZWZlcmVuY2VzV2lkZ2V0XzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAxMyBmb3IgdGhlIHRlc3Qgc2VydmljZSBjaGVja2JveCBvZiB0aGUgcHJvamVjdCBwYWdlKi8gIAotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfVEVTVF9TRVJWSUNFID0gIlBXUFIwMDEzIjsKLSAgcHJpdmF0ZSBCdXR0b24gdGVzdFNlcnZpY2VfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDE0IGZvciB0aGUgbW9uaXRvciBzZXJ2aWNlIGNoZWNrYm94IG9mIHRoZSBwcm9qZWN0IHBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfTU9OSVRPUl9TRVJWSUNFID0gIlBXUlBSMDAxNCI7Ci0gIHByaXZhdGUgQnV0dG9uIG1vbml0b3JTZXJ2aWNlOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDAxIGZvciB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX1BBR0UgPSAiUFdQUjAwMDEiOwotICAgIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1dGlscyAgICA9IG5ldyBVSVV0aWxzKCBtc2dVdGlscywgcGx1Z2luSWQgKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkICsgIi4iICsgIElORk9QT1BfUFdQUl9QQUdFICk7Ci0gIAkKLSAgCUNvbXBvc2l0ZSBjbGllbnRDb21wb3NpdGUgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMSApOwotICAJCi0gICAgY2xpZW50V2lkZ2V0XyA9IG5ldyBXZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldCgpOwotICAgIGNsaWVudFdpZGdldF8uYWRkQ29udHJvbHMoY2xpZW50Q29tcG9zaXRlLCBzdGF0dXNMaXN0ZW5lciApOwotICAgIAotICAgIAotICAgIC8vICBDcmVhdGUgdGVzdCBzZXJ2aWNlIGNoZWNrIGJveC4KLSAgICBDb21wb3NpdGUgdGVzdEdyb3VwID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKGNsaWVudENvbXBvc2l0ZSwxKTsKLSAgICAKLSAgICB0ZXN0U2VydmljZV8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggdGVzdEdyb3VwLCAiQ0hFQ0tCT1hfVEVTVF9XRUJTRVJWSUNFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdQUl9DSEVDS0JPWF9URVNUX1NFUlZJQ0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfVEVTVF9TRVJWSUNFICk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIG1vbml0b3Igc2VydmljZSBjaGVjayBib3guCi0gICAgbW9uaXRvclNlcnZpY2UgPSB1dGlscy5jcmVhdGVDaGVja2JveCh0ZXN0R3JvdXAsICJDSEVDS0JPWF9NT05JVE9SX1dFQlNFUlZJQ0UiLCAiVE9PTFRJUF9QV1BSX0NIRUNLQk9YX01PTklUT1JfU0VSVklDRSIsIElORk9QT1BfUFdQUl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBwcmVmZXJlbmNlcyBjb250cm9scy4KLSAgICBwcmVmZXJlbmNlc1dpZGdldF8gPSBuZXcgUHJlZmVyZW5jZXNTZWxlY3Rpb25XaWRnZXQoKTsKLSAgICBwcmVmZXJlbmNlc1dpZGdldF8uYWRkQ29udHJvbHMoIGNsaWVudENvbXBvc2l0ZSwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VDb250ZXh0KCBSZXNvdXJjZUNvbnRleHQgY29udGV4dCApCi0gIHsKLSAgICBwcmVmZXJlbmNlc1dpZGdldF8uc2V0UmVzb3VyY2VDb250ZXh0KCBjb250ZXh0ICk7Ci0gIH0KLSAgIAotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpCi0gIHsKLSAgICByZXR1cm4gcHJlZmVyZW5jZXNXaWRnZXRfLmdldFJlc291cmNlQ29udGV4dCgpOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBjbGllbnRXaWRnZXRfLnNldFR5cGVSdW50aW1lU2VydmVyKCBpZHMgKTsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCk7ICAKLSAgfQotICAKLSAgcHVibGljIEJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCB0ZXN0U2VydmljZV8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoIEJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgdGVzdFNlcnZpY2VfLnNldFNlbGVjdGlvbiggdmFsdWUuYm9vbGVhblZhbHVlKCkgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRNb25pdG9yU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4obW9uaXRvclNlcnZpY2UuZ2V0U2VsZWN0aW9uKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yU2VydmljZShCb29sZWFuIHZhbHVlKQotICB7Ci0gICAgbW9uaXRvclNlcnZpY2Uuc2V0U2VsZWN0aW9uKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjBlZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17ICAgIAotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIGdldFNjZW5hcmlvQ29udGV4dCgpLmdldFRlc3RXZWJTZXJ2aWNlKCkgKTsKLSAgfQotICAKLSAgcHVibGljIEJvb2xlYW4gZ2V0TW9uaXRvclNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRNb25pdG9yV2ViU2VydmljZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkKLSAgeyAKLSAgICByZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlQ29udGV4dCgpOwotICB9Ci0gIAotICAvLyBDdXJyZW50IFNjZW5hcmlvQ29udGV4dCBpcyB1c2VkIHRvIGRlZmF1bHQgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZC4gIFRoZSAKLSAgLy8gcHJvcGVydGllcyBpbiBTY2VuYXJpb0NvbnRleHQgYXJlIG1hcHBlZCBpbmRpdmlkdWFsLiAgVGhlcmVmb3JlLCBTY2VuYXJpb0NvbnRleHQKLSAgLy8gc2hvdWxkIG5vdCBhbHNvIGJlIG1hcHBlZC4KLSAgcHJvdGVjdGVkIFNjZW5hcmlvQ29udGV4dCBnZXRTY2VuYXJpb0NvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTY2VuYXJpb0NvbnRleHQoKTsKLSAgfQotICAKLSAgLy8gVE9ETyBTZXQgY2xpZW50IG5hbWUgZGVmYXVsdHMgaGVyZS4gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgICAgID0gZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgID0gcmVnaXN0cnkuZ2V0QWxsQ2xpZW50UnVudGltZXMoKVswXTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciAgID0gcmVnaXN0cnkuZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpWzBdOwotICAgIFR5cGVSdW50aW1lU2VydmVyICAgICAgICAgICAgcmVzdWx0ICAgPSBuZXcgVHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLSAgICAKLSAgICByZXN1bHQuc2V0VHlwZUlkKCB0eXBlICk7Ci0gICAgcmVzdWx0LnNldFJ1bnRpbWVJZCggcnVudGltZSApOwotICAgIHJlc3VsdC5zZXRTZXJ2ZXJJZCggc2VydmVyICk7IAotICAgIAotICAgIHJldHVybiByZXN1bHQ7ICAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzcwZjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsgICAgCi0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgdGVzdFNlcnZpY2VfOwotICBwcml2YXRlIGJvb2xlYW4gbW9uaXRvclNlcnZpY2U7Ci0gIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0ICAgcmVzb3VyY2VDb250ZXh0XzsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHNfOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHRlc3RTZXJ2aWNlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKCBib29sZWFuIHRlc3RTZXJ2aWNlICkKLSAgewotICAgIHRlc3RTZXJ2aWNlXyA9IHRlc3RTZXJ2aWNlOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBtb25pdG9yU2VydmljZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoYm9vbGVhbiBtb25pdG9yU2VydmljZSkKLSAgewotICAgIHRoaXMubW9uaXRvclNlcnZpY2UgPSBtb25pdG9yU2VydmljZTsKLSAgfQotICAKLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gICAgCi0gICAgcmV0dXJuIHJlc291cmNlQ29udGV4dF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQ29udGV4dCggUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgKQotICB7Ci0gICAgcmVzb3VyY2VDb250ZXh0XyA9IGNvbnRleHQ7ICAKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgeyAgICAKLSAgICByZXR1cm4gY2xpZW50SWRzXzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzICkKLSAgewotICAgIGNsaWVudElkc18gPSBjbGllbnRJZHM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1ZGEwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLS8qKgotICogQ29uZmlnQ2xpZW50SGFuZGxlcnNUcmVlV2lkZ2V0Ci0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLQotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbnVsbDsKLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcl87Ci0gIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0dlblNrZWxldG9uRW5hYmxlZF87Ci0gIHByaXZhdGUgU3RyaW5nIG91dHB1dExvY2F0aW9uXzsKLSAgcHJpdmF0ZSBDb21ibyB3ZWJTZXJ2aWNlUmVmQ29tYm9fOwotICBwcml2YXRlIFRhYmxlIGhhbmRsZXJzVGFibGVfOwotICBwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyXzsKLSAgcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uXzsKLSAgcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uXzsKLSAgcHJpdmF0ZSBCdXR0b24gZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl87Ci0gIHByaXZhdGUgQ29tYm8gc291cmNlTG9jYXRpb25Db21ib187Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgcGF0aHNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHdzUmVmc1RvSGFuZGxlcnNfOwotICBwcml2YXRlIEhhc2h0YWJsZSByZWZOYW1lVG9TZXJ2aWNlUmVmXzsKLSAgcHJpdmF0ZSBWZWN0b3Igb3JkZXJlZEhhbmRsZXJzXzsKLSAgLy9wcml2YXRlIFNlcnZpY2VSZWYgc2VydmljZVJlZl87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VSZWZOYW1lXzsKLSAgcHJpdmF0ZSBpbnQgREVGQVVMVF9DT0xVTU5fV0lEVEggPSAxNTA7Ci0KLSAgLy8gLS0tLVRPT0xUSVBTIFNlY3Rpb24tLS0tCi0gIC8qIENPTlRFWFRfSUQgSERMUjAwMDEgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfSERMUl9XU19IQU5ETEVSUyA9ICJIRExSMDAwMSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9FRElUX1dTX0hBTkRMRVJTID0gIlRPT0xUSVBfRURJVF9XU19IQU5ETEVSUyI7Ci0KLSAgLyogQ09OVEVYVF9JRCBIRExSMDAwMiBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9IRExSX0dFTl9TS0VMRVRPTiA9ICJIRExSMDAwMiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9CVVRUT05fR0VOX1NLRUxFVE9OID0gIlRPT0xUSVBfQlVUVE9OX0dFTl9TS0VMRVRPTiI7Ci0KLSAgLyogQ09OVEVYVF9JRCBIRExSMDAwMyBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9DT01CT19TT1VSQ0VfTE9DID0gIkhETFIwMDAzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX0NPTUJPX1NPVVJDRV9MT0MgPSAiVE9PTFRJUF9DT01CT19TT1VSQ0VfTE9DIjsKLQotICAvKiBDT05URVhUX0lEIEhETFIwMDA0IGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1dTX0NMSUVOVF9SRUYgPSAiSERMUjAwMDQiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfV1NfQ0xJRU5UX1JFRiA9ICJUT09MVElQX1dTX0NMSUVOVF9SRUYiOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHB1YmxpYyBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0KCkgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIFVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzXywgcGx1Z2luSWRfKTsKLQotICAgIHBhcmVudF8gPSBwYXJlbnQ7Ci0gICAgc3RhdHVzTGlzdGVuZXJfID0gc3RhdHVzTGlzdGVuZXI7Ci0KLSAgICAvLyBXZWIgc2VydmljZSByZWZlcmVuY2UgY29tYm8KLSAgICBDb21wb3NpdGUgd2ViU2VydmljZVJlZkNvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnRfLCAyKTsKLSAgICB3ZWJTZXJ2aWNlUmVmQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyh3ZWJTZXJ2aWNlUmVmQ29tcCwgIkxBQkVMX0NPTUJPX1dTX0NMSUVOVF9SRUYiLCBUT09MVElQX1dTX0NMSUVOVF9SRUYsIElORk9QT1BfV1NfQ0xJRU5UX1JFRiwKLSAgICAgICAgU1dULlJFQURfT05MWSk7Ci0gICAgd2ViU2VydmljZVJlZkNvbWJvXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGhhbmRsZVdlYlNlcnZpY2VSZWZDb21ibyhldnQpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgQ29tcG9zaXRlIGRpc3BsYXlDb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnRfLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGRpc3BsYXlDb21wLnNldExheW91dChncmlkbGF5b3V0KTsKLSAgICBkaXNwbGF5Q29tcC5zZXRMYXlvdXREYXRhKHVpVXRpbHMuY3JlYXRlRmlsbEFsbCgpKTsKLQotICAgIENvbXBvc2l0ZSBoYW5kbGVyc0NvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShkaXNwbGF5Q29tcCwgMSk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HCi0gICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0gICAgaGFuZGxlcnNDb21wLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIGhhbmRsZXJzQ29tcC5zZXRTaXplKDEzMCwgNjAwKTsKLQotICAgIENvbXBvc2l0ZSBidXR0b25zQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKGRpc3BsYXlDb21wLCAxKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIGJ1dHRvbnNDb21wLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotCi0gICAgVGV4dCBoYW5kbGVyc1RleHQgPSBuZXcgVGV4dChoYW5kbGVyc0NvbXAsIFNXVC5SRUFEX09OTFkpOwotICAgIGhhbmRsZXJzVGV4dC5zZXRUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9IQU5ETEVSU19DT05GSUciKSk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgaGFuZGxlcnNUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgaGFuZGxlcnNUYWJsZV8gPSB1aVV0aWxzLmNyZWF0ZVRhYmxlKGhhbmRsZXJzQ29tcCwgVE9PTFRJUF9FRElUX1dTX0hBTkRMRVJTLCBJTkZPUE9QX0hETFJfV1NfSEFORExFUlMsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgaGFuZGxlcnNUYWJsZV8uc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICBoYW5kbGVyc1RhYmxlXy5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAvLyBlbXB0eSBzcGFjZQotICAgIExhYmVsIHdzTGFiZWwgPSBuZXcgTGFiZWwoYnV0dG9uc0NvbXAsIFNXVC5OT05FKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICB3c0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgQnV0dG9uIG1vdmVVcEJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9NT1ZFX1VQIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBtb3ZlVXBCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkZGF0YSk7Ci0gICAgbW92ZVVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGFuZGxlTW92ZVVwQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEJ1dHRvbiBtb3ZlRG93bkJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9NT1ZFX0RPV04iLCBudWxsLCBudWxsKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIG1vdmVEb3duQnV0dG9uLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIG1vdmVEb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGFuZGxlTW92ZURvd25CdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotCi0gICAgLy8gZW1wdHkgc3BhY2UKLSAgICB3c0xhYmVsID0gbmV3IExhYmVsKGJ1dHRvbnNDb21wLCBTV1QuTk9ORSk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgd3NMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGFkZEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uc0NvbXAsICJMQUJFTF9CVVRUT05fQUREIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBhZGRCdXR0b25fLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIGFkZEJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotCi0gICAgcmVtb3ZlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9SRU1PVkUiLCBudWxsLCBudWxsKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIHJlbW92ZUJ1dHRvbl8uc2V0TGF5b3V0RGF0YShncmlkZGF0YSk7Ci0gICAgcmVtb3ZlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgZW5hYmxlUmVtb3ZlKGZhbHNlKTsKLQotICAgIC8vIHRhYmxlIHN0dWZmCi0gICAgU3RyaW5nW10gY29sdW1uc18gPSBuZXcgU3RyaW5nW10geyBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfSEFORExFUl9OQU1FIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJMRV9IQU5ETEVSX0NMQVNTIil9OwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zXy5sZW5ndGg7IGkrKykgewotICAgICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oaGFuZGxlcnNUYWJsZV8sIGkpOwotICAgICAgdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5zX1tpXSk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotICAgICAgdGFibGVDb2x1bW4uc2V0V2lkdGgoREVGQVVMVF9DT0xVTU5fV0lEVEgpOwotICAgICAgdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotICAgIH0KLQotICAgIHRhYmxlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcihoYW5kbGVyc1RhYmxlXyk7Ci0gICAgQ29udHJvbCBjb250cm9sID0gdGFibGVWaWV3ZXJfLmdldENvbnRyb2woKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgdGFibGVWaWV3ZXJfLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uc18pOwotICAgIHRhYmxlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IExpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgdGFibGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IExpc3RMYWJlbFByb3ZpZGVyKCkpOwotICAgIHRhYmxlVmlld2VyXy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGVuYWJsZVJlbW92ZSh0cnVlKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIC8vIGdlbiBza2VsZXRvbiBjaGVjayBib3gKLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3gocGFyZW50XywgIkxBQkVMX0JVVFRPTl9HRU5fU0tFTEVUT04iLCBUT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT04sIElORk9QT1BfSERMUl9HRU5fU0tFTEVUT04pOwotICAgIGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlR2VuU2tlbGV0b25SYWRpb0J1dHRvbigpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgLy8gc291cmNlIGxvY2F0aW9uIGNvbWJvCi0gICAgQ29tcG9zaXRlIHNvdXJjZUxvY2F0aW9uQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHBhcmVudF8sIDIpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyhzb3VyY2VMb2NhdGlvbkNvbXAsICJMQUJFTF9DT01CT19TT1VSQ0VfTE9DIiwgVE9PTFRJUF9DT01CT19TT1VSQ0VfTE9DLCBJTkZPUE9QX0NPTUJPX1NPVVJDRV9MT0MsCi0gICAgICAgIFNXVC5SRUFEX09OTFkpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlU291cmNlTG9jYXRpb25Db21ibyhldnQpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvLyBDYWxsZWQgYXQgc3RhcnQKLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlSGFuZGxlcnNUYWJsZSgpIHsKLSAgICB0cnkgewotCi0gICAgICBpbnQgc2l6ZU9mSGFuZGxlcnMgPSB3c1JlZnNUb0hhbmRsZXJzXy5zaXplKCk7Ci0gICAgICBTdHJpbmdbXSB3c1JlZnMgPSBuZXcgU3RyaW5nW3NpemVPZkhhbmRsZXJzXTsKLQotICAgICAgU3RyaW5nW10gd3NSZWZOYW1lcyA9IChTdHJpbmdbXSkgd3NSZWZzVG9IYW5kbGVyc18ua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgIHdlYlNlcnZpY2VSZWZDb21ib18uc2V0SXRlbXMod3NSZWZOYW1lcyk7Ci0gICAgICB3ZWJTZXJ2aWNlUmVmQ29tYm9fLnNlbGVjdCgwKTsKLQotICAgICAgaWYgKHNpemVPZkhhbmRsZXJzIDwgMSkgewotICAgICAgICB3ZWJTZXJ2aWNlUmVmQ29tYm9fLnNlbGVjdCgwKTsKLSAgICAgICAgd2ViU2VydmljZVJlZkNvbWJvXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoc2VydmljZVJlZk5hbWVfICE9IG51bGwpIHsKLSAgICAgICAgICBpbnQgaW5kZXggPSB3ZWJTZXJ2aWNlUmVmQ29tYm9fLmluZGV4T2Yoc2VydmljZVJlZk5hbWVfKTsKLSAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHdlYlNlcnZpY2VSZWZDb21ib18uc2VsZWN0KGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgd2ViU2VydmljZVJlZkNvbWJvXy5zZWxlY3QoMCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGdldCB3ZWJTZXJ2aWNlUmVmIGhpbnQKLSAgICAgIFN0cmluZyB3c1JlZiA9IHdlYlNlcnZpY2VSZWZDb21ib18uZ2V0VGV4dCgpOwotCi0gICAgICBpZiAod3NSZWZzVG9IYW5kbGVyc18uZ2V0KHdzUmVmKSAhPSBudWxsKSB7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSAoVmVjdG9yKSB3c1JlZnNUb0hhbmRsZXJzXy5nZXQod3NSZWYpOwotICAgICAgICB0YWJsZVZpZXdlcl8uc2V0SW5wdXQob3JkZXJlZEhhbmRsZXJzXyk7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJzLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QWxsSGFuZGxlcnNMaXN0KCkgewotICAgIC8vIGNvbnZlcnQgdG8gYSBBcnJheUxpc3QgYW5kIHJldHVybiBhcyBMaXN0Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChvcmRlcmVkSGFuZGxlcnNfICE9IG51bGwgJiYgIW9yZGVyZWRIYW5kbGVyc18uaXNFbXB0eSgpKSBsaXN0LmFkZEFsbChvcmRlcmVkSGFuZGxlcnNfKTsKLQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNnZXRTdGF0dXMoKQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgU3RhdHVzIGZpbmFsU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICByZXR1cm4gZmluYWxTdGF0dXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIEFkZEhhbmRsZXJEaWFsb2cgZGlhbG9nID0gZGlhbG9nID0gbmV3IEFkZEhhbmRsZXJEaWFsb2cocGFyZW50Xy5nZXRTaGVsbCgpLCB0cnVlKTsKLSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSggNTAwLCAyMDAgKTsKLSAgICAKLSAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQotICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGRpYWxvZy5nZXROYW1lKCk7Ci0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZGlhbG9nLmdldENsYXNzTmFtZSgpOwotCi0gICAgICBIYW5kbGVyVGFibGVJdGVtIGhpID0gbmV3IEhhbmRsZXJUYWJsZUl0ZW0oKTsKLSAgICAgIGhpLnNldEhhbmRsZXJOYW1lKG5hbWUpOwotICAgICAgaGkuc2V0SGFuZGxlckNsYXNzTmFtZShjbGFzc05hbWUpOwotICAgICAgU3RyaW5nIHdzUmVmTmFtZSA9IHdlYlNlcnZpY2VSZWZDb21ib18uZ2V0VGV4dCgpOwotICAgICAgU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpIHJlZk5hbWVUb1NlcnZpY2VSZWZfLmdldCh3c1JlZk5hbWUpOwotICAgICAgaGkuc2V0V3NEZXNjUmVmKHNlcnZpY2VSZWYpOwotCi0gICAgICBvcmRlcmVkSGFuZGxlcnNfID0gKFZlY3Rvcikgd3NSZWZzVG9IYW5kbGVyc18uZ2V0KHdzUmVmTmFtZSk7Ci0gICAgICBvcmRlcmVkSGFuZGxlcnNfLmFkZChoaSk7Ci0KLSAgICB9Ci0KLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICBoYW5kbGVEZWxldGVLZXlQcmVzc2VkKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlTW92ZVVwQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGludCBpbmRleCA9IHRhYmxlVmlld2VyXy5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3RlZCA9IHRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzUmVmc1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlUmVmQ29tYm9fLmdldFRleHQoKSk7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBvcmRlcmVkSGFuZGxlcnNfLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXggLSAxKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVNb3ZlRG93bkJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0KLSAgICBpbnQgaW5kZXggPSB0YWJsZVZpZXdlcl8uZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0ZWQgPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICBpZiAoaW5kZXggPCBvcmRlcmVkSGFuZGxlcnNfLnNpemUoKSAtIDEpIHsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzUmVmc1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlUmVmQ29tYm9fLmdldFRleHQoKSk7ICAgICAgICAKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IG9yZGVyZWRIYW5kbGVyc18ucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXy5pbnNlcnRFbGVtZW50QXQob2JqZWN0LCBpbmRleCArIDEpOwotICAgICAgICB0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlU291cmNlTG9jYXRpb25Db21ibyhTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgIG91dHB1dExvY2F0aW9uXyA9IHNvdXJjZUxvY2F0aW9uQ29tYm9fLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUdlblNrZWxldG9uUmFkaW9CdXR0b24oKSB7Ci0gICAgaWYgKGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmlzRW5hYmxlZCgpKSB7Ci0gICAgICBpZiAoZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfID0gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF8gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVXZWJTZXJ2aWNlUmVmQ29tYm8oU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGlmICh3ZWJTZXJ2aWNlUmVmQ29tYm9fLmlzRW5hYmxlZCgpKSB7Ci0gICAgICBTdHJpbmcgd2ViU2VydmljZVJlZk5hbWUgPSB3ZWJTZXJ2aWNlUmVmQ29tYm9fLmdldFRleHQoKTsKLSAgICAgIFZlY3RvciBobmRsZXJzID0gKFZlY3Rvcikgd3NSZWZzVG9IYW5kbGVyc18uZ2V0KHdlYlNlcnZpY2VSZWZOYW1lKTsKLSAgICAgIC8vSGFuZGxlclRhYmxlSXRlbSBpdGVtID0gKEhhbmRsZXJUYWJsZUl0ZW0paG5kbGVycy5nZXQoMCk7Ci0gICAgICAvL3NlcnZpY2VSZWZfID0gKFNlcnZpY2VSZWYpaXRlbS5nZXRXc0Rlc2NSZWYoKTsKLSAgICAgIGlmIChobmRsZXJzICE9IG51bGwpIHsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnNldElucHV0KGhuZGxlcnMpOwotICAgICAgICB0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzR2VuU2tlbGV0b25FbmFibGVkXy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkXygpIHsKLSAgICByZXR1cm4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIExpc3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEhhbmRsZXJUYWJsZUl0ZW0pIHsKLSAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBodGkgPSAoSGFuZGxlclRhYmxlSXRlbSkgb2JqZWN0OwotICAgICAgICBpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCi0gICAgICAgICAgcmV0dXJuIGh0aS5nZXRIYW5kbGVyTmFtZSgpICE9IG51bGwgPyBodGkuZ2V0SGFuZGxlck5hbWUoKSA6ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsgcmV0dXJuIGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkgIT0gbnVsbCA/IGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkgOiAiIjsgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlUmVtb3ZlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgIHJlbW92ZUJ1dHRvbl8uc2V0RW5hYmxlZChlbmFibGVkICYmICF0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZlY3RvcikgeyByZXR1cm4gKChWZWN0b3IpIGVsZW1lbnQpLnRvQXJyYXkoKTsgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKSB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLSAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IGhhbmRsZXJzVGFibGVfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpbnQgc2VsZWN0aW9uQ291bnQgPSBoYW5kbGVyc1RhYmxlXy5nZXRJdGVtQ291bnQoKTsKLQotICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzUmVmc1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlUmVmQ29tYm9fLmdldFRleHQoKSk7Ci0gICAgICBvcmRlcmVkSGFuZGxlcnNfLnJlbW92ZShzZWxlY3Rpb25JbmRleCk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICB0cnkgewotICAgICAgdGFibGVWaWV3ZXJfLnNldElucHV0KG51bGwpOwotICAgICAgaWYgKG9yZGVyZWRIYW5kbGVyc18gIT0gbnVsbCkgdGFibGVWaWV3ZXJfLnNldElucHV0KG9yZGVyZWRIYW5kbGVyc18pOwotICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEdlblNrZWxldG9uRW5hYmxlZChib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkKSB7Ci0gICAgdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF8gPSBpc0dlblNrZWxldG9uRW5hYmxlZDsKLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5zZXRTZWxlY3Rpb24oaXNHZW5Ta2VsZXRvbkVuYWJsZWQpOwotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5Ta2VsZXRvbkVuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U291cmNlT3V0cHV0TG9jYXRpb24oSVBhdGhbXSBsb2NhdGlvbnMpIHsKLSAgICBpZiAobG9jYXRpb25zWzBdIT1udWxsKQotICAgICAgdGhpcy5vdXRwdXRMb2NhdGlvbl8gPSBsb2NhdGlvbnNbMF0udG9TdHJpbmcoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm47Ci0gICAgCi0gICAgU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2xvY2F0aW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBwYXRoc1tpXSA9IGxvY2F0aW9uc1tpXS50b1N0cmluZygpOwotICAgICAgcGF0aHNUYWJsZV8ucHV0KHBhdGhzW2ldLCBsb2NhdGlvbnNbaV0pOwotICAgIH0KLSAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5zZXRJdGVtcyhwYXRocyk7Ci0gICAgc291cmNlTG9jYXRpb25Db21ib18uc2VsZWN0KDApOwotCi0gIH0KLQotICBwdWJsaWMgSVBhdGggZ2V0U291cmNlT3V0cHV0TG9jYXRpb24oKSB7Ci0gICAgSVBhdGggb3V0cHV0UGF0aCA9IChJUGF0aCkgcGF0aHNUYWJsZV8uZ2V0KG91dHB1dExvY2F0aW9uXyk7Ci0gICAgcmV0dXJuIG91dHB1dFBhdGg7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVyQ2xhc3NOYW1lcy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRIYW5kbGVyQ2xhc3NOYW1lcygpIHsKLSAgICBWZWN0b3IgaGFuZGxlckNsYXNzZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBFbnVtZXJhdGlvbiBlID0gd3NSZWZzVG9IYW5kbGVyc18ua2V5cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0KLSAgICAgIFN0cmluZyB3c1JlZk5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBvcmRlcmVkSGFuZGxlcnNfID0gKFZlY3Rvcikgd3NSZWZzVG9IYW5kbGVyc18uZ2V0KHdzUmVmTmFtZSk7Ci0KLSAgICAgIGlmIChvcmRlcmVkSGFuZGxlcnNfICE9IG51bGwpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcmVkSGFuZGxlcnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBodGkgPSAoSGFuZGxlclRhYmxlSXRlbSkgb3JkZXJlZEhhbmRsZXJzXy5nZXQoaSk7Ci0gICAgICAgICAgaGFuZGxlckNsYXNzZXMuYWRkKGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10paGFuZGxlckNsYXNzZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzUmVmc1RvSGFuZGxlcnNfLgotICAgKi8KLSAgcHVibGljIEhhc2h0YWJsZSBnZXRXc1JlZnNUb0hhbmRsZXJzKCkgewotICAgIHJldHVybiB3c1JlZnNUb0hhbmRsZXJzXzsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd3NSZWZzVG9IYW5kbGVyc18KLSAgICogICAgICAgICAgVGhlIHdzUmVmc1RvSGFuZGxlcnNfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzUmVmc1RvSGFuZGxlcnMoSGFzaHRhYmxlIHdzUmVmc1RvSGFuZGxlcnNBcnJheSkgewotCi0gICAgd3NSZWZzVG9IYW5kbGVyc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdHJ5IHsKLQotICAgICAgaWYgKHdzUmVmc1RvSGFuZGxlcnNBcnJheSAhPSBudWxsKSB7Ci0gICAgICAgIGludCBzaXplT2ZIYW5kbGVycyA9IHdzUmVmc1RvSGFuZGxlcnNBcnJheS5zaXplKCk7Ci0gICAgICAgIFN0cmluZ1tdIHdzUmVmcyA9IG5ldyBTdHJpbmdbc2l6ZU9mSGFuZGxlcnNdOwotICAgICAgICAvLyBzdG9yZSB0aGUgd3NSZWZzCi0gICAgICAgIEVudW1lcmF0aW9uIHdzUmVmID0gd3NSZWZzVG9IYW5kbGVyc0FycmF5LmtleXMoKTsKLSAgICAgICAgd2hpbGUgKHdzUmVmLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgU3RyaW5nIHdzUmVmTmFtZSA9IChTdHJpbmcpIHdzUmVmLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlcnMgPSAoSGFuZGxlclRhYmxlSXRlbVtdKSB3c1JlZnNUb0hhbmRsZXJzQXJyYXkuZ2V0KHdzUmVmTmFtZSk7Ci0gICAgICAgICAgLy8gcHJvY2VzcyB0aGUgaGFuZGxlcnNUYWJsZQotICAgICAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgb3JkZXJlZEhhbmRsZXJzXy5hZGQoaGFuZGxlcnNbaV0pOwotICAgICAgICAgIH0KLSAgICAgICAgICB3c1JlZnNUb0hhbmRsZXJzXy5wdXQod3NSZWZOYW1lLCBvcmRlcmVkSGFuZGxlcnNfKTsKLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwb3B1bGF0ZUhhbmRsZXJzVGFibGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVJlZk5hbWUoU3RyaW5nIHdzUmVmTmFtZSkgewotICAgIHNlcnZpY2VSZWZOYW1lXyA9IHdzUmVmTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlZk5hbWVUb1NlcnZpY2VSZWYoSGFzaHRhYmxlIHJlZk5hbWUyU0YpIHsKLSAgICB0aGlzLnJlZk5hbWVUb1NlcnZpY2VSZWZfID0gcmVmTmFtZTJTRjsKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhOWJiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSGFuZGxlclRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotLyoqCi0gKiBDb25maWdTZXJ2aWNlSGFuZGxlcnNUcmVlV2lkZ2V0Ci0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXyA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXJfOwotICBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRfOwotICBwcml2YXRlIGJvb2xlYW4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICBwcml2YXRlIFN0cmluZyBvdXRwdXRMb2NhdGlvbl87Ci0KLSAgcHJpdmF0ZSBUYWJsZSBoYW5kbGVyc1RhYmxlXzsKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcl87Ci0gIHByaXZhdGUgQ29tYm8gd2ViU2VydmljZURlc2NDb21ib187Ci0gIHByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIGdlblNrZWxldG9uUmFkaW9CdXR0b25fOwotICBwcml2YXRlIENvbWJvIHNvdXJjZUxvY2F0aW9uQ29tYm9fOwotICBwcml2YXRlIFRleHQgdGV4dF87IC8vIHNlbGVjdGVkIFRleHQKLQotICBwcml2YXRlIEhhbmRsZXJUYWJsZUl0ZW1bXSBoYW5kbGVyczsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcGF0aHNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHdzRGVzY1RvSGFuZGxlcnNfOwotICBwcml2YXRlIEhhc2h0YWJsZSB3c0Rlc2NUb1BvcnRzXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb25OYW1lXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBWZWN0b3Igb3JkZXJlZEhhbmRsZXJzXzsKLQotICBwcml2YXRlIGludCBERUZBVUxUX0NPTFVNTl9XSURUSCA9IDkwOwotCi0gIC8vIC0tLS1UT09MVElQUyBTZWN0aW9uLS0tLQotICAvKiBDT05URVhUX0lEIFNITEQwMDAxIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX0hETFJfV1NfSEFORExFUlMgPSAiU0hETDAwMDEiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfRURJVF9XU19IQU5ETEVSUyA9ICJUT09MVElQX0VESVRfV1NfSEFORExFUlMiOwotCi0gIC8qIENPTlRFWFRfSUQgU0hETDAwMDIgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfSERMUl9HRU5fU0tFTEVUT04gPSAiU0hETDAwMDIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfQlVUVE9OX0dFTl9TS0VMRVRPTiA9ICJUT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT04iOwotCi0gIC8qIENPTlRFWFRfSUQgU0hETDAwMDMgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfQ09NQk9fU09VUkNFX0xPQyA9ICJTSERMMDAwMyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9DT01CT19TT1VSQ0VfTE9DID0gIlRPT0xUSVBfQ09NQk9fU09VUkNFX0xPQyI7Ci0KLSAgLyogQ09OVEVYVF9JRCBTSERMMDAwNCBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9XU19TRVJWSUNFX0RFU0MgPSAiU0hETDAwMDQiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfV1NfU0VSVklDRV9ERVNDID0gIlRPT0xUSVBfV1NfU0VSVklDRV9ERVNDIjsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwdWJsaWMgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQoKSB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgVUlVdGlscyB1aVV0aWxzID0gbmV3IFVJVXRpbHMobXNnVXRpbHNfLCBwbHVnaW5JZF8pOwotCi0gICAgcGFyZW50XyA9IHBhcmVudDsKLSAgICBzdGF0dXNMaXN0ZW5lcl8gPSBzdGF0dXNMaXN0ZW5lcjsKLQotICAgIC8vIFdlYiBzZXJ2aWNlIHJlZmVyZW5jZSBjb21ibwotICAgIENvbXBvc2l0ZSB3ZWJTZXJ2aWNlUmVmQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHBhcmVudF8sIDIpOwotICAgIHdlYlNlcnZpY2VEZXNjQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyh3ZWJTZXJ2aWNlUmVmQ29tcCwgIkxBQkVMX0NPTUJPX1dTX1NFUlZJQ0VfREVTQyIsIFRPT0xUSVBfV1NfU0VSVklDRV9ERVNDLCBUT09MVElQX1dTX1NFUlZJQ0VfREVTQywKLSAgICAgICAgU1dULlJFQURfT05MWSk7Ci0gICAgd2ViU2VydmljZURlc2NDb21ib18uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotICAgICAgICBoYW5kbGVXZWJTZXJ2aWNlRGVzY0NvbWJvKGV2dCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBDb21wb3NpdGUgZGlzcGxheUNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGRpc3BsYXlDb21wLnNldExheW91dChncmlkbGF5b3V0KTsKLSAgICBkaXNwbGF5Q29tcC5zZXRMYXlvdXREYXRhKHVpVXRpbHMuY3JlYXRlRmlsbEFsbCgpKTsKLQotICAgIENvbXBvc2l0ZSBoYW5kbGVyc0NvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShkaXNwbGF5Q29tcCwgMSk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HCi0gICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0gICAgaGFuZGxlcnNDb21wLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIGhhbmRsZXJzQ29tcC5zZXRTaXplKDEzMCwgNjAwKTsKLQotICAgIENvbXBvc2l0ZSBidXR0b25zQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKGRpc3BsYXlDb21wLCAxKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIGJ1dHRvbnNDb21wLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotCi0gICAgVGV4dCBoYW5kbGVyc1RleHQgPSBuZXcgVGV4dChoYW5kbGVyc0NvbXAsIFNXVC5SRUFEX09OTFkpOwotICAgIGhhbmRsZXJzVGV4dC5zZXRUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9IQU5ETEVSU19DT05GSUciKSk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgaGFuZGxlcnNUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgaGFuZGxlcnNUYWJsZV8gPSB1aVV0aWxzLmNyZWF0ZVRhYmxlKGhhbmRsZXJzQ29tcCwgVE9PTFRJUF9FRElUX1dTX0hBTkRMRVJTLCBJTkZPUE9QX0hETFJfV1NfSEFORExFUlMsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgaGFuZGxlcnNUYWJsZV8uc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICBoYW5kbGVyc1RhYmxlXy5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAvLyBlbXB0eSBzcGFjZQotICAgIExhYmVsIHdzTGFiZWwgPSBuZXcgTGFiZWwoYnV0dG9uc0NvbXAsIFNXVC5OT05FKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICB3c0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgQnV0dG9uIG1vdmVVcEJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9NT1ZFX1VQIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBtb3ZlVXBCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkZGF0YSk7Ci0gICAgbW92ZVVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGFuZGxlTW92ZVVwQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEJ1dHRvbiBtb3ZlRG93bkJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9NT1ZFX0RPV04iLCBudWxsLCBudWxsKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIG1vdmVEb3duQnV0dG9uLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIG1vdmVEb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGFuZGxlTW92ZURvd25CdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotCi0gICAgLy8gZW1wdHkgc3BhY2UKLSAgICB3c0xhYmVsID0gbmV3IExhYmVsKGJ1dHRvbnNDb21wLCBTV1QuTk9ORSk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgd3NMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGFkZEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uc0NvbXAsICJMQUJFTF9CVVRUT05fQUREIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBhZGRCdXR0b25fLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIGFkZEJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotCi0gICAgcmVtb3ZlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9SRU1PVkUiLCBudWxsLCBudWxsKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIHJlbW92ZUJ1dHRvbl8uc2V0TGF5b3V0RGF0YShncmlkZGF0YSk7Ci0gICAgcmVtb3ZlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgZW5hYmxlUmVtb3ZlKGZhbHNlKTsKLQotICAgIC8vIHRhYmxlIHN0dWZmIGhlcmUKLSAgICBTdHJpbmdbXSBjb2x1bW5zXyA9IG5ldyBTdHJpbmdbXSB7IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9IQU5ETEVSX05BTUUiKSwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkxFX0hBTkRMRVJfQ0xBU1MiKSwKLSAgICAgICAgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX0hBTkRMRVJfUE9SVCIpfTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspIHsKLSAgICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGhhbmRsZXJzVGFibGVfLCBpKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFRleHQoY29sdW1uc19baV0pOwotICAgICAgdGFibGVDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFdpZHRoKERFRkFVTFRfQ09MVU1OX1dJRFRIKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICB0YWJsZVZpZXdlcl8gPSBuZXcgVGFibGVWaWV3ZXIoaGFuZGxlcnNUYWJsZV8pOwotICAgIENvbnRyb2wgY29udHJvbCA9IHRhYmxlVmlld2VyXy5nZXRDb250cm9sKCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHRhYmxlVmlld2VyXy5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtbnNfKTsKLSAgICB0YWJsZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotICAgIHRhYmxlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMaXN0TGFiZWxQcm92aWRlcigpKTsKLSAgICB0YWJsZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBlbmFibGVSZW1vdmUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3gocGFyZW50XywgIkxBQkVMX0JVVFRPTl9HRU5fU0tFTEVUT04iLCBUT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT04sIElORk9QT1BfSERMUl9HRU5fU0tFTEVUT04pOwotICAgIGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlR2VuU2tlbGV0b25SYWRpb0J1dHRvbigpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgQ29tcG9zaXRlIHNvdXJjZUxvY2F0aW9uQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHBhcmVudF8sIDIpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyhzb3VyY2VMb2NhdGlvbkNvbXAsICJMQUJFTF9DT01CT19TT1VSQ0VfTE9DIiwgVE9PTFRJUF9DT01CT19TT1VSQ0VfTE9DLCBJTkZPUE9QX0NPTUJPX1NPVVJDRV9MT0MsCi0gICAgICAgIFNXVC5SRUFEX09OTFkpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlU291cmNlTG9jYXRpb25Db21ibyhldnQpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvLyBDYWxsZWQgYXQgc3RhcnQKLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlSGFuZGxlcnNUYWJsZSgpIHsKLSAgICB0cnkgewotCi0gICAgICBpbnQgc2l6ZU9mSGFuZGxlcnMgPSB3c0Rlc2NUb0hhbmRsZXJzXy5zaXplKCk7Ci0gICAgICBTdHJpbmdbXSB3c1JlZnMgPSBuZXcgU3RyaW5nW3NpemVPZkhhbmRsZXJzXTsKLQotICAgICAgU3RyaW5nW10gd3NSZWZOYW1lcyA9IChTdHJpbmdbXSkgd3NEZXNjVG9IYW5kbGVyc18ua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgIHdlYlNlcnZpY2VEZXNjQ29tYm9fLnNldEl0ZW1zKHdzUmVmTmFtZXMpOwotCi0gICAgICBpZiAoc2l6ZU9mSGFuZGxlcnMgPCAxKSB7Ci0gICAgICAgIHdlYlNlcnZpY2VEZXNjQ29tYm9fLnNlbGVjdCgwKTsKLSAgICAgICAgd2ViU2VydmljZURlc2NDb21ib18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uTmFtZV8gIT0gbnVsbCkgewotICAgICAgICAgIGludCBpbmRleCA9IHdlYlNlcnZpY2VEZXNjQ29tYm9fLmluZGV4T2YoZGVzY3JpcHRpb25OYW1lXyk7Ci0gICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5zZWxlY3QoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5zZWxlY3QoMCk7Ci0gICAgICB9Ci0gICAgICAvLyBnZXQgd2ViU2VydmljZVJlZiBoaW50Ci0gICAgICBTdHJpbmcgd3NSZWYgPSB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5nZXRUZXh0KCk7Ci0KLSAgICAgIGlmICh3c0Rlc2NUb0hhbmRsZXJzXy5nZXQod3NSZWYpICE9IG51bGwpIHsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzRGVzY1RvSGFuZGxlcnNfLmdldCh3c1JlZik7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5zZXRJbnB1dChvcmRlcmVkSGFuZGxlcnNfKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlcnMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRIYW5kbGVyc0xpc3QoKSB7Ci0gICAgLy8gY29udmVydCB0byBhIEFycmF5TGlzdCBhbmQgcmV0dXJuIGFzIExpc3QKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKG9yZGVyZWRIYW5kbGVyc18gIT0gbnVsbCAmJiAhb3JkZXJlZEhhbmRsZXJzXy5pc0VtcHR5KCkpIGxpc3QuYWRkQWxsKG9yZGVyZWRIYW5kbGVyc18pOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGdldFdzRGVzY1RvSGFuZGxlcnMoKSB7Ci0gICAgcmV0dXJuIHRoaXMud3NEZXNjVG9IYW5kbGVyc187Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGhhbmRsZXJzCi0gICAqICAgICAgICAgIFRoZSBoYW5kbGVycyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVycyhIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlcnMpIHsKLSAgICB0aGlzLmhhbmRsZXJzID0gaGFuZGxlcnM7Ci0gICAgcG9wdWxhdGVIYW5kbGVyc1RhYmxlKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICBTdGF0dXMgZmluYWxTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgIHJldHVybiBmaW5hbFN0YXR1czsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAJCi0gIAlTdHJpbmcgZGVzY05hbWUgPSB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5nZXRUZXh0KCk7Ci0gIAlXZWJTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKSBzZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmpfLmdldChkZXNjTmFtZSk7Ci0gIAkKLSAgICBBZGRIYW5kbGVyRGlhbG9nIGRpYWxvZyA9IGRpYWxvZyA9IG5ldyBBZGRIYW5kbGVyRGlhbG9nKHBhcmVudF8uZ2V0U2hlbGwoKSwgZmFsc2UpOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAKLSAgICBTdHJpbmdbXSBwb3J0TmFtZXMgPSBnZXRQb3J0Q29tcG9uZW50TmFtZXMoc2VydmljZURlc2MpOwotICAgIGRpYWxvZy5zZXRQb3J0TmFtZXMocG9ydE5hbWVzKTsKLSAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKCA1MDAsIDIwMCApOwotICAgIAotICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spIHsKLSAgICAgIFN0cmluZyBuYW1lID0gZGlhbG9nLmdldE5hbWUoKTsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBkaWFsb2cuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICBTdHJpbmcgcG9ydCA9IGRpYWxvZy5nZXRQb3J0TmFtZSgpOwotCi0gICAgICBIYW5kbGVyVGFibGVJdGVtIGhpID0gbmV3IEhhbmRsZXJUYWJsZUl0ZW0oKTsKLSAgICAgIGhpLnNldEhhbmRsZXJOYW1lKG5hbWUpOwotICAgICAgaGkuc2V0SGFuZGxlckNsYXNzTmFtZShjbGFzc05hbWUpOwotICAgICAgaGkuc2V0UG9ydE5hbWUocG9ydCk7Ci0gICAgICAKLSAgICAgIAotICAgICAgaGkuc2V0V3NEZXNjUmVmKHNlcnZpY2VEZXNjKTsKLQotICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzRGVzY1RvSGFuZGxlcnNfLmdldChkZXNjTmFtZSk7Ci0gICAgICBvcmRlcmVkSGFuZGxlcnNfLmFkZChoaSk7Ci0KLSAgICB9Ci0KLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZ1tdIGdldFBvcnRDb21wb25lbnROYW1lcyhXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZURlc2MpIHsKLSAgCQotICAJTGlzdCBwb3J0cyA9IHdlYlNlcnZpY2VEZXNjLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gIAlpZiAocG9ydHMhPW51bGwpewotICAJCVN0cmluZ1tdIHBvcnROYW1lcyA9IG5ldyBTdHJpbmdbcG9ydHMuc2l6ZSgpXTsKLSAgCQlmb3IoaW50IGk9MDtpPHBvcnRzLnNpemUoKTtpKyspewotICAJCQlQb3J0Q29tcG9uZW50IHBjID0gKFBvcnRDb21wb25lbnQpcG9ydHMuZ2V0KGkpOwotICAJCQlTdHJpbmcgcGNOYW1lID0gcGMuZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsKLSAgCQkJcG9ydE5hbWVzW2ldID0gcGNOYW1lOwotICAJCX0KLSAgCQlyZXR1cm4gcG9ydE5hbWVzOwotICAJfQotICAJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVNb3ZlVXBCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCi0gICAgaW50IGluZGV4ID0gdGFibGVWaWV3ZXJfLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGVkID0gdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICBvcmRlcmVkSGFuZGxlcnNfID0gKFZlY3Rvcikgd3NEZXNjVG9IYW5kbGVyc18uZ2V0KHdlYlNlcnZpY2VEZXNjQ29tYm9fLmdldFRleHQoKSk7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBvcmRlcmVkSGFuZGxlcnNfLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXggLSAxKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVNb3ZlRG93bkJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0KLSAgICBpbnQgaW5kZXggPSB0YWJsZVZpZXdlcl8uZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0ZWQgPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICBpZiAoaW5kZXggPCBvcmRlcmVkSGFuZGxlcnNfLnNpemUoKSAtIDEpIHsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzRGVzY1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5nZXRUZXh0KCkpOwotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gb3JkZXJlZEhhbmRsZXJzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICBvcmRlcmVkSGFuZGxlcnNfLmluc2VydEVsZW1lbnRBdChvYmplY3QsIGluZGV4ICsgMSk7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVTb3VyY2VMb2NhdGlvbkNvbWJvKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgb3V0cHV0TG9jYXRpb25fID0gc291cmNlTG9jYXRpb25Db21ib18uZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlR2VuU2tlbGV0b25SYWRpb0J1dHRvbigpIHsKLSAgICBpZiAoZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uaXNFbmFibGVkKCkpIHsKLSAgICAgIGlmIChnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF8gPSB0cnVlOwotICAgICAgZWxzZQotICAgICAgICB0aGlzLmlzR2VuU2tlbGV0b25FbmFibGVkXyA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVdlYlNlcnZpY2VEZXNjQ29tYm8oU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGlmICh3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5pc0VuYWJsZWQoKSkgewotICAgICAgU3RyaW5nIHdlYlNlcnZpY2VSZWZOYW1lID0gd2ViU2VydmljZURlc2NDb21ib18uZ2V0VGV4dCgpOwotICAgICAgVmVjdG9yIGhuZGxlcnMgPSAoVmVjdG9yKSB3c0Rlc2NUb0hhbmRsZXJzXy5nZXQod2ViU2VydmljZVJlZk5hbWUpOwotICAgICAgaWYgKGhuZGxlcnMgIT0gbnVsbCkgewotICAgICAgICB0YWJsZVZpZXdlcl8uc2V0SW5wdXQoaG5kbGVycyk7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNHZW5Ta2VsZXRvbkVuYWJsZWRfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfKCkgewotICAgIHJldHVybiBpc0dlblNrZWxldG9uRW5hYmxlZF87Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTGlzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCi0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSGFuZGxlclRhYmxlSXRlbSkgewotICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKSBvYmplY3Q7Ci0gICAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0gICAgICAgICAgcmV0dXJuIGh0aS5nZXRIYW5kbGVyTmFtZSgpICE9IG51bGwgPyBodGkuZ2V0SGFuZGxlck5hbWUoKSA6ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLSAgICAgICAgICByZXR1cm4gaHRpLmdldEhhbmRsZXJDbGFzc05hbWUoKSAhPSBudWxsID8gaHRpLmdldEhhbmRsZXJDbGFzc05hbWUoKSA6ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHJldHVybiBodGkuZ2V0UG9ydE5hbWUoKSAhPSBudWxsID8gaHRpLmdldFBvcnROYW1lKCkgOiAiIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlUmVtb3ZlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgIHJlbW92ZUJ1dHRvbl8uc2V0RW5hYmxlZChlbmFibGVkICYmICF0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZlY3RvcikgeyByZXR1cm4gKChWZWN0b3IpIGVsZW1lbnQpLnRvQXJyYXkoKTsgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKSB7Ci0gICAgLy9pbnRlcm5hbERpc3Bvc2UoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkgewotICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gaGFuZGxlcnNUYWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGludCBzZWxlY3Rpb25Db3VudCA9IGhhbmRsZXJzVGFibGVfLmdldEl0ZW1Db3VudCgpOwotCi0gICAgICBvcmRlcmVkSGFuZGxlcnNfID0gKFZlY3Rvcikgd3NEZXNjVG9IYW5kbGVyc18uZ2V0KHdlYlNlcnZpY2VEZXNjQ29tYm9fLmdldFRleHQoKSk7Ci0gICAgICBvcmRlcmVkSGFuZGxlcnNfLnJlbW92ZShzZWxlY3Rpb25JbmRleCk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICB0cnkgewotICAgICAgdGFibGVWaWV3ZXJfLnNldElucHV0KG51bGwpOwotICAgICAgaWYgKG9yZGVyZWRIYW5kbGVyc18gIT0gbnVsbCkgdGFibGVWaWV3ZXJfLnNldElucHV0KG9yZGVyZWRIYW5kbGVyc18pOwotICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEdlblNrZWxldG9uRW5hYmxlZChib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkKSB7Ci0gICAgdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF8gPSBpc0dlblNrZWxldG9uRW5hYmxlZDsKLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5zZXRTZWxlY3Rpb24oaXNHZW5Ta2VsZXRvbkVuYWJsZWQpOwotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5Ta2VsZXRvbkVuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U291cmNlT3V0cHV0TG9jYXRpb24oSVBhdGhbXSBsb2NhdGlvbnMpIHsKLSAgICB0aGlzLm91dHB1dExvY2F0aW9uXyA9IGxvY2F0aW9uc1swXS50b1N0cmluZygpOwotCi0gICAgU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2xvY2F0aW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBwYXRoc1tpXSA9IGxvY2F0aW9uc1tpXS50b1N0cmluZygpOwotICAgICAgcGF0aHNUYWJsZV8ucHV0KHBhdGhzW2ldLCBsb2NhdGlvbnNbaV0pOwotICAgIH0KLSAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5zZXRJdGVtcyhwYXRocyk7Ci0gICAgc291cmNlTG9jYXRpb25Db21ib18uc2VsZWN0KDApOwotCi0gIH0KLQotICBwdWJsaWMgSVBhdGggZ2V0U291cmNlT3V0cHV0TG9jYXRpb24oKSB7Ci0gICAgSVBhdGggb3V0cHV0UGF0aCA9IChJUGF0aCkgcGF0aHNUYWJsZV8uZ2V0KG91dHB1dExvY2F0aW9uXyk7Ci0gICAgcmV0dXJuIG91dHB1dFBhdGg7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVyQ2xhc3NOYW1lcy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRIYW5kbGVyQ2xhc3NOYW1lcygpIHsKLSAgICAKLSAgICBWZWN0b3IgaGFuZGxlckNsYXNzZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IHdzRGVzY1RvSGFuZGxlcnNfLmtleXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgCi0gICAgICBTdHJpbmcgd3NEZXNjTmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzRGVzY1RvSGFuZGxlcnNfLmdldCh3c0Rlc2NOYW1lKTsKLSAgICAgIAotICAgICAgaWYgKG9yZGVyZWRIYW5kbGVyc18gIT0gbnVsbCkgewotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcmVkSGFuZGxlcnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBodGkgPSAoSGFuZGxlclRhYmxlSXRlbSkgb3JkZXJlZEhhbmRsZXJzXy5nZXQoaSk7Ci0gICAgICAgICAgaGFuZGxlckNsYXNzZXMuYWRkKGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10paGFuZGxlckNsYXNzZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd3NEZXNjVG9IYW5kbGVyc0FycmF5XwotICAgKiAgICAgICAgICBUaGUgd3NEZXNjVG9IYW5kbGVyc0FycmF5XyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc1JlZnNUb0hhbmRsZXJzKEhhc2h0YWJsZSB3c0Rlc2NUb0hhbmRsZXJzQXJyYXkpIHsKLQotICAgIHdzRGVzY1RvSGFuZGxlcnNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHdzRGVzY1RvUG9ydHNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRyeSB7Ci0KLSAgICAgIGlmICh3c0Rlc2NUb0hhbmRsZXJzQXJyYXkgIT0gbnVsbCkgewotICAgICAgICBpbnQgc2l6ZU9mSGFuZGxlcnMgPSB3c0Rlc2NUb0hhbmRsZXJzQXJyYXkuc2l6ZSgpOwotICAgICAgICBTdHJpbmdbXSB3c1JlZnMgPSBuZXcgU3RyaW5nW3NpemVPZkhhbmRsZXJzXTsKLSAgICAgICAgLy8gc3RvcmUgdGhlIHdzUmVmcwotICAgICAgICBFbnVtZXJhdGlvbiB3c0Rlc2MgPSB3c0Rlc2NUb0hhbmRsZXJzQXJyYXkua2V5cygpOwotICAgICAgICB3aGlsZSAod3NEZXNjLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgU3RyaW5nIHdzRGVzY05hbWUgPSAoU3RyaW5nKSB3c0Rlc2MubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW1bXSBoYW5kbGVycyA9IChIYW5kbGVyVGFibGVJdGVtW10pIHdzRGVzY1RvSGFuZGxlcnNBcnJheS5nZXQod3NEZXNjTmFtZSk7Ci0gICAgICAgICAgLy8gcHJvY2VzcyB0aGUgaGFuZGxlcnNUYWJsZQotICAgICAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgSGFzaFNldCBwb3J0TmFtZVZlY3RvciA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBvcmRlcmVkSGFuZGxlcnNfLmFkZChoYW5kbGVyc1tpXSk7Ci0gICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSBoYW5kbGVyc1tpXS5nZXRQb3J0TmFtZSgpOwotICAgICAgICAgICAgcG9ydE5hbWVWZWN0b3IuYWRkKG5ldyBTdHJpbmcocG9ydE5hbWUpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd3NEZXNjVG9IYW5kbGVyc18ucHV0KHdzRGVzY05hbWUsIG9yZGVyZWRIYW5kbGVyc18pOwotICAgICAgICAgIHdzRGVzY1RvUG9ydHNfLnB1dCh3c0Rlc2NOYW1lLCAoU3RyaW5nW10pIHBvcnROYW1lVmVjdG9yLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwb3B1bGF0ZUhhbmRsZXJzVGFibGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25OYW1lKFN0cmluZyB3c0Rlc2NOYW1lKSB7Ci0gICAgZGVzY3JpcHRpb25OYW1lXyA9IHdzRGVzY05hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmooSGFzaHRhYmxlIHNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaikgewotICAgIHRoaXMuc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXyA9IHNlcnZpY2VEZXNjTmFtZVRvRGVzY09iajsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9IYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzE5MjhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9IYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci0KLQotLyoqCi0gKiBIYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kCi0gKiAKLSAqIERldGVybWluZSBpZiBIYW5kbGVycyBiZWxvbmdzIHRvIHNlcnZpY2Ugb3IgY2xpZW50IHNpZGUKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZCB7Ci0KLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0gIHByaXZhdGUgYm9vbGVhbiBpc0NsaWVudEhhbmRsZXJfID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZpY2VIYW5kbGVyXyA9IGZhbHNlOwotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0SW5pdGlhbFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgewotICAgICAgICAgIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgd3NuZ3QgPSAoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgb2JqOwotICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKXdzbmd0LmdldFdzZGxTZXJ2aWNlKCk7Ci0gICAgICAgICAgaWYgKHdzbmd0LmdldFdzZGxTZXJ2aWNlKCkhPW51bGwpewotICAgICAgICAgIAlpc1NlcnZpY2VIYW5kbGVyXyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmICh3c25ndC5nZXRTZXJ2aWNlUmVmKCkhPW51bGwpewotICAgICAgICAgIAlpc0NsaWVudEhhbmRsZXJfID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgIGVsc2UgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgfQotCi0gIAotLyoqCi0gKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzQ2xpZW50SGFuZGxlcl8uCi0gKi8KLXB1YmxpYyBib29sZWFuIGdldElzQ2xpZW50SGFuZGxlcigpIHsKLQlyZXR1cm4gaXNDbGllbnRIYW5kbGVyXzsKLX0KLS8qKgotICogQHJldHVybiBSZXR1cm5zIHRoZSBpc1NlcnZpY2VIYW5kbGVyXy4KLSAqLwotcHVibGljIGJvb2xlYW4gZ2V0SXNTZXJ2aWNlSGFuZGxlcigpIHsKLQlyZXR1cm4gaXNTZXJ2aWNlSGFuZGxlcl87Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0ltcG9ydFdTSUxXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9JbXBvcnRXU0lMV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNjc3OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0ltcG9ydFdTSUxXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFQWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWwuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsLlRhYmxlVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2lsLkFkZFdTRExUb1dTSUxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uRGlhbG9nUmVzb3VyY2VCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uRmlsZUV4dGVuc2lvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotCi0vKioKLSogUGFnZSBmb3IgaW1wb3J0aW5nIFdTREwgcmVmZXJlbmNlcyBpbnRvIGEgV1NJTCBpbiB0aGUgd29ya2JlbmNoLgotKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRXU0lMV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIC8qQ09OVEVYVF9JRCBXU0lMMDAwMSBmb3IgdGhlIFdTSUwgSW1wb3J0IFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1dTSUxfSU1QT1JUX1BBR0UgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuV1NJTDAwMDEiOwotCi0gIC8qQ09OVEVYVF9JRCBXU0lMMDAwMiBmb3IgdGhlIFdTSUwgdGV4dCBmaWVsZCovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfV1NJTF9URVhUX1dTSUwgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuV1NJTDAwMDIiOwotCi0gIC8qQ09OVEVYVF9JRCBXU0lMMDAwMyBmb3IgdGhlIFdTSUwgYnJvd3NlIGJ1dHRvbiovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfV1NJTF9CVVRUT05fQlJPV1NFX1dTSUwgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuV1NJTDAwMDMiOwotCi0gIC8qQ09OVEVYVF9JRCBXU0lMMDAwNCBmb3IgdGhlIFdTREwgdGFibGUqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1dTSUxfVEFCTEVfV1NETCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5XU0lMMDAwNCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5TUEVDVElPTl9XU0lMID0gImluc3BlY3Rpb24ud3NpbCI7Ci0KLSAgcHJpdmF0ZSBUZXh0IHdzaWxfOwotICBwcml2YXRlIEJ1dHRvbiBicm93c2VfOwotICBwcml2YXRlIFRhYmxlVmlld2VyRWRpdG9yIHdzZGxzXzsKLSAgCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhZ2UuCi0gICovCi0gIHB1YmxpYyBJbXBvcnRXU0lMV2lkZ2V0KCkKLSAgewotICAgIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgLy9zdXBlcihtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1dTSUxfSU1QT1JUIiksIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRJVExFX1dTSUxfSU1QT1JUIiksIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkRFU0NfV1NJTF9JTVBPUlQiKSk7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAJCi0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfV1NJTF9JTVBPUlRfUEFHRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LCBJTkZPUE9QX1dTSUxfSU1QT1JUX1BBR0UpOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotICAgIGxhYmVsLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiTEFCRUxfV1NJTF9VUkkiKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICB3c2lsXyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULldSQVAgfCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICBnZC53aWR0aEhpbnQgPSAyNTY7Ci0gICAgd3NpbF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgd3NpbF8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXIpOwotICAgIHdzaWxfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfV1NJTF9URVhUX1dTSUwiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHdzaWxfLCBJTkZPUE9QX1dTSUxfVEVYVF9XU0lMKTsKLQotICAgIGJyb3dzZV8gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIGJyb3dzZV8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9CUk9XU0UiKSk7Ci0gICAgYnJvd3NlXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICBicm93c2VfLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sCi0gICAgICBuZXcgTGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZUJyb3dzZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgYnJvd3NlXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1dTSUxfQlVUVE9OX0JST1dTRV9XU0lMIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChicm93c2VfLCBJTkZPUE9QX1dTSUxfQlVUVE9OX0JST1dTRV9XU0lMKTsKLQotICAgIENvbXBvc2l0ZSB3c2RsQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICB3c2RsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMzsKLSAgICB3c2RsQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotICAgIGxhYmVsID0gbmV3IExhYmVsKHdzZGxDb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX1dTREwiKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgU3RyaW5nW10gY29sdW1ucyA9IHttc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9XU0RMX1VSSSIpfTsKLSAgICB3c2Rsc18gPSBuZXcgVGFibGVWaWV3ZXJFZGl0b3Iod3NkbENvbXBvc2l0ZSwgY29sdW1ucywgbmV3IEFycmF5TGlzdCgpLCAiaHR0cDovLyIpOwotICAgIHdzZGxzXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1dTSUxfVEFCTEVfV1NETCIpKTsKLSAgICB3c2Rsc18uc2V0SW5mb3BvcChJTkZPUE9QX1dTSUxfVEFCTEVfV1NETCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwcml2YXRlIElSZXNvdXJjZVtdIGdldFdTRExSZXNvdXJjZXMoKQotICB7Ci0gICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKChJRmlsZSlvYmplY3QpLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsICYmICgoSUZpbGUpb2JqZWN0KS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJ3c2RsIikpCi0gICAgICAgICAgbGlzdC5hZGQob2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgSVJlc291cmNlW10gcmVzID0gbmV3IElSZXNvdXJjZVtsaXN0LnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspCi0gICAgICByZXNbaV0gPSAoSVJlc291cmNlKWxpc3QuZ2V0KGkpOwotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVCcm93c2VFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIERpYWxvZ1Jlc291cmNlQnJvd3NlciBkaWFsb2cgPSBuZXcgRGlhbG9nUmVzb3VyY2VCcm93c2VyKGJyb3dzZV8uZ2V0U2hlbGwoKSwgbnVsbCwgbmV3IEZpbGVFeHRlbnNpb25GaWx0ZXIobmV3IFN0cmluZ1tdIHsid3NpbCJ9KSk7Ci0gICAgZGlhbG9nLm9wZW4oKTsKLSAgICBJUmVzb3VyY2UgcmVzID0gZGlhbG9nLmdldEZpcnN0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHJlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgICAgd3NpbF8uc2V0VGV4dChyZXMuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgd3NpbF8uc2V0VGV4dChyZXMuZ2V0RnVsbFBhdGgoKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChJTlNQRUNUSU9OX1dTSUwpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIGlmICghd3NpbF8uZ2V0VGV4dCgpLmVuZHNXaXRoKCIud3NpbCIpKQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfTVNHX0lOVkFMSURfV1NJTF9GSUxFX05BTUUiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKChJRmlsZSlvYmplY3QpLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsICYmICgoSUZpbGUpb2JqZWN0KS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJ3c2RsIikpCi0gICAgICAgICAgbGlzdC5hZGQoKChJRmlsZSlvYmplY3QpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbCkKLSAgICAgICAgICBsaXN0LmFkZChKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NJTFBhdGgoKChTZXJ2aWNlSW1wbCkob2JqZWN0KSkpKTsJCi0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKQotICAgICAgICAgIGxpc3QuYWRkKEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0lMUGF0aCgoKFNlcnZpY2VSZWYpKG9iamVjdCkpKSk7CQkKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gICAgICAgICAgbGlzdC5hZGQoSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTSUxQYXRoKCgoV1NETFJlc291cmNlSW1wbCkob2JqZWN0KSkpKTsJCi0gICAgICB9Ci0gICAgfQotICAgIHdzZGxzXy5zZXRJbnB1dChsaXN0KTsKLSAgICB3c2Rsc18ucmVmcmVzaCgpOwotICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGxpc3QuZ2V0KDApLnRvU3RyaW5nKCkpOwotICAgICAgLy8gY2hhbmdlIGV4dGVuc2lvbiBmcm9tIC53c2RsIHRvIC53c2lsCi0gICAgICBpbnQgbGVuZ3RoID0gcGF0aC5sZW5ndGgoKTsKLSAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UobGVuZ3RoLTQsIGxlbmd0aCwgIndzaWwiKTsKLSAgICAgIHdzaWxfLnNldFRleHQocGF0aC50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBBcmd1bWVudHMgZ2V0R2VuV1NJTEFyZ3VtZW50cygpCi0gIHsKLSAgICBBcmd1bWVudHMgYXJncyA9IG5ldyBBcmd1bWVudHMoKTsKLSAgICBTdHJpbmcgd3NpbFBhdGggPSB3c2lsXy5nZXRUZXh0KCk7Ci0gICAgaWYgKHdzaWxQYXRoLmluZGV4T2YoJzonKSA8IDApCi0gICAgICBhcmdzLmFkZChBZGRXU0RMVG9XU0lMQ29tbWFuZC5BUkdfV1NJTCwgVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkod3NpbF8uZ2V0VGV4dCgpKS50b1N0cmluZygpKTsKLSAgICBlbHNlCi0gICAgICBhcmdzLmFkZChBZGRXU0RMVG9XU0lMQ29tbWFuZC5BUkdfV1NJTCwgd3NpbFBhdGgpOwotICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gd3NkbHNfLmdldEl0ZW1zKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgdXJpID0gaXRlbXNbaV0uZ2V0VGV4dCgwKTsKLSAgICAgIGlmICh1cmkuaW5kZXhPZignOicpIDwgMCkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHVyaSk7Ci0gICAgICAgIGlmIChyZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVyaSA9IHJlcy5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgCW11cmxlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGFyZ3MuYWRkKEFkZFdTRExUb1dTSUxDb21tYW5kLkFSR19XU0RMLCB1cmkpOwotICAgIH0KLSAgICBhcmdzLmFkZChBZGRXU0RMVG9XU0lMQ29tbWFuZC5BUkdfUkVTT0xWRV9XU0RMLCBudWxsKTsKLSAgICByZXR1cm4gYXJnczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QcmVmZXJlbmNlc1NlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1ByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDg0MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1ByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsgICAgCi0gIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0IGNvbnRleHRfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDAzIGZvciB0aGUgT3ZlcndyaXRlIEZpbGVzIGNoZWNrIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyA9ICJQV1BSMDAwMyI7Ci0gIHByaXZhdGUgQnV0dG9uIG92ZXJ3cml0ZUZpbGVzQ2hlY2tib3hfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDA0IGZvciB0aGUgQ3JlYXRlIEZvbGRlcnMgY2hlY2sgYm94IG9mIHRoZSBQcm9qZWN0IFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlMgPSAiUFdQUjAwMDQiOwotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVGb2xkZXJzQ2hlY2tib3hfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDE1IGZvciB0aGUgQ2hlY2sgT3V0IEZpbGVzIGNoZWNrIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0NIRUNLT1VUX0ZJTEVTID0gIlBXUFIwMDE1IjsgIAotICBwcml2YXRlIEJ1dHRvbiBjaGVja291dEZpbGVzQ2hlY2tib3hfOwotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2FkZENvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgICAgPSAib3JnLmVjbGlwc2UuanN0LndzLnVpIjsKLSAgICBTdHJpbmcgICAgICAgY29uUGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAJVUlVdGlscyAgICAgIHV0aWxzICAgICAgID0gbmV3IFVJVXRpbHMoIG1zZ1V0aWxzLCBjb25QbHVnaW5JZCApOwotICAJCi0gICAgQ29tcG9zaXRlIHJlc291cmNlc0dyb3VwID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDEgKTsKLSAgICAKLSAgICBvdmVyd3JpdGVGaWxlc0NoZWNrYm94XyA9IHV0aWxzLmNyZWF0ZUNoZWNrYm94KCByZXNvdXJjZXNHcm91cCwgIkJVVFRPTl9PVkVSV1JJVEVfRklMRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BQUk1fQ0hFQ0tCT1hfT1ZFUldSSVRFX0ZJTEVTIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGNyZWF0ZUZvbGRlcnNDaGVja2JveF8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggcmVzb3VyY2VzR3JvdXAsICJCVVRUT05fQ1JFQVRFX0ZPTERFUlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFBSTV9DSEVDS0JPWF9DUkVBVEVfRk9MREVSUyIgLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9DUkVBVEVfRk9MREVSUyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgY2hlY2tvdXRGaWxlc0NoZWNrYm94XyA9IHV0aWxzLmNyZWF0ZUNoZWNrYm94KCByZXNvdXJjZXNHcm91cCwgIkJVVFRPTl9DSEVDS09VVF9GSUxFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QUFJNX0NIRUNLQk9YX0NIRUNLX09VVCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0NIRUNLT1VUX0ZJTEVTICk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCBjb250ZXh0ICkKLSAgeyAKLSAgICBvdmVyd3JpdGVGaWxlc0NoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSApOwotICAgIGNyZWF0ZUZvbGRlcnNDaGVja2JveF8uc2V0U2VsZWN0aW9uKCBjb250ZXh0LmlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSApOwotICAgIGNoZWNrb3V0RmlsZXNDaGVja2JveF8uc2V0U2VsZWN0aW9uKCBjb250ZXh0LmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSApOyAKLSAgICAKLSAgICBjb250ZXh0XyA9IGNvbnRleHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkgCi0gIHsgICAgCi0gICAgY29udGV4dF8uc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKCBvdmVyd3JpdGVGaWxlc0NoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKSApOwotICAgIGNvbnRleHRfLnNldENyZWF0ZUZvbGRlcnNFbmFibGVkKCBjcmVhdGVGb2xkZXJzQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpICk7Ci0gICAgY29udGV4dF8uc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoIGNoZWNrb3V0RmlsZXNDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgICAKLSAgICByZXR1cm4gY29udGV4dF87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1B1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNzYxYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1B1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50Ci17Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5OwotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5OwotICBwcml2YXRlIGJvb2xlYW4gcHVibGlzaFRvUHJpdmF0ZVVEREk7Ci0gIHByaXZhdGUgQ29tbWFuZFdpZGdldEJpbmRpbmcgcHJpdmF0ZVVERElCaW5kaW5nOwotICAKLSAgcHVibGljIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50KCkKLSAgewotICAgIHN1cGVyKChDb21tYW5kRmFjdG9yeSludWxsLCAiIik7Ci0gICAgcHJpdmF0ZVVERElCaW5kaW5nID0gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkuZ2V0QmluZGluZygpOwotICB9Ci0KLSAgLyoqIAotICAgKiBHZXRzIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICoKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCkKLSAgewotICAgIGlmIChwcml2YXRlVURESUJpbmRpbmcgIT0gbnVsbCAmJiBwdWJsaXNoVG9Qcml2YXRlVURESSAmJiAhUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkuaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCkpCi0gICAgewotICAgICAgcHJpdmF0ZVVERElCaW5kaW5nLnJlZ2lzdGVyQ2FuRmluaXNoKGNhbkZpbmlzaFJlZ2lzdHJ5KTsKLSAgICAgIHByaXZhdGVVRERJQmluZGluZy5yZWdpc3RlckRhdGFNYXBwaW5ncyhkYXRhTWFwcGluZ1JlZ2lzdHJ5KTsKLSAgICAgIHByaXZhdGVVRERJQmluZGluZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5KTsKLSAgICAgIHJldHVybiBwcml2YXRlVURESUJpbmRpbmcuY3JlYXRlKCkuY3JlYXRlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAgKiBHZXRzIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMgbnVsbAotICAgICogd2hlbiB0aGVyZSBpcyBubyBuZXh0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXROZXh0U3ViRnJhZ21lbnQoQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50KQotICB7Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBkYXRhIG1hcHBpbmdzIGZvciB0aGlzIGNvbW1hbmQgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KQotICB7Ci0gIAlkYXRhTWFwcGluZ1JlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuY2FuRmluaXNoUmVnaXN0cnkgPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLndpZGdldFJlZ2lzdHJ5ID0gd2lkZ2V0UmVnaXN0cnk7Ci0gIH0KLQotICAvKioKLSAgICAqIEFsbCB3aXphcmQgZnJhZ21lbnRzIG5lZWQgdG8gYmUgY2xvbmVhYmxlLgotICAqKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCgpOwotICAJZnJhZ21lbnQucmVnaXN0ZXJEYXRhTWFwcGluZ3MoZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlckNhbkZpbmlzaChjYW5GaW5pc2hSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5KTsKLSAgCWZyYWdtZW50LnNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKHB1Ymxpc2hUb1ByaXZhdGVVRERJKTsKLSAgCXJldHVybiBmcmFnbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKGJvb2xlYW4gcHVibGlzaCkKLSAgewotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJID0gcHVibGlzaDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoV1NXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoV1NXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmNWI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvUHVibGlzaFdTV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLlB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkudWRkaS5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotCi1wdWJsaWMgY2xhc3MgUHVibGlzaFdTV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIC8qIENPTlRFWFRfSUQgUFdQQjAwMDEgZm9yIHRoZSBVRERJIFB1Ymxpc2ggUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUEJfUEFHRSA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1BCMDAwMSI7Ci0gIC8qIENPTlRFWFRfSUQgUFdQQjAwMDIgZm9yIHRoZSBVRERJIExhdW5jaCBjaGVjayBib3ggb2YgdGhlIFVEREkgUHVibGlzaCBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0ggPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdQQjAwMDIiOwotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hVRERJQ2hlY2tib3hfOwotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hQcml2YXRlVURESUNoZWNrYm94XzsKLSAgcHJpdmF0ZSBMYWJlbCBwdWJpbGNVRERJUmVnQ29tYm9MYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gcHVibGljVURESVJlZ0NvbWJvXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0gIHByaXZhdGUgQm9vbGVhbiBwdWJsaXNoOwotCi0gIHB1YmxpYyBQdWJsaXNoV1NXaWRnZXQoYm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICB0aGlzLnB1Ymxpc2ggPSBuZXcgQm9vbGVhbihwdWJsaXNoKTsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotICAgIExpc3RlbmVyIHNlbExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlU2VsZWN0aW9uRXZlbnQoZXZlbnQpOwotICAgICAgfQotICAgIH07Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdQQl9QQUdFIikpOwotICAgIElXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LCBJTkZPUE9QX1BXUEJfUEFHRSk7Ci0gICAgbGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF8gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICBpZiAocHVibGlzaC5ib29sZWFuVmFsdWUoKSkKLSAgICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiQlVUVE9OX1dTX1BVQkxJU0hfUFJJVkFURV9VRERJIikpOwotICAgIGVsc2UKLSAgICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiQlVUVE9OX1dTX0ZJTkRfUFJJVkFURV9VRERJIikpOwotICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0giKSk7Ci0gICAgbGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc2VsTGlzdGVuZXIpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChsYXVuY2hQcml2YXRlVURESUNoZWNrYm94XywgSU5GT1BPUF9QV1BCX0NIRUNLQk9YX1dTX0xBVU5DSCk7Ci0gICAgbGF1bmNoVURESUNoZWNrYm94XyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgIGlmIChwdWJsaXNoLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgbGF1bmNoVURESUNoZWNrYm94Xy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkJVVFRPTl9XU19QVUJMSVNIIikpOwotICAgIGVsc2UKLSAgICAgIGxhdW5jaFVERElDaGVja2JveF8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJCVVRUT05fV1NfRklORCIpKTsKLSAgICBsYXVuY2hVRERJQ2hlY2tib3hfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0giKSk7Ci0gICAgbGF1bmNoVURESUNoZWNrYm94Xy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzZWxMaXN0ZW5lcik7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGxhdW5jaFVERElDaGVja2JveF8sIElORk9QT1BfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0gpOwotICAgIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMzsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBjLnNldExheW91dChnbCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICBjLnNldExheW91dERhdGEoZ2QpOwotICAgIG5ldyBMYWJlbChjLCBTV1QuV1JBUCk7Ci0gICAgcHViaWxjVURESVJlZ0NvbWJvTGFiZWxfID0gbmV3IExhYmVsKGMsIFNXVC5XUkFQKTsKLSAgICBwdWJpbGNVRERJUmVnQ29tYm9MYWJlbF8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9QVUJMSUNfVURESV9SRUdJU1RSSUVTIikpOwotICAgIHB1YmxpY1VERElSZWdDb21ib18gPSBuZXcgQ29tYm8oYywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHB1YmxpY1VERElSZWdDb21ib18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgaW5pdFB1YmxpY1VEREkoKTsKLSAgICBpbml0UHJpdmF0ZVVEREkoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0UHVibGljVURESSgpCi0gIHsKLSAgICBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgcmVnID0gUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzID0gcmVnLmdldEFsbFB1YmxpY1VERElSZWdpc3RyeVR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocHVibGlzaC5ib29sZWFuVmFsdWUoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gSWdub3JlIHJlYWQtb25seSByZWdpc3RyaWVzLgotICAgICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHR5cGVzW2ldLmdldFB1Ymxpc2hVUkwoKTsKLSAgICAgICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCB8fCBwdWJsaXNoVVJMLmluZGV4T2YoIjovLyIpID09IC0xKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgcHVibGljVURESVJlZ0NvbWJvXy5hZGQodHlwZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgaWYgKHR5cGVzLmxlbmd0aCA+IDApCi0gICAgICBwdWJsaWNVRERJUmVnQ29tYm9fLnNldFRleHQocHVibGljVURESVJlZ0NvbWJvXy5nZXRJdGVtKDApKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0UHJpdmF0ZVVEREkoKQotICB7Ci0gICAgaWYgKCFwdWJsaXNoLmJvb2xlYW5WYWx1ZSgpICYmICFQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKS5pc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSkKLSAgICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldEVuYWJsZWQoZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdGlvbkV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGxhdW5jaFVERElDaGVja2JveF8gPT0gZXZlbnQud2lkZ2V0KQotICAgICAgcHVibGljVURESVJlZ0NvbWJvXy5zZXRFbmFibGVkKGxhdW5jaFVERElDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkpOwotICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1B1YmxpY1VEREkoYm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgbGF1bmNoVURESUNoZWNrYm94Xy5zZXRTZWxlY3Rpb24ocHVibGlzaCk7Ci0gICAgcHVibGljVURESVJlZ0NvbWJvXy5zZXRFbmFibGVkKHB1Ymxpc2gpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHVibGljVURESShCb29sZWFuIHB1Ymxpc2gpCi0gIHsKLSAgICBzZXRQdWJsaXNoVG9QdWJsaWNVRERJKHB1Ymxpc2guYm9vbGVhblZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHJpdmF0ZVVEREkoYm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgbGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF8uc2V0U2VsZWN0aW9uKHB1Ymxpc2gpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHJpdmF0ZVVEREkoQm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgc2V0UHVibGlzaFRvUHJpdmF0ZVVEREkocHVibGlzaC5ib29sZWFuVmFsdWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoVG9QdWJsaWNVRERJKCkKLSAgewotICAgIHJldHVybiBsYXVuY2hVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFRvUHJpdmF0ZVVEREkoKQotICB7Ci0gICAgcmV0dXJuIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yY2VMYXVuY2hPdXRzaWRlSURFKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBMYXVuY2hPcHRpb25bXSBnZXRMYXVuY2hPcHRpb25zKCkKLSAgewotICAgIFZlY3RvciBsYXVuY2hPcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKGxhdW5jaFVERElDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkpCi0gICAgewotICAgICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IHJlZyA9IFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgaW50IFVERElSZWdTZWxlY3Rpb25JbmRleCA9IHB1YmxpY1VERElSZWdDb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGlmIChVRERJUmVnU2VsZWN0aW9uSW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gcHVibGljVURESVJlZ0NvbWJvXy5nZXRJdGVtKFVERElSZWdTZWxlY3Rpb25JbmRleCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IHJlZy5nZXRQdWJsaWNVRERJUmVnaXN0cnlUeXBlSURCeU5hbWUobmFtZSk7Ci0gICAgICAgIFB1YmxpY1VERElSZWdpc3RyeVR5cGUgdHlwZSA9IHJlZy5nZXRQdWJsaWNVRERJUmVnaXN0cnlUeXBlQnlJRChpZCk7Ci0gICAgICAgIGxhdW5jaE9wdGlvblZlY3Rvci5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLklOUVVJUllfVVJMLCB0eXBlLmdldElucXVpcnlVUkwoKSkpOwotICAgICAgICBsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5QVUJMSVNIX1VSTCwgdHlwZS5nZXRQdWJsaXNoVVJMKCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgcHJpdmF0ZVJlZyA9IFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHByaXZhdGVUeXBlID0gcHJpdmF0ZVJlZy5nZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSgpOwotICAgICAgU3RyaW5nW10gcHJpdmF0ZUlucXVpcnlVUkwgPSBwcml2YXRlVHlwZS5nZXRQcml2YXRlVURESVJlZ2lzdHJ5SW5xdWlyeUFQSSgpOwotICAgICAgU3RyaW5nW10gcHJpdmF0ZVB1Ymxpc2hVUkwgPSBwcml2YXRlVHlwZS5nZXRQcml2YXRlVURESVJlZ2lzdHJ5UHVibGlzaEFQSSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcml2YXRlSW5xdWlyeVVSTC5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuSU5RVUlSWV9VUkwsIHByaXZhdGVJbnF1aXJ5VVJMW2ldKSk7Ci0gICAgICAgIGxhdW5jaE9wdGlvblZlY3Rvci5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLlBVQkxJU0hfVVJMLCBwcml2YXRlUHVibGlzaFVSTFtpXSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKExhdW5jaE9wdGlvbltdKSBsYXVuY2hPcHRpb25WZWN0b3IudG9BcnJheShuZXcgTGF1bmNoT3B0aW9uWzBdKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9TZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1NlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2ExOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1NlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSGFuZGxlclRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLQotLyoqCi0gKiBTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotICogCi0gKiBJbml0aWFsaXplIGFuZCBsb2FkIHRoZSBoYW5kbGVycyBkYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kIHsKLQotICBwcml2YXRlIEhhbmRsZXJUYWJsZUl0ZW1bXSBoYW5kbGVyc187Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkXzsKLSAgcHJpdmF0ZSBJUGF0aCBzb3VyY2VPdXRwdXRMb2NhdGlvbl87Ci0gIHByaXZhdGUgV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzY3JpcHRpb25fOwotICBwcml2YXRlIFdzZGRSZXNvdXJjZSB3c2RkUmVzb3VyY2VfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzTWFuYWdlciB3ZWJTZXJ2aWNlc01hbmFnZXJfOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3RfOwotICBwcml2YXRlIEhhc2h0YWJsZSB3c0Rlc2NUb0hhbmRsZXJzXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb25OYW1lXyA9IG51bGw7Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgIHdlYlNlcnZpY2VzTWFuYWdlcl8gPSBuZXcgV2ViU2VydmljZXNNYW5hZ2VyKCk7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0SW5pdGlhbFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHN0YXR1cyA9IHByb2Nlc3NIYW5kbGVycyhlbnYpOwotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgcHJvY2Vzc0hhbmRsZXJzKEVudmlyb25tZW50IGVudikgewotICAgIHRyeSB7Ci0gICAgICBWZWN0b3IgaGFuZGxlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICB3c0Rlc2NUb0hhbmRsZXJzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIHNlcnZpY2VEZXNjTmFtZVRvRGVzY09ial8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAKLSAgICAgIFdlYlNlcnZpY2VFZGl0TW9kZWwgd3NlZCA9IGdldFdlYlNlcnZpY2VFZGl0TW9kZWwoKTsKLSAgICAgIGlmICh3c2VkID09IG51bGwpCi0gICAgICAgIHdzZGRSZXNvdXJjZV8gPSBnZXRXc2RkUmVzb3VyY2VGcm9tU2VsZWN0aW9uKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHdzZGRSZXNvdXJjZV8gPSB3c2VkLmdldFdlYlNlcnZpY2VzWG1sUmVzb3VyY2UoKTsKLQotICAgICAgaWYgKHdzZGRSZXNvdXJjZV8gPT0gbnVsbCkgewotICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLQotICAgICAgV2ViU2VydmljZXMgd2ViU2VydmljZXMgPSB3c2RkUmVzb3VyY2VfLmdldFdlYlNlcnZpY2VzKCk7Ci0gICAgICBpZiAod2ViU2VydmljZXMgIT0gbnVsbCkgewotICAgICAgICBMaXN0IHdzRGVzY3JpcHRpb25zID0gd3NkZFJlc291cmNlXy5nZXRXZWJTZXJ2aWNlcygpLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c0Rlc2NyaXB0aW9ucy5zaXplKCk7IGkrKykgewotCi0gICAgICAgICAgd3NEZXNjcmlwdGlvbl8gPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKSB3c0Rlc2NyaXB0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgTGlzdCB3c1BvcnRDb21wb25lbnRzID0gd3NEZXNjcmlwdGlvbl8uZ2V0UG9ydENvbXBvbmVudHMoKTsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdzUG9ydENvbXBvbmVudHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIFBvcnRDb21wb25lbnQgd3NQb3J0ID0gKFBvcnRDb21wb25lbnQpIHdzUG9ydENvbXBvbmVudHMuZ2V0KGopOwotICAgICAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gd3NQb3J0LmdldFBvcnRDb21wb25lbnROYW1lKCk7Ci0gICAgICAgICAgICBMaXN0IHdzSGFuZGxlcnMgPSB3c1BvcnQuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW1bXSBoYW5kbGVySXRlbXMgPSBuZXcgSGFuZGxlclRhYmxlSXRlbVt3c0hhbmRsZXJzLnNpemUoKV07ICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdzSGFuZGxlcnMuc2l6ZSgpOyBrKyspIHsKLQotICAgICAgICAgICAgICBIYW5kbGVyIHdzSGFuZGxlciA9IChIYW5kbGVyKSB3c0hhbmRsZXJzLmdldChrKTsKLQotICAgICAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGhhbmRsZXJJdGVtID0gbmV3IEhhbmRsZXJUYWJsZUl0ZW0oKTsKLSAgICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0SGFuZGxlcih3c0hhbmRsZXIpOwotICAgICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRIYW5kbGVyTmFtZSh3c0hhbmRsZXIuZ2V0SGFuZGxlck5hbWUoKSk7Ci0gICAgICAgICAgICAgIGhhbmRsZXJJdGVtLnNldEhhbmRsZXJDbGFzc05hbWUod3NIYW5kbGVyLmdldEhhbmRsZXJDbGFzcygpKTsKLSAgICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0UG9ydCh3c1BvcnQpOwotICAgICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRQb3J0TmFtZShwb3J0TmFtZSk7Ci0gICAgICAgICAgICAgIGhhbmRsZXJJdGVtLnNldFdzRGVzY1JlZih3c0Rlc2NyaXB0aW9uXyk7Ci0gICAgICAgICAgICAgIGhhbmRsZXJJdGVtc1trXSA9IGhhbmRsZXJJdGVtOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXJJdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB3c0Rlc2NOYW1lID0gd3NEZXNjcmlwdGlvbl8uZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOwotICAgICAgICAgICAgd3NEZXNjVG9IYW5kbGVyc18ucHV0KHdzRGVzY05hbWUsIGhhbmRsZXJJdGVtcyk7Ci0gICAgICAgICAgICBzZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmpfLnB1dCh3c0Rlc2NOYW1lLCB3c0Rlc2NyaXB0aW9uXyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGhhbmRsZXJzXyA9IChIYW5kbGVyVGFibGVJdGVtW10pIGhhbmRsZXJzLnRvQXJyYXkobmV3IEhhbmRsZXJUYWJsZUl0ZW1bMF0pOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHB1YmxpYyBIYW5kbGVyVGFibGVJdGVtW10gZ2V0SGFuZGxlcnMoKSB7Ci0gICAgcmV0dXJuIHRoaXMuaGFuZGxlcnNfOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNHZW5Ta2VsZXRvbkVuYWJsZWRfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuU2tlbGV0b25FbmFibGVkKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc291cmNlT3V0cHV0TG9jYXRpb25fLgotICAgKi8KLSAgcHVibGljIElQYXRoW10gZ2V0U291cmNlT3V0cHV0TG9jYXRpb24oKSB7Ci0gICAgSVBhdGhbXSBsb2NhdGlvbnMgPSBudWxsOwotICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0KLSAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICBsb2NhdGlvbnMgPSBSZXNvdXJjZVV0aWxzLmdldEFsbEphdmFTb3VyY2VMb2NhdGlvbnMocHJvamVjdCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcHJvamVjdCA9IHByb2plY3RfOwotICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICBsb2NhdGlvbnMgPSBSZXNvdXJjZVV0aWxzLmdldEFsbEphdmFTb3VyY2VMb2NhdGlvbnMocHJvamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsb2NhdGlvbnM7Ci0gIH0KLQotICBwdWJsaWMgV3NkZFJlc291cmNlIGdldFdzZGRSZXNvdXJjZSgpIHsKLSAgICByZXR1cm4gd3NkZFJlc291cmNlXzsKLSAgfQotCi0gIHByaXZhdGUgV3NkZFJlc291cmNlIGdldFdzZGRSZXNvdXJjZUZyb21TZWxlY3Rpb24oKSB7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdFNlbCA9IGdldEluaXRpYWxTZWxlY3Rpb24oKTsKLSAgICBpZiAoaW5pdFNlbCAhPSBudWxsICYmIGluaXRTZWwuc2l6ZSgpID09IDEpIHsKLSAgICAgIE9iamVjdCBvYmogPSBpbml0U2VsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsKSB7Ci0gICAgICAgIC8vIFNlcnZpY2Ugb2JqZWN0Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBvYmo7Ci0gICAgICAgIGRlc2NyaXB0aW9uTmFtZV8gPSBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIHByb2plY3RfID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2UpOwotICAgICAgICByZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRXc2RkUmVzb3VyY2Uoc2VydmljZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKSB7Ci0gICAgICAgIC8vIFdTREwgcmVzb3VyY2UKLSAgICAgICAgV1NETFJlc291cmNlSW1wbCByZXMgPSAoV1NETFJlc291cmNlSW1wbCkgb2JqOwotICAgICAgICBwcm9qZWN0XyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChyZXMpOwotICAgICAgICBMaXN0IHdzZGxSZXNvdXJjZXMgPSB3ZWJTZXJ2aWNlc01hbmFnZXJfLmdldFdTRExTZXJ2aWNlcyhyZXMpOwotICAgICAgICByZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRXc2RkUmVzb3VyY2UoKFNlcnZpY2UpIHdzZGxSZXNvdXJjZXMuZ2V0KDApKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIHsKLSAgICAgICAgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSB3c25ndCA9IChXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSBvYmo7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKXdzbmd0LmdldFdzZGxTZXJ2aWNlKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uTmFtZV8gPSBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7ICAgICAgICAKLSAgICAgICAgcHJvamVjdF8gPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2VydmljZSk7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlc01hbmFnZXJfLmdldFdzZGRSZXNvdXJjZShzZXJ2aWNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBnZXRXc0Rlc2NyaXB0aW9uKCkgewotICAgIHJldHVybiB3c0Rlc2NyaXB0aW9uXzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbk5hbWUoKXsKLSAgICByZXR1cm4gZGVzY3JpcHRpb25OYW1lXzsKLSAgfQotICAKLSAgcHVibGljIEhhc2h0YWJsZSBnZXRXc1JlZnNUb0hhbmRsZXJzKCl7Ci0gICAgcmV0dXJuIHdzRGVzY1RvSGFuZGxlcnNfOwotICB9Ci0gIAotICBwdWJsaWMgSGFzaHRhYmxlIGdldFNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaigpewotICAgIHJldHVybiB0aGlzLnNlcnZpY2VEZXNjTmFtZVRvRGVzY09ial87Ci0gIH0KLSAgCi0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9TZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDVjNWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9TZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuaW1wbC5Xc2RkRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSGFuZGxlclRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotCi0vKgotICogUHJvdmlkZSBhIHdheSB0byBleHRlcm5hbGl6ZSB0aGUgZWRpdGVkIGZpZWxkcyBhbmQgY3JlYXRlIG5ldyBoYW5kbGVycwotICogIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIHByaXZhdGUgTGlzdCBoYW5kbGVyVGFibGVJdGVtczsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjcmlwdGlvbl87Ci0gIHByaXZhdGUgV3NkZFJlc291cmNlIHdzZGRSZXNvdXJjZV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHdzRGVzY1RvSGFuZGxlcnNfOwotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmpfOwotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB0cnkgewotICAgICAgRW51bWVyYXRpb24gZSA9IHdzRGVzY1RvSGFuZGxlcnNfLmtleXMoKTsKLSAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0KLSAgICAgICAgSGFzaHRhYmxlIHdzUG9ydHNUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgSGFzaHRhYmxlIHdzUG9ydFRvSGFuZGxlclRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlRGVzY05hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIC8vIGxvYWQgUG9ydE5hbWUgLT4gUG9ydENvbXBvbmVudCB0YWJsZQotICAgICAgICBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjcmlwdGlvbl8gPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKSBzZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmpfLmdldChzZXJ2aWNlRGVzY05hbWUpOwotICAgICAgICBpZiAod3NEZXNjcmlwdGlvbl8gIT0gbnVsbCkgewotCi0gICAgICAgICAgTGlzdCB3c1BvcnRzID0gd3NEZXNjcmlwdGlvbl8uZ2V0UG9ydENvbXBvbmVudHMoKTsKLSAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdzUG9ydHMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIFBvcnRDb21wb25lbnQgcG9ydCA9IChQb3J0Q29tcG9uZW50KSB3c1BvcnRzLmdldChrKTsKLSAgICAgICAgICAgIHdzUG9ydHNUYWJsZS5wdXQocG9ydC5nZXRQb3J0Q29tcG9uZW50TmFtZSgpLCBwb3J0KTsKLSAgICAgICAgICAgIHdzUG9ydFRvSGFuZGxlclRhYmxlLnB1dChwb3J0LmdldFBvcnRDb21wb25lbnROYW1lKCksIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBoYW5kbGVyVGFibGVJdGVtcyA9IChMaXN0KSB3c0Rlc2NUb0hhbmRsZXJzXy5nZXQoc2VydmljZURlc2NOYW1lKTsKLSAgICAgICAgaWYgKGhhbmRsZXJUYWJsZUl0ZW1zICE9IG51bGwpIHsKLQotICAgICAgICAgIFdzZGRGYWN0b3J5IHdzZGRGYWN0b3J5ID0gbmV3IFdzZGRGYWN0b3J5SW1wbCgpOwotCi0gICAgICAgICAgLy9mb3JtIHBvcnQgY29tcG9uZW50cyB0YWJsZXMgZmlyc3QKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJUYWJsZUl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0KLSAgICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0pIGhhbmRsZXJUYWJsZUl0ZW1zLmdldChpKTsKLSAgICAgICAgICAgIFBvcnRDb21wb25lbnQgd3NQb3J0ID0gKFBvcnRDb21wb25lbnQpIGh0aS5nZXRQb3J0KCk7Ci0gICAgICAgICAgICBpZiAod3NQb3J0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgLy9maW5kIGl0Ci0gICAgICAgICAgICAgIGlmICh3c1BvcnRzVGFibGUuZ2V0KGh0aS5nZXRQb3J0TmFtZSgpKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHdzUG9ydCA9IChQb3J0Q29tcG9uZW50KSB3c1BvcnRzVGFibGUuZ2V0KGh0aS5nZXRQb3J0TmFtZSgpKTsKLSAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGl0OyBzaG91bGQgbm90IGdldCBpbnRvIGhlcmUKLSAgICAgICAgICAgICAgICB3c1BvcnQgPSB3c2RkRmFjdG9yeS5jcmVhdGVQb3J0Q29tcG9uZW50KCk7Ci0gICAgICAgICAgICAgICAgd3NQb3J0LnNldFBvcnRDb21wb25lbnROYW1lKGh0aS5nZXRQb3J0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB3c1BvcnRzVGFibGUucHV0KHdzUG9ydC5nZXRQb3J0Q29tcG9uZW50TmFtZSgpLCB3c1BvcnQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3c1BvcnRUb0hhbmRsZXJUYWJsZS5wdXQod3NQb3J0LmdldFBvcnRDb21wb25lbnROYW1lKCksIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gZm9ybSBIYW5kbGVyIGFuZCBwb3J0cyB0YWJsZQotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlclRhYmxlSXRlbXMuc2l6ZSgpOyBpKyspIHsKLQotICAgICAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBodGkgPSAoSGFuZGxlclRhYmxlSXRlbSkgaGFuZGxlclRhYmxlSXRlbXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gaHRpLmdldFBvcnROYW1lKCk7Ci0KLSAgICAgICAgICAgIFBvcnRDb21wb25lbnQgcG9ydCA9IChQb3J0Q29tcG9uZW50KSB3c1BvcnRzVGFibGUuZ2V0KHBvcnROYW1lKTsKLSAgICAgICAgICAgIGlmIChwb3J0ID09IG51bGwpIHJldHVybiBzdGF0dXM7Ci0KLSAgICAgICAgICAgIExpc3QgZXhpc3RpbmdIYW5kbGVycyA9IHBvcnQuZ2V0SGFuZGxlcnMoKTsKLQotICAgICAgICAgICAgT2JqZWN0IGhhbmRsZXIgPSBodGkuZ2V0SGFuZGxlcigpOwotICAgICAgICAgICAgaWYgKCFleGlzdGluZ0hhbmRsZXJzLmNvbnRhaW5zKGhhbmRsZXIpKSB7Ci0gICAgICAgICAgICAgIC8vIGNyZWF0ZSBpdAotICAgICAgICAgICAgICBIYW5kbGVyIG5ld0hhbmRsZXIgPSB3c2RkRmFjdG9yeS5jcmVhdGVIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgIG5ld0hhbmRsZXIuc2V0SGFuZGxlck5hbWUoaHRpLmdldEhhbmRsZXJOYW1lKCkpOwotICAgICAgICAgICAgICBuZXdIYW5kbGVyLnNldEhhbmRsZXJDbGFzcyhodGkuZ2V0SGFuZGxlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgKChMaXN0KSB3c1BvcnRUb0hhbmRsZXJUYWJsZS5nZXQocG9ydE5hbWUpKS5hZGQobmV3SGFuZGxlcik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgIC8vIGNsb25lIGl0Ci0gICAgICAgICAgICAgIEV0b29sc0NvcHlVdGlsaXR5IGNvcHlVdGlsID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7Ci0gICAgICAgICAgICAgIGNvcHlVdGlsLnNldENvcHlBZGFwdGVycyh0cnVlKTsKLSAgICAgICAgICAgICAgSGFuZGxlciBjbG9uZWRIYW5kbGVyID0gKEhhbmRsZXIpIGNvcHlVdGlsLmNvcHkoKEhhbmRsZXIpIGhhbmRsZXIpOwotICAgICAgICAgICAgICAoKExpc3QpIHdzUG9ydFRvSGFuZGxlclRhYmxlLmdldChwb3J0TmFtZSkpLmFkZChjbG9uZWRIYW5kbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyBoYW5kbGVycyBmcm9tIHBvcnRzCi0gICAgICAgIHJlbW92ZUV4aXN0aW5nSGFuZGxlcnMod3NQb3J0c1RhYmxlLCB3c1BvcnRUb0hhbmRsZXJUYWJsZSk7Ci0KLSAgICAgICAgLy8gYWRkIHBvcnRzIHRvIHdzRGVzY3JpcHRpb24KLSAgICAgICAgYWRkUG9ydHNUb0Rlc2NyaXB0aW9ucyh3c1BvcnRzVGFibGUsIHdzRGVzY3JpcHRpb25fKTsKLQotICAgICAgICAvLyBhZGQgaGFuZGxlcnMgdG8gcG9ydHMKLSAgICAgICAgYWRkSGFuZGxlcnNUb1BvcnRzKHdzUG9ydHNUYWJsZSwgd3NQb3J0VG9IYW5kbGVyVGFibGUpOwotICAgICAgfQotICAgICAgaWYgKHdzZGRSZXNvdXJjZV8gIT0gbnVsbCkgewotICAgICAgICB3c2RkUmVzb3VyY2VfLnNhdmUobmV3IEhhc2hNYXAoKSk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvL3N0YXR1cyA9IG5ldwotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZW1vdmVFeGlzdGluZ0hhbmRsZXJzKEhhc2h0YWJsZSBwb3J0c1RhYmxlLCBIYXNodGFibGUgcG9ydHNUb0hhbmRsZXJzVGFibGUpIHsKLSAgICB0cnkgewotICAgICAgaW50IGtleSA9IDA7Ci0gICAgICBFbnVtZXJhdGlvbiBwb3J0cyA9IHBvcnRzVG9IYW5kbGVyc1RhYmxlLmtleXMoKTsKLSAgICAgIHdoaWxlIChwb3J0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAoU3RyaW5nKSBwb3J0cy5uZXh0RWxlbWVudCgpOwotICAgICAgICBPYmplY3QgcG9ydCA9IHBvcnRzVGFibGUuZ2V0KHBvcnROYW1lKTsKLSAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCAmJiBwb3J0IGluc3RhbmNlb2YgUG9ydENvbXBvbmVudCkgewotICAgICAgICAgIExpc3QgaGFuZGxlcnMgPSAoKFBvcnRDb21wb25lbnQpIHBvcnQpLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZFBvcnRzVG9EZXNjcmlwdGlvbnMoSGFzaHRhYmxlIHBvcnRzVGFibGUsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3c0Rlc2NyaXB0aW9uXykgewotICAgIHRyeSB7Ci0gICAgICBFbnVtZXJhdGlvbiBwb3J0cyA9IHBvcnRzVGFibGUua2V5cygpOwotICAgICAgd2hpbGUgKHBvcnRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgIFN0cmluZyBwb3J0TmFtZSA9IChTdHJpbmcpIHBvcnRzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIC8vIG5ld2x5IGVkaXRlZCBwb3J0Ci0gICAgICAgIE9iamVjdCBwb3J0ID0gcG9ydHNUYWJsZS5nZXQocG9ydE5hbWUpOwotICAgICAgICAKLSAgICAgICAgLy8gZXhpc3RpbmcgcG9ydAotICAgICAgICBMaXN0IGVtZlBvcnRzID0gd3NEZXNjcmlwdGlvbl8uZ2V0UG9ydENvbXBvbmVudHMoKTsKLSAgICAgICAgaWYgKCFlbWZQb3J0cy5jb250YWlucyhwb3J0KSAmJiBwb3J0ICE9IG51bGwgJiYgcG9ydCBpbnN0YW5jZW9mIFBvcnRDb21wb25lbnQpIHsKLSAgICAgICAgICBlbWZQb3J0cy5hZGQoKFBvcnRDb21wb25lbnQpIHBvcnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRIYW5kbGVyc1RvUG9ydHMoSGFzaHRhYmxlIHBvcnRzVGFibGUsIEhhc2h0YWJsZSBwb3J0c1RvSGFuZGxlcnNUYWJsZSkgewotICAgIHRyeSB7Ci0gICAgICBpbnQga2V5ID0gMDsKLSAgICAgIEVudW1lcmF0aW9uIHBvcnRzID0gcG9ydHNUb0hhbmRsZXJzVGFibGUua2V5cygpOwotICAgICAgd2hpbGUgKHBvcnRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgIFN0cmluZyBwb3J0TmFtZSA9IChTdHJpbmcpIHBvcnRzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIE9iamVjdCBwb3J0ID0gcG9ydHNUYWJsZS5nZXQocG9ydE5hbWUpOwotICAgICAgICBpZiAocG9ydCAhPSBudWxsICYmIHBvcnQgaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50KSB7Ci0gICAgICAgICAgTGlzdCBoYW5kbGVycyA9IChMaXN0KSBwb3J0c1RvSGFuZGxlcnNUYWJsZS5nZXQocG9ydE5hbWUpOwotCi0gICAgICAgICAgTGlzdCBtb2RlbEhhbmRsZXJzID0gKChQb3J0Q29tcG9uZW50KSBwb3J0KS5nZXRIYW5kbGVycygpOwotICAgICAgICAgIG1vZGVsSGFuZGxlcnMuYWRkQWxsKGhhbmRsZXJzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBoYW5kbGVyVGFibGVJdGVtcwotICAgKiAgICAgICAgICBUaGUgaGFuZGxlclRhYmxlSXRlbXMgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SGFuZGxlcnNMaXN0KExpc3QgaGFuZGxlclRhYmxlSXRlbXMpIHsKLSAgICB0aGlzLmhhbmRsZXJUYWJsZUl0ZW1zID0gaGFuZGxlclRhYmxlSXRlbXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXc0Rlc2NUb0hhbmRsZXJzKEhhc2h0YWJsZSB3c0Rlc2NUb0hhbmRsZXJzKSB7Ci0gICAgdGhpcy53c0Rlc2NUb0hhbmRsZXJzXyA9IHdzRGVzY1RvSGFuZGxlcnM7Ci0gIH0KLQotLy8gIHB1YmxpYyB2b2lkIHNldFdzRGVzY3JpcHRpb24oV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzYykgewotLy8gICAgdGhpcy53c0Rlc2NyaXB0aW9uXyA9IHdzRGVzYzsKLS8vICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V3NkZFJlc291cmNlKFdzZGRSZXNvdXJjZSB3c2RkUmVzKSB7Ci0gICAgdGhpcy53c2RkUmVzb3VyY2VfID0gd3NkZFJlczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaihIYXNodGFibGUgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqKSB7Ci0gICAgdGhpcy5zZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmpfID0gc2VydmljZURlc2NOYW1lVG9EZXNjT2JqOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1RhYmxlVmlld2VyV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvVGFibGVWaWV3ZXJXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkODE0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvVGFibGVWaWV3ZXJXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uUHJvcGVydGllc1Jlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2cuRGlhbG9nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIFRhYmxlVmlld2VyV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgaW50IERFRkFVTFRfVEFCTEVfSEVJR0hUX0hJTlQgPSAxMDA7Ci0gIHByaXZhdGUgaW50IERFRkFVTFRfQ09MVU1OX1dJRFRIID0gODA7Ci0KLSAgcHVibGljIHN0YXRpYyBieXRlIE1BUF9PTkVfVE9fT05FID0gMzsKLSAgcHVibGljIHN0YXRpYyBieXRlIE1BUF9NQU5ZX1RPX09ORSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgYnl0ZSBNQVBfTUFOWV9UT19NQU5ZID0gMDsKLQotICBwcml2YXRlIFN0cmluZ1tdIGNvbHVtbnNfOwotICBwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyXzsKLSAgcHJpdmF0ZSBUYWJsZSB0YWJsZV87Ci0gIHByaXZhdGUgVGFibGVFZGl0b3IgZWRpdG9yXzsKLSAgcHJpdmF0ZSBUYWJsZUVkaXRvckxpc3RlbmVyIHRhYmxlRWRpdG9yTGlzdGVuZXJfOwotICBwcml2YXRlIFRleHQgdGV4dF87Ci0gIHByaXZhdGUgQnV0dG9uIGltcG9ydF87Ci0gIHByaXZhdGUgQnV0dG9uIGFkZF87Ci0gIHByaXZhdGUgQnV0dG9uIHJlbW92ZV87Ci0gIAotICBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRfOwotICBwcml2YXRlIExpc3RlbmVyICBzdGF0dXNMaXN0ZW5lcl87Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0gIHByaXZhdGUgYnl0ZSByZXNjcmljdGlvbiA9IE1BUF9NQU5ZX1RPX01BTlk7Ci0KLSAgcHJpdmF0ZSBMaXN0IHZhbHVlc187Ci0gIHByaXZhdGUgT2JqZWN0IGRlZmF1bHRWYWx1ZV87Ci0KLSAgcHJpdmF0ZSBQcm9wZXJ0aWVzUmVzb3VyY2VGaWx0ZXIgZmlsdGVyXyA9IG5ldyBQcm9wZXJ0aWVzUmVzb3VyY2VGaWx0ZXIoKTsKLQotICBwdWJsaWMgVGFibGVWaWV3ZXJXaWRnZXQoU3RyaW5nW10gY29sdW1ucywgTGlzdCBpbml0VmFsdWVzLCBPYmplY3QgZGVmYXVsdFZhbHVlLCBieXRlIHJlc2NyaWN0aW9uKQotICB7Ci0JY29sdW1uc18gPSBjb2x1bW5zOwotCXZhbHVlc18gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JaWYgKGluaXRWYWx1ZXMgIT0gbnVsbCAmJiBpbml0VmFsdWVzLnNpemUoKSA+IDApCi0JICB2YWx1ZXNfLmFkZEFsbChpbml0VmFsdWVzKTsKLQlkZWZhdWx0VmFsdWVfID0gKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSA/IGRlZmF1bHRWYWx1ZSA6IG5ldyBTdHJpbmcoIiIpOwotCXRoaXMucmVzY3JpY3Rpb24gPSByZXNjcmljdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsgCi0gICAgcGFyZW50XyAgICAgICAgID0gcGFyZW50OwotICAgIHN0YXR1c0xpc3RlbmVyXyA9IHN0YXR1c0xpc3RlbmVyOwotICAgIAotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0JQ29tcG9zaXRlICBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCUdyaWRMYXlvdXQgZ2wgICAgICAgID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkKLQlnbC5tYXJnaW5IZWlnaHQgPSAwOwotCWdsLm1hcmdpbldpZHRoID0gMDsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQl0YWJsZV8gPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlnZC5oZWlnaHRIaW50ID0gREVGQVVMVF9UQUJMRV9IRUlHSFRfSElOVDsKLQl0YWJsZV8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JdGFibGVfLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdGFibGVfLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCWludCBtYXhXaWR0aCA9IERFRkFVTFRfQ09MVU1OX1dJRFRIOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspCi0JewotCSAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGVfLCBTV1QuTk9ORSk7Ci0JICB0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtbnNfW2ldKTsKLQkgIHRhYmxlQ29sdW1uLnBhY2soKTsKLQkgIGludCB0YWJsZUNvbHVtbldpZHRoID0gTWF0aC5tYXgoREVGQVVMVF9DT0xVTU5fV0lEVEgsIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkpOwotCSAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgdGFibGVDb2x1bW5XaWR0aCk7Ci0JICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbkRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSh0YWJsZUNvbHVtbldpZHRoLCB0YWJsZUNvbHVtbldpZHRoLCB0cnVlKTsKLQkgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uRGF0YSk7Ci0JfQotCXRhYmxlXy5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCS8vIGluaXRpYWxpemUgdGhlIHRhYmxlIGVkaXRvcgotCWVkaXRvcl8gPSBuZXcgVGFibGVFZGl0b3IodGFibGVfKTsKLQkvLyBUaGUgZWRpdG9yIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBjZWxsIGFuZCBtdXN0Ci0JLy8gbm90IGJlIGFueSBzbWFsbGVyIHRoYW4gNTAgcGl4ZWxzLgotCWVkaXRvcl8uaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCWVkaXRvcl8uZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCWVkaXRvcl8ubWluaW11bVdpZHRoID0gbWF4V2lkdGg7Ci0JdGFibGVFZGl0b3JMaXN0ZW5lcl8gPSBuZXcgVGFibGVFZGl0b3JMaXN0ZW5lcigpOwotCXRhYmxlXy5hZGRNb3VzZUxpc3RlbmVyKHRhYmxlRWRpdG9yTGlzdGVuZXJfKTsKLQl0YWJsZVZpZXdlcl8gPSBuZXcgVGFibGVWaWV3ZXIodGFibGVfKTsKLQl0YWJsZVZpZXdlcl8uZ2V0Q29udHJvbCgpLmFkZEtleUxpc3RlbmVyKAotCSAgbmV3IEtleUxpc3RlbmVyKCkKLQkgIHsKLQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotCQl7Ci0JCSAgaW50IGFzY2lpRGVsID0gKGludCllLmNoYXJhY3RlcjsKLQkJICAvLyBEZWwKLQkJICBpZiAoYXNjaWlEZWwgPT0gMTI3KSAKLQkJCWhhbmRsZURlbGV0ZUtleVByZXNzZWQoKTsKLSAgICAgICAgICAgICAgICAvLyBFbnRlciBvciBzcGFjZQotICAgICAgICAgICAgICAgIGlmICgoKGludCllLmNoYXJhY3RlcikgPT0gMTMgfHwgKChpbnQpZS5jaGFyYWN0ZXIpID09IDMyKQotICAgICAgICAgICAgICAgICAgdGFibGVFZGl0b3JMaXN0ZW5lcl8uZWRpdFNlbGVjdGlvbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0JCXsKLQkJfQotCSAgfQotCSk7Ci0JdGFibGVWaWV3ZXJfLnNldENvbnRlbnRQcm92aWRlcihuZXcgTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLQl0YWJsZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcihuZXcgTGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0JdGFibGVWaWV3ZXJfLnNldElucHV0KHZhbHVlc18pOwotCXRhYmxlVmlld2VyXy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JICBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JICB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQl7Ci0JCSAgZW5hYmxlUmVtb3ZlKHRydWUpOwotCQl9Ci0JICB9Ci0JKTsKLQotCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlnbC5udW1Db2x1bW5zID0gMzsKLQlnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JaW1wb3J0XyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JaW1wb3J0Xy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX0lNUE9SVCIpKTsKLQlpbXBvcnRfLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCWltcG9ydF8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JICBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotCSAgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLQkJewotCQkgIGhhbmRsZUltcG9ydEJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0JCXsKLQkJfQotCSAgfQotCSk7Ci0JCi0JYWRkXyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JYWRkXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX0FERCIpKTsKLQlhZGRfLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCWFkZF8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JICBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotCSAgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLQkJewotCQkgIGhhbmRsZUFkZEJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0JCXsKLQkJfQotCSAgfQotCSk7Ci0KLQkKLQlyZW1vdmVfID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLQlyZW1vdmVfLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiTEFCRUxfUkVNT1ZFIikpOwotCXJlbW92ZV8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JcmVtb3ZlXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkgIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JICB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotCQl7Ci0JCSAgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLQkJewotCQl9Ci0JICB9Ci0JKTsKLQllbmFibGVSZW1vdmUoZmFsc2UpOwotCQotCXJldHVybiB0aGlzOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZVJlbW92ZShib29sZWFuIGVuYWJsZWQpCi0gIHsKLQlyZW1vdmVfLnNldEVuYWJsZWQoZW5hYmxlZCAmJiAhdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlSW1wb3J0QnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBEaWFsb2dVdGlscy5icm93c2VSZXNvdXJjZXMoCi0JICBwYXJlbnRfLmdldFNoZWxsKCksCi0JICBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKSwKLQkgIG51bGwsCi0JICBmaWx0ZXJfCi0JKTsKLQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotCXsKLQkgIHRyeQotCSAgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcHJvcHMubG9hZCgoKElGaWxlKXJlc291cmNlKS5nZXRDb250ZW50cygpKTsKLQkJU2V0IHNldCA9IHByb3BzLmVudHJ5U2V0KCk7Ci0JCWphdmEudXRpbC5MaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJdGVyYXRvciBpID0gc2V0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkKLQkJewotCQkgIE1hcC5FbnRyeSBtZSA9IChNYXAuRW50cnkpaS5uZXh0KCk7Ci0JCSAgU3RyaW5nIGtleSA9IChTdHJpbmcpbWUuZ2V0S2V5KCk7Ci0JCSAgU3RyaW5nIHZhbCA9IChTdHJpbmcpbWUuZ2V0VmFsdWUoKTsKLQkJICBsaXN0LmFkZChuZXcgU3RyaW5nW10ge2tleSx2YWx9KTsKLQkJfQotCQl2YWx1ZXNfLmFkZEFsbChsaXN0KTsKLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHsKLQkgICAgLy8gVE9ETyBSZXBvcnQgc29tZSBlcnJvciBoZXJlLgotCSAgfQotCX0KLQlyZWZyZXNoKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQl2YWx1ZXNfLmFkZChkZWZhdWx0VmFsdWVfKTsKLQlyZWZyZXNoKCk7Ci0Jc2V0U2VsZWN0aW9uQXNPYmplY3QodmFsdWVzXy5nZXQodGFibGVfLmdldEl0ZW1Db3VudCgpLTEpKTsKLQl0YWJsZUVkaXRvckxpc3RlbmVyXy5lZGl0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQloYW5kbGVEZWxldGVLZXlQcmVzc2VkKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpCi0gIHsKLQlpbnRlcm5hbERpc3Bvc2UoKTsKLQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQl7Ci0JICBpbnQgc2VsZWN0aW9uSW5kZXggPSB0YWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkgIGludCBzZWxlY3Rpb25Db3VudCA9IHRhYmxlXy5nZXRJdGVtQ291bnQoKTsKLQkgIHZhbHVlc18ucmVtb3ZlKHNlbGVjdGlvbkluZGV4KTsKLQkgIGlmIChzZWxlY3Rpb25JbmRleCA8IHNlbGVjdGlvbkNvdW50LTEpCi0JCXNldFNlbGVjdGlvbkFzT2JqZWN0KHZhbHVlc18uZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JICBlbHNlIGlmIChzZWxlY3Rpb25Db3VudCAtMiA+PSAwKQotCQlzZXRTZWxlY3Rpb25Bc09iamVjdCh2YWx1ZXNfLmdldChzZWxlY3Rpb25Db3VudC0yKSk7Ci0JICByZWZyZXNoKCk7Ci0JfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGludGVybmFsUmVmcmVzaCgpCi0gIHsKLQkvLyBzeW5jaHJvbml6ZSB0ZXh0IGZpZWxkLCBwcmV2aW91c2x5IHNlbGVjdGVkIHRhYmxlIGNlbGwgYW5kIG1vZGVsIChpbnB1dE9iamVjdCkKLQlpZiAodGV4dF8gIT0gbnVsbCkKLQl7Ci0JICBUYWJsZUl0ZW0gb2xkVGFibGVJdGVtID0gZWRpdG9yXy5nZXRJdGVtKCk7Ci0JICBpbnQgb2xkQ29sdW1uSW5kZXggPSBlZGl0b3JfLmdldENvbHVtbigpOwotCSAgaWYgKG9sZFRhYmxlSXRlbSAhPSBudWxsICYmIG9sZENvbHVtbkluZGV4ID49IDAgJiYgb2xkQ29sdW1uSW5kZXggPCBjb2x1bW5zXy5sZW5ndGgpCi0JICB7Ci0JCVN0cmluZyBvbGRUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotCQlvbGRUYWJsZUl0ZW0uc2V0VGV4dChvbGRDb2x1bW5JbmRleCwgb2xkVGV4dCk7Ci0JCWludCBvbGRSb3dJbmRleCA9IHRhYmxlXy5pbmRleE9mKG9sZFRhYmxlSXRlbSk7Ci0JCXZhbHVlc18uc2V0KG9sZFJvd0luZGV4LCBuZXcgU3RyaW5nW10ge29sZFRhYmxlSXRlbS5nZXRUZXh0KDApLCBvbGRUYWJsZUl0ZW0uZ2V0VGV4dCgxKX0pOwotCSAgfQotCX0KLQljaGVja01hcHBpbmdDb25zdHJhaW50cygpOwotCXN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudCggbnVsbCApOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrTWFwcGluZ0NvbnN0cmFpbnRzKCkgewotCi0JSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0JZm9yKGludCBjbnQ9MDsgY250PHZhbHVlc18uc2l6ZSgpOyBjbnQrKyl7Ci0JCVN0cmluZ1tdIHZhbHVlID0gKFN0cmluZ1tdKXZhbHVlc18uZ2V0KGNudCk7Ci0JCWlmKG1hcC5jb250YWluc0tleSh2YWx1ZVswXSkgJiYgKChyZXNjcmljdGlvbiAmIDEpIT0wKSl7Ci0JCQltZXNzYWdlID0gbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX01BUFBJTkdfRFVQTElDQVRFX0VOVFJJRVMiLCBuZXcgU3RyaW5nW117Y29sdW1uc19bMF0sY29sdW1uc19bMV19KTsKLQkJCXJldHVybjsKLQkJfQotCQlpZihtYXAuY29udGFpbnNWYWx1ZSh2YWx1ZVsxXSkgJiYgKChyZXNjcmljdGlvbiAmIDIpIT0wKSl7Ci0JCQltZXNzYWdlID0gbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX01BUFBJTkdfRFVQTElDQVRFX0VOVFJJRVMiLCBuZXcgU3RyaW5nW117Y29sdW1uc19bMV0sY29sdW1uc19bMF19KTsKLQkJCXJldHVybjsKLQkJfQotCQltYXAucHV0KHZhbHVlWzBdLHZhbHVlWzFdKTsKLQotCX0KLQltZXNzYWdlID0gbnVsbDsKLQotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2UgPT0gbnVsbCA/IG5ldyBTaW1wbGVTdGF0dXMoIiIpIDogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICIiLCBtZXNzYWdlLCBTdGF0dXMuRVJST1IgKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRTZWxlY3Rpb25Bc09iamVjdChPYmplY3Qgb2JqZWN0KQotICB7Ci0JdGFibGVWaWV3ZXJfLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpLCB0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0JaW50ZXJuYWxSZWZyZXNoKCk7Ci0JdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyBUYWJsZUl0ZW1bXSBnZXRJdGVtcygpCi0gIHsKLQkvL2ludGVybmFsUmVmcmVzaCgpOwotCXJldHVybiB0YWJsZV8uZ2V0SXRlbXMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotICB7Ci0JYWRkXy5zZXRFbmFibGVkKGVuYWJsZWQpOwotCWVuYWJsZVJlbW92ZShlbmFibGVkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0JaW50ZXJuYWxEaXNwb3NlKCk7Ci0JaWYgKGVkaXRvcl8gIT0gbnVsbCkKLQkgIGVkaXRvcl8uZGlzcG9zZSgpOwotCWlmICh0YWJsZV8gIT0gbnVsbCkKLQkgIHRhYmxlXy5kaXNwb3NlKCk7Ci0JaWYgKGFkZF8gIT0gbnVsbCkKLQkgIGFkZF8uZGlzcG9zZSgpOwotCWlmIChyZW1vdmVfICE9IG51bGwpCi0JICByZW1vdmVfLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbnRlcm5hbERpc3Bvc2UoKQotICB7Ci0JaWYgKHRleHRfICE9IG51bGwpCi0JICB0ZXh0Xy5kaXNwb3NlKCk7Ci0JdGV4dF8gPSBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIFRhYmxlRWRpdG9yTGlzdGVuZXIgaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyCi0gIHsKLQlwcml2YXRlIGludCBjdXJyU2VsZWN0aW9uSW5kZXhfOwotICAgIHByaXZhdGUgaW50IGVkaXRSb3dfOwotICAgIHByaXZhdGUgaW50IGVkaXRDb2x1bW5fOwotCi0JcHVibGljIFRhYmxlRWRpdG9yTGlzdGVuZXIoKQotCXsKLQkgIHN1cGVyKCk7Ci0JICBjdXJyU2VsZWN0aW9uSW5kZXhfID0gLTE7Ci0gICAgICAgICBlZGl0Um93XyA9IC0xOwotICAgICAgICAgZWRpdENvbHVtbl8gPSAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkKLQl7Ci0JICBtb3VzZURvd24oZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkKLQl7Ci0JICAvLyByZWZyZXNoIHRhYmxlCi0JICBpbnRlcm5hbFJlZnJlc2goKTsKLQkgIC8vIENsZWFuIHVwIHByZXZpb3VzIHRleHQgZWRpdG9yIGNvbnRyb2wKLQkgIGludGVybmFsRGlzcG9zZSgpOwotCSAgLy8gdXBkYXRlIHRhYmxlCi0JICBpZiAodGFibGVfLmlzRm9jdXNDb250cm9sKCkpCi0JICB7Ci0JCWludCBzZWxlY3RlZFJvd0luZGV4ID0gZ2V0U2VsZWN0ZWRSb3codGFibGVfLCBlLnkpOwotCQlpZiAoY3VyclNlbGVjdGlvbkluZGV4XyAhPSAtMSAmJiBzZWxlY3RlZFJvd0luZGV4ICE9IC0xICYmIGN1cnJTZWxlY3Rpb25JbmRleF8gPT0gc2VsZWN0ZWRSb3dJbmRleCkKLQkJewotCQkgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZV8uZ2V0SXRlbShzZWxlY3RlZFJvd0luZGV4KTsKLQkJICBpbnQgc2VsZWN0ZWRDb2x1bW5JbmRleCA9IGdldFNlbGVjdGVkQ29sdW1uKHRhYmxlSXRlbSwgZS54LCBlLnkpOwotCQkgIGlmIChzZWxlY3RlZENvbHVtbkluZGV4ICE9IC0xICYmICh0ZXh0XyA9PSBudWxsIHx8IHRleHRfLmlzRGlzcG9zZWQoKSB8fCBzZWxlY3RlZENvbHVtbkluZGV4ICE9IGVkaXRvcl8uZ2V0Q29sdW1uKCkpKQotCQkJZWRpdFNlbGVjdGlvbihzZWxlY3RlZFJvd0luZGV4LCBzZWxlY3RlZENvbHVtbkluZGV4KTsKLQkJfQotCQljdXJyU2VsZWN0aW9uSW5kZXhfID0gc2VsZWN0ZWRSb3dJbmRleDsKLQkgIH0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkKLQl7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0U2VsZWN0ZWRSb3coVGFibGUgdGFibGUsIGludCB5KQotCXsKLQkgIFRhYmxlSXRlbVtdIHRhYmxlSXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUl0ZW1zLmxlbmd0aDsgaSsrKQotCSAgewotCQlSZWN0YW5nbGUgcmVjdGFuZ2xlID0gdGFibGVJdGVtc1tpXS5nZXRCb3VuZHMoMCk7Ci0JCWlmIChyZWN0YW5nbGUgIT0gbnVsbCAmJiB5ID49IHJlY3RhbmdsZS55ICYmIHkgPCAocmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0KSkKLQkJICByZXR1cm4gaTsKLQkgIH0KLQkgIHJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRTZWxlY3RlZENvbHVtbihUYWJsZUl0ZW0gdGFibGVJdGVtLCBpbnQgeCwgaW50IHkpCi0JewotCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zXy5sZW5ndGg7IGkrKykKLQkgIHsKLQkJaWYgKHRhYmxlSXRlbS5nZXRCb3VuZHMoaSkuY29udGFpbnMoeCwgeSkpCi0JCSAgcmV0dXJuIGk7Ci0JICB9Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRTZWxlY3Rpb24oaW50IHJvdywgaW50IGNvbHVtbikKLQl7Ci0gICAgICAgICBlZGl0Um93XyA9IHJvdzsKLSAgICAgICAgIGVkaXRDb2x1bW5fID0gY29sdW1uOwotCSAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlXy5nZXRJdGVtKHJvdyk7Ci0JICAvLyBTZXR1cCBhZGFwdGVyIGZvciB0aGUgbmV3IHNlbGVjdGlvbgotCSAgdGV4dF8gPSBuZXcgVGV4dCh0YWJsZV8sIFNXVC5OT05FKTsKLQkgIFN0cmluZyB0ZXh0ID0gdGFibGVJdGVtLmdldFRleHQoY29sdW1uKTsKLQkgIHRleHRfLnNldFRleHQoKHRleHQgIT0gbnVsbCkgPyB0ZXh0IDogIiIpOwotICAgICAgICAgdGV4dF8uYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAvLyBFc2MKLSAgICAgICAgICAgICAgIGlmICgoKGludCllLmNoYXJhY3RlcikgPT0gMjcpCi0gICAgICAgICAgICAgICAgIGNhbmNlbFNlbGVjdGlvbigpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICk7Ci0gICAgICAgICB0ZXh0Xy5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkKLSAgICAgICAgICAgICAgICAgdHJhdmVyc2VUYWJOZXh0KCk7Ci0gICAgICAgICAgICAgICBlbHNlIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKQotICAgICAgICAgICAgICAgICB0cmF2ZXJzZVRhYlByZXZpb3VzKCk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICApOwotCSAgZWRpdG9yXy5zZXRFZGl0b3IodGV4dF8sIHRhYmxlSXRlbSwgY29sdW1uKTsKLQkgIHRleHRfLnNldEZvY3VzKCk7Ci0JICB0ZXh0Xy5zZWxlY3RBbGwoKTsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZVRhYk5leHQoKQotICAgIHsKLSAgICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgICAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgICBpZiAoIShlZGl0Um93XyA9PSB0YWJsZV8uZ2V0SXRlbXMoKS5sZW5ndGgtMSAmJiBlZGl0Q29sdW1uXyA9PSBjb2x1bW5zXy5sZW5ndGgtMSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlZGl0Q29sdW1uXyA8IGNvbHVtbnNfLmxlbmd0aC0xKQotICAgICAgICAgIGVkaXRDb2x1bW5fKys7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVkaXRDb2x1bW5fID0gMDsKLSAgICAgICAgICBlZGl0Um93XysrOwotICAgICAgICAgIHRhYmxlXy5zZWxlY3QoZWRpdFJvd18pOwotICAgICAgICB9Ci0gICAgICAgIGVkaXRTZWxlY3Rpb24oZWRpdFJvd18sIGVkaXRDb2x1bW5fKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZVRhYlByZXZpb3VzKCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbFJlZnJlc2goKTsKLSAgICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgICAgaWYgKCEoZWRpdFJvd18gPT0gMCAmJiBlZGl0Q29sdW1uXyA9PSAwKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVkaXRDb2x1bW5fID4gMCkKLSAgICAgICAgICBlZGl0Q29sdW1uXy0tOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0Q29sdW1uXyA9IGNvbHVtbnNfLmxlbmd0aC0xOwotICAgICAgICAgIGVkaXRSb3dfLS07Ci0gICAgICAgICAgdGFibGVfLnNlbGVjdChlZGl0Um93Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWRpdFNlbGVjdGlvbihlZGl0Um93XywgZWRpdENvbHVtbl8pOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNhbmNlbFNlbGVjdGlvbigpCi0gICAgewotICAgICAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgICBpbnRlcm5hbFJlZnJlc2goKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBlZGl0U2VsZWN0aW9uKCkKLQl7Ci0JICBpbnQgc2VsZWN0ZWRSb3dJbmRleCA9IHRhYmxlXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCSAgaWYgKHNlbGVjdGVkUm93SW5kZXggIT0gLTEgJiYgY29sdW1uc18ubGVuZ3RoID4gMCkKLQkgIHsKLQkJLy8gcmVmcmVzaCB0YWJsZQotCQlpbnRlcm5hbFJlZnJlc2goKTsKLQkJLy8gQ2xlYW4gdXAgYW55IHByZXZpb3VzIGVkaXRvciBjb250cm9sCi0JCWludGVybmFsRGlzcG9zZSgpOwotCQllZGl0U2VsZWN0aW9uKHNlbGVjdGVkUm93SW5kZXgsIDApOwotCSAgfQotCSAgY3VyclNlbGVjdGlvbkluZGV4XyA9IHNlbGVjdGVkUm93SW5kZXg7Ci0JfQotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIExpc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQl7Ci0JICB0YWJsZVZpZXdlcl8uYWRkKGdldEVsZW1lbnRzKG5ld0lucHV0KSk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JewotCSAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIExpc3QpCi0JICB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KWlucHV0RWxlbWVudDsKLQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbbGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspCi0JCSAgb2JqZWN0c1tpXSA9IGxpc3QuZ2V0KGkpOwotCQlyZXR1cm4gb2JqZWN0czsKLQkgIH0KLQkgIGVsc2UKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIExpc3RMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlcgotICB7Ci0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JewotCSAgcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JewotCQlyZXR1cm4gKChTdHJpbmdbXSllbGVtZW50KVtjb2x1bW5JbmRleF07CSAgCQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCXsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci0gIH0KLSB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg1Y2U5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5EaWFsb2dXV1dBdXRoZW50aWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIGltcGxlbWVudHMgQ29uZGl0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyB3ZWJTZXJ2aWNlVVJJOwotICBwcml2YXRlIFN0cmluZyBodHRwQmFzaWNBdXRoVXNlcm5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIGh0dHBCYXNpY0F1dGhQYXNzd29yZDsKLSAgcHJpdmF0ZSBib29sZWFuIG5lZWRXU0RMU2VsZWN0aW9uVHJlZVdpZGdldDsKLSAgCi0gIHB1YmxpYyBXU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZCgpCi0gIHsKLSAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAJaWYgKHdlYlNlcnZpY2VzUGFyc2VyID09IG51bGwpCi0gIAkgIHdlYlNlcnZpY2VzUGFyc2VyID0gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7Ci0gIAlyZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCW5lZWRXU0RMU2VsZWN0aW9uVHJlZVdpZGdldCA9IGZhbHNlOwotICAJV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyID0gZ2V0V2ViU2VydmljZXNQYXJzZXIoKTsKLSAgCXBhcnNlci5zZXRVUkkod2ViU2VydmljZVVSSSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcGFyc2VyLnBhcnNlKFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX1dTSUwgfCBXZWJTZXJ2aWNlc1BhcnNlci5QQVJTRV9ESVNDTyB8IFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX0xJTktTKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlKQotICAgIHsKLSAgICAgIERpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uIGRpYWxvZyA9IG5ldyBEaWFsb2dXV1dBdXRoZW50aWNhdGlvbihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotICAgICAgZGlhbG9nLmhhbmRsZVdXV0F1dGhlbnRpY2F0aW9uKHd3d2FlKTsKLSAgICAgIFN0cmluZyB1c2VybmFtZSA9IGRpYWxvZy5nZXRVc2VybmFtZSgpOwotICAgICAgU3RyaW5nIHBhc3N3b3JkID0gZGlhbG9nLmdldFBhc3N3b3JkKCk7Ci0gICAgICBodHRwQmFzaWNBdXRoVXNlcm5hbWUgPSB1c2VybmFtZTsKLSAgICAgIGh0dHBCYXNpY0F1dGhQYXNzd29yZCA9IHBhc3N3b3JkOwotICAgICAgaWYgKHVzZXJuYW1lICE9IG51bGwgJiYgcGFzc3dvcmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFyc2VyLnNldEhUVFBCYXNpY0F1dGhVc2VybmFtZSh1c2VybmFtZSk7Ci0gICAgICAgIHBhcnNlci5zZXRIVFRQQmFzaWNBdXRoUGFzc3dvcmQocGFzc3dvcmQpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHBhcnNlci5wYXJzZShXZWJTZXJ2aWNlc1BhcnNlci5QQVJTRV9XU0lMIHwgV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfRElTQ08gfCBXZWJTZXJ2aWNlc1BhcnNlci5QQVJTRV9MSU5LUyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVVJJX05PVF9SRVNPTFZBQkxFIiwgbmV3IE9iamVjdFtdIHt3ZWJTZXJ2aWNlVVJJfSksIFN0YXR1cy5FUlJPUiwgdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgcGFyc2VyLnNldEhUVFBCYXNpY0F1dGhVc2VybmFtZShudWxsKTsKLSAgICAgICAgICBwYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKG51bGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VUklfTk9UX1JFU09MVkFCTEUiLCBuZXcgT2JqZWN0W10ge3dlYlNlcnZpY2VVUkl9KSwgU3RhdHVzLkVSUk9SLCB0KTsKLSAgICB9Ci0gICAgV2ViU2VydmljZUVudGl0eSB3c0VudGl0eSA9IHBhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkod2ViU2VydmljZVVSSSk7Ci0gICAgaWYgKHdzRW50aXR5ICE9IG51bGwpCi0gICAgewotICAgICAgaW50IHR5cGUgPSB3c0VudGl0eS5nZXRUeXBlKCk7Ci0gICAgICBpZiAodHlwZSAhPSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NETCkKLSAgICAgIAluZWVkV1NETFNlbGVjdGlvblRyZWVXaWRnZXQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLSAgewotICAgIHJldHVybiBuZWVkV1NETFNlbGVjdGlvblRyZWVXaWRnZXQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VVUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVVJJKFN0cmluZyB3ZWJTZXJ2aWNlVVJJKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlVVJJID0gd2ViU2VydmljZVVSSTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkKLSAgewotICAgIHJldHVybiBnZXRXZWJTZXJ2aWNlVVJJKCk7Ci0gIH0KLS8qKgotICogQHJldHVybiBSZXR1cm5zIHRoZSBodHRwQmFzaWNBdXRoUGFzc3dvcmQuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0SHR0cEJhc2ljQXV0aFBhc3N3b3JkKCkgewotCXJldHVybiBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci19Ci0vKioKLSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaHR0cEJhc2ljQXV0aFVzZXJuYW1lLgotICovCi1wdWJsaWMgU3RyaW5nIGdldEh0dHBCYXNpY0F1dGhVc2VybmFtZSgpIHsKLQlyZXR1cm4gaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyMGZhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9qZWN0LgotICAgKi8KLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHByb2plY3Q7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHByb2plY3QKLSAgICogICAgICAgICAgVGhlIHByb2plY3QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkKLSAgewotICAgIHJldHVybiB3c2RsVVJJOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlc1BhcnNlci4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICBpZiAod2ViU2VydmljZXNQYXJzZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIGlmICh3c2RsVVJJICE9IG51bGwgJiYgZ2V0V2ViU2VydmljZXNQYXJzZXIoKS5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJJKSAhPSBudWxsKQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucGx1Z2luIiwgdGhpcyk7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9NU0dfU0VMRUNUSU9OX01VU1RfQkVfV1NETCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvblRyZWVXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uVHJlZVdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjViN2IwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uVHJlZVdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi0vKioKLSogVGhpcyB3aXphcmQgcGFnZSBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBXU0RMIFVSSSBmb3IgY29uc3VtcHRpb24KLSovCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvblRyZWVXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLSAgLypDT05URVhUX0lEIFBXV1MwMDAxIGZvciB0aGUgV1NETCBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFdXU19QQUdFID0gIi5QV1dTMDAwMSI7Ci0KLSAgLypDT05URVhUX0lEIFBXV1MwMDAyIGZvciB0aGUgV1NETCBEb2N1bWVudCB0ZXh0IGZpZWxkIG9mIHRoZSBXU0RMIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QV1dTX1RFWFRfV1NETCA9ICIuUFdXUzAwMDIiOwotCi0gIC8qQ09OVEVYVF9JRCBQV1dTMDAwMyBmb3IgdGhlIFdTREwgUmVzb3VyY2UgQnJvd3NlIGJ1dHRvbiBvZiB0aGUgV1NETCBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFdXU19CVVRUT05fQlJPV1NFX1dTREwgPSAiLlBXV1MwMDAzIjsKLQotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyB3ZWJTZXJ2aWNlVVJJOwotICAKLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotICBwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcl87Ci0gIHByaXZhdGUgVHJlZUNvbnRlbnRQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyOwotICBwcml2YXRlIFRyZWUgdHJlZV87Ci0gIHByaXZhdGUgaW50IHBhZ2VXaWR0aF87Ci0KLSAgLyoqCi0gICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgKi8KLSAgcHVibGljIFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0KCkKLSAgewotICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICB9Ci0KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAJdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1dTX1BBR0UiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIHBsdWdpbklkXyArIElORk9QT1BfUFdXU19QQUdFKTsKLQotICAgIExhYmVsIHdzZGxMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLSAgICB3c2RsTGFiZWwuc2V0VGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfU0VMRUNUX1dTREwiKSk7Ci0gICAgd3NkbExhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0gICAgdHJlZV8gPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLmhlaWdodEhpbnQgPSAyMDA7Ci0gICAgdHJlZV8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgcGFnZVdpZHRoXyA9IHRyZWVfLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLng7Ci0gICAgdHJlZVZpZXdlcl8gPSBuZXcgVHJlZVZpZXdlcih0cmVlXyk7Ci0gICAgdHJlZUNvbnRlbnRQcm92aWRlciA9IG5ldyBUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0gICAgdHJlZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKHRyZWVDb250ZW50UHJvdmlkZXIpOwotICAgIHRyZWVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IFRyZWVMYWJlbFByb3ZpZGVyKCkpOwotICAgIHRyZWVWaWV3ZXJfLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLSAgICAgIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgCWhhbmRsZVRyZWVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRyZWVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICB7Ci0gIAlzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChuZXcgRXZlbnQoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2VzUGFyc2VyLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAJcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gIAl0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIAl0cmVlVmlld2VyXy5zZXRJbnB1dCh0aGlzLndlYlNlcnZpY2VzUGFyc2VyKTsKLSAgCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVVJJKFN0cmluZyB3c1VSSSkKLSAgewotICAJd2ViU2VydmljZVVSSSA9IHdzVVJJOwotICAJdHJlZUNvbnRlbnRQcm92aWRlci5zZXRXZWJTZXJ2aWNlVVJJKHdlYlNlcnZpY2VVUkkpOwotICAgIHJlZnJlc2hUcmVlVmlld2VyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoVHJlZVZpZXdlcigpCi0gIHsKLSAgCWlmICh3ZWJTZXJ2aWNlc1BhcnNlciAhPSBudWxsICYmIHdlYlNlcnZpY2VVUkkgIT0gbnVsbCkKLSAgCXsKLSAgCSAgdHJlZVZpZXdlcl8ucmVmcmVzaCgpOwotICAJICBDb250cm9sIHNoZWxsID0gdHJlZV8uZ2V0U2hlbGwoKTsKLSAgCSAgaWYgKHRyZWVfLmdldFNpemUoKS54ID4gcGFnZVdpZHRoXyB8fCBzaGVsbC5nZXRTaXplKCkueCA+IHBhZ2VXaWR0aF8pCi0gIAkgIHsKLSAgCSAgICB0cmVlXy5zZXRTaXplKHBhZ2VXaWR0aF8sIHRyZWVfLmdldFNpemUoKS55KTsKLSAgCSAgICBzaGVsbC5zZXRTaXplKHBhZ2VXaWR0aF8sIHNoZWxsLmdldFNpemUoKS55KTsKLSAgCSAgICBzaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAJICAgIHNoZWxsLnJlZHJhdygpOwotICAJICB9Ci0gIAl9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotICB7Ci0gICAgdHJlZV8uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKLSAgewotICAgIHJldHVybiB0cmVlXy5pc0VuYWJsZWQoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkKLSAgewotICAJV2ViU2VydmljZUVudGl0eSBlbnRpdHkgPSBnZXRTZWxlY3Rpb25Bc1dlYlNlcnZpY2VFbnRpdHkoKTsKLSAgCWlmIChlbnRpdHkgIT0gbnVsbCkKLSAgCSAgcmV0dXJuIGVudGl0eS5nZXRVUkkoKTsKLSAgCWVsc2UKLSAgCSAgcmV0dXJuIHdlYlNlcnZpY2VVUkk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgV2ViU2VydmljZUVudGl0eSBnZXRTZWxlY3Rpb25Bc1dlYlNlcnZpY2VFbnRpdHkoKQotICB7Ci0gIAlpZiAodHJlZVZpZXdlcl8gIT0gbnVsbCkKLSAgCXsKLSAgICAgIElTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoIXNlbC5pc0VtcHR5KCkgJiYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWw7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV2ViU2VydmljZUVudGl0eSkKLSAgICAgICAgICByZXR1cm4gKFdlYlNlcnZpY2VFbnRpdHkpb2JqZWN0OwotICAgICAgfQotICAJfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKQotICB7Ci0gICAgV2ViU2VydmljZUVudGl0eSB3c0VudGl0eSA9IGdldFNlbGVjdGlvbkFzV2ViU2VydmljZUVudGl0eSgpOwotICAgIGlmICh3c0VudGl0eSA9PSBudWxsIHx8IHdzRW50aXR5LmdldFR5cGUoKSAhPSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NETCkKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiUEFHRV9NU0dfU0VMRUNUSU9OX01VU1RfQkVfV1NETCIpLCBTdGF0dXMuRVJST1IpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgCXByaXZhdGUgU3RyaW5nIHdlYlNlcnZpY2VVUkk7Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZXNQYXJzZXIpCi0gICAgICB7Ci0gICAgICAJV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyID0gKFdlYlNlcnZpY2VzUGFyc2VyKWlucHV0RWxlbWVudDsKLSAgICAgICAgT2JqZWN0IHdzRW50aXR5ID0gcGFyc2VyLmdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3ZWJTZXJ2aWNlVVJJKTsKLSAgICAgICAgaWYgKHdzRW50aXR5ICE9IG51bGwpCi0gICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7d3NFbnRpdHl9OwotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZUVudGl0eSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gKChXZWJTZXJ2aWNlRW50aXR5KXBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0W2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIG9iamVjdHNbaV0gPSBsaXN0LmdldChpKTsKLSAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFbnRpdHkpCi0gICAgICAgIHJldHVybiAoKFdlYlNlcnZpY2VFbnRpdHkpZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0gICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVVJJKFN0cmluZyB3c1VSSSkKLSAgICB7Ci0gICAgICB3ZWJTZXJ2aWNlVVJJID0gd3NVUkk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBUcmVlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgc3dpdGNoICgoKFdlYlNlcnZpY2VFbnRpdHkpZWxlbWVudCkuZ2V0VHlwZSgpKQotICAgICAgewotICAgICAgICBjYXNlIFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9IVE1MOgotICAgICAgICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3dzaWwvaHRtbC5naWYiKS5jcmVhdGVJbWFnZSgpOwotICAgICAgICBjYXNlIFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0lMOgotICAgICAgICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3dzaWwvd3NpbC5naWYiKS5jcmVhdGVJbWFnZSgpOwotICAgICAgICBjYXNlIFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0RMOgotICAgICAgICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL3dzaWwvd3NkbC5naWYiKS5jcmVhdGVJbWFnZSgpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChXZWJTZXJ2aWNlRW50aXR5KWVsZW1lbnQpLmdldFVSSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5YTcyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25fOwotICAKLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVVJJKCkKLSAgewotICAJaWYgKHNlbGVjdGlvbl8gIT0gbnVsbCAmJiAhc2VsZWN0aW9uXy5pc0VtcHR5KCkpCi0gIAl7Ci0gIAkgIE9iamVjdCBmaXJzdFNlbCA9IHNlbGVjdGlvbl8uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gIAkgIGlmIChmaXJzdFNlbCBpbnN0YW5jZW9mIElGaWxlKQotICAJICB7Ci0gIAkgICAgSUZpbGUgaWZpbGUgPSAoSUZpbGUpZmlyc3RTZWw7Ci0gIAkgICAgU3RyaW5nIGV4dCA9IGlmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgCSAgICBpZiAoZXh0ICE9IG51bGwgJiYgKGV4dC5lcXVhbHMoIndzZGwiKSB8fCBleHQuZXF1YWxzKCJ3c2lsIikgfHwgZXh0LmVxdWFscygiaHRtbCIpKSkKLSAgCSAgICB7Ci0gIAkgICAgICByZXR1cm4gaWZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAJICAgIH0KLSAgCSAgfQotICAJICBpZiAoZmlyc3RTZWwgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbCkKLSAgICAgIHsKLSAgICAgICAgU2VydmljZUltcGwgc2VydmljZUltcGwgPSAoU2VydmljZUltcGwpZmlyc3RTZWw7Ci0gICAgICAgIHJldHVybiBKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSShzZXJ2aWNlSW1wbCk7Ci0gICAgICB9Ci0gIAkgIGlmIChmaXJzdFNlbCBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpCi0gICAgICB7Ci0gIAkgICAgU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpZmlyc3RTZWw7Ci0gICAgICAgIHJldHVybiBKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSShzZXJ2aWNlUmVmKTsKLSAgICAgIH0KLSAgCSAgaWYgKGZpcnN0U2VsIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkKLSAgCSAgewotICAJICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbFJJID0gKFdTRExSZXNvdXJjZUltcGwpZmlyc3RTZWw7Ci0gIAkgICAgcmV0dXJuIEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0RMVVJJKHdzZGxSSSk7Ci0gIAkgIH0KLSAgCSAgaWYgKGZpcnN0U2VsIGluc3RhbmNlb2YgU3RyaW5nKQotICAJICAgIHJldHVybiAoU3RyaW5nKWZpcnN0U2VsOwotICAJfQotICAgIHJldHVybiAiIjsKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7Ci0gICAgc2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsgICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuV1NJTCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NpbFVSSSgpCi0gIHsKLSAgCVN0cmluZyB3c1VSSSA9IGdldFdlYlNlcnZpY2VVUkkoKTsKLSAgCWlmICh3c1VSSSAhPSBudWxsICYmIHdzVVJJLmxlbmd0aCgpID4gMCAmJiB3c1VSSS5lbmRzV2l0aCgid3NkbCIpKQotICAJewotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcih3c1VSSS5zdWJzdHJpbmcoMCwgd3NVUkkubGVuZ3RoKCktNCkpOwotICAgICAgc2IuYXBwZW5kKCJ3c2lsIik7Ci0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgCX0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAJSVByb2plY3QgcCA9IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbihzZWxlY3Rpb25fKTsKLSAgCXJldHVybiBwOwotICB9Ci0gIAotICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAgIGlmIChyZXNvdXJjZT09bnVsbCkgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICBJUHJvamVjdCBwID0gUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIH0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwOGRjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LldTRExTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LldTRExTZWxlY3Rpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotCi0gIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcjsKLSAgCi0gIHByaXZhdGUgV1NETFNlbGVjdGlvbldpZGdldCB3c2RsU2VsZWN0aW9uV2lkZ2V0OwotICBwcml2YXRlIFN0cmluZyB3ZWJTZXJ2aWNlVVJJOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gIAotICBwdWJsaWMgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIoKQotICB7Ci0gICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICB9Ci0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIHRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICB3c2RsU2VsZWN0aW9uV2lkZ2V0ID0gbmV3IFdTRExTZWxlY3Rpb25XaWRnZXQoKTsKLSAgICB3c2RsU2VsZWN0aW9uV2lkZ2V0LmFkZENvbnRyb2xzKHBhcmVudCwgc3RhdHVzTGlzdGVuZXIpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gd3NkbFNlbGVjdGlvbldpZGdldC5nZXRTdGF0dXMoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVVSSShTdHJpbmcgd3NVcmkpCi0gIHsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWw7Ci0gICAgaWYgKHdzVXJpICE9IG51bGwpCi0gICAgICBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih3c1VyaSk7Ci0gICAgZWxzZQotICAgICAgc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgICB3c2RsU2VsZWN0aW9uV2lkZ2V0LnNldEluaXRpYWxTZWxlY3Rpb24oc2VsKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVVJJKCkKLSAgewotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCAgICA9IHdzZGxTZWxlY3Rpb25XaWRnZXQuZ2V0T2JqZWN0U2VsZWN0aW9uKCk7Ci0gICAgT2JqZWN0ICAgICAgICAgICAgICAgb2JqZWN0ID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotICAgIFN0cmluZyAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgCi0gICAgaWYgKG9iamVjdCAhPSBudWxsICkKLSAgICB7Ci0gICAgICBpZiggb2JqZWN0IGluc3RhbmNlb2YgV1NETFNlbGVjdGlvbldyYXBwZXIgKQotICAgICAgeyAgICAKLSAgICAgICAgLy8gR2V0IGF0IHRoZSBpbm5lciBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBvYmplY3QuCi0gICAgICAgIFdTRExTZWxlY3Rpb25XcmFwcGVyIHdyYXBwZXIgICAgICAgID0gKFdTRExTZWxlY3Rpb25XcmFwcGVyKW9iamVjdDsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5uZXJTZWxlY3Rpb24gPSB3cmFwcGVyLndzZGxTZWxlY3Rpb247Ci0gICAgICAgIE9iamVjdCAgICAgICAgICAgICAgIGlubmVyT2JqZWN0ICAgID0gaW5uZXJTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIAotICAgICAgICByZXN1bHQgPSBpbm5lck9iamVjdCA9PSBudWxsID8gbnVsbCA6IGlubmVyT2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG9iamVjdC50b1N0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkkoKQotICB7Ci0gIAlyZXR1cm4gZ2V0V2ViU2VydmljZVVSSSgpOwotICB9Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxTZWxlY3Rpb25XaWRnZXQuZ2V0V2ViU2VydmljZXNQYXJzZXIoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gIAl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgCUlQcm9qZWN0IHAgPSB3c2RsU2VsZWN0aW9uV2lkZ2V0LmdldFByb2plY3QoKTsKLSAgCWlmIChwPT1udWxsKQotICAJewotICAJICByZXR1cm4gcHJvamVjdDsKLSAgCX0KLSAgCWVsc2UKLSAgCSAgcmV0dXJuIHA7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDgzYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5MYWJlbHNBbmRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgoteyAgICAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAxMyBmb3IgdGhlIFdpemFyZCBTY2VuYXJpbyBDbGllbnQgZ3JvdXAgb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9HUk9VUF9TQ0VOQVJJT19DTElFTlQgPSAiUFdQUjAwMTMiOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDE0IGZvciB0aGUgV2ViIFNlcnZpY2UgQ2xpZW50IFR5cGUgY29tYm8gYm94IG9mIHRoZSBQcm9qZWN0IFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ09NQk9fQ0xJRU5UVFlQRSA9ICJQV1BSMDAxNCI7Ci0gIHByaXZhdGUgQ29tYm8gIGNsaWVudFR5cGVDb21ib187Ci0gICAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwNiBmb3IgdGhlIFRlc3QgUHJveHkgY2hlY2sgYm94IG9mIHRoZSBQcm9qZWN0IFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfVEVTVF9QUk9YWSA9ICJQV1BSMDAwNiI7Ci0gIHByaXZhdGUgQnV0dG9uIHRlc3RQcm94eUNoZWNrYm94XzsKLSAgCi0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzXzsKLSAgcHJpdmF0ZSBMYWJlbHNBbmRJZHMgICAgICBsYWJlbElkc187Ci0gICAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNhZGRDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyKQotICAgKi8KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdXRpbHMgICAgPSBuZXcgVUlVdGlscyggbXNnVXRpbHMsIHBsdWdpbklkICk7Ci0gIAkKLSAgICBHcm91cCBjbGllbnRHcm91cCA9IHV0aWxzLmNyZWF0ZUdyb3VwKCBwYXJlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUk9VUF9TQ0VOQVJJT19DTElFTlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfR1JPVVBfU0NFTkFSSU9fQ0xJRU5UIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0dST1VQX1NDRU5BUklPX0NMSUVOVCwKLQkJCQkJCQkJCQkgICAyLCAxMCwgMTAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAotICAgIGludCBjb21ib1N0eWxlID0gU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZOwotICAgIGNsaWVudFR5cGVDb21ib18gPSB1dGlscy5jcmVhdGVDb21ibyggY2xpZW50R3JvdXAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBQkVMX1dFQlNFUlZJQ0VDTElFTlRUWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ09NQk9fQ0xJRU5UVFlQRSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NPTUJPX0NMSUVOVFRZUEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYm9TdHlsZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0KCBib29sZWFuIGVuYWJsZSApCi0gIHsKLSAgICBjbGllbnRUeXBlQ29tYm9fLnNldEVuYWJsZWQoIGVuYWJsZSApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ICAgPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgTGFiZWxzQW5kSWRzICAgICAgICAgICAgICAgICBsYWJlbElkcyAgID0gcmVnaXN0cnkuZ2V0Q2xpZW50VHlwZUxhYmVscygpOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICA9IDA7Ci0gICAgU3RyaW5nW10gICAgICAgICAgICAgICAgICAgICBjbGllbnRJZHMgID0gbGFiZWxJZHMuZ2V0SWRzXygpOwotICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJZCA9IGlkcy5nZXRUeXBlSWQoKTsKLSAgICAKLSAgICBjbGllbnRUeXBlQ29tYm9fLnNldEl0ZW1zKCBsYWJlbElkcy5nZXRMYWJlbHNfKCkgKTsKLSAgICAKLSAgICAvLyBOb3cgZmluZCB0aGUgc2VsZWN0ZWQgb25lLgotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjbGllbnRJZHMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBpZiggc2VsZWN0ZWRJZC5lcXVhbHMoIGNsaWVudElkc1tpbmRleCBdKSApCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9IGluZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgY2xpZW50VHlwZUNvbWJvXy5zZWxlY3QoIHNlbGVjdGlvbiApOwotICAgIGlkc18gICAgICA9IGlkczsgIAotICAgIGxhYmVsSWRzXyA9IGxhYmVsSWRzOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgaW50IHNlbGVjdGlvbkluZGV4ID0gY2xpZW50VHlwZUNvbWJvXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIAotICAgIGlkc18uc2V0VHlwZUlkKCBsYWJlbElkc18uZ2V0SWRzXygpW3NlbGVjdGlvbkluZGV4XSApOwotICAgIAotICAgIHJldHVybiBpZHNfOyAgCi0gIH0KLSAgICAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NsaWVudFdpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NsaWVudFdpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1ZjY0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9DbGllbnRXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uR2V0TW9uaXRvckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQ2hlY2tGb3JNaXNzaW5nRmlsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5FY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5GaW5pc2hGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRXaXphcmRXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5XU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5XU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lLkNsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5BZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hEZWZhdWx0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaEphdmFUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5UZXN0RGVmYXVsdGluZ0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFdpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnlfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnlfOwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeV87Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50Um9vdENvbW1hbmRGcmFnbWVudCgpOyAgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8gPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gZGF0YVJlZ2lzdHJ5OwotICAgIAotICAgIC8vIEJlZm9yZSBDbGllbnRXaXphcmRXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MgKTsKLSAgICAKLSAgICAvLyBBZnRlciBDbGllbnRXaXphcmRXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgICAgICAgIAotICAgIC8vIEJlZm9yZSBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJKMkVFVmVyc2lvbiIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywiTmVlZEVBUiIsbnVsbCk7Ci0gICAgCi0gICAgLy8gQWZ0ZXIgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiSjJFRVZlcnNpb24iLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gVGhlIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQgY2FuIGNvbnRyb2wgd2hhdCBjbGllbnQgZXh0ZW5zaW9uIGNvbWVzIHVwLgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAKLSAgICAvLyBCZWZvcmUgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlVVJJIiwgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuY2xhc3MgKTsKLSAgICAKLSAgICAvLyBBZnRlciBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyLmNsYXNzLCAiV3NkbFVSSSIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlci5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyLmNsYXNzLCAiUHJvamVjdCIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgICAgCi0gICAgLy8gQmVmb3JlIENsaWVudCBUZXN0IHdpZGdldC4KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlJ1bkNsaWVudFRlc3QiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLQotICAgIC8vIEFmdGVyIHRoZSBjbGllbnQgdGVzdCB3aWRnZXQgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlJ1bkNsaWVudFRlc3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdFNlcnZpY2UiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RJRCIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiSXNUZXN0V2lkZ2V0IixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5XyA9IHdpZGdldFJlZ2lzdHJ5OwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkNsaWVudFdpemFyZFdpZGdldCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19QUk9KRUNUIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfUFJPSkVDVCIpLAotCQkJCSAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0JCQkJICAgICAgICB7Ci0JCQkJICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkJCSAgICAgICAgICB7Ci0JCQkJICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRXaXphcmRXaWRnZXQoKTsKLQkJCQkgICAgICAgICAgfQotCQkJCSAgICAgICAgfSApOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkNsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfQ0xJRU5UX1JVTlRJTUVfU0VMRUNUSU9OIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfQ0xJRU5UX1JVTlRJTUVfU0VMRUNUSU9OIiksCi0JCQkJCQluZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkJCQkJCSAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JCQkJCQkgIHsKLQkJCQkJCSAgICByZXR1cm4gbmV3IENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQoKTsKLQkJCQkJCSAgfQotCQkJCQkJfSApOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIldTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1NFTEVDVElPTiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX1NFTEVDVElPTiIpLAotCQkgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkgICAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcigpOwotCQkgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgICAgICB9ICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQ2xpZW50VGVzdFdpZGdldCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19TQU1QTEUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU19TQU1QTEUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50VGVzdFdpZGdldCgpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIEluaXRDbGllbnRSZWdpc3RyeSBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLSAgeyAgCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IGNsaWVudFJlZ2lzdHJ5XyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2V4ZWN1dGUob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50KQotICAgICAqLwotICAgIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgCi0gICAgewotICAgICAgY2xpZW50UmVnaXN0cnlfLnNldERhdGFNYXBwaW5nUmVnaXN0cnkoIGRhdGFNYXBwaW5nUmVnaXN0cnlfICk7Ci0gICAgICBjbGllbnRSZWdpc3RyeV8uc2V0V2lkZ2V0UmVnaXN0cnkoIHdpZGdldFJlZ2lzdHJ5XyApOwotICAgICAgY2xpZW50UmVnaXN0cnlfLnNldENhbkZpbmlzaFJlZ2lzdHJ5KCBjYW5GaW5pc2hSZWdpc3RyeV8gKTsKLSAgICAgIAotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIENsaWVudFJvb3RDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci0gIHsKLSAgICBwdWJsaWMgQ2xpZW50Um9vdENvbW1hbmRGcmFnbWVudCgpCi0gICAgewotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDaGVja0Zvck1pc3NpbmdGaWxlcygpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgSW5pdENsaWVudFJlZ2lzdHJ5KCksICIiICkpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJDbGllbnRXaXphcmRXaWRnZXQiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggIldTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0IiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kKCB0cnVlICksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZChmYWxzZSksICIiKSk7IC8vTm90ZTogYWRkZWQgaGVyZSBmb3IgY2xpZW50ICAgICAgCi0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kKCksICIiKSk7ICAKLSAgICAgIGFkZCggbmV3IENsaWVudEV4dGVuc2lvbkZyYWdtZW50KCkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudChuZXcgR2V0TW9uaXRvckNvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KG5ldyBUZXN0RGVmYXVsdGluZ0ZyYWdtZW50KCksIiIpKTsKLSAgICAgIGFkZCggbmV3IENsaWVudFRlc3RGcmFnbWVudCggIkNsaWVudFRlc3RXaWRnZXQiKSApOyAKLSAgICAgIGFkZChuZXcgRmluaXNoRnJhZ21lbnQoKSk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gICAgewotICAgICAgLy9NYXAgU2VsZWN0aW9uQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbml0aWFsSW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIEdldE1vbml0b3JDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbldTSUwiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2lsVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZVVSSSIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIG5ldyBFY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIEdldE1vbml0b3JDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBHZXRNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRJbml0aWFsUHJvamVjdCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIAotICAgICAgLy9TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQgZm9yIGNsaWVudCAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXJJbnN0YW5jZSIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCJTYW1wbGVTZXJ2ZXJUeXBlSUQiLCBudWxsKTsKLSAgICAgICAgICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3RFQVIiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0VHlwZSIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdFR5cGVJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlNlcnZlckZhY3RvcnlJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiSjJFRVZlcnNpb24iLCBudWxsKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50TmVlZEVBUiIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiTmVlZEVBUiIsIG51bGwpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkNsaWVudElkcyIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKMmVlVmVyc2lvbiIsIG51bGwpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyApOyAgICAgCi0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBGaW5pc2hKYXZhVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJTZXRFbmRwb2ludE1ldGhvZCIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBHZXRNb25pdG9yQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoR2V0TW9uaXRvckNvbW1hbmQuY2xhc3MsICJFbmRwb2ludHMiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLQotICAgICAgLy8gTUFQIHBvc3Qgc2VydmVyIGNvbmZpZyBjYWxsICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RFQVIiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdE5hbWUiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVySW5zdGFuY2UiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlckluc3RJZCIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywgIlNhbXBsZUV4aXN0aW5nU2VydmVySW5zdElkIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywgIkFkZGVkUHJvamVjdFRvU2VydmVyIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlckluc3RJZCIsIEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgICAgCi0gICAgICAvLyBNYXAgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlnQ2xpZW50SGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdDbGllbnRIYW5kbGVyc1dpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjYTg2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdDbGllbnRIYW5kbGVyc1dpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5HZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuT3BlbkphdmFFZGl0b3JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi0vKioKLSAqIAotICogSGFuZGxlciBDb25maWd1cmF0aW9uIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUKLSAqIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnQ2xpZW50SGFuZGxlcnNXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcgewotICAKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnlfOwotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KSB7Ci0KLSAgICBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHdpZGdldFJlZ2lzdHJ5XyA9IHdpZGdldFJlZ2lzdHJ5OwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCIsIAotICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX0NMSUVOVF9IRExSX0NPTkZJRyIpLCAKLSAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX0NMSUVOVF9IRExSX0NPTkZJRyIpLCAKLSAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLQotICAgICAgCXB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAJICByZXR1cm4gbmV3IENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQoKTsKLSAgICAgIAl9Ci0gICAgfSk7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyA9IGRhdGFSZWdpc3RyeTsKLSAgICAKLSAgICAKLS8vICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIkFsbEhhbmRsZXJzIiwgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiSGFuZGxlcnMiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJXc1JlZnNUb0hhbmRsZXJzIiwgbnVsbCk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiR2VuU2tlbGV0b25FbmFibGVkIiwgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiU291cmNlT3V0cHV0TG9jYXRpb24iLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJTZXJ2aWNlUmVmTmFtZSIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIlJlZk5hbWVUb1NlcnZpY2VSZWYiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICAKLSAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkFsbEhhbmRsZXJzTGlzdCIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiV3NSZWZzVG9IYW5kbGVycyIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywiSGFuZGxlcnNUYWJsZSIsbnVsbCk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiU291cmNlT3V0cHV0TG9jYXRpb24iLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIk91dHB1dExvY2F0aW9uIixudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJIYW5kbGVyQ2xhc3NOYW1lcyIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywiSGFuZGxlck5hbWVzIixudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MpOwotCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCJQcm9qZWN0IiwgT3BlbkphdmFFZGl0b3JDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIkNsYXNzTmFtZXMiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MpOwotICAgIAotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KSB7Ci0gICAgY2FuRmluaXNoUmVnaXN0cnlfID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKSB7Ci0KLSAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkgewotCi0gICAgICAgIHJldHVybiBuZXcgQ2xpZW50SGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBDbGllbnRIYW5kbGVyc0NvbmZpZ0NvbW1hbmRGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnR7Ci0gICAKLSAgICBwdWJsaWMgQ2xpZW50SGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQoKSwgIiIgKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBPcGVuSmF2YUVkaXRvckNvbW1hbmQoKSwgIiIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50I3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgICB7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJXc0NsaWVudFJlc291cmNlIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIldzU2VydmljZVJlZnMiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiQ2xpZW50UHJvamVjdCIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgfQotIAotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlnU2VydmljZUhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlnU2VydmljZUhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTY3YmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ1NlcnZpY2VIYW5kbGVyc1dpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5HZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuT3BlbkphdmFFZGl0b3JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi0vKioKLSAqIAotICogSGFuZGxlciBDb25maWd1cmF0aW9uIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUKLSAqIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnU2VydmljZUhhbmRsZXJzV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nIHsKLSAgCi0gIHByaXZhdGUgQ2FuRmluaXNoUmVnaXN0cnkgICBjYW5GaW5pc2hSZWdpc3RyeV87Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeV87Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5XzsKLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkgewotCi0gICAgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICB3aWRnZXRSZWdpc3RyeV8gPSB3aWRnZXRSZWdpc3RyeTsKLSAgICAKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIkNvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0IiwgCi0gICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfU0VSVklDRV9IRExSX0NPTkZJRyIpLCAKLSAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1NFUlZJQ0VfSERMUl9DT05GSUciKSwgCi0gICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0KLSAgICAgIAlwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgCSAgcmV0dXJuIG5ldyBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldCgpOwotICAgICAgCX0KLSAgICB9KTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gZGF0YVJlZ2lzdHJ5OwotICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJXc1JlZnNUb0hhbmRsZXJzIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIlNvdXJjZU91dHB1dExvY2F0aW9uIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmoiLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIkRlc2NyaXB0aW9uTmFtZSIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICAKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiSGFuZGxlcnNMaXN0IiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIldzRGVzY1RvSGFuZGxlcnMiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiU2VydmljZURlc2NOYW1lVG9EZXNjT2JqIiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIlNvdXJjZU91dHB1dExvY2F0aW9uIiwgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCJPdXRwdXRMb2NhdGlvbiIsbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkhhbmRsZXJDbGFzc05hbWVzIiwgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCJIYW5kbGVyTmFtZXMiLG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MpOwotIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywiUHJvamVjdCIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCJDbGFzc05hbWVzIiwgT3BlbkphdmFFZGl0b3JDb21tYW5kLmNsYXNzKTsKLSAgIAotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KSB7Ci0gICAgY2FuRmluaXNoUmVnaXN0cnlfID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKSB7Ci0KLSAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkgewotCi0gICAgICAgIHJldHVybiBuZXcgU2VydmljZUhhbmRsZXJzQ29uZmlnQ29tbWFuZEZyYWdtZW50KCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgU2VydmljZUhhbmRsZXJzQ29uZmlnQ29tbWFuZEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudHsKLSAgIAotICAgIHB1YmxpYyBTZXJ2aWNlSGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIgKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggIkNvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0IiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQoKSwgIiIgKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBPcGVuSmF2YUVkaXRvckNvbW1hbmQoKSwgIiIpKTsKLQotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICAgIHsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGRSZXNvdXJjZSIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAKLSAgICB9Ci0gCi0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWd1cmVIYW5kbGVyc1dpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWY5MjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5Db25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkhhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmVIYW5kbGVyc1dpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZyB7Ci0KLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeV87Ci0KLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeV87Ci0KLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnlfOwotCi0gIHB1YmxpYyBDb25maWd1cmVIYW5kbGVyc1dpZGdldEJpbmRpbmcoKSB7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKSB7Ci0KLSAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IEhhbmRsZXJzQ29tbWFuZEZyYWdtZW50KCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkgewotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSwKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyA9IGRhdGFSZWdpc3RyeTsKLQotICAgIC8vIE1hcCBjbGllbnQtc2lkZSB3aWRnZXRzIHRvIGNvbW1hbmRzCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkhhbmRsZXJzIiwgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywgIldzUmVmc1RvSGFuZGxlcnMiLCBudWxsKTsKLQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU291cmNlT3V0cHV0TG9jYXRpb24iLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVJlZk5hbWUiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVmTmFtZVRvU2VydmljZVJlZiIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywgIldzUmVmc1RvSGFuZGxlcnMiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJIYW5kbGVyc1RhYmxlIiwgbnVsbCk7Ci0KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCAiU291cmNlT3V0cHV0TG9jYXRpb24iLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsICJPdXRwdXRMb2NhdGlvbiIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJIYW5kbGVyQ2xhc3NOYW1lcyIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywgIkhhbmRsZXJOYW1lcyIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MpOwotCi0gICAgLy8gTWFwIHNlcnZpY2Utc2lkZSB3aWRnZXRzIHRvIGNvbW1hbmRzCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc1JlZnNUb0hhbmRsZXJzIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuU2tlbGV0b25FbmFibGVkIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU291cmNlT3V0cHV0TG9jYXRpb24iLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmoiLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkRlc2NyaXB0aW9uTmFtZSIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCAiSGFuZGxlcnNMaXN0IiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJXc0Rlc2NUb0hhbmRsZXJzIiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmoiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCAiU291cmNlT3V0cHV0TG9jYXRpb24iLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsICJPdXRwdXRMb2NhdGlvbiIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCAiSGFuZGxlckNsYXNzTmFtZXMiLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsICJIYW5kbGVyTmFtZXMiLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywgIkdlblNrZWxldG9uRW5hYmxlZCIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcyk7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMpOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCJDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldCIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfU0VSVklDRV9IRExSX0NPTkZJRyIpLCBtc2dVdGlscwotICAgICAgICAuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1NFUlZJQ0VfSERMUl9DT05GSUciKSwgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldCgpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCJDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0IiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9DTElFTlRfSERMUl9DT05GSUciKSwgbXNnVXRpbHMKLSAgICAgICAgLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19DTElFTlRfSERMUl9DT05GSUciKSwgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgSGFuZGxlcnNDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50IHsKLQotICAgIHB1YmxpYyBIYW5kbGVyc0NvbW1hbmRGcmFnbWVudCgpIHsKLQotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotCi0gICAgICBhZGQobmV3IFNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50KCkpOwotICAgICAgYWRkKG5ldyBDbGllbnRIYW5kbGVyc0ZyYWdtZW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEhhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc0NsaWVudEhhbmRsZXIiLCBDbGllbnRIYW5kbGVyc0ZyYWdtZW50LmNsYXNzLCAiQ2xpZW50SGFuZGxlcnNFbmFibGVkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhIYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSXNTZXJ2aWNlSGFuZGxlciIsIFNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50LmNsYXNzLCAiU2VydmljZUhhbmRsZXJzRW5hYmxlZCIsIG51bGwpOwotCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJXc0NsaWVudFJlc291cmNlIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIldzU2VydmljZVJlZnMiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiQ2xpZW50UHJvamVjdCIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RkUmVzb3VyY2UiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KSB7Ci0gICAgICBjYW5GaW5pc2hSZWdpc3RyeV8gPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIENsaWVudEhhbmRsZXJzRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQgewotCi0gICAgYm9vbGVhbiBpc0NsaWVudF8gPSBmYWxzZTsKLQotICAgIHB1YmxpYyBDbGllbnRIYW5kbGVyc0ZyYWdtZW50KCkgewotICAgICAgc2V0Q29uZGl0aW9uKG5ldyBDb25kaXRpb24oKSB7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKSB7Ci0gICAgICAgICAgcmV0dXJuIGlzQ2xpZW50XzsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIFNlcXVlbmNlRnJhZ21lbnQgY2xpZW50SGFuZGxlcnNSb290RnJhZ21lbnQgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotCi0gICAgICBjbGllbnRIYW5kbGVyc1Jvb3RGcmFnbWVudC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0KLSAgICAgIGNsaWVudEhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoIkNvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQiKSk7Ci0gICAgICBjbGllbnRIYW5kbGVyc1Jvb3RGcmFnbWVudC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGNsaWVudEhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZCgpLCAiIikpOwotCi0gICAgICBzZXRUcnVlRnJhZ21lbnQoY2xpZW50SGFuZGxlcnNSb290RnJhZ21lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudEhhbmRsZXJzRW5hYmxlZChib29sZWFuIGlzQ2xpZW50KSB7Ci0gICAgICBpc0NsaWVudF8gPSBpc0NsaWVudDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc0NsaWVudFJlc291cmNlIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLQotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlSGFuZGxlcnNGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudCB7Ci0KLSAgICBib29sZWFuIGlzU2VydmljZV8gPSBmYWxzZTsKLQotICAgIHB1YmxpYyBTZXJ2aWNlSGFuZGxlcnNGcmFnbWVudCgpIHsKLSAgICAgIHNldENvbmRpdGlvbihuZXcgQ29uZGl0aW9uKCkgewotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkgewotICAgICAgICAgIHJldHVybiBpc1NlcnZpY2VfOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgICAgU2VxdWVuY2VGcmFnbWVudCBzZXJ2aWNlSGFuZGxlcnNSb290RnJhZ21lbnQgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgICAgc2VydmljZUhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0KLSAgICAgIFNlcXVlbmNlRnJhZ21lbnQgc2VydmljZUhhbmRsZXJzRnJhZ21lbnQgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgICAgc2VydmljZUhhbmRsZXJzRnJhZ21lbnQuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQiKSk7Ci0gICAgICBzZXJ2aWNlSGFuZGxlcnNGcmFnbWVudC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kKCksICIiKSk7Ci0gICAgICBzZXJ2aWNlSGFuZGxlcnNGcmFnbWVudC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQoKSwgIiIpKTsKLQotICAgICAgc2VydmljZUhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChzZXJ2aWNlSGFuZGxlcnNGcmFnbWVudCk7Ci0KLSAgICAgIHNldFRydWVGcmFnbWVudChzZXJ2aWNlSGFuZGxlcnNSb290RnJhZ21lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VIYW5kbGVyc0VuYWJsZWQoYm9vbGVhbiBpc1NlcnZpY2UpIHsKLSAgICAgIGlzU2VydmljZV8gPSBpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RkUmVzb3VyY2UiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLQotICAgIH0KLQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvR2VuU2FtcGxlV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvR2VuU2FtcGxlV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjA1NDViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0dlblNhbXBsZVdpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5FY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5GaW5pc2hGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLldTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5DbGllbnRUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5DbGllbnRUZXN0V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoRGVmYXVsdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hKYXZhVGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoVGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuVGVzdERlZmF1bHRpbmdGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LldlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIEdlblNhbXBsZVdpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnlfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnlfOwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeV87Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2VuU2FtcGxlUm9vdENvbW1hbmRGcmFnbWVudCgpOyAgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8gPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gZGF0YVJlZ2lzdHJ5OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyBCZWZvcmUgQ2xpZW50IFRlc3Qgd2lkZ2V0LgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUnVuQ2xpZW50VGVzdCIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIk1ldGhvZHMiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotCi0gICAgLy8gQWZ0ZXIgdGhlIGNsaWVudCB0ZXN0IHdpZGdldCAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlJ1bkNsaWVudFRlc3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdFNlcnZpY2UiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RJRCIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiSXNUZXN0V2lkZ2V0IixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5XyA9IHdpZGdldFJlZ2lzdHJ5OwotICAgICAgICAKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJDbGllbnRUZXN0V2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1NBTVBMRSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX1NBTVBMRSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRUZXN0V2lkZ2V0KCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgSW5pdENsaWVudFJlZ2lzdHJ5IGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotICB7ICAKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgY2xpZW50UmVnaXN0cnlfID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmQjZXhlY3V0ZShvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQpCi0gICAgICovCi0gICAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLSAgICB7Ci0gICAgICBjbGllbnRSZWdpc3RyeV8uc2V0RGF0YU1hcHBpbmdSZWdpc3RyeSggZGF0YU1hcHBpbmdSZWdpc3RyeV8gKTsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXRXaWRnZXRSZWdpc3RyeSggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgICBjbGllbnRSZWdpc3RyeV8uc2V0Q2FuRmluaXNoUmVnaXN0cnkoIGNhbkZpbmlzaFJlZ2lzdHJ5XyApOwotICAgICAgCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLSAgewotICAgIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uXzsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3h5QmVhbigpCi0gICAgewotICAgICAgU3RyaW5nIHByb3h5QmVhbiA9ICIiOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlICAgID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24oIHNlbGVjdGlvbl8uZ2V0Rmlyc3RFbGVtZW50KCkgKTsKLSAgICAgICAgU3RyaW5nICAgIGJlYW5QYWNrYWdlID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlTmFtZSggcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSApOwotICAgICAgICAKLSAgICAgICAgaWYoIGJlYW5QYWNrYWdlPT1udWxsICkKLSAgICAgICAgICBiZWFuUGFja2FnZSA9ICIiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYmVhblBhY2thZ2UgPSBiZWFuUGFja2FnZSArICIuIjsKLQotICAgICAgICBwcm94eUJlYW4gPSBiZWFuUGFja2FnZSArIHJlc291cmNlLmdldE5hbWUoKTsKLQotICAgICAgICBpZiggcHJveHlCZWFuLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIikgfHwgcHJveHlCZWFuLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSAKLSAgICAgICAgewotICAgICAgICAgIHByb3h5QmVhbiA9IHByb3h5QmVhbi5zdWJzdHJpbmcoMCxwcm94eUJlYW4ubGFzdEluZGV4T2YoJy4nKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIHByb3h5QmVhbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gICAgewotICAgICAgc2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsgIAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBHZW5TYW1wbGVSb290Q29tbWFuZEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotICB7Ci0gICAgcHVibGljIEdlblNhbXBsZVJvb3RDb21tYW5kRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBJbml0Q2xpZW50UmVnaXN0cnkoKSwgIiIgKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQoKSwgIiIgKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQoIHRydWUgKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFRlc3REZWZhdWx0aW5nRnJhZ21lbnQoKSwiIikpOwotICAgICAgYWRkKCBuZXcgQ2xpZW50VGVzdEZyYWdtZW50KCAiQ2xpZW50VGVzdFdpZGdldCIpICk7IAotICAgICAgYWRkKCBuZXcgRmluaXNoRnJhZ21lbnQoKSApOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICAgIHsKLSAgICAgIC8vTWFwIFNlbGVjdGlvbkNvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBJbml0aWFsaXplUHJveHlDb21tYW5kLmNsYXNzICk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIG5ldyBGb3JjZVRydWUoKSApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbldTSUwiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2lsVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZVVSSSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIG5ldyBFY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIoKSk7Ci0gICAgICAgICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRFeHRlbnNpb25GcmFnbWVudC5jbGFzcyk7Ci0gICAgICAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RFQVIiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJDbGllbnRJZHMiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSjJlZVZlcnNpb24iLCBudWxsKTsgICAgICAKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRUZXN0RnJhZ21lbnQuY2xhc3MgKTsgICAgIAotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVyIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSW5pdGlhbGl6ZVByb3h5Q29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSW5pdGlhbGl6ZVByb3h5Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJQcm94eUJlYW4iLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEZpbmlzaEphdmFUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNQVAgcG9zdCBzZXJ2ZXIgY29uZmlnIGNhbGwgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJFQVJQcm9qZWN0TmFtZSIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlckluc3RhbmNlIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVySWQiLCBudWxsKTsKLSAgICAgICAgICAgIAotICAgICAgCi0gICAgICAvLyBNYXAgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBGb3JjZVRydWUgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotICB7Ci0gICAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9JbXBvcnRXU0lMV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvSW1wb3J0V1NJTFdpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1NGFmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9JbXBvcnRXU0lMV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuSW1wb3J0V1NJTFdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5BZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgSW1wb3J0V1NJTFdpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnk7Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeTsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLSAgcHVibGljIEltcG9ydFdTSUxXaWRnZXRCaW5kaW5nKCkKLSAgewotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgU2VxdWVuY2VGcmFnbWVudCByb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiSW1wb3J0V1NJTFdpZGdldCIpKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kKCksICIiKSk7Ci0gICAgICAgICAgICAgICByZXR1cm4gcm9vdDsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5jYW5GaW5pc2hSZWdpc3RyeSA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5kYXRhTWFwcGluZ1JlZ2lzdHJ5ID0gZGF0YVJlZ2lzdHJ5OwotICAgIAotICAgIC8vIEltcG9ydFdTSUxXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIEltcG9ydFdTSUxXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIC8vIEFkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEltcG9ydFdTSUxXaWRnZXQuY2xhc3MsICJHZW5XU0lMQXJndW1lbnRzIiwgQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kLmNsYXNzLCAiQXJncyIsIG51bGwpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIHRoaXMud2lkZ2V0UmVnaXN0cnkgPSB3aWRnZXRSZWdpc3RyeTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiSW1wb3J0V1NJTFdpZGdldCIsIAotICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiVElUTEVfV1NJTF9JTVBPUlQiKSwKLSAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkRFU0NfV1NJTF9JTVBPUlQiKSwKLSAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgewotICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgSW1wb3J0V1NJTFdpZGdldCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0ltcG9ydFdTV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvSW1wb3J0V1NXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOTkyMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvSW1wb3J0V1NXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHVibGlzaFdTV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5XU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBJbXBvcnRXU1dpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnk7Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeTsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0gIHByaXZhdGUgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnOwotCi0gIHB1YmxpYyBJbXBvcnRXU1dpZGdldEJpbmRpbmcoKQotICB7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnID0gbmV3IFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50KCk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBTZXF1ZW5jZUZyYWdtZW50IHJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgICAgICAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCJXU0ltcG9ydCIpKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZyk7Ci0gICAgICAgICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQoKSwgIiIpKTsKLSAgICAgICAgICAgICAgIHJldHVybiByb290OyAgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5ID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyQ2FuRmluaXNoKHRoaXMuY2FuRmluaXNoUmVnaXN0cnkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5kYXRhTWFwcGluZ1JlZ2lzdHJ5ID0gZGF0YVJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlckRhdGFNYXBwaW5ncyh0aGlzLmRhdGFNYXBwaW5nUmVnaXN0cnkpOwotICAgIAotICAgIC8vIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIlB1Ymxpc2hUb1ByaXZhdGVVRERJIiwgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQuY2xhc3MpOwotICAgIAotICAgIC8vIExhdW5jaFdlYlNlcnZpY2VzRXhwbG9yZXJDb21tYW5kCi0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkZvcmNlTGF1bmNoT3V0c2lkZUlERSIsIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJMYXVuY2hPcHRpb25zIiwgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZC5jbGFzcyk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgdGhpcy53aWRnZXRSZWdpc3RyeSA9IHdpZGdldFJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHRoaXMud2lkZ2V0UmVnaXN0cnkpOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCJXU0ltcG9ydCIsIAotICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19GSU5EIiksCi0gICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfRklORCIpLAotICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBQdWJsaXNoV1NXaWRnZXQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzg3NWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgLy8gQ2xpZW50V2l6YXJkV2lkZ2V0Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgICAgY2xpZW50SWRzXzsKLSAgcHJpdmF0ZSBCb29sZWFuICAgICAgICAgICAgICB0ZXN0U2VydmljZTsKLSAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgICAgICByZXNvdXJjZUNvbnRleHQ7Ci0gIAotICAvLyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgY2xpZW50Q2hvaWNlc187Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uOwotICBwcml2YXRlIGJvb2xlYW4gY2xpZW50TmVlZEVBUl87Ci0gIAotICAvLyBXU0RMU2VsZWN0aW9uV2lkZ2V0Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgZ2VuV1NJTDsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICB3c2lsVVJJOwotICAKLSAgLy8gV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgCi0gIC8vIFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgd3NkbFVSSTsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgaXNDbGllbnRTY2VuYXJpb187Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgZ2VuUHJveHlfID0gdHJ1ZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIAotICAvL1NlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZAotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJJbnN0SWRfOwotICAKLSAgcHVibGljIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kKCBib29sZWFuIGlzQ2xpZW50U2NlbmFyaW8gKQotICB7Ci0gICAgaXNDbGllbnRTY2VuYXJpb18gPSBpc0NsaWVudFNjZW5hcmlvOwotICB9Ci0KLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbW1hbmQgaXMgcnVubmluZyBpbiB0aGUgY2xpZW50IHdpemFyZCBhbmQKLSAgICogZmFsc2UgaWYgdGhpcyBjb21tYW5kIGlzIHJ1bm5pbmcgaW4gdGhlIGNyZWF0ZSB3ZWIgc2VydmljZSB3aXphcmQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRJc0NsaWVudFNjZW5hcmlvKCkKLSAgewotICAgIHJldHVybiBpc0NsaWVudFNjZW5hcmlvXzsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWUyQ2xpZW50VHlwZXMoIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNob2ljZXMgKQotICB7Ci0gICAgY2xpZW50Q2hvaWNlc18gPSBjaG9pY2VzOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkKLSAgewotICAgIHJldHVybiBjbGllbnRDaG9pY2VzXzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBpZHMpCi0gIHsKLSAgICBjbGllbnRJZHNfID0gaWRzOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudElkc187Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RJZChTdHJpbmcgc2VydmVySW5zdElkKSB7Ci0gIAl0aGlzLnNlcnZlckluc3RJZF8gPSBzZXJ2ZXJJbnN0SWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkKCl7Ci0gIAlyZXR1cm4gdGhpcy5zZXJ2ZXJJbnN0SWRfOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRJc0V4aXN0aW5nU2VydmVyLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDbGllbnRJc0V4aXN0aW5nU2VydmVyKCkKLSAgewotICAgIHJldHVybiBjbGllbnRJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UHJvamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50Q2hvaWNlc18uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UHJvamVjdEVBUi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdEVBUigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50Q2hvaWNlc18uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UHJvamVjdFR5cGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFByb2plY3RUeXBlKCkKLSAgewotICAgIHJldHVybiBjbGllbnRDaG9pY2VzXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRSdW50aW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRSdW50aW1lKCkKLSAgewotICAgIHJldHVybiBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50U2VydmVyLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudElkc18uZ2V0U2VydmVySWQoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTZXJ2ZXJJbnN0YW5jZSgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50SWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBzZXJ2ZXJJbnN0SWQpewotICAgIAotICAgIGlmIChjbGllbnRJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKT09bnVsbCkKLSAgICAgIGNsaWVudElkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbnN0SWQpOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBnZW5XU0lMLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNHZW5XU0lMKCkKLSAgewotICAgIHJldHVybiBnZW5XU0lMOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBnZW5XU0lMCi0gICAqICAgICAgICAgICAgVGhlIGdlbldTSUwgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuV1NJTChib29sZWFuIGdlbldTSUwpCi0gIHsKLSAgICB0aGlzLmdlbldTSUwgPSBnZW5XU0lMOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb3VyY2VDb250ZXh0LgotICAgKi8KLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlQ29udGV4dDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcmVzb3VyY2VDb250ZXh0Ci0gICAqICAgICAgICAgICAgVGhlIHJlc291cmNlQ29udGV4dCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCkKLSAgewotICAgIHRoaXMucmVzb3VyY2VDb250ZXh0ID0gcmVzb3VyY2VDb250ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGVzdFByb3h5U2VsZWN0ZWQuCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRlc3RQcm94eVNlbGVjdGVkCi0gICAqICAgICAgICAgICAgVGhlIHRlc3RQcm94eVNlbGVjdGVkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKEJvb2xlYW4gdGVzdFNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLnRlc3RTZXJ2aWNlID0gdGVzdFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsVVJJLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkKLSAgewotICAgIHJldHVybiB3c2RsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2RsVVJJCi0gICAqICAgICAgICAgICAgVGhlIHdzZGxVUkkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2lsVVJJLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2lsVVJJKCkKLSAgewotICAgIHJldHVybiB3c2lsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2lsVVJJCi0gICAqICAgICAgICAgICAgVGhlIHdzaWxVUkkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NpbFVSSShTdHJpbmcgd3NpbFVSSSkKLSAgewotICAgIHRoaXMud3NpbFVSSSA9IHdzaWxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlc1BhcnNlci4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICBpZiAod2ViU2VydmljZXNQYXJzZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyCi0gICAqICAgICAgICAgICAgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgajJlZVZlcnNpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEoyRUVWZXJzaW9uKCkKLSAgewotCSAgcmV0dXJuIGoyZWVWZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBqMmVlVmVyc2lvbiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRKMkVFVmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLSAgewotCSAgajJlZVZlcnNpb24gPSB2ZXJzaW9uOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGEgcHJveHkgc2hvdWxkIGJlIGdlbmVyYXRlZCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gZ2VuUHJveHlfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KCBib29sZWFuIGdlblByb3h5ICkKLSAgewotICAgIGdlblByb3h5XyA9IGdlblByb3h5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lKQotICB7Ci0gIAl0aGlzLmxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmYWNpbGl0eSB0byBsYXVuY2guCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVkU2VydmljZVRlc3ROYW1lKCkKLSAgewotICAJcmV0dXJuIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSBjbGllbnQgcHJvamVjdCBuZWVkcyBhbiBFQVIgcHJvamVjdC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldENsaWVudE5lZWRFQVIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudE5lZWRFQVJfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnROZWVkRUFSKGJvb2xlYW4gY2xpZW50TmVlZEVBUikKLSAgewotICAgIGNsaWVudE5lZWRFQVJfID0gY2xpZW50TmVlZEVBUjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTc2MDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuRXh0ZW5zaW9uRnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudEV4dGVuc2lvbkZyYWdtZW50IGV4dGVuZHMgRXh0ZW5zaW9uRnJhZ21lbnQKLXsgIAotICBwdWJsaWMgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQoKQotICB7Ci0gICAgc2V0RXh0ZW5zaW9uUmVnaXN0cnkoIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKSApOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQoIENsaWVudEV4dGVuc2lvbkZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgc2V0RXh0ZW5zaW9uSWRzKCBuZXcgU3RyaW5nW117IGlkcy5nZXRUeXBlSWQoKSwgaWRzLmdldFJ1bnRpbWVJZCgpLCBpZHMuZ2V0U2VydmVySWQoKSB9ICk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotICAgIHJldHVybiBuZXcgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQoIHRoaXMgKTsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlY2Y1ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5BYnN0cmFjdFN0YXJ0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyAgcHJveHlCZWFuXzsKLSAgcHJpdmF0ZSBib29sZWFuIGdlblByb3h5XzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIAotICBwcml2YXRlIFN0cmluZyBleGlzdGluZ1NlcnZlcklkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZWFyUHJvamVjdE5hbWVfOyAgCi0gIHByaXZhdGUgSVNlcnZlciBmRXhpc3RpbmdTZXJ2ZXIgPSBudWxsOwotICAKLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvYWJsZSgpewotICAJcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHVuZG8oRW52aXJvbm1lbnQgZW52KXsKLSAgCVN0YXR1cyBzdGF0ID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICB0cnkJewotICAgIAkKLSAgICAgIC8vIGNoZWNrIGV4aXN0aW5nU2VydmVyCi0gICAgICBpZiAoZkV4aXN0aW5nU2VydmVyIT1udWxsKSB7Ci0gICAgCQotICAgICAgICAvLyBnZXQgRUFSIHByb2plY3QKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotICAgICAgICBpZiAoZWFyUHJvamVjdE5hbWVfIT1udWxsICYmIGVhclByb2plY3ROYW1lXy5sZW5ndGgoKT4wKSB7Ci0gICAgICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgIAl9ICAgIAkKLSAgICAJCi0gICAgCUFic3RyYWN0U3RhcnRTZXJ2ZXIgc3RhcnRTZXJ2ZXJDb21tYW5kID0gbnVsbDsKLSAgICAJV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAJc3RhcnRTZXJ2ZXJDb21tYW5kID0gKEFic3RyYWN0U3RhcnRTZXJ2ZXIpcmVnLmdldFNlcnZlclN0YXJ0QnlUeXBlSWQoZkV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAJaWYgKGVhclByb2plY3QhPW51bGwpIHsKLSAgICAJCXN0YXJ0U2VydmVyQ29tbWFuZC5ydW5QcmVTZXJ2ZXJDb25maWcoZkV4aXN0aW5nU2VydmVyLCBlYXJQcm9qZWN0KTsKLSAgICAJfQotICAgICAgfQotICAgCX0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApIHsKLSAgICAgIElTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgIHN0YXQgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoZW1iZWRkZWRTdGF0dXMpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0KTsKLSAgCQlyZXR1cm4gc3RhdDsKLSAgCX0gIAkKLSAgCQotICAJcmV0dXJuIHN0YXQ7Ci0gIH0gIAotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudil7Ci0gIAkKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsgIAkKLSAgCQotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgSVNlcnZlciBleGlzdGluZ1NlcnZlciA9IG51bGw7Ci0gICAgZkV4aXN0aW5nU2VydmVyID0gbnVsbDsgCi0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVNlcnZlciB0aGlzU2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgICAgIElTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7Ci0gICAgICBTdHJpbmcgdGhpc1NlcnZlcklkID0gbnVsbDsKLSAgICAgIGlmICh0aGlzU2VydmVyIT1udWxsKSB7Ci0gICAgICAJd2MgPSB0aGlzU2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0gICAgICAgIHRoaXNTZXJ2ZXJJZCA9ICh3YyE9bnVsbCA/IHdjLmdldElkKCkgOiBudWxsKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHRoaXNTZXJ2ZXJJZC5lcXVhbHMoZXhpc3RpbmdTZXJ2ZXJJZF8pKQotICAgICAgICBleGlzdGluZ1NlcnZlciA9IHRoaXNTZXJ2ZXI7Ci0gICAgfSAgICAJCi0gICAgdHJ5CXsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotICAgICAgICBpZiAoZWFyUHJvamVjdE5hbWVfIT1udWxsICYmIGVhclByb2plY3ROYW1lXy5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgICB9ICAgIAkKLSAgICAJCi0gICAgICAgIGlmIChleGlzdGluZ1NlcnZlciE9bnVsbCl7Ci0gICAJCSAgQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSBudWxsOwotICAgCQkgIFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgIAkgIHN0YXJ0U2VydmVyQ29tbWFuZCA9IChBYnN0cmFjdFN0YXJ0U2VydmVyKXJlZy5nZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkKGV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAgCSAgaWYgKGVhclByb2plY3QhPW51bGwpewotICAgICAJICAJc3RhcnRTZXJ2ZXJDb21tYW5kLnJ1blBvc3RTZXJ2ZXJDb25maWcoZXhpc3RpbmdTZXJ2ZXIsIGVhclByb2plY3QpOwotICAgICAJICAJZkV4aXN0aW5nU2VydmVyID0gZXhpc3RpbmdTZXJ2ZXI7Ci0gICAgIAkgIH0KLSAgICAgICAgfQotICAgCX0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApIHsKLSAgICAJSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgIAlzdGF0dXMgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoZW1iZWRkZWRTdGF0dXMpOwotICAgIAllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gIAkJcmV0dXJuIHN0YXR1czsKLSAgCX0KLSAgCQotICAJcmV0dXJuIHN0YXR1czsgICAgICAJCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb3h5QmVhbi4KLSAgICovCi0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb3h5QmVhbigpCi0gIHsKLSAgICByZXR1cm4gcHJveHlCZWFuXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHByb3h5QmVhbiBUaGUgcHJveHlCZWFuIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gICAgdGhpcy5wcm94eUJlYW5fID0gcHJveHlCZWFuOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBnZW5Qcm94eV87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIGJvb2xlYW4gZ2VuUHJveHkgKQotICB7Ci0gICAgZ2VuUHJveHlfID0gZ2VuUHJveHk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNldEVuZHBvaW50TWV0aG9kLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXRFbmRwb2ludE1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXRFbmRwb2ludE1ldGhvZCBUaGUgc2V0RW5kcG9pbnRNZXRob2QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V0RW5kcG9pbnRNZXRob2QoU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kKQotICB7Ci0gICAgdGhpcy5zZXRFbmRwb2ludE1ldGhvZCA9IHNldEVuZHBvaW50TWV0aG9kOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGVhclByb2plY3ROYW1lIFRoZSBlYXJQcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFYXJQcm9qZWN0TmFtZShTdHJpbmcgZWFyUHJvamVjdE5hbWUpIHsKLSAgCXRoaXMuZWFyUHJvamVjdE5hbWVfID0gZWFyUHJvamVjdE5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBleGlzdGluZ1NlcnZlcklkIFRoZSBleGlzdGluZ1NlcnZlcklkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVySWQoU3RyaW5nIGV4aXN0aW5nU2VydmVySWQpIHsKLSAgCXRoaXMuZXhpc3RpbmdTZXJ2ZXJJZF8gPSBleGlzdGluZ1NlcnZlcklkOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDI5MGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIEJvb2xlYW4gICAgICAgICAgICAgIHN0YXJ0U2VydmljZTsKLSAgcHJpdmF0ZSBCb29sZWFuICAgICAgICAgICAgICB0ZXN0U2VydmljZTsKLSAgcHJpdmF0ZSBCb29sZWFuICAgICAgICAgICAgICBwdWJsaXNoU2VydmljZTsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciAgICBzZXJ2aWNlSWRzXzsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBzZXJ2aWNlQ2hvaWNlc187Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uOwotICBwcml2YXRlIGJvb2xlYW4gc2VydmljZU5lZWRFQVJfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdzZGxQYXJzZXJfOwotCi0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzKQotICB7Ci0gICAgc2VydmljZUlkc18gPSBpZHM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBzZXJ2ZXJJbnN0SWQpewotICAgIAotICAgIGlmIChzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk9PW51bGwpCi0gICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZlckluc3RJZCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBUeXBlUnVudGltZVNlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHVzZXIgaGFzIHNlbGVjdGVkIG9uCi0gICAqIHBhZ2UgMyBvZiB0aGUgd2l6YXJkLgotICAgKi8KLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUlkc187Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNob2ljZXMpCi0gIHsKLSAgICBzZXJ2aWNlQ2hvaWNlc18gPSBjaG9pY2VzOwotICB9Ci0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwdWJsaXNoU2VydmljZS4KLSAgICovCi0gIHB1YmxpYyBCb29sZWFuIGdldFB1Ymxpc2hTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBwdWJsaXNoU2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcHVibGlzaFNlcnZpY2UKLSAgICogICAgICAgICAgICBUaGUgcHVibGlzaFNlcnZpY2UgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFNlcnZpY2UoQm9vbGVhbiBwdWJsaXNoU2VydmljZSkKLSAgewotICAgIHRoaXMucHVibGlzaFNlcnZpY2UgPSBwdWJsaXNoU2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlcklzRXhpc3RpbmdTZXJ2ZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTZXJ2ZXJJc0V4aXN0aW5nU2VydmVyKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkgIT0gbnVsbDsKLSAgfQotCi0gIC8qKgotCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVySW5zdGFuY2VJZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlU2VydmVySW5zdGFuY2VJZCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUlkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJQcm9qZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlQ2hvaWNlc18uZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVyUHJvamVjdEVBUi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyUHJvamVjdEVBUigpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUNob2ljZXNfLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclJ1bnRpbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclJ1bnRpbWUoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVyU2VydmVyLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfLmdldFNlcnZlcklkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2aWNlU2NlbmFyaW9JZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVNjZW5hcmlvSWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhcnRTZXJ2aWNlLgotICAgKi8KLSAgcHVibGljIEJvb2xlYW4gZ2V0U3RhcnRTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBzdGFydFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHN0YXJ0U2VydmljZQotICAgKiAgICAgICAgICAgIFRoZSBzdGFydFNlcnZpY2UgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhcnRTZXJ2aWNlKEJvb2xlYW4gc3RhcnRTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy5zdGFydFNlcnZpY2UgPSBzdGFydFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0ZXN0U2VydmljZS4KLSAgICovCi0gIHB1YmxpYyBCb29sZWFuIGdldFRlc3RTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiB0ZXN0U2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdGVzdFNlcnZpY2UKLSAgICogICAgICAgICAgICBUaGUgdGVzdFNlcnZpY2UgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoQm9vbGVhbiB0ZXN0U2VydmljZSkKLSAgewotICAgIHRoaXMudGVzdFNlcnZpY2UgPSB0ZXN0U2VydmljZTsKLSAgfQotCi0gIHB1YmxpYyBCb29sZWFuIGdldFB1Ymxpc2goKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgajJlZVZlcnNpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VKMkVFVmVyc2lvbigpCi0gIHsKLSAgCXJldHVybiBqMmVlVmVyc2lvbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBqMmVlVmVyc2lvbiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSjJFRVZlcnNpb24oU3RyaW5nIHZlcnNpb24pCi0gIHsKLSAgCWoyZWVWZXJzaW9uID0gdmVyc2lvbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGUgd2ViIHNlcnZpY2UgcHJvamVjdCBuZWVkcyB0byBiZSBpbiBhbiBFQVIgcHJvamVjdC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNlcnZpY2VOZWVkRUFSKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlTmVlZEVBUl87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOZWVkRUFSKGJvb2xlYW4gc2VydmljZU5lZWRFQVIpCi0gIHsKLSAgICBzZXJ2aWNlTmVlZEVBUl8gPSBzZXJ2aWNlTmVlZEVBUjsKLSAgfSAgCi0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSB3ZWIgc2VydmljZSBwcm9qZWN0IGlzIGFuIEVKQiBwcm9qZWN0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0SXNTZXJ2aWNlUHJvamVjdEVKQigpCi0gIHsKLSAgICAvL0lmIHRoZSB0eXBlL3NlcnZlci9ydW50aW1lIHN1Z2dlc3RzIHRoYXQgYW4gRUpCIHByb2plY3QKLSAgICAvL2lzIHJlcXVpcmVkLCByZXR1cm4gdHJ1ZS4KLSAgICBib29sZWFuIGVqYlJlcXVpcmVkID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBlamJSZXF1aXJlZDIgPSBmYWxzZTsKLSAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZ2lzdHJ5ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBpZiAoc2VydmljZUlkc18gIT0gbnVsbCkKLSAgICB7ICAgICAgCi0gICAgICBTdHJpbmcgc2VydmVyVHlwZUlkID0gd3NzcnRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoc2VydmljZUlkc18uZ2V0U2VydmVySWQoKSkuZ2V0SWQoKTsKLSAgICAgIGVqYlJlcXVpcmVkID0gd3NzcnRSZWdpc3RyeS5yZXF1aXJlc0VKQk1vZHVsZUZvcihzZXJ2ZXJUeXBlSWQsIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpLCBzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7Ci0gICAgICBlamJSZXF1aXJlZDIgPSB3c3NydFJlZ2lzdHJ5LnJlcXVpcmVzRUpCUHJvamVjdChzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7IAotICAgIH0KLSAKLSAgICByZXR1cm4gKGVqYlJlcXVpcmVkIHx8IGVqYlJlcXVpcmVkMik7ICAgIAotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsUGFyc2VyXy4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICBpZiggd3NkbFBhcnNlcl8gPT0gbnVsbCApCi0gICAgewotICAgICAgd3NkbFBhcnNlcl8gPSBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQoKTsgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gd3NkbFBhcnNlcl87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2RsUGFyc2VyXyBUaGUgd3NkbFBhcnNlcl8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd3NkbFBhcnNlciApCi0gIHsKLSAgICB3c2RsUGFyc2VyXyA9IHdzZGxQYXJzZXI7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5Y2FjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25GcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5FeHRlbnNpb25GcmFnbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQgZXh0ZW5kcyBFeHRlbnNpb25GcmFnbWVudAoteyAgCi0gIHB1YmxpYyBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudCgpCi0gIHsKLSAgICBzZXRFeHRlbnNpb25SZWdpc3RyeSggV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKSAgKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFNlcnZlckV4dGVuc2lvbkZyYWdtZW50KCBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICBzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBzZXRFeHRlbnNpb25JZHMoIG5ldyBTdHJpbmdbXXsgaWRzLmdldFR5cGVJZCgpLCBpZHMuZ2V0UnVudGltZUlkKCksIGlkcy5nZXRTZXJ2ZXJJZCgpIH0gKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjY2xvbmUoKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudCggdGhpcyApOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4OTI3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFic3RyYWN0U3RhcnRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHdzZGxVUklfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdzZGxQYXJzZXJfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfID0gZmFsc2U7Ci0gIAotICBwcml2YXRlIElTZXJ2ZXIgZkV4aXN0aW5nU2VydmVyID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUoKXsKLSAgCXJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudil7Ci0gIAlTdGF0dXMgc3RhdCA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgdHJ5CXsKLSAgICAJCi0gICAgICAvLyBjaGVjayBleGlzdGluZ1NlcnZlcgotICAgICAgaWYgKGZFeGlzdGluZ1NlcnZlciE9bnVsbCkgewotICAgIAkKLSAgICAgICAgLy8gZ2V0IEVBUiBwcm9qZWN0Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGVhclByb2plY3ROYW1lXyE9bnVsbCAmJiBlYXJQcm9qZWN0TmFtZV8ubGVuZ3RoKCk+MCkgewotICAgICAgICAgIGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAJfSAgICAJCi0gICAgCQotICAgIAlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAgCVdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgCXN0YXJ0U2VydmVyQ29tbWFuZCA9IChBYnN0cmFjdFN0YXJ0U2VydmVyKXJlZy5nZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkKGZFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgCWlmIChlYXJQcm9qZWN0IT1udWxsKSB7Ci0gICAgCQlzdGFydFNlcnZlckNvbW1hbmQucnVuUHJlU2VydmVyQ29uZmlnKGZFeGlzdGluZ1NlcnZlciwgZWFyUHJvamVjdCk7Ci0gICAgCX0KLSAgICAgIH0KLSAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UgKSB7Ci0gICAgICBJU3RhdHVzIGVtYmVkZGVkU3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICBzdGF0ID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdCk7Ci0gIAkJcmV0dXJuIHN0YXQ7Ci0gIAl9ICAJCi0gIAkKLSAgCXJldHVybiBzdGF0OwotICB9ICAKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KXsKLSAgCQotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOyAgCQotICAJCi0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLSAgICBJU2VydmVyIGV4aXN0aW5nU2VydmVyID1udWxsOwotICAgIGZFeGlzdGluZ1NlcnZlciA9IG51bGw7IAotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXIgdGhpc1NlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotICAgICAgU3RyaW5nIHRoaXNTZXJ2ZXJJZCA9IG51bGw7Ci0gICAgICBpZiAodGhpc1NlcnZlciE9bnVsbCkgewotICAgICAgCXdjID0gdGhpc1NlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotICAgICAgICB0aGlzU2VydmVySWQgPSAod2MhPW51bGwgPyB3Yy5nZXRJZCgpIDogbnVsbCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh0aGlzU2VydmVySWQuZXF1YWxzKGV4aXN0aW5nU2VydmVySWRfKSkKLSAgICAgICAgZXhpc3RpbmdTZXJ2ZXIgPSB0aGlzU2VydmVyOwotICAgIH0gICAgCQotICAgIHRyeQl7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGVhclByb2plY3ROYW1lXyE9bnVsbCAmJiBlYXJQcm9qZWN0TmFtZV8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgICAgfSAgICAJCi0gICAgCQotICAgCQlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAJCVdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChleGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgIAlpZiAoZWFyUHJvamVjdCE9bnVsbCkgewotICAgICAJCXN0YXJ0U2VydmVyQ29tbWFuZC5ydW5Qb3N0U2VydmVyQ29uZmlnKGV4aXN0aW5nU2VydmVyLCBlYXJQcm9qZWN0KTsKLSAgICAgCQlmRXhpc3RpbmdTZXJ2ZXIgPSBleGlzdGluZ1NlcnZlcjsKLSAgICAgCX0KLSAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UgKSB7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAJc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBzdGF0dXM7ICAgICAgCQotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbFVSSS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICByZXR1cm4gd3NkbFVSSV87Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzZGxVUkkKLSAgICogICAgICAgICAgICBUaGUgd3NkbFVSSSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgd3NkbFVSSV8gPSB3c2RsVVJJOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsUGFyc2VyXy4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICBpZiggd3NkbFBhcnNlcl8gPT0gbnVsbCApCi0gICAgewotICAgICAgd3NkbFBhcnNlcl8gPSBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQoKTsgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gd3NkbFBhcnNlcl87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2RsUGFyc2VyXyBUaGUgd3NkbFBhcnNlcl8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd3NkbFBhcnNlcl8pCi0gIHsKLSAgICB0aGlzLndzZGxQYXJzZXJfID0gd3NkbFBhcnNlcl87Ci0gIH0KLS8qKgotICogQHBhcmFtIGVhclByb2plY3ROYW1lIFRoZSBlYXJQcm9qZWN0TmFtZSB0byBzZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHNldEVhclByb2plY3ROYW1lKFN0cmluZyBlYXJQcm9qZWN0TmFtZSkgewotCXRoaXMuZWFyUHJvamVjdE5hbWVfID0gZWFyUHJvamVjdE5hbWU7Ci19Ci0vKioKLSAqIEBwYXJhbSBleGlzdGluZ1NlcnZlcklkIFRoZSBleGlzdGluZ1NlcnZlcklkIHRvIHNldC4KLSAqLwotcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXJJZChTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZCkgewotCXRoaXMuZXhpc3RpbmdTZXJ2ZXJJZF8gPSBleGlzdGluZ1NlcnZlcklkOwotfQotCi0vKioKLSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNSZXN0YXJ0UHJvamVjdE5lZWRlZC4KLSAqLwotcHVibGljIGJvb2xlYW4gZ2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCgpIHsKLQlyZXR1cm4gaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF87Ci19Ci0vKioKLSAqIEBwYXJhbSBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkIFRoZSBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkIHRvIHNldC4KLSAqLwotcHVibGljIHZvaWQgc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZChib29sZWFuIGlzUmVzdGFydFByb2plY3ROZWVkZWQpIHsKLQl0aGlzLmlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfID0gaXNSZXN0YXJ0UHJvamVjdE5lZWRlZDsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliMzEzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0Fic3RyYWN0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU9iamVjdFNlbGVjdGlvbldpZGdldAotewotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pCi0gIHsKLSAgICAvLyBzdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLSAgfQotCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotICB7Ci0gICAgLy8gc3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0gICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIC8vICBzdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICAvLyAgc3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0YTk5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5JRUFSTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0LkVKQk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3QuRUpCUHJvamVjdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLXB1YmxpYyBjbGFzcyBFSkJTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldCBpbXBsZW1lbnRzIElPYmplY3RTZWxlY3Rpb25XaWRnZXQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgQ29tYm8gZWFyTGlzdDsKLSAgcHJpdmF0ZSBFSkJUYWJsZVZpZXdlciBiZWFuTGlzdDsKLSAgcHJpdmF0ZSBFQVJOYXR1cmVSdW50aW1lW10gZWFyUHJvamVjdHM7Ci0gIHByaXZhdGUgSW50ZWdlciBzZWxlY3RlZEJlYW5JbmRleCA9IG51bGw7Ci0gIHByaXZhdGUgVmVjdG9yIGVqYkJlYW5OYW1lczsKLSAgcHJpdmF0ZSBWZWN0b3IgZWpiUHJvamVjdE5hbWVzOwotICBwcml2YXRlIExpc3RlbmVyICBzdGF0dXNMaXN0ZW5lcl87Ci0gIC8qIENPTlRFWFRfSUQgUEVCRDAwMDEgZm9yIHRoZSBFQVIgUHJvamVjdHMgZHJvcC1kb3duIGJveCAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BFQkRfRUFSX1BST0pFQ1RTID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5QRUJEMDAwMSI7Ci0gIC8qIENPTlRFWFRfSUQgUEVCRDAwMDIgZm9yIHRoZSB0YWJsZSBjb250YWluaW5nIGFsbCBvZiB0aGUgYmVhbiBuYW1lcyAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BFQkRfVEFCTEVfQkVBTl9OQU1FUyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuUEVCRDAwMDIiOwotCi0gIHB1YmxpYyBFSkJTZWxlY3Rpb25XaWRnZXQoKQotICB7Ci0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cygpOwotICAgIFZlY3RvciBlYXJWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZWFyVmVjdG9yLmFkZChwcm9qZWN0c1tpXS5nZXROYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBlYXJQcm9qZWN0cyA9IChFQVJOYXR1cmVSdW50aW1lW10pIGVhclZlY3Rvci50b0FycmF5KG5ldyBFQVJOYXR1cmVSdW50aW1lWzBdKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRCZWFuKCkKLSAgewotICAgIGlmIChzZWxlY3RlZEJlYW5JbmRleCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiAoU3RyaW5nKSAoZWpiQmVhbk5hbWVzLmVsZW1lbnRBdChzZWxlY3RlZEJlYW5JbmRleC5pbnRWYWx1ZSgpKSk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFByb2plY3QoKQotICB7Ci0gICAgaWYgKHNlbGVjdGVkQmVhbkluZGV4ICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIChTdHJpbmcpIChlamJQcm9qZWN0TmFtZXMuZWxlbWVudEF0KHNlbGVjdGVkQmVhbkluZGV4LmludFZhbHVlKCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBzdGF0dXNMaXN0ZW5lcl8gID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotICAgIENvbXBvc2l0ZSBwcm9qZWN0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBwcm9qZWN0Q29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIHByb2plY3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotICAgIG5ldyBMYWJlbChwcm9qZWN0Q29tcG9zaXRlLCBTV1QuTlVMTCkuc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9FQVJfUFJPSkVDVFMiKSk7Ci0gICAgZWFyTGlzdCA9IG5ldyBDb21ibyhwcm9qZWN0Q29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgZWFyTGlzdC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBlYXJMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpCi0gICAgICB7Ci0gICAgICAgIENvbWJvIHdpZGdldCA9IChDb21ibykgKGV2dC53aWRnZXQpOwotICAgICAgICBzZXRCZWFuTGlzdChlYXJQcm9qZWN0c1t3aWRnZXQuZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOwotICAgICAgICBzZWxlY3RlZEJlYW5JbmRleCA9IG51bGw7Ci0gICAgICAgIHN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBhZGRFQVJOYW1lc1RvTGlzdCgpOwotICAgIGVhckxpc3Quc2V0VG9vbFRpcFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiVE9PTFRJUF9FQVJfUFJPSkVDVFMiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChlYXJMaXN0LCBJTkZPUE9QX1BFQkRfRUFSX1BST0pFQ1RTKTsKLSAgICBHcm91cCBiZWFuQ29tcG9zaXRlID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgYmVhbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBiZWFuQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLSAgICBiZWFuQ29tcG9zaXRlLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiTEFCRUxfRUpCX0JFQU5fTkFNRSIpKTsKLSAgICBiZWFuTGlzdCA9IG5ldyBFSkJUYWJsZVZpZXdlcihiZWFuQ29tcG9zaXRlKTsKLSAgICBUYWJsZSBiZWFuVGFibGUgPSBiZWFuTGlzdC5nZXRUYWJsZSgpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotICAgIGdkLmhlaWdodEhpbnQgPSAxMDA7Ci0gICAgYmVhblRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgIGJlYW5UYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KQotICAgICAgewotICAgICAgICBUYWJsZSB0YWJsZSA9IChUYWJsZSkgKGV2dC53aWRnZXQpOwotICAgICAgICBzZWxlY3RlZEJlYW5JbmRleCA9IG5ldyBJbnRlZ2VyKHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotICAgICAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgYmVhblRhYmxlLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfVEFCTEVfQkVBTl9OQU1FUyIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJlYW5UYWJsZSwgSU5GT1BPUF9QRUJEX1RBQkxFX0JFQU5fTkFNRVMpOwotICAgIGlmIChlYXJQcm9qZWN0cyAhPSBudWxsICYmIGVhclByb2plY3RzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgc2V0QmVhbkxpc3QoZWFyUHJvamVjdHNbMF0pOwotICAgIH0KLSAgICBiZWFuVGFibGUuZ2V0Q29sdW1uKDApLnBhY2soKTsKLSAgICBiZWFuVGFibGUuZ2V0Q29sdW1uKDEpLnBhY2soKTsKLSAgICAvLyBUaGlzIGlzIGEgZHVtbXkgbGFiZWwgdGhhdCBmb3JjZXMgdGhlIHN0YXR1cyBsYWJlbCBpbnRvIHRoZSBzZWNvbmQKLSAgICAvLyBjb2x1bW4uCi0gICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5VTEwpLnNldFRleHQoIiIpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZEVBUk5hbWVzVG9MaXN0KCkKLSAgewotICAgIGlmIChlYXJQcm9qZWN0cyAhPSBudWxsICYmIGVhclByb2plY3RzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVhclByb2plY3RzLmxlbmd0aDsgaW5kZXgrKykKLSAgICAgIHsKLSAgICAgICAgZWFyTGlzdC5hZGQoZWFyUHJvamVjdHNbaW5kZXhdLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgZWFyTGlzdC5zZXRUZXh0KGVhckxpc3QuZ2V0SXRlbSgwKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEJlYW5MaXN0KEVBUk5hdHVyZVJ1bnRpbWUgZWFyUHJvamVjdCkKLSAgewotICAgIFZlY3RvciBlamJQcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFSkJQcm9qZWN0cyhlYXJQcm9qZWN0KTsKLSAgICBUYWJsZSBiZWFuVGFibGUgPSBiZWFuTGlzdC5nZXRUYWJsZSgpOwotICAgIGJlYW5UYWJsZS5yZW1vdmVBbGwoKTsKLSAgICBlamJCZWFuTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZWpiUHJvamVjdE5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlamJQcm9qZWN0cy5zaXplKCk7IGluZGV4KyspCi0gICAgewotICAgICAgRUpCTmF0dXJlUnVudGltZSBlamJOYXR1cmUgPSAoRUpCTmF0dXJlUnVudGltZSkgKGVqYlByb2plY3RzLmVsZW1lbnRBdChpbmRleCkpOwotICAgICAgRUpCUHJvamVjdFJlc291cmNlcyBlamJSZXNvdXJjZSA9IG5ldyBFSkJQcm9qZWN0UmVzb3VyY2VzKGVqYk5hdHVyZS5nZXRQcm9qZWN0KCkpOwotICAgICAgRUpCSmFyIGphciA9IGVqYlJlc291cmNlLmdldEVKQkphcigpOwotICAgICAgVmVjdG9yIGJlYW5zID0gSjJFRVV0aWxzLmdldEJlYW5OYW1lcyhqYXIpOwotICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gZWpiTmF0dXJlLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0gICAgICBlamJCZWFuTmFtZXMuYWRkQWxsKGJlYW5zKTsKLSAgICAgIGVqYlByb2plY3ROYW1lcy5hZGRBbGwoQ29sbGVjdGlvbnMubkNvcGllcyhiZWFucy5zaXplKCksIHByb2plY3ROYW1lKSk7Ci0gICAgICBlamJSZXNvdXJjZS5jbGVhbnVwKCk7Ci0gICAgfQotICAgIGJlYW5MaXN0LnNldERhdGEoZWpiQmVhbk5hbWVzLCBlamJQcm9qZWN0TmFtZXMpOwotICAgIGJlYW5MaXN0LnNldElucHV0KGVqYkJlYW5OYW1lcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmICFpbml0aWFsU2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXNzaW9uKQotICAgICAgewotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbikgb2JqZWN0OwotICAgICAgICBFSkJKYXIgamFyID0gc2Vzc2lvbi5nZXRFamJKYXIoKTsKLSAgICAgICAgaWYgKGphciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJQcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBWZWN0b3IgZWpiUHJvamVjdHMgPSBKMkVFVXRpbHMuZ2V0RUpCUHJvamVjdHMoZWFyUHJvamVjdHNbaV0pOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGVqYlByb2plY3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVKQlByb2plY3RSZXNvdXJjZXMgZWpiUmVzb3VyY2UgPSBuZXcgRUpCUHJvamVjdFJlc291cmNlcygoKEVKQk5hdHVyZVJ1bnRpbWUpIGl0Lm5leHQoKSkuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgICAgaWYgKGVqYlJlc291cmNlLmdldEVKQkphcigpID09IGphcikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVhckxpc3Quc2V0VGV4dChlYXJQcm9qZWN0c1tpXS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBzZXRCZWFuTGlzdChlYXJQcm9qZWN0c1tpXSk7Ci0gICAgICAgICAgICAgICAgYmVhbkxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoZWpiQmVhbk5hbWVzLmluZGV4T2Yoc2Vzc2lvbi5nZXROYW1lKCkpKX0pKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZEJlYW5JbmRleCA9IG5ldyBJbnRlZ2VyKGVqYkJlYW5OYW1lcy5pbmRleE9mKHNlc3Npb24uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgZWpiUmVzb3VyY2UuY2xlYW51cCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlamJSZXNvdXJjZS5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldE9iamVjdFNlbGVjdGlvbigpCi0gIHsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGJlYW5MaXN0LmdldFNlbGVjdGlvbigpOwotICAgIGlmIChzZWwgIT0gbnVsbCAmJiAhc2VsLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEludGVnZXIpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBzZWxFSkJOYW1lID0gKFN0cmluZykgZWpiQmVhbk5hbWVzLmdldCgoKEludGVnZXIpIG9iamVjdCkuaW50VmFsdWUoKSk7Ci0gICAgICAgIGlmIChzZWxFSkJOYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBWZWN0b3IgZWpiUHJvamVjdHMgPSBKMkVFVXRpbHMuZ2V0RUpCUHJvamVjdHMoZWFyUHJvamVjdHNbZWFyTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpXSk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGVqYlByb2plY3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgRUpCUHJvamVjdFJlc291cmNlcyBlamJSZXNvdXJjZSA9IG5ldyBFSkJQcm9qZWN0UmVzb3VyY2VzKCgoRUpCTmF0dXJlUnVudGltZSkgaXQubmV4dCgpKS5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgRUpCSmFyIGphciA9IGVqYlJlc291cmNlLmdldEVKQkphcigpOwotICAgICAgICAgICAgamF2YS51dGlsLkxpc3Qgc2Vzc2lvbnMgPSBqYXIuZ2V0U2Vzc2lvbkJlYW5zKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0MiA9IHNlc3Npb25zLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbikgaXQyLm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKHNlbEVKQk5hbWUuZXF1YWxzKHNlc3Npb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVqYlJlc291cmNlLmNsZWFudXAoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IFNlc3Npb25bXXtzZXNzaW9ufSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVqYlJlc291cmNlLmNsZWFudXAoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbMF0pOwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRTZWxlY3RlZFByb2plY3QoKTsKLSAgICBpZiAocHJvamVjdE5hbWUgIT0gbnVsbCAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSA+IDApCi0gICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgeyAgCQotICAgIGlmIChzZWxlY3RlZEJlYW5JbmRleCA9PSBudWxsKQotICAgIHsKLSAgICAJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIiIsU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0gICAgCi0gIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJUYWJsZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTg5ZjM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvRUpCVGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLQotcHVibGljIGNsYXNzIEVKQlRhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgVmVjdG9yIGJlYW5OYW1lczsKLSAgcHJpdmF0ZSBWZWN0b3IgcHJvamVjdE5hbWVzOwotCi0gIHB1YmxpYyBFSkJUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgU3RyaW5nIGNvbHVtblByb3BlcnRpZXNbXSA9IHttc2dVdGlscy5nZXRNZXNzYWdlKCJUQUJMRV9USVRMRV9FSkJfQkVBTl9OQU1FUyIpLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJUQUJMRV9USVRMRV9FSkJfUFJPSkVDVF9OQU1FIil9OwotICAgIFRhYmxlIHRhYmxlID0gZ2V0VGFibGUoKTsKLSAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBpKTsKLSAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNbaV0pOwotICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgODAsIHRydWUpKTsKLSAgICB9Ci0gICAgdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLSAgICBzZXRDb250ZW50UHJvdmlkZXIobmV3IEVKQkNvbnRlbnRQcm92aWRlcigpKTsKLSAgICBzZXRMYWJlbFByb3ZpZGVyKG5ldyBFSkJMYWJlbFByb3ZpZGVyKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGF0YShWZWN0b3IgYmVhbk5hbWVzLCBWZWN0b3IgcHJvamVjdE5hbWVzKQotICB7Ci0gICAgdGhpcy5iZWFuTmFtZXMgPSBiZWFuTmFtZXM7Ci0gICAgdGhpcy5wcm9qZWN0TmFtZXMgPSBwcm9qZWN0TmFtZXM7Ci0gIH0KLSAgcHJpdmF0ZSBjbGFzcyBFSkJMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gKChJbnRlZ2VyKSBvYmplY3QpLmludFZhbHVlKCk7Ci0gICAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIChTdHJpbmcpIChiZWFuTmFtZXMuZWxlbWVudEF0KGluZGV4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoU3RyaW5nKSAocHJvamVjdE5hbWVzLmVsZW1lbnRBdChpbmRleCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0gIHB1YmxpYyBjbGFzcyBFSkJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChiZWFuTmFtZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IHNpemUgPSBiZWFuTmFtZXMuc2l6ZSgpOwotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpemVdOwotICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBuZXcgSW50ZWdlcihpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSGFuZGxlclRhYmxlSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9IYW5kbGVyVGFibGVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YmU2ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9IYW5kbGVyVGFibGVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotCi0KLQotcHVibGljIGNsYXNzIEhhbmRsZXJUYWJsZUl0ZW0gewotICAKLSAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlckNsYXNzTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlck5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIHBvcnROYW1lOwotICBwcml2YXRlIGludCBpbmRleDsKLSAgCi0gIHByaXZhdGUgUG9ydENvbXBvbmVudCBwb3J0OwotICBwcml2YXRlIE9iamVjdCBoYW5kbGVyOwotICBwcml2YXRlIE9iamVjdCB3c0Rlc2NSZWY7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlckNsYXNzTmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlckNsYXNzTmFtZSgpIHsKLSAgICByZXR1cm4gaGFuZGxlckNsYXNzTmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGhhbmRsZXJDbGFzc05hbWUgVGhlIGhhbmRsZXJDbGFzc05hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzTmFtZShTdHJpbmcgaGFuZGxlckNsYXNzTmFtZSkgewotICAgIHRoaXMuaGFuZGxlckNsYXNzTmFtZSA9IGhhbmRsZXJDbGFzc05hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlck5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJOYW1lKCkgewotICAgIHJldHVybiBoYW5kbGVyTmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGhhbmRsZXJOYW1lIFRoZSBoYW5kbGVyTmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyTmFtZShTdHJpbmcgaGFuZGxlck5hbWUpIHsKLSAgICB0aGlzLmhhbmRsZXJOYW1lID0gaGFuZGxlck5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9ydC4KLSAgICovCi0gIHB1YmxpYyBQb3J0Q29tcG9uZW50IGdldFBvcnQoKSB7Ci0gICAgcmV0dXJuIHBvcnQ7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBvcnQoUG9ydENvbXBvbmVudCBwb3J0KSB7Ci0gICAgdGhpcy5wb3J0ID0gcG9ydDsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVyLgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRIYW5kbGVyKCkgewotICAgIHJldHVybiBoYW5kbGVyOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyKE9iamVjdCBoYW5kbGVyKSB7Ci0gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwb3J0TmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKSB7Ci0gICAgcmV0dXJuIHBvcnROYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcG9ydE5hbWUgVGhlIHBvcnROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBwb3J0TmFtZSkgewotICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluZGV4LgotICAgKi8KLSAgcHVibGljIGludCBnZXRJbmRleCgpIHsKLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7Ci0gICAgdGhpcy5pbmRleCA9IGluZGV4OwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzRGVzY1JlZi4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0V3NEZXNjUmVmKCkgewotICAgIHJldHVybiB3c0Rlc2NSZWY7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c0Rlc2NSZWYgVGhlIHdzRGVzY1JlZiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc0Rlc2NSZWYoT2JqZWN0IHdzRGVzY1JlZikgewotICAgIHRoaXMud3NEZXNjUmVmID0gd3NEZXNjUmVmOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0lPYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSU9iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTc4NjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSU9iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgZXh0cmEgbWV0aG9kcyB0aGF0IE9iamVjdCBTZWxlY3Rpb24gV2lkZ2V0cwotICogbmVlZCB0byBpbXBsZW1lbnQuICBPYmplY3QgU2VsZWN0aW9uIFdpZGdldHMgYXJlIGRpc3BsYXllZCBvbiBwYWdlIDIKLSAqIG9mIHRoZSBXZWIgc2VydmljZXMgd2l6YXJkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPYmplY3RTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgLyoqCi0gICAqIFRoZSBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICogdmFsdWUgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gdGhlIGluaXRpYWwgc2VsZWN0aW9uIHRoZSB1c2VyIHNwZWNpZmllZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbik7Ci0gIAotICAvKioKLSAgICogVGhlIGludGVudCBvZiB0aGUgT2JqZWN0IFNlbGVjdGlvbiBXaWRnZXQgaXMgdGhhdCB0aGUgdXNlciBoYXMKLSAgICogdGhlIG9wcG9ydHVuaXR5IGNoYW5nZS9maW5kIHRoZSBvYmplY3QgdGhhdCB0aGV5IHdhbnQgdG8gdHVybiBpbnRvCi0gICAqIGEgV2ViIHNlcnZpY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGFuIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdCB0aGF0IHRoZSB1c2VyCi0gICAqIHdhbnQgdG8gdHVybiBpbnRvIGEgV2ViIHNlcnZpY2UuICBUaGlzIG9iamVjdCBtYXkgYmUgZGlmZmVyZW50IHRoYW4KLSAgICogdGhlIGluaXRpYWxTZWxlY3Rpb24gcGFzc2VkIGluIGJ5IHRoZSBzZXRJbml0aWFsU2VsZWN0aW9uIG1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKTsKLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgb2JqZWN0U2VsZWN0aW9uIHBhcmFtZXRlciBpcyB2YWxpZCBmb3IKLSAgICogdGhpcyBPYmplY3Qgc2VsZWN0aW9uIHdpZGdldC4gIEFuIGVycm9yIHN0YXR1cyBzaG91bGQgYmUgcmV0dXJuZWQKLSAgICogaWYgdGhpcyBvYmplY3QgaXMgbm90IHZhbHVlLiAgT3RoZXJ3aXNlLCBhbmQgb2sgc3RhdHVzIHNob3VsZCBiZQotICAgKiByZXR1cm5lZAotICAgKiAKLSAgICogQHBhcmFtIG9iamVjdFNlbGVjdGlvbiB0aGUgb2JqZWN0IHRvIGJlIHZhbGlkYXRlZC4KLSAgICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIElQcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGlvbgotICAgKiBvYmplY3QgdGhhdCB0aGUgdXNlciBoYXMgY2hvc2VuIHdpdGggdGhpcyB3aWRnZXQuICBUaGUgdmFsdWUgY2FuIGJlIAotICAgKiBudWxsIGlmIHRoZXJlIGlzIG5vIElQcm9qZWN0IGZvciB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KYXZhQmVhblNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0phdmFCZWFuU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4MTQ4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0phdmFCZWFuU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQmVhblNlbGVjdGlvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIKLXsKLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgT2JqZWN0IHNlbCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdmFsdWUpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKHNlbCBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcHV0ZUZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoKElGaWxlKXNlbCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlIHJlcyA9ICgoSUNvbXBpbGF0aW9uVW5pdClzZWwpLmdldFJlc291cmNlKCk7Ci0gICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcHV0ZUZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoKElGaWxlKXJlcykpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBjb21wdXRlRnVsbHlRdWFsaWZpZWRKYXZhTmFtZShJRmlsZSByZXNvdXJjZSkKLSAgewotICAgIElQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgIFN0cmluZyBiYXNlbmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLSAgICBTdHJpbmcgYmVhbkNsYXNzID0gIiI7Ci0gICAgaWYgKGJhc2VuYW1lICE9IG51bGwgJiYgYmFzZW5hbWUubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFN0cmluZyBiZWFuUGFja2FnZSA9IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlscy5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlTmFtZShwYXRoKTsKLSAgICAgIGJlYW5DbGFzcyA9IChiZWFuUGFja2FnZSA9PSBudWxsID8gYmFzZW5hbWUgOiAoYmVhblBhY2thZ2UgKyAiLiIgKyBiYXNlbmFtZSkpOwotICAgICAgaWYgKGJlYW5DbGFzcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamF2YSIpIHx8IGJlYW5DbGFzcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkKLSAgICAgICAgYmVhbkNsYXNzID0gYmVhbkNsYXNzLnN1YnN0cmluZygwLCBiZWFuQ2xhc3MubGFzdEluZGV4T2YoJy4nKSk7Ci0gICAgfQotICAgIHJldHVybiBiZWFuQ2xhc3M7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0phdmFCZWFuU2VsZWN0aW9uV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0phdmFCZWFuU2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZmU1MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KYXZhQmVhblNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZC5pbXBsLlBvcnRDb21wb25lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZC5pbXBsLlNlcnZpY2VJbXBsQmVhbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uSmF2YVJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nLkRpYWxvZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQmVhblNlbGVjdGlvbldpZGdldCBleHRlbmRzIEFic3RyYWN0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGltcGxlbWVudHMgSU9iamVjdFNlbGVjdGlvbldpZGdldAotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBJUHJvamVjdCAgICAgICAgICAgc2VydmVyUHJvamVjdF8gPSBudWxsOwotICBwcml2YXRlIENvbXBvc2l0ZSAgICAgICAgICBwYXJlbnRfID0gbnVsbDsKLSAgcHJpdmF0ZSBJV2l6YXJkQ29udGFpbmVyICAgY29udGV4dF8gPSBudWxsOwotICBwcml2YXRlIEphdmFSZXNvdXJjZUZpbHRlciBmaWx0ZXJfID0gbmV3IEphdmFSZXNvdXJjZUZpbHRlcigpOwotICBwcml2YXRlIElSZXNvdXJjZSAgICAgICAgICBpbml0aWFsUmVzb3VyY2VfID0gbnVsbDsKLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcjsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQQkNMMDAwMSBmb3IgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfUEFHRSA9ICJQQkNMMDAwMSI7Ci0gIAotICBwcml2YXRlIFRleHQgYmVhbkNsYXNzVGV4dF87Ci0gIC8qQ09OVEVYVF9JRCBQQkNMMDAwMiBmb3IgdGhlIEJlYW4gU2VsZWN0aW9uIGZpZWxkIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX1RFWFRfQkVBTl9DTEFTUyA9ICJQQkNMMDAwMiI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gYmVhbkNsYXNzQnJvd3NlQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAzIGZvciB0aGUgQmVhbiBDbGFzcyBCcm93c2UgYnV0dG9uIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRSA9ICJQQkNMMDAwMyI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gYmVhblJlc291cmNlQnJvd3NlQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDA0IGZvciB0aGUgQmVhbiBSZXNvdXJjZSBCcm93c2UgYnV0dG9uIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSA9ICJQQkNMMDAwNCI7Ci0gICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIHRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdWlVdGlscyAgPSBuZXcgVUlVdGlscyhtc2dVdGlscywgcGx1Z2luSWRfICk7IAotICAgIAotICAgIHBhcmVudF8gPSBwYXJlbnQ7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgNCApOwotICAgIAotICAgIGdyb3VwLnNldFRvb2xUaXBUZXh0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BCQ0xfUEFHRSIpICk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggZ3JvdXAsIHBsdWdpbklkXyArICIuIiArIElORk9QT1BfUEJDTF9QQUdFICk7Ci0gICAgCi0gICAgYmVhbkNsYXNzVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIGdyb3VwLCAiTEFCRUxfQkVBTl9DTEFTU19OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUEJDTF9URVhUX0JFQU5fQ0xBU1MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfVEVYVF9CRUFOX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgYmVhbkNsYXNzVGV4dF8uYWRkTW9kaWZ5TGlzdGVuZXIoCi0gICAgICBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVNb2RpZnlCZWFuQ2xhc3NUZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIAotICAgIGJlYW5DbGFzc0Jyb3dzZUJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIGdyb3VwLCAiQlVUVE9OX0JST1dTRV9DTEFTU0VTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRSApOwotICAgIGJlYW5DbGFzc0Jyb3dzZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQnJvd3NlQ2xhc3NlcygpOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICAgIAotICAgIGJlYW5SZXNvdXJjZUJyb3dzZUJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIGdyb3VwLCAiQlVUVE9OX0JST1dTRV9GSUxFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUEJDTF9CVVRUT05fQkVBTl9SRVNPVVJDRV9CUk9XU0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDTF9CVVRUT05fQkVBTl9SRVNPVVJDRV9CUk9XU0UgKTsKLSAgICBiZWFuUmVzb3VyY2VCcm93c2VCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUJyb3dzZUZpbGVzKCk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVNb2RpZnlCZWFuQ2xhc3NUZXh0KCkKLSAgewotICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgIHNlcnZlclByb2plY3RfID0gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2VDbGFzc2VzKCkKLSAgewotICAgIFNoZWxsIHNoZWxsID0gcGFyZW50Xy5nZXRTaGVsbCgpOwotICAgIElUeXBlIGl0eXBlID0gRGlhbG9nVXRpbHMuYnJvd3NlQ2xhc3Nlc0FzSVR5cGUoc2hlbGwsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSwgbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkpOwotICAgIGlmIChpdHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJlYW5DbGFzc1RleHRfLnNldFRleHQoaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZSByZXMgPSBpdHlwZS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLSAgICAgICAgaWYgKHJlcyAhPSBudWxsKQotICAgICAgICAgIHNlcnZlclByb2plY3RfID0gcmVzLmdldFByb2plY3QoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHNlcnZlclByb2plY3RfID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKQotICAgICAgewotICAgICAgICBzZXJ2ZXJQcm9qZWN0XyA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlRmlsZXMoKQotICB7Ci0gICAgSVJlc291cmNlIHRvcFJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCk7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gRGlhbG9nVXRpbHMuYnJvd3NlUmVzb3VyY2VzKCBwYXJlbnRfLmdldFNoZWxsKCksIHRvcFJlc291cmNlLCBpbml0aWFsUmVzb3VyY2VfLCBmaWx0ZXJfICk7Ci0gICAgc2V0QmVhbkNsYXNzKHJlc291cmNlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldEJlYW5DbGFzcyhJUmVzb3VyY2UgcmVzb3VyY2UpCi0gIHsKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlICkKLSAgICB7Ci0gICAgICBJUGF0aCAgcGF0aCAgICAgPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgICAgU3RyaW5nIGJhc2VuYW1lID0gcGF0aC5sYXN0U2VnbWVudCgpOwotICAgICAgCi0gICAgICBpZiggYmFzZW5hbWUgIT0gbnVsbCAmJiBiYXNlbmFtZS5sZW5ndGgoKSA+IDAgKQotICAgICAgewotICAgICAgICBTdHJpbmcgYmVhblBhY2thZ2UgPSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHMuZ2V0SmF2YVJlc291cmNlUGFja2FnZU5hbWUocGF0aCk7Ci0gICAgICAgIFN0cmluZyBiZWFuQ2xhc3MgPSAoYmVhblBhY2thZ2UgPT0gbnVsbCA/IGJhc2VuYW1lIDogKGJlYW5QYWNrYWdlICsgIi4iICsgYmFzZW5hbWUpKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSB8fCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIiApICkKLSAgICAgICAgewotICAgICAgICAgIGJlYW5DbGFzcyA9IGJlYW5DbGFzcy5zdWJzdHJpbmcoIDAsIGJlYW5DbGFzcy5sYXN0SW5kZXhPZignLicpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJlYW5DbGFzc1RleHRfLnNldFRleHQoYmVhbkNsYXNzKTsKLSAgICAgICAgc2VydmVyUHJvamVjdF8gPSAgUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YocGF0aCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEJlYW5DbGFzcyhTZXJ2aWNlSW1wbEJlYW5JbXBsIHNlcnZpY2VJbXBsKQotICB7Ci0gICAgaWYoIHNlcnZpY2VJbXBsICE9IG51bGwgKQotICAgIHsKLSAgICAgIEVPYmplY3QgZU9iamVjdCA9IHNlcnZpY2VJbXBsLmVDb250YWluZXIoKTsKLSAgICAgIGlmKGVPYmplY3QgaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50SW1wbCl7Ci0gICAgICAJUG9ydENvbXBvbmVudEltcGwgcGNpID0gKFBvcnRDb21wb25lbnRJbXBsKWVPYmplY3Q7Ci0gICAgICAJU3RyaW5nIGJlYW5DbGFzcyA9IHBjaS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLSAgICAgIAliZWFuQ2xhc3NUZXh0Xy5zZXRUZXh0KGJlYW5DbGFzcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0QmVhbkNsYXNzKEJlYW5MaW5rIHNlcnZpY2VJbXBsKQotICB7Ci0gICAgaWYoIHNlcnZpY2VJbXBsICE9IG51bGwgKQotICAgIHsKLSAgICAgIEVPYmplY3QgZU9iamVjdCA9IHNlcnZpY2VJbXBsLmVDb250YWluZXIoKTsKLSAgICAgIGlmKGVPYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbEJlYW5JbXBsKXsKLSAgICAgIAlzZXRCZWFuQ2xhc3MoKFNlcnZpY2VJbXBsQmVhbkltcGwpZU9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmICFpbml0aWFsU2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHsKLSAgICAgIAlJRmlsZSBpRmlsZSA9IChJRmlsZSlvYmplY3Q7Ci0gICAgICAJU3RyaW5nIGZpbGVFeHQgPSBpRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgIAlpZiAoZmlsZUV4dC5lcXVhbHMoImphdmEiKSB8fCBmaWxlRXh0LmVxdWFscygiY2xhc3MiKSkKLSAgICAgICAgICBzZXRCZWFuQ2xhc3MoaUZpbGUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkKLSAgICAgIAlzZXRCZWFuQ2xhc3MoKChJQ29tcGlsYXRpb25Vbml0KW9iamVjdCkuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbEJlYW5JbXBsKQotICAgICAgCXNldEJlYW5DbGFzcygoU2VydmljZUltcGxCZWFuSW1wbClvYmplY3QpOwotICAgICAgZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBCZWFuTGluaykKLSAgICAgIAlzZXRCZWFuQ2xhc3MoKEJlYW5MaW5rKW9iamVjdCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihiZWFuQ2xhc3NUZXh0Xy5nZXRUZXh0KCkpOwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmVyUHJvamVjdF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIFN0cmluZyBiZWFuQ2xhc3NOYW1lID0gYmVhbkNsYXNzVGV4dF8uZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICBpZiAoYmVhbkNsYXNzTmFtZSA9PSBudWxsIHx8IGJlYW5DbGFzc05hbWUubGVuZ3RoKCkgPD0gMCkKLSAgICB7Ci0gICAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9NU0dfQkVBTl9DQU5OT1RfQkVfRU1QVFkiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0NTc5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuSVdlYlNlcnZpY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50IGltcGxlbWVudHMgQ29uZGl0aW9uCi17Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXI7Ci0gIHByaXZhdGUgYm9vbGVhbiBoYXNPYmplY3RTZWxlY3Rpb25XaWRnZXQ7Ci0KLSAgcHVibGljIE9iamVjdFNlbGVjdGlvbkZyYWdtZW50KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgQm9vbGVhbkZyYWdtZW50IGJvb2xGcmFnbWVudCA9IG5ldyBCb29sZWFuRnJhZ21lbnQobmV3IFNpbXBsZUZyYWdtZW50KCJPYmplY3RTZWxlY3Rpb25XaWRnZXQiKSwgbmV3IFNpbXBsZUZyYWdtZW50KCIiKSwgdGhpcyk7Ci0gICAgYWRkKGJvb2xGcmFnbWVudCk7Ci0gICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZCgpLCAiIikpOwotICAgIGhhc09iamVjdFNlbGVjdGlvbldpZGdldCA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcmV0cmlldmUgdGhlIGRhdGEgbWFwcGluZ3MgZm9yIHRoaXMgY29tbWFuZCBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBPYmplY3RTZWxlY3Rpb25XaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25GcmFnbWVudC5jbGFzcywgIlR5cGVSdW50aW1lU2VydmVyIiwgT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25GcmFnbWVudC5jbGFzcywgIlR5cGVSdW50aW1lU2VydmVyIiwgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiUHJvamVjdCIsIE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICB7Ci0gICAgcmV0dXJuIGhhc09iamVjdFNlbGVjdGlvbldpZGdldDsKLSAgfQotCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gdHlwZVJ1bnRpbWVTZXJ2ZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHR5cGVSdW50aW1lU2VydmVyIFRoZSB0eXBlUnVudGltZVNlcnZlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcikKLSAgewotICAgIHRoaXMudHlwZVJ1bnRpbWVTZXJ2ZXIgPSB0eXBlUnVudGltZVNlcnZlcjsKLSAgICBpZiAodHlwZVJ1bnRpbWVTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJV2ViU2VydmljZVR5cGUgd3N0ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRXZWJTZXJ2aWNlVHlwZUJ5SWQodHlwZVJ1bnRpbWVTZXJ2ZXIuZ2V0VHlwZUlkKCkpOwotICAgICAgaWYgKHdzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSB3c3QuZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgICAgIGhhc09iamVjdFNlbGVjdGlvbldpZGdldCA9IG9iamVjdFNlbGVjdGlvbldpZGdldElkICE9IG51bGwgJiYgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQubGVuZ3RoKCkgPiAwOwotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODkwOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLklXZWJTZXJ2aWNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfOwotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICAgb2JqZWN0U2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IG9iamVjdFNlbGVjdGlvbldpZGdldF87Ci0gIHByaXZhdGUgSVByb2plY3QgICAgICAgICAgICAgICBwcm9qZWN0XzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciAgICAgIHBhcnNlcl87Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIC8vIFRyYW5zZm9ybWF0aW9uCi0gICAgaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldElkXyAhPSBudWxsICYmIG9iamVjdFNlbGVjdGlvbldpZGdldElkXy5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldElkXy5lcXVhbHMoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lcklkID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm1lciIpOwotICAgICAgICAgIGlmICh0cmFuc2Zvcm1lcklkICE9IG51bGwgJiYgdHJhbnNmb3JtZXJJZC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCB0cmFuc2Zvcm1lciA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oInRyYW5zZm9ybWVyIik7Ci0gICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lciBpbnN0YW5jZW9mIFRyYW5zZm9ybWVyKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHRyYW5zZm9ybWVkU2VsZWN0aW9uID0gKChUcmFuc2Zvcm1lcil0cmFuc2Zvcm1lcikudHJhbnNmb3JtKG9iamVjdFNlbGVjdGlvbl8pOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lZFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uXyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil0cmFuc2Zvcm1lZFNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCQotICAgIC8vIFZhbGlkYXRpb24KLSAgICBTdGF0dXMgc3RhdHVzID0gKG9iamVjdFNlbGVjdGlvbldpZGdldF8gIT0gbnVsbCkgPyBvYmplY3RTZWxlY3Rpb25XaWRnZXRfLnZhbGlkYXRlU2VsZWN0aW9uKGdldE9iamVjdFNlbGVjdGlvbigpKSA6IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBTdGF0dXMuT0spCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLQkKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlUnVudGltZVNlcnZlciBUaGUgdHlwZVJ1bnRpbWVTZXJ2ZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXIpCi0gIHsKLSAgICBpZiAodHlwZVJ1bnRpbWVTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJV2ViU2VydmljZVR5cGUgd3N0ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRXZWJTZXJ2aWNlVHlwZUJ5SWQodHlwZVJ1bnRpbWVTZXJ2ZXIuZ2V0VHlwZUlkKCkpOwotICAgICAgaWYgKHdzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZF8gPSB3c3QuZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAob2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfICE9IG51bGwgJiYgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmplY3RTZWxlY3Rpb25XaWRnZXRJZF8uZXF1YWxzKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElPYmplY3RTZWxlY3Rpb25XaWRnZXQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0XyA9IChJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0KW9iamVjdDsKLSAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbGVjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIG9iamVjdFNlbGVjdGlvbl87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZWxlY3Rpb24gVGhlIHNlbGVjdGlvbiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPYmplY3RTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgb2JqZWN0U2VsZWN0aW9uXyA9IG9iamVjdFNlbGVjdGlvbjsKLSAgICAKLSAgICAvL1NldCB0aGUgcHJvamVjdCBpZiB5b3UgY2FuCi0gICAgaWYgKHByb2plY3RfPT1udWxsKQotICAgIHsKLSAgICAgIHByb2plY3RfID0gZ2V0UHJvamVjdEZyb21PYmplY3RTZWxlY3Rpb24ob2JqZWN0U2VsZWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIFdTREwgc2VsZWN0aW9uIG9iamVjdC4gIElmIGl0IGlzIHdlIG5lZWQKLSAgICAvLyB0byB1bndyYXAgaXQuCi0gICAgaWYoIG9iamVjdFNlbGVjdGlvbiAhPSBudWxsICYmICFvYmplY3RTZWxlY3Rpb24uaXNFbXB0eSgpICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gb2JqZWN0U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgCi0gICAgICBpZiggb2JqZWN0IGluc3RhbmNlb2YgV1NETFNlbGVjdGlvbldyYXBwZXIgKQotICAgICAgewotICAgICAgICBXU0RMU2VsZWN0aW9uV3JhcHBlciB3c2RsV3JhcHBlciA9IChXU0RMU2VsZWN0aW9uV3JhcHBlcilvYmplY3Q7Ci0gICAgICAgIAotICAgICAgICBvYmplY3RTZWxlY3Rpb25fID0gd3NkbFdyYXBwZXIud3NkbFNlbGVjdGlvbjsKLSAgICAgICAgcGFyc2VyXyAgICAgICAgICA9IHdzZGxXcmFwcGVyLnBhcnNlcjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0XzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdGhpcy5wcm9qZWN0XyA9IHByb2plY3Q7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJzZXJfLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAgIHJldHVybiBwYXJzZXJfOwotICB9Ci0gIAotICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tT2JqZWN0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0JCSAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRQcm9qZWN0RnJvbU9iamVjdFNlbGVjdGlvbiAtIHJlc291cmNlID0gIityZXNvdXJjZSk7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIElQcm9qZWN0IHAgPSBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iamVjdFNlbGVjdGlvbiBwcm9qZWN0ID0gIitwKTsKLSAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2RiZDY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeQotewotICBwcml2YXRlIHN0YXRpYyBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeSBpbnN0YW5jZTsKLSAgcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHM7Ci0gIAotICBwcml2YXRlIE9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIGVsZW1lbnRzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJvYmplY3RTZWxlY3Rpb25XaWRnZXQiKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgIGluc3RhbmNlID0gbmV3IE9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudHM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhYTBkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5JV2ViU2VydmljZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBPYmplY3RTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldCBpbXBsZW1lbnRzIElPYmplY3RTZWxlY3Rpb25XaWRnZXQKLXsKLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50czsKLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotICBwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXI7Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICBwcml2YXRlIElPYmplY3RTZWxlY3Rpb25XaWRnZXQgY2hpbGQ7Ci0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotCSAgU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3RTZWxlY3Rpb25XaWRnZXQgLSAtIDEiKTsJICAKLSAgICBlbGVtZW50cyA9IE9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotICAgIGNvbXBvc2l0ZSA9IG51bGw7Ci0JU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3RTZWxlY3Rpb25XaWRnZXQgLSAtIDIiKTsJCQotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIHR5cGVSdW50aW1lU2VydmVyIFRoZSB0eXBlUnVudGltZVNlcnZlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcikKLSAgewotICAgIHRoaXMudHlwZVJ1bnRpbWVTZXJ2ZXIgPSB0eXBlUnVudGltZVNlcnZlcjsKLSAgICBpZiAoY29tcG9zaXRlICE9IG51bGwpCi0gICAgewotICAgICAgY29tcG9zaXRlLmRpc3Bvc2UoKTsKLSAgICAgIGNoaWxkID0gbnVsbDsKLSAgICB9Ci0gICAgaWYgKHR5cGVSdW50aW1lU2VydmVyICE9IG51bGwpCi0gICAgewotICAgICAgSVdlYlNlcnZpY2VUeXBlIHdzdCA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0V2ViU2VydmljZVR5cGVCeUlkKHR5cGVSdW50aW1lU2VydmVyLmdldFR5cGVJZCgpKTsKLSAgICAgIGlmICh3c3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG9iamVjdFNlbGVjdGlvbldpZGdldElkID0gd3N0LmdldE9iamVjdFNlbGVjdGlvbldpZGdldCgpOwotICAgICAgICBpZiAob2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgIT0gbnVsbCAmJiBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmplY3RTZWxlY3Rpb25XaWRnZXRJZC5lcXVhbHMoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSU9iamVjdFNlbGVjdGlvbldpZGdldCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBDb250cm9sIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgICBpbnQgeCA9IHNoZWxsLmdldFNpemUoKS54OwotICAgICAgICAgICAgICAgICAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICAgICAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgICAgICAgICAgIGNoaWxkID0gKElPYmplY3RTZWxlY3Rpb25XaWRnZXQpb2JqZWN0OwotICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkQ29udHJvbHMoY29tcG9zaXRlLCBzdGF0dXNMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICBjaGlsZC5zZXRJbml0aWFsU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLnNldFNpemUoeC0yMCwgY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0gICAgICAgICAgICAgICAgICBwYXJlbnQuc2V0U2l6ZSh4LTEwLCBwYXJlbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLSAgICAgICAgICAgICAgICAgIHNoZWxsLnNldFNpemUoeCwgc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLSAgICAgICAgICAgICAgICAgIHNoZWxsLnNldFJlZHJhdyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgIHNoZWxsLnJlZHJhdygpOwotICAgICAgICAgICAgICAgICAgc2hlbGwudXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRTdGF0dXMoKSA6IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbjsKLSAgICBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pOwotICAgIGlmIChjaGlsZCAhPSBudWxsKQotICAgICAgY2hpbGQuc2V0SW5pdGlhbFNlbGVjdGlvbihpbml0aWFsU2VsZWN0aW9uKTsKLSAgfQotICAgIAotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRPYmplY3RTZWxlY3Rpb24oKSA6IG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgcmV0dXJuIChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLnZhbGlkYXRlU2VsZWN0aW9uKG9iamVjdFNlbGVjdGlvbikgOiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICB7Ci0gICAgaWYgKGNoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgSVByb2plY3QgcCA9IGNoaWxkLmdldFByb2plY3QoKTsKLSAgICAgIGlmIChwICE9IG51bGwpCi0gICAgICAgIHJldHVybiBwOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsgCi0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgICBpZiAocmVzb3VyY2U9PW51bGwpIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgSVByb2plY3QgcCA9IFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvVGltZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvVGltZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2MTIwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1RpbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLXB1YmxpYyBjbGFzcyBUaW1lciBleHRlbmRzIFRocmVhZAotewotICBwcml2YXRlIHN0YXRpYyBUaW1lciBpbnN0YW5jZSA9IG51bGw7Ci0gIHByaXZhdGUgZmluYWwgbG9uZyBPTkVfU0VDT05EID0gMTAwMDsKLSAgcHJpdmF0ZSBsb25nIHJlZnJlc2hUaW1lOwotICBwcml2YXRlIERpc3BsYXkgZGlzcGxheTsKLSAgcHJpdmF0ZSBSdW5uYWJsZSBydW5uYWJsZTsKLQotICBwcml2YXRlIFRpbWVyKERpc3BsYXkgZGlzcGxheSwgUnVubmFibGUgcnVubmFibGUpCi0gIHsKLSAgICB0aGlzLmRpc3BsYXkgPSBkaXNwbGF5OwotICAgIHRoaXMucnVubmFibGUgPSBydW5uYWJsZTsKLSAgfQotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFRpbWVyIG5ld0luc3RhbmNlKERpc3BsYXkgZGlzcGxheSwgUnVubmFibGUgcnVubmFibGUpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgIGluc3RhbmNlID0gbmV3IFRpbWVyKGRpc3BsYXksIHJ1bm5hYmxlKTsKLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIGJvb2xlYW4gaXNSdW5uaW5nKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZSAhPSBudWxsOwotICB9Ci0KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0VGltZXIoKQotICB7Ci0gICAgcmVmcmVzaFRpbWUgPSBnZXRDdXJyZW50VGltZSgpICsgT05FX1NFQ09ORDsKLSAgICBpZiAoIWlzQWxpdmUoKSkKLSAgICAgIHRoaXMuc3RhcnQoKTsKLSAgfQotCi0gIHByaXZhdGUgbG9uZyBnZXRDdXJyZW50VGltZSgpCi0gIHsKLSAgICByZXR1cm4gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkuZ2V0VGltZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGxvbmcgY3VyclRpbWUgPSBnZXRDdXJyZW50VGltZSgpOwotICAgIHdoaWxlIChjdXJyVGltZSA8IHJlZnJlc2hUaW1lKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBzbGVlcChyZWZyZXNoVGltZSAtIGN1cnJUaW1lKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIGN1cnJUaW1lID0gZ2V0Q3VycmVudFRpbWUoKTsKLSAgICB9Ci0gICAgaW5zdGFuY2UgPSBudWxsOwotICAgIGRpc3BsYXkuc3luY0V4ZWMocnVubmFibGUpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvV1NETFNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDJjY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NjbGllbnQuaW1wbC5TZXJ2aWNlUmVmSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOyAKLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25UcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWwgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZhbHVlKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCgoSVJlc291cmNlKXNlbCkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgU2VydmljZUltcGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoU2VydmljZUltcGwpc2VsKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmSW1wbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0RMVVJJKChTZXJ2aWNlUmVmSW1wbClzZWwpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbCBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoV1NETFJlc291cmNlSW1wbClzZWwpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjZDBmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvblRyZWVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5EaWFsb2dSZXNvdXJjZUJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5GaWxlRXh0ZW5zaW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbldpZGdldCBleHRlbmRzIEFic3RyYWN0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGltcGxlbWVudHMgSU9iamVjdFNlbGVjdGlvbldpZGdldCwgUnVubmFibGUKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIHBsdWdpbklkXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgICAgICAgIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBGaWxlRXh0ZW5zaW9uRmlsdGVyIHdzRmlsdGVyXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLQotICBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRfOwotICBwcml2YXRlIExpc3RlbmVyICBzdGF0dXNMaXN0ZW5lcl87Ci0gIHByaXZhdGUgV1NETFNlbGVjdGlvblRyZWVXaWRnZXQgdHJlZTsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQQ09OMDAwMSBmb3IgdGhlIFdTREwgU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BDT05fUEFHRSA9ICJQQ09OMDAwMSI7Ci0KLSAgLypDT05URVhUX0lEIFBDT04wMDAyIGZvciB0aGUgV1NETCBEb2N1bWVudCB0ZXh0IGZpZWxkIG9mIHRoZSBXU0RMIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQ09OX1RFWFRfV1NETCA9ICJQQ09OMDAwMiI7Ci0gIHByaXZhdGUgVGV4dCB3ZWJTZXJ2aWNlVVJJOwotCi0gIC8qQ09OVEVYVF9JRCBQQ09OMDAwMyBmb3IgdGhlIFdTREwgUmVzb3VyY2UgQnJvd3NlIGJ1dHRvbiBvZiB0aGUgV1NETCBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUENPTl9CVVRUT05fQlJPV1NFX1dTREwgPSAiUENPTjAwMDMiOwotICBwcml2YXRlIEJ1dHRvbiB3c0Jyb3dzZUJ1dHRvbl87Ci0gIAotICBwdWJsaWMgV1NETFNlbGVjdGlvbldpZGdldCgpCi0gIHsKLSAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICB3c0ZpbHRlcl8gPSBuZXcgRmlsZUV4dGVuc2lvbkZpbHRlcihuZXcgU3RyaW5nW10geyJ3c2RsIiwgIndzaWwiLCAiaHRtbCJ9KTsKLSAgICB3ZWJTZXJ2aWNlc1BhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICB9Ci0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgVUlVdGlscyB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKCBtc2dVdGlsc18sIHBsdWdpbklkXyApOwotICAgIHBhcmVudF8gICAgICAgICAgPSBwYXJlbnQ7Ci0gICAgc3RhdHVzTGlzdGVuZXJfICA9IHN0YXR1c0xpc3RlbmVyOwotCi0JICBwYXJlbnQuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiVE9PTFRJUF9QQ09OX1BBR0UiICkgKTsKLQkgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIHBhcmVudCwgcGx1Z2luSWRfICsgIi4iICsgSU5GT1BPUF9QQ09OX1BBR0UgKTsKLSAgICAKLSAgICBDb21wb3NpdGUgd3NkbEdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMiwgNSwgMCApOwotICAgIAotICAgIExhYmVsIHdzTGFiZWwgPSBuZXcgTGFiZWwoIHdzZGxHcm91cCwgU1dULldSQVApOwotICAgIHdzTGFiZWwuc2V0VGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX1dTX1NFTEVDVElPTiIpKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICB3c0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgIHdzTGFiZWwuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BDT05fVEVYVF9XUyIpICk7Ci0gICAgCi0gICAgd2ViU2VydmljZVVSSSA9IHVpVXRpbHMuY3JlYXRlVGV4dCggd3NkbEdyb3VwLCBudWxsLCAiVE9PTFRJUF9QQ09OX1RFWFRfV1MiLCBJTkZPUE9QX1BDT05fVEVYVF9XU0RMLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOwotICAgIHdlYlNlcnZpY2VVUkkuYWRkTW9kaWZ5TGlzdGVuZXIoCi0gICAgICBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlV2ViU2VydmljZVVSSU1vZGlmeUV2ZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIHdlYlNlcnZpY2VVUkkuYWRkTGlzdGVuZXIoIFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyICk7Ci0KLSAgICB3c0Jyb3dzZUJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIHdzZGxHcm91cCwgIkJVVFRPTl9CUk9XU0UiLCAiVE9PTFRJUF9QQ09OX0JVVFRPTl9CUk9XU0VfV1MiLCBJTkZPUE9QX1BDT05fQlVUVE9OX0JST1dTRV9XU0RMICk7Ci0gICAgd3NCcm93c2VCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotICAgICAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlV1NETEJ1dHRvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZVdTRExCdXR0b24oKTsKLSAgICAgICAgfSAKLSAgICAgIH0pOwotCi0gICAgdHJlZSA9IG5ldyBXU0RMU2VsZWN0aW9uVHJlZVdpZGdldCgpOwotICAgIHRyZWUuYWRkQ29udHJvbHMocGFyZW50LCBzdGF0dXNMaXN0ZW5lcik7Ci0gICAgdHJlZS5zZXRXZWJTZXJ2aWNlc1BhcnNlcih3ZWJTZXJ2aWNlc1BhcnNlcik7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVXZWJTZXJ2aWNlVVJJTW9kaWZ5RXZlbnQoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VVUkkuZ2V0VGV4dCgpLmluZGV4T2YoJzonKSA+IDApCi0gICAgICBUaW1lci5uZXdJbnN0YW5jZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgdGhpcykuc3RhcnRUaW1lcigpOwotICAgIGVsc2UKLSAgICAgIGhhbmRsZVdlYlNlcnZpY2VVUkkoKTsKLSAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVXZWJTZXJ2aWNlVVJJKCkKLSAgewotICAgIFN0cmluZyB3c1VSSSA9IHdlYlNlcnZpY2VVUkkuZ2V0VGV4dCgpOwotICAgIGlmICh3c1VSSS5pbmRleE9mKCc6JykgPCAwKQotICAgIHsKLSAgICAgIElGaWxlIGZpbGUgPSB1cmkySUZpbGUod3NVUkkpOwotICAgICAgaWYgKGZpbGUgIT0gbnVsbCkKLSAgICAgICAgd3NVUkkgPSBpRmlsZTJVUkkoZmlsZSk7Ci0gICAgfQotICAgIGlmICh3c1VSSSAhPSBudWxsICYmIHdzVVJJLmluZGV4T2YoJzonKSA+PSAwICYmIHdlYlNlcnZpY2VzUGFyc2VyLmdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3c1VSSSkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBXU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZCBjbWQgPSBuZXcgV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQoKTsKLSAgICAgIGNtZC5zZXRXZWJTZXJ2aWNlc1BhcnNlcih3ZWJTZXJ2aWNlc1BhcnNlcik7Ci0gICAgICBjbWQuc2V0V2ViU2VydmljZVVSSSh3c1VSSSk7Ci0gICAgICBjbWQuZXhlY3V0ZShudWxsKTsKLSAgICB9Ci0gICAgV2ViU2VydmljZUVudGl0eSBlbnRpdHkgPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkod3NVUkkpOwotICAgIGlmIChlbnRpdHkgIT0gbnVsbCAmJiBlbnRpdHkuZ2V0VHlwZSgpID09IFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0RMKQotICAgICAgdHJlZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBlbHNlCi0gICAgICB0cmVlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgdHJlZS5zZXRXZWJTZXJ2aWNlVVJJKHdzVVJJKTsKLSAgICB0cmVlLnJlZnJlc2hUcmVlVmlld2VyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBoYW5kbGVXZWJTZXJ2aWNlVVJJKCk7Ci0gICAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdTRExCdXR0b24oKQotICB7Ci0gICAgRGlhbG9nUmVzb3VyY2VCcm93c2VyIGRpYWxvZyA9IG5ldyBEaWFsb2dSZXNvdXJjZUJyb3dzZXIoIHBhcmVudF8uZ2V0U2hlbGwoKSwgbnVsbCwgd3NGaWx0ZXJfKTsKLSAgICBkaWFsb2cub3BlbigpOwotICAgIElSZXNvdXJjZSByZXMgPSBkaWFsb2cuZ2V0Rmlyc3RTZWxlY3Rpb24oKTsKLSAgICBpZiggcmVzICE9IG51bGwgKSB3ZWJTZXJ2aWNlVVJJLnNldFRleHQoIHJlcy5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgKTsKLSAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIC8vIFRpbWVyIHZhbGlkYXRpb24KLSAgICAvKgotICAgICAqIENvbW1lbnRpbmcgb3V0IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBibG9jayBmYXN0IHR5cGVycyBmcm9tIGhpdHRpbmcgTmV4dC9GaW5pc2ggCi0gICAgaWYgKFRpbWVyLmlzUnVubmluZygpKQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQQUdFX01TR19MT0FESU5HX1dFQl9TRVJWSUNFX1VSSSIpLCBTdGF0dXMuRVJST1IpOwotICAgICovCi0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBXZWIgc2VydmljZSBVUkkKLSAgICAvLyBGb3IgZXhhbXBsZSwgaXMgaXQgcG9pbnRpbmcgdG8gYW4gZXhpc3RpbmcgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZT8KLSAgICBTdHJpbmcgd3NQYXRoICA9IHdlYlNlcnZpY2VVUkkuZ2V0VGV4dCgpOwotICAgIGlmKCB3c1BhdGggPT0gbnVsbCB8fCB3c1BhdGgubGVuZ3RoKCkgPD0gMCApCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIlBBR0VfTVNHX0lOVkFMSURfV0VCX1NFUlZJQ0VfVVJJIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgZWxzZSBpZiggd3NQYXRoLmluZGV4T2YoJzonKSA8IDAgKQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXMgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh3c1BhdGgpOwotICAgICAgaWYoIHJlcyA9PSBudWxsICkKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQQUdFX01TR19OT19TVUNIX0ZJTEUiLCBuZXcgT2JqZWN0W10ge3dzUGF0aH0pLCBTdGF0dXMuRVJST1IpOwotICAgICAgZWxzZSBpZiggcmVzLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSApCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiUEFHRV9NU0dfSU5WQUxJRF9XRUJfU0VSVklDRV9VUkkiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgY29udGVudCBvZiB0aGUgV2ViIHNlcnZpY2UgVVJJCi0gICAgLy8gRm9yIGV4YW1wbGUsIGlzIHNlbGVjdGlvbiBhIFdTREwgVVJJPwotICAgIGlmICghVGltZXIuaXNSdW5uaW5nKCkgJiYgdHJlZS5pc0VuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gdHJlZS5nZXRTdGF0dXMoKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0gICAgICAgIGlmIChzZXZlcml0eSA9PSBTdGF0dXMuRVJST1IgfHwgc2V2ZXJpdHkgPT0gU3RhdHVzLldBUk5JTkcpCi0gICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmKCB3c1BhdGguaW5kZXhPZignOicpIDwgMCApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB3c2RsVVJJID0gaUZpbGUyVVJJKChJRmlsZSlSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh3c1BhdGgpKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkkpID09IG51bGwpCi0gICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQQUdFX01TR19TRUxFQ1RJT05fTVVTVF9CRV9XU0RMIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gT0sgc3RhdHVzCi0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSUZpbGUgdXJpMklGaWxlKFN0cmluZyB1cmkpCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHVyaSk7Ci0gICAgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgcmV0dXJuIChJRmlsZSlyZXM7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGlGaWxlMlVSSShJRmlsZSBmaWxlKQotICB7Ci0gIAlGaWxlIGYgPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIGYudG9VUkwoKS50b1N0cmluZygpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIGYudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgIWluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgU3RyaW5nIHdzZGxVUkkgPSB0b1dzZGxVUkkob2JqZWN0KTsKLSAgICAgIGlmICh3c2RsVVJJICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHdlYlNlcnZpY2VVUkkuc2V0VGV4dCh3c2RsVVJJKTsKLSAgICAgICAgaGFuZGxlV2ViU2VydmljZVVSSSgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgdG9Xc2RsVVJJKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2VydmljZUltcGwpCi0gICAgICByZXR1cm4gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoKFNlcnZpY2VJbXBsKW9iamVjdCk7Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkKLSAgICAgIHJldHVybiBKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoV1NETFJlc291cmNlSW1wbClvYmplY3QpOwotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpCi0gICAgICByZXR1cm4gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoKFNlcnZpY2VSZWYpb2JqZWN0KTsKLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHJldHVybiAoKElGaWxlKW9iamVjdCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHJldHVybiAoU3RyaW5nKW9iamVjdDsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgdG9BYnNvbHV0ZVdzZGxVUkkoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoSUZpbGUpb2JqZWN0KS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0b1dzZGxVUkkob2JqZWN0KTsKLSAgfQotCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCAKLSAgICAgICAgICAgICAgIG5ldyBXU0RMU2VsZWN0aW9uV3JhcHBlciggd2ViU2VydmljZXNQYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRyZWUuZ2V0V3NkbFVSSSgpKSApICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICByZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICBTdHJpbmcgd3NkbFVSSSA9IHRyZWUuZ2V0V3NkbFVSSSgpOwotICAgIGlmICh3c2RsVVJJICE9IG51bGwpCi0gICAgewotICAgICAgSVByb2plY3QgcCA9IGdldFByb2plY3RGcm9tVVJJKHdzZGxVUkkpOwotICAgICAgaWYgKHAhPW51bGwgJiYgcC5leGlzdHMoKSkKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAKLSAgICAgIFN0cmluZyB3c1JlbFBhdGggPSB3ZWJTZXJ2aWNlVVJJLmdldFRleHQoKTsKLSAgICAgIElSZXNvdXJjZSB3c1JlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHdzUmVsUGF0aCk7Ci0gICAgICBpZiAod3NSZXMhPW51bGwgJiYgd3NSZXMgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHsKLSAgICAgICAgSVByb2plY3QgcDIgPSAoKElGaWxlKXdzUmVzKS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIHJldHVybiBwMjsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgU3RyaW5nIHdrc3BjUm9vdExvYyA9IHJvb3QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotICAgIGludCBpZHggPSB1cmkuaW5kZXhPZih3a3NwY1Jvb3RMb2MpOwotICAgIGlmIChpZHggIT0gLTEpIAotICAgIHsKLSAgICAgIFN0cmluZyByZWxQYXRoID0gdXJpLnN1YnN0cmluZyh3a3NwY1Jvb3RMb2MubGVuZ3RoKCkraWR4KTsKLSAgICAgIElSZXNvdXJjZSByZXMgPSByb290LmZpbmRNZW1iZXIobmV3IFBhdGgocmVsUGF0aCkpOwotICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgICBJUHJvamVjdCBwID0gKChJRmlsZSlyZXMpLmdldFByb2plY3QoKTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uV3JhcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDFkZGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvV1NETFNlbGVjdGlvbldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHZlcnkgc2ltcGxlIHdyYXBwZXIgdGhhdCBiaW5kcyBhIFdTREwgcGFyc2VyIHdpdGgKLSAqIGEgd3NkbFNlbGVjdGlvbiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uV3JhcHBlciAKLXsKLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyICAgIHBhcnNlcjsKLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHdzZGxTZWxlY3Rpb247Ci0gIAotICBwdWJsaWMgV1NETFNlbGVjdGlvbldyYXBwZXIoIFdlYlNlcnZpY2VzUGFyc2VyICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7Ci0gICAgdGhpcy5wYXJzZXIgICAgICAgID0gcGFyc2VyOwotICAgIHRoaXMud3NkbFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTc5OGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL0NsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlZhbGlkYXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLkNsaWVudFByb2plY3RUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIAotICAvKiBDT05URVhUX0lEIFBXUlMwMDAzIGZvciB0aGUgV2l6YXJkIFNjZW5hcmlvIENsaWVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBSdW50aW1lIFNlbGVjdGlvbiBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19HUk9VUF9DTElFTlQgPSBwbHVnaW5JZF8gKyAiLlBXUlMwMDAzIjsKLSAgCi0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTY2VuYXJpb0lkOwotICBwcml2YXRlIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50R3JvdXBfOwotICBwcml2YXRlIFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25XaWRnZXQgcnVudGltZVdpZGdldF87Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgICAgICAgICBydW50aW1lMkNsaWVudFR5cGVzXzsKLSAgcHJpdmF0ZSBDb21ibyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFR5cGVfOwotICBwcml2YXRlIFNlbGVjdGlvbkFkYXB0ZXIgICAgICAgICAgICAgY2xpZW50VHlwZVNlbExpc3RlbmVyOwotICBwcml2YXRlIFByb2plY3RTZWxlY3Rpb25XaWRnZXQgICAgICAgcHJvamVjdFdpZGdldF87Ci0gIHByaXZhdGUgYm9vbGVhbiAJCQkJCSAgIGlzVmlzaWJsZV87Ci0gIAotICAvLyByc2sgcmV2aXNpdCAtIFB1dHRpbmcgdGhpcyBpbiB0ZW1wb3JhcmlseS4gVGhlIFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2cgbmVlZHMgdGhlIHNlcnZlcgotICAvLyBpbmZvcm1hdGlvbiBldmVuIHdoZW4gaXQgaXMgbGF1bmNoZWQgZm9yIHRoZSBjbGllbnQgaGFsZiBvZiB0aGUgY29uZmlndXJhdGlvbi4KLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VTY2VuYXJpb0lkOwotICAvLwotICAKLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdWlVdGlscyAgPSBuZXcgVUlVdGlscyhtc2dVdGlscywgcGx1Z2luSWRfICk7IAotICAgIAotICAgIGNsaWVudEdyb3VwXyA9IHVpVXRpbHMuY3JlYXRlR3JvdXAoIHBhcmVudCwgIkxBQkVMX0NMSUVOVF9TRUxFQ1RJT05fVklFV19USVRMRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgSU5GT1BPUF9QV1JTX0dST1VQX0NMSUVOVCwgMiwgNSwgNSApOwotICAgIAotICAgIHJ1bnRpbWVXaWRnZXRfID0gbmV3IFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25XaWRnZXQoIHRydWUgKTsKLSAgICBydW50aW1lV2lkZ2V0Xy5hZGRDb250cm9scyggY2xpZW50R3JvdXBfLCBzdGF0dXNMaXN0ZW5lciApOwotICAgIHJ1bnRpbWVXaWRnZXRfLmFkZE1vZGlmeUxpc3RlbmVyKCBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVJ1bnRpbWUyQ2xpZW50VHlwZXNFdmVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXBkYXRlUHJvamVjdFdpZGdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgY2xpZW50VHlwZV8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKCBjbGllbnRHcm91cF8sICJMQUJFTF9DTElFTlRfVFlQRSIsICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXQ1JfQ09NQk9fQ0xJRU5UX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1JTX0dST1VQX0NMSUVOVCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICAKLSAgICBjbGllbnRUeXBlU2VsTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZXRQcm9qZWN0cyggY2xpZW50VHlwZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjbGllbnRUeXBlXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjbGllbnRUeXBlU2VsTGlzdGVuZXIpOwotICAgIAotICAgIHByb2plY3RXaWRnZXRfID0gbmV3IFByb2plY3RTZWxlY3Rpb25XaWRnZXQodHJ1ZSk7Ci0gICAgcHJvamVjdFdpZGdldF8uYWRkQ29udHJvbHMoIGNsaWVudEdyb3VwXywgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICAvL3Byb2plY3RXaWRnZXRfLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotICAgIC8vICAJCQkJCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSl7Ci0gICAgLy8gIAkJCQkJCQkJICBnZXRQcm9qZWN0U2VsZWN0aW9ucygpOwotICAgIC8vICAJCQkJCQkJCX0KLSAgICAvLwkJCQkJCQkJfSk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgY3JlYXRvciBvZiB0aGlzIHdpZGdldCB0byBjb250cm9sCi0gIC8vIHdoZXRoZXIgaXQgaXMgdmlzaWJsZSBvciBub3QuCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoIGJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgY2xpZW50R3JvdXBfLnNldFZpc2libGUoIHZhbHVlICk7IAotICAgIGlzVmlzaWJsZV8gPSB2YWx1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCl7Ci0gIAlyZXR1cm4gdGhpcy5pc1Zpc2libGVfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsgICAgIAotICAgIHJ1bnRpbWVXaWRnZXRfLnNldFR5cGVSdW50aW1lU2VydmVyKCBpZHMgKTsKLSAgICBwcm9qZWN0V2lkZ2V0Xy5zZXRUeXBlUnVudGltZVNlcnZlcihpZHMpOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCk7ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRKMkVFVmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gcnVudGltZVdpZGdldF8uZ2V0SjJFRVZlcnNpb24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgcnVudGltZVdpZGdldF8uc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotICAgIHByb2plY3RXaWRnZXRfLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgfQotICAgIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnROZWVkRUFSKCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0V2lkZ2V0Xy5nZXROZWVkRUFSKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudE5lZWRFQVIoYm9vbGVhbiBiKQotICB7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0TmVlZEVBUihiKTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogQHBhcmFtIHJ1bnRpbWUyQ2xpZW50VHlwZXMgVGhlIHJ1bnRpbWUyQ2xpZW50VHlwZXMgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UnVudGltZTJDbGllbnRUeXBlcyhTZWxlY3Rpb25MaXN0Q2hvaWNlcyBydW50aW1lMkNsaWVudFR5cGVzKQotICB7Ci0gICAgcnVudGltZTJDbGllbnRUeXBlc18gPSBydW50aW1lMkNsaWVudFR5cGVzOwotICAgIGhhbmRsZVJ1bnRpbWUyQ2xpZW50VHlwZXNFdmVudCgpOwotICB9Ci0KLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKQotICB7Ci0gICAgQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICBTdHJpbmcgcnVudGltZSAgICAgICA9IHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCkuZ2V0UnVudGltZUlkKCk7Ci0gICAgU3RyaW5nIGNsaWVudFByb2plY3QgPSBwcm9qZWN0V2lkZ2V0Xy5nZXRQcm9qZWN0Q2hvaWNlcygpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICBTdHJpbmcgZWFyUHJvamVjdCAgICA9IHByb2plY3RXaWRnZXRfLmdldFByb2plY3RDaG9pY2VzKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgIAotICAgIFNlbGVjdGlvbkxpc3QgcnVudGltZUxpc3QgID0gcnVudGltZTJDbGllbnRUeXBlc18uZ2V0TGlzdCgpOwotICAgIHJ1bnRpbWVMaXN0LnNldFNlbGVjdGlvblZhbHVlKCBydW50aW1lICk7Ci0gICAgCi0gICAgU2VsZWN0aW9uTGlzdCBwcm9qVHlwZUxpc3QgPSBydW50aW1lMkNsaWVudFR5cGVzXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCk7Ci0gICAgcHJvalR5cGVMaXN0LnNldEluZGV4KCBjbGllbnRUeXBlXy5nZXRTZWxlY3Rpb25JbmRleCgpICk7Ci0gICAgCi0gICAgU2VsZWN0aW9uTGlzdENob2ljZXMgY2xpZW50UHJvakNob2ljZSA9IHJ1bnRpbWUyQ2xpZW50VHlwZXNfLmdldENob2ljZSgpLmdldENob2ljZSgpOwotICAgIFNlbGVjdGlvbkxpc3QgICAgICAgIGNsaWVudFByb2pMaXN0ICAgPSBjbGllbnRQcm9qQ2hvaWNlLmdldExpc3QoKTsKLSAgICBjbGllbnRQcm9qTGlzdC5zZXRTZWxlY3Rpb25WYWx1ZSggY2xpZW50UHJvamVjdCApOyAgICAKLSAgICAKLSAgICBTZWxlY3Rpb25MaXN0ICAgICAgICBlYXJQcm9qTGlzdCAgICAgID0gY2xpZW50UHJvakNob2ljZS5nZXRDaG9pY2UoKS5nZXRMaXN0KCk7ICAgCi0gICAgZWFyUHJvakxpc3Quc2V0U2VsZWN0aW9uVmFsdWUoIGVhclByb2plY3QgKTsKLSAgICAKLSAgICByZXR1cm4gcnVudGltZTJDbGllbnRUeXBlc187IAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlUnVudGltZTJDbGllbnRUeXBlc0V2ZW50KCkKLSAgewotICAgIGlmIChydW50aW1lMkNsaWVudFR5cGVzXyAhPSBudWxsKQotICAgIHsgIAotICAgICAgLy9JZiB0aGUgcnVudGltZUlkIGZyb20gcnVudGltZVdpZGdldF8gaXMgYWxyZWFkeSBzZWxlY3RlZCBpbgotICAgICAgLy9pbiBydW50aW1lMkNsaWVudFR5cGVzXywgZG8gbm90aGluZy4gCi0gICAgICBTdHJpbmcgY3VycmVudFJ1bnRpbWVJZCA9IHJ1bnRpbWUyQ2xpZW50VHlwZXNfLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIFN0cmluZyBuZXdSdW50aW1lSWQgPSBydW50aW1lV2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpLmdldFJ1bnRpbWVJZCgpOwotICAgICAgaWYgKGN1cnJlbnRSdW50aW1lSWQgIT0gbmV3UnVudGltZUlkKQotICAgICAgewotICAgICAgICBTZWxlY3Rpb25MaXN0IHJ1bnRpbWVzID0gcnVudGltZTJDbGllbnRUeXBlc18uZ2V0TGlzdCgpOwotICAgICAgICBydW50aW1lcy5zZXRTZWxlY3Rpb25WYWx1ZSggcnVudGltZVdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRSdW50aW1lSWQoKSApOwotICAgICAgfQotICAgICAgCi0gICAgICBTdHJpbmdbXSBjbGllbnRUeXBlSWRzID0gcnVudGltZTJDbGllbnRUeXBlc18uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICAgIGludCBzZWxlY3RlZENsaWVudFR5cGVJZHggPSBydW50aW1lMkNsaWVudFR5cGVzXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0SW5kZXgoKTsKLSAgICAgIAotICAgICAgY2xpZW50VHlwZV8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoY2xpZW50VHlwZVNlbExpc3RlbmVyKTsKLSAgICAgIGNsaWVudFR5cGVfLnNldEl0ZW1zKCBnZXRDbGllbnRUeXBlTGFiZWxzKCBjbGllbnRUeXBlSWRzICkpOwotICAgICAgY2xpZW50VHlwZV8uc2VsZWN0KHNlbGVjdGVkQ2xpZW50VHlwZUlkeCk7Ci0gICAgICBjbGllbnRUeXBlXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjbGllbnRUeXBlU2VsTGlzdGVuZXIpOwotICAgICAgaGFuZGxlU2V0UHJvamVjdHMoc2VsZWN0ZWRDbGllbnRUeXBlSWR4KTsKLSAgICAgIAotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVVwZGF0ZVByb2plY3RXaWRnZXQoKQotICB7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIocnVudGltZVdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKSk7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0SjJFRVZlcnNpb24ocnVudGltZVdpZGdldF8uZ2V0SjJFRVZlcnNpb24oKSk7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNldFByb2plY3RzKCBpbnQgY2xpZW50VHlwZUluZGV4ICkKLSAgeyAgICAKLSAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjbGllbnRUeXBlMlByb2plY3RzID0gcnVudGltZTJDbGllbnRUeXBlc18uZ2V0Q2hvaWNlKCk7Ci0gICAgY2xpZW50VHlwZTJQcm9qZWN0cy5nZXRMaXN0KCkuc2V0SW5kZXgoIGNsaWVudFR5cGVJbmRleCApOwotICAgIAotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBwcm9qZWN0IG5hbWUgYW5kIEVBUiBuYW1lIGFyZSBrZXB0IHRoZSBzYW1lCi0gICAgLy8gZXZlbiBpZiB0aGUgY2xpZW50IHR5cGUgaXMgY2hhbmdlZC4gIE5vdGU6IHRoZSBwcm9qZWN0IGFuZCBFQVIgbGlzdHMKLSAgICAvLyB3aWxsIGJlIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHdoYXQgaXMgc2V0IGJ5IHRoZSBjbGllbnQgdHlwZS4KLSAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjdXJyZW50UHJvamVjdHMgPSBwcm9qZWN0V2lkZ2V0Xy5nZXRQcm9qZWN0Q2hvaWNlcygpOwotICAgIAotICAgIGlmKCBjdXJyZW50UHJvamVjdHMgIT0gbnVsbCApCi0gICAgewotICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gY3VycmVudFByb2plY3RzLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIFN0cmluZyBlYXJOYW1lICAgICA9IGN1cnJlbnRQcm9qZWN0cy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAKLSAgICAgIC8vIFNldCB0aGUgcHJvamVjdCB0byBpdCdzIG9yaWdpbmFsIHN0YXRlLgotICAgICAgY2xpZW50VHlwZTJQcm9qZWN0cy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoIHByb2plY3ROYW1lICk7Ci0JCi0JICAvLyBTZXQgdGhlIEVBUiBuYW1lIHRvIGl0J3Mgb3JpZ2luYWwgc3RhdGUuCi0gICAgICBjbGllbnRUeXBlMlByb2plY3RzLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZSggZWFyTmFtZSApOwotICAgIH0KLQkKLSAgICBwcm9qZWN0V2lkZ2V0Xy5zZXRQcm9qZWN0VHlwZUlkKGNsaWVudFR5cGUyUHJvamVjdHMuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpKTsKLSAgICBwcm9qZWN0V2lkZ2V0Xy5zZXRQcm9qZWN0Q2hvaWNlcyggY2xpZW50VHlwZTJQcm9qZWN0cy5nZXRDaG9pY2UoKSApOyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRDbGllbnRUeXBlTGFiZWxzKCBTdHJpbmdbXSB0eXBlcyApCi0gIHsKLSAgICBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ICAgICAgICAgPSBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nW10gICAgICAgICAgICAgICAgICBjbGllbnRUeXBlTGFiZWxzID0gbmV3IFN0cmluZ1t0eXBlcy5sZW5ndGhdOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlcy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGNsaWVudFR5cGVMYWJlbHNbaW5kZXhdID0gcmVnaXN0cnkuZ2V0RWxlbWVudEJ5SWQodHlwZXNbaW5kZXhdKS5nZXRBdHRyaWJ1dGUoImxhYmVsIik7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjbGllbnRUeXBlTGFiZWxzOwotICB9Ci0gIAotICBwdWJsaWMgUHJvamVjdFNlbGVjdGlvbldpZGdldCBnZXRQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0KCkgewotICAgIHJldHVybiB0aGlzLnByb2plY3RXaWRnZXRfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjZ2V0U3RhdHVzKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkgCi0gIHsKLSAgICBTdGF0dXMgZmluYWxTdGF0dXMgICA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgU3RhdHVzIHByb2plY3RTdGF0dXMgPSBwcm9qZWN0V2lkZ2V0Xy5nZXRTdGF0dXMoKTsKLSAgICBTdGF0dXMgcnVudGltZVN0YXR1cyA9IHJ1bnRpbWVXaWRnZXRfLmdldFN0YXR1cygpOwotICAgIAotICAgIGlmKCBydW50aW1lU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgICB7Ci0gICAgICBmaW5hbFN0YXR1cyA9IHJ1bnRpbWVTdGF0dXM7Ci0gICAgfQotICAgIGVsc2UgaWYoIHByb2plY3RTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAgIHsKLSAgICAgIGZpbmFsU3RhdHVzID0gcHJvamVjdFN0YXR1czsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNsaWVudFByb2plY3RzID0gZ2V0UHJvamVjdFNlbGVjdGlvbldpZGdldCgpLmdldFByb2plY3RDaG9pY2VzKCk7Ci0gICAgICBWYWxpZGF0aW9uVXRpbHMgdmFsVXRpbHMgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0gICAgICBpZiAoY2xpZW50UHJvamVjdHMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGNsaWVudEVBUk5hbWUgPSBjbGllbnRQcm9qZWN0cy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBjbGllbnRQcm9qTmFtZSA9IGNsaWVudFByb2plY3RzLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICAvL1ZhbGlkYXRlIHRoYXQgdGhlIHNlbGVjdGVkIGNsaWVudCBwcm9qZWN0IGlzIG9mIHRoZSB0eXBlIGluZGljYXRlZCBieSBjbGllbnQgcHJvamVjdCB0eXBlLgotICAgICAgICBTdGF0dXMgY2xpZW50UHJvamVjdFR5cGVTdGF0dXMgPSB2YWxVdGlscy52YWxpZGF0ZVByb2plY3RUeXBlKGNsaWVudFByb2pOYW1lLCBydW50aW1lMkNsaWVudFR5cGVzXyk7Ci0gICAgICAgIGlmIChjbGllbnRQcm9qZWN0VHlwZVN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsU3RhdHVzID0gY2xpZW50UHJvamVjdFR5cGVTdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vVmFsaWRhdGUgY2xpZW50IHNpZGUgc2VydmVyIHRhcmdldHMgYW5kIEoyRUUgbGV2ZWxzCi0gICAgICAgIFN0cmluZyBjbGllbnRTZXJ2ZXJGYWN0b3J5SWQgPSBnZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpLmdldFNlcnZlcklkKCk7Ci0gICAgICAgIFN0cmluZyBjbGllbnRKMkVFbGV2ZWwgPSBnZXRKMkVFVmVyc2lvbigpOwotICAgICAgICBTdGF0dXMgY2xpZW50UHJvamVjdFN0YXR1cyA9IHZhbFV0aWxzLnZhbGlkYXRlUHJvamVjdFRhcmdldEFuZEoyRUUoY2xpZW50UHJvak5hbWUsIGNsaWVudEVBUk5hbWUsIGNsaWVudFNlcnZlckZhY3RvcnlJZCwKLSAgICAgICAgICAgIGNsaWVudEoyRUVsZXZlbCk7Ci0gICAgICAgIGlmIChjbGllbnRQcm9qZWN0U3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgZmluYWxTdGF0dXMgPSBjbGllbnRQcm9qZWN0U3RhdHVzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaW5hbFN0YXR1czsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL0NsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOGM1NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5TZXJ2ZXJTZWxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlZhbGlkYXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5DbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuSVdlYlNlcnZpY2VSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAoteyAgIAotICBwcm90ZWN0ZWQgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgLy8gY2xpZW50UnVudGltZUoyRUVUeXBlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGNsaWVudCBydW50aW1lIGFuZCBKMkVFIGxldmVsIGJhc2VkIG9uIHRoZSBpbml0aWFsIHNlbGVjdGlvbi4KLSAgLy8gSWYgdGhlIGluaXRpYWxTZWxlY2l0b24gZG9lcyBub3QgcmVzdWx0IGluIGEgdmFsaWQgY2xpZW50IHJ1bnRpbWUgYW5kIEoyRUUgbGV2ZWwsIGNsaWVudFJ1bnRpbWVKMkVFVHlwZQotICAvLyBzaG91bGQgcmVtYWluIG51bGwgZm9yIHRoZSBsaWZlIG9mIHRoaXMgaW5zdGFuY2UuICAKLSAgcHJpdmF0ZSBXU1J1bnRpbWVKMkVFVHlwZSAgICBjbGllbnRSdW50aW1lSjJFRVR5cGVfOwotICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciAgICBjbGllbnRJZHNfOwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJ1bnRpbWVDbGllbnRUeXBlc187Ci0gIAotICAvL0Egbm90ZSBvbiBpbml0aWFsU2VsZWN0aW9ucyAuLi4KLSAgLy9UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGNsaWVudEluaXRpYWxTZWxlY3Rpb25fIGFuZCBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbiBpcyB0aGF0Ci0gIC8vY2xpZW50SW5pdGlhbFNlbGVjdGlvbl8gY29tZXMgZnJvbSB0aGUgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZCB3aGlsZSBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbgotICAvL2lzIHRoZSBhY3R1YWwgdGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlIHRoZSB3aXphcmQgd2FzIGxhdW5jaGVkLiBJbiB0aGUgcnVudGltZS9qMmVlL3Byb2plY3QgCi0gIC8vZGVmYXVsdGluZyBhbGdvcml0aG0sIGNsaWVudEluaXRpYWxTZWxlY3Rpb24gd2lsbCBiZSBnaXZlbiBmaXJzdCBwcmlvcml0eS4gSWYsIGhvd2V2ZXIsIGl0IGlzIAotICAvL2RlZW1lZCB0aGF0IGNsaWVudEluaXRpYWxQcm9qZWN0IGlzIG5vdCBhIHZhbGlkIGluaXRpYWwgc2VsZWN0aW9uLCBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbgotICAvL3dpbGwgYmUgZ2l2ZW4gc2Vjb25kIHByaW9yaXR5LiBUaGluZ3MgdGhhdCBjb3VsZCBtYWtlIGFuIGluaXRpYWxTZWxlY3Rpb24gaW52YWxpZCBpbmNsdWRlCi0gIC8vMS4gVGhlIGNvbnRhaW5pbmcgcHJvamVjdCBjb250YWlucyB0aGUgV2ViIHNlcnZpY2UgZm9yIHdoaWNoIHdlIGFyZSB0cnlpbmcgdG8gY3JlYXRlIGEgY2xpZW50Ci0gIC8vMi4gVGhlIGNvbnRhaW5pbmcgcHJvamVjdCBoYXMgYSBKMkVFIGxldmVsLCBzZXJ2ZXIgdGFyZ2V0LCBhbmQgcHJvamVjdCB0eXBlIGNvbWJpbmF0aW9uIHdoaWNoCi0gIC8vICAgaXMgbm90IHN1cHBvcnRlZCBieSBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgV2ViIHNlcnZpY2UgcnVudGltZXMuCi0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY2xpZW50SW5pdGlhbFNlbGVjdGlvbl87Ci0gIHByaXZhdGUgSVByb2plY3QgY2xpZW50SW5pdGlhbFByb2plY3RfOwotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBpbml0aWFsSW5pdGlhbFByb2plY3RfOwotCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudEoyRUVWZXJzaW9uXzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2xpZW50TmVlZEVBUl8gPSB0cnVlOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSV87Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyXzsKLQotCi0gIHB1YmxpYyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBTdHJpbmcgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBjbGllbnRJZHNfID0gaWRzOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudElkc187IAotICB9Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gcnVudGltZUNsaWVudFR5cGVzXzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRKMkVFVmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50SjJFRVZlcnNpb25fOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNleGVjdXRlKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgU3RyaW5nW10gcnVudGltZUlkcyA9IGdhdGhlckF0dHJpYnV0ZVZhbHVlcyhyZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoY2xpZW50SWRzXy5nZXRUeXBlSWQoKSksICJydW50aW1lIik7Ci0gICAgICBTZWxlY3Rpb25MaXN0IGxpc3QgPSBuZXcgU2VsZWN0aW9uTGlzdChydW50aW1lSWRzLCAwKTsKLSAgICAgIFZlY3RvciBjaG9pY2VzID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lSWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGNob2ljZXMuYWRkKGdldENsaWVudFR5cGVzQ2hvaWNlKHJ1bnRpbWVJZHNbaV0pKTsKLSAgICAgIH0KLSAgICAgIHJ1bnRpbWVDbGllbnRUeXBlc18gPSBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMobGlzdCwgY2hvaWNlcyk7Ci0gICAgICBzZXRDbGllbnREZWZhdWx0UnVudGltZUZyb21QcmVmZXJlbmNlKCk7Ci0gICAgICBzZXRDbGllbnREZWZhdWx0SjJFRVZlcnNpb25Gcm9tUHJlZmVyZW5jZSgpOwotICAgICAgY2xpZW50UnVudGltZUoyRUVUeXBlXyA9IGdldENsaWVudFJ1bnRpbWVBbmRKMkVFRnJvbVByb2plY3QoY2xpZW50SW5pdGlhbFByb2plY3RfKTsKLSAgICAgIGlmIChjbGllbnRSdW50aW1lSjJFRVR5cGVfICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNsaWVudEoyRUVWZXJzaW9uXyA9IGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8uZ2V0SjJlZVZlcnNpb25JZCgpOwotICAgICAgICBzZXRDbGllbnRSdW50aW1lSWQoY2xpZW50UnVudGltZUoyRUVUeXBlXy5nZXRXc3JJZCgpKTsKLSAgICAgICAgc2V0Q2xpZW50UHJvamVjdFR5cGUoY2xpZW50UnVudGltZUoyRUVUeXBlXy5nZXRDbGllbnRQcm9qZWN0VHlwZUlkKCkpOwotICAgICAgfQotCSAgCi0gICAgICAvL0lmIGNsaWVudEluaXRpYWxQcm9qZWN0IGlzIHRoZSBzZXJ2aWNlIHByb2plY3QsIGNoZWNrIHRoZSBpbml0aWFsSW5pdGlhbFByb2plY3QKLSAgICAgIC8vdG8gc2VlIGlmIGl0IGlzIHZhbGlkLgotICAgICAgVmFsaWRhdGlvblV0aWxzIHZ1ID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotICAgICAgaWYgKHZ1LmlzUHJvamVjdFNlcnZpY2VQcm9qZWN0KGNsaWVudEluaXRpYWxQcm9qZWN0Xywgd3NkbFVSSV8sIHBhcnNlcl8pKQotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBjbGllbnRSdW50aW1lSjJFRVR5cGVfID0gZ2V0Q2xpZW50UnVudGltZUFuZEoyRUVGcm9tUHJvamVjdChpbml0aWFsSW5pdGlhbFByb2plY3RfKTsKLSAgICAgICAgaWYgKGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNsaWVudEoyRUVWZXJzaW9uXyA9IGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8uZ2V0SjJlZVZlcnNpb25JZCgpOwotICAgICAgICAgIHNldENsaWVudFJ1bnRpbWVJZChjbGllbnRSdW50aW1lSjJFRVR5cGVfLmdldFdzcklkKCkpOwotICAgICAgICAgIHNldENsaWVudFByb2plY3RUeXBlKGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8uZ2V0Q2xpZW50UHJvamVjdFR5cGVJZCgpKTsKLSAgICAgICAgICAvL1NpbmNlIHRoZSBvcmlnaW5hbCBjbGllbnRJbnRpYWxQcm9qZWN0IHdhcyBpbnZhbGlkIGJ1dCBpbml0aWFsSW5pdGlhbFByb2plY3QgaXMgdmFsaWQsCi0gICAgICAgICAgLy9yZXNldCBjbGllbnRJbml0YWxQcm9qZWN0XyB0byBiZSBpbml0aWFsSW5pdGlhbFByb2plY3QgZm9yIHRoZSBiZW5lZml0IG9mCi0gICAgICAgICAgLy9kb3duc3RyZWFtIHByb2plY3QgZGVmYXVsdGluZy4KLSAgICAgICAgICBjbGllbnRJbml0aWFsUHJvamVjdF8gPSBpbml0aWFsSW5pdGlhbFByb2plY3RfOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHNldENsaWVudERlZmF1bHRQcm9qZWN0KCk7Ci0gICAgICBzZXRDbGllbnREZWZhdWx0RUFSKCk7Ci0gICAgICBzZXRDbGllbnREZWZhdWx0U2VydmVyKCk7Ci0gICAgICB1cGRhdGVDbGllbnRFQVJzKCk7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9DYXRjaCBhbGwgRXhjZXB0aW9ucyBpbiBvcmRlciB0byBnaXZlIHNvbWUgZmVlZGJhY2sgdG8gdGhlIHVzZXIKLSAgICAgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIsbmV3IFN0cmluZ1tde2UuZ2V0TWVzc2FnZSgpfSksU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0gICAgICByZXR1cm4gZXJyb3JTdGF0dXM7Ci0gICAgfQotICAgIAotICB9Ci0gIAotCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIHJ1bnRpbWVJZAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldENsaWVudFR5cGVzQ2hvaWNlKFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5IGNwdHIgPSBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nW10gY2xpZW50VHlwZXM7Ci0gICAgU3RyaW5nW10gY2xpZW50UHJvamVjdFR5cGVzID0gZ2F0aGVyQXR0cmlidXRlVmFsdWVzKHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudChjbGllbnRJZHNfLmdldFR5cGVJZCgpLCBydW50aW1lSWQpLCAiY2xpZW50UHJvamVjdFR5cGUiKTsKLSAgICBpZiAoY2xpZW50UHJvamVjdFR5cGVzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGllbnRQcm9qZWN0VHlwZXNbMF0pOwotICAgICAgY2xpZW50VHlwZXMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGllbnRUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgY2xpZW50VHlwZXNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgY2xpZW50VHlwZXMgPSBuZXcgU3RyaW5nW10ge2NwdHIuZ2V0RGVmYXVsdEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoImlkIil9OwotICAgIAotCS8vIFNlbmcncyBOb3RlOiBDaGVjayBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZSBub24tc3VwcG9ydCBoZXJlISEhCi0gICAgU2VsZWN0aW9uTGlzdCBsaXN0ID0gbmV3IFNlbGVjdGlvbkxpc3QoY2xpZW50VHlwZXMsIDApOwotICAgIFZlY3RvciBjaG9pY2VzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGNob2ljZXMuYWRkKGdldFByb2plY3RDaG9pY2UoY2xpZW50VHlwZXNbaV0pKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyhsaXN0LCBjaG9pY2VzKTsKLSAgfQotICAgIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBjbGllbnRUeXBlCi0gICAqIEByZXR1cm4KLSAgICogCi0gICAqLwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFByb2plY3RDaG9pY2UoU3RyaW5nIGNsaWVudFR5cGUpCi0gIHsKLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RzKGNsaWVudFR5cGUpOwotICAgIFN0cmluZ1tdIHByb2plY3ROYW1lcyA9IG5ldyBTdHJpbmdbcHJvamVjdHMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKQotICAgICAgcHJvamVjdE5hbWVzW2ldID0gcHJvamVjdHNbaV0uZ2V0TmFtZSgpOwotICAgIFNlbGVjdGlvbkxpc3QgbGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KHByb2plY3ROYW1lcywgMCk7Ci0gICAgVmVjdG9yIGNob2ljZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICAgIGNob2ljZXMuYWRkKGdldFByb2plY3RFQVJDaG9pY2UocHJvamVjdHNbaV0pKTsKLSAgICByZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKGxpc3QsIGNob2ljZXMsIGdldEVBUlByb2plY3RzKCkpOwotICB9Ci0gIAotLyoqCi0gKiAKLSAqIEBwYXJhbSBwcm9qZWN0Ci0gKiBAcmV0dXJuCi0gKi8KLSAgcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFByb2plY3RFQVJDaG9pY2UoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCS8vIFRPRE8gdXNlZCB0byBiZSBKMkVFVXRpbHMuZ2V0RUFSUHJvamVjdHMocHJvamVjdCkgLS0gcmVmZXJlbmNlZCBFQVJzCi0gICAgSVByb2plY3RbXSBlYXJOYXR1cmVzID0gSjJFRVV0aWxzLmdldEVBUlByb2plY3RzKCk7Ci0gICAgaWYgKGVhck5hdHVyZXMgIT0gbnVsbCl7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZWFyTmF0dXJlcy5sZW5ndGg7IGkrKyl7Ci0gICAgICAgIHYuYWRkKGVhck5hdHVyZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cygpOwotICAgIGlmIChlYXJQcm9qZWN0cyAhPSBudWxsKQotICAgIHsKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJQcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICAJewotICAgIAkgIFN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IGVhclByb2plY3RzW2ldLmdldE5hbWUoKTsKLSAgICAJICBpZiAoIXYuY29udGFpbnMoZWFyUHJvamVjdE5hbWUpKQotICAgIAkgIAl2LmFkZChlYXJQcm9qZWN0TmFtZSk7Ci0gICAgCX0KLSAgICB9Ci0gICAgU2VsZWN0aW9uTGlzdCBsaXN0ID0gbmV3IFNlbGVjdGlvbkxpc3QoKFN0cmluZ1tdKXYudG9BcnJheShuZXcgU3RyaW5nWzBdKSwgMCk7Ci0gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyhsaXN0LCBudWxsKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3QgZ2V0RUFSUHJvamVjdHMoKQotICB7Ci0gICAgSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cygpOwotICAgIFN0cmluZ1tdIGVhclByb2plY3ROYW1lcyA9IG5ldyBTdHJpbmdbZWFyUHJvamVjdHMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpPTA7IGk8ZWFyUHJvamVjdHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZWFyUHJvamVjdE5hbWVzW2ldID0gZWFyUHJvamVjdHNbaV0uZ2V0TmFtZSgpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3QoZWFyUHJvamVjdE5hbWVzLCAwKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nW10gZ2F0aGVyQXR0cmlidXRlVmFsdWVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzLCBTdHJpbmcga2V5KQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoa2V5KTsKLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCF2LmNvbnRhaW5zKHZhbHVlKSkKLSAgICAgICAgICB2LmFkZCh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nIFtdKXYudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIAotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50RGVmYXVsdFJ1bnRpbWVGcm9tUHJlZmVyZW5jZSgpCi0gIHsKLSAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgICBTdHJpbmcgcFJ1bnRpbWVJZCA9IGNvbnRleHQuZ2V0UnVudGltZUlkKCk7Ci0KLSAgICAvL3NldCB0aGUgY2xpZW50IHJ1bnRpbWUgdG8gYmUgdGhlIHByZWZlcnJlZCBydW50aW1lIGlmIHRoZSBjbGllbnQgdHlwZSBhbGxvd3MuCi0gICAgc2V0Q2xpZW50UnVudGltZUlkKHBSdW50aW1lSWQpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50UnVudGltZUlkKFN0cmluZyBpZCkKLSAgewotICAgIFN0cmluZ1tdIGNsaWVudFJ1bnRpbWVJZHMgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y2xpZW50UnVudGltZUlkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAJaWYoY2xpZW50UnVudGltZUlkc1tpXS5lcXVhbHMoaWQpKQotICAgIAl7Ci0gICAgCSAgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5zZXRSdW50aW1lSWQoaWQpOwotCQkgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRMaXN0KCkuc2V0SW5kZXgoaSk7Ci0JCSAgYnJlYWs7Ci0gICAJICAgIH0KLSAgICB9ICAgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50UHJvamVjdFR5cGUoU3RyaW5nIGlkKQotICB7Ci0gICAgU3RyaW5nW10gY2xpZW50UHJvamVjdFR5cGVJZHMgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y2xpZW50UHJvamVjdFR5cGVJZHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgCWlmKGNsaWVudFByb2plY3RUeXBlSWRzW2ldLmVxdWFscyhpZCkpCi0gICAgCXsKLSAgICAJICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldEluZGV4KGkpOwotCQkgIGJyZWFrOwotICAgCSAgICB9Ci0gICAgfSAgICAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldENsaWVudERlZmF1bHRKMkVFVmVyc2lvbkZyb21QcmVmZXJlbmNlKCkKLSAgewotICAgIGlmIChjbGllbnRJZHNfICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHJ1bnRpbWVJZCA9IGNsaWVudElkc18uZ2V0UnVudGltZUlkKCk7Ci0gICAgICBpZiAocnVudGltZUlkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpOwotICAgICAgICBpZiAod3NyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmdbXSB2ZXJzaW9ucyA9IHdzci5nZXRKMkVFVmVyc2lvbnMoKTsKLSAgICAgICAgICBpZiAodmVyc2lvbnMgIT0gbnVsbCAmJiB2ZXJzaW9ucy5sZW5ndGggPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAJUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICAgICAgCVN0cmluZyBwSjJFRSA9IGNvbnRleHQuZ2V0SjJFRVZlcnNpb24oKTsKLSAgICAgICAgICAJaWYgKHBKMkVFIT1udWxsICYmIHBKMkVFLmxlbmd0aCgpPjApCi0gICAgICAgICAgCXsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8dmVyc2lvbnMubGVuZ3RoO2krKykKLSAgICAgICAgICAJICB7Ci0gICAgICAgICAgCQlpZiAodmVyc2lvbnNbaV0uZXF1YWxzKHBKMkVFKSkKLSAgICAgICAgICAJCXsKLSAgICAgICAgICAJICAgICAgY2xpZW50SjJFRVZlcnNpb25fID0gdmVyc2lvbnNbaV07Ci0gICAgICAgICAgCQkgIHJldHVybjsKLSAgICAgICAgICAJCX0KLSAgICAgICAgICAJICB9Ci0gICAgICAgICAgCX0KLSAgICAgICAgICAJY2xpZW50SjJFRVZlcnNpb25fID0gdmVyc2lvbnNbMF07Ci0gICAgICAgICAgCXJldHVybjsgICAgICAgICAgCQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAkKLSAgfQotICAKLSAgcHJpdmF0ZSBXU1J1bnRpbWVKMkVFVHlwZSBnZXRDbGllbnRSdW50aW1lQW5kSjJFRUZyb21Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBXU1J1bnRpbWVKMkVFVHlwZSBjUkoyRUUgPSBudWxsOwotICAgIC8vSWYgdGhlcmUgaXMgYSB2YWxpZCBpbml0aWFsIHNlbGVjdGlvbiwgdXNlIGl0IHRvIGRldGVybWluZQotICAgIC8vcmVhc29uYWJsZSBKMkVFIHZlcnNpb24gYW5kIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgdmFsdWVzCi0KLSAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0gICAgewotICAgICAgaWYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3QpIHx8IFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3QpIHx8IFJlc291cmNlVXRpbHMuaXNBcHBDbGllbnRQcm9qZWN0KHByb2plY3QpIHx8IFJlc291cmNlVXRpbHMuaXNUcnVlSmF2YVByb2plY3QocHJvamVjdCkpCi0gICAgICB7Ci0gICAgICAgIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgd3NjdFJlZyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgCi0gICAgICAgIC8vR2V0IHRoZSBKMkVFIGxldmVsCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uU3RyaW5nID0gbnVsbDsKLSAgICAgICAgaWYgKCFSZXNvdXJjZVV0aWxzLmlzVHJ1ZUphdmFQcm9qZWN0KHByb2plY3QpKQotICAgICAgICB7Ci0JICAgICAgaW50IHZlcnNpb25JZCA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihwcm9qZWN0KTsgICAgICAgIAotCSAgICAgIHZlcnNpb25TdHJpbmcgPSBTdHJpbmcudmFsdWVPZih2ZXJzaW9uSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9HZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRSdW50aW1lVGFyZ2V0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IG51bGw7Ci0gICAgICAgIGlmIChydW50aW1lVGFyZ2V0ICE9IG51bGwpIAotICAgICAgICAgIHJ1bnRpbWVUYXJnZXRJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgICAKLSAgICAgICAgLy9HZXQgdGhlIGNsaWVudCBwcm9qZWN0IHR5cGUKLSAgICAgICAgU3RyaW5nIGNsaWVudFByb2plY3RUeXBlSWQgPSBnZXRDbGllbnRQcm9qZWN0VHlwZUZyb21SdW50aW1lSWQocHJvamVjdCwgY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSk7Ci0gICAgICAgIAotICAgICAgICAvL0lmIHRoZSBwcmVmZXJyZWQgcnVudGltZSBzdXBwb3J0cyB0aGlzIEoyRUUgbGV2ZWwgYW5kIHNlcnZlciB0YXJnZXQsIGtlZXAgaXQKLSAgICAgICAgaWYgKCh2ZXJzaW9uU3RyaW5nID09IG51bGwgfHwgd3NjdFJlZy5kb2VzUnVudGltZVN1cHBvcnRKMkVFTGV2ZWwodmVyc2lvblN0cmluZywgY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSkpICYmCi0gICAgICAgICAgICAoKHJ1bnRpbWVUYXJnZXQgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAoKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkgJiYgd3NjdFJlZy5kb2VzUnVudGltZVN1cHBvcnRTZXJ2ZXJUYXJnZXQocnVudGltZVRhcmdldElkLCBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKSkpICYmCi0gICAgICAgICAgICAgKGNsaWVudFByb2plY3RUeXBlSWQgIT0gbnVsbCkKLSAgICAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgLy9TZXQgdGhlIEoyRUUgbGV2ZWwgYW5kIHdlYiBzZXJ2aWNlIHJ1bnRpbWUgdG8gbWF0Y2ggdGhlIHByb2plY3QKLSAgICAgICAgICBjUkoyRUUgPSBuZXcgV1NSdW50aW1lSjJFRVR5cGUoKTsKLSAgICAgICAgICBjUkoyRUUuc2V0SjJlZVZlcnNpb25JZCh2ZXJzaW9uU3RyaW5nKTsKLSAgICAgICAgICBjUkoyRUUuc2V0V3NySWQoY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSk7Ci0gICAgICAgICAgY1JKMkVFLnNldENsaWVudFByb2plY3RUeXBlSWQoY2xpZW50UHJvamVjdFR5cGVJZCk7Ci0gICAgICAgICAgcmV0dXJuIGNSSjJFRTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvL0xvb2sgZm9yIGEgcnVudGltZSB0aGF0IG1hdGNoZXMKLSAgICAgICAgICBTdHJpbmdbXSB2YWxpZFJ1bnRpbWVzID0gd3NjdFJlZy5nZXRSdW50aW1lc0J5VHlwZShjbGllbnRJZHNfLmdldFR5cGVJZCgpKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkUnVudGltZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHRoaXNDbGllbnRQcm9qZWN0VHlwZUlkID0gZ2V0Q2xpZW50UHJvamVjdFR5cGVGcm9tUnVudGltZUlkKHByb2plY3QsIHZhbGlkUnVudGltZXNbaV0pOyAKLSAgICAgICAgICAgIGlmICgodmVyc2lvblN0cmluZyA9PSBudWxsIHx8IHdzY3RSZWcuZG9lc1J1bnRpbWVTdXBwb3J0SjJFRUxldmVsKHZlcnNpb25TdHJpbmcsIHZhbGlkUnVudGltZXNbaV0pKSAmJgotICAgICAgICAgICAgICAgICgocnVudGltZVRhcmdldCA9PSBudWxsKSB8fAotICAgICAgICAgICAgICAgICAoKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkgJiYgd3NjdFJlZy5kb2VzUnVudGltZVN1cHBvcnRTZXJ2ZXJUYXJnZXQocnVudGltZVRhcmdldElkLCB2YWxpZFJ1bnRpbWVzW2ldKSkpICYmCi0gICAgICAgICAgICAgICAgICh0aGlzQ2xpZW50UHJvamVjdFR5cGVJZCAhPSBudWxsKQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY1JKMkVFID0gbmV3IFdTUnVudGltZUoyRUVUeXBlKCk7Ci0gICAgICAgICAgICAgIGNSSjJFRS5zZXRKMmVlVmVyc2lvbklkKHZlcnNpb25TdHJpbmcpOwotICAgICAgICAgICAgICBjUkoyRUUuc2V0V3NySWQodmFsaWRSdW50aW1lc1tpXSk7Ci0gICAgICAgICAgICAgIGNSSjJFRS5zZXRDbGllbnRQcm9qZWN0VHlwZUlkKHRoaXNDbGllbnRQcm9qZWN0VHlwZUlkKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGNSSjJFRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIHJldHVybiBjUkoyRUU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXRDbGllbnREZWZhdWx0UHJvamVjdCgpCi0gIHsgICAgCi0JLy9IYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbm8gdmFsaWQgaW5pdGlhbCBzZWxlY3Rpb24gZXhpc3RzCi0gICAgaWYgKGNsaWVudEluaXRpYWxQcm9qZWN0XyA9PSBudWxsIHx8IChjbGllbnRJbml0aWFsUHJvamVjdF8hPW51bGwgJiYgY2xpZW50UnVudGltZUoyRUVUeXBlXz09bnVsbCkpCi0gICAgewotICAgICAgLy9TZWxlY3QgdGhlIGZpcnN0IGV4aXN0aW5nIHByb2plY3QgdGhhdCBpcyB2YWxpZC4KLSAgICAgIHNldENsaWVudFByb2plY3RUb0ZpcnN0VmFsaWQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9ICAgIAotCi0gICAgVmFsaWRhdGlvblV0aWxzIHZ1ID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotICAgIGlmICghdnUuaXNQcm9qZWN0U2VydmljZVByb2plY3QoY2xpZW50SW5pdGlhbFByb2plY3RfLCB3c2RsVVJJXywgcGFyc2VyXykpCi0gICAgewotICAgICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShjbGllbnRJbml0aWFsUHJvamVjdF8uZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldENsaWVudFByb2plY3RUb0ZpcnN0VmFsaWQoKTsKLSAgICB9Ci0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldENsaWVudFByb2plY3RUb0ZpcnN0VmFsaWQoKQotICB7Ci0gICAgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIFZhbGlkYXRpb25VdGlscyB2dSA9IG5ldyBWYWxpZGF0aW9uVXRpbHMoKTsKLSAgICBTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7aTxwcm9qZWN0TmFtZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0ocHJvamVjdE5hbWVzW2ldKSkpOwotICAgICAgaWYgKHByb2plY3QuaXNPcGVuKCkgJiYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3QpIHx8IFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3QpIHx8IFJlc291cmNlVXRpbHMuaXNBcHBDbGllbnRQcm9qZWN0KHByb2plY3QpKSkKLSAgICAgIHsKLSAgICAgICAgLy9HZXQgdGhlIEoyRUUgbGV2ZWwKLSAgICAgICAgaW50IHZlcnNpb25JZCA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihwcm9qZWN0KTsKLSAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBTdHJpbmcudmFsdWVPZih2ZXJzaW9uSWQpOwotICAgICAgICAKLSAgICAgICAgLy9HZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRSdW50aW1lVGFyZ2V0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IG51bGw7Ci0gICAgICAgIGlmIChydW50aW1lVGFyZ2V0ICE9IG51bGwpIAotICAgICAgICAgIHJ1bnRpbWVUYXJnZXRJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNsaWVudEoyRUVWZXJzaW9uXyAhPSBudWxsICYmIGNsaWVudEoyRUVWZXJzaW9uXy5sZW5ndGgoKT4wICYmIGNsaWVudEoyRUVWZXJzaW9uXy5lcXVhbHModmVyc2lvblN0cmluZykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAod3NjdFJlZy5kb2VzUnVudGltZVN1cHBvcnRKMkVFTGV2ZWwodmVyc2lvblN0cmluZywgY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSkgJiYKLSAgICAgICAgICAgICAoKHJ1bnRpbWVUYXJnZXQgPT0gbnVsbCkgfHwgCi0gICAgICAgICAgICAgKChydW50aW1lVGFyZ2V0IT1udWxsKSAmJiB3c2N0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydW50aW1lVGFyZ2V0SWQsIGNsaWVudElkc18uZ2V0UnVudGltZUlkKCkpKSkgCi0gICAgICAgICAgICAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghdnUuaXNQcm9qZWN0U2VydmljZVByb2plY3QocHJvamVjdCwgd3NkbFVSSV8sIHBhcnNlcl8pKQotICAgICAgICAgICAgeyAgICAgICAgCQotICAgICAgICAgICAgICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKHByb2plY3ROYW1lc1tpXSk7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9ObyB2YWxpZCBwcm9qZWN0IHdhcyBmb3VuZC4gRW50ZXIgYSBuZXcgcHJvamVjdCBuYW1lLgotICAgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0V2ViUHJvamVjdE5hbWUoKSk7Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21Jbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgcmV0dXJuIHJlc291cmNlOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXRDbGllbnREZWZhdWx0RUFSKCkKLSAgewotICAJLy9DbGllbnQtc2lkZQotICAgIFN0cmluZyBpbml0aWFsQ2xpZW50UHJvamVjdE5hbWUgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOyAKLSAgICBJUHJvamVjdCBpbml0aWFsQ2xpZW50UHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGluaXRpYWxDbGllbnRQcm9qZWN0TmFtZSkpOyAgCQotICAJSVByb2plY3QgZGVmYXVsdENsaWVudEVBUiA9IGdldERlZmF1bHRFQVJGcm9tQ2xpZW50UHJvamVjdChpbml0aWFsQ2xpZW50UHJvamVjdCk7Ci0gIAlnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGRlZmF1bHRDbGllbnRFQVIuZ2V0TmFtZSgpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gcHJvamVjdAotICAgKiBAcmV0dXJuCi0gICAqIAotICAgKiBAZGVwcmVjYXRlZCBOZWVkcyB0byBiZSByZS13cml0dGVuIHRvIGRlYWwgd2l0aCBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZSBBUElzIAotICAgKi8KLSAgcHJvdGVjdGVkIElQcm9qZWN0IGdldERlZmF1bHRFQVJGcm9tQ2xpZW50UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgaWYgKHByb2plY3QhPW51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkgCi0gICAgewotICAgICAgSVNlcnZlcltdIGNvbmZpZ3VyZWRTZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZFNlcnZlciA9IENsaWVudFNlcnZlclNlbGVjdGlvblV0aWxzLmdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbmZpZ3VyZWRTZXJ2ZXJzLCBjbGllbnRJZHNfLmdldFR5cGVJZCgpICk7Ci0gICAgICAKLSAgICAgIEVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJQcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cyhwcm9qZWN0LCBmaXJzdFN1cHBvcnRlZFNlcnZlcik7Ci0gICAgICBpZiAoZWFyUHJvamVjdHMhPW51bGwgJiYgZWFyUHJvamVjdHNbMF0gaW5zdGFuY2VvZiBFQVJOYXR1cmVSdW50aW1lKSAKLSAgICAgICAgcmV0dXJuIGVhclByb2plY3RzWzBdLmdldFByb2plY3QoKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IHZlcnNpb25JZCA9IC0xOwotICAgIGlmIChjbGllbnRKMkVFVmVyc2lvbl8gIT0gbnVsbCAmJiBjbGllbnRKMkVFVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICB2ZXJzaW9uSWQgPSBJbnRlZ2VyLnBhcnNlSW50KGNsaWVudEoyRUVWZXJzaW9uXyk7Ci0gICAgfQotICAgIEVBUk5hdHVyZVJ1bnRpbWUgbmV3RUFSID0gSjJFRVV0aWxzLmdldEVBUih2ZXJzaW9uSWQpOwotCi0gICAgSVByb2plY3QgZWFyUHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0Q2xpZW50RUFSUHJvamVjdE5hbWUoKSk7Ci0gICAgICAKLSAgICBpZiAobmV3RUFSIT1udWxsKQotICAgICAgZWFyUHJvamVjdCA9IG5ld0VBUi5nZXRQcm9qZWN0KCk7Ci0KLSAgICByZXR1cm4gZWFyUHJvamVjdDsgIAkKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldENsaWVudERlZmF1bHRTZXJ2ZXIoKQotICB7Ci0gICAgLy9DYWxjdWxhdGUgcmVhc29uYWJsZSBkZWZhdWx0IHNlcnZlciBiYXNlZCBvbiBpbml0aWFsIHByb2plY3Qgc2VsZWN0aW9uLiAKLSAgICBTdHJpbmcgaW5pdGlhbENsaWVudFByb2plY3ROYW1lID0gcnVudGltZUNsaWVudFR5cGVzXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7IAotICAgIElQcm9qZWN0IGluaXRpYWxDbGllbnRQcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKS50cmFuc2Zvcm0oaW5pdGlhbENsaWVudFByb2plY3ROYW1lKSk7Ci0gICAgaWYgKGluaXRpYWxDbGllbnRQcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBDbGllbnRTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRTZXJ2ZXJJbmZvRnJvbUV4aXN0aW5nUHJvamVjdChpbml0aWFsQ2xpZW50UHJvamVjdCwgY2xpZW50SWRzXy5nZXRUeXBlSWQoKSwgY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSwgdHJ1ZSk7Ci0gICAgICBpZiAoc2VydmVySW5mbyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlcnZlckluZm9bMF0hPW51bGwgJiYgc2VydmVySW5mb1swXS5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmVySW5mb1sxXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzFdLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVySW5mb1sxXSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3QuCi0gICAgewotICAgICAgLy9Eb2VzIHRoZSBFQVIgZXhpc3Q/Ci0gICAgICBTdHJpbmcgaW5pdGlhbENsaWVudEVBUlByb2plY3ROYW1lID0gcnVudGltZUNsaWVudFR5cGVzXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBJUHJvamVjdCBpbml0aWFsQ2xpZW50RUFSUHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGluaXRpYWxDbGllbnRFQVJQcm9qZWN0TmFtZSkpOwotICAgICAgaWYgKGluaXRpYWxDbGllbnRFQVJQcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0U2VydmVySW5mb0Zyb21FeGlzdGluZ1Byb2plY3QoaW5pdGlhbENsaWVudEVBUlByb2plY3QsIGNsaWVudElkc18uZ2V0VHlwZUlkKCksIGNsaWVudElkc18uZ2V0UnVudGltZUlkKCksIGZhbHNlKTsKLSAgICAgICAgaWYgKHNlcnZlckluZm8hPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc2VydmVySW5mb1swXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzBdLmxlbmd0aCgpPjApCi0gICAgICAgICAgewotICAgICAgICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMV0hPW51bGwgJiYgc2VydmVySW5mb1sxXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNsaWVudElkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbmZvWzFdKTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBDbGllbnRTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRTZXJ2ZXJGcm9tQ2xpZW50UnVudGltZUFuZEoyRUUoY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSwgY2xpZW50SjJFRVZlcnNpb25fKTsKLSAgICAgICAgaWYgKHNlcnZlckluZm8hPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc2VydmVySW5mb1swXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzBdLmxlbmd0aCgpPjApCi0gICAgICAgICAgewotICAgICAgICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMV0hPW51bGwgJiYgc2VydmVySW5mb1sxXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNsaWVudElkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbmZvWzFdKTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICB9ICAgICAgICAKLSAgfSAgCi0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNsaWVudEVBUnMoKQotICB7Ci0gIAkvL1NldCBFQVIgc2VsZWN0aW9uIHRvIG51bGwgaWYgdGhlIHByb2plY3Qvc2VydmVyIGRlZmF1bHRzIGltcGx5IGFuIEVBUiBzaG91bGQgbm90IGJlIGNyZWF0ZWQKLSAgICBTdHJpbmcgY2xpZW50UHJvamVjdE5hbWUgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAJSVByb2plY3QgY2xpZW50UHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGNsaWVudFByb2plY3ROYW1lKSk7Ci0gIAlpZiAoY2xpZW50UHJvamVjdCAhPSBudWxsICYmIGNsaWVudFByb2plY3QuZXhpc3RzKCkpCi0gIAl7Ci0gIAkgIC8vR2V0IHRoZSBydW50aW1lIHRhcmdldCBvbiB0aGUgc2VydmljZVByb2plY3QKLSAgCSAgSVJ1bnRpbWUgY2xpZW50VGFyZ2V0ID0gQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0UnVudGltZVRhcmdldChjbGllbnRQcm9qZWN0TmFtZSk7Ci0gIAkgIFN0cmluZyBqMmVlVmVyc2lvbiA9IFN0cmluZy52YWx1ZU9mKEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihjbGllbnRQcm9qZWN0KSk7Ci0gIAkgIGlmIChjbGllbnRUYXJnZXQgIT0gbnVsbCkKLSAgCSAgewotICAJICAJaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKGNsaWVudFRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCksajJlZVZlcnNpb24pKQotICAJICAJewotICAJICAgICAgLy9EZWZhdWx0IHRoZSBFQVIgc2VsZWN0aW9uIHRvIGJlIGVtcHR5Ci0gIAkgIAkgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0SW5kZXgoLTEpOwotICAJICAJICBjbGllbnROZWVkRUFSXyA9IGZhbHNlOwotICAJICAJfSAgCSAgCQkKLSAgCSAgfQotICAJICAKLSAgCX0KLSAgCWVsc2UKLSAgCXsKLSAgCQkvL1VzZSB0aGUgc2VydmVyIHR5cGUKLSAgCQlTdHJpbmcgY2xpZW50U2VydmVyVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKGNsaWVudElkc18uZ2V0U2VydmVySWQoKSk7Ci0gIAkJaWYgKGNsaWVudFNlcnZlclRhcmdldElkIT1udWxsICYmIGNsaWVudFNlcnZlclRhcmdldElkLmxlbmd0aCgpPjApCi0gIAkJewotICAJCSAgaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKGNsaWVudFNlcnZlclRhcmdldElkLGNsaWVudEoyRUVWZXJzaW9uXykpCi0gIAkgIAkgIHsKLSAgCSAgICAgICAgLy9EZWZhdWx0IHRoZSBFQVIgc2VsZWN0aW9uIHRvIGJlIGVtcHR5Ci0gIAkgIAkgICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRJbmRleCgtMSk7Ci0gIAkgIAkgICAgY2xpZW50TmVlZEVBUl8gPSBmYWxzZTsKLSAgCSAgCSAgfQotICAJCX0KLSAgCX0gIAkKLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGNsaWVudEluaXRpYWxTZWxlY3Rpb25fID0gc2VsZWN0aW9uOwotICAgIGlmIChjbGllbnRJbml0aWFsUHJvamVjdF8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjbGllbnRJbml0aWFsUHJvamVjdF8gPSBnZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJbml0aWFsUHJvamVjdChJUHJvamVjdCBjbGllbnRJbml0aWFsUHJvamVjdCkKLSAgewotICAgIGNsaWVudEluaXRpYWxQcm9qZWN0XyA9IGNsaWVudEluaXRpYWxQcm9qZWN0OwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uXyBUaGUgaW5pdGlhbEluaXRpYWxTZWxlY3Rpb25fIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uKQotICB7Ci0gICAgaW5pdGlhbEluaXRpYWxTZWxlY3Rpb25fID0gaW5pdGlhbEluaXRpYWxTZWxlY3Rpb247Ci0gICAgaW5pdGlhbEluaXRpYWxQcm9qZWN0XyA9IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbihpbml0aWFsSW5pdGlhbFNlbGVjdGlvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldENsaWVudE5lZWRFQVIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudE5lZWRFQVJfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwYXJzZXJfIFRoZSBwYXJzZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcikgewotICAJcGFyc2VyXyA9IHBhcnNlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHdzZGxVUklfID0gd3NkbFVSSTsKLSAgfQotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsgCi0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgICBpZiAocmVzb3VyY2U9PW51bGwpIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgSVByb2plY3QgcCA9IFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldENsaWVudFByb2plY3RUeXBlRnJvbVJ1bnRpbWVJZChJUHJvamVjdCBwLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgLy9OYXZpZ2F0ZSB0aGUgcnVudGltZUNsaWVudFR5cGVzIHRvIHNlZSBpZiB3ZSBjYW4gbmF2aWdhdGUgZnJvbSB0aGUgcHJvdmlkZWQKLSAgICAvL3J1bnRpbWUgdG8gdGhlIHByb3ZpZGVkIHByb2plY3QncyBuYW1lLgotICAgIFN0cmluZyBwTmFtZSA9IHAuZ2V0TmFtZSgpOwotICAgIFN0cmluZ1tdIHJ1bnRpbWVJZHMgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBpbnQgbnVtYmVyT2ZSdW50aW1lcyA9IHJ1bnRpbWVJZHMubGVuZ3RoOwotICAgIC8vR2V0IHRoZSBpbmRleCBvZiB0aGUgcnVudGltZUlkIHdlIGFyZSBpbnRlcmVzdGVkIGluCi0gICAgZm9yIChpbnQgaT0wOyBpPG51bWJlck9mUnVudGltZXM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocnVudGltZUlkc1tpXS5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgIHsKLSAgICAgICAgLy9HZXQgdGhlIGxpc3Qgb2YgY2xpZW50IHByb2plY3QgdHlwZXMgZm9yIHRoaXMgcnVudGltZUlkCi0gICAgICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNsaWVudFByb2plY3RUeXBlc1RvUHJvamVjdHM9IGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoaSk7Ci0gICAgICAgIFN0cmluZ1tdIGNsaWVudFByb2plY3RUeXBlcyA9IGNsaWVudFByb2plY3RUeXBlc1RvUHJvamVjdHMuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaj0wOyBqPGNsaWVudFByb2plY3RUeXBlcy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgIC8vR2V0IHRoZSBsaXN0IG9mIHByb2plY3RzIGZvciB0aGlzIGNsaWVudFByb2plY3RUeXBlLiBJZiBwTmFtZQotICAgICAgICAgIC8vaXMgaW4gdGhpcyBsaXN0LCB3ZSBrbm93IHRoZSBydW50aW1lSWQgc3VwcG9ydHMgdGhpcyBwcm9qZWN0Ci0gICAgICAgICAgLy9hbmQgd2Uga25vdyB0aGUgY2xpZW50IHByb2plY3QgdHlwZS4KLSAgICAgICAgICBTdHJpbmdbXSBjbGllbnRQcm9qZWN0cyA9IGNsaWVudFByb2plY3RUeXBlc1RvUHJvamVjdHMuZ2V0Q2hvaWNlKGopLmdldExpc3QoKS5nZXRMaXN0KCk7Ci0gICAgICAgICAgZm9yIChpbnQgaz0wOyBrPGNsaWVudFByb2plY3RzLmxlbmd0aDsgaysrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjbGllbnRQcm9qZWN0c1trXS5lcXVhbHMocE5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL0ZvdW5kIHRoZSBwcm9qZWN0ISEKLSAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudFByb2plY3RUeXBlc1tqXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotCi0gICAgLy9XZSBkaWRuJ3QgZmluZCB0aGUgcHJvamVjdCB1bmRlciBhbnkgb2YgdGhpcyBydW50aW1lcyBjbGllbnQgcHJvamVjdCB0eXBlcy4KLSAgICAvL1RoaXMgbWVhbnMgdGhhdCB0aGlzIHJ1bnRpbWUgZG9lcyBub3Qgc3VwcG9ydCB0aGF0IGNsaWVudCB0eXBlLiBSZXR1cm4gbnVsbAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIC8qKgotICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIGJlaW5nIHVzZWQgdG8gcGFzcyBhcm91bmQgV2ViIHNlcnZpY2UgcnVudGltZQotICAgKiBhbmQgSjJFRSBsZXZlbCBpbmZvcm1hdGlvbi4KLSAgICogCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgV1NSdW50aW1lSjJFRVR5cGUKLSAgewotICAgIHByaXZhdGUgU3RyaW5nIHdzcklkXzsKLSAgICBwcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbklkXzsKLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0VHlwZUlkOyAvL29ubHkgdXNlZCBmb3IgY2xpZW50LXNpZGUgZGVmYXVsdGluZwotICAgIAotICAgIHB1YmxpYyBXU1J1bnRpbWVKMkVFVHlwZSgpCi0gICAgewotICAgICAvL21ha2luZyB0aGlzIGN0b3IgcHVibGljIHNvIHRoYXQgc3ViY2xhc3NlcyBjYW4gaW5zdGFudGlhdGUuIAotICAgIH0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBqMmVlVmVyc2lvbklkXy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEoyZWVWZXJzaW9uSWQoKQotICAgIHsKLSAgICAgIHJldHVybiBqMmVlVmVyc2lvbklkXzsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHZlcnNpb25JZF8gVGhlIGoyZWVWZXJzaW9uSWRfIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRKMmVlVmVyc2lvbklkKFN0cmluZyB2ZXJzaW9uSWRfKQotICAgIHsKLSAgICAgIGoyZWVWZXJzaW9uSWRfID0gdmVyc2lvbklkXzsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c3JJZF8uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXc3JJZCgpCi0gICAgewotICAgICAgcmV0dXJuIHdzcklkXzsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHdzcklkXyBUaGUgd3NySWRfIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc3JJZChTdHJpbmcgd3NySWRfKQotICAgIHsKLSAgICAgIHRoaXMud3NySWRfID0gd3NySWRfOwotICAgIH0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRQcm9qZWN0VHlwZUlkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdFR5cGVJZCgpCi0gICAgewotICAgICAgcmV0dXJuIGNsaWVudFByb2plY3RUeXBlSWQ7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbGllbnRQcm9qZWN0VHlwZUlkIFRoZSBjbGllbnRQcm9qZWN0VHlwZUlkIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0VHlwZUlkKFN0cmluZyBjbGllbnRQcm9qZWN0VHlwZUlkKQotICAgIHsKLSAgICAgIHRoaXMuY2xpZW50UHJvamVjdFR5cGVJZCA9IGNsaWVudFByb2plY3RUeXBlSWQ7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvUHJvamVjdFNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvUHJvamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDAzNjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1Byb2plY3RTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlNlcnZlclNlbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBFQVJfUEVSTUlUVEVEX1BST0pFQ1RfVFlQRSA9ICJFQVJfUEVSTUlUVEVEX1BST0pFQ1RfVFlQRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEpBVkFfUFJPSkVDVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5Db250YWluZXJsZXNzIjsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgcHJvamVjdHNfOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIG5lZWRFQVJfOwotICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciB0cnNJZHNfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb25fOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdFR5cGVJZF8gPSBFQVJfUEVSTUlUVEVEX1BST0pFQ1RfVFlQRTsKLQotICBwcml2YXRlIE1vZGlmeUxpc3RlbmVyIHByb2plY3RMaXN0ZW5lcl87Ci0KLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcl87Ci0KLSAgcHJpdmF0ZSBUZXh0IG1lc3NhZ2VUZXh0XzsKLQotICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRfID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0KLSAgcHJpdmF0ZSBieXRlIENSRUFURV9QUk9KRUNUID0gKGJ5dGUpIDE7Ci0KLSAgcHJpdmF0ZSBieXRlIENSRUFURV9FQVIgPSAoYnl0ZSkgMjsKLQotICBwcml2YXRlIGJ5dGUgQUREX0VBUl9BU1NPQ0lBVElPTiA9IChieXRlKSA0OwotCi0gIC8qCi0gICAqIENPTlRFWFRfSUQgUFdSUzAwMDYgZm9yIHRoZSBzZXJ2aWNlLXNpZGUgV2ViIHByb2plY3QgY29tYm8gYm94IG9mIHRoZQotICAgKiBydW50aW1lIHNlbGVjdGlvbiBQYWdlCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfQ09NQk9fUFJPSkVDVCA9IHBsdWdpbklkXyArICIuUFdSUzAwMDYiOwotCi0gIHByaXZhdGUgQ29tYm8gcHJvamVjdF87Ci0KLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAxMiBmb3IgdGhlIEVBUiBjb21ibyBib3ggb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIFBhZ2UgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0NPTUJPX0VBUiA9IHBsdWdpbklkXyArICIuUFdSUzAwMTIiOwotCi0gIHByaXZhdGUgQ29tYm8gZWFyXzsKLQotICAvKgotICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgUHJvamVjdFNlbGVjdGlvbldpZGdldCgpIHsKLSAgfQotCi0gIC8qCi0gICAqIFByb2plY3RTZWxlY3Rpb25XaWRnZXQgQHBhcmFtIGlzQ2xpZW50Ci0gICAqLwotICBwdWJsaWMgUHJvamVjdFNlbGVjdGlvbldpZGdldChib29sZWFuIGlzQ2xpZW50KSB7Ci0gICAgdGhpcy5pc0NsaWVudF8gPSBpc0NsaWVudDsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgVUlVdGlscyB1aVV0aWxzID0gbmV3IFVJVXRpbHMobXNnVXRpbHMsIHBsdWdpbklkXyk7Ci0KLSAgICBzdGF0dXNMaXN0ZW5lcl8gPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICAvLyBwcm9qZWN0Ci0gICAgcHJvamVjdExpc3RlbmVyXyA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlU2V0RWFyUHJvamVjdHMoKTsKLSAgICAgICAgLy8gICAgICAgIGhhbmRsZVNldE1lc3NhZ2VUZXh0KCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICAKLSAgICBpZiAoaXNDbGllbnRfKXsKLSAgICAgIHByb2plY3RfID0gdWlVdGlscy5jcmVhdGVDb21ibyhwYXJlbnQsICJMQUJFTF9DTElFTlRfUFJPSkVDVCIsICJUT09MVElQX1BXUlNfQ09NQk9fUFJPSkVDVCIsIElORk9QT1BfUFdSU19DT01CT19QUk9KRUNULCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcHJvamVjdF8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhcmVudCwgIkxBQkVMX1NFUlZJQ0VfV0VCX01PRFVMRSIsICJUT09MVElQX1BXUlNfQ09NQk9fUFJPSkVDVCIsIElORk9QT1BfUFdSU19DT01CT19QUk9KRUNULCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgfQotICAgIHByb2plY3RfLmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RMaXN0ZW5lcl8pOwotCi0gICAgZWFyXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFyZW50LCAiTEFCRUxfU0VSVklDRV9FQVJfUFJPSkVDVCIsICJUT09MVElQX1BXUlNfQ09NQk9fUFJPSkVDVCIsIElORk9QT1BfUFdSU19DT01CT19FQVIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAvL2Vhcl8uYWRkTW9kaWZ5TGlzdGVuZXIoZWFyTGlzdGVuZXJfKTsKLSAgICBlYXJfLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyKTsKLSAgICAvLyBtZXNzYWdlIGFyZWEKLSAgICBtZXNzYWdlVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQocGFyZW50LCAiTEFCRUxfTk9fTEFCRUwiLCAiTEFCRUxfTk9fTEFCRUwiLCBudWxsLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdENob2ljZXMoU2VsZWN0aW9uTGlzdENob2ljZXMgcHJvamVjdHMpIHsKLSAgICBwcm9qZWN0c18gPSBwcm9qZWN0czsKLSAgICBTZWxlY3Rpb25MaXN0IHByb2plY3RMaXN0ID0gcHJvamVjdHNfLmdldExpc3QoKTsKLSAgICAvLyBXZSByZW1vdmUgbGlzdGVuZXIgaGVyZSBzbyB0aGF0IG1vZGlmaWNhdGlvbnMgdG8gdGhlIENvbWJvIHdpbGwKLSAgICAvLyBOT1QgdHJpZ2dlciBhCi0gICAgLy8gbW9kaWZjYXRpb24gZXZlbnQuCi0gICAgcHJvamVjdF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIocHJvamVjdExpc3RlbmVyXyk7Ci0gICAgcHJvamVjdF8ucmVtb3ZlTGlzdGVuZXIoU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXJfKTsKLSAgICBwcm9qZWN0Xy5zZXRJdGVtcyhwcm9qZWN0TGlzdC5nZXRMaXN0KCkpOwotICAgIHByb2plY3RfLnNldFRleHQocHJvamVjdExpc3QuZ2V0U2VsZWN0aW9uKCkpOwotICAgIHByb2plY3RfLmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RMaXN0ZW5lcl8pOwotICAgIHByb2plY3RfLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyXyk7Ci0KLSAgICBoYW5kbGVTZXRFYXJQcm9qZWN0cygpOwotCi0gIH0KLQotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0UHJvamVjdENob2ljZXMoKSB7Ci0gICAgaWYgKHByb2plY3RzXyAhPSBudWxsKSB7Ci0gICAgICBTZWxlY3Rpb25MaXN0IHByb2plY3RMaXN0ID0gcHJvamVjdHNfLmdldExpc3QoKTsKLSAgICAgIHByb2plY3RMaXN0LnNldFNlbGVjdGlvblZhbHVlKHByb2plY3RfLmdldFRleHQoKSk7Ci0gICAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBlYXJzID0gcHJvamVjdHNfLmdldENob2ljZSgpOwotICAgICAgaWYgKGVhcnMgIT0gbnVsbCkgZWFycy5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZWFyXy5nZXRUZXh0KCkpOwotICAgIH0KLSAgICByZXR1cm4gcHJvamVjdHNfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXROZWVkRUFSKCkKLSAgewotICAgIHJldHVybiBuZWVkRUFSXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmVlZEVBUihib29sZWFuIGIpCi0gIHsKLSAgICBuZWVkRUFSXyA9IGI7Ci0gIH0gICAgCi0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHRycykKLSAgewotICAgIHRyc0lkc18gPSB0cnM7Ci0gICAgdXBkYXRlRUFSRW5hYmxlZFN0YXRlKCk7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAgIGoyZWVWZXJzaW9uXyA9IGoyZWVWZXJzaW9uOwotICAgIHVwZGF0ZUVBUkVuYWJsZWRTdGF0ZSgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0VHlwZUlkKFN0cmluZyBpZCkKLSAgewotICAgIHByb2plY3RUeXBlSWRfID0gaWQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVTZXRFYXJQcm9qZWN0cygpIHsKLSAgICBTZWxlY3Rpb25MaXN0IHByb2plY3RMaXN0ID0gcHJvamVjdHNfLmdldExpc3QoKTsKLSAgICBwcm9qZWN0TGlzdC5zZXRTZWxlY3Rpb25WYWx1ZShwcm9qZWN0Xy5nZXRUZXh0KCkpOwotICAgIFNlbGVjdGlvbkxpc3QgZWFyTGlzdCA9IHByb2plY3RzXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCk7Ci0gICAgZWFyXy5yZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lcl8pOwotICAgIGVhcl8uc2V0SXRlbXMoZWFyTGlzdC5nZXRMaXN0KCkpOwotICAgIGVhcl8uc2V0VGV4dChlYXJMaXN0LmdldFNlbGVjdGlvbigpKTsKLSAgICBlYXJfLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyXyk7Ci0gICAgdXBkYXRlRUFSRW5hYmxlZFN0YXRlKCk7Ci0gICAgaGFuZGxlU2V0TWVzc2FnZVRleHQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVFQVJFbmFibGVkU3RhdGUoKQotICB7Ci0gICAgZWFyXy5yZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lcl8pOwotICAgIGlmIChwcm9qZWN0c18gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTZWxlY3Rpb25MaXN0IGVhckxpc3QgPSBwcm9qZWN0c18uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpOwotICAgICAgaWYoIXByb2plY3ROZWVkc0VBUihwcm9qZWN0Xy5nZXRUZXh0KCkpKQotICAgICAgewotICAgICAgICBlYXJMaXN0LnNldEluZGV4KC0xKTsgICAgICAgIAotICAgICAgICBlYXJfLnNldFRleHQoIiIpOwotICAgICAgICBuZWVkRUFSXyA9IGZhbHNlOwotICAgICAgICBlYXJfLnNldEVuYWJsZWQoZmFsc2UpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5lZWRFQVJfID0gdHJ1ZTsKLSAgICAgICAgZWFyXy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgIH0KLSAgICBlYXJfLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyXyk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gcHJvamVjdE5lZWRzRUFSKFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgewotICAgIGlmIChwcm9qZWN0VHlwZUlkXy5lcXVhbHMoSkFWQV9QUk9KRUNUX1RZUEVfSUQpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChwcm9qZWN0TmFtZSA9PSBudWxsIHx8IHByb2plY3ROYW1lLmxlbmd0aCgpPT0wKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgLy9JUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKS50cmFuc2Zvcm0ocHJvamVjdE5hbWUpKTsKLQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gIAlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0gIAl7Ci0gIAkgIC8vR2V0IHRoZSBydW50aW1lIHRhcmdldCBvbiB0aGUgcHJvamVjdAotICAJICBJUnVudGltZSB0YXJnZXQgPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRSdW50aW1lVGFyZ2V0KHByb2plY3ROYW1lKTsKLSAgCSAgU3RyaW5nIGoyZWVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKHByb2plY3QpKTsKLSAgCSAgaWYgKHRhcmdldCAhPSBudWxsKQotICAJICB7Ci0gIAkgIAlpZiAoIVNlcnZlclV0aWxzLmlzVGFyZ2V0VmFsaWRGb3JFQVIodGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSxqMmVlVmVyc2lvbikpCi0gIAkgIAl7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAJICAJfQotICAJICAJCQotICAJICB9Ci0gIAl9Ci0gIAllbHNlCi0gIAl7Ci0gIAkJLy9Vc2UgdGhlIHNlcnZlciB0eXBlCi0gIAkgICAgaWYgKHRyc0lkc18gIT0gbnVsbCkKLSAgCSAgICB7Ci0gIAkJICBTdHJpbmcgdGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHRyc0lkc18uZ2V0U2VydmVySWQoKSk7Ci0gIAkJICBpZiAodGFyZ2V0SWQhPW51bGwgJiYgdGFyZ2V0SWQubGVuZ3RoKCk+MCkKLSAgCQkgIHsKLSAgCQkgICAgaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKHRhcmdldElkLGoyZWVWZXJzaW9uXykpCi0gIAkJICAgIHsKLSAgCQkgICAgICByZXR1cm4gZmFsc2U7Ci0gIAkgIAkgICAgfQotICAJCSAgfQotICAJICAgIH0KLSAgCX0gICAgICAJCi0gIAkKLSAgCXJldHVybiB0cnVlOyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBTdGF0dXMgaGFuZGxlU2V0TWVzc2FnZVRleHQoKSB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIHRyeSB7Ci0gICAgICBieXRlIHJlc3VsdCA9IChieXRlKSAwOwotICAgICAgaWYgKHByb2plY3RfLmdldFRleHQoKS5sZW5ndGgoKSAhPSAwICYmIGVhcl8uZ2V0VGV4dCgpLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3RUZXh0ID0gcHJvamVjdF8uZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgZWFyVGV4dCA9IGVhcl8uZ2V0VGV4dCgpOwotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0VGV4dCk7Ci0gICAgICAgIElQcm9qZWN0IGVhciA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoZWFyVGV4dCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICBpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChieXRlKSAocmVzdWx0IHwgQ1JFQVRFX1BST0pFQ1QpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIWVhci5leGlzdHMoKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gKGJ5dGUpIChyZXN1bHQgfCBDUkVBVEVfRUFSKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgZWFyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBpZiAoIUoyRUVVdGlscy5pc0VBUkFzc29jaWF0ZWQocHJvamVjdCwgZWFyKSkgcmVzdWx0ID0gKGJ5dGUpIChyZXN1bHQgfCBBRERfRUFSX0FTU09DSUFUSU9OKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc0NsaWVudF8pIHsKLSAgICAgICAgbWVzc2FnZVRleHRfLnNldFRleHQoZ2V0VmFsaWRhdGlvbk1lc3NhZ2UocmVzdWx0LCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfQ0xJRU5UX1NVQiIpKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgbWVzc2FnZVRleHRfLnNldFRleHQoZ2V0VmFsaWRhdGlvbk1lc3NhZ2UocmVzdWx0LCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfU0VSVklDRV9TVUIiKSkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX01TR19WQUxJREFUSU9OX0lOVEVSTkFMX0VSUk9SIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFZhbGlkYXRpb25NZXNzYWdlKGJ5dGUgcmVzdWx0LCBTdHJpbmcgc2VydmljZU9yQ2xpZW50KSB7Ci0gICAgU3RyaW5nIG1zZyA9IG51bGw7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgNToKLSAgICAgIG1zZyA9ICJNU0dfUFJPSkVDVF9XSUxMX0JFX0NSRUFURUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgNjoKLSAgICAgIG1zZyA9ICJNU0dfRUFSX1dJTExfQkVfQ1JFQVRFRCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgY2FzZSA3OgotICAgICAgbXNnID0gIk1TR19QUk9KRUNUX0FORF9FQVJfQ1JFQVRFRCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBtc2cgPSAiTVNHX0VBUl9XSUxMX0JFX0FTU09DSUFURUQiOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBtc2cgIT0gbnVsbCA/IG1zZ1V0aWxzLmdldE1lc3NhZ2UobXNnLCBuZXcgT2JqZWN0W10geyBzZXJ2aWNlT3JDbGllbnR9KSA6ICIiOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgU3RhdHVzIGZpbmFsU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgaGFuZGxlU2V0TWVzc2FnZVRleHQoKTsKLSAgICBTdHJpbmcgcHJvamVjdFRleHQgPSBwcm9qZWN0Xy5nZXRUZXh0KCk7Ci0gICAgU3RyaW5nIGVhclRleHQgPSBlYXJfLmdldFRleHQoKTsKLSAgICBpZiAocHJvamVjdFRleHQ9PW51bGwgfHwgcHJvamVjdFRleHQubGVuZ3RoKCk9PTApCi0gICAgewotICAgICAgaWYgKGlzQ2xpZW50XykKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0NMSUVOVF9QUk9KRUNUX0VNUFRZIiksU3RhdHVzLkVSUk9SKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1NFUlZJQ0VfUFJPSkVDVF9FTVBUWSIpLFN0YXR1cy5FUlJPUik7Ci0gICAgfQotICAgIAotICAgIGlmIChuZWVkRUFSXyAmJiAoZWFyVGV4dD09bnVsbCB8fCBlYXJUZXh0Lmxlbmd0aCgpPT0wKSkKLSAgICB7Ci0gICAgICBpZiAoaXNDbGllbnRfKQotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfQ0xJRU5UX0VBUl9FTVBUWSIpLFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19TRVJWSUNFX0VBUl9FTVBUWSIpLFN0YXR1cy5FUlJPUik7ICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBmaW5hbFN0YXR1czsKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvUnVudGltZVNlcnZlclNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvUnVudGltZVNlcnZlclNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWJiNTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1J1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUnVudGltZVNlcnZlclNlbGVjdGlvbldpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIFRleHQgICAgICAgICAgICAgIHJ1bnRpbWVfOwotICBwcml2YXRlIFRleHQgICAgICAgICAgICAgIHNlcnZlcl87Ci0gIHByaXZhdGUgVGV4dCAgICAgICAgICAgICAgajJlZVZlcnNpb25UZXh0OwotICBwcml2YXRlIENvbXBvc2l0ZSAgICAgICAgIHBhcmVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgaXNDbGllbnRDb250ZXh0XzsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBpZHNfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICBqMmVlVmVyc2lvbl87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzICAgICAgIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBMaXN0ZW5lciAgICAgICAgICAgc3RhdHVzTGlzdGVuZXJfOwotICAKLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwNCBmb3IgdGhlIHNlcnZpY2Utc2lkZSBydW50aW1lIHNlbGVjdGlvbiBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfR1JPVVBfU0VSVklDRV9SVU5USU1FID0gcGx1Z2luSWRfICsgIi5QV1JTMDAwNCI7Ci0KLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwNSBmb3IgdGhlIHNlcnZpY2Utc2RpZSBzZXJ2ZXIgc2VsZWN0aW9uIG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19HUk9VUF9TRVJWSUNFX1NFUlZFUiA9IHBsdWdpbklkXyArICIuUFdSUzAwMDUiOwotCi0gIC8qIENPTlRFWFRfSUQgUFdSUzAwMDkgZm9yIHRoZSBKMkVFIHZlcnNpb24gc2VsZWN0aW9uIG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19KMkVFX1ZFUlNJT04gPSBwbHVnaW5JZF8gKyAiLlBXUlMwMDA5IjsKLQotICBwdWJsaWMgUnVudGltZVNlcnZlclNlbGVjdGlvbldpZGdldCggYm9vbGVhbiBpc0NsaWVudFNjZW5hcmlvICkKLSAgewotICAgIGlzQ2xpZW50Q29udGV4dF8gPSBpc0NsaWVudFNjZW5hcmlvOyAKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2FkZENvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHVpVXRpbHMgID0gbmV3IFVJVXRpbHMobXNnVXRpbHNfLCBwbHVnaW5JZF8gKTsgCi0gICAgCi0gICAgcGFyZW50XyAgICAgICAgID0gcGFyZW50OwotICAgIHN0YXR1c0xpc3RlbmVyXyA9IHN0YXR1c0xpc3RlbmVyOwotICAgICAgICAKLSAgICAvLyBSdW50aW1lIGxhYmVsIGFuZCB0ZXh0Ci0gICAgcnVudGltZV8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIHBhcmVudCwgIkxBQkVMX1JVTlRJTUVTX0xJU1QiLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUlNfVEVYVF9SVU5USU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1JTX0dST1VQX1NFUlZJQ0VfUlVOVElNRSwgU1dULlJFQURfT05MWSApOwotICAgIAotICAgIC8vIFNlcnZlciBsYWJlbCBhbmQgdGV4dAotICAgIHNlcnZlcl8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIHBhcmVudCwgIkxBQkVMX1NFUlZFUlNfTElTVCIsICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1JTX1RFWFRfU0VSVkVSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUlNfR1JPVVBfU0VSVklDRV9TRVJWRVIsIFNXVC5SRUFEX09OTFkgKTsKLSAgICAKLSAgICBqMmVlVmVyc2lvblRleHQgPSB1aVV0aWxzLmNyZWF0ZVRleHQocGFyZW50LCAiTEFCRUxfSjJFRV9WRVJTSU9OIiwgIlRPT0xUSVBfUFdSU19KMkVFX1ZFUlNJT04iLCBJTkZPUE9QX1BXUlNfSjJFRV9WRVJTSU9OLCBTV1QuUkVBRF9PTkxZKTsKLSAgICAKLSAgICBCdXR0b24gZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICBlZGl0QnV0dG9uLnNldFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9FRElUX0JVVFRPTiIpKTsgCi0gICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCAgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRWRpdEJ1dHRvbigpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgCi0gICAgLy8gRHVtbXkgbGFiZWwgdGhhdCBnb2VzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBlZGl0IGJ1dHRvbi4KLSAgICBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gaWRzXzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewotICAgIGlkc18gPSBpZHM7Ci0gICAgc2V0TGFiZWxzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SjJFRVZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIGoyZWVWZXJzaW9uXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgdGhpcy5qMmVlVmVyc2lvbl8gPSBqMmVlVmVyc2lvbjsKLSAgICBqMmVlVmVyc2lvblRleHQuc2V0VGV4dCgoajJlZVZlcnNpb25fICE9IG51bGwpID8gSjJFRVV0aWxzLmdldExhYmVsRnJvbUoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXykgOiBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfTkEiKSk7Ci0gICAgLy9zZXRMYWJlbHMoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldExhYmVscygpCi0gIHsKLSAgICBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ICAgICA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMYWJlbCA9IHJlZ2lzdHJ5LmdldFJ1bnRpbWVMYWJlbEJ5SWQoIGlkc18uZ2V0UnVudGltZUlkKCkgKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckxhYmVsICA9IG51bGw7Ci0gICAgCi0gICAgaWYoIGlkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpID09IG51bGwgKQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgbGFiZWwgZm9yIHRoZSBnZW5lcmFsIHNlcnZlciB0eXBlLgotICAgICAgV2ViU2VydmljZVNlcnZlciBzZXJ2ZXIgPSByZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoIGlkc18uZ2V0U2VydmVySWQoKSApOwotICAgICAgc2VydmVyTGFiZWwgPSBzZXJ2ZXIgPT0gbnVsbCA/ICIiIDogc2VydmVyLmdldExhYmVsKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIGxhYmVsIGZvciB0aGUgc2VydmVyIGluc3RhbmNlLgotICAgICAgc2VydmVyTGFiZWwgPSByZWdpc3RyeS5nZXRTZXJ2ZXJJbnN0YW5jZUxhYmVsRnJvbUluc3RhbmNlSWQoIGlkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpICk7Ci0gICAgfQotICAgIAotICAgIHJ1bnRpbWVMYWJlbCA9IHJ1bnRpbWVMYWJlbCA9PSBudWxsID8gIiIgOiBydW50aW1lTGFiZWw7Ci0gICAgCi0gICAgcnVudGltZV8uc2V0VGV4dCggcnVudGltZUxhYmVsICk7Ci0gICAgc2VydmVyXy5zZXRUZXh0KCBzZXJ2ZXJMYWJlbCApOwotICAgIGoyZWVWZXJzaW9uVGV4dC5zZXRUZXh0KChqMmVlVmVyc2lvbl8gIT0gbnVsbCkgPyBKMkVFVXRpbHMuZ2V0TGFiZWxGcm9tSjJFRVZlcnNpb24oajJlZVZlcnNpb25fKSA6IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9OQSIpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlRWRpdEJ1dHRvbigpCi0gIHsKLSAgICBieXRlIG1vZGUgPSBpc0NsaWVudENvbnRleHRfID8gKGJ5dGUpMSA6IChieXRlKTA7Ci0gICAgCi0gICAgUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgICAgIAotICAgICAgPSBkaWFsb2cgPSBuZXcgUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZyggcGFyZW50Xy5nZXRTaGVsbCgpLCBtb2RlLCBpZHNfLCBqMmVlVmVyc2lvbl8gKTsKLSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgZGlhbG9nLmhhbmRsZVNlcnZlclZpZXdTZWxlY3Rpb25FdmVudCgpOwotICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgaWRzXyA9IGRpYWxvZy5nZXRUeXBlUnVudGltZVNlcnZlcigpOwotICAgICAgajJlZVZlcnNpb25fID0gZGlhbG9nLmdldEoyRUVWZXJzaW9uKCk7Ci0gICAgICBzZXRMYWJlbHMoKTsKLSAgICAgIHN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsKLSAgICB9ICAKLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGlmIChydW50aW1lXyAhPSBudWxsKQotICAgICAgcnVudGltZV8uYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGlmIChydW50aW1lXyAhPSBudWxsKQotICAgICAgcnVudGltZV8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjZ2V0U3RhdHVzKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkgCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICBTdHJpbmcgc2NlbmFyaW8gPSBpc0NsaWVudENvbnRleHRfID8gbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJNU0dfQ0xJRU5UX1NVQiIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJNU0dfU0VSVklDRV9TVUIiICk7Ci0gICAgCi0gICAgLy8gS2x1ZGdlISEhICBXZSBzaG91bGRuJ3QgaGF2ZSB0byBjaGVjayBmb3IgYmxhbmsgbGFiZWxzLiAgVGhlIGRlZmF1bHRpbmcgY29tbWFuZHMgc2hvdWxkIGJlIHNldHRpbmcgdGhlCi0gICAgLy8gICAgICAgICAgICBpZHMgdG8gbnVsbCBpZiB0aGVyZSBpc24ndCBhIHZhbGlkIG9uZS4gIFRoaXMgY29kZSBzaG91bGQgYmUgcmVtb3ZlZCBpbiBDNC4KLSAgICBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHdzY3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMYWJlbCA9IHdzY3RSZWdpc3RyeS5nZXRSdW50aW1lTGFiZWxCeUlkKCBpZHNfLmdldFJ1bnRpbWVJZCgpICk7Ci0gICAgV2ViU2VydmljZVNlcnZlciAgICAgICAgICAgICBzZXJ2ZXIgICAgICAgPSB3c2N0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVNlcnZlckJ5RmFjdG9yeUlkKCBpZHNfLmdldFNlcnZlcklkKCkgKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckxhYmVsICA9IHNlcnZlciA9PSBudWxsID8gIiIgOiBzZXJ2ZXIuZ2V0TGFiZWwoKTsKLSAKLSAgICBpZiggaWRzXy5nZXRSdW50aW1lSWQoKSA9PSBudWxsIHx8IHJ1bnRpbWVMYWJlbCA9PSBudWxsIHx8IHJ1bnRpbWVMYWJlbC5lcXVhbHMoIiIgKSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJNU0dfTk9fUlVOVElNRSIsIG5ldyBTdHJpbmdbXXsgc2NlbmFyaW8gfSApLCBTdGF0dXMuRVJST1IgKTsKLSAgICB9Ci0gICAgZWxzZSBpZiggaWRzXy5nZXRTZXJ2ZXJJZCgpID09IG51bGwgfHwgc2VydmVyTGFiZWwuZXF1YWxzKCAiIiApKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIk1TR19OT19TRVJWRVIiLCBuZXcgU3RyaW5nW117IHNjZW5hcmlvIH0gKSwgU3RhdHVzLkVSUk9SICk7ICAgICAgCi0gICAgfQotCi0JLy8tLS0tLS0tLS0gY2hlY2sgaWYgV1NDVCBleGlzdHMgZm9yIHRoZXNlIHNlbGVjdGlvbnMKLQlpZiAoIShpZHNfLmdldFNlcnZlcklkKCkgPT0gbnVsbCkgJiYgIShpZHNfLmdldFJ1bnRpbWVJZCgpID09IG51bGwpICYmIGlzQ2xpZW50Q29udGV4dF8pCi0JewotCQlXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IHdzY3RSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoaWRzXy5nZXRTZXJ2ZXJJZCgpKTsKLQkJaWYgKHdzcyAhPSBudWxsKQotCQl7Ci0JCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gd3NzLmdldElkKCk7Ci0JCQlTdHJpbmcgcnVudGltZUlkID0gaWRzXy5nZXRUeXBlSWQoKTsKLQkJCWlmICghd3NjdFJlZ2lzdHJ5LndlYlNlcnZpY2VDbGllbnRSdW50aW1lVHlwZUV4aXN0cyggc2VydmVyVHlwZUlkLCBpZHNfLmdldFJ1bnRpbWVJZCgpLCBydW50aW1lSWQpKSB7Ci0JCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiTVNHX0lOVkFMSURfU1JUX1NFTEVDVElPTlMiLCBuZXcgU3RyaW5nW117IHNjZW5hcmlvIH0gKSwgU3RhdHVzLkVSUk9SICk7CQkgIAotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIk1TR19JTlZBTElEX1NSVF9TRUxFQ1RJT05TIiwgbmV3IFN0cmluZ1tdeyBzY2VuYXJpbyB9ICksIFN0YXR1cy5FUlJPUiApOwotCX0gICAgCi0gICAgCi0gICAgLy8tLS0tLS0tLS0gY2hlY2sgaWYgV1NTUlQgZXhpc3RzIGZvciB0aGVzZSBzZWxlY3Rpb25zCi0gICAgaWYgKCEoaWRzXy5nZXRTZXJ2ZXJJZCgpID09IG51bGwpICYmICEoaWRzXy5nZXRSdW50aW1lSWQoKSA9PSBudWxsKSAmJiAhaXNDbGllbnRDb250ZXh0XykKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZ2lzdHJ5ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgIFN0cmluZyBzZXJ2ZXJUeXBlSWQgPSB3c2N0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVNlcnZlckJ5RmFjdG9yeUlkKGlkc18uZ2V0U2VydmVySWQoKSkuZ2V0SWQoKTsKLSAgICAgIGlmICghd3NzcnRSZWdpc3RyeS5pc1NlcnZlclJ1bnRpbWVUeXBlU3VwcG9ydGVkKHNlcnZlclR5cGVJZCwgaWRzXy5nZXRSdW50aW1lSWQoKSwgaWRzXy5nZXRUeXBlSWQoKSkpIHsKLSAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiTVNHX0lOVkFMSURfU1JUX1NFTEVDVElPTlMiLCBuZXcgU3RyaW5nW117IHNjZW5hcmlvIH0gKSwgU3RhdHVzLkVSUk9SICk7ICAgICAgCi0gICAgICB9Ci0gICAgfQotCQotICAgIAotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0FkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0FkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkNDQ5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9BZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5JQXBwbGljYXRpb25DbGllbnROYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uQWRkVXRpbGl0eUpBUk1hcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklFSkJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5JV2ViTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBzYW1wbGVQcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVFQVI7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRKMkVFVmVyc2lvbjsKLQotICBwdWJsaWMgQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFkZE1vZHVsZURlcGVuZGVuY2llc1Rhc2siLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFkZE1vZHVsZURlcGVuZGVuY2llc1Rhc2siKTsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIFdlYlNlcnZlckRlZmF1bHRpbmdUYXNrIFNldCB0aGUgZGVmYXVsdCBzZXJ2ZXIgbmFtZSBhbmQgaWQgZ2l2ZW4gYQotICAgKiBkZXBsb3lhYmxlLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXMgPSAoSVByb2plY3QpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uoc2FtcGxlUHJvamVjdCk7Ci0gICAgICBJUHJvamVjdCBzYW1wbGVJUHJvamVjdCA9IG51bGw7Ci0gICAgICBpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QpCi0gICAgICAgIHNhbXBsZUlQcm9qZWN0ID0gKElQcm9qZWN0KXJlczsKLSAgICAgIGlmIChzYW1wbGVJUHJvamVjdCA9PSBudWxsKQotICAgICAgewotICAgICAgICBDcmVhdGVTYW1wbGVQcm9qZWN0Q29tbWFuZCBjcmVhdGVTYW1wbGUgPSBuZXcgQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQoKTsKLSAgICAgICAgY3JlYXRlU2FtcGxlLnNldFNhbXBsZVByb2plY3Qoc2FtcGxlUHJvamVjdCk7Ci0gICAgICAgIGNyZWF0ZVNhbXBsZS5zZXRTYW1wbGVQcm9qZWN0RUFSKHNhbXBsZUVBUik7Ci0gICAgICAgIGlmIChzYW1wbGVFQVIhPW51bGwgJiYgc2FtcGxlRUFSLmxlbmd0aCgpPjApCi0gICAgICAgICAgY3JlYXRlU2FtcGxlLnNldE5lZWRFQVIodHJ1ZSk7ICAgIAotICAgICAgICBjcmVhdGVTYW1wbGUuc2V0RXhpc3RpbmdTZXJ2ZXIoc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpOwotICAgICAgICBjcmVhdGVTYW1wbGUuc2V0U2VydmVyRmFjdG9yeUlkKHNhbXBsZVNlcnZlclR5cGVJRCk7Ci0gICAgICAgIGNyZWF0ZVNhbXBsZS5zZXRKMmVlVmVyc2lvbihjbGllbnRKMkVFVmVyc2lvbik7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBjcmVhdGVTYW1wbGUuZXhlY3V0ZShlbnYpOwotICAgICAgfQotICAgICAgcmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uoc2FtcGxlUHJvamVjdCk7Ci0gICAgICBpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QpCi0gICAgICAgIHNhbXBsZUlQcm9qZWN0ID0gKElQcm9qZWN0KXJlczsKLSAgICAgIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHNhbXBsZUVBUik7Ci0gICAgICBJUHJvamVjdCBzYW1wbGVJRUFSID0gbnVsbDsKLSAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJUHJvamVjdCkKLSAgICAgICAgc2FtcGxlSUVBUiA9IChJUHJvamVjdClyZXM7Ci0gICAgICBpZiAoc2FtcGxlSVByb2plY3QgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsICIiLCBTdGF0dXMuRVJST1IpOwotICAgICAgcmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoY2xpZW50UHJvamVjdCk7Ci0gICAgICBJUHJvamVjdCBjbGllbnRJUHJvamVjdCA9IG51bGw7Ci0gICAgICBpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QpCi0gICAgICAgIGNsaWVudElQcm9qZWN0ID0gKElQcm9qZWN0KXJlczsKLSAgICAgIGlmIChjbGllbnRJUHJvamVjdCAhPSBudWxsICYmICFSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChjbGllbnRJUHJvamVjdCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBjbGllbnRJUHJvamVjdC5nZXROYW1lKCkgKyAiLmphciI7Ci0gICAgICAgIGlmIChSZXNvdXJjZVV0aWxzLmlzVHJ1ZUphdmFQcm9qZWN0KGNsaWVudElQcm9qZWN0KSkKLSAgICAgICAgICBhZGRKYXZhUHJvamVjdEFzVXRpbGl0eUphcihjbGllbnRJUHJvamVjdCwgc2FtcGxlSUVBUiwgdXJpKTsKLSAgICAgICAgYWRkSkFST3JNb2R1bGVEZXBlbmRlbmN5KHNhbXBsZUlQcm9qZWN0LCB1cmkpOwotICAgICAgICBhZGRCdWlsZFBhdGgoc2FtcGxlSVByb2plY3QsIGNsaWVudElQcm9qZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZEphdmFQcm9qZWN0QXNVdGlsaXR5SmFyKElQcm9qZWN0IGphdmFQcm9qZWN0LCBJUHJvamVjdCBlYXJQcm9qZWN0LCBTdHJpbmcgdXJpKQotICB7Ci0gICAgQWRkVXRpbGl0eUpBUk1hcENvbW1hbmQgY21kID0gbmV3IEFkZFV0aWxpdHlKQVJNYXBDb21tYW5kKGVhclByb2plY3QsIHVyaSwgamF2YVByb2plY3QpOwotICAgIGNtZC5leGVjdXRlKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkSkFST3JNb2R1bGVEZXBlbmRlbmN5KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSjJFRU5hdHVyZSBuYXR1cmUgPSBudWxsOwotICAgIGlmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0KSkKLSAgICAgIG5hdHVyZSA9IGdldFdlYk5hdHVyZShwcm9qZWN0KTsKLSAgICBlbHNlIGlmIChSZXNvdXJjZVV0aWxzLmlzQXBwQ2xpZW50UHJvamVjdChwcm9qZWN0KSkKLSAgICAgIG5hdHVyZSA9IGdldEFwcENsaWVudE5hdHVyZShwcm9qZWN0KTsKLSAgICBlbHNlIGlmIChSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChwcm9qZWN0KSkKLSAgICAgIG5hdHVyZSA9IGdldEVKQk5hdHVyZShwcm9qZWN0KTsKLSAgICBpZiAobmF0dXJlICE9IG51bGwpCi0gICAgewotICAgICAgQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0ID0gSjJFRVByb2plY3RVdGlsaXRpZXMucmVhZE1hbmlmZXN0KHByb2plY3QpOwotICAgICAgbWFuaWZlc3QubWVyZ2VDbGFzc1BhdGgobmV3IFN0cmluZ1tde3VyaX0pOwotICAgICAgSjJFRVByb2plY3RVdGlsaXRpZXMud3JpdGVNYW5pZmVzdChwcm9qZWN0LCBtYW5pZmVzdCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZEJ1aWxkUGF0aChJUHJvamVjdCByZWZlcmVuY2luZ1Byb2plY3QsIElQcm9qZWN0IHJlZmVyZW5jZWRQcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0gIHsKLSAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocmVmZXJlbmNpbmdQcm9qZWN0KTsKLSAgICBpZiAoamF2YVByb2plY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ2xhc3NwYXRoRW50cnlbXSBvbGRDcCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgSUNsYXNzcGF0aEVudHJ5W10gbmV3Q3AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENwLmxlbmd0aF07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZENwLmxlbmd0aDsgaSsrKQotICAgICAgICBuZXdDcFtpXSA9IG9sZENwW2ldOwotICAgICAgbmV3Q3BbbmV3Q3AubGVuZ3RoIC0gMV0gPSBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocmVmZXJlbmNlZFByb2plY3QuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q3AsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgSjJFRU5hdHVyZSBnZXRXZWJOYXR1cmUoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiAoSjJFRU5hdHVyZSlwcm9qZWN0LmdldE5hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgSjJFRU5hdHVyZSBnZXRBcHBDbGllbnROYXR1cmUoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSUFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlQ29uc3RhbnRzLkFQUENMSUVOVF9OQVRVUkVfSURTLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICByZXR1cm4gKEoyRUVOYXR1cmUpcHJvamVjdC5nZXROYXR1cmUoSUFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlQ29uc3RhbnRzLkFQUENMSUVOVF9OQVRVUkVfSURTW2ldKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgSjJFRU5hdHVyZSBnZXRFSkJOYXR1cmUoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIGtzYyByZXR1cm4KLSAgICAgIC8vIChKMkVFTmF0dXJlKXByb2plY3QuZ2V0TmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuRUpCXzIwX05BVFVSRV9JRCk7Ci0gICAgICByZXR1cm4gKEoyRUVOYXR1cmUpcHJvamVjdC5nZXROYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgfQotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiAoSjJFRU5hdHVyZSlwcm9qZWN0LmdldE5hdHVyZShJRUpCTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCk7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIElQcm9qZWN0IGdldEVBUlByb2plY3QoSVByb2plY3Qgc2FtcGxlUHJvamVjdCkKLSAgewotICAgIEVBUk5hdHVyZVJ1bnRpbWVbXSBuYXR1cmVzID0gSjJFRVV0aWxzLmdldEVBUlByb2plY3RzKHNhbXBsZVByb2plY3QpOwotICAgIGlmIChuYXR1cmVzICE9IG51bGwgJiYgbmF0dXJlcy5sZW5ndGggPiAwKQotICAgICAgcmV0dXJuIG5hdHVyZXNbMF0uZ2V0UHJvamVjdCgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwcm94eVByb2plY3QKLSAgICogICAgICAgICAgVGhlIHByb3h5UHJvamVjdCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KFN0cmluZyBzYW1wbGVQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zYW1wbGVQcm9qZWN0ID0gc2FtcGxlUHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlUHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gc2FtcGxlUHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3RFQVIoU3RyaW5nIHNhbXBsZUVBUikKLSAgewotICAgIHRoaXMuc2FtcGxlRUFSID0gc2FtcGxlRUFSOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAgIHRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRCkKLSAgewotICAgIHRoaXMuc2FtcGxlU2VydmVyVHlwZUlEID0gc2FtcGxlU2VydmVyVHlwZUlEOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcikKLSAgewotICAgIHRoaXMuc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgPSBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50SjJFRVZlcnNpb24oU3RyaW5nIGNsaWVudEoyRUVWZXJzaW9uKQotICB7Ci0gICAgdGhpcy5jbGllbnRKMkVFVmVyc2lvbiA9IGNsaWVudEoyRUVWZXJzaW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OGJjNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VFeGVjdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5KYXZhUHJveHlUZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV1NETFRlc3RGaW5pc2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLQotLyoKLSogVGhlIEpTUEdlbmVyYXRpb24gdGFzayBydW5zIHRoZSBqc3AgZ2VuZXJhdGlvbiBlbmdpbmUgZm91bmQgaW4gdGhlIAotKiBKQldpemFyZCBQbHVnaW4KLSoKLSoKLSovCi1wdWJsaWMgY2xhc3MgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiSlNQR2VuZXJhdGlvblRhc2siOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJSdW4gdGhlIEpTUCBHZW5lcmF0aW9uIjsKLSAgCi0gIHByaXZhdGUgU2NlbmFyaW9Db250ZXh0IHNjZW5hcmlvQ29udGV4dDsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHRlc3RSZWdpc3RyeTsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IHRlc3RGYWNpbGl0aWVzOwotICBwcml2YXRlIFN0cmluZyBmb2xkZXI7Ci0gIHByaXZhdGUgU3RyaW5nIGpzcEZvbGRlcjsKLSAgcHJpdmF0ZSBCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kczsKLSAgcHJpdmF0ZSBib29sZWFuIHJ1bkNsaWVudFRlc3Q9dHJ1ZTsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5QmVhbjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50U2VydmVyOwotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkczsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBzZXJ2ZXJJZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VQcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyB3c2RsU2VydmljZVVSTDsKLSAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUHJveHk7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1Rlc3RXaWRnZXQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIHByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0KLSAgcHVibGljIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQgKCkKLSAgewotICAgIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgICBzZXROYW1lKExBQkVMKTsgIAotICAgIHNjZW5hcmlvQ29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTY2VuYXJpb0NvbnRleHQoKS5jb3B5KCk7Ci0gICAgdGVzdFJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gIAlTdHJpbmcgY2xpZW50VGVzdElEID0gdGVzdEZhY2lsaXRpZXMuZ2V0U2VsZWN0aW9uKCk7Ci0gIAlXZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmRGYWN0b3J5IHd0ZmNmID0gbmV3IFdlYlNlcnZpY2VUZXN0RmluaXNoQ29tbWFuZEZhY3RvcnkoKTsKLSAgCVdlYlNlcnZpY2VUZXN0RmluaXNoQ29tbWFuZCBjb21tYW5kID0gd3RmY2YuZ2V0V2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kKGNsaWVudFRlc3RJRCxlbnYpOwotICAgICAKLSAgICBjb21tYW5kLnNldEV4aXN0aW5nU2VydmVyKHNhbXBsZUV4aXN0aW5nU2VydmVyKTsKLSAgICBjb21tYW5kLnNldFNlcnZlclR5cGVJRChzYW1wbGVTZXJ2ZXJUeXBlSUQpOwotICAgIHN0YXR1cyA9IGNvbW1hbmQuZXhlY3V0ZShlbnYpOwotICAgIGlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUil7Ci0gICAgICBTdGF0dXNIYW5kbGVyIHNIYW5kbGVyID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKTsKLSAgICAgIHNIYW5kbGVyLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIFdlYlNlcnZpY2VUZXN0RmluaXNoQ29tbWFuZEZhY3RvcnkKLSAgewotICAKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VUZXN0RmluaXNoQ29tbWFuZCBnZXRXZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQoU3RyaW5nIGNsaWVudFRlc3RJRCxFbnZpcm9ubWVudCBlbnYpCi0gICAgewotICAJICBXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiB3c2N0ZSA9IChXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbil0ZXN0UmVnaXN0cnkuZ2V0V2ViU2VydmljZUV4dGVuc2lvbnNCeU5hbWUoY2xpZW50VGVzdElEKTsKLSAgCSAgYm9vbGVhbiBpc0phdmEgPSB0cnVlOwotICAJICBpZih3c2N0ZS5pc0phdmEoKSAmJiAhZ2VuZXJhdGVQcm94eSl7Ci0gIAkgIAlpc0phdmEgPSBmYWxzZTsKLSAgICAgICAgd3NjdGUgPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pdGVzdFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKHNjZW5hcmlvQ29udGV4dC5nZXROb25KYXZhVGVzdFNlcnZpY2UoKSk7ICAgCSAgCi0gIAkgIH0KLSAgCSAgaWYoIXdzY3RlLmlzSmF2YSgpKQotICAJICAgIGlzSmF2YSA9IGZhbHNlOwkKLSAgCSAgV2ViU2VydmljZUV4ZWN1dGFibGUgd3NlID0gd3NjdGUuZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24oKTsKLSAgICAgIAotICAgICAgaWYoaXNKYXZhKXsKLSAgICAgICAgSmF2YVByb3h5VGVzdENvbW1hbmQgY29tbWFuZCA9IChKYXZhUHJveHlUZXN0Q29tbWFuZCl3c2UuZ2V0RmluaXNoQ29tbWFuZCgpOwotICAgICAgICBjb21tYW5kLnNldFByb3h5QmVhbihwcm94eUJlYW4pOwotICAgICAgICBjb21tYW5kLnNldFNhbXBsZVByb2plY3Qoc2FtcGxlUHJvamVjdCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICAgICAgY29tbWFuZC5zZXRSdW5DbGllbnRUZXN0KHJ1bkNsaWVudFRlc3QpOwotICAgICAgICBjb21tYW5kLnNldEpzcEZvbGRlcihqc3BGb2xkZXIpOyAKLSAgICAgICAgY29tbWFuZC5zZXRTZXRFbmRwb2ludE1ldGhvZChzZXRFbmRwb2ludE1ldGhvZCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0TWV0aG9kcyhtZXRob2RzKTsKLSAgICAgICAgY29tbWFuZC5zZXRFbmRwb2ludChlbmRwb2ludHMpOwotICAgICAgICBpZiAoY2xpZW50SWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsKSAKLSAgICAgIAkgIHNhbXBsZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGNsaWVudElkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAgICAgCWlmIChzYW1wbGVFeGlzdGluZ1NlcnZlciAhPSBudWxsKQotICAgICAgCSAgc2FtcGxlU2VydmVyVHlwZUlEID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAJZWxzZQotICAgICAgCSAgc2FtcGxlU2VydmVyVHlwZUlEID0gY2xpZW50SWRzLmdldFNlcnZlcklkKCk7Ci0gICAgICAJLy8gc2VydmVyIHdpbGwgYmUgY3JlYXRlZCBpbiBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQKLSAgICAgIAkKLSAgICAgICAgcmV0dXJuIGNvbW1hbmQ7Ci0gICAgICB9Ci0gICAgICBlbHNlewotICAgICAgCVdTRExUZXN0RmluaXNoQ29tbWFuZCB3dGZjID0gKFdTRExUZXN0RmluaXNoQ29tbWFuZCl3c2UuZ2V0RmluaXNoQ29tbWFuZCgpOwotICAgICAgCXd0ZmMuc2V0U2VydmljZVByb2plY3QoZ2V0V1NETFByb2plY3QoKSk7Ci0gICAgCXd0ZmMuc2V0V3NkbFNlcnZpY2VVUkwod3NkbFNlcnZpY2VVUkwpOwotICAgIAl3dGZjLnNldEV4dGVybmFsQnJvd3NlcihmYWxzZSk7Ci0gICAgCXd0ZmMuc2V0RW5kcG9pbnQoZW5kcG9pbnRzKTsKLSAgICAJaWYoc2VydmVySWRzICE9IG51bGwpewotICAgIAkgIGlmIChzZXJ2ZXJJZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGwpIAotICAgIAkgICAgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0gICAgCSAgaWYgKHNhbXBsZUV4aXN0aW5nU2VydmVyICE9IG51bGwpCi0gICAgCSAgICBzYW1wbGVTZXJ2ZXJUeXBlSUQgPSBzYW1wbGVFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAJICBlbHNlCi0gICAgCSAgICBzYW1wbGVTZXJ2ZXJUeXBlSUQgPSBzZXJ2ZXJJZHMuZ2V0U2VydmVySWQoKTsKLSAgICAJICAvLyBzZXJ2ZXIgd2lsbCBiZSBjcmVhdGVkIGluIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZAotICAgIAl9Ci0gICAgCWVsc2UgaWYoY2xpZW50SWRzICE9IG51bGwpCi0gICAgCXsKLSAgICAgICAgICBpZiAoY2xpZW50SWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsKSAKLSAgICAgICAgICAgIHNhbXBsZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGNsaWVudElkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAgICAgICAgIGlmIChzYW1wbGVFeGlzdGluZ1NlcnZlciAhPSBudWxsKQotICAgICAgICAgICAgc2FtcGxlU2VydmVyVHlwZUlEID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2FtcGxlU2VydmVyVHlwZUlEID0gY2xpZW50SWRzLmdldFNlcnZlcklkKCk7Ci0gICAgICAgICAgLy8gc2VydmVyIHdpbGwgYmUgY3JlYXRlZCBpbiBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQKLSAgICAgICAgICAgIAkJCi0gICAgCX0KLSAgICAJcmV0dXJuIHd0ZmM7IAotICAgICAgfSAJCi0gICAgfQotICAKLSAgICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwkKLSAgICB9Ci0gIAotICB9Ci0KLSAgLy9UaGUgdGVzdCBmYWNpbGl0aWVzIHJldHJpZXZlZCBmcm9tIHRoZSBleHRlbnNpb24KLSAgLy9wbHVzIHRoZSBkZWZhdWx0Ci0gIHB1YmxpYyB2b2lkIHNldFRlc3RGYWNpbGl0eShTZWxlY3Rpb25MaXN0IHNlbGVjdGlvbikKLSAgewotICAgIHRlc3RGYWNpbGl0aWVzID0gc2VsZWN0aW9uOwotICB9IAotICAKLSAgcHVibGljIHZvaWQgc2V0Rm9sZGVyKFN0cmluZyBmb2xkZXIpCi0gIHsKLSAgCXRoaXMuZm9sZGVyID0gZm9sZGVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKc3BGb2xkZXIoU3RyaW5nIGpzcEZvbGRlcikKLSAgewotICAJdGhpcy5qc3BGb2xkZXIgPSBqc3BGb2xkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1ldGhvZHMoQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHMpCi0gIHsKLSAgICB0aGlzLm1ldGhvZHMgPSBtZXRob2RzOyAgCi0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0UnVuQ2xpZW50VGVzdChib29sZWFuIHJ1bkNsaWVudFRlc3QpCi0gIHsKLSAgCXRoaXMucnVuQ2xpZW50VGVzdCA9IHJ1bkNsaWVudFRlc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChTdHJpbmcgc2FtcGxlUHJvamVjdCkKLSAgewotICAJdGhpcy5zYW1wbGVQcm9qZWN0ID0gc2FtcGxlUHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAJdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2NlbmFyaW9Db250ZXh0KFNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQpCi0gIHsKLSAgCXRoaXMuc2NlbmFyaW9Db250ZXh0ID0gc2NlbmFyaW9Db250ZXh0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUZXN0UmVnaXN0cnkoV2ViU2VydmljZVRlc3RSZWdpc3RyeSB0ZXN0UmVnaXN0cnkpCi0gIHsKLSAgCXRoaXMudGVzdFJlZ2lzdHJ5ID0gdGVzdFJlZ2lzdHJ5OwotICB9Ci0gICAKLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlU2VydmVyVHlwZUlEKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQpCi0gIHsKLSAgCXRoaXMuc2FtcGxlU2VydmVyVHlwZUlEID0gc2FtcGxlU2VydmVyVHlwZUlEOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyKQotICB7Ci0gIAl0aGlzLnNhbXBsZUV4aXN0aW5nU2VydmVyID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBpZHMpCi0gIHsKLSAgICBjbGllbnRJZHMgPSBpZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBpZHMpCi0gIHsKLSAgICBzZXJ2ZXJJZHMgPSBpZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlU2VydmVyVHlwZUlEKCkKLSAgewotICAJcmV0dXJuIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgfQotICAKLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gIAlyZXR1cm4gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRTZXJ2ZXIoU3RyaW5nIGNsaWVudFNlcnZlcikKLSAgewotICAJdGhpcy5jbGllbnRTZXJ2ZXIgPSBjbGllbnRTZXJ2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3QoU3RyaW5nIHNlcnZpY2VQcm9qZWN0KQotICB7Ci0gIAl0aGlzLnNlcnZpY2VQcm9qZWN0ID0gc2VydmljZVByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETFByb2plY3QoKQotICB7Ci0gIAlpZihzZXJ2aWNlUHJvamVjdCAhPSBudWxsKQotICAgICByZXR1cm4gc2VydmljZVByb2plY3Q7Ci0gIAkKLSAgCXJldHVybiBjbGllbnRQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsU2VydmljZVVSTCkKLSAgewotICAgIHRoaXMud3NkbFNlcnZpY2VVUkwgPSB3c2RsU2VydmljZVVSTDsKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4gZ2VuZXJhdGVQcm94eSkKLSAgewotICAJdGhpcy5nZW5lcmF0ZVByb3h5ID0gZ2VuZXJhdGVQcm94eTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0SXNUZXN0V2lkZ2V0KCkKLSAgewotICAJcmV0dXJuIGlzVGVzdFdpZGdldDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2V0RW5kcG9pbnRNZXRob2QgVGhlIHNldEVuZHBvaW50TWV0aG9kIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldEVuZHBvaW50TWV0aG9kKFN0cmluZyBzZXRFbmRwb2ludE1ldGhvZCkKLSAgewotICAgIHRoaXMuc2V0RW5kcG9pbnRNZXRob2QgPSBzZXRFbmRwb2ludE1ldGhvZDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGVuZHBvaW50IFRoZSBlbmRwb2ludCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnQpCi0gIHsKLSAgICBpZiAoZW5kcG9pbnQgIT0gbnVsbCAmJiBlbmRwb2ludC5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICB2LmFkZChlbmRwb2ludCk7Ci0gICAgICBzZXRFbmRwb2ludHModik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludHMoTGlzdCBlbmRwb2ludHMpCi0gIHsKLSAgICB0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1MzEzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRUZXN0RnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RTZXJ2aWNlOwotICBwcml2YXRlIGJvb2xlYW4gZ2VuUHJveHk7Ci0gIHByaXZhdGUgYm9vbGVhbiBsYXVuY2hlZFRlc3QgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBDbGllbnRUZXN0RnJhZ21lbnQoIFN0cmluZyBpZCApCi0gIHsKLSAgICBTZXF1ZW5jZUZyYWdtZW50IGNsaWVudFRlc3RSb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICBDb25kaXRpb24gICAgICAgIGNvbmRpdGlvbiAgICAgID0gbmV3IENvbmRpdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RTZXJ2aWNlICYmIGdlblByb3h5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBzZXRDb25kaXRpb24oIGNvbmRpdGlvbiApOwotICAgIAotICAgIGNsaWVudFRlc3RSb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgY2xpZW50VGVzdFJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIGlkICkgKTsKLSAgICBzZXRUcnVlRnJhZ21lbnQoIGNsaWVudFRlc3RSb290ICk7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIGJvb2xlYW4gZ2VuUHJveHkgKQotICB7Ci0gICAgdGhpcy5nZW5Qcm94eSA9IGdlblByb3h5OyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKCBCb29sZWFuIHRlc3RTZXJ2aWNlICkKLSAgewotICAgIHRoaXMudGVzdFNlcnZpY2UgPSB0ZXN0U2VydmljZS5ib29sZWFuVmFsdWUoKTsgIAotICB9IAotCi0gIHB1YmxpYyBib29sZWFuIGdldExhdW5jaGVkVGVzdCgpCi0gIHsKLSAgCXJldHVybiBsYXVuY2hlZFRlc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NsaWVudFRlc3RXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NsaWVudFRlc3RXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxMTMyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0V2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkZvbGRlclJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nLkRpYWxvZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFRlc3RXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0KLSAgLypDT05URVhUX0lEIFBXU00wMDAxIGZvciB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fUEFHRSA9ICAiUFdTTTAwMDEiOwotICAvLwotICBwcml2YXRlIEJ1dHRvbiB0ZXN0Q2hlY2tib3hfOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMDIgZm9yIHRoZSBUZXN0IGNoZWNrIGJveCBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fQ0hFQ0tCT1hfVEVTVCA9ICJQV1NNMDAwMiI7Ci0KLSAgcHJpdmF0ZSBDb21ibyB0ZXN0VHlwZUNvbWJvXzsKLSAgIC8qQ09OVEVYVF9JRCBQV1NNMDAwMyBmb3IgdGhlIFRlc3QgVHlwZSBDb21ibyBib3ggb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX0NPTUJPQk9YX1RFU1QgPSAiUFdTTTAwMDMiOwotCi0gIHByaXZhdGUgVGV4dCAganNwRm9sZGVyVGV4dF87Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAwOCBmb3IgdGhlIEpTUCBGb2xkZXIgZmllbGQgb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX1RFWFRfSlNQX0ZPTERFUiA9ICJQV1NNMDAwOCI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gc2FtcGxlRm9sZGVyQnJvd3NlQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBXU00wMDA5IGZvciB0aGUgSlNQIEZvbGRlciBCcm93c2UgYnV0dG9uIG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9CVVRUT05fSlNQX0ZPTERFUl9CUk9XU0UgPSAiUFdTTTAwMDkiOwotCi0gIHByaXZhdGUgQ29tYm8gcHJvamVjdENvbWJvXzsKLSAgLypDT05URVhUX0lEIFBXU00wMDEwIGZvciB0aGUgUHJvamVjdCBjb21ibyBib3ggb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX0NPTUJPX1BST0pFQ1QgPSAiUFdTTTAwMTAiOwotCi0gIHByaXZhdGUgVHJlZSBtZXRob2RzVHJlZV87Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAwNSBmb3IgdGhlIE1ldGhvZHMgdHJlZSBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fVFJFRV9NRVRIT0RTID0gIlBXU00wMDA1IjsKLQotICBwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxNZXRob2RzQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBXU00wMDA2IGZvciB0aGUgU2VsZWN0IEFsbCBidXR0b24gb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX0JVVFRPTl9TRUxFQ1RfQUxMID0gIlBXU00wMDA2IjsKLQotICBwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMDcgZm9yIHRoZSBEZXNlbGVjdCBBbGwgYnV0dG9uIG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9CVVRUT05fREVTRUxFQ1RfQUxMID0gIlBXU00wMDA3IjsKLQotICBwcml2YXRlIFRleHQgc2FtcGxlRm9sZGVyVGV4dF87Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAxNCBmb3IgdGhlIEZvbGRlciBmaWVsZCBvZiB0aGUgU2FtcGxlIFBhZ2UqLyAgIAotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fVEVYVF9TQU1QTEVfRk9MREVSID0gIlBXU00wMDE0IjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gcnVuVGVzdENoZWNrYm94XzsgIAotICAvKkNPTlRFWFRfSUQgUFdTTTAwMTUgZm9yIHRoZSBydW4gdGVzdCBjaGVjayBib3ggb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX0NIRUNLQk9YX0xBVU5DSCA9ICJQV1NNMDAxNSI7Ci0gIC8vCi0gIHByaXZhdGUgQ29tYm8gZWFyQ29tYm9fOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMTYgZm9yIHRoZSBFQVIgY29tYm8gYm94IG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9FQVJfQ09NQk8gPSAiUFdTTTAwMTYiOwotICAKLSAgcHJpdmF0ZSBMYWJlbCAgICAgICAgICAgICAgICBwcm9qZWN0RXhpc3RzTGFiZWxfOwotICBwcml2YXRlIExhYmVsICAgICAgICAgICAgICAgIGVhckV4aXN0c0xhYmVsXzsKLSAgcHJpdmF0ZSBDb21wb3NpdGUgICAgICAgICAgICBjb21ib0dyb3VwXzsgCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdCAgICAgICAgdGVzdEZhY2lsaXRpZXNfOwotICBwcml2YXRlIEZvbGRlclJlc291cmNlRmlsdGVyIGZvbGRlckZpbHRlcl8gPSBuZXcgRm9sZGVyUmVzb3VyY2VGaWx0ZXIoKTsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1Rlc3RXaWRnZXQgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgICBpc1Rlc3RXaWRnZXQgPSB0cnVlOwotICAJTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHVpVXRpbHMgID0gbmV3IFVJVXRpbHMobXNnVXRpbHMsIHBsdWdpbklkXyApOwotICAgICAgICAKLQlwYXJlbnQuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzLmdldE1lc3NhZ2UoICJUT09MVElQX1BXU01fUEFHRSIgKSApOwotCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIHBhcmVudCwgcGx1Z2luSWRfICsgIi4iICsgSU5GT1BPUF9QV1NNX1BBR0UgKTsKLSAgICAKLSAgICB0ZXN0Q2hlY2tib3hfID0gdWlVdGlscy5jcmVhdGVDaGVja2JveCggcGFyZW50LCAiQlVUVE9OX1RFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1NNX0NIRUNLQk9YX1RFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fQ0hFQ0tCT1hfVEVTVCApOwotICAgIHRlc3RDaGVja2JveF8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGVzdEJ1dHRvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIAotICAgIGNvbWJvR3JvdXBfID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMywgNSwgMCApOwotICAgIAotICAgIHRlc3RUeXBlQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyggY29tYm9Hcm91cF8sICJMQUJFTF9URVNUX1RZUEVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXU01fQ09NQk9CT1hfVEVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fQ09NQk9CT1hfVEVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgIExhYmVsIGR1bW15TGFiZWwgPSBuZXcgTGFiZWwoIGNvbWJvR3JvdXBfLCBTV1QuTk9ORSApOwotICAgIAotICAgIHByb2plY3RDb21ib18gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKCBjb21ib0dyb3VwXywgIkxBQkVMX0pTUF9QUk9KRUNUX05BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9DT01CT19QUk9KRUNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9DT01CT19QUk9KRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgcHJvamVjdENvbWJvXy5zZXRFbmFibGVkKCBmYWxzZSApOwotICAgIHByb2plY3RFeGlzdHNMYWJlbF8gPSBuZXcgTGFiZWwoIGNvbWJvR3JvdXBfLCBTV1QuTk9ORSApOwotICAgIAotICAgIAotICAgIGVhckNvbWJvXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oIGNvbWJvR3JvdXBfLCAiTEFCRUxfRUFSX1BST0pFQ1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXU01fRUFSX1BST0pFQ1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9FQVJfQ09NQk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgZWFyQ29tYm9fLnNldEVuYWJsZWQoIGZhbHNlICk7Ci0gICAgZWFyRXhpc3RzTGFiZWxfID0gbmV3IExhYmVsKCBjb21ib0dyb3VwXywgU1dULk5PTkUgKTsKLSAgICAKLSAgICAKLSAgICAKLSAgICBzYW1wbGVGb2xkZXJUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggY29tYm9Hcm91cF8sICJMQUJFTF9GT0xERVJfTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXU01fVEVYVF9TQU1QTEVfRk9MREVSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX1RFWFRfU0FNUExFX0ZPTERFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgKTsKLSAgICAKLSAgICBzYW1wbGVGb2xkZXJUZXh0Xy5hZGRNb2RpZnlMaXN0ZW5lciggbmV3IE1vZGlmeUxpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KCBNb2RpZnlFdmVudCBldnQgKQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlRm9sZGVyVGV4dCgpOyAKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgCi0gICAgICAgCi0gICAgc2FtcGxlRm9sZGVyQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggY29tYm9Hcm91cF8sICJCVVRUT05fQlJPV1NFIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9CVVRUT05fSlNQX0ZPTERFUl9CUk9XU0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9CVVRUT05fSlNQX0ZPTERFUl9CUk9XU0UgKTsKLSAgICBzYW1wbGVGb2xkZXJCcm93c2VCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNhbXBsZUJyb3dzZSgpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICBqc3BGb2xkZXJUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggY29tYm9Hcm91cF8sICJMQUJFTF9KU1BfRk9MREVSX05BTUUiLAotICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9URVhUX0pTUF9GT0xERVIiLAotICAgICAgICAgICAgSU5GT1BPUF9QV1NNX1RFWFRfSlNQX0ZPTERFUiwKLSAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgIGpzcEZvbGRlclRleHRfLnNldEVuYWJsZWQoIGZhbHNlICk7Ci0gICAgCi0gICAgR3JvdXAgbWV0aG9kc0dyb3VwID0gdWlVdGlscy5jcmVhdGVHcm91cCggcGFyZW50LCAiTEFCRUxfTUVUSE9EUyIsICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXU01fVFJFRV9NRVRIT0RTIiwgbnVsbCApOwotICAgIAotCW1ldGhvZHNHcm91cC5zZXRMYXlvdXREYXRhKCB1aVV0aWxzLmNyZWF0ZUZpbGxBbGwoKSApOwotCQotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCW1ldGhvZHNHcm91cC5zZXRMYXlvdXQoIGxheW91dCApOwotCQotCS8vIFRPRE8gTm8gaW5mb3BvcCBmb3IgdGhpcyB0cmVlLgotCW1ldGhvZHNUcmVlXyA9IHVpVXRpbHMuY3JlYXRlVHJlZSggbWV0aG9kc0dyb3VwLCAiVE9PTFRJUF9QV1NNX1RSRUVfTUVUSE9EUyIsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLQkgICAgICAgICAgICAgICAgICAgCQkJCSAgIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwJfCBTV1QuQ0hFQ0sgKTsKLQotICAgIENvbXBvc2l0ZSBzZWxlY3RCdXR0b25zID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIG1ldGhvZHNHcm91cCwgMiApOwotICAgIAotICAgIHNlbGVjdEFsbE1ldGhvZHNCdXR0b25fIAotICAgICAgPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIHNlbGVjdEJ1dHRvbnMsICJCVVRUT05fU0VMRUNUX0FMTCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXU01fQlVUVE9OX1NFTEVDVF9BTEwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9CVVRUT05fU0VMRUNUX0FMTCApOwotICAgIHNlbGVjdEFsbE1ldGhvZHNCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0QWxsKCB0cnVlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fIAotICAgICAgPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIHNlbGVjdEJ1dHRvbnMsICJCVVRUT05fREVTRUxFQ1RfQUxMIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9CVVRUT05fREVTRUxFQ1RfQUxMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fQlVUVE9OX0RFU0VMRUNUX0FMTCApOwotICAgIGRlc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdEFsbCggZmFsc2UgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICBydW5UZXN0Q2hlY2tib3hfID0gdWlVdGlscy5jcmVhdGVDaGVja2JveCggcGFyZW50LCAiQlVUVE9OX1JVTl9URVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9DSEVDS0JPWF9MQVVOQ0giLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fQ0hFQ0tCT1hfTEFVTkNIICk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVGb2xkZXJUZXh0KCkKLSAgewotICAJU3RyaW5nIGZvbGRlciA9IHNhbXBsZUZvbGRlclRleHRfLmdldFRleHQoKTsJCi0gICAgU3RyaW5nIGpzcEZvbGRlciA9IGpzcEZvbGRlclRleHRfLmdldFRleHQoKTsKLSAgICBpbnQgaW5kZXggPSBqc3BGb2xkZXIubGFzdEluZGV4T2YoUGF0aC5TRVBBUkFUT1IpOwotICAgIGlmKGluZGV4ID09IC0xKSByZXR1cm47Ci0gICAganNwRm9sZGVyID0ganNwRm9sZGVyLnN1YnN0cmluZygwLGluZGV4ICsgMSk7Ci0gICAganNwRm9sZGVyID0ganNwRm9sZGVyICsgZm9sZGVyOwotICAgIGpzcEZvbGRlclRleHRfLnNldFRleHQoanNwRm9sZGVyKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNhbXBsZUJyb3dzZSgpCi0gIHsKLSAgICBJUGF0aCAgICAgIHNlbGVjdGVkUGF0aCAgICAgICA9IG51bGw7Ci0gICAgSVJlc291cmNlICBpbml0aWFsUmVzb3VyY2UgICAgPSBudWxsOwotICAgIElQYXRoICAgICAgcHJvamVjdFBhdGggICAgICAgID0gbmV3IFBhdGgoIHByb2plY3RDb21ib18uZ2V0VGV4dCgpICkubWFrZUFic29sdXRlKCk7Ci0gICAgSVJlc291cmNlICBwcm9qZWN0ICAgICAgICAgICAgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSggcHJvamVjdFBhdGggKTsKLS8vICAgIElDb250YWluZXIgd2ViTW9kdWxlQ29udGFpbmVyID0gUmVzb3VyY2VVdGlscy5nZXRXZWJNb2R1bGVTZXJ2ZXJSb290KCAoSVByb2plY3QpcHJvamVjdCk7Ci0gICAgSUNvbnRhaW5lciB3ZWJNb2R1bGVDb250YWluZXIgPSBKMkVFVXRpbHMuZ2V0Rmlyc3RXZWJDb250ZW50Q29udGFpbmVyKChJUHJvamVjdClwcm9qZWN0KTsgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGluaXRpYWxSZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKCBpbml0aWFsU2VsZWN0aW9uXyApOwotICAgIH0KLSAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgIHsgIAotICAgIH0KLSAgICAKLSAgICBpZiggaW5pdGlhbFJlc291cmNlID09IG51bGwgKWluaXRpYWxSZXNvdXJjZSA9IHByb2plY3Q7Ci0gICAgCi0gICAgSVJlc291cmNlIHJlc291cmNlID0gRGlhbG9nVXRpbHMuYnJvd3NlUmVzb3VyY2VzKCBjb21ib0dyb3VwXy5nZXRTaGVsbCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsUmVzb3VyY2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyRmlsdGVyXyApOwotICAgIAotICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBzZWxlY3RlZFBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOyAgIAotICAgIAotICAgICAgaW50IHdlYk1vZHVsZVNlZ21lbnRzID0gc2VsZWN0ZWRQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyh3ZWJNb2R1bGVDb250YWluZXIuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAKLSAgICAgIGlmICggd2ViTW9kdWxlU2VnbWVudHMgPCAyICkKLSAgICAgIHsKLSAgICAgICAgc2FtcGxlRm9sZGVyVGV4dF8uc2V0VGV4dCgiIik7Ci0gICAgICAgIGhhbmRsZUZvbGRlclRleHQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2FtcGxlRm9sZGVyVGV4dF8uc2V0VGV4dChzZWxlY3RlZFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyh3ZWJNb2R1bGVTZWdtZW50cykudG9TdHJpbmcoKSk7Ci0gICAgICAgIGhhbmRsZUZvbGRlclRleHQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVUZXN0QnV0dG9uKCkKLSAgewotICAgIGJvb2xlYW4gZW5hYmxlZCA9IHRlc3RDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCi0gICAgdGVzdFR5cGVDb21ib18uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgIHNhbXBsZUZvbGRlclRleHRfLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICBtZXRob2RzVHJlZV8uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgIHJ1blRlc3RDaGVja2JveF8uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgIHNlbGVjdEFsbE1ldGhvZHNCdXR0b25fLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICBzYW1wbGVGb2xkZXJCcm93c2VCdXR0b25fLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbCggYm9vbGVhbiB2YWx1ZSApCi0gIHsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbWV0aG9kc1RyZWVfLmdldEl0ZW1zKCk7Ci0JCi0JZm9yKCBpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKyApIAotCXsKLQkgIGl0ZW1zW2ldLnNldENoZWNrZWQodmFsdWUpOwotCX0KLSAgfSAKLSAgCi0gIC8vIEhlcmUgYXJlIHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGZvciB0aGlzIHdpZGdldC4KLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoIEJvb2xlYW4gdGVzdFNlcnZpY2UgKQotICB7Ci0gICAgdGVzdENoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIHRlc3RTZXJ2aWNlLmJvb2xlYW5WYWx1ZSgpICk7Ci0gICAgaGFuZGxlVGVzdEJ1dHRvbigpOwotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIHRlc3RDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdEZhY2lsaXR5KCBTZWxlY3Rpb25MaXN0IHRlc3RGYWNpbGl0aWVzICkKLSAgewotICAgIHRlc3RGYWNpbGl0aWVzXyA9IHRlc3RGYWNpbGl0aWVzOwotICAgIHRlc3RUeXBlQ29tYm9fLnNldEl0ZW1zKCB0ZXN0RmFjaWxpdGllcy5nZXRMaXN0KCkgKTsKLSAgICB0ZXN0VHlwZUNvbWJvXy5zZWxlY3QoIHRlc3RGYWNpbGl0aWVzLmdldEluZGV4KCkgKTsKLSAgfQotICAKLSAgcHVibGljIFNlbGVjdGlvbkxpc3QgZ2V0VGVzdEZhY2lsaXR5KCkKLSAgewotICAgIHRlc3RGYWNpbGl0aWVzXy5zZXRJbmRleCggdGVzdFR5cGVDb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAgIHJldHVybiB0ZXN0RmFjaWxpdGllc187Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdElEKCkKLSAgewotICAgIHJldHVybiB0ZXN0VHlwZUNvbWJvXy5nZXRUZXh0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpIAotICB7Ci0JcHJvamVjdENvbWJvXy5zZXRJdGVtcyggbmV3IFN0cmluZ1tdeyBjbGllbnRQcm9qZWN0IH0gKTsKLQlwcm9qZWN0Q29tYm9fLnNlbGVjdCgwKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdEVBUihTdHJpbmcgY2xpZW50UHJvamVjdEVBUikgCi0gIHsKLSAgICBlYXJDb21ib18uc2V0SXRlbXMoIG5ldyBTdHJpbmdbXXsgY2xpZW50UHJvamVjdEVBUiB9ICk7Ci0gICAgZWFyQ29tYm9fLnNlbGVjdCgwKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRGb2xkZXIoKQotICB7Ci0gICAgcmV0dXJuIHNhbXBsZUZvbGRlclRleHRfLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Rm9sZGVyKCBTdHJpbmcgZm9sZGVyICkKLSAgewotICAgIHNhbXBsZUZvbGRlclRleHRfLnNldFRleHQoIGZvbGRlciApOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRJc1Rlc3RXaWRnZXQoKQotICB7Ci0gIAlyZXR1cm4gaXNUZXN0V2lkZ2V0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKc3BGb2xkZXIoIFN0cmluZyBmb2xkZXIgKQotICB7Ci0gICAganNwRm9sZGVyVGV4dF8uc2V0VGV4dCggZm9sZGVyICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaGVkU2VydmljZVRlc3ROYW1lIChTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUpCi0gIHsKLSAgCXRoaXMubGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPSBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UnVuQ2xpZW50VGVzdCgpCi0gIHsKLSAgICByZXR1cm4gcnVuVGVzdENoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UnVuQ2xpZW50VGVzdCggYm9vbGVhbiB2YWx1ZSApCi0gIHsKLSAgICBydW5UZXN0Q2hlY2tib3hfLnNldFNlbGVjdGlvbiggdmFsdWUgKTsKLSAgfQotICAKLSAgcHVibGljIEJvb2xlYW5TZWxlY3Rpb25bXSBnZXRNZXRob2RzKCkKLSAgewotICAgIFRyZWVJdGVtW10gICAgICAgICBpdGVtcyAgID0gbWV0aG9kc1RyZWVfLmdldEl0ZW1zKCk7Ci0gICAgQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHMgPSBuZXcgQm9vbGVhblNlbGVjdGlvbltpdGVtcy5sZW5ndGhdOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIG1ldGhvZHNbaW5kZXhdID0gbmV3IEJvb2xlYW5TZWxlY3Rpb24oIGl0ZW1zW2luZGV4XS5nZXRUZXh0KCksIGl0ZW1zW2luZGV4XS5nZXRDaGVja2VkKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG1ldGhvZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1ldGhvZHMoIEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzICkKLSAgewotICAgIG1ldGhvZHNUcmVlXy5yZW1vdmVBbGwoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbWV0aG9kcy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGlmKG1ldGhvZHNbaW5kZXhdID09IG51bGwpY29udGludWU7Ci0gICAgICBUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKCBtZXRob2RzVHJlZV8sIFNXVC5OVUxMICk7Ci0gICAgICBpdGVtLnNldFRleHQoIG1ldGhvZHNbaW5kZXhdLmdldFZhbHVlKCkgKTsKLSAgICAgIGl0ZW0uc2V0Q2hlY2tlZCggbWV0aG9kc1tpbmRleF0uaXNTZWxlY3RlZCgpICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7Ci0gICAgaW5pdGlhbFNlbGVjdGlvbl8gPSBzZWxlY3Rpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9Db3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDlmZGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIENvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUSU9OID0gIkNvcHkgV2Vic2VydmljZVV0aWxzLmphciI7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBMQUJFTCAgICAgICAgICAgPSAiQ29weVdlYnNlcnZpY2VKYXJDb21tYW5kIjsKLSAgICBwcml2YXRlIFN0cmluZyBzYW1wbGVQcm9qZWN0OwotICAgIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotCQotLyoqCi0gKiBEZWZhdWx0IENUT1I7Ci0gKi8KLQotCi1wdWJsaWMgQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQoKQotewotICBzdXBlcihMQUJFTCxERVNDUklQVElPTik7Ci0gIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgCi19Ci0KLS8qKgotICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICovCi1wdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotewotICB0cnkKLSAgewotICAgIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQoIG1zZ1V0aWxzLmdldE1lc3NhZ2UoICJQUk9HUkVTU19JTkZPX0NPUFlfV0VCU0VSVklDRV9VVElMUyIgKSApOwotICAgIElQcm9qZWN0IHNhbXBsZUlQcm9qZWN0ID0gKElQcm9qZWN0KVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHNhbXBsZVByb2plY3QpOyAgICAKLS8vICAgIElQYXRoIHdlYk1vZHVsZVBhdGggPSBSZXNvdXJjZVV0aWxzLmdldFdlYk1vZHVsZVNlcnZlclJvb3Qoc2FtcGxlSVByb2plY3QpLmdldEZ1bGxQYXRoKCk7Ci0gICAgSVBhdGggd2ViTW9kdWxlUGF0aCA9IEoyRUVVdGlscy5nZXRGaXJzdFdlYkNvbnRlbnRQYXRoKHNhbXBsZUlQcm9qZWN0KTsJCi0gICAgaWYgKHdlYk1vZHVsZVBhdGggPT0gbnVsbCkKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklELG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX05PVF9GT1VORCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgCi0gICAgU3RhdHVzIHN0YXR1cyA9IGNvcHlJRmlsZSgid2Vic2VydmljZXV0aWxzLmphciIsd2ViTW9kdWxlUGF0aCwiV0VCLUlORi9saWIvd2Vic2VydmljZXV0aWxzLmphciIsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRJbnN0YW5jZSgpLGVudik7Ci0gICAgaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKXsKLSAgICAgIFN0YXR1c0hhbmRsZXIgc0hhbmRsZXIgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgICAgU3RhdHVzIGVycm9yU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0ZJTEVDT1BZX1dFQlNFUlZJQ0VfVVRJTFMiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIHNIYW5kbGVyLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsJCi0gICAgICByZXR1cm4gc3RhdHVzOwotICAgICB9Ci0gICAgICAKLSAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN0YXR1c0hhbmRsZXIgc0hhbmRsZXIgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgICAgU3RhdHVzIGVycm9yU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0ZJTEVDT1BZX1dFQlNFUlZJQ0VfVVRJTFMiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIHNIYW5kbGVyLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsJCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCxtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRklMRUNPUFlfV0VCU0VSVklDRV9VVElMUyIpLFN0YXR1cy5FUlJPUixlKTsKLSAgICB9Ci0gIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLX0KLQotLyoqCi0gKgotICovCi1wcml2YXRlIFN0YXR1cyBjb3B5SUZpbGUoU3RyaW5nIHNvdXJjZSwgSVBhdGggdGFyZ2V0UGF0aCwgU3RyaW5nIHRhcmdldEZpbGUsRW52aXJvbm1lbnQgZW52KQotewotICByZXR1cm4gY29weUlGaWxlKHNvdXJjZSwgdGFyZ2V0UGF0aCwgdGFyZ2V0RmlsZSwgV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLGVudik7Ci19Ci0KLS8qKgotICoKLSAqLwotcHJpdmF0ZSBTdGF0dXMgY29weUlGaWxlKFN0cmluZyBzb3VyY2UsIElQYXRoIHRhcmdldFBhdGgsIFN0cmluZyB0YXJnZXRGaWxlLCBQbHVnaW4gcGx1Z2luLEVudmlyb25tZW50IGVudikKLXsKLSAgICAKLSAgaWYgKHBsdWdpbiAhPSBudWxsKQotICB7Ci0gICAgSVBhdGggdGFyZ2V0ID0gdGFyZ2V0UGF0aC5hcHBlbmQobmV3IFBhdGgodGFyZ2V0RmlsZSkpOwotICAgIAotICAgIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQoIG1zZ1V0aWxzLmdldE1lc3NhZ2UoICJQUk9HUkVTU19JTkZPX0NPUFlJTkdfRklMRSIgKSApOwotICAgIHRyeQotICAgIHsKLSAgICAgICBSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IG5ldyBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQoKTsKLSAgICAgICBjb250ZXh0LnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCh0cnVlKTsKLSAgICAgICBjb250ZXh0LnNldENyZWF0ZUZvbGRlcnNFbmFibGVkKHRydWUpOwotICAgICAgIGNvbnRleHQuc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICAgSVJlc291cmNlIHJlc291cmNlID0gRmlsZVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHRhcmdldCk7Ci0gICAgICAgaWYocmVzb3VyY2UgIT0gbnVsbCkgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgICAgIElGaWxlIGZpbGUgPSBGaWxlUmVzb3VyY2VVdGlscy5jcmVhdGVGaWxlKGNvbnRleHQsIAotICAgICAgIAkJCQkJCQkJdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4ub3BlblN0cmVhbShuZXcgUGF0aChzb3VyY2UpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCxtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRklMRUNPUFlfV0VCU0VSVklDRV9VVElMUyIpLFN0YXR1cy5FUlJPUixlKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KFN0cmluZyBzYW1wbGVQcm9qZWN0KQotewotICB0aGlzLnNhbXBsZVByb2plY3QgPSBzYW1wbGVQcm9qZWN0OyAgCi19Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DcmVhdGVTYW1wbGVQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmMjIxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DcmVhdGVTYW1wbGVQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVXZWJQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVTYW1wbGVQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdEVhcjsKLSAgcHJpdmF0ZSBJU2VydmVyIGV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBuZWVkRUFSOwotICBwcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbjsKLSAgCi0gIAotICBwdWJsaWMgQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNvbW1vbi5DcmVhdGVTYW1wbGVQcm9qZWN0Q29tbWFuZCIsIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNvbW1vbi5DcmVhdGVTYW1wbGVQcm9qZWN0Q29tbWFuZCIpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIGlmICghcm9vdC5nZXRQcm9qZWN0KHNhbXBsZVByb2plY3QpLmV4aXN0cygpIHx8ICFyb290LmdldFByb2plY3Qoc2FtcGxlUHJvamVjdEVhcikuZXhpc3RzKCkpCi0gICAgewotICAgICAgQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQgYyA9IG5ldyBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgYy5zZXRQcm9qZWN0TmFtZShzYW1wbGVQcm9qZWN0KTsKLSAgICAgIGMuc2V0RWFyUHJvamVjdE5hbWUoc2FtcGxlUHJvamVjdEVhcik7Ci0gICAgICBjLnNldEV4aXN0aW5nU2VydmVyKGV4aXN0aW5nU2VydmVyKTsKLSAgICAgIGMuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZCk7Ci0gICAgICBjLnNldE5lZWRFQVIobmVlZEVBUik7Ci0gICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgICAgIHJldHVybiBjLmV4ZWN1dGUoZW52KTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChTdHJpbmcgc2FtcGxlUHJvamVjdCkKLSAgewotICAgIHRoaXMuc2FtcGxlUHJvamVjdCA9IHNhbXBsZVByb2plY3Q7IAkKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3RFQVIoU3RyaW5nIHNhbXBsZVByb2plY3RFYXIpCi0gIHsKLSAgCXRoaXMuc2FtcGxlUHJvamVjdEVhciA9IHNhbXBsZVByb2plY3RFYXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcihJU2VydmVyIGV4aXN0aW5nU2VydmVyKSB7Ci0KLSAgICB0aGlzLmV4aXN0aW5nU2VydmVyID0gZXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gIAl0aGlzLnNlcnZlckZhY3RvcnlJZCA9IHNlcnZlckZhY3RvcnlJZDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gbmVlZEVBUiBUaGUgbmVlZEVBUiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROZWVkRUFSKGJvb2xlYW4gbmVlZEVBUikKLSAgewotICAgIHRoaXMubmVlZEVBUiA9IG5lZWRFQVI7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBqMmVlVmVyc2lvbiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRKMmVlVmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLSAgewotICAgIGoyZWVWZXJzaW9uID0gdmVyc2lvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvRmluaXNoRGVmYXVsdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaERlZmF1bHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYWVkNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvRmluaXNoRGVmYXVsdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0KLS8qCi0qIFRoZSBKU1BHZW5lcmF0aW9uIHRhc2sgcnVucyB0aGUganNwIGdlbmVyYXRpb24gZW5naW5lIGZvdW5kIGluIHRoZSAKLSogSkJXaXphcmQgUGx1Z2luCi0qCi0qCi0qLwotcHVibGljIGNsYXNzIEZpbmlzaERlZmF1bHRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJKU1BHZW5lcmF0aW9uVGFzayI7Ci0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlJ1biB0aGUgSlNQIEdlbmVyYXRpb24iOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIHByaXZhdGUgU3RyaW5nIGV4aXN0aW5nU2VydmVySWRfOwotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkczsKLQotICAKLSAgcHVibGljIEZpbmlzaERlZmF1bHRDb21tYW5kICgpCi0gIHsKLSAgICBzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gICAgc2V0TmFtZShMQUJFTCk7ICAKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAJaWYoY2xpZW50SWRzICE9IG51bGwpewotICAJICBpZiAoY2xpZW50SWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsKSAKLSAgICAgICAgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoY2xpZW50SWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0gIAkgIGlmIChzYW1wbGVFeGlzdGluZ1NlcnZlcj09bnVsbCAmJiBleGlzdGluZ1NlcnZlcklkXyE9bnVsbCAmJiBleGlzdGluZ1NlcnZlcklkXy5sZW5ndGgoKT4wKQotICAJICB7Ci0gIAkgICAgLy9Vc2UgdGhlIGV4aXN0aW5nU2VydmVySWQKLSAgCSAgICBzYW1wbGVFeGlzdGluZ1NlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihleGlzdGluZ1NlcnZlcklkXyk7Ci0gIAkgIH0KLSAgICAgIGlmIChzYW1wbGVFeGlzdGluZ1NlcnZlciAhPSBudWxsKQotICAgICAgICBzYW1wbGVTZXJ2ZXJUeXBlSUQgPSBzYW1wbGVFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2FtcGxlU2VydmVyVHlwZUlEID0gY2xpZW50SWRzLmdldFNlcnZlcklkKCk7Ci0gIAl9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIGlkcykKLSAgewotICAgIGNsaWVudElkcyA9IGlkczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoKQotICB7Ci0gIAlyZXR1cm4gc2FtcGxlU2VydmVyVHlwZUlEOwotICB9Ci0gIAotICBwdWJsaWMgSVNlcnZlciBnZXRTYW1wbGVFeGlzdGluZ1NlcnZlcigpCi0gIHsKLSAgCXJldHVybiBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVySWQoU3RyaW5nIGV4aXN0aW5nU2VydmVySWQpCi0gIHsKLSAgICBleGlzdGluZ1NlcnZlcklkXyA9IGV4aXN0aW5nU2VydmVySWQ7Ci0gIH0gIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hKYXZhVGVzdEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hKYXZhVGVzdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOGQzZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvRmluaXNoSmF2YVRlc3RGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQnVpbGRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEZpbmlzaEphdmFUZXN0RnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQgCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVByb3h5OwotCQotICBwdWJsaWMgRmluaXNoSmF2YVRlc3RGcmFnbWVudCgpCi0gIHsKLSAgCVNlcXVlbmNlRnJhZ21lbnQgamF2YVRlc3RSb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgCUNvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKCkKLQl7Ci0JICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0JICB7Ci0JICAgIHJldHVybiBnZW5lcmF0ZVByb3h5OyAKLQkgIH0KLQl9OwotICAgIHNldENvbmRpdGlvbihjb25kaXRpb24pOwotICAgIGphdmFUZXN0Um9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBUZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQoKSwgIiIpKTsKLSAgICBqYXZhVGVzdFJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZCgpLCAiIikpOwotICAgIGphdmFUZXN0Um9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KGphdmFUZXN0Um9vdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4gZ2VuZXJhdGVQcm94eSkKLSAgewotICAJdGhpcy5nZW5lcmF0ZVByb3h5ID0gZ2VuZXJhdGVQcm94eTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SXNKU1BHZW4oYm9vbGVhbiBqc3BHZW4pCi0gIHsKLSAgCQotICB9Ci0gIAotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hUZXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaFRlc3RGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZkMGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaFRlc3RGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRmluaXNoVGVzdEZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50ewotCi0gIHByaXZhdGUgYm9vbGVhbiBpc1Rlc3RXaWRnZXQ7CQotICBwcml2YXRlIGJvb2xlYW4gbGF1bmNoZWRUZXN0OwotICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVQcm94eTsKLSAgcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0ZXN0U2VydmljZTsKLSAgcHJpdmF0ZSBTdHJpbmcgdGVzdElEOwotICBwdWJsaWMgRmluaXNoVGVzdEZyYWdtZW50KCkKLSAgewotICAgIENvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKCkKLQl7Ci0JICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0JICB7Ci0JICAgIGlmKCF0ZXN0U2VydmljZSkgcmV0dXJuIGZhbHNlOwotCSAgCWlmKGxhdW5jaGVkU2VydmljZVRlc3ROYW1lID09IG51bGwpIHJldHVybiB0cnVlOwotCSAgICBpZihsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSAhPSBudWxsKQotCSAgICAgIGlmKCghbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUuZXF1YWxzKCIiKSAmJiAgKCFpc1ByZWZlcmVkQVdTRExUZXN0KCkgfHwgKGlzVGVzdFdpZGdldCAmJiBpc0NsaWVudFRlc3RKYXZhKCkpKSAmJiBnZW5lcmF0ZVByb3h5KSB8fCBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZS5lcXVhbHMoIiIpKSByZXR1cm4gdHJ1ZTsJCi0JICAgIAotCSAgCXJldHVybiBmYWxzZTsgCi0JICB9Ci0JfTsKLQkgICAKLQlzZXRUcnVlRnJhZ21lbnQobmV3IFdlYlNlcnZpY2VUZXN0Q2xpZW50RGVwYXJ0dXJlRnJhZ21lbnQoKSk7Ci0gICAgc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7Ci0gIH0KLQkgICAgCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaGVkU2VydmljZVRlc3ROYW1lKFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSkKLSAgewotCXRoaXMubGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPSBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgfQotCSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlZmVyZWRBV1NETFRlc3QoKQotICB7Ci0gICAgU2NlbmFyaW9Db250ZXh0IHNjZW5hcmlvQ29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTY2VuYXJpb0NvbnRleHQoKS5jb3B5KCk7Ci0JU3RyaW5nW10gdGVzdFR5cGVzID0gc2NlbmFyaW9Db250ZXh0LmdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLQlXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHdzdHRSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQlXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiB3c2N0ZSA9IChXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbil3c3R0UmVnaXN0cnkuZ2V0V2ViU2VydmljZUV4dGVuc2lvbnNCeU5hbWUodGVzdFR5cGVzWzBdKTsgIAkKLQlpZighd3NjdGUuaXNKYXZhKCkpCQotCSAgcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDbGllbnRUZXN0SmF2YSgpCi0gIHsKLSAgCWlmKHRlc3RJRCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gIAlXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHdzdHRSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQlXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiB3c2N0ZSA9IChXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbil3c3R0UmVnaXN0cnkuZ2V0V2ViU2VydmljZUV4dGVuc2lvbnNCeU5hbWUodGVzdElEKTsgIAkKLQlpZih3c2N0ZS5pc0phdmEoKSkJCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7ICAgCQotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoYm9vbGVhbiB0ZXN0U2VydmljZSkKLSAgewotICAgIHRoaXMudGVzdFNlcnZpY2UgPSB0ZXN0U2VydmljZTsJIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHkpCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRlUHJveHkgPSBnZW5lcmF0ZVByb3h5OwkgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUZXN0SUQoU3RyaW5nIHRlc3RJRCkKLSAgewotICAgIHRoaXMudGVzdElEID0gdGVzdElEOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNUZXN0V2lkZ2V0KGJvb2xlYW4gaXNUZXN0V2lkZ2V0KQotICB7Ci0gIAl0aGlzLmlzVGVzdFdpZGdldCA9IGlzVGVzdFdpZGdldDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvVGVzdENsaWVudERlcGFydHVyZUluaXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1ZWUxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDbGllbnREZXBhcnR1cmVJbml0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gZm9yY2VCdWlsZDsJCi0JCi0gIHB1YmxpYyBUZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQoKQotICB7Ci0gIAlmb3JjZUJ1aWxkID0gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEZvcmNlQnVpbGQoKQotICB7Ci0gIAlyZXR1cm4gZm9yY2VCdWlsZDsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1Rlc3REZWZhdWx0aW5nRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1Rlc3REZWZhdWx0aW5nRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3MDk1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotCi0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFRlc3REZWZhdWx0aW5nRnJhZ21lbnQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIAotICBwcml2YXRlIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgdGVzdFJlZ2lzdHJ5OwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3QgdGVzdEZhY2lsaXRpZXM7Ci0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICBwcml2YXRlIFNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQ7CQotICAKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVNpbXBsZVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgCQotICAJc2NlbmFyaW9Db250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpLmNvcHkoKTsKLSAgCS8vICB0ZXN0IGZhY2lsaXRpZXMKLSAgICBzZWxlY3RUZXN0RmFjaWxpdHkoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0JCi0gIC8vIFRoZSB0ZXN0IGZhY2lsaXRpZXMgcmV0cmlldmVkIGZyb20gdGhlIGV4dGVuc2lvbgotICAvLyBwbHVzIHRoZSBkZWZhdWx0Ci0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldFRlc3RGYWNpbGl0eSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdEZhY2lsaXRpZXM7Ci0gIH0gCi0JICAKLSAgCi0gIAotICAvLwkqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgLy8gVGhpcyBtZXRob2QgdXNlcyB0aGUgcHJlZmVyZW5jZSB0byAKLSAgLy8gc2VsZWN0IHRoZSBjb3JyZWN0IHRlc3QgZmFjaWxpdHkgCi0gIC8vIAotICAvLyoqKioqKioqKioqKioqKioqKioqKioqCi0gIHByaXZhdGUgdm9pZCBzZWxlY3RUZXN0RmFjaWxpdHkoKQotICB7Ci0gICAgLy9pZiB3ZSBmaW5kIHNvbWV0aGluZyB3ZSBsYXVuY2hlZCBlYXJsaWVyIAotICAgIC8vcHV0IGl0IG9uIHRoZSBib3R0b20KLSAgICBTdHJpbmdbXSB0ZXN0VHlwZXMgPSBzY2VuYXJpb0NvbnRleHQuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwkgIAotICAgIFN0cmluZ1tdIG5ld1Rlc3RUeXBlcyA9IG5ldyBTdHJpbmdbdGVzdFR5cGVzLmxlbmd0aF07Ci0gICAgYm9vbGVhbiBsYXVuY2hlZCA9IGZhbHNlOwotICAgIGludCBqID0gMDsKLSAgICBmb3IoaW50IGkgPSAwO2k8dGVzdFR5cGVzLmxlbmd0aDtpKyspewotCSAgaWYodGVzdFR5cGVzW2ldLmVxdWFscyhsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSkpCi0JICAgIGxhdW5jaGVkID0gdHJ1ZTsKLQkgIGVsc2V7Ci0JICAgICBuZXdUZXN0VHlwZXNbal0gPSB0ZXN0VHlwZXNbaV07Ci0JICAgICBqKys7Ci0JICB9Ci0JfQotCSAgIAkKLSAgICBpZihsYXVuY2hlZCkKLQkgIG5ld1Rlc3RUeXBlc1t0ZXN0VHlwZXMubGVuZ3RoIC0gMV0gPSBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLQkgIAkKLSAgICB0ZXN0RmFjaWxpdGllcyA9IG5ldyBTZWxlY3Rpb25MaXN0KG5ld1Rlc3RUeXBlcywwKTsJCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZShTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUpCi0gIHsKLSAgCXRoaXMubGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPSBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dTRExGaW5pc2hGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV1NETEZpbmlzaEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGRkMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV1NETEZpbmlzaEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV1NETEZpbmlzaEZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50ewotICAKLSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dTRExUZXN0TGF1bmNoQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV1NETFRlc3RMYXVuY2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiY2IxMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV1NETFRlc3RMYXVuY2hDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VFeGVjdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XU0RMVGVzdEZpbmlzaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFdTRExUZXN0TGF1bmNoQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdGVzdElEOyAKLSAgcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmljZWlkczsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0gIHByaXZhdGUgYm9vbGVhbiBleHRlcm5hbEJyb3dzZXI7Ci0gIHByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0JCi0gIHB1YmxpYyBXU0RMVGVzdExhdW5jaENvbW1hbmQoKQotICB7Ci0gIAlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQltc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgCQotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAlJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlciA9IG51bGw7Ci0gIAlTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRCA9IG51bGw7Ci0gIAlXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHRlc3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgCVdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIHdzY3RlID0gKFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKXRlc3RSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZSh0ZXN0SUQpOwotICAgIFdlYlNlcnZpY2VFeGVjdXRhYmxlIHdzZSA9IHdzY3RlLmdldFdlYlNlcnZpY2VFeGVjdXRhYmxlRXh0ZW5zaW9uKCk7Ci0gIAlXU0RMVGVzdEZpbmlzaENvbW1hbmQgY29tbWFuZCA9IChXU0RMVGVzdEZpbmlzaENvbW1hbmQpd3NlLmdldEZpbmlzaENvbW1hbmQoKTsKLSAgCWxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gd3NjdGUuZ2V0TmFtZSgpOwotICAJCi0gICAgLy9nZXQgdGhlIHNlcnZlciBzdHVmZgotICAJaWYgKHNlcnZpY2VpZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGwpIAotICAgICAgc2VydmljZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZpY2VpZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLSAgICBpZiAoc2VydmljZUV4aXN0aW5nU2VydmVyICE9IG51bGwpCi0gICAgICBzZXJ2aWNlU2VydmVyVHlwZUlEID0gc2VydmljZUV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgIGVsc2UKLSAgICAgIHNlcnZpY2VTZXJ2ZXJUeXBlSUQgPSBzZXJ2aWNlaWRzLmdldFNlcnZlcklkKCk7Ci0gICAgICAvLyBzZXJ2ZXIgd2lsbCBiZSBjcmVhdGVkIGluIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZAotICAJCi0gIAljb21tYW5kLnNldFNlcnZlclR5cGVJRChzZXJ2aWNlU2VydmVyVHlwZUlEKTsKLSAgICBjb21tYW5kLnNldFNlcnZpY2VQcm9qZWN0KHNlcnZlclByb2plY3QpOwotICAgIGNvbW1hbmQuc2V0V3NkbFNlcnZpY2VVUkwod3NkbFVSSSk7Ci0gICAgY29tbWFuZC5zZXRFeHRlcm5hbEJyb3dzZXIoZXh0ZXJuYWxCcm93c2VyKTsgIAotICAgIGNvbW1hbmQuc2V0RW5kcG9pbnQoZW5kcG9pbnRzKTsKLSAgICBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoZW52KTsKLSAgICAKLSAgICAvL0RvbnQgbmVlZCB0byBzaHV0IGV2ZXJ5dGhpbmcgZG93biBiZWNhdXNlIHRoZSB3c2RsIHRlc3QgZG9lc250IHdvcmsKLSAgICBpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBTdGF0dXMuT0spewotICAgICAgU3RhdHVzSGFuZGxlciBzSGFuZGxlciA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0gICAgICBTdGF0dXMgaW5mb1N0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkFCTEVfVE9fTEFVTkNIX1dTRExfVEVTVCIpLCBTdGF0dXMuSU5GTyk7Ci0gICAgICBzSGFuZGxlci5yZXBvcnRJbmZvKGluZm9TdGF0dXMpOwotICAgICAgcmV0dXJuIGluZm9TdGF0dXM7CQotICAgIH0KLSAgIHJldHVybiBzdGF0dXM7Ci0gIAkKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RJRChTdHJpbmcgdGVzdElEKQotICB7Ci0gIAl0aGlzLnRlc3RJRCA9IHRlc3RJRDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwkKLSAgfQotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gIAl0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3QoU3RyaW5nIHNlcnZlclByb2plY3QpCi0gIHsKLSAgICB0aGlzLnNlcnZlclByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHNlcnZpY2VpZHMpCi0gIHsKLSAgICB0aGlzLnNlcnZpY2VpZHMgPSBzZXJ2aWNlaWRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxCcm93c2VyKGJvb2xlYW4gZXh0ZXJuYWxCcm93c2VyKQotICB7Ci0gIAl0aGlzLmV4dGVybmFsQnJvd3NlciA9IGV4dGVybmFsQnJvd3NlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoTGlzdCBlbmRwb2ludHMpCi0gIHsKLSAgICB0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjc0MDc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotCi0vKioKLSogVGhpcyB0YXNrIHNldHMgdXAgYWxsIHRoZSBkZWZhdWx0cyBmb3IgdGhlIHdlYnNlcnZpY2UgdGVzdAotKiBjbGllbnQgcGFnZQotKgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dFQl9NT0RVTEVfUk9PVCA9ICJXZWJDb250ZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQU1QTEVfV0VCX1BST0pFQ1RfRVhUID0gIlNhbXBsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0FNUExFX0VBUl9QUk9KRUNUX0VYVCA9ICJFQVIiOwotCi0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIldlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbFRhc2siOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJkZWZhdWx0IGFjdGlvbnMiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0FNUExFX0RJUiA9ICJzYW1wbGUiOwotICBwdWJsaWMgU3RyaW5nIFNFVF9FTkRQT0lOVCA9ICJzZXRFbmRQb2ludChqYXZhLm5ldC5VUkwpIjsKLSAgcHVibGljIFN0cmluZyBHRVRfRU5EUE9JTlQgPSAiZ2V0RW5kUG9pbnQoKSI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgUFJPWFkgPSAiUHJveHkiOwotCi0gIHByaXZhdGUgU2NlbmFyaW9Db250ZXh0IHNjZW5hcmlvQ29udGV4dDsKLSAKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgSVByb2plY3QgY2xpZW50SVByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3RFQVI7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgdGVzdFJlZ2lzdHJ5OwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3QgdGVzdEZhY2lsaXRpZXM7Ci0gIHByaXZhdGUgU3RyaW5nIGZvbGRlcjsKLSAgcHJpdmF0ZSBTdHJpbmcganNwRm9sZGVyOwotICBwcml2YXRlIEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzOwotICBwcml2YXRlIFN0cmluZyBwcm94eUJlYW47Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgcnVudGltZTJDbGllbnRUeXBlczsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlRUFSOwotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkczsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb247Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBydW5DbGllbnRUZXN0PXRydWU7Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbFRhc2sgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGxhYmVsIGFuZCBkZXNjcmlwdGlvbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQgKCkKLSAgewotICAJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotICAJc2V0TmFtZShMQUJFTCk7Ci0gIAlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQltc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgCQotICAgIAotICAgIHNjZW5hcmlvQ29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTY2VuYXJpb0NvbnRleHQoKS5jb3B5KCk7Ci0gIAl0ZXN0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgCXNhbXBsZVByb2plY3RBbmRFYXJTZXR1cCgpOwotICAJCi0gICAgLy9HZXQgdGhlIHNhbXBsZSBGb2xkZXIgcmVhZHkKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgc2IuYXBwZW5kKCIvIikuYXBwZW5kKHNhbXBsZVByb2plY3QpLmFwcGVuZCgiLyIpLmFwcGVuZChERUZBVUxUX1dFQl9NT0RVTEVfUk9PVCkuYXBwZW5kKCIvIik7Ci0gICAgZm9sZGVyID0gU0FNUExFX0RJUiArIGdldEJlYW4oKTsgCi0gICAgICAgIAotICAgIHNiLmFwcGVuZChmb2xkZXIpOwotICAgIGpzcEZvbGRlciA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgCi0gICAgLy9nZXQgdGhlIG1ldGhvZCBuYW1lcyByZWFkeQotICAgIC8vZmluZCB0aGUgZnVsbCBwYXRoIG9mIHRoZSBmaWxlIGluIHRoZSBwcm9qZWN0Ci0gICAgLyoKLSAgICAqIEdldHRpbmcgdGhlIG1ldGhvZCBuYW1lcyB1c2luZyBqYXZhbW9mIGludHJvc3BlY3Rpb24KLSAgICAqLwotICAgIGlmKHByb3h5QmVhbiA9PSBudWxsKXsKLSAgICAgIFN0YXR1c0hhbmRsZXIgc0hhbmRsZXIgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgICAgU3RhdHVzIGVycm9yU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pUU19QUk9YWV9OT1RfQ09NUElMRUQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIHNIYW5kbGVyLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLSAgICAgIHJldHVybiBlcnJvclN0YXR1czsKLSAgICAgIAotICAgIH0gCQotICAgIAotICAgIAotICAgIEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCBqYXZhbW9mY29tbWFuZCA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsgCi0gICAgamF2YW1vZmNvbW1hbmQuc2V0UHJveHlCZWFuKHByb3h5QmVhbik7Ci0gICAgamF2YW1vZmNvbW1hbmQuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICAKLSAgICAKLSAgICAKLSAgICB0cnl7IAotICAgICAgU3RhdHVzIG1vZlN0YXR1cyA9IGphdmFtb2Zjb21tYW5kLmV4ZWN1dGUoZW52KTsKLSAgICAgIGlmKG1vZlN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgIAlyZXR1cm4gbW9mU3RhdHVzOwotICAgIH1jYXRjaChFeGNlcHRpb24gZXhjKXsKLSAgICAJU3RhdHVzSGFuZGxlciBzSGFuZGxlciA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0gICAgICAgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfUFJPWFlfTk9UX0NPTVBJTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgIHNIYW5kbGVyLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIGVycm9yU3RhdHVzOwotICAgIH0gIAotICAgIEphdmFIZWxwZXJzIGphdmFIZWxwZXJzID0gamF2YW1vZmNvbW1hbmQuZ2V0SmF2YUNsYXNzKCk7Ci0gICAgaWYgKGphdmFIZWxwZXJzID09IG51bGwpIHJldHVybiBzdGF0dXM7Ci0gICAgICAKLSAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsgCi0gICAgaWYoamF2YUhlbHBlcnMgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpIAotICAgICBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFIZWxwZXJzOyAKLSAgICBlbHNlIHJldHVybiBzdGF0dXM7IAotICAgIExpc3QgbWV0aG9kTGlzdCA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzKCk7Ci0gCUJvb2xlYW5TZWxlY3Rpb25bXSB0ZW1wTWV0aG9kcyA9IG5ldyBCb29sZWFuU2VsZWN0aW9uW21ldGhvZExpc3Quc2l6ZSgpXTsKLSAgICBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yID0gbWV0aG9kTGlzdC5saXN0SXRlcmF0b3IoKTsKLSAgICAKLSAgICBpbnQgaiA9IDA7Ci0gCXdoaWxlIChsaXN0SXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKWxpc3RJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZihtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSBjb250aW51ZTsKLSAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpOwotICAgICAgCi0gICAgICB0ZW1wTWV0aG9kc1tqXSA9IG5ldyBCb29sZWFuU2VsZWN0aW9uKCBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLCB0cnVlKTsgICAgICAKLSAgICAgIGorKzsKLSAgICB9IAotICAgIG1ldGhvZHMgPSB0ZW1wTWV0aG9kczsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gCi0gIC8qKgotICAqIEhlbHBlciBtZXRob2Qgd2hpY2ggc2V0cyB1cCBwcm9qZWN0IHN0dWZmCi0gICoKLSAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdEZvbGRlcigpCi0gIHsKLSAgICAgCQotICAJLy9GaXJzdCB0aGUgaW5pdGFsIHBhcnQgb2YgdGhlIHBhdGggaXMgcHJvamVjdCByZWxhdGVkCi0gICAgU3RyaW5nIGphdmFTb3VyY2VMb2NhdGlvbiA9ICIiOwotICAgIGlmIChjbGllbnRQcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgIElQYXRoIGphdmFTb3VyY2VQYXRoID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhU291cmNlTG9jYXRpb24oKElQcm9qZWN0KWNsaWVudElQcm9qZWN0KTsKLSAgICAgIGlmIChqYXZhU291cmNlUGF0aCAhPSBudWxsKQotICAgICAgCWphdmFTb3VyY2VMb2NhdGlvbiA9IGphdmFTb3VyY2VQYXRoLnRvU3RyaW5nKCk7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgamF2YVNvdXJjZUxvY2F0aW9uID0gIi8iK2NsaWVudElQcm9qZWN0LmdldE5hbWUoKSArICIvSmF2YSBTb3VyY2UiOyAgLy8gdG8gYmUgdXBkYXRlZCBieSBXZWIgVG9vbGluZyBBUEkKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGphdmFTb3VyY2VMb2NhdGlvbjsKLQotICB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQklEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5XZWIiOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLkVKQiI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFQUENMSUVOVCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuQXBwQ2xpZW50IjsKLSAgCi0gIAotICBwcml2YXRlIHZvaWQgc2FtcGxlUHJvamVjdEFuZEVhclNldHVwKCkKLSAgewotICAJY2xpZW50SVByb2plY3QgPSAoSVByb2plY3QpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoY2xpZW50UHJvamVjdCk7Ci0gIAkvL21vdmUgdG8gdGhlIHdlYiBsZXZlbAotICAJU2VsZWN0aW9uTGlzdENob2ljZXMgc2xjID0gcnVudGltZTJDbGllbnRUeXBlcy5nZXRDaG9pY2UoKTsKLSAgCVN0cmluZyBwcm9qZWN0VHlwZSA9IHNsYy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIAlpZihwcm9qZWN0VHlwZS5lcXVhbHMoV0VCSUQpKXsKLSAgICAgIHNhbXBsZVByb2plY3QgPSBzbGMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAJfSAgCQotICAJZWxzZXsgCi0gIAkgIHNhbXBsZVByb2plY3QgPSAobmV3IFN0cmluZ0J1ZmZlcihjbGllbnRJUHJvamVjdC5nZXROYW1lKCkpKS5hcHBlbmQoREVGQVVMVF9TQU1QTEVfV0VCX1BST0pFQ1RfRVhUKS50b1N0cmluZygpOwkKLSAgCX0KLSAgCXNhbXBsZUVBUiA9IHNsYy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIAlpZiAoc2FtcGxlRUFSID09IG51bGwgfHwgc2FtcGxlRUFSLmxlbmd0aCgpPT0wKQotICAJewotICAJICAvL0NyZWF0ZSBhIGRlZmF1bHQgbmFtZSBpZiBhbiBFQVIgaXMgbmVlZGVkLgotCQkvL1VzZSB0aGUgc2VydmVyIHR5cGUKLQkJU3RyaW5nIHRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZChjbGllbnRJZHMuZ2V0U2VydmVySWQoKSk7Ci0JCWlmICh0YXJnZXRJZCE9bnVsbCAmJiB0YXJnZXRJZC5sZW5ndGgoKT4wKQotCQl7Ci0JCSAgaWYgKFNlcnZlclV0aWxzLmlzVGFyZ2V0VmFsaWRGb3JFQVIodGFyZ2V0SWQsajJlZVZlcnNpb24pKQotCSAgCSAgewotCQkgICAgc2FtcGxlRUFSID0gKG5ldyBTdHJpbmdCdWZmZXIoc2FtcGxlUHJvamVjdCkpLmFwcGVuZChERUZBVUxUX1NBTVBMRV9FQVJfUFJPSkVDVF9FWFQpLnRvU3RyaW5nKCk7Ci0JICAJICB9Ci0JCX0gIAkgIAotICAJfQotICB9Ci0gICAgCi0gIC8vZ2V0dGVycyBhbmQgc2V0dGVycwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmVhbigpCi0gIHsKLSAgCWludCBpbmRleCA9IHByb3h5QmVhbi5sYXN0SW5kZXhPZigiLiIpOwotICAJU3RyaW5nIGVuZCA9ICIiOwotICAJaWYoaW5kZXggIT0gLTEpewotICAJICBlbmQgPSBwcm94eUJlYW4uc3Vic3RyaW5nKGluZGV4ICsgMSk7ICAJCi0gIAl9Ci0gIAlTdHJpbmcgYmVhbiA9IGVuZC5zdWJzdHJpbmcoMCxlbmQubGVuZ3RoKCkpOwotICAgIAotICAJcmV0dXJuIGJlYW47Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRSdW5DbGllbnRUZXN0KCkKLSAgewotICAJcmV0dXJuIHJ1bkNsaWVudFRlc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyKCkKLSAgewotICAJcmV0dXJuIGZvbGRlcjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRKc3BGb2xkZXIoKQotICB7Ci0gIAlyZXR1cm4ganNwRm9sZGVyOwotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhblNlbGVjdGlvbltdIGdldE1ldGhvZHMoKQotICB7Ci0gICAgcmV0dXJuIG1ldGhvZHM7ICAKLSAgfQotICAgIAotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVByb2plY3RFQVIoKQotICB7Ci0gIAlyZXR1cm4gc2FtcGxlRUFSOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVByb2plY3QoKQotICB7Ci0gIAlyZXR1cm4gc2FtcGxlUHJvamVjdDsKLSAgfQotICAgICAgIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KFN0cmluZyBjbGllbnRQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlCZWFuKFN0cmluZyBwcm94eUJlYW4pCi0gIHsKLSAgCXRoaXMucHJveHlCZWFuID0gcHJveHlCZWFuOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb3h5QmVhbigpCi0gIHsKLSAgICByZXR1cm4gcHJveHlCZWFuOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdEVBUihTdHJpbmcgY2xpZW50UHJvamVjdEVBUikKLSAgewotICAgIHRoaXMuY2xpZW50UHJvamVjdEVBUiA9IGNsaWVudFByb2plY3RFQVI7Ci0gIH0JCi0gIAotICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lMkNsaWVudFR5cGVzKCBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBzZWxlY3Rpb25MaXN0ICkKLSAgewotICAgIHJ1bnRpbWUyQ2xpZW50VHlwZXMgPSBzZWxlY3Rpb25MaXN0OyAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZShTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUpCi0gIHsKLSAgCXRoaXMubGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPSBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGNsaWVudElkcyBUaGUgY2xpZW50SWRzIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudElkcyhUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHMpCi0gIHsKLSAgICB0aGlzLmNsaWVudElkcyA9IGNsaWVudElkczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBqMmVlVmVyc2lvbiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRKMmVlVmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLSAgewotICAgIGoyZWVWZXJzaW9uID0gdmVyc2lvbjsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlVGVzdENsaWVudERlcGFydHVyZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlVGVzdENsaWVudERlcGFydHVyZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NWU3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkJ1aWxkUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBXZWJTZXJ2aWNlVGVzdENsaWVudERlcGFydHVyZUZyYWdtZW50KCkKLSAgewotICAJYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgRmluaXNoRGVmYXVsdENvbW1hbmQoKSwiIikpOwotICAJYWRkKG5ldyBGaW5pc2hKYXZhVGVzdEZyYWdtZW50KCkpOwotICAJYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZCgpLCIiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVGVzdENsaWVudERlcGFydHVyZUluaXRDb21tYW5kLmNsYXNzLCAiRm9yY2VCdWlsZCIsQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcywgIlNhbXBsZVNlcnZlclR5cGVJRCIsQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcywgIlNhbXBsZUV4aXN0aW5nU2VydmVyIixBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzKTsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzLCAiU2FtcGxlU2VydmVyVHlwZUlEIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzLCAiU2FtcGxlRXhpc3RpbmdTZXJ2ZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcywgInNhbXBsZVByb2plY3QiLEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgIAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L2V4cGxvcmVyL0V4cGxvcmVyU2VydmljZVRlc3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9FeHBsb3JlclNlcnZpY2VUZXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTIzZDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L2V4cGxvcmVyL0V4cGxvcmVyU2VydmljZVRlc3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuZXhwbG9yZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU3RhcnRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV1NETFRlc3RGaW5pc2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hPcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIGltcGxlbWVudHMgV1NETFRlc3RGaW5pc2hDb21tYW5kCi17Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQiOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJMYXVuY2ggdGhlIEV4cGxvcmVyIjsKLSAgcHJpdmF0ZSBib29sZWFuIGV4dGVybmFsQnJvd3NlciA9IHRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxTZXJ2aWNlVVJMOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEOwotICBwcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUHJvamVjdDsKLSAgcHJpdmF0ZSBMaXN0IGVuZHBvaW50czsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgV2ViU2VydmljZUV4cGxvcmVyTGF1bmNoIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBsYWJlbCBhbmQgZGVzY3JpcHRpb24uCi0gICovCi0gIHB1YmxpYyBFeHBsb3JlclNlcnZpY2VUZXN0Q29tbWFuZCAoKQotICB7Ci0gIAlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gIAlzZXROYW1lKExBQkVMKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIAotICAgIFN0YXJ0UHJvamVjdENvbW1hbmQgc3BjID0gbmV3IFN0YXJ0UHJvamVjdENvbW1hbmQoIHRydWUgKTsKLSAgICBzcGMuc2V0U2VydmljZVNlcnZlclR5cGVJRChzZXJ2aWNlU2VydmVyVHlwZUlEKTsKLSAgICBzcGMuc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKHNlcnZpY2VFeGlzdGluZ1NlcnZlcik7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uoc2VydmljZVByb2plY3QpOwotICAgIHNwYy5zZXRTZXJ2aWNlUHJvamVjdChwcm9qZWN0KTsKLSAgICBzcGMuc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCh0cnVlKTsKLSAgICAKLSAgICBzdGF0dXMgPSBzcGMuZXhlY3V0ZShlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBzdGF0dXM7Ci0KLSAgICBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kIGxhdW5jaENvbW1hbmQgPSBuZXcgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCgpOwotICAgIGxhdW5jaENvbW1hbmQuc2V0Rm9yY2VMYXVuY2hPdXRzaWRlSURFKGV4dGVybmFsQnJvd3Nlcik7Ci0gICAgVmVjdG9yIGxhdW5jaE9wdGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5XU0RMX1VSTCx3c2RsU2VydmljZVVSTCkpOwotICAgIGlmIChlbmRwb2ludHMgIT0gbnVsbCkKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlbmRwb2ludHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuV0VCX1NFUlZJQ0VfRU5EUE9JTlQsIGl0Lm5leHQoKS50b1N0cmluZygpKSk7Ci0gICAgbGF1bmNoQ29tbWFuZC5zZXRMYXVuY2hPcHRpb25zKChMYXVuY2hPcHRpb25bXSlsYXVuY2hPcHRpb25WZWN0b3IudG9BcnJheShuZXcgTGF1bmNoT3B0aW9uWzBdKSk7Ci0gICAgc3RhdHVzID0gbGF1bmNoQ29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVybmFsQnJvd3Nlcihib29sZWFuIGV4dGVybmFsQnJvd3NlcikKLSAgewotICAJdGhpcy5leHRlcm5hbEJyb3dzZXIgPSBleHRlcm5hbEJyb3dzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxTZXJ2aWNlVVJMKFN0cmluZyB3c2RsU2VydmljZVVSTCkKLSAgewotICAJdGhpcy53c2RsU2VydmljZVVSTCA9IHdzZGxTZXJ2aWNlVVJMOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQpCi0gIHsKLSAgCXRoaXMuc2VydmljZVNlcnZlclR5cGVJRCA9IHNlcnZpY2VTZXJ2ZXJUeXBlSUQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKQotICB7Ci0gIAl0aGlzLnNlcnZpY2VFeGlzdGluZ1NlcnZlciA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoU3RyaW5nIHNlcnZpY2VQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlUHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChMaXN0IGVuZHBvaW50cykKLSAgewotICAgIHRoaXMuZW5kcG9pbnRzID0gZW5kcG9pbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmIzNWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L2V4cGxvcmVyL1dlYlNlcnZpY2VFeHBsb3JlckV4ZWN1dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXhlY3V0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VGaW5pc2hDb21tYW5kOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZS1TZXJ2ZXItUnVudGltZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUsIHNlcnZlciwgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZSBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeGVjdXRhYmxlCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICAgCi0gIAotICBwdWJsaWMgV2ViU2VydmljZUZpbmlzaENvbW1hbmQgZ2V0RmluaXNoQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEV4cGxvcmVyU2VydmljZVRlc3RDb21tYW5kKCk7Ci0gIH0KLSAgCi19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV1NTYW1wbGVGaW5pc2hDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9XU1NhbXBsZUZpbmlzaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiODVlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9XU1NhbXBsZUZpbmlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC53c3NhbXBsZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uUHVibGlzaFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5JbnB1dEZpbGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLk1ldGhvZEZpbGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLlJlc3VsdEZpbGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLlRlc3RDbGllbnRGaWxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbWFuZC5HZW5lcmF0ZVBhZ2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbWFuZC5KYXZhVG9Nb2RlbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5Db3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuSmF2YVByb3h5VGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LndlYmJyb3dzZXIuV2ViQnJvd3NlcjsKLQotcHVibGljIGNsYXNzIFdTU2FtcGxlRmluaXNoQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgaW1wbGVtZW50cyBKYXZhUHJveHlUZXN0Q29tbWFuZAotewotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOUFVUICAgICAgID0gIklucHV0LmpzcCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFU1RfQ0xJRU5UID0gIlRlc3RDbGllbnQuanNwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTVUxUICAgICAgPSAiUmVzdWx0LmpzcCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FVEhPRCAgICAgID0gIk1ldGhvZC5qc3AiOwotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJKYXZhQmVhblRvU2FtcGxlQWN0aXZlVGFzayI7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJkZWZhdWx0IGFjdGlvbnMiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLSAgCi0gIHByaXZhdGUgTW9kZWwgcHJveHlNb2RlbDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIAotICAKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgcW5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIGpzcEZvbGRlcjsKLSAgcHJpdmF0ZSBib29sZWFuIHJ1bkNsaWVudFRlc3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5QmVhbjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIHByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IEphdmFCZWFuVG9TYW1wbGVBY3RpdmVUYXNrIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBsYWJlbCBhbmQgZGVzY3JpcHRpb24uCi0gICovCi0gIHB1YmxpYyBXU1NhbXBsZUZpbmlzaENvbW1hbmQgKCkKLSAgewotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCW1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0Jc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotCXNldE5hbWUoTEFCRUwpOyAgCQotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgLy9zZXR0ZXJzIGFuZCBnZXR0ZXJzIHRvIGJlIHJlbW92ZWQKLSAgCUNvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kIGNvcHkgPSBuZXcgQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQoKTsgICAgCi0gIAljb3B5LnNldFNhbXBsZVByb2plY3Qoc2FtcGxlUHJvamVjdCk7Ci0gIAlzdGF0dXMgPSBjb3B5LmV4ZWN1dGUoZW52KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHN0YXR1cyA9IGNyZWF0ZU1vZGVsKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBzdGF0dXMgPSBnZW5lcmF0ZVBhZ2VzKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICAvL2lmICghaXNTdWNjZXNzZnVsKCkpIHJldHVybjsKLSAgICBzdGF0dXMgPSBsYXVuY2hTYW1wbGUoZW52KTsKLSAgICByZXR1cm4gc3RhdHVzOyAgIAotICB9Ci0KLSAgIAotICAvKioKLSAgKiBHZW5lcmF0ZSB0aGUgZm91ciBqc3BzIHRoYXQgbWFrZSB1cCB0aGlzCi0gICogc2FtcGxlIGFwcC4KLSAgKi8KLSAgcHJvdGVjdGVkIFN0YXR1cyBnZW5lcmF0ZVBhZ2VzKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgSVBhdGggZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IG5ldyBQYXRoKGpzcEZvbGRlcik7Ci0gICAgZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGgubWFrZUFic29sdXRlKCk7ICAgIAotICAgIElXb3Jrc3BhY2VSb290IGZXb3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0gICAgSVBhdGggcGF0aFRlc3QgPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLmFwcGVuZChURVNUX0NMSUVOVCk7Ci0gICAgSUZpbGUgZmlsZVRlc3QgPSBmV29ya3NwYWNlLmdldEZpbGUocGF0aFRlc3QpOwotICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjVGVzdCA9IG5ldyBHZW5lcmF0ZVBhZ2VDb21tYW5kKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudiksIHByb3h5TW9kZWwsCi0gICAgICBuZXcgVGVzdENsaWVudEZpbGVHZW5lcmF0b3IoSU5QVVQsTUVUSE9ELFJFU1VMVCksZmlsZVRlc3QpOwotICAgIC8vZ3BjVGVzdC5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgc3RhdHVzID0gZ3BjVGVzdC5leGVjdXRlKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgCi0KLSAgICAvL2lucHV0IGNvZGVnZW4KLSAgICBJUGF0aCBwYXRoSW5wdXQgPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLmFwcGVuZChJTlBVVCk7Ci0gICAgSUZpbGUgZmlsZUlucHV0ID0gZldvcmtzcGFjZS5nZXRGaWxlKHBhdGhJbnB1dCk7Ci0gICAgSW5wdXRGaWxlR2VuZXJhdG9yIGlucHV0R2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUdlbmVyYXRvcihSRVNVTFQpOwotICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjSW5wdXQgPSBuZXcgR2VuZXJhdGVQYWdlQ29tbWFuZChFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLCBwcm94eU1vZGVsLAotICAgICAgaW5wdXRHZW5lcmF0b3IsZmlsZUlucHV0KTsKLSAgICAvL2dwY0lucHV0LnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICBzdGF0dXMgPSBncGNJbnB1dC5leGVjdXRlKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgCXJldHVybiBzdGF0dXM7Ci0KLSAgICAvL21ldGhvZCBjb2RlZ2VuCi0gICAgSVBhdGggcGF0aE1ldGhvZCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGguYXBwZW5kKE1FVEhPRCk7Ci0gICAgSUZpbGUgZmlsZU1ldGhvZCA9IGZXb3Jrc3BhY2UuZ2V0RmlsZShwYXRoTWV0aG9kKTsKLSAgICBNZXRob2RGaWxlR2VuZXJhdG9yIG1ldGhvZEdlbmVyYXRvciA9IG5ldyBNZXRob2RGaWxlR2VuZXJhdG9yKElOUFVUKTsKLSAgICBtZXRob2RHZW5lcmF0b3Iuc2V0Q2xpZW50Rm9sZGVyUGF0aChqc3BGb2xkZXIpOwotICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjTWV0aG9kID0gbmV3IEdlbmVyYXRlUGFnZUNvbW1hbmQoRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwgcHJveHlNb2RlbCwKLSAgICAgIG1ldGhvZEdlbmVyYXRvcixmaWxlTWV0aG9kKTsKLSAgICAvL2dwY01ldGhvZC5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgc3RhdHVzID0gZ3BjTWV0aG9kLmV4ZWN1dGUoZW52KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgICAJcmV0dXJuIHN0YXR1czsgICAgCi0KLQotICAgIC8vcmVzdWx0IGNvZGVnZW4KLSAgICBJUGF0aCBwYXRoUmVzdWx0ID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5hcHBlbmQoUkVTVUxUKTsKLSAgICBJRmlsZSBmaWxlUmVzdWx0ID0gZldvcmtzcGFjZS5nZXRGaWxlKHBhdGhSZXN1bHQpOwotICAgIFJlc3VsdEZpbGVHZW5lcmF0b3IgcmZnID0gbmV3IFJlc3VsdEZpbGVHZW5lcmF0b3IoKTsKLSAgICByZmcuc2V0Q2xpZW50Rm9sZGVyUGF0aChqc3BGb2xkZXIpOwotICAgIHJmZy5zZXRTZXRFbmRwb2ludE1ldGhvZChzZXRFbmRwb2ludE1ldGhvZCk7Ci0gICAgR2VuZXJhdGVQYWdlQ29tbWFuZCBncGNSZXN1bHQgPSBuZXcgR2VuZXJhdGVQYWdlQ29tbWFuZChFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLCBwcm94eU1vZGVsLAotICAgICAgcmZnLGZpbGVSZXN1bHQpOwotICAgIC8vZ3BjUmVzdWx0LnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICBzdGF0dXMgPSBncGNSZXN1bHQuZXhlY3V0ZShlbnYpOwotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBTdGF0dXMgbGF1bmNoU2FtcGxlIChFbnZpcm9ubWVudCBlbnYpIHsKLQotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgaWYgKCFydW5DbGllbnRUZXN0KSByZXR1cm4gc3RhdHVzOwotICAgIAotCi0gICAgSVBhdGggZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IG5ldyBQYXRoKGpzcEZvbGRlcik7Ci0gICAgZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGgubWFrZUFic29sdXRlKCk7ICAgIAotCi0gICAgUHVibGlzaFByb2plY3RDb21tYW5kIHBwYyA9IG5ldyBQdWJsaXNoUHJvamVjdENvbW1hbmQoKTsKLSAgICBwcGMuc2V0U2VydmVyVHlwZUlEKHNhbXBsZVNlcnZlclR5cGVJRCk7Ci0gICAgcHBjLnNldEV4aXN0aW5nU2VydmVyKHNhbXBsZUV4aXN0aW5nU2VydmVyKTsKLSAgICBwcGMuc2V0UHJvamVjdChzYW1wbGVQcm9qZWN0KTsKLSAgICBzdGF0dXMgPSBwcGMuZXhlY3V0ZShlbnYpOwotCi0gICAgU3RhcnRQcm9qZWN0Q29tbWFuZCBzcGMgPSBuZXcgU3RhcnRQcm9qZWN0Q29tbWFuZChmYWxzZSApOwotICAgIHNwYy5zZXRTZXJ2aWNlU2VydmVyVHlwZUlEKHNhbXBsZVNlcnZlclR5cGVJRCk7Ci0gICAgc3BjLnNldFNhbXBsZUV4aXN0aW5nU2VydmVyKHNhbXBsZUV4aXN0aW5nU2VydmVyKTsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShzYW1wbGVQcm9qZWN0KTsKLSAgICBzcGMuc2V0U2FtcGxlUHJvamVjdChwcm9qZWN0KTsKLSAgICBzcGMuc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCh0cnVlKTsKLSAgICAKLSAgICBzdGF0dXMgPSBzcGMuZXhlY3V0ZShlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gICAgSVBhdGggbmV3UGF0aCA9IG5ldyBQYXRoKFJlc291cmNlVXRpbHMuZ2V0V2ViUHJvamVjdFVSTChSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihmRGVzdGluYXRpb25Gb2xkZXJQYXRoKSxzYW1wbGVTZXJ2ZXJUeXBlSUQsc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpKTsKLSAgICBuZXdQYXRoID0gbmV3UGF0aC5hcHBlbmQoZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpLm1ha2VBYnNvbHV0ZSgpKTsKLSAgICBTdHJpbmdCdWZmZXIgdXJsU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcihuZXdQYXRoLmFwcGVuZChURVNUX0NMSUVOVCkudG9TdHJpbmcoKSk7Ci0gICAgaWYgKGVuZHBvaW50cyAhPSBudWxsICYmICFlbmRwb2ludHMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHVybFN0cmluZy5hcHBlbmQoIj9lbmRwb2ludD0iKTsKLSAgICAgIHVybFN0cmluZy5hcHBlbmQoZW5kcG9pbnRzLmdldCgwKS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgdHJ5ewotICAgICAgVVJMIHVybDsKLSAgICAgIHVybCA9IG5ldyBVUkwodXJsU3RyaW5nLnRvU3RyaW5nKCkpOwotICAgICAgaW50IHN0eWxlID0gV2ViQnJvd3Nlci5MT0NBVElPTl9CQVIgfCBXZWJCcm93c2VyLkJVVFRPTl9CQVI7ICAKLQotICAgICAgZm9yKCBpbnQgcmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDsgcmV0cmllcysrICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBUZXN0IHRoZSBVUkxzCi0gICAgICAgICAgKG5ldyBVUkwobmV3UGF0aC5hcHBlbmQoUkVTVUxUKS50b1N0cmluZygpKSkub3BlblN0cmVhbSgpOwotICAgICAgICAgIChuZXcgVVJMKG5ld1BhdGguYXBwZW5kKE1FVEhPRCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAobmV3IFVSTChuZXdQYXRoLmFwcGVuZChJTlBVVCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAobmV3IFVSTChuZXdQYXRoLmFwcGVuZChURVNUX0NMSUVOVCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAvLyBMb29rcyBnb29kLCBleGl0IGxvb3AKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gaW9lICkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7fSAJICAJICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIFdlYkJyb3dzZXIub3BlblVSTCh1cmwsc3R5bGUsbnVsbCk7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAgCi0gICAgfWNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMpewotICAgIAllbnYuZ2V0TG9nKCkubG9nKExvZy5XQVJOSU5HLCA1MDQ4LCB0aGlzLCAibGF1bmNoU2FtcGxlIiwgZXhjKTsKLQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImxhdW5jaFNhbXBsZSIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQUxGT1JNRURfVVJMIiksIFN0YXR1cy5XQVJOSU5HICk7Ci0JCXRyeSB7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImxhdW5jaFNhbXBsZSIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQUxGT1JNRURfVVJMIiksIFN0YXR1cy5FUlJPUiApOwotCQl9Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLSAgCi0KLSAgcHJvdGVjdGVkIFN0YXR1cyBjcmVhdGVNb2RlbChFbnZpcm9ubWVudCBlbnYpIHsKLQotICAJLy9jcmVhdGUgdGhlIG1vZGVsIGZyb20gdGhlIHJlc291cmNlCi0gICAgSmF2YVRvTW9kZWxDb21tYW5kIGp0bWMgPSBuZXcgSmF2YVRvTW9kZWxDb21tYW5kKCk7Ci0gICAganRtYy5zZXRNZXRob2RzKG1ldGhvZHMpOwotICAgIGp0bWMuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICBqdG1jLnNldFByb3h5QmVhbihwcm94eUJlYW4pOwotICAgIC8vanRtYy5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IGp0bWMuZXhlY3V0ZShlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0KLSAgICBwcm94eU1vZGVsID0ganRtYy5nZXREYXRhTW9kZWwoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyVHlwZUlEKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQpCi0gIHsKLSAgCXRoaXMuc2FtcGxlU2VydmVyVHlwZUlEID0gc2FtcGxlU2VydmVyVHlwZUlEOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyKQotICB7Ci0gIAl0aGlzLnNhbXBsZUV4aXN0aW5nU2VydmVyID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlcihTdHJpbmcganNwRm9sZGVyKQotICB7Ci0gICAgdGhpcy5qc3BGb2xkZXIgPSBqc3BGb2xkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bkNsaWVudFRlc3QoYm9vbGVhbiBydW5DbGllbnRUZXN0KQotICB7Ci0gIAl0aGlzLnJ1bkNsaWVudFRlc3QgPSBydW5DbGllbnRUZXN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KFN0cmluZyBzYW1wbGVQcm9qZWN0KQotICB7Ci0gIAl0aGlzLnNhbXBsZVByb2plY3QgPSBzYW1wbGVQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAJdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcykKLSAgewotICAJdGhpcy5tZXRob2RzID0gbWV0aG9kczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2V0RW5kcG9pbnRNZXRob2QgVGhlIHNldEVuZHBvaW50TWV0aG9kIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldEVuZHBvaW50TWV0aG9kKFN0cmluZyBzZXRFbmRwb2ludE1ldGhvZCkKLSAgewotICAgIHRoaXMuc2V0RW5kcG9pbnRNZXRob2QgPSBzZXRFbmRwb2ludE1ldGhvZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoTGlzdCBlbmRwb2ludHMpCi0gIHsKLSAgICB0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWMzNDAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL1dlYlNlcnZpY2VXU1NhbXBsZUV4ZWN1dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXhlY3V0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VGaW5pc2hDb21tYW5kOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZS1TZXJ2ZXItUnVudGltZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUsIHNlcnZlciwgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZSBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeGVjdXRhYmxlCi17Ci0gICAKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRmluaXNoQ29tbWFuZCBnZXRGaW5pc2hDb21tYW5kKCkKLSAgewotICAJcmV0dXJuIG5ldyBXU1NhbXBsZUZpbmlzaENvbW1hbmQoKTsKLSAgfQotICAgIAotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0NsaWVudFByb2plY3RUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0NsaWVudFByb2plY3RUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyOThmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9DbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgc3RhdGljIENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzXzsKLQotICBwcml2YXRlIENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkoKQotICB7Ci0gICAgaW5pdCgpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgICBpbnN0YW5jZV8gPSBuZXcgQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeSgpOwotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIGNvbmZpZ0VsZW1lbnRzXyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJjbGllbnRQcm9qZWN0VHlwZSIpOwotICB9Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXREZWZhdWx0RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudEJ5SWQoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5XZWIiKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudEJ5SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRCeUF0dHJpYnV0ZSgiaWQiLCBpZCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnRCeUxhYmVsKFN0cmluZyBsYWJlbCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoImxhYmVsIiwgbGFiZWwpOwotICB9Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50QnlQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5sZW5ndGg7IGkrKykKLSAgICAgIGlmIChpbmNsdWRlKHByb2plY3QsIGNvbmZpZ0VsZW1lbnRzX1tpXS5nZXRBdHRyaWJ1dGUoImluY2x1ZGUiKSkgJiYgZXhjbHVkZShwcm9qZWN0LCBjb25maWdFbGVtZW50c19baV0uZ2V0QXR0cmlidXRlKCJleGNsdWRlIikpKQotICAgICAgICByZXR1cm4gY29uZmlnRWxlbWVudHNfW2ldOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudEJ5QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5sZW5ndGg7IGkrKykKLSAgICAgIGlmIChjb25maWdFbGVtZW50c19baV0uZ2V0QXR0cmlidXRlKG5hbWUpLmVxdWFscyh2YWx1ZSkpCi0gICAgICAgIHJldHVybiBjb25maWdFbGVtZW50c19baV07Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSVByb2plY3RbXSBnZXRQcm9qZWN0cyhTdHJpbmcgaWQpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnRCeUlkKGlkKTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIElQcm9qZWN0W10gd29ya3NwYWNlUHJvanMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZVByb2pzLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIFRPRE86IE5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgdG8gd29yayB3aXRoIHByb2plY3QvbW9kdWxlIHRvcG9sb2d5IGRlc2NyaWJlZCBpbiBYUAotICAgICAgICAvL2lmIChpbmNsdWRlKHdvcmtzcGFjZVByb2pzW2ldLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaW5jbHVkZSIpKSAmJiBleGNsdWRlKHdvcmtzcGFjZVByb2pzW2ldLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZXhjbHVkZSIpKSkKLQkJaWYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHdvcmtzcGFjZVByb2pzW2ldKSB8fCBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdCh3b3Jrc3BhY2VQcm9qc1tpXSkpCi0JCXsKLSAgICAgICAgICB2LmFkZCh3b3Jrc3BhY2VQcm9qc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFt2LnNpemUoKV07Ci0gICAgdi5jb3B5SW50byhwcm9qZWN0cyk7Ci0gICAgcmV0dXJuIHByb2plY3RzOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGluY2x1ZGUpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluY2x1ZGUpOwotICAgIHdoaWxlKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZXhjbHVkZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZXhjbHVkZSkKLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZXhjbHVkZSk7Ci0gICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAocHJvamVjdC5oYXNOYXR1cmUoc3QubmV4dFRva2VuKCkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9JV2ViU2VydmljZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjN2Q5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9JV2ViU2VydmljZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhIGtpbmQgb2YKLSogV2ViIFNlcnZpY2UgYXJ0aWZhY3QuIAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VSdW50aW1lCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKiBAcmV0dXJuIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBMYWJlbCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgTGFiZWwgb2YgdGhpcyBXZWIgU2VydmljZSBydW50aW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsICgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBTdHJpbmcsIEoyRUUgdmVyc2lvbgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0SjJFRVZlcnNpb25zKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGgKLSAgICogdGhpcyBydW50aW1lLgotICAgKiAKLSAgICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ci0gICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VTZXJ2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0lXZWJTZXJ2aWNlU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MGQ5NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhIGtpbmQgb2YKLSogV2ViIFNlcnZpY2UgYXJ0aWZhY3QuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgYSBXZWJTZXJ2aWNlVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUuCi0qLwotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVNlcnZlcgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQgKCk7Ci0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIEEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCAoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgc2V0IHRydWUgaW4gcGx1Z2luLnhtbAotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldElzRGVmYXVsdCgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgcnVudGltZSB0YXJnZXQgSWQKLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZVR5cGVJZCgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGgKLSAgICogdGhpcyBydW50aW1lLgotICAgKiAKLSAgICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ci0gICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0lXZWJTZXJ2aWNlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNDk2OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYSBraW5kIG9mCi0qIFdlYiBTZXJ2aWNlIGFydGlmYWN0LiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIGEgV2ViU2VydmljZVR5cGUKLSogb2JqZWN0IGlzIHRvIG1hbnVmYWN0dXJlIHRoZSB3aXphcmQgcGFnZXMgdGhhdCBzdXBwb3J0IHRoZSB0eXBlLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VUeXBlCi17Ci0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKTsKLSAgLyoqCi0gICogUmV0dXJucyBhIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyBleHRlbnNpb24gbWV0YWRhdGEuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyBleHRlbnNpb24gbWV0YWRhdGEuCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25NZXRhZGF0YSAoKTsKLSAgCi0gIC8qKgotICAqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlJ3MgcmVzb3VyY2UgbWV0YWRhdGEuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyByZXNvdXJjZSBtZXRhZGF0YS4KLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlVHlwZU1ldGFkYXRhICgpOyAgCi0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBsdWdpbi54bWwgY29udGFpbnMgYW4gYXR0cmlidXRlIG9mICJjYW5GaW5pc2giIHdpdGggYSB2YWx1ZSBvZiB0cnVlLiAgT3RoZXJ3aXNlLCAKLSAgKiBmYWxzZSBpcyByZXR1cm5lZC4gIE5vdGU6IGlmIHRoZSAiY2FuRmluaXNoIiBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCB0cnVlIGlzIHJldHVybmVkIGJ5IGRlZmF1bHQuCi0gICogQHJldHVybiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGNhbiBmaW5pc2ggb24gdGhlIHBhZ2VzIGJlZm9yZSB0aGUgd2ViIHNlcnZpY2UgdHlwZSBwYWdlcy4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuRmluaXNoKCk7ICAKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aAotICAgKiB0aGlzIHJ1bnRpbWUuCi0gICAqIAotICAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLQotICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdFNlbGVjdGlvbldpZGdldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTliNzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkudWRkaS5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeQotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHJpdmF0ZSBzdGF0aWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSBpbnN0YW5jZV87Ci0KLSAgcHJpdmF0ZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5KCkgewotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKSB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiKTsKLQotICAgIHRyeSB7Ci0gICAgICBPYmplY3QgY29uZmlnRWxlbWVudCA9ICgoY29uZmlnLmxlbmd0aCA+IDApID8gY29uZmlnWzBdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIikgOiBudWxsKTsKLSAgICAgIGlmKGNvbmZpZ0VsZW1lbnQgIT0gbnVsbCAmJiBjb25maWdFbGVtZW50IGluc3RhbmNlb2YgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUpIAotICAgICAgICByZXR1cm4gKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKWNvbmZpZ0VsZW1lbnQ7IAotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9QdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1B1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDI4NzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1B1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5VHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IGluc3RhbmNlXzsKLSAgcHJpdmF0ZSBWZWN0b3IgdHlwZXNfOwotICBwcml2YXRlIFZlY3RvciBjb25maWdFbGVtZW50c187Ci0KLSAgcHJpdmF0ZSBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkoKSB7Ci0gICAgdHlwZXNfID0gbmV3IFZlY3RvcigpOwotICAgIGNvbmZpZ0VsZW1lbnRzXyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIGluaXQoKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljVURESVJlZ2lzdHJ5VHlwZSIpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcubGVuZ3RoOyBpKyspIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIE9iamVjdCBjb25maWdFbGVtZW50ID0gY29uZmlnW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0KLSAgICAgICAgaWYoIGNvbmZpZ0VsZW1lbnQgaW5zdGFuY2VvZiBQdWJsaWNVRERJUmVnaXN0cnlUeXBlKSAgewotICAgICAgICAgIHR5cGVzXy5hZGQoY29uZmlnRWxlbWVudCk7Ci0gICAgICAgICAgY29uZmlnRWxlbWVudHNfLmFkZChjb25maWdbaV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7fQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlW10gZ2V0QWxsUHVibGljVURESVJlZ2lzdHJ5VHlwZXMoKSB7Ci0gICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzID0gbmV3IFB1YmxpY1VERElSZWdpc3RyeVR5cGVbdHlwZXNfLnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIHR5cGVzW2ldID0gKFB1YmxpY1VERElSZWdpc3RyeVR5cGUpdHlwZXNfLmVsZW1lbnRBdChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0KLSAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeVR5cGUgZ2V0UHVibGljVURESVJlZ2lzdHJ5VHlwZUJ5SUQoU3RyaW5nIGlkKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbGVtZW50c18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjID0gKElDb25maWd1cmF0aW9uRWxlbWVudCljb25maWdFbGVtZW50c18uZWxlbWVudEF0KGkpOwotICAgICAgaWYgKGMuZ2V0QXR0cmlidXRlKCJpZCIpLmVxdWFscyhpZCkpCi0gICAgICAgIHJldHVybiAoUHVibGljVURESVJlZ2lzdHJ5VHlwZSl0eXBlc18uZWxlbWVudEF0KGkpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljVURESVJlZ2lzdHJ5VHlwZUlEQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIFB1YmxpY1VERElSZWdpc3RyeVR5cGUgdHlwZSA9IChQdWJsaWNVRERJUmVnaXN0cnlUeXBlKXR5cGVzXy5lbGVtZW50QXQoaSk7Ci0gICAgICBpZiAodHlwZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotICAgICAgICByZXR1cm4gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpY29uZmlnRWxlbWVudHNfLmVsZW1lbnRBdChpKSkuZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9SdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9SdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTg3ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQuSVNlcnZlclRhcmdldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLSAgcHJpdmF0ZSBTaGVsbCB0aGlzU2hlbGw7Ci0gIHByaXZhdGUgR3JvdXAgdmlld1NlbGVjdGlvbkdyb3VwXzsKLSAgcHJpdmF0ZSBUZXh0IG1lc3NhZ2VCYW5uZXJfOwotICBwcml2YXRlIENvbXBvc2l0ZSBwcmltYXJ5R3JvdXBfOwotICBwcml2YXRlIEdyb3VwIHJ1bnRpbWVzR3JvdXBfOwotICBwcml2YXRlIEdyb3VwIHNlcnZlcnNHcm91cF87Ci0gIHByaXZhdGUgVHJlZSBydW50aW1lc0xpc3RfOwotICBwcml2YXRlIFRyZWUgc2VydmVyTGlzdF87Ci0gIHByaXZhdGUgQnV0dG9uIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiB2aWV3U2VsZWN0aW9uQnlTZXJ2ZXJCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiB2aWV3U2VsZWN0aW9uQnlFeHBsb3JlQnV0dG9uXzsKLSAgcHJpdmF0ZSBDb21ibyBqMmVlVmVyc2lvbkNvbWJvOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDAxIGZvciB0aGUgc2VsZWN0aW9uIG9mIHJ1bnRpbWUsIHNlcnZlciBhbmQgcHJvamVjdCBjb21iaW5hdGlvbgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0RJQUxPRyA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1JTMDAwMSI7Ci0gIC8qIENPTlRFWFRfSUQgUFdSUzAwMDIgZm9yIHRoZSBydW50aW1lIHNlbGVjdGlvbiBvbiBpbiB0aGUgZGFpbG9nICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19MSVNUX1JVTlRJTUVTID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDAyIjsKLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwMyBmb3IgdGhlIHNlcnZlciBzZWxlY3Rpb24gaW4gdGhlIGRpYWxvZyAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfTElTVF9TRVJWRVJTID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDAzIjsKLSAgLyoKLSAgICogQ09OVEVYVF9JRCBQV1JTMDAwNCBmb3IgdGhlIEVKQiBQcm9qZWN0IGNvbWJvIGJveCBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gZGlhbG9nCi0gICAqLwotICAvLyAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0VKQl9QUk9KRUNUID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQKLSAgLy8gKyAiLlBXUlMwMDA0IjsKLSAgLyoKLSAgICogQ09OVEVYVF9JRCBQV1JTMDAwNSBmb3IgdGhlIHJ1bnRpbWUgdmlldyByYWRpbyBidXR0b24gb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIGRpYWxvZwotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX1JBRElPX1JVTlRJTUUgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdSUzAwMDUiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDA2IGZvciB0aGUgc2VydmVyIHZpZXcgcmFkaW8gYnV0dG9uIG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBkaWFsb2cKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19SQURJT19TRVJWRVIgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdSUzAwMDYiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDA3IGZvciB0aGUgZXhwbG9yZSB2aWV3IHJhZGlvIGJ1dHRvbiBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gZGlhbG9nCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfUkFESU9fRVhQTE9SRSA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1JTMDAwNyI7Ci0gIC8qCi0gICAqIENPTlRFWFRfSUQgUFdSUzAwMDggZm9yIHRoZSBXZWIgUHJvamVjdCBjb21ibyBib3ggb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIGRpYWxvZwotICAgKi8KLSAgLy8gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19DT01CT19QUk9KRUNUID0KLSAgLy8gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDA4IjsKLSAgLyoKLSAgICogQ09OVEVYVF9JRCBQV1JTMDAwOSBmb3IgdGhlIEoyRUUgdmVyc2lvbiBjb21ibyBib3ggb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIGRpYWxvZwotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0oyRUVfVkVSU0lPTiA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1JTMDAwOSI7Ci0KLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZ2lzdHJ5OwotICBwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgd3NjdFJlZ2lzdHJ5OwotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2ZXJMYWJlbHNfOwotICBwcml2YXRlIEhhc2h0YWJsZSBleGlzdGluZ1NlcnZlcnNUYWJsZV87Ci0gIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJfOwotICBwcml2YXRlIFN0cmluZyBkZWZhdWx0UnVudGltZV87Ci0gIHByaXZhdGUgU3RyaW5nIHR5cGVJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFR5cGVJZF87Ci0gIHByaXZhdGUgSVdlYlNlcnZpY2VSdW50aW1lIHNlbGVjdGVkUnVudGltZV87Ci0gIHByaXZhdGUgSVNlcnZlciBzZWxlY3RlZFNlcnZlcl87Ci0gIHByaXZhdGUgU3RyaW5nIHNlbGVjdGVkU2VydmVyTGFiZWxfOwotICBwcml2YXRlIFN0cmluZyBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF87Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0V4aXN0aW5nU2VydmVyXzsKLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlT25fID0gZmFsc2U7Ci0gIHByaXZhdGUgYnl0ZSBzZWxlY3Rpb25Nb2RlXzsKLSAgcHJpdmF0ZSBmaW5hbCBieXRlIE1PREVfU0VSVklDRSA9IChieXRlKSAwOwotICBwcml2YXRlIGZpbmFsIGJ5dGUgTU9ERV9DTElFTlQgPSAoYnl0ZSkgMTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VSVkVSX1RZUEVTX0lDT04gPSAiaWNvbnMvc2VydmVycy9zZXJ2ZXJzX29iai5naWYiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBFWElTVElOR19TRVJWRVJTX0lDT04gPSAiaWNvbnMvc2VydmVycy9leGlzdGluZ19zZXJ2ZXJfb2JqLmdpZiI7Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlEXzsKLQotICBwdWJsaWMgUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwgYnl0ZSBtb2RlLCBUeXBlUnVudGltZVNlcnZlciBpZHMsIFN0cmluZyBqMmVlVmVyc2lvbikgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgICBzZWxlY3Rpb25Nb2RlXyA9IG1vZGU7Ci0gICAgdHlwZUlkXyA9IGlkcy5nZXRUeXBlSWQoKTsKLSAgICBkZWZhdWx0UnVudGltZV8gPSBpZHMuZ2V0UnVudGltZUlkKCk7Ci0gICAgZGVmYXVsdFNlcnZlcl8gPSBpZHMuZ2V0U2VydmVySWQoKTsKLSAgICBzZXJ2ZXJJbnN0YW5jZUlEXyA9IGlkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gICAgc2V0SXNFeGlzdGluZ1NlcnZlcihpZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGwpOwotICAgIHNlcnZlckxhYmVsc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHdzY3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICB3c3NydFJlZ2lzdHJ5ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICB0aGlzLmoyZWVWZXJzaW9uID0gajJlZVZlcnNpb247Ci0gIH0KLQotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKSB7Ci0gICAgVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzID0gbmV3IFR5cGVSdW50aW1lU2VydmVyKCk7Ci0KLSAgICBpZHMuc2V0VHlwZUlkKHR5cGVJZF8pOwotICAgIGlmIChzZWxlY3RlZFJ1bnRpbWVfICE9IG51bGwpCi0gICAgICBpZHMuc2V0UnVudGltZUlkKHNlbGVjdGVkUnVudGltZV8uZ2V0SWQoKSk7Ci0gICAgCi0gICAgaWYoIHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyA9PSBudWxsICkKLSAgICB7Ci0gICAgICBpZHMuc2V0U2VydmVySWQoIGRlZmF1bHRTZXJ2ZXJfICk7Ci0gICAgICBpZHMuc2V0U2VydmVySW5zdGFuY2VJZCggc2VydmVySW5zdGFuY2VJRF8gKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlkcy5zZXRTZXJ2ZXJJZChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8pOwotCi0gICAgICBpZiAoaXNFeGlzdGluZ1NlcnZlcl8gJiYgc2VsZWN0ZWRTZXJ2ZXJfICE9IG51bGwpIAotICAgICAgewotICAgICAgICBpZHMuc2V0U2VydmVySW5zdGFuY2VJZChzZWxlY3RlZFNlcnZlcl8uZ2V0SWQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBpZHM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEoyRUVWZXJzaW9uKCkgewotICAgIHJldHVybiBqMmVlVmVyc2lvbjsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBnZXRJc0V4aXN0aW5nU2VydmVyKCkgewotICAgIHJldHVybiBpc0V4aXN0aW5nU2VydmVyXzsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRJc0V4aXN0aW5nU2VydmVyKGJvb2xlYW4gaXNFeGlzdGluZykgewotICAgIGlzRXhpc3RpbmdTZXJ2ZXJfID0gaXNFeGlzdGluZzsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICBDb21wb3NpdGUgY29tcCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgcGFyZW50LmdldFNoZWxsKCkucGFjaygpOwotICAgIHJldHVybiBjb21wOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgdmFsaWRhdGVPbl8gPSBmYWxzZTsKLSAgICB0aGlzU2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLSAgICBpZiAodGhpc1NoZWxsID09IG51bGwpIHsKLSAgICAgIHRoaXNTaGVsbCA9IGNyZWF0ZVNoZWxsKCk7Ci0gICAgfQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZExheW91dCBnbDsKLSAgICBHcmlkRGF0YSBnZDsKLSAgICAvLyBXaW5kb3cgdGl0bGUKLSAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKQotICAgICAgdGhpc1NoZWxsLnNldFRleHQoZ2V0TWVzc2FnZSgiJVBBR0VfVElUTEVfV1NfUlVOVElNRV9TRUxFQ1RJT04iKSk7Ci0gICAgZWxzZQotICAgICAgdGhpc1NoZWxsLnNldFRleHQoZ2V0TWVzc2FnZSgiJVBBR0VfVElUTEVfV1NfQ0xJRU5UX1JVTlRJTUVfU0VMRUNUSU9OIikpOwotICAgIAotICAgIElXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLSAgICAKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAodGhpc1NoZWxsLCBJTkZPUE9QX1BXUlNfRElBTE9HKTsKLSAgICAvLyBEaWFsb2cgZGVzY3JpcHRpb24gYmFubmVyCi0gICAgbWVzc2FnZUJhbm5lcl8gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUCk7Ci0gICAgbWVzc2FnZUJhbm5lcl8uc2V0VGV4dChnZXRNZXNzYWdlKCIlUEFHRV9ERVNDX1dTX1JVTlRJTUVfU0VMRUNUSU9OIikgKyAiXG4iICsgIiAgICAgICIpOyAvLyByZXNlcnZlcyBhIHNlY29uZCBsaW5lIGZvciBtZXNzYWdlIGRpc3BsYXkKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlUEFHRV9ERVNDX1dTX1JVTlRJTUVfU0VMRUNUSU9OIikpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgbWVzc2FnZUJhbm5lcl8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLSAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLSAgICAvLyBTZWxlY3Rpb24KLSAgICB0aGlzU2hlbGwuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFdSU19QQUdFIikpOwotICAgIHZpZXdTZWxlY3Rpb25Hcm91cF8gPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIHZpZXdTZWxlY3Rpb25Hcm91cF8uc2V0TGF5b3V0KGdsKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIHZpZXdTZWxlY3Rpb25Hcm91cF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgaWYgKHNlbGVjdGlvbk1vZGVfID09IE1PREVfU0VSVklDRSkKLSAgICAgIHZpZXdTZWxlY3Rpb25Hcm91cF8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfU0VMRUNUSU9OX1ZJRVdfVElUTEUiKSk7Ci0gICAgZWxzZQotICAgICAgdmlld1NlbGVjdGlvbkdyb3VwXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9DTElFTlRfU0VMRUNUSU9OX1ZJRVdfVElUTEUiKSk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXyA9IG5ldyBCdXR0b24odmlld1NlbGVjdGlvbkdyb3VwXywgU1dULlJBRElPKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlTZXJ2ZXJCdXR0b25fLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1NFTEVDVElPTl9WSUVXX1NFUlZFUiIpKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlTZXJ2ZXJCdXR0b25fLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl8uc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFdSU19SQURJT19TRVJWRVIiKSk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl8sIElORk9QT1BfUFdSU19SQURJT19TRVJWRVIpOwotICAgIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fID0gbmV3IEJ1dHRvbih2aWV3U2VsZWN0aW9uR3JvdXBfLCBTV1QuUkFESU8pOwotICAgIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1NFTEVDVElPTl9WSUVXX1JVTlRJTUUiKSk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5UnVudGltZUJ1dHRvbl8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5UnVudGltZUJ1dHRvbl8uc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFdSU19SQURJT19SVU5USU1FIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh2aWV3U2VsZWN0aW9uQnlSdW50aW1lQnV0dG9uXywgSU5GT1BPUF9QV1JTX1JBRElPX1JVTlRJTUUpOwotICAgIHZpZXdTZWxlY3Rpb25CeUV4cGxvcmVCdXR0b25fID0gbmV3IEJ1dHRvbih2aWV3U2VsZWN0aW9uR3JvdXBfLCBTV1QuUkFESU8pOwotICAgIHZpZXdTZWxlY3Rpb25CeUV4cGxvcmVCdXR0b25fLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1NFTEVDVElPTl9WSUVXX0VYUExPUkUiKSk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8uc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFdSU19SQURJT19FWFBMT1JFIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh2aWV3U2VsZWN0aW9uQnlFeHBsb3JlQnV0dG9uXywgSU5GT1BPUF9QV1JTX1JBRElPX0VYUExPUkUpOwotICAgIHByaW1hcnlHcm91cF8gPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMTsKLSAgICBnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgcnVudGltZXNHcm91cF8gPSBuZXcgR3JvdXAocHJpbWFyeUdyb3VwXywgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBydW50aW1lc0dyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgcnVudGltZXNHcm91cF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgcnVudGltZXNHcm91cF8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfUlVOVElNRVNfTElTVCIpKTsKLSAgICBydW50aW1lc0xpc3RfID0gbmV3IFRyZWUocnVudGltZXNHcm91cF8sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHJ1bnRpbWVzTGlzdF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgcnVudGltZXNMaXN0Xy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICBydW50aW1lc0xpc3RfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BXUlNfTElTVF9SVU5USU1FUyIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocnVudGltZXNMaXN0XywgSU5GT1BPUF9QV1JTX0xJU1RfUlVOVElNRVMpOwotICAgIC8vICBTZXJ2ZXIgbGFiZWxzIGNvbnRyb2wKLSAgICBzZXJ2ZXJzR3JvdXBfID0gbmV3IEdyb3VwKHByaW1hcnlHcm91cF8sIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgc2VydmVyc0dyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgc2VydmVyc0dyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBzZXJ2ZXJzR3JvdXBfLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1NFUlZFUlNfTElTVCIpKTsKLSAgICBzZXJ2ZXJMaXN0XyA9IG5ldyBUcmVlKHNlcnZlcnNHcm91cF8sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLSAgICBzZXJ2ZXJMaXN0Xy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0gICAgc2VydmVyTGlzdF8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgc2VydmVyTGlzdF8uc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFdSU19MSVNUX1NFUlZFUlMiKSk7Ci0gICAgU2VydmVyc0xpc3Qgc2VydmVyTGlzdCA9IG5ldyBTZXJ2ZXJzTGlzdCgpOwotICAgIHNlcnZlckxpc3Quc2V0U2VydmVyVHJlZUl0ZW1zKHNlcnZlckxpc3RfKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAoc2VydmVyTGlzdF8sIElORk9QT1BfUFdSU19MSVNUX1NFUlZFUlMpOwotICAgIHNldFJ1bnRpbWVzR3JvdXAoKTsKLSAgICAvLyBKMkVFIHZlcnNpb24KLSAgICBDb21wb3NpdGUgajJlZVZlcnNpb25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIGoyZWVWZXJzaW9uQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgajJlZVZlcnNpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgTGFiZWwgajJlZVZlcnNpb25MYWJlbCA9IG5ldyBMYWJlbChqMmVlVmVyc2lvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGoyZWVWZXJzaW9uTGFiZWwuc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfSjJFRV9WRVJTSU9OIikpOwotICAgIGoyZWVWZXJzaW9uQ29tYm8gPSBuZXcgQ29tYm8oajJlZVZlcnNpb25Db21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICBqMmVlVmVyc2lvbkNvbWJvLnNldExheW91dChnbCk7Ci0gICAgajJlZVZlcnNpb25Db21iby5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBqMmVlVmVyc2lvbkNvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIGoyZWVWZXJzaW9uQ29tYm8uc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFdSU19KMkVFX1ZFUlNJT04iKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGoyZWVWZXJzaW9uQ29tYm8sIElORk9QT1BfUFdSU19KMkVFX1ZFUlNJT04pOwotICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0gICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotICAgIHZhbGlkYXRlT25fID0gdHJ1ZTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLSAgICBzZXRKMkVFVmVyc2lvbnMoKTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEoyRUVWZXJzaW9ucygpIHsKLSAgICBqMmVlVmVyc2lvbkNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgajJlZVZlcnNpb25Db21iby5yZW1vdmVBbGwoKTsKLSAgICBTdHJpbmdbXSB2ZXJzaW9ucyA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGVkUnVudGltZV8gIT0gbnVsbCkKLSAgICAgIHZlcnNpb25zID0gc2VsZWN0ZWRSdW50aW1lXy5nZXRKMkVFVmVyc2lvbnMoKTsKLSAgICBpZiAodmVyc2lvbnMgIT0gbnVsbCkgewotICAgICAgLy9qMmVlVmVyc2lvbkNvbWJvLnNldEl0ZW1zKHZlcnNpb25zKTsKLSAgICAgIHNldEoyRUVDb21ib0l0ZW1zKHZlcnNpb25zKTsKLSAgICAgIGoyZWVWZXJzaW9uQ29tYm8uc2VsZWN0KDApOwotICAgICAgaWYgKGoyZWVWZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgaW50IGkgPSBqMmVlVmVyc2lvbkNvbWJvLmluZGV4T2YoSjJFRVV0aWxzLmdldExhYmVsRnJvbUoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKSk7Ci0gICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICBqMmVlVmVyc2lvbkNvbWJvLnNlbGVjdChpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgajJlZVZlcnNpb25Db21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRKMkVFQ29tYm9JdGVtcyhTdHJpbmdbXSB2ZXJzaW9ucykKLSAgewotICAgIFN0cmluZ1tdIGoyZWVMYWJlbHMgPSBuZXcgU3RyaW5nW3ZlcnNpb25zLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgbGFiZWwgPSBKMkVFVXRpbHMuZ2V0TGFiZWxGcm9tSjJFRVZlcnNpb24odmVyc2lvbnNbaV0pOwotICAgICAgaWYgKGxhYmVsICE9IG51bGwgJiYgbGFiZWwubGVuZ3RoKCkgPjApCi0gICAgICAgIGoyZWVMYWJlbHNbaV0gPSBKMkVFVXRpbHMuZ2V0TGFiZWxGcm9tSjJFRVZlcnNpb24odmVyc2lvbnNbaV0pOwotICAgICAgZWxzZQotICAgICAgICBqMmVlTGFiZWxzW2ldID0gZ2V0TWVzc2FnZSgiJUxBQkVMX05BIik7IAotICAgIH0KLSAgICBqMmVlVmVyc2lvbkNvbWJvLnNldEl0ZW1zKGoyZWVMYWJlbHMpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEoyRUVWZXJzaW9uQmFzZWRPblNlcnZlcigpCi0gIHsKLSAgICAvL0dldCB0aGUgbGlzdCBvZiBKMkVFIHZlcnNpb25zCi0gICAgU3RyaW5nW10gdmVyc2lvbnMgPSBudWxsOwotICAgIGlmIChzZWxlY3RlZFJ1bnRpbWVfID09IG51bGwgfHwgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgIAotICAgIHZlcnNpb25zID0gc2VsZWN0ZWRSdW50aW1lXy5nZXRKMkVFVmVyc2lvbnMoKTsKLSAgICBpZiAodmVyc2lvbnM9PW51bGwpCi0gICAgICByZXR1cm47Ci0gICAgCi0gICAgLy9QaWNrIHRoZSBmaXJzdCB2ZXJzaW9uIHRoYXQgdGhlIHNlbGVjdGVkIHNlcnZlciBzdXBwb3J0cwotICAgIGZvciAoaW50IGk9MDsgaTx2ZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaXNTZXJ2ZXJWYWxpZChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8sIHZlcnNpb25zW2ldKSkKLSAgICAgIHsKLSAgICAgICAgLy9TZXQgdGhlIGoyZWUgbGV2ZWwgdG8gdGhpcyB2ZXJzaW9uCi0gICAgICAgIFN0cmluZyBsYWJlbCA9IEoyRUVVdGlscy5nZXRMYWJlbEZyb21KMkVFVmVyc2lvbih2ZXJzaW9uc1tpXSk7Ci0gICAgICAgIGoyZWVWZXJzaW9uQ29tYm8uc2V0VGV4dChsYWJlbCk7Ci0gICAgICAgIHNldEoyRUVWZXJzaW9uRnJvbUoyRUVWZXJzaW9uQ29tYm8oKTsKLSAgICAgIH0KLSAgICB9ICAgICAgCi0gIH0KLQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGlzU2VydmVyVmFsaWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgU3RyaW5nIHN0SjJFRVZlcnNpb24gPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUYXJnZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbik7Ci0gICAgaWYgKHN0SjJFRVZlcnNpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJGYWN0b3J5SWQpOwotICAgIGlmIChzZXJ2ZXJUeXBlIT1udWxsKQotICAgIHsKLSAgICAgIElSdW50aW1lVHlwZSBzZXJ2ZXJSdW50aW1lID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwotICAgICAgSU1vZHVsZVR5cGVbXSBtVHlwZXMgPSBzZXJ2ZXJSdW50aW1lLmdldE1vZHVsZVR5cGVzKCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8bVR5cGVzLmxlbmd0aDsgaSsrKSAgICAgIAotICAgICAgewotICAgICAgICBJTW9kdWxlVHlwZSBtVHlwZSA9IG1UeXBlc1tpXTsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBtVHlwZS5nZXRJZCgpOwotICAgICAgICBTdHJpbmcgbW9kdWxlVmVyc2lvbiA9IG1UeXBlLmdldFZlcnNpb24oKTsKLSAgICAgICAgaWYgKHR5cGUuZXF1YWxzKElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuV0VCX1RZUEUpICYmIG1vZHVsZVZlcnNpb24uZXF1YWxzKHN0SjJFRVZlcnNpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgLy9Gb3VuZCBhIG1hdGNoLCByZXR1cm4gdHJ1ZSEKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvL25vIG1hdGNoIGZvdW5kIG9yIHRoZSBzZXJ2ZXIgdHlwZSB3YXMgbnVsbC4gUmV0dXJuIGZhbHNlLgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2VydmVyUnVudGltZVNlbGVjdGlvbigpIHsKLSAgICAvLyBDaGVjayBpZiB0aGUgZXh0ZW5zaW9uIGV4aXN0cwotICAgIGlmIChzZWxlY3Rpb25Nb2RlXyA9PSBNT0RFX1NFUlZJQ0UpIHsKLSAgICAgIGlmIChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8hPW51bGwgJiYgc2VsZWN0ZWRSdW50aW1lXyE9bnVsbCkgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIHdzc3J0ID0gd3NzcnRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUoc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfLCBzZWxlY3RlZFJ1bnRpbWVfLmdldElkKCksIHR5cGVJZF8pOwotICAgICAgLy8gcm0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIHdzc3J0ID0KLSAgICAgIC8vIHdzc3J0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlKHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXywKLSAgICAgIC8vIHNlbGVjdGVkUnVudGltZV8uZ2V0SWQoKSwgd3NlLmdldFdlYlNlcnZpY2VUeXBlKCkpOwotICAgICAgLy8gcm0gaWYgKHdzc3J0IT1udWxsICYmCi0gICAgICAvLyB3c3NydFJlZ2lzdHJ5LmlzU2VydmVyU3VwcG9ydGVkRm9yQ2hvc2VuVHlwZSh3c2UuZ2V0V2ViU2VydmljZVR5cGUoKSxzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8pKQotICAgICAgLy8gewotICAgICAgaWYgKHdzc3J0ICE9IG51bGwgJiYgd3NzcnRSZWdpc3RyeS5pc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUodHlwZUlkXywgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfKSkgewotICAgICAgICBzZXRPS1N0YXR1c01lc3NhZ2UoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzZXRFUlJPUlN0YXR1c01lc3NhZ2UoIiVNU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUyIpOwotICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8vIHJtIFN0cmluZyBjbGllbnRJZCA9Ci0gICAgICAvLyB3c2N0UmVnaXN0cnkuZ2V0Q2xpZW50VHlwZUlkQnlOYW1lKGNsaWVudFNjZW5hcmlvSWRfKTsKLSAgICAgIFN0cmluZyBjbGllbnRJZCA9IHR5cGVJZF87Ci0gICAgICAvLyBybSBTdHJpbmcgY2xpZW50SWQgPQotICAgICAgLy8gd3NjdFJlZ2lzdHJ5LmdldENsaWVudFR5cGVJZEJ5TmFtZSh3c2UuZ2V0UHJveHlTZWxlY3RlZCgpKTsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gd3NjdFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8pOwotCi0gICAgICBpZiAod3NzID09IG51bGwgfHwgc2VsZWN0ZWRSdW50aW1lXyA9PSBudWxsIHx8ICF3c2N0UmVnaXN0cnkud2ViU2VydmljZUNsaWVudFJ1bnRpbWVUeXBlRXhpc3RzKHdzcy5nZXRJZCgpLCBzZWxlY3RlZFJ1bnRpbWVfLmdldElkKCksIGNsaWVudElkKSkgewotICAgICAgICBzZXRFUlJPUlN0YXR1c01lc3NhZ2UoIiVNU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUyIpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHNldE9LU3RhdHVzTWVzc2FnZSgpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBEaXNhYmxlIE9LIGJ1dHRvbiBpZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gaXMgaW52YWxpZAotICAgIFRyZWVJdGVtW10gcnVudGltZVNlbCA9IHJ1bnRpbWVzTGlzdF8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHJ1bnRpbWVTZWwgPT0gbnVsbCB8fCBydW50aW1lU2VsLmxlbmd0aCA8PSAwIHx8IHJ1bnRpbWVTZWxbMF0uZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgIGRpc2FibGVPS0J1dHRvbigpOwotICAgIH0KLSAgICAvLyBEaXNhYmxlIE9LIGJ1dHRvbiBpZiBzZXJ2ZXIgc2VsZWN0aW9uIGlzIGludmFsaWQKLSAgICBUcmVlSXRlbVtdIHNlcnZlclNlbCA9IHNlcnZlckxpc3RfLmdldFNlbGVjdGlvbigpOwotICAgIFN0cmluZyBjdXJyZW50U2VsZWN0aW9uID0gKHNlcnZlclNlbCAhPSBudWxsICYmIHNlcnZlclNlbC5sZW5ndGggPiAwKSA/IHNlcnZlclNlbFswXS5nZXRUZXh0KCkgOiAiIjsKLSAgICBpZiAoc2VydmVyU2VsID09IG51bGwgfHwgY3VycmVudFNlbGVjdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICBkaXNhYmxlT0tCdXR0b24oKTsKLSAgICB9Ci0gICAgaWYgKCFzZXJ2ZXJMYWJlbHNfLmNvbnRhaW5zS2V5KGN1cnJlbnRTZWxlY3Rpb24pIHx8ICFleGlzdGluZ1NlcnZlcnNUYWJsZV8uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikpIHsKLSAgICAgIGRpc2FibGVPS0J1dHRvbigpOwotICAgICAgc2V0T0tTdGF0dXNNZXNzYWdlKCk7Ci0gICAgfQotICAgIC8vIERpc2FibGUgT0sgYnV0dG9uIGlmIGNhdGVnb3J5IGlzIHNlbGVjdGVkIHJhdGhlciB0aGFuIGEgc2VydmVyCi0gICAgaWYgKHNlcnZlclNlbC5sZW5ndGggPiAwICYmIHNlcnZlclNlbFswXS5nZXRJdGVtQ291bnQoKSE9MCkgewotICAgIAlkaXNhYmxlT0tCdXR0b24oKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCWVuYWJsZU9LQnV0dG9uKCk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldE9LU3RhdHVzTWVzc2FnZSgpIHsKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVQQUdFX0RFU0NfV1NfUlVOVElNRV9TRUxFQ1RJT04iKSk7Ci0gICAgQ29sb3IgYmxhY2sgPSBuZXcgQ29sb3IodGhpc1NoZWxsLmdldERpc3BsYXkoKSwgMHgwMCwgMCwgMCk7Ci0gICAgbWVzc2FnZUJhbm5lcl8uc2V0Rm9yZWdyb3VuZChibGFjayk7Ci0gICAgZW5hYmxlT0tCdXR0b24oKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRFUlJPUlN0YXR1c01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRUZXh0KGdldE1lc3NhZ2UobWVzc2FnZSkpOwotICAgIENvbG9yIHJlZCA9IG5ldyBDb2xvcih0aGlzU2hlbGwuZ2V0RGlzcGxheSgpLCAweEZGLCAwLCAwKTsKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0gICAgZGlzYWJsZU9LQnV0dG9uKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZGlzYWJsZU9LQnV0dG9uKCkgewotICAgIGlmIChnZXRCdXR0b24oMCkgIT0gbnVsbCkKLSAgICAgIGdldEJ1dHRvbigwKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBlbmFibGVPS0J1dHRvbigpIHsKLSAgICBpZiAoZ2V0QnV0dG9uKDApICE9IG51bGwpCi0gICAgICBnZXRCdXR0b24oMCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICBzZXRKMkVFVmVyc2lvbkZyb21KMkVFVmVyc2lvbkNvbWJvKCk7Ci0gICAgLy9qMmVlVmVyc2lvbiA9IChqMmVlVmVyc2lvbkNvbWJvLmdldEVuYWJsZWQoKSkgPyBqMmVlVmVyc2lvbkNvbWJvLmdldFRleHQoKSA6IG51bGw7Ci0gICAgc2V0UmV0dXJuQ29kZShPSyk7Ci0gICAgY2xvc2UoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRKMkVFVmVyc2lvbkZyb21KMkVFVmVyc2lvbkNvbWJvKCkKLSAgewotICAgIGlmIChqMmVlVmVyc2lvbkNvbWJvLmdldEVuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgajJlZUxhYmVsID0gajJlZVZlcnNpb25Db21iby5nZXRUZXh0KCk7Ci0gICAgICBTdHJpbmcgajJlZVZlcnNpb25TdHJpbmcgPSBKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb25Gcm9tTGFiZWwoajJlZUxhYmVsKTsKLSAgICAgIGlmIChqMmVlVmVyc2lvblN0cmluZyAhPSBudWxsICYmIGoyZWVWZXJzaW9uU3RyaW5nLmxlbmd0aCgpID4gMCkKLSAgICAgICAgajJlZVZlcnNpb24gPSBqMmVlVmVyc2lvblN0cmluZzsKLSAgICAgIGVsc2UKLSAgICAgICAgajJlZVZlcnNpb24gPSBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBqMmVlVmVyc2lvbiA9IG51bGw7ICAgIAotICB9Ci0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiBhbiBldmVudCBvY2N1cnMgb24gdGhlIHBhZ2UuIEhhbmRsZXMgdGhlIGV2ZW50IGFuZCByZXZhbGlkYXRlcyB0aGUgcGFnZS4KLSAgICogCi0gICAqIEBwYXJhbSBldmVudAotICAgKiAgICAgICAgICBUaGUgZXZlbnQgdGhhdCBvY2N1cmVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICBpZiAoIXZhbGlkYXRlT25fKQotICAgICAgcmV0dXJuOwotICAgIGVuYWJsZU9LQnV0dG9uKCk7Ci0gICAgaWYgKHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlUnVudGltZVZpZXdTZWxlY3Rpb25FdmVudCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmICh2aWV3U2VsZWN0aW9uQnlTZXJ2ZXJCdXR0b25fID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlU2VydmVyVmlld1NlbGVjdGlvbkV2ZW50KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKHZpZXdTZWxlY3Rpb25CeUV4cGxvcmVCdXR0b25fID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlRXhwbG9yZVZpZXdTZWxlY3Rpb25FdmVudCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChqMmVlVmVyc2lvbkNvbWJvID09IGV2ZW50LndpZGdldCkgewotICAgICAgc2V0SjJFRVZlcnNpb25Gcm9tSjJFRVZlcnNpb25Db21ibygpOwotICAgICAgLy9qMmVlVmVyc2lvbiA9IChqMmVlVmVyc2lvbkNvbWJvLmdldEVuYWJsZWQoKSkgPyBqMmVlVmVyc2lvbkNvbWJvLmdldFRleHQoKSA6IG51bGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKHJ1bnRpbWVzTGlzdF8gPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICBUcmVlSXRlbVtdIHJ1bnRpbWVTZWwgPSBydW50aW1lc0xpc3RfLmdldFNlbGVjdGlvbigpOwotICAgICAgcHJvY2Vzc1J1bnRpbWVMaXN0U2VsZWN0aW9uKHJ1bnRpbWVTZWxbMF0uZ2V0VGV4dCgpKTsKLSAgICAgIHZhbGlkYXRlU2VydmVyUnVudGltZVNlbGVjdGlvbigpOwotICAgICAgc2V0SjJFRVZlcnNpb25zKCk7Ci0gICAgICBzZXRKMkVFVmVyc2lvbkJhc2VkT25TZXJ2ZXIoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VydmVyTGlzdF8gPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICBwcm9jZXNzU2VydmVyTGlzdFNlbGVjdGlvbigpOwotICAgICAgdmFsaWRhdGVTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uKCk7Ci0gICAgICBzZXRKMkVFVmVyc2lvbkJhc2VkT25TZXJ2ZXIoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlUnVudGltZVZpZXdTZWxlY3Rpb25FdmVudCgpIHsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMTsKLSAgICBnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5sYXlvdXQoKTsKLQotICAgIC8vIFRPRE86IFNob3cgYWxsIHJ1bnRpbWVzLCBhbmQgb25seSBzZXJ2ZXJzIHN1cHBvcnRlZCBieSBjdXJyZW50IHR5cGUgaWQKLSAgfQotCi0gIC8vIAotICAvLyBDYWxsZWQgYnkgaGFuZGxlRXZlbnQoKSB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhlIGxheW91dCB0byB2aWV3Ci0gIC8vCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVNlcnZlclZpZXdTZWxlY3Rpb25FdmVudCgpIHsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMTsKLSAgICBnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5sYXlvdXQoKTsKLSAgICBzZXJ2ZXJzR3JvdXBfLnNldExvY2F0aW9uKDUsIDUpOwotICAgIHJ1bnRpbWVzR3JvdXBfLnNldExvY2F0aW9uKDQsIDEwMCk7Ci0gICAgc2VydmVyc0dyb3VwXy5sYXlvdXQoKTsKLSAgICBydW50aW1lc0dyb3VwXy5sYXlvdXQoKTsKLQotICAgIC8vIFRPRE86IFNob3cgYWxsIHNlcnZlcnMsIGFuZCBvbmx5IHJ1bnRpbWVzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCB0eXBlIGlkCi0gIH0KLQotICAvLyAKLSAgLy8gQ2FsbGVkIGJ5IGhhbmRsZUV2ZW50KCkgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoZSBsYXlvdXQgdG8gdmlldwotICAvLwotICBwcml2YXRlIHZvaWQgaGFuZGxlRXhwbG9yZVZpZXdTZWxlY3Rpb25FdmVudCgpIHsKLSAgICBHcmlkTGF5b3V0IGdsOwotICAgIGdsID0gKEdyaWRMYXlvdXQpIHByaW1hcnlHcm91cF8uZ2V0TGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0KGdsKTsKLSAgICBwcmltYXJ5R3JvdXBfLnNldExheW91dERhdGEoZ2QpOwotICAgIHByaW1hcnlHcm91cF8ubGF5b3V0KCk7Ci0KLSAgICAvLyBUT0RPOiBTaG93IGFsbCBzZXJ2ZXJzIGFuZCBydW50aW1lcyBmcm9tIHRoZSB0eXBlIGlkCi0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzUnVudGltZUxpc3RTZWxlY3Rpb24oU3RyaW5nIHJ1bnRpbWVOYW1lKSB7Ci0gICAgaWYgKHNlbGVjdGlvbk1vZGVfID09IE1PREVfU0VSVklDRSkgewotICAgICAgc2VsZWN0ZWRSdW50aW1lXyA9IHdzc3J0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUxhYmVsKHJ1bnRpbWVOYW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBzZWxlY3RlZFJ1bnRpbWVfID0gd3NjdFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VSdW50aW1lQnlOYW1lKHJ1bnRpbWVOYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NlcnZlckxpc3RTZWxlY3Rpb24oKSB7Ci0gICAgU3RyaW5nIGN1cnJlbnRTZWxlY3Rpb247Ci0gICAgVHJlZUl0ZW1bXSBzZXJ2ZXJTZWwgPSBzZXJ2ZXJMaXN0Xy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VydmVyU2VsICE9IG51bGwgJiYgc2VydmVyU2VsLmxlbmd0aCA+IDApIHsKLSAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBzZXJ2ZXJTZWxbMF0uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNlcnZlckxhYmVsc18uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikgfHwgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfLmNvbnRhaW5zS2V5KGN1cnJlbnRTZWxlY3Rpb24pKSB7Ci0gICAgICAgIGlmIChleGlzdGluZ1NlcnZlcnNUYWJsZV8uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikpIHsKLSAgICAgICAgICBzZWxlY3RlZFNlcnZlcl8gPSAoSVNlcnZlcikgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfLmdldChjdXJyZW50U2VsZWN0aW9uKTsKLSAgICAgICAgICBzZWxlY3RlZFNlcnZlckxhYmVsXyA9IGN1cnJlbnRTZWxlY3Rpb247Ci0gICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfID0gc2VsZWN0ZWRTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNlcnZlckxhYmVsc18uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikpIHsKLSAgICAgICAgICBUcmVlSXRlbSBwYXJlbnRJdGVtID0gc2VydmVyU2VsWzBdLmdldFBhcmVudEl0ZW0oKTsKLSAgICAgICAgICBpZiAocGFyZW50SXRlbSAhPSBudWxsICYmICFwYXJlbnRJdGVtLmdldFRleHQoKS5lcXVhbHNJZ25vcmVDYXNlKGdldE1lc3NhZ2UoIiVMQUJFTF9UUkVFX0VYSVNUSU5HX1NFUlZFUlMiKSkpIHsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyTGFiZWxfID0gY3VycmVudFNlbGVjdGlvbjsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyXyA9IG51bGw7Ci0gICAgICAgICAgICBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8gPSAoU3RyaW5nKSBzZXJ2ZXJMYWJlbHNfLmdldChjdXJyZW50U2VsZWN0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiBpc0V4aXN0aW5nU2VydmVyIG9yIG5ldyBTZXJ2ZXJUeXBlCi0gICAgICAgIFRyZWVJdGVtIHBhcmVudEl0ZW0gPSBzZXJ2ZXJTZWxbMF0uZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICBpZiAocGFyZW50SXRlbSAhPSBudWxsICYmIHBhcmVudEl0ZW0uZ2V0VGV4dCgpLmVxdWFsc0lnbm9yZUNhc2UoZ2V0TWVzc2FnZSgiJUxBQkVMX1RSRUVfRVhJU1RJTkdfU0VSVkVSUyIpKSkgewotICAgICAgICAgIHNldElzRXhpc3RpbmdTZXJ2ZXIodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgc2V0SXNFeGlzdGluZ1NlcnZlcihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzZWxlY3RlZFNlcnZlcl8gPSBudWxsOwotICAgICAgICBzZWxlY3RlZFNlcnZlckxhYmVsXyA9IG51bGw7Ci0gICAgICAgIHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyA9IG51bGw7Ci0gICAgICAgIHNldElzRXhpc3RpbmdTZXJ2ZXIoZmFsc2UpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9ICAgICAgCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2Uoa2V5LCBhcmdzKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRSdW50aW1lc0dyb3VwKCkgewotICAgIHJ1bnRpbWVzTGlzdF8ucmVtb3ZlQWxsKCk7Ci0gICAgU3RyaW5nW10gcnVudGltZXMgPSBudWxsOwotCi0gICAgaWYgKHNlbGVjdGlvbk1vZGVfID09IE1PREVfU0VSVklDRSkgewotICAgICAgcnVudGltZXMgPSB3c3NydFJlZ2lzdHJ5LmdldFJ1bnRpbWVzQnlUeXBlKHR5cGVJZF8pOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHJ1bnRpbWVzID0gd3NjdFJlZ2lzdHJ5LmdldEFsbENsaWVudFJ1bnRpbWVzKCk7Ci0gICAgfQotCi0gICAgVHJlZUl0ZW1bXSBydW50aW1lTmFtZSA9IG5ldyBUcmVlSXRlbVtydW50aW1lcy5sZW5ndGhdOwotCi0gICAgaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVMYWJlbCA9IGdldFJ1bnRpbWVMYWJlbChydW50aW1lc1tpXSk7Ci0gICAgICAgIHJ1bnRpbWVOYW1lW2ldID0gbmV3IFRyZWVJdGVtKHJ1bnRpbWVzTGlzdF8sIFNXVC5OT05FKTsKLSAgICAgICAgcnVudGltZU5hbWVbaV0uc2V0VGV4dChydW50aW1lTGFiZWwpOwotCi0gICAgICAgIGlmIChydW50aW1lc1tpXS5lcXVhbHNJZ25vcmVDYXNlKGRlZmF1bHRSdW50aW1lXykpIHsKLSAgICAgICAgICBydW50aW1lc0xpc3RfLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7IHJ1bnRpbWVOYW1lW2ldfSk7Ci0gICAgICAgICAgc2VsZWN0ZWRSdW50aW1lXyA9IGdldFJ1bnRpbWUocnVudGltZXNbaV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0UnVudGltZUxhYmVsKFN0cmluZyB0eXBlKSB7Ci0gICAgcmV0dXJuIGdldFJ1bnRpbWUodHlwZSkuZ2V0TGFiZWwoKTsKLSAgfQotCi0gIHByaXZhdGUgSVdlYlNlcnZpY2VSdW50aW1lIGdldFJ1bnRpbWUoU3RyaW5nIHR5cGUpIHsKLSAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKSB7Ci0gICAgICByZXR1cm4gd3NzcnRSZWdpc3RyeS5nZXRSdW50aW1lQnlJZCh0eXBlKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gd3NjdFJlZ2lzdHJ5LmdldFJ1bnRpbWVCeUlkKHR5cGUpOwotICAgIH0KLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHNlcnZlciBGYWN0b3J5IElkIGdpdmVuIGEgc2VydmVyIG5hbWUKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmVyU2VsZWN0aW9uRmFjdG9yeUlkKFN0cmluZyBzZWxlY3RlZFNlcnZlck5hbWUpIHsKLSAgICBpZiAoc2VydmVyTGFiZWxzXy5jb250YWluc0tleShzZWxlY3RlZFNlcnZlck5hbWUpICYmICFpc0V4aXN0aW5nU2VydmVyXykKLSAgICAgIHJldHVybiAoU3RyaW5nKSBzZXJ2ZXJMYWJlbHNfLmdldChzZWxlY3RlZFNlcnZlck5hbWUpOwotICAgIGVsc2UgewotICAgICAgcmV0dXJuICgoSVNlcnZlcikgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfLmdldChzZWxlY3RlZFNlcnZlck5hbWUpKS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIFNlcnZlcnNMaXN0IGNsYXNzCi0gICAqIAotICAgKiBDbGFzcyB3aGljaCBlYXNpbHkgY3JlYXRlcyB0aGUgVHJlZSBzdHJ1Y3R1cmUgYW5kIGVudHJpZXMgZm9yIGV4aXN0aW5nIHNlcnZlcnMgYW5kIHNlcnZlciB0eXBlcwotICAgKi8KLSAgcHVibGljIGNsYXNzIFNlcnZlcnNMaXN0IHsKLQotICAgIHByaXZhdGUgVHJlZUl0ZW1bXSBleGlzdGluZ1NlcnZlcnNUcmVlOwotICAgIHByaXZhdGUgVHJlZUl0ZW1bXSBzZXJ2ZXJUeXBlc1RyZWU7Ci0gICAgYm9vbGVhbiBleGlzdGluZ1NlcnZlciA9IGZhbHNlOwotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyVHJlZUl0ZW1zKFRyZWUgc2VydmVyc0xpc3QpIHsKLSAgICAgIHRoaXMuc2V0RXhpc3RpbmdTZXJ2ZXJzVHJlZShzZXJ2ZXJzTGlzdCk7Ci0gICAgICB0aGlzLnNldFNlcnZlclR5cGVzVHJlZShzZXJ2ZXJzTGlzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXJzVHJlZShUcmVlIHNlcnZlckxpc3QpIHsKLSAgICAgIFN0cmluZ1tdIHNlcnZlcklkcyA9IHRoaXMuZ2V0QWxsRXhpc3RpbmdTZXJ2ZXJzKCk7Ci0gICAgICBleGlzdGluZ1NlcnZlcnNUcmVlID0gbmV3IFRyZWVJdGVtWzFdOwotICAgICAgVHJlZUl0ZW1bXSBleGlzdGluZ1NlcnZlckl0ZW1zID0gbmV3IFRyZWVJdGVtW3NlcnZlcklkcy5sZW5ndGhdOwotICAgICAgZXhpc3RpbmdTZXJ2ZXJzVHJlZVswXSA9IG5ldyBUcmVlSXRlbShzZXJ2ZXJMaXN0LCBTV1QuTk9ORSk7Ci0gICAgICBleGlzdGluZ1NlcnZlcnNUcmVlWzBdLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1RSRUVfRVhJU1RJTkdfU0VSVkVSUyIpKTsKLSAgICAgIEltYWdlRGVzY3JpcHRvciBpZCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihFWElTVElOR19TRVJWRVJTX0lDT04pOwotICAgICAgaWYgKGlkICE9IG51bGwpCi0gICAgICAgIGV4aXN0aW5nU2VydmVyc1RyZWVbMF0uc2V0SW1hZ2UoaWQuY3JlYXRlSW1hZ2UoKSk7Ci0gICAgICBmb3IgKGludCBrID0gMDsgayA8IHNlcnZlcklkcy5sZW5ndGg7IGsrKykgewotICAgICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZSgoKElTZXJ2ZXIpIGV4aXN0aW5nU2VydmVyc1RhYmxlXy5nZXQoc2VydmVySWRzW2tdKSkuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgICAgICBpZiAoc2VydmVyVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgZXhpc3RpbmdTZXJ2ZXJJdGVtc1trXSA9IG5ldyBUcmVlSXRlbShleGlzdGluZ1NlcnZlcnNUcmVlWzBdLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgZXhpc3RpbmdTZXJ2ZXJJdGVtc1trXS5zZXRUZXh0KHNlcnZlcklkc1trXSk7Ci0gICAgICAgICAgaWYgKHNlcnZlcklkc1trXS5lcXVhbHNJZ25vcmVDYXNlKGRlZmF1bHRTZXJ2ZXJfKSAmJiBnZXRJc0V4aXN0aW5nU2VydmVyKCkpIHsKLSAgICAgICAgICAgIGV4aXN0aW5nU2VydmVyc1RyZWVbMF0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0gICAgICAgICAgICBzZXJ2ZXJMaXN0LnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7IGV4aXN0aW5nU2VydmVySXRlbXNba119KTsKLSAgICAgICAgICAgIGV4aXN0aW5nU2VydmVyID0gdHJ1ZTsKLSAgICAgICAgICAgIFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2cudGhpcy5zZXRJc0V4aXN0aW5nU2VydmVyKHRydWUpOwotICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJfID0gKElTZXJ2ZXIpIGV4aXN0aW5nU2VydmVyc1RhYmxlXy5nZXQoZGVmYXVsdFNlcnZlcl8pOwotICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJMYWJlbF8gPSBzZXJ2ZXJJZHNba107Ci0gICAgICAgICAgICBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8gPSBzZWxlY3RlZFNlcnZlcl8uZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGV4aXN0aW5nU2VydmVySXRlbXNba10uc2V0SW1hZ2UoU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKS5nZXRJbWFnZShzZXJ2ZXJUeXBlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUeXBlc1RyZWUoVHJlZSBzZXJ2ZXJMaXN0KSB7Ci0KLSAgICAgIFRyZWVJdGVtW10gc2VydmVyVHlwZXNUcmVlID0gbmV3IFRyZWVJdGVtWzFdOwotICAgICAgc2VydmVyVHlwZXNUcmVlWzBdID0gbmV3IFRyZWVJdGVtKHNlcnZlckxpc3QsIFNXVC5OT05FKTsKLSAgICAgIHNlcnZlclR5cGVzVHJlZVswXS5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9UUkVFX1NFUlZFUl9UWVBFUyIpKTsKLSAgICAgIEltYWdlRGVzY3JpcHRvciBpZCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihTRVJWRVJfVFlQRVNfSUNPTik7Ci0gICAgICBpZiAoaWQgIT0gbnVsbCkKLSAgICAgICAgc2VydmVyVHlwZXNUcmVlWzBdLnNldEltYWdlKGlkLmNyZWF0ZUltYWdlKCkpOwotICAgICAgSGFzaHRhYmxlIGNhdGVnb3JpZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgSGFzaHRhYmxlIGNhdGVnb3J5VHJlZUl0ZW0gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICBTdHJpbmdbXSBzZXJ2ZXJJZHMgPSBudWxsOwotICAgICAgLy8gcm0gU3RyaW5nIHdzdCA9IHdzZS5nZXRXZWJTZXJ2aWNlVHlwZSgpOwotICAgICAgaWYgKHNlbGVjdGlvbk1vZGVfID09IE1PREVfU0VSVklDRSkgewotICAgICAgICBzZXJ2ZXJJZHMgPSB3c3NydFJlZ2lzdHJ5LmdldFNlcnZlckZhY3RvcnlJZHNCeVR5cGUodHlwZUlkXyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgLy9zZXJ2ZXJJZHMgPSB3c2N0UmVnaXN0cnkuZ2V0U2VydmVyRmFjdG9yeUlkc0J5Q2xpZW50VHlwZSh0eXBlSWRfKTsKLSAgICAgICAgc2VydmVySWRzID0gd3NjdFJlZ2lzdHJ5LmdldEFsbENsaWVudFNlcnZlckZhY3RvcnlJZHMoKTsKLQotICAgICAgfQotICAgICAgLy8gcm0gc2VydmVySWQgPQotICAgICAgLy8gd3NzcnRSZWdpc3RyeS5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHdzZS5nZXRXZWJTZXJ2aWNlVHlwZSgpKTsKLSAgICAgIGlmIChzZXJ2ZXJJZHMgPT0gbnVsbCkgewotICAgICAgICBzZXJ2ZXJJZHMgPSBnZXRBbGxTZXJ2ZXJUeXBlcygpOwotICAgICAgfQotICAgICAgVHJlZUl0ZW1bXSBwYXJlbnQgPSBuZXcgVHJlZUl0ZW1bc2VydmVySWRzLmxlbmd0aF07Ci0gICAgICBUcmVlSXRlbVtdIGl0ZW0gPSBuZXcgVHJlZUl0ZW1bc2VydmVySWRzLmxlbmd0aF07Ci0gICAgICBpZiAoc2VydmVySWRzICE9IG51bGwpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBTdHJpbmcgc2VydmVyID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJMYWJlbEZvcklkKHNlcnZlcklkc1tpXSk7Ci0gICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLnRoaXMuc2VydmVyTGFiZWxzXy5wdXQoc2VydmVyLCBzZXJ2ZXJJZHNbaV0pOwotICAgICAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVySWRzW2ldKTsKLSAgICAgICAgICAgIElSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLSAgICAgICAgICAgIGlmICghY2F0ZWdvcmllc18uY29udGFpbnNLZXkoc2VydmVyVHlwZSkgJiYgcnVudGltZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICBjYXRlZ29yaWVzXy5wdXQoc2VydmVyVHlwZSwgcnVudGltZVR5cGUpOwotICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnlUcmVlSXRlbS5nZXQocnVudGltZVR5cGUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnlUZXh0ID0gcnVudGltZVR5cGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIEltYWdlIGNhdGVnb3J5SW1hZ2UgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKHJ1bnRpbWVUeXBlKTsKLSAgICAgICAgICAgICAgICBwYXJlbnRbaV0gPSBuZXcgVHJlZUl0ZW0oc2VydmVyVHlwZXNUcmVlWzBdLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgcGFyZW50W2ldLnNldFRleHQoY2F0ZWdvcnlUZXh0KTsKLSAgICAgICAgICAgICAgICBwYXJlbnRbaV0uc2V0SW1hZ2UoY2F0ZWdvcnlJbWFnZSk7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnlUcmVlSXRlbS5wdXQocnVudGltZVR5cGUsIHBhcmVudFtpXSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50W2ldID0gKFRyZWVJdGVtKSBjYXRlZ29yeVRyZWVJdGVtLmdldChydW50aW1lVHlwZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlUZXh0ID0gc2VydmVyVHlwZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIEltYWdlIGZhY3RvcnlJbWFnZSA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0SW1hZ2Uoc2VydmVyVHlwZSk7Ci0gICAgICAgICAgICAgIGl0ZW1baV0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50W2ldLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgIGl0ZW1baV0uc2V0VGV4dChmYWN0b3J5VGV4dCk7Ci0gICAgICAgICAgICAgIGl0ZW1baV0uc2V0SW1hZ2UoZmFjdG9yeUltYWdlKTsKLSAgICAgICAgICAgICAgaXRlbVtpXS5zZXREYXRhKHNlcnZlclR5cGUpOwotICAgICAgICAgICAgICBpZiAoZmFjdG9yeVRleHQuZXF1YWxzSWdub3JlQ2FzZShkZWZhdWx0U2VydmVyXykgJiYgIWV4aXN0aW5nU2VydmVyKSB7Ci0gICAgICAgICAgICAgICAgc2VydmVyTGlzdC5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyBpdGVtW2ldfSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJfID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFNlcnZlckxhYmVsXyA9IGZhY3RvcnlUZXh0OwotICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyA9IChTdHJpbmcpIHNlcnZlckxhYmVsc18uZ2V0KHNlbGVjdGVkU2VydmVyTGFiZWxfKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCBzZXJ2ZXJzIGluIHRoZSB3b3Jrc3BhY2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZ1tdIG9mIGV4aXN0aW5nIHNlcnZlciBuYW1lcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0QWxsRXhpc3RpbmdTZXJ2ZXJzKCkgewotICAgICAgVmVjdG9yIHNlcnZlcklkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLSAgICAgICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCE9MCkgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgc2VydmVyc1tpXTsKLSAgICAgICAgICAgIHNlcnZlcklkcy5hZGQoc2VydmVyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBleGlzdGluZ1NlcnZlcnNUYWJsZV8ucHV0KHNlcnZlci5nZXROYW1lKCksIHNlcnZlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKFN0cmluZ1tdKSBzZXJ2ZXJJZHMudG9BcnJheShuZXcgU3RyaW5nW3NlcnZlcklkcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIHNlcnZlciB0eXBlcyBhdmFpbGFibGUgZm9yIGNyZWF0aW9uCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmdbXSBvZiBzZXJ2ZXIgbmFtZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldEFsbFNlcnZlclR5cGVzKCkgewotICAgICAgVmVjdG9yIHNlcnZlclR5cGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIElTZXJ2ZXJUeXBlW10gZGVmYXVsdFNlcnZlcnNMaXN0ID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0U2VydmVyc0xpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IChJU2VydmVyVHlwZSkgZGVmYXVsdFNlcnZlcnNMaXN0W2ldOwotICAgICAgICBzZXJ2ZXJUeXBlc18uYWRkKHNlcnZlclR5cGUuZ2V0SWQoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKFN0cmluZ1tdKSBzZXJ2ZXJUeXBlc18udG9BcnJheShuZXcgU3RyaW5nW3NlcnZlclR5cGVzXy5zaXplKCldKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzM2E0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9UeXBlU2VsZWN0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgVHlwZVNlbGVjdGlvbkZpbHRlcgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRTZWxlY3Rpb25fOwotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVHlwZUJ5SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uLCBIYXNoTWFwIHdlYlNlcnZpY2VUeXBlcykKLSAgewotICAgICAgICAKLSAgICBIYXNoU2V0IHN1cHBvcnRlZFR5cGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmIGluaXRpYWxTZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgCi0gICAgICAvLyBDaGVjayBmb3IgbnVsbCBpbml0aWFsIHNlbGVjdGlvbgotICAgICAgT2JqZWN0IGluaXRpYWxPYmplY3QgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKGluaXRpYWxPYmplY3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICAvLyBNYXRjaCB1cCByZXNvdXJjZSB0eXBlIG1ldGFkYXRhIHdpdGggaW5pdGlhbCBzZWxlY3Rpb24KLSAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgSVdlYlNlcnZpY2VUeXBlIHdzdCA9IChJV2ViU2VydmljZVR5cGUpaXRlci5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0eXBlSWQgPSAoU3RyaW5nKXdzdC5nZXRJZCgpOwotICAgICAgICBpZiAoIXN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGVJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmdbXSByZXNvdXJjZVR5cGVzID0gd3N0LmdldFJlc291cmNlVHlwZU1ldGFkYXRhKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZXNbaV0hPW51bGwpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKChpbml0aWFsT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKS5lbmRzV2l0aChyZXNvdXJjZVR5cGVzW2ldKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihpbml0aWFsT2JqZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBuYW1lID0gaW5pdGlhbE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbml0aWFsT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRlbnNpb25zID0gd3N0LmdldEV4dGVuc2lvbk1ldGFkYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2VwdHNOYW1lKG5hbWUsIGV4dGVuc2lvbnMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzLmFkZCh0eXBlSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0gICAgCi0gIAotICAgIGlmIChzdXBwb3J0ZWRUeXBlcy5pc0VtcHR5KCkpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIChTdHJpbmdbXSlzdXBwb3J0ZWRUeXBlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLSAgfQotCi0KLSAgLy8KLSAgLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBuYW1lIGlzIGFjY2VwdGFibGUgYmFzZWQgdXBvbiBpdHMgZXh0ZW5zaW9uCi0gIC8vCi0gIHByaXZhdGUgYm9vbGVhbiBhY2NlcHRzTmFtZSAoIFN0cmluZyBuYW1lLCBTdHJpbmdbXSBleHRlbnNpb25zKQotICB7Ci0gICAgLy9SZXR1cm4gdHJ1ZSBpZiAiYWxsIiBleHRlbnNpb25zIGFyZSBzdXBwb3J0ZWQuCi0KLSAgICBpZiAoZXh0ZW5zaW9uc1swXSE9bnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uc1swXS5lcXVhbHMoImFsbCIpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uc1tpXSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoZXh0ZW5zaW9uc1tpXSkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25NZXRhZGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvVHlwZVNlbGVjdGlvbk1ldGFkYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OGMxMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvVHlwZVNlbGVjdGlvbk1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLSAgLy8KLSAgLy8gVGhpcyBjbGFzcyBob2xkcyB0aGUgc2V0IG9mIGRpc3Rpbmd1aXNoaW5nIGZhY3RvcnMgaW4gZGV0ZXJtaW5pbmcgCi0gIC8vIHRoZSBkZWZhdWx0IFdlYiBzZXJ2aWNlIHR5cGUuICBUaGUgZGVmYXVsdCBXZWIgU2VydmljZSB0eXBlIHdpbGwgYmUgZGV0ZXJtaW5lZAotICAvLyBieSBwYXR0ZXJuIG1hdGNoaW5nIHRoZSBpbml0aWFsIHNlbGVjdGlvbiB3aXRoIHRoZSBzdXBwb3J0ZWQgZXh0ZW5zaW9uIAotICAvLyBhbmQgdGhlIHJlc291cmNlIHR5cGUgbWV0YWRhdGEgc3BlY2lmaWVkIGluIHRoZSBtYW5pZmVzdCBmaWxlLgotICAvLwotICBwdWJsaWMgY2xhc3MgVHlwZVNlbGVjdGlvbk1ldGFkYXRhCi0gIHsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZXh0ZW5zaW9uTWV0YTsKLSAgICBwdWJsaWMgU3RyaW5nW10gcmVzb3VyY2VUeXBlTWV0YTsKLQotICAgIHB1YmxpYyBUeXBlU2VsZWN0aW9uTWV0YWRhdGEoU3RyaW5nIGV4dGVuc2lvbk1ELCBTdHJpbmcgcmVzb3VyY2VUeXBlTUQpCi0gICAgewotICAgICAgc2V0RXh0ZW5zaW9uTWV0YWRhdGEoZXh0ZW5zaW9uTUQpOwotICAgICAgc2V0UmVzb3VyY2VUeXBlTWV0YWRhdGEocmVzb3VyY2VUeXBlTUQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25NZXRhZGF0YShTdHJpbmcgZXh0ZW5zaW9uTWV0YWRhdGEpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihleHRlbnNpb25NZXRhZGF0YSk7Ci0gICAgICBleHRlbnNpb25NZXRhID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLSAgICAgIGludCBpPTA7Ci0gICAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBleHRlbiA9IChTdHJpbmcpc3QubmV4dFRva2VuKCk7Ci0gICAgICAgIGlmIChleHRlbiE9bnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGV4dGVuc2lvbk1ldGFbaV09ZXh0ZW47Ci0gICAgICAgIH0KLSAgICAgICAgaSsrOwotICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEV4dGVuc2lvbk1ldGFkYXRhKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9uTWV0YTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlTWV0YWRhdGEoU3RyaW5nIHJlc291cmNlVHlwZU1ldGFkYXRhKQotICAgIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVzb3VyY2VUeXBlTWV0YWRhdGEpOwotICAgICAgcmVzb3VyY2VUeXBlTWV0YSA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0gICAgICBpbnQgaT0wOwotICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVzb3VyY2VUeXBlID0gKFN0cmluZylzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgaWYgKHJlc291cmNlVHlwZSE9bnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFbaV09cmVzb3VyY2VUeXBlOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VUeXBlTWV0YWRhdGEoKQotICAgIHsKLSAgICAgIHJldHVybiByZXNvdXJjZVR5cGVNZXRhOwotICAgIH0KLQotICB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlNDM2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50cy5DbGllbnRQcmVBc3NlbWJseUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuQ2xpZW50UHJlRGVwbG95RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50cy5DbGllbnRQcmVEZXZlbG9wRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50cy5DbGllbnRQcmVJbnN0YWxsRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuTGFiZWxzQW5kSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5yZWdpc3RyeS5Db21tYW5kUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgaW1wbGVtZW50cyBDb21tYW5kUmVnaXN0cnkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBpbnN0YW5jZV87Ci0KLSAgcHJpdmF0ZSBWZWN0b3IgIGNvbmZpZ0VsZW1zXzsKLSAgcHJpdmF0ZSBIYXNoU2V0IHR5cGVOYW1lc187ICAvLyBubyBkdXBsaWNhdGUgY2xpZW50IHR5cGUgbmFtZXMKLSAgcHJpdmF0ZSBIYXNoTWFwIHR5cGVzXzsKLSAgcHJpdmF0ZSBIYXNoTWFwIGNsaWVudFR5cGVBbmRJZHNfOwotICBwcml2YXRlIEhhc2hNYXAgY2xpZW50SWRUb0xhYmVsXzsKLQotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZVNlcnZlcnM7Ci0gIHByaXZhdGUgSGFzaE1hcCB3ZWJTZXJ2aWNlUnVudGltZXM7Ci0gIHByaXZhdGUgSGFzaE1hcCB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXM7Ci0gIAotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeV87Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeV87Ci0gIHByaXZhdGUgQ2FuRmluaXNoUmVnaXN0cnkgICBjYW5GaW5pc2hSZWdpc3RyeV87Ci0gIHByaXZhdGUgSGFzaE1hcCAgICAgICAgICAgICBmYWN0b3J5Q2FjaGVfOwotICAgIAotICBwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkoKQotICB7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIExvYWRzIFdlYlNlcnZpY2VDbGllbnRUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBUaGlzIGlzIGRvbmUgYnkgcXVlcnlpbmcgdGhlIHBsdWdpbiByZWdpc3RyeSBmb3IgYWxsIGV4dGVuc2lvbnMKLSAgLy8gaGFuZ2luZyBvbiB0aGUgd2ViU2VydmljZUNsaWVudFR5cGUgZXh0ZW5zaW9uIHBvaW50LiBFeHRlbnNpb25zCi0gIC8vIG11c3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5qc3Qud3MudWkud2l6YXJkLldlYlNlcnZpY2VDbGllbnRUeXBlCi0gIC8vIGludGVyZmFjZS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGxvYWRUeXBlcyAoKQotICB7ICAgIAotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYlNlcnZpY2VDbGllbnRUeXBlIik7Ci0KLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8Y29uZmlnLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gY29uZmlnW2lkeF07Ci0KLSAgICAgIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VTZXJ2ZXIiKSkgeyAKLSAgICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSBuZXcgV2ViU2VydmljZVNlcnZlcihlbGVtKTsKLSAgICAgICAgd2ViU2VydmljZVNlcnZlcnMucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCB3c3MpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlUnVudGltZSIpKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VSdW50aW1lIHJ0ID0gbmV3IFdlYlNlcnZpY2VSdW50aW1lKGVsZW0pOwotICAgICAgICB3ZWJTZXJ2aWNlUnVudGltZXMucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCBydCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VDbGllbnRUeXBlIikpCi0gICAgICB7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZSggIm5hbWUiICk7ICAgICAgICAgICAgICAgIAotICAgICAgICB0eXBlTmFtZXNfLmFkZCggbmFtZSApOyAgCi0gICAgICAgIAotICAgICAgICBTdHJpbmcgdHlwZUlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoImNsaWVudFR5cGUiKTsKLSAgICAgICAgaWYgKHR5cGVJZD09bnVsbCkgewotICAgICAgICAgIHR5cGVJZCA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKTsgICAgICAgCi0gICAgICAgIGNsaWVudFR5cGVBbmRJZHNfLnB1dChuYW1lLCB0eXBlSWQpOwotICAgICAgICBTdHJpbmcgc2VydmVySWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgic2VydmVyIik7Ci0gICAgICAgIFN0cmluZyBydW50aW1lSWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgicnVudGltZSIpOwotICAgICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUgd3N0ID0gbmV3IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZShzZXJ2ZXJJZCwgcnVudGltZUlkLCB0eXBlSWQsIG5hbWUsIGVsZW0pOwotICAgICAgICB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXMucHV0KGlkLCB3c3QpOwotICAgICAgICB0eXBlc18ucHV0KGlkLCBudWxsICk7ICAKLSAgICAgICAgY2xpZW50SWRUb0xhYmVsXy5wdXQoIHR5cGVJZCwgbmFtZSApOwotICAgICAgfQotICAgICAgY29uZmlnRWxlbXNfLmFkZCggZWxlbSApOwotICAgICAgCi0gICAgfQotICB9Ci0KLSAKLSAgLyoqCi0gICogTG9hZHMgV2ViU2VydmljZUNsaWVudFR5cGUgb2JqZWN0cyBpbnRvIHRoaXMgcmVnaXN0cnkuCi0gICogU2VlIG1ldGhvZCBnZXRJbnN0YW5jZSgpLgotICAqLwotICBwcml2YXRlIHZvaWQgbG9hZCAoKQotICB7Ci0gICAgdHlwZU5hbWVzXyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgY29uZmlnRWxlbXNfID0gbmV3IFZlY3RvcigpOwotICAgIHR5cGVzXyAgICAgICA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgY2xpZW50VHlwZUFuZElkc18gPSBuZXcgSGFzaE1hcCgpOwotICAgIHdlYlNlcnZpY2VDbGllbnRUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgd2ViU2VydmljZVJ1bnRpbWVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICB3ZWJTZXJ2aWNlU2VydmVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgY2xpZW50SWRUb0xhYmVsXyAgPSBuZXcgSGFzaE1hcCgpOwotICAgIGxvYWRUeXBlcygpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkoKTsKLSAgICAgIGluc3RhbmNlXy5sb2FkKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUnVudGltZSBnZXRSdW50aW1lQnlJZCggU3RyaW5nIGlkICkKLSAgewotICAgIHJldHVybiAoV2ViU2VydmljZVJ1bnRpbWUpd2ViU2VydmljZVJ1bnRpbWVzLmdldCggaWQgKTsgCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZXNCeVR5cGUoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1zID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQodHlwZUlkKTsKLSAgICBWZWN0b3IgcnVudGltZXNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nW10gcnVudGltZUlkcyA9IG5ldyBTdHJpbmdbZWxlbXMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpPTA7IGk8ZWxlbXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KWVsZW1zW2ldOwotICAgICAgcnVudGltZUlkc1tpXSA9IGVsZW0uZ2V0QXR0cmlidXRlKCJydW50aW1lIik7Ci0gICAgfQotICAgIHJldHVybiBydW50aW1lSWRzOyAgICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZG9lc1J1bnRpbWVTdXBwb3J0SjJFRUxldmVsKFN0cmluZyBqMmVlVmVyc2lvbklkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgSVdlYlNlcnZpY2VSdW50aW1lIHdzciA9IChJV2ViU2VydmljZVJ1bnRpbWUpd2ViU2VydmljZVJ1bnRpbWVzLmdldChydW50aW1lSWQpOwotICAgIFN0cmluZ1tdIGoyZWVWZXJzaW9ucyA9IHdzci5nZXRKMkVFVmVyc2lvbnMoKTsKLSAgICBpZiAoajJlZVZlcnNpb25zPT1udWxsIHx8IGoyZWVWZXJzaW9ucy5sZW5ndGg9PTApIAotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgZm9yKGludCBpPTA7IGk8ajJlZVZlcnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChqMmVlVmVyc2lvbnNbaV0uZXF1YWxzKGoyZWVWZXJzaW9uSWQpKQotICAgICAgewotICAgICAgCXJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gIAotICAKLSAgcHVibGljIGJvb2xlYW4gZG9lc1J1bnRpbWVTdXBwb3J0U2VydmVyVGFyZ2V0KFN0cmluZyBzZXJ2ZXJUYXJnZXRJZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIC8vVmVjdG9yIHNlcnZlckZhY3RvcnlJZHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXQgPSB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUgd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlKWl0Lm5leHQoKTsKLSAgICAgIGlmICh3c3NydC5ydW50aW1lSWRfIT1udWxsKSB7Ci0gICAgICAgIGlmICgod3NzcnQucnVudGltZUlkXykuZXF1YWxzSWdub3JlQ2FzZShydW50aW1lSWQpKSB7Ci0gICAgICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcil3ZWJTZXJ2aWNlU2VydmVycy5nZXQod3NzcnQuc2VydmVySWRfKTsKLSAgICAgICAgICBTdHJpbmcgdGhpc0ZhY3RvcnlJZCA9IHdzcy5nZXRGYWN0b3J5SWQoKTsKLSAgICAgICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZSh0aGlzRmFjdG9yeUlkKTsKLSAgICAgICAgICBpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgCi0gICAgICAgICAgU3RyaW5nIHRoaXNTZXJ2ZXJUYXJnZXRJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOyAgICAgICAgICAKLSAgICAgICAgICBpZiAodGhpc1NlcnZlclRhcmdldElkLmVxdWFscyhzZXJ2ZXJUYXJnZXRJZCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VDbGllbnRUeXBlPC9jb2RlPgotICAqIG9iamVjdHMuCi0gICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZUNsaWVudFR5cGU8L2NvZGU+Ci0gICogb2JqZWN0cy4KLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VDbGllbnRUeXBlTmFtZXMgKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nW10pdHlwZU5hbWVzXy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICk7Ci0gIH0KLQotICBwdWJsaWMgTGFiZWxzQW5kSWRzIGdldENsaWVudFR5cGVMYWJlbHMoKQotICB7Ci0gICAgTGFiZWxzQW5kSWRzIGxhYmVsSWRzID0gbmV3IExhYmVsc0FuZElkcygpOwotICAgIEl0ZXJhdG9yICAgICBpdGVyYXRvciA9IGNsaWVudElkVG9MYWJlbF8uZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgIGludCAgICAgICAgICBzaXplICAgICA9IGNsaWVudElkVG9MYWJlbF8uc2l6ZSgpOwotICAgIFN0cmluZ1tdICAgICBsYWJlbHMgICA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgU3RyaW5nW10gICAgIGlkcyAgICAgID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICBpbnQgICAgICAgICAgaW5kZXggICAgPSAwOwotICAgIAotICAgIGxhYmVsSWRzLnNldExhYmVsc18oIGxhYmVscyApOwotICAgIGxhYmVsSWRzLnNldElkc18oIGlkcyApOwotICAgIAotICAgIHdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSAKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIAotICAgICAgaWRzW2luZGV4XSAgICA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBsYWJlbHNbaW5kZXhdID0gKFN0cmluZyllbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgaW5kZXgrKzsKLSAgICB9ICAgIAotICAgIAotICAgIHJldHVybiBsYWJlbElkczsKLSAgfQotICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdpdmVuIHRoZSBzZXJ2ZXIsIHJ1bnRpbWUsIGFuZCB0eXBlIGF0dHJpYnV0ZXMKLSAgKiBUaGUgYmVuZWZpdCBvZiBnZXR0aW5nIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBjbGFzcwotICAqIGZpbGUgYW5kIHBsdWdpbiBhcmUgbm90IGxvYWRlZCBpbW1lZGlhdGVseS4KLSAgKiBAcGFyYW0gc2VydmVyIGxhYmVsCi0gICogQHBhcmFtIHJ1bnRpbWUgbGFiZWwKLSAgKiBAcGFyYW0gdHlwZSBsYWJlbAotICAqIEByZXR1cm4gSUNvbmZpZ3VyYXRpb24gZWxlbWVudAotICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKFN0cmluZyBzZXJ2ZXJJZCwgU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSlpdGVyLm5leHQoKTsKLSAgICAgICAgaWYgKHdzc3J0Lmhhc0NvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKHNlcnZlcklkLCBydW50aW1lSWQsIHR5cGVJZCkpIHsKLSAgICAgICAgICByZXR1cm4gd3NzcnQuZWxlbWVudF87Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAKLSAgfQotICAKLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWdFbGVtZW50Rm9yKFN0cmluZyBmYWN0b3J5SWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZUNsaWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUpaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmICh3c3NydC5oYXNDb25maWdFbGVtZW50Rm9yKGZhY3RvcnlJZCwgcnVudGltZUlkLCB0eXBlSWQpKSB7Ci0gICAgICAgICAgcmV0dXJuIHdzc3J0LmVsZW1lbnRfOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEV4dGVuc2lvbklkRm9yKFN0cmluZyBzZXJ2ZXJJZCwgU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIHR5cGVJZCkgewotICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVySWQsIHJ1bnRpbWVJZCwgdHlwZUlkKTsKLSAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gIH0KLQotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50QnlJZChTdHJpbmcgaWQpIHsKLSAgICAKLSAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUgd3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUpd2ViU2VydmljZUNsaWVudFR5cGVzLmdldChpZCk7Ci0gICAgcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnQpd3NydC5lbGVtZW50XzsgICAgCi0KLSAgfQotICAKLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbmZpZ3VyYXRpb25FbGVtZW50KFN0cmluZyBjbGllbnRUeXBlSWQpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlnRWxlbXNfLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KWl0Lm5leHQoKTsKLSAgICAgIFN0cmluZyBjbGllbnRUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsaWVudFR5cGUiKTsKLSAgICAgIGlmIChjbGllbnRUeXBlICE9IG51bGwgJiYgY2xpZW50VHlwZS5lcXVhbHMoY2xpZW50VHlwZUlkKSkKLSAgICAgICAgdi5hZGQoZWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pdi50b0FycmF5KG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF0pOwotICB9Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbmZpZ3VyYXRpb25FbGVtZW50KFN0cmluZyBjbGllbnRUeXBlSWQsIFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlnRWxlbXNfLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KWl0Lm5leHQoKTsKLSAgICAgIFN0cmluZyBjbGllbnRUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsaWVudFR5cGUiKTsKLSAgICAgIFN0cmluZyBydW50aW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJ1bnRpbWUiKTsKLSAgICAgIGlmIChjbGllbnRUeXBlICE9IG51bGwgJiYgcnVudGltZSAhPSBudWxsICYmIGNsaWVudFR5cGUuZXF1YWxzKGNsaWVudFR5cGVJZCkgJiYgcnVudGltZS5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgICAgdi5hZGQoZWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiAoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10pdi50b0FycmF5KG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF0pOwotICB9Ci0gIAotCi0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJZEZvckZhY3RvcnlJZChTdHJpbmcgZmFjdG9yeUlkKSB7Ci0KLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVNlcnZlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NzLmdldEZhY3RvcnlJZCgpLmVxdWFscyhmYWN0b3J5SWQpKSB7Ci0gICAgICAgIHJldHVybiB3c3MuZ2V0SWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyRmFjdG9yeUlkQnlTZXJ2ZXJMYWJlbChTdHJpbmcgbGFiZWwpIHsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVNlcnZlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NzLmdldExhYmVsKCkuZXF1YWxzKGxhYmVsKSkgewotICAgICAgICByZXR1cm4gd3NzLmdldEZhY3RvcnlJZCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUnVudGltZSBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5TmFtZShTdHJpbmcgcnVudGltZU5hbWUpIHsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVJ1bnRpbWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoV2ViU2VydmljZVJ1bnRpbWUpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NyLmdldExhYmVsKCkuZXF1YWxzKHJ1bnRpbWVOYW1lKSkgewotICAgICAgICByZXR1cm4gd3NyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlU2VydmVyIGdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChTdHJpbmcgZmFjdG9yeUlkKSB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzcy5nZXRGYWN0b3J5SWQoKS5lcXVhbHMoZmFjdG9yeUlkKSkgewotICAgICAgICByZXR1cm4gd3NzOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJbnN0YW5jZUxhYmVsRnJvbUluc3RhbmNlSWQoIFN0cmluZyBpbnN0YW5jZUlkICkKLSAgewotICAgIElTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKCBpbnN0YW5jZUlkICk7Ci0gICAgCi0gICAgcmV0dXJuIHNlcnZlci5nZXROYW1lKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBbGxDbGllbnRTZXJ2ZXJGYWN0b3J5SWRzKCkgewotICAgIFN0cmluZ1tdIHNlcnZlckZhY3RvcnlJZHMgPSBuZXcgU3RyaW5nW3dlYlNlcnZpY2VTZXJ2ZXJzLnNpemUoKV07Ci0gICAgaW50IGk9MDsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVNlcnZlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NzLmdldEZhY3RvcnlJZCgpIT1udWxsKSB7Ci0gICAgICAgIHNlcnZlckZhY3RvcnlJZHNbaV09d3NzLmdldEZhY3RvcnlJZCgpOwotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SWRzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFsbENsaWVudFJ1bnRpbWVzKCkgewotICAgIFN0cmluZ1tdIHJ1bnRpbWVzID0gbmV3IFN0cmluZ1t3ZWJTZXJ2aWNlUnVudGltZXMuc2l6ZSgpXTsKLSAgICBpbnQgaT0wOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlUnVudGltZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgIFdlYlNlcnZpY2VSdW50aW1lIHdzciA9IChXZWJTZXJ2aWNlUnVudGltZSlpdGVyLm5leHQoKTsKLSAgICAgIGlmICh3c3IuZ2V0SWQoKSAhPSBudWxsKSB7Ci0gICAgICAgIHJ1bnRpbWVzW2ldPXdzci5nZXRJZCgpOwotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBydW50aW1lczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUxhYmVsQnlJZChTdHJpbmcgcnVudGltZUlkKSB7Ci0gICAgV2ViU2VydmljZVJ1bnRpbWUgd3NSdW50aW1lID0gKFdlYlNlcnZpY2VSdW50aW1lKXdlYlNlcnZpY2VSdW50aW1lcy5nZXQocnVudGltZUlkKTsKLSAgICBpZiAod3NSdW50aW1lIT1udWxsKSB7Ci0gICAgICByZXR1cm4gd3NSdW50aW1lLmdldExhYmVsKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRUeXBlSWRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gKFN0cmluZyljbGllbnRUeXBlQW5kSWRzXy5nZXQobmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJV2ViU2VydmljZVJ1bnRpbWUgZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICByZXR1cm4gKElXZWJTZXJ2aWNlUnVudGltZSl3ZWJTZXJ2aWNlUnVudGltZXMuZ2V0KHJ1bnRpbWVJZCk7IAotICB9Ci0KLQotICAvKioKLSAgKiBHZXRzIHRoZSBydW50aW1lIElEcyBvZiBhbGwgd2ViIHNlcnZpY2Ugc2VydmVyIHJ1bnRpbWUgdHlwZQotICAqIHdpdGggYW4gc2VydmVyIGZhY3RvcnkgSUQgZXF1YWxzIHRvIHRoZSBpbnB1dAotICAqIEBwYXJhbSBzZXJ2ZXIgZmFjdG9yeSBJRAotICAqIEByZXR1cm4gYXJyYXkgb2YgcnVudGltZSBJRHMKLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVJZHNCeVNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlEKSB7Ci0gICAgVmVjdG9yIHJ1bnRpbWVJZHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXQgPSB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUgd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlKWl0Lm5leHQoKTsKLSAgICAgIGlmICh3c3NydC5zZXJ2ZXJJZF8hPW51bGwpIHsKLSAgICAgIAlTdHJpbmcgc2VydmVySWQgPSB3c3NydC5zZXJ2ZXJJZF87Ci0gICAgICAJV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcil3ZWJTZXJ2aWNlU2VydmVycy5nZXQoc2VydmVySWQpOwotICAgICAgCVN0cmluZyB3c3NmSWQgPSB3c3MuZ2V0RmFjdG9yeUlkKCk7Ci0gICAgICAJaWYgKHdzc2ZJZC5lcXVhbHMoc2VydmVyRmFjdG9yeUlEKSkKLSAgICAgIAkJcnVudGltZUlkcy5hZGQod3NzcnQucnVudGltZUlkXyk7Ci0gICAgICAJLyoKLSAgICAgICAgU3RyaW5nIHdzc0ZhY3RvcnlJZCA9ICgoV2ViU2VydmljZVNlcnZlcil3ZWJTZXJ2aWNlU2VydmVycy5nZXQod3NzcnQuc2VydmVySWRfKSkuZ2V0RmFjdG9yeUlkKCk7Ci0gICAgICAgIGlmICh3c3NGYWN0b3J5SWQuZXF1YWxzSWdub3JlQ2FzZShzZXJ2ZXJGYWN0b3J5SUQpKSB7Ci0gICAgICAgICAgcnVudGltZUlkcy5hZGQod3NzcnQucnVudGltZUlkXyk7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChTdHJpbmdbXSlydW50aW1lSWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmVyRmFjdG9yeUlkc0J5Q2xpZW50VHlwZShTdHJpbmcgY2xpZW50VHlwZU5hbWUpIHsKLSAgICAKLSAgICBWZWN0b3IgZmFjdG9yeUlkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBTdHJpbmcgY2xpZW50VHlwZUlkID0gZ2V0Q2xpZW50VHlwZUlkQnlOYW1lKGNsaWVudFR5cGVOYW1lKTsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZUNsaWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAoKHdzc3J0LnR5cGVJZF8pLmVxdWFsc0lnbm9yZUNhc2UoY2xpZW50VHlwZUlkKSkgewotICAgICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKXdlYlNlcnZpY2VTZXJ2ZXJzLmdldCh3c3NydC5zZXJ2ZXJJZF8pOwotICAgICAgICBmYWN0b3J5SWRzLmFkZCh3c3MuZ2V0RmFjdG9yeUlkKCkpOwotICAgICAgfQotICAKLSAgICB9Ci0gICAgcmV0dXJuIChTdHJpbmdbXSlmYWN0b3J5SWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7ICAgCi0KLSAgfQotCi0gIC8qKgotICAqIEdldHMgdGhlIHNlcnZlciBmYWN0b3J5SWRzIG9mIGFsbCB3ZWIgc2VydmljZSBzZXJ2ZXIgcnVudGltZSB0eXBlCi0gICogd2l0aCBhbiBydW50aW1lIElkIGVxdWFscyB0byB0aGUgaW5wdXQKLSAgKiBAcGFyYW0gcnVudGltZSBJZAotICAqIEByZXR1cm4gYXJyYXkgb2YgZmFjdG9yeSBJZHMKLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckZhY3RvcnlJZHNCeVJ1bnRpbWVJZChTdHJpbmcgcnVudGltZUlEKSB7Ci0gICAgVmVjdG9yIHNlcnZlckZhY3RvcnlJZHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXQgPSB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUgd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlKWl0Lm5leHQoKTsKLSAgICAgIGlmICh3c3NydC5ydW50aW1lSWRfIT1udWxsKSB7Ci0gICAgICAgIGlmICgod3NzcnQucnVudGltZUlkXykuZXF1YWxzSWdub3JlQ2FzZShydW50aW1lSUQpKSB7Ci0gICAgICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcil3ZWJTZXJ2aWNlU2VydmVycy5nZXQod3NzcnQuc2VydmVySWRfKTsKLSAgICAgICAgICBzZXJ2ZXJGYWN0b3J5SWRzLmFkZCh3c3MuZ2V0RmFjdG9yeUlkKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10pc2VydmVyRmFjdG9yeUlkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gd2ViU2VydmljZUNsaWVudFJ1bnRpbWVUeXBlRXhpc3RzKFN0cmluZyBzZXJ2ZXJJZCwgU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIHR5cGVJZCkgewotICAgIGlmIChnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXJJZCwgcnVudGltZUlkLCB0eXBlSWQpPT1udWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmVyRmFjdG9yeUlkc0J5VHlwZShTdHJpbmcgY2xpZW50VHlwZUlkKQotICB7Ci0gICAgU3RyaW5nIGNsaWVudFR5cGVOYW1lID0gKFN0cmluZyljbGllbnRJZFRvTGFiZWxfLmdldChjbGllbnRUeXBlSWQpOwotICAgIHJldHVybiBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlDbGllbnRUeXBlKGNsaWVudFR5cGVOYW1lKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJTdXBwb3J0ZWRGb3JDaG9zZW5UeXBlKFN0cmluZyBjbGllbnRUeXBlSWQsIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SUQpCi0gIHsKLSAgICBTdHJpbmdbXSBzdXBwb3J0ZWRTZXJ2ZXJGYWN0b3J5SWRzID0gZ2V0U2VydmVyRmFjdG9yeUlkc0J5VHlwZShjbGllbnRUeXBlSWQpOwotICAgIGlmIChzdXBwb3J0ZWRTZXJ2ZXJGYWN0b3J5SWRzIT1udWxsICYmIHN1cHBvcnRlZFNlcnZlckZhY3RvcnlJZHMubGVuZ3RoPjApCi0gICAgewotCSAgICBmb3IgKGludCBpPTA7IGk8c3VwcG9ydGVkU2VydmVyRmFjdG9yeUlkcy5sZW5ndGg7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzdXBwb3J0ZWRTZXJ2ZXJGYWN0b3J5SWRzW2ldLmVxdWFscyhzZXJ2ZXJGYWN0b3J5SUQpKQotCSAgICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAKLQotICAvKioKLSAgKiAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIGlzIHRoZSBjYWNoZWQgbWV0YWRhdGEgaW5jbHVkaW5nIHRoZSBJQ29uZmlndXJhdGlvbgotICAqLwotICBwdWJsaWMgZmluYWwgY2xhc3MgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlCi0gIHsKLSAgICAKLSAgIHByaXZhdGUgU3RyaW5nIHR5cGVJZF8gPSBudWxsOwotICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVySWRfID0gbnVsbDsKLSAgIHByaXZhdGUgU3RyaW5nIHJ1bnRpbWVJZF8gPSBudWxsOwotICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudF87Ci0gICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNTZXJ2ZXJSdW50aW1lXyA9IGZhbHNlOwotICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWxfOwotICAgCi0gICBwcm90ZWN0ZWQgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlKFN0cmluZyBzZXJ2ZXJJZCwgU3RyaW5nIHJ1bnRpbWVJZCxTdHJpbmcgdHlwZUlkLCBTdHJpbmcgbGFiZWwsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtKQotICAgewotICAgIHR5cGVJZF8gPSBuZXcgU3RyaW5nKHR5cGVJZC50cmltKCkpOwotICAgIGlmIChzZXJ2ZXJJZCE9bnVsbCkKLSAgICAgIHNlcnZlcklkXyA9IG5ldyBTdHJpbmcoc2VydmVySWQudHJpbSgpKTsKLSAgICBpZiAocnVudGltZUlkIT1udWxsKQotICAgICAgcnVudGltZUlkXyA9IG5ldyBTdHJpbmcocnVudGltZUlkLnRyaW0oKSk7Ci0gICAgZWxlbWVudF8gPSBlbGVtOwotICAgIGlmIChzZXJ2ZXJJZF8hPW51bGwgJiYgcnVudGltZUlkXyE9bnVsbCkgewotICAgICAgcmVxdWlyZXNTZXJ2ZXJSdW50aW1lXyA9IHRydWU7Ci0gICAgfQotCi0gICAgbGFiZWxfID0gbGFiZWw7Ci0gICB9Ci0KLSAgIHB1YmxpYyBib29sZWFuIGhhc0NvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKFN0cmluZyBzZXJ2ZXJJRCwgU3RyaW5nIHJ1bnRpbWVJRCwgU3RyaW5nIHR5cGVJRCkgewotICAgIGlmICh0eXBlSWRfLmVxdWFsc0lnbm9yZUNhc2UodHlwZUlEKSAmJiAhcmVxdWlyZXNTZXJ2ZXJSdW50aW1lXykKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKHJlcXVpcmVzU2VydmVyUnVudGltZV8pIHsKLSAgICAgIGlmICh0eXBlSWRfLmVxdWFsc0lnbm9yZUNhc2UodHlwZUlEKSAmJgotICAgICAgICAgc2VydmVySWRfLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmVySUQpICYmCi0gICAgICAgICBydW50aW1lSWRfLmVxdWFsc0lnbm9yZUNhc2UocnVudGltZUlEKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLSAgIAotICAgcHVibGljIGJvb2xlYW4gaGFzQ29uZmlnRWxlbWVudEZvcihTdHJpbmcgZmFjdG9yeUlELCBTdHJpbmcgcnVudGltZUlELCBTdHJpbmcgdHlwZUlEKSB7Ci0gICAgIGlmICh0eXBlSWRfLmVxdWFsc0lnbm9yZUNhc2UodHlwZUlEKSAmJiAhcmVxdWlyZXNTZXJ2ZXJSdW50aW1lXykKLSAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICBpZiAocmVxdWlyZXNTZXJ2ZXJSdW50aW1lXykgCi0gICAgIHsKLSAgICAgICBTdHJpbmcgc2VydmVySUQgPSBnZXRTZXJ2ZXJJZEZvckZhY3RvcnlJZCggZmFjdG9yeUlEICk7IAotICAgICAgIAotICAgICAgIGlmICh0eXBlSWRfLmVxdWFsc0lnbm9yZUNhc2UodHlwZUlEKSAmJgotICAgICAgICAgIHNlcnZlcklkXy5lcXVhbHNJZ25vcmVDYXNlKHNlcnZlcklEKSAmJgotICAgICAgICAgIHJ1bnRpbWVJZF8uZXF1YWxzSWdub3JlQ2FzZShydW50aW1lSUQpKQotICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgIH0KLSAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgIAotICAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDbGllbnRUeXBlQ29uZmlndXJhdGlvbkVsZW1lbnRGb3IoU3RyaW5nIHNlcnZlcklELCBTdHJpbmcgcnVudGltZUlELCBTdHJpbmcgdHlwZUlEKQotICAgewotICAgIGlmICh0aGlzLnR5cGVJZF8uZXF1YWxzSWdub3JlQ2FzZSh0eXBlSUQpICYmIHNlcnZlcklEPT1udWxsICYmIHJ1bnRpbWVJRD09bnVsbCkKLSAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRfOwotICAgIAotICAgIGlmICh0aGlzLnR5cGVJZF8uZXF1YWxzSWdub3JlQ2FzZSh0eXBlSUQpICYmIAotICAgICAgIHRoaXMuc2VydmVySWRfLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmVySUQpICYmIAotICAgICAgIHRoaXMucnVudGltZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHJ1bnRpbWVJRCkpCi0gICAgICByZXR1cm4gdGhpcy5lbGVtZW50XzsKLSAgICByZXR1cm4gbnVsbDsKLSAgIH0gCi0gIH0KLSAgCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSBnZXRGYWN0b3J5RmFjdG9yeSggU3RyaW5nW10gaWRzICkKLSAgewotICAgIFN0cmluZyAgICAgICAgICAgICAgICBoYXNoS2V5ID0gaWRzWzJdICsgIiMiICsgaWRzWzFdICsgIiMiICsgaWRzWzBdOwotICAgIENvbW1hbmRXaWRnZXRCaW5kaW5nICBiaW5kaW5nID0gKENvbW1hbmRXaWRnZXRCaW5kaW5nKWZhY3RvcnlDYWNoZV8uZ2V0KCBoYXNoS2V5ICk7Ci0gICAgCi0gICAgaWYoIGJpbmRpbmcgPT0gbnVsbCApCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRDb25maWdFbGVtZW50Rm9yKCBpZHNbMl0sIGlkc1sxXSwgaWRzWzBdICk7IAotICAgIAotICAgICAgaWYoIGVsZW1lbnQgPT0gbnVsbCApIHJldHVybiBudWxsOwotICAgIAotICAgICAgYmluZGluZyA9IGNyZWF0ZUJpbmRpbmcoIGVsZW1lbnQgKTsKLSAgICAgIAotICAgICAgZmFjdG9yeUNhY2hlXy5wdXQoIGhhc2hLZXksIGJpbmRpbmcgKTsKLSAgICAgIAotICAgICAgYmluZGluZy5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YU1hcHBpbmdSZWdpc3RyeV8gKTsKLSAgICAgIAotICAgICAgaWYoIHdpZGdldFJlZ2lzdHJ5XyAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKCB3aWRnZXRSZWdpc3RyeV8gKTsKLSAgICAgICAgYmluZGluZy5yZWdpc3RlckNhbkZpbmlzaCggY2FuRmluaXNoUmVnaXN0cnlfICk7Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgICAKLSAgICByZXR1cm4gYmluZGluZzsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgQ29tbWFuZFdpZGdldEJpbmRpbmcgY3JlYXRlQmluZGluZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCApIAotICB7Ci0gICAgVmVjdG9yIGJpbmRpbmdzID0gbmV3IFZlY3Rvcig0KTsKLSAgICBWZWN0b3IgZnJhZ21lbnRzID0gbmV3IFZlY3Rvcig0KTsKLSAgICAKLSAgICBhZGRCaW5kaW5nKCBlbGVtZW50LCAiZGV2ZWxvcEJpbmRpbmciLCBiaW5kaW5ncyApOwotICAgIGFkZEJpbmRpbmcoIGVsZW1lbnQsICJhc3NlbWJseUJpbmRpbmciLCBiaW5kaW5ncyApOwotICAgIGFkZEJpbmRpbmcoIGVsZW1lbnQsICJkZXBsb3lCaW5kaW5nIiwgYmluZGluZ3MgKTsKLSAgICBhZGRCaW5kaW5nKCBlbGVtZW50LCAiaW5zdGFsbEJpbmRpbmciLCBiaW5kaW5ncyApOwotICAgIAotICAgIGZyYWdtZW50cy5hZGQoIG5ldyBDbGllbnRQcmVEZXZlbG9wRnJhZ21lbnQoKSApOwotICAgIGZyYWdtZW50cy5hZGQoIG5ldyBDbGllbnRQcmVBc3NlbWJseUZyYWdtZW50KCkgKTsKLSAgICBmcmFnbWVudHMuYWRkKCBuZXcgQ2xpZW50UHJlRGVwbG95RnJhZ21lbnQoKSApOwotICAgIGZyYWdtZW50cy5hZGQoIG5ldyBDbGllbnRQcmVJbnN0YWxsRnJhZ21lbnQoKSApOwotICAgICAKLSAgICByZXR1cm4gbmV3IENvbW1hbmRXaWRnZXRCaW5kaW5nTGlzdCggYmluZGluZ3MsIGZyYWdtZW50cyApOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYWRkQmluZGluZyggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBiaW5kaW5nTmFtZSwgVmVjdG9yIGxpc3QgKQotICB7Ci0gICAgT2JqZWN0IGJpbmRpbmcgPSBudWxsOwotICAgIAotICAgIGlmKCBlbGVtZW50LmdldEF0dHJpYnV0ZSggYmluZGluZ05hbWUgKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZyA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbiggYmluZGluZ05hbWUgKTsgCi0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBsaXN0LmFkZCggYmluZGluZyApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXREYXRhTWFwcGluZ1JlZ2lzdHJ5KCBEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gcmVnaXN0cnk7Ci0gICAgCi0gICAgLy8gV2UgbmVlZCB0byByZWJ1aWxkIHRoZSBmYWN0b3J5IGNhY2hlIGVhY2ggdGltZSB3ZSBzdGFydCB0aGUgY2xpZW50Ci0gICAgLy8gd2l6YXJkLgotICAgIGZhY3RvcnlDYWNoZV8gICAgICAgID0gbmV3IEhhc2hNYXAoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V2lkZ2V0UmVnaXN0cnkoIFdpZGdldFJlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIHdpZGdldFJlZ2lzdHJ5XyA9IHJlZ2lzdHJ5OzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDYW5GaW5pc2hSZWdpc3RyeSggQ2FuRmluaXNoUmVnaXN0cnkgcmVnaXN0cnkgKQotICB7Ci0gICAgY2FuRmluaXNoUmVnaXN0cnlfID0gcmVnaXN0cnk7Ci0gIH0KLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YmM1NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi0KLS8qKgotKiBUaGlzIHR5cGUgaXMgdXNlZCB0byBob2xkIHVzZXIgb3IgY2FsY3VsYXRlZCAKLSogZGF0YSB0byBiZSB1c2UgYnkgZmluc2loIHRhc2tzCi0qLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlSW5mbwotewotCi19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjllZWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYSBraW5kIG9mCi0qIFdlYiBTZXJ2aWNlIGFydGlmYWN0LiAKLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVJ1bnRpbWUgaW1wbGVtZW50cyBJV2ViU2VydmljZVJ1bnRpbWUKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudF87Ci0gIHB1YmxpYyBTdHJpbmcgcnVudGltZUlkXzsKLSAgcHVibGljIFN0cmluZyBydW50aW1lTGFiZWxfOwotICBwdWJsaWMgU3RyaW5nIHJ1bnRpbWVEZXNjcmlwdGlvbl87Ci0gIHB1YmxpYyBTdHJpbmdbXSBqMmVlVmVyc2lvbnM7Ci0gIAotICAKLSAgcHVibGljIFdlYlNlcnZpY2VSdW50aW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVsZW1lbnRfID0gZWxlbTsgCi0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKiBAcmV0dXJuIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKQotICB7Ci0gICAgaWYgKHJ1bnRpbWVJZF8gPT0gbnVsbCkKLSAgICAgIHJ1bnRpbWVJZF8gPSBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgcmV0dXJuIHJ1bnRpbWVJZF87Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKQotICB7Ci0gICAgaWYgKHJ1bnRpbWVEZXNjcmlwdGlvbl8gPT0gbnVsbCkKLSAgICAgIHJ1bnRpbWVEZXNjcmlwdGlvbl8gPSBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7Ci0gICAgcmV0dXJuIHJ1bnRpbWVEZXNjcmlwdGlvbl87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBMYWJlbCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgTGFiZWwgb2YgdGhpcyBXZWIgU2VydmljZSBydW50aW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsICgpCi0gIHsKLSAgICBpZiAocnVudGltZUxhYmVsXz09bnVsbCkKLSAgICAgIHJ1bnRpbWVMYWJlbF8gPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKChTdHJpbmcpZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJsYWJlbCIpKTsgICAgCi0gICAgcmV0dXJuIHJ1bnRpbWVMYWJlbF87Ci0gIH0KLQotICAvKioKLSAgICogIFJldHVybnMgYSBUcnVlIGlmIHRoaXMgcnVudGltZSBoYXMgYmVlbiBzZXQgYXMgZGVmYXVsdAotICAgKiAgQHJldHVybiBhIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldElzRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgiaXNEZWZhdWx0IikpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBTdHJpbmcsIEoyRUUgdmVyc2lvbgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0SjJFRVZlcnNpb25zKCkKLSAgewotICAgIGlmIChqMmVlVmVyc2lvbnMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgiajJlZXZlcnNpb24iKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBqMmVlVmVyc2lvbnMgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGoyZWVWZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgICBqMmVlVmVyc2lvbnNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGoyZWVWZXJzaW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoCi0gICAqIHRoaXMgcnVudGltZS4KLSAgICogCi0gICAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudAotICAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudF87Ci0gIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VTZXJ2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyZTQ3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhIGtpbmQgb2YKLSogV2ViIFNlcnZpY2UgYXJ0aWZhY3QuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgYSBXZWJTZXJ2aWNlVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUuCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTZXJ2ZXIgaW1wbGVtZW50cyBJV2ViU2VydmljZVNlcnZlcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudF87Ci0gIHB1YmxpYyBTdHJpbmcgc2VydmVySWRfOwotICBwdWJsaWMgU3RyaW5nIGZhY3RvcnlJZF87Ci0gIHB1YmxpYyBTdHJpbmcgc2VydmVyTGFiZWxfOwotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlU2VydmVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVsZW1lbnRfID0gZWxlbTsgCi0gIH0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gaWQgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkICgpCi0gIHsKLSAgICBpZiAoc2VydmVySWRfPT1udWxsKQotICAgICAgc2VydmVySWRfID0gZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIHJldHVybiBzZXJ2ZXJJZF87Ci0gIH0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkICgpCi0gIHsKLSAgICBpZiAoZmFjdG9yeUlkXz09bnVsbCkKLSAgICAgIGZhY3RvcnlJZF8gPSBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImZhY3RvcnlJZCIpOwotICAgIHJldHVybiBmYWN0b3J5SWRfOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwgKCkKLSAgewotICAgIGlmIChzZXJ2ZXJMYWJlbF8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShnZXRGYWN0b3J5SWQoKSk7ICAgIAotICAgICAgc2VydmVyTGFiZWxfID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKS5nZXRUZXh0KHNlcnZlclR5cGUpOwotICAgIH0KLSAgICByZXR1cm4gc2VydmVyTGFiZWxfOyAgICAKLSAgfSAgCi0KLSAgLyoqCi0gICAqICBSZXR1cm5zIGEgVHJ1ZSBpZiB0aGlzIHNlcnZlciBoYXMgYmVlbiBzZXQgYXMgZGVmYXVsdAotICAgKiAgQHJldHVybiBhIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldElzRGVmYXVsdCgpCi0gIHsKLQotICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJpc0RlZmF1bHQiKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHJ1bnRpbWUgdGFyZ2V0IElkCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVUeXBlSWQoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZHMiKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGgKLSAgICogdGhpcyB0eXBlLgotICAgKiAKLSAgICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ci0gICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkKLSAgewotICAgIHJldHVybiB0aGlzLmVsZW1lbnRfOyAKLSAgfSAKLQotICB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjZlMWQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYSBraW5kIG9mCi0qIFdlYiBTZXJ2aWNlLVNlcnZlci1SdW50aW1lIGFydGlmYWN0LiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIGEgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0qIG9iamVjdCBpcyB0byBtYW51ZmFjdHVyZSB0aGUgd2l6YXJkIHBhZ2VzIHRoYXQgc3VwcG9ydCB0aGUgdHlwZSwgc2VydmVyLCBhbmQgcnVudGltZSBjb25maWd1cmF0aW9uLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi17Ci0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXItUnVudGltZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXItUnVudGltZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlci1SdW50aW1lIHR5cGUuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlci1SdW50aW1lIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgU2VydmVyIHN1cHBvcnRlZCBieSB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlci1SdW50aW1lIHR5cGUKLSAgKiBAcmV0dXJuIEEgc2VydmVyIGxhYmVsIGZyb20gc2VydmVyIHBsdWdpbnMKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJMYWJlbCgpOwotCi0gIC8qKgotICAqIFNldHMgYSBsYWJlbCBmb3IgdGhlIFNlcnZlciBzdXBwb3J0ZWQgYnkgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXItUnVudGltZSB0eXBlCi0gICogQHBhcmFtIEEgc2VydmVyIGxhYmVsIGZyb20gc2VydmVyIHBsdWdpbnMKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyTGFiZWwoU3RyaW5nIHNlcnZlckxhYmVsKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbGFiZWwgZm9yIHRoZSBkZXBsb3ltZW50IHJ1bnRpbWUgb2YgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXItUnVudGltZSB0eXBlCi0gICogQHJldHVybiBBIGxhYmVsIGZvciB0aGUgZGVwbG95bWVudCBydW50aW1lCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUxhYmVsKCk7Ci0KLSAgLyoqCi0gICogU2V0cyBhIGxhYmVsIGZvciB0aGUgZGVwbG95bWVudCBydW50aW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyLVJ1bnRpbWUgdHlwZQotICAqIEBwYXJhbSBBIGxhYmVsIGZvciB0aGUgZGVwbG95bWVudCBydW50aW1lCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWVMYWJlbChTdHJpbmcgcnVudGltZUxhYmVsKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbGFiZWwgZm9yIHRoZSBXZWIgU2VydmljZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAqIEByZXR1cm4gQSBsYWJlbCBmb3IgdGhlIFdlYiBTZXJ2aWNlIHR5cGUKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZUxhYmVsKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIFdlYiBNb2R1bGUgaXMgcmVxdWlyZWQgZm9yIHRoaXMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICogQHJldHVybiB0cnVlIGlmIHJlcXVpcmVXZWJNb2R1bGUKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXZWJNb2R1bGVSZXF1aXJlZCgpOwotCi0gIC8qKgotICAqIFNldHMgdGhlIGJvb2xlYW4gdmFsdWUgYXQgcnVudGltZSBhY2NvcmRpbmcgdG8gcmVxdWlyZVdlYk1vZHVsZSBhdHRyaWJ1dGUgZnJvbSB0aGUgbWFuaWZlc3QgZmlsZQotICAqIEBwYXJhbSByZXF1aXJlV2ViTW9kdWxlIAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJNb2R1bGVSZXF1aXJlZChib29sZWFuIHJlcXVpcmVXZWJNb2R1bGUpOwotCi0gIC8qKgotICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW4gRUpCIE1vZHVsZSBpcyByZXF1aXJlZCBmb3IgdGhpcyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgKiBAcmV0dXJuIHRydWUgaXMgcmVxdWlyZUVKQk1vZHVsZSBpcyB0cnVlCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzRUpCTW9kdWxlUmVxdWlyZWQoKTsKLQotICAvKioKLSAgKiBTZXRzIHRoZSBib29sZWFuIHZhbHVlIGF0IHJ1bnRpbWUgYWNjb3JkaW5nIHRvIHJlcXVpcmVFSkJNb2R1bGUgYXR0cmlidXRlIGZyb20gdGhlIG1hbmlmZXN0IGZpbGUKLSAgKiBAcGFyYW0gcmVxdWlyZUVKQk1vZHVsZSAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUpCTW9kdWxlUmVxdWlyZWQoYm9vbGVhbiByZXF1aXJlRUpCTW9kdWxlKTsgCi19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjYyZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSUVKQk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50cy5TZXJ2aWNlUHJlQXNzZW1ibHlGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzLlNlcnZpY2VQcmVEZXBsb3lGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzLlNlcnZpY2VQcmVEZXZlbG9wRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50cy5TZXJ2aWNlUHJlSW5zdGFsbEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLkxhYmVsc0FuZElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5yZWdpc3RyeS5Db21tYW5kUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3RDaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IGltcGxlbWVudHMgQ29tbWFuZFJlZ2lzdHJ5Ci17Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaW5kZXhlZENvbmZpZ0VsZW1zXzsKLQotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZVNlcnZlcnM7Ci0gIHByaXZhdGUgSGFzaE1hcCB3ZWJTZXJ2aWNlUnVudGltZXM7Ci0gIHByaXZhdGUgSGFzaE1hcCB3ZWJTZXJ2aWNlVHlwZXM7Ci0gIHByaXZhdGUgSGFzaE1hcCB3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVzOwotIAotICBwcml2YXRlIEhhc2h0YWJsZSBydW50aW1lc0J5VHlwZV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHJ1bnRpbWVMYWJlbEJ5SWRfOwotICBwcml2YXRlIEhhc2h0YWJsZSBydW50aW1lSWRCeUxhYmVsXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgc2VydmVyc0J5VHlwZV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHNlcnZlckxhYmVsQnlGYWN0b3J5SWRfOwotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2ZXJGYWN0b3J5SWRCeUxhYmVsXzsKLQotICBwcml2YXRlIEhhc2h0YWJsZSBjb25maWdFbGVtc0J5SWRfOwotICAKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnlfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnlfOwotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnlfOwotICBwcml2YXRlIEhhc2hNYXAgICAgICAgICAgICAgZmFjdG9yeUNhY2hlXzsKLSAgCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgc2VydmVyVG9SdW50aW1lVG9KMkVFXzsKLSAgcHJpdmF0ZSBMb2cJCQkJCWxvZ187Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkoKSB7Ci0gICAgbG9nXyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0gIH0KLSAgLy8KLSAgLy8gTG9hZHMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBUaGlzIGlzIGRvbmUgYnkgcXVlcnlpbmcgdGhlIHBsdWdpbiByZWdpc3RyeSBmb3IgYWxsIGV4dGVuc2lvbnMKLSAgLy8gaGFuZ2luZyBvbiB0aGUgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIGV4dGVuc2lvbiBwb2ludC4gRXh0ZW5zaW9ucwotICAvLyBtdXN0IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2UuanN0LndzLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgLy8gaW50ZXJmYWNlLgotICAvLwotICBwcml2YXRlIHZvaWQgbG9hZFR5cGVzICgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUiKTsKLQotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBjb25maWdbaWR4XTsKLSAgICAgIHRyeSAKLSAgICAgIHsKLSAgICAgICAgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygid2ViU2VydmljZVNlcnZlciIpKQotICAgICAgICB7IAotICAgICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gbmV3IFdlYlNlcnZpY2VTZXJ2ZXIoZWxlbSk7Ci0gICAgICAgICAgd2ViU2VydmljZVNlcnZlcnMucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCB3c3MpOwotICAgICAgICAgIFN0cmluZyBzZXJ2ZXJMYWJlbCA9IHdzcy5nZXRMYWJlbCgpOwotICAgICAgICAgIGlmIChzZXJ2ZXJMYWJlbCAhPSBudWxsICYmIHNlcnZlckxhYmVsLmxlbmd0aCgpPjApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzZXJ2ZXJMYWJlbEJ5RmFjdG9yeUlkXy5jb250YWluc0tleSh3c3MuZ2V0RmFjdG9yeUlkKCkpKTsKLSAgICAgICAgICAgICAgc2VydmVyTGFiZWxCeUZhY3RvcnlJZF8ucHV0KHdzcy5nZXRGYWN0b3J5SWQoKSwgc2VydmVyTGFiZWwpOwotICAgICAgICAgICAgaWYgKCFzZXJ2ZXJGYWN0b3J5SWRCeUxhYmVsXy5jb250YWluc0tleShzZXJ2ZXJMYWJlbCkpOwotICAgICAgICAgICAgICBzZXJ2ZXJGYWN0b3J5SWRCeUxhYmVsXy5wdXQoc2VydmVyTGFiZWwsIHdzcy5nZXRGYWN0b3J5SWQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygid2ViU2VydmljZVJ1bnRpbWUiKSkKLSAgICAgICAgewotICAgICAgICAgIFdlYlNlcnZpY2VSdW50aW1lIHJ0ID0gbmV3IFdlYlNlcnZpY2VSdW50aW1lKGVsZW0pOwotICAgICAgICAgIHdlYlNlcnZpY2VSdW50aW1lcy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIHJ0KTsKLSAgICAgICAgICBpZighcnVudGltZUxhYmVsQnlJZF8uY29udGFpbnNLZXkocnQuZ2V0SWQoKSkpCi0gICAgICAgICAgCXJ1bnRpbWVMYWJlbEJ5SWRfLnB1dChydC5nZXRJZCgpLCBydC5nZXRMYWJlbCgpKTsKLSAgICAgICAgICBpZighcnVudGltZUlkQnlMYWJlbF8uY29udGFpbnNLZXkocnQuZ2V0TGFiZWwoKSkpCi0gICAgICAgICAgCXJ1bnRpbWVJZEJ5TGFiZWxfLnB1dChydC5nZXRMYWJlbCgpLCBydC5nZXRJZCgpKTsKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBXZWJTZXJ2aWNlVHlwZUltcGwgd3N0ID0gbmV3IFdlYlNlcnZpY2VUeXBlSW1wbChlbGVtKTsKLSAgICAgICAgICB3ZWJTZXJ2aWNlVHlwZXMucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCB3c3QpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygid2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBjb25maWdFbGVtc0J5SWRfLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgZWxlbSk7Ci0KLSAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLSAgICAgICAgICBTdHJpbmcgc2VydmVySWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgic2VydmVyIik7Ci0gICAgICAgICAgU3RyaW5nIHJ1bnRpbWVJZCA9IGVsZW0uZ2V0QXR0cmlidXRlKCJydW50aW1lIik7Ci0gICAgICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyB3c3NydCA9IG5ldyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKHNlcnZlcklkLCBydW50aW1lSWQsIHR5cGVJZCwgZWxlbSk7Ci0gICAgICAgICAgd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlcy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIHdzc3J0KTsKLQotICAgICAgICAgIHNldFJ1bnRpbWVzQnlUeXBlKHR5cGVJZCxydW50aW1lSWQpOwotICAgICAgICAgIHNldFNlcnZlcnNCeVR5cGUodHlwZUlkLCBzZXJ2ZXJJZCk7Ci0gICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgIH0gCi0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGxvZ18ubG9nKExvZy5FUlJPUiwgNTA1OCwgdGhpcywgImxvYWRUeXBlcyIsIGUpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgKiBTZXRzIHRoZSBXZWIgc2VydmljZSBydW50aW1lcyBhbmQgdHlwZSBmcm9tIGVhY2ggZXh0ZW5zaW9uIAotICAqIGluIGEgSGFzaHRhYmxlLiAgVGhlIHR5cGUgaXMgdGhlIGtleSwgYW5kIHZhbHVlIGlzIGEgVmVjdG9yIGNvbnRhaW5pbmcgCi0gICogZWFjaCBydW50aW1lIHN1cHBvcnRlZCBpbiB0aGF0IFdlYiBzZXJ2aWNlIHR5cGUuCi0gICogQHBhcmFtIHJ1bnRpbWUgbmFtZQotICAqIEBwYXJhbSB0eXBlIG5hbWUKLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldFJ1bnRpbWVzQnlUeXBlKFN0cmluZyB0eXBlSWQsIFN0cmluZyBydW50aW1lKQotICB7Ci0gICAgaWYocnVudGltZXNCeVR5cGVfLmdldCh0eXBlSWQpIT1udWxsKQotICAgIHsKLSAgICAgIFZlY3RvciB2ID0gKFZlY3RvcilydW50aW1lc0J5VHlwZV8uZ2V0KHR5cGVJZCk7Ci0gICAgICBpZiAoIXYuY29udGFpbnMocnVudGltZS50cmltKCkpKSB7Ci0gICAgICAgIHYuYWRkKHJ1bnRpbWUudHJpbSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFZlY3RvciB2ZWN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgdmVjdC5hZGQocnVudGltZS50cmltKCkpOwotICAgICAgcnVudGltZXNCeVR5cGVfLnB1dCh0eXBlSWQsdmVjdCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VSdW50aW1lIGdldFJ1bnRpbWVCeUlkKCBTdHJpbmcgaWQgKQotICB7Ci0gICAgcmV0dXJuIChXZWJTZXJ2aWNlUnVudGltZSl3ZWJTZXJ2aWNlUnVudGltZXMuZ2V0KCBpZCApOyAKLSAgfQotICAKLSAgLyoqCi0gICogR2V0cyB0aGUgV2ViIHNldmljZSBydW50aW1lcyB2ZWN0b3IgZ2l2ZW4gYSB0eXBlCi0gICogQHBhcmFtIFdlYiBzZXJ2aWNlIHR5cGUKLSAgKiBAcmV0dXJuIGFycmF5IG9mIHJ1bnRpbWUgbGFiZWxzCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lc0J5VHlwZShTdHJpbmcgd2ViU2VydmljZVR5cGUpIAotICB7Ci0gICAgU3RyaW5nW10gcnVudGltZXM7Ci0gICAgaWYgKHJ1bnRpbWVzQnlUeXBlXy5jb250YWluc0tleSh3ZWJTZXJ2aWNlVHlwZSkpCi0gICAgewotICAgICAgVmVjdG9yIHZlY3QgPShWZWN0b3IpcnVudGltZXNCeVR5cGVfLmdldCh3ZWJTZXJ2aWNlVHlwZSk7Ci0gICAgICBydW50aW1lcyA9IG5ldyBTdHJpbmdbdmVjdC5zaXplKCldOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHZlY3Quc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBydW50aW1lSWQgPSAoU3RyaW5nKXZlY3QuZWxlbWVudEF0KGkpOwotICAgICAgICBXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoV2ViU2VydmljZVJ1bnRpbWUpd2ViU2VydmljZVJ1bnRpbWVzLmdldChydW50aW1lSWQpOwotICAgICAgICBpZiAod3NyIT1udWxsKSB7Ci0gICAgICAgICAgcnVudGltZXNbaV0gPSAoU3RyaW5nKXdzci5nZXRJZCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcnVudGltZXM7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxvZ18ubG9nKExvZy5FUlJPUiwgNTA1OSwgdGhpcywgImdldFJ1bnRpbWVzQnlUeXBlIiwgInJ1bnRpbWVzIG5vdCBmb3VuZCBmb3IgV2ViIHNlcnZpY2UgdHlwZSAiK3dlYlNlcnZpY2VUeXBlKTsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1J1bnRpbWVTdXBwb3J0ZWRGb3JUeXBlKFN0cmluZyB3ZWJTZXJ2aWNlVHlwZUlkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gIAlTdHJpbmdbXSBydW50aW1lcyA9IGdldFJ1bnRpbWVzQnlUeXBlKHdlYlNlcnZpY2VUeXBlSWQpOwotCWZvcihpbnQgaT0wO2k8cnVudGltZXMubGVuZ3RoO2krKykKLQl7Ci0gIAkJaWYgKHJ1bnRpbWVzW2ldLmVxdWFscyhydW50aW1lSWQpKQotICAJCSAgcmV0dXJuIHRydWU7Ci0JfQotICAJcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZG9lc1J1bnRpbWVTdXBwb3J0SjJFRUxldmVsKFN0cmluZyBqMmVlVmVyc2lvbklkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgSVdlYlNlcnZpY2VSdW50aW1lIHdzciA9IChJV2ViU2VydmljZVJ1bnRpbWUpd2ViU2VydmljZVJ1bnRpbWVzLmdldChydW50aW1lSWQpOwotICAgIFN0cmluZ1tdIGoyZWVWZXJzaW9ucyA9IHdzci5nZXRKMkVFVmVyc2lvbnMoKTsKLSAgICBpZiAoajJlZVZlcnNpb25zPT1udWxsIHx8IGoyZWVWZXJzaW9ucy5sZW5ndGg9PTApIAotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgZm9yKGludCBpPTA7IGk8ajJlZVZlcnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChqMmVlVmVyc2lvbnNbaV0uZXF1YWxzKGoyZWVWZXJzaW9uSWQpKQotICAgICAgewotICAgICAgCXJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChTdHJpbmcgc2VydmVyVGFyZ2V0SWQsIFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICBJdGVyYXRvciBpdCA9IHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSAKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZV8paXQubmV4dCgpOwotICAgICAgaWYgKHdzc3J0IT1udWxsKSB7Ci0gICAgICAgIGlmICh3c3NydC5ydW50aW1lSWRfLmVxdWFscyhydW50aW1lSWQpKQotICAgICAgICB7Ci0gICAgICAgICAgSVdlYlNlcnZpY2VTZXJ2ZXIgd3NzZXJ2ZXIgPSBnZXRXZWJTZXJ2aWNlU2VydmVyQnlJZCh3c3NydC5zZXJ2ZXJJZF8pOwotICAgICAgICAgIFN0cmluZyB0aGlzRmFjdG9yeUlkID0gd3NzZXJ2ZXIuZ2V0RmFjdG9yeUlkKCk7Ci0gICAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUodGhpc0ZhY3RvcnlJZCk7Ci0gICAgICAgICAgaWYgKHNlcnZlclR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyB0aGlzU2VydmVyVGFyZ2V0SWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsgCi0gICAgICAgICAgaWYgKHRoaXNTZXJ2ZXJUYXJnZXRJZC5lcXVhbHMoc2VydmVyVGFyZ2V0SWQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IAotICAgIHJldHVybiBmYWxzZTsgIAotICB9Ci0gIAotICAvKioKLSAgKiBHZXRzIHRoZSBzZXJ2ZXIgZmFjdG9yeUlEcyBvZiBhbGwgd2ViIHNlcnZpY2Ugc2VydmVyIHJ1bnRpbWUgdHlwZQotICAqIHdpdGggYW4gcnVudGltZSBJRCBlcXVhbHMgdG8gdGhlIGlucHV0Ci0gICogQHBhcmFtIHJ1bnRpbWUgSUQKLSAgKiBAcmV0dXJuIGFycmF5IG9mIGZhY3RvcnkgSURzCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJGYWN0b3J5SURCeVJ1bnRpbWVJRChTdHJpbmcgcnVudGltZUlEKSB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXQgPSB3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKWl0Lm5leHQoKTsKLSAgICAgIGlmICh3c3NydCE9bnVsbCkgewotICAgICAgICBpZiAod3NzcnQucnVudGltZUlkXy5lcXVhbHMocnVudGltZUlEKSkKLSAgICAgICAgICB2LmFkZChnZXRXZWJTZXJ2aWNlU2VydmVyQnlJZCh3c3NydC5zZXJ2ZXJJZF8pLmdldEZhY3RvcnlJZCgpKTsKLQotICAgICAgfQotICAgIH0KLSAgICBTdHJpbmdbXSBzZXJ2ZXJGYWN0b3J5SURzID0gbmV3IFN0cmluZ1t2LnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKSB7Ci0gICAgICBzZXJ2ZXJGYWN0b3J5SURzW2ldID0gKFN0cmluZyl2LmdldChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZlckZhY3RvcnlJRHM7Ci0gIH0KLQotICAvKioKLSAgKiBHZXRzIHRoZSBydW50aW1lIElEcyBvZiBhbGwgd2ViIHNlcnZpY2Ugc2VydmVyIHJ1bnRpbWUgdHlwZQotICAqIHdpdGggYW4gc2VydmVyIGZhY3RvcnkgSUQgZXF1YWxzIHRvIHRoZSBpbnB1dAotICAqIEBwYXJhbSBzZXJ2ZXIgZmFjdG9yeSBJRAotICAqIEByZXR1cm4gYXJyYXkgb2YgcnVudGltZSBJRHMKLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVJRHNCeVNlcnZlckZhY3RvcnlJRChTdHJpbmcgc2VydmVyRmFjdG9yeUlEKSB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXQgPSB3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKWl0Lm5leHQoKTsKLSAgICAgIGlmICh3c3NydCE9bnVsbCkgewotICAgICAgCUlXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IGdldFdlYlNlcnZpY2VTZXJ2ZXJCeUlkKHdzc3J0LnNlcnZlcklkXyk7Ci0gICAgICAJU3RyaW5nIHdzc2ZJZCA9IHdzcy5nZXRGYWN0b3J5SWQoKTsKLSAgICAgIAlpZiAod3NzZklkLmVxdWFscyhzZXJ2ZXJGYWN0b3J5SUQpKQotICAgICAgCXsKLSAgICAgIAkJaWYgKCF2LmNvbnRhaW5zKHdzc3J0LnJ1bnRpbWVJZF8pKQotICAgICAgCQl7Ci0gICAgICAJCQl2LmFkZCh3c3NydC5ydW50aW1lSWRfKTsJCi0gICAgICAJCX0gICAgICAJCQotICAgICAgCX0KLSAgICAgICAgLyppZiAoZ2V0V2ViU2VydmljZVNlcnZlckJ5SWQod3NzcnQuc2VydmVySWRfKS5nZXRGYWN0b3J5SWQoKS5lcXVhbHMoc2VydmVyRmFjdG9yeUlEKSkKLSAgICAgICAgICB2LmFkZChnZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQod3NzcnQucnVudGltZUlkXykuZ2V0SWQoKSk7Ki8KLSAgICAgIH0KLSAgICB9Ci0gICAgU3RyaW5nW10gcnVudGltZUlEcyA9IG5ldyBTdHJpbmdbdi5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykgewotICAgICAgcnVudGltZUlEc1tpXSA9IChTdHJpbmcpdi5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBydW50aW1lSURzOwotICB9Ci0gIAotICAvKioKLSAgKiBTZXRzIHRoZSBXZWIgc2VydmljZSBzZXJ2ZXJzIGFuZCB0eXBlIGZyb20gZWFjaCBleHRlbnNpb24gCi0gICogaW4gYSBIYXNodGFibGUuICBUaGUgdHlwZSBpcyB0aGUga2V5LCBhbmQgdmFsdWUgaXMgYSBWZWN0b3IgY29udGFpbmluZyAKLSAgKiBlYWNoIHJ1bnRpbWUgc3VwcG9ydGVkIGluIHRoYXQgV2ViIHNlcnZpY2UgdHlwZS4KLSAgKiBAcGFyYW0gc2VydmVyIG5hbWUKLSAgKiBAcGFyYW0gdHlwZSBuYW1lCi0gICovCi0gIHByaXZhdGUgdm9pZCBzZXRTZXJ2ZXJzQnlUeXBlKFN0cmluZyB0eXBlSWQsIFN0cmluZyBzZXJ2ZXIpCi0gIHsKLSAgICBpZihzZXJ2ZXJzQnlUeXBlXy5nZXQodHlwZUlkKSE9bnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgdiA9IChWZWN0b3Ipc2VydmVyc0J5VHlwZV8uZ2V0KHR5cGVJZCk7Ci0gICAgICBpZiAoIXYuY29udGFpbnMoc2VydmVyLnRyaW0oKSkpIAotICAgICAgewotICAgICAgICB2LmFkZChzZXJ2ZXIudHJpbSgpKTsgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFZlY3RvciB2ZWN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgdmVjdC5hZGQoc2VydmVyLnRyaW0oKSk7Ci0gICAgICBzZXJ2ZXJzQnlUeXBlXy5wdXQodHlwZUlkLCB2ZWN0KTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAqIEdldHMgdGhlIFdlYiBzZXJ2aWNlIHNlcnZlcnMgdmVjdG9yIGdpdmVuIGEgdHlwZQotICAqIEBwYXJhbSBXZWIgc2VydmljZSB0eXBlCi0gICogQHJldHVybiBhcnJheSBvZiBzZXJ2ZXIgZmFjdG9yeSBJZHMKLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckZhY3RvcnlJZHNCeVR5cGUoU3RyaW5nIHdlYlNlcnZpY2VUeXBlKSAKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlcnM7IAotICAgIGlmIChzZXJ2ZXJzQnlUeXBlXy5jb250YWluc0tleSh3ZWJTZXJ2aWNlVHlwZSkpCi0gICAgewotICAgICAgVmVjdG9yIHZlY3QgPSAoVmVjdG9yKXNlcnZlcnNCeVR5cGVfLmdldCh3ZWJTZXJ2aWNlVHlwZSk7Ci0gICAgICBzZXJ2ZXJzID0gbmV3IFN0cmluZ1t2ZWN0LnNpemUoKV07Ci0gICAgICBmb3IgKGludCBpPTA7IGk8dmVjdC5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHNlcnZlcklkID0gKFN0cmluZyl2ZWN0LmVsZW1lbnRBdChpKTsKLSAgICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcil3ZWJTZXJ2aWNlU2VydmVycy5nZXQoc2VydmVySWQpOwotICAgICAgICBpZiAod3NzIT1udWxsKSB7Ci0gICAgICAgICAgc2VydmVyc1tpXSA9IChTdHJpbmcpd3NzLmdldEZhY3RvcnlJZCgpOyAvL05vdGU6IHJldHVybmluZyBzZXJ2ZXIgZmFjdG9yeSBJZHMKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHNlcnZlcnM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgICAKLSAgICAgIGxvZ18ubG9nKExvZy5FUlJPUiwgNTA2MCwgdGhpcywgImdldFNlcnZlckJ5VHlwZSIsICJXZWIgc2VydmljZSBzZXJ2ZXIgbm90IGZvdW5kIGZvciBXZWIgc2VydmljZSB0eXBlICIrd2ViU2VydmljZVR5cGUpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgSVdlYlNlcnZpY2VSdW50aW1lIGdldFdlYlNlcnZpY2VSdW50aW1lQnlMYWJlbChTdHJpbmcgcnVudGltZUxhYmVsKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VSdW50aW1lcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoV2ViU2VydmljZVJ1bnRpbWUpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NyIT1udWxsKSB7Ci0gICAgICAgIGlmIChydW50aW1lTGFiZWwuZXF1YWxzKHdzci5nZXRMYWJlbCgpKSkKLSAgICAgICAgICByZXR1cm4gd3NyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgfQotICAKLSAgcHVibGljIElXZWJTZXJ2aWNlUnVudGltZSBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQoU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIHJldHVybiAoSVdlYlNlcnZpY2VSdW50aW1lKXdlYlNlcnZpY2VSdW50aW1lcy5nZXQocnVudGltZUlkKTsgCi0gIH0KLQotICBwdWJsaWMgSVdlYlNlcnZpY2VTZXJ2ZXIgZ2V0V2ViU2VydmljZVNlcnZlckJ5RmFjdG9yeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0gIHsKLSAgICBpZiAoc2VydmVyRmFjdG9yeUlkPT1udWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVNlcnZlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcilpdGVyLm5leHQoKTsKLSAgICAgIGlmICh3c3MhPW51bGwgJiYgd3NzLmdldEZhY3RvcnlJZCgpIT1udWxsKSB7Ci0gICAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWQuZXF1YWxzKHdzcy5nZXRGYWN0b3J5SWQoKSkpIHsKLSAgICAgICAgICByZXR1cm4gd3NzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAKLSAgICAKLSAgfQotCi0gIHB1YmxpYyBJV2ViU2VydmljZVNlcnZlciBnZXRXZWJTZXJ2aWNlU2VydmVyQnlMYWJlbChTdHJpbmcgc2VydmVyTGFiZWwpCi0gIHsKLSAgICBpZiAoc2VydmVyTGFiZWw9PW51bGwpIAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NzIT1udWxsKSB7Ci0gICAgICAgIGlmIChzZXJ2ZXJMYWJlbC5lcXVhbHMod3NzLmdldExhYmVsKCkpKQotICAgICAgICAgIHJldHVybiB3c3M7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAKLSAgICAKLSAgfQotICAKLSAgcHVibGljIElXZWJTZXJ2aWNlU2VydmVyIGdldFdlYlNlcnZpY2VTZXJ2ZXJCeUlkKFN0cmluZyBzZXJ2ZXJJZCkKLSAgewotICAgIHJldHVybiAoSVdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHNlcnZlcklkKTsKLSAgfQotCi0gIHB1YmxpYyBJV2ViU2VydmljZVR5cGUgZ2V0V2ViU2VydmljZVR5cGVCeUxhYmVsKFN0cmluZyB0eXBlTGFiZWwpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VUeXBlSW1wbCB3c3QgPSAoV2ViU2VydmljZVR5cGVJbXBsKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzdCE9bnVsbCkgewotICAgICAgICBpZiAodHlwZUxhYmVsLmVxdWFscyh3c3QuZ2V0TGFiZWwoKSkpCi0gICAgICAgICAgcmV0dXJuIHdzdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSVdlYlNlcnZpY2VUeXBlIGdldFdlYlNlcnZpY2VUeXBlQnlJZChTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VUeXBlcy5nZXQodHlwZUlkKSE9IG51bGwpCi0gICAgICByZXR1cm4gKFdlYlNlcnZpY2VUeXBlSW1wbCl3ZWJTZXJ2aWNlVHlwZXMuZ2V0KHR5cGVJZCk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIGFuIEVKQiBwcm9qZWN0IGlzIG5lZWRlZCB0byBob3N0IGEgV2ViIHNlcnZpY2UKLSAgICogb2YgdGhlIHR5cGUgaWRlbnRpZmllZCBieSB0eXBlSWQuIElmIG11bHRpcGxlIG5hdHVyZUlkcyBhcmUgc3BlY2lmaWVkIGluIHRoZSAKLSAgICogImluY2x1ZGVOYXR1cmVzIiBhdHRyaWJ1dGUsIG9ubHkgdGhlIGZpcnN0IG9uZSBpcyBjaGVja2VkLiBJZiBubyBuYXR1cmVJZHMgYXJlIHNwZWNpZmllZCwgCi0gICAqIGZhbHNlIGlzIHJldHVybmVkLgotICAgKiAKLSAgICogQGRlcHJlY2F0ZWQgIAotICAgKiAJU2hvdWxkIGJlIHJlZmFjdG9yZWQgaW4gZnV0dXJlIAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNFSkJQcm9qZWN0KFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBJV2ViU2VydmljZVR5cGUgd3N0ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRXZWJTZXJ2aWNlVHlwZUJ5SWQodHlwZUlkKTsKLSAgICBpZiAod3N0ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSB3c3QuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLSAgICAgIFN0cmluZyBpbmNsdWRlZE5hdHVyZXMgPSBlbGVtLmdldEF0dHJpYnV0ZSgiaW5jbHVkZU5hdHVyZXMiKTsKLSAgICAgIGlmIChpbmNsdWRlZE5hdHVyZXM9PW51bGwgfHwgaW5jbHVkZWROYXR1cmVzLmxlbmd0aCgpPT0wKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5jbHVkZWROYXR1cmVzKTsKLSAgICAgICAgaWYoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGZpcnN0SW5jbHVkZWROYXR1cmUgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICBpZiAoZmlyc3RJbmNsdWRlZE5hdHVyZS5lcXVhbHMoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgdmFsaWQgcHJvamVjdHMgZm9yIHRoZSBXZWIgc2VydmljZSB0eXBlIHdpdGggYW4gaWQgb2YgdHlwZUlkLgotICAgKiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgV2ViIHNlcnZpY2UgdHlwZSBleHRlbnNpb24gZG9lcyBub3Qgc3BlY2lmeSB3aGljaCBwcm9qZWN0Ci0gICAqIG5hdHVyZXMgYXJlIGluY2x1ZGVkLCBhIGFycmF5IG9mIGFsbCBXZWIgYW5kIEVKQiBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlIHdpbGwKLSAgICogYmUgcmV0dXJuZWQuCi0gICAqIEBwYXJhbSB0eXBlSWQKLSAgICogQHJldHVybiBJUHJvamVjdFtdIGFuIGFycmF5IG9mIHZhbGlkIHByb2plY3RzCi0gICAqLwotICBwdWJsaWMgSVByb2plY3RbXSBnZXRQcm9qZWN0c0J5V2ViU2VydmljZVR5cGUoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgQXJyYXlMaXN0IHZhbGlkUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICBJV2ViU2VydmljZVR5cGUgd3N0ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRXZWJTZXJ2aWNlVHlwZUJ5SWQodHlwZUlkKTsKLS8vICAgIGlmICh3c3QgIT0gbnVsbCkKLS8vICAgIHsKLQotCQkvL1RPRE86IFRoaXMgc2VjdGlvbiBuZWVkcyB0byBiZSByZWZhY3RvcmVkIHRvIGZpbHRlciBBcnRpZmFjdEVkaXRzCi0JCS8vIGFuZCB1cGhvbGQgcHJvamVjdCB0b3BvbG9neSBkZXNjcmliZWQgaW4gdGhlIGV4dGVuc2lvbgotCQkKLS8vICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSB3c3QuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLS8vICAgICAgU3RyaW5nIGluY2x1ZGVkTmF0dXJlcyA9IGVsZW0uZ2V0QXR0cmlidXRlKCJpbmNsdWRlTmF0dXJlcyIpOwotLy8gICAgICBTdHJpbmcgZXhjbHVkZWROYXR1cmVzID0gZWxlbS5nZXRBdHRyaWJ1dGUoImV4Y2x1ZGVOYXR1cmVzIik7Ci0vLyAgICAgIGlmIChpbmNsdWRlZE5hdHVyZXMhPW51bGwgJiYgaW5jbHVkZWROYXR1cmVzLmxlbmd0aCgpPjApCi0vLyAgICAgIHsKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGlmIChpbmNsdWRlKHByb2plY3RzW2ldLCBpbmNsdWRlZE5hdHVyZXMpICYmIGV4Y2x1ZGUocHJvamVjdHNbaV0sIGV4Y2x1ZGVkTmF0dXJlcykpCi0vLyAgICAgICAgICAgIHZhbGlkUHJvamVjdHMuYWRkKHByb2plY3RzW2ldKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgcmV0dXJuIChJUHJvamVjdFtdKXZhbGlkUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgCi0gICAgLy9JZiB3c3Qgd2FzIG51bGwgb3IgdGhlIGV4dGVuc2lvbiBkaWRuJ3Qgc3BlY2lmeSB3aGljaCBwcm9qZWN0IG5hdHVyZXMgYXJlCi0gICAgLy8gdG8gYmUgaW5jbHVkZWQsIHJldmVydCB0byB0aGUgb2xkIGJlaGF2aW91cgotICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvamVjdHMubGVuZ3RoOyBqKyspCi0gICAgewotICAgICAgaWYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3RzW2pdKSB8fCBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChwcm9qZWN0c1tqXSkpCi0gICAgICAgIHZhbGlkUHJvamVjdHMuYWRkKHByb2plY3RzW2pdKTsKLSAgICB9ICAgIAotICAgIHJldHVybiAoSVByb2plY3RbXSl2YWxpZFByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGluY2x1ZGUpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluY2x1ZGUpOwotICAgIHdoaWxlKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZXhjbHVkZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZXhjbHVkZSkKLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZXhjbHVkZSk7Ci0gICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAocHJvamVjdC5oYXNOYXR1cmUoc3QubmV4dFRva2VuKCkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLy8KLSAgLy8gTG9hZHMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBTZWUgbWV0aG9kIGdldEluc3RhbmNlKCkuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkICgpCi0gIHsKLSAgICBydW50aW1lc0J5VHlwZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgc2VydmVyc0J5VHlwZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgY29uZmlnRWxlbXNCeUlkXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBydW50aW1lSWRCeUxhYmVsXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBydW50aW1lTGFiZWxCeUlkXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBzZXJ2ZXJGYWN0b3J5SWRCeUxhYmVsXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBzZXJ2ZXJMYWJlbEJ5RmFjdG9yeUlkXyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIHdlYlNlcnZpY2VTZXJ2ZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICB3ZWJTZXJ2aWNlUnVudGltZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHdlYlNlcnZpY2VUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgbG9hZFR5cGVzKCk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICogQHJldHVybiBBIHNpbmdsZXRvbiBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkoKTsKLSAgICAgIGluc3RhbmNlXy5sb2FkKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBXZWIgU2VydmljZSB0eXBlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZTwvY29kZT4KLSAgKiBvYmplY3RzLgotICAqIEByZXR1cm4gVGhlIFdlYiBTZXJ2aWNlIHR5cGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPC9jb2RlPgotICAqIG9iamVjdHMuCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVHlwZU5hbWVzKCkKLSAgewotICAgIAotICAgIFN0cmluZ1tdIHR5cGVzID0gbmV3IFN0cmluZ1t3ZWJTZXJ2aWNlVHlwZXMuc2l6ZSgpXTsKLQotICAgIGludCBpPTA7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlVHlwZUltcGwgd3N0ID0gKFdlYlNlcnZpY2VUeXBlSW1wbClpdGVyLm5leHQoKTsKLSAgICAgIGlmICh3c3QhPW51bGwpIHsKLSAgICAgICAgdHlwZXNbaV0gPSB3c3QuZ2V0TGFiZWwoKTsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMYWJlbHNBbmRJZHMgZ2V0U2VydmljZVR5cGVMYWJlbHMoKQotICB7Ci0gICAgTGFiZWxzQW5kSWRzIGxhYmVsSWRzID0gbmV3IExhYmVsc0FuZElkcygpOwotICAgIEl0ZXJhdG9yICAgICBpdGVyYXRvciA9IHdlYlNlcnZpY2VUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIGludCAgICAgICAgICBzaXplICAgICA9IHdlYlNlcnZpY2VUeXBlcy5zaXplKCk7Ci0gICAgU3RyaW5nW10gICAgIGxhYmVscyAgID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICBTdHJpbmdbXSAgICAgaWRzICAgICAgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgIGludCAgICAgICAgICBpbmRleCAgICA9IDA7Ci0gICAgCi0gICAgbGFiZWxJZHMuc2V0TGFiZWxzXyggbGFiZWxzICk7Ci0gICAgbGFiZWxJZHMuc2V0SWRzXyggaWRzICk7Ci0gICAgCi0gICAgd2hpbGUoIGl0ZXJhdG9yLmhhc05leHQoKSApIAotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VUeXBlSW1wbCB0eXBlID0gKFdlYlNlcnZpY2VUeXBlSW1wbClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAKLSAgICAgIGlkc1tpbmRleF0gICAgPSB0eXBlLmdldElkKCk7Ci0gICAgICBsYWJlbHNbaW5kZXhdID0gdHlwZS5nZXRMYWJlbCgpOwotICAgICAgaW5kZXgrKzsKLSAgICB9ICAgIAotICAgIAotICAgIHJldHVybiBsYWJlbElkczsKLSAgfQotICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdpdmVuIHRoZSBzZXJ2ZXIsIHJ1bnRpbWUsIGFuZCB0eXBlIGF0dHJpYnV0ZXMKLSAgKiBUaGUgYmVuZWZpdCBvZiBnZXR0aW5nIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBjbGFzcwotICAqIGZpbGUgYW5kIHBsdWdpbiBhcmUgbm90IGxvYWRlZCBpbW1lZGlhdGVseS4KLSAgKiBAcGFyYW0gc2VydmVyIGxhYmVsCi0gICogQHBhcmFtIHJ1bnRpbWUgbGFiZWwKLSAgKiBAcGFyYW0gdHlwZSBsYWJlbAotICAqIEByZXR1cm4gSUNvbmZpZ3VyYXRpb24gZWxlbWVudAotICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKFN0cmluZyBzZXJ2ZXJJZCwgU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIGlmIChzZXJ2ZXJJZD09bnVsbCB8fCBydW50aW1lSWQ9PW51bGwgfHwgdHlwZUlkPT1udWxsKQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZV8paXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQhPW51bGwgKSB7Ci0gICAgICAgIGlmICh3c3NydC5nZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXJJZCwgcnVudGltZUlkLCB0eXBlSWQpIT1udWxsKQotICAgICAgICAgIHJldHVybiB3c3NydC5nZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXJJZCwgcnVudGltZUlkLHR5cGVJZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAKLSAgfQotICAKLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWdFbGVtZW50Rm9yKFN0cmluZyBmYWN0b3J5SWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZV8paXRlci5uZXh0KCk7Ci0gICAgICAgIGlmICh3c3NydC5oYXNDb25maWdFbGVtZW50Rm9yKGZhY3RvcnlJZCwgcnVudGltZUlkLCB0eXBlSWQpKSB7Ci0gICAgICAgICAgcmV0dXJuIHdzc3J0LmVsZW1lbnRfOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc1dlYk1vZHVsZUZvcihTdHJpbmcgc2VydmVyLCBTdHJpbmcgcnVudGltZSwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKHNlcnZlciwgcnVudGltZSwgdHlwZSk7Ci0gICAgaWYgKGVsZW09PW51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gcmVwb3J0IGVycm9yIGhlcmUgaW5zdGVhZAotICAgIH0KLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGVsZW0uZ2V0QXR0cmlidXRlKCJyZXF1aXJlV2ViTW9kdWxlIikpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNFSkJNb2R1bGVGb3IoU3RyaW5nIHNlcnZlciwgU3RyaW5nIHJ1bnRpbWUsIFN0cmluZyB0eXBlKQotICB7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXIsIHJ1bnRpbWUsIHR5cGUpOyAgICAKLSAgICBpZiAoZWxlbT09bnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoZWxlbS5nZXRBdHRyaWJ1dGUoInJlcXVpcmVFSkJNb2R1bGUiKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgPGNvZGU+V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPC9jb2RlPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBTZXJ2ZXIsCi0gICogUnVudGltZSwgYW5kIFdlYiBTZXJ2aWNlIFR5cGUuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZUV4aXN0cyhTdHJpbmcgc2VydmVySUQsIFN0cmluZyBydW50aW1lSUQsIFN0cmluZyB0eXBlSUQpIAotICB7Ci0gICAgcmV0dXJuIChnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXJJRCwgcnVudGltZUlELCB0eXBlSUQpICE9IG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIDxjb2RlPldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZTwvY29kZT4gY29ycmVzcG9uZGluZyB0byB0aGUgU2VydmVyLAotICAqIFJ1bnRpbWUsIGFuZCBXZWIgU2VydmljZSBUeXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZU5hbWUoU3RyaW5nIHNlcnZlciwgU3RyaW5nIHJ1bnRpbWUsIFN0cmluZyB0eXBlKSAKLSAgewotICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gKElDb25maWd1cmF0aW9uRWxlbWVudClnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXIsIHJ1bnRpbWUsIHR5cGUpOwotICAgIHJldHVybiAoZWxlbT09bnVsbCA/IG51bGwgOiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSA8Y29kZT5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNlcnZlciwgCi0gICogUnVudGltZSwgYW5kIFdlYiBTZXJ2aWNlIHR5cGUuIFRoaXMgd2lsbCByZXR1cm4gdGhlIDxjb2RlPldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZTwvY29kZT4KLSAgKiBvYmplY3QgYW5kIHNldCB0aGUgcHJvcGVydGllcyBmb3VuZCBpbiB0aGUgbWFuaWZlc3QgZmlsZS4gaS5lLiBpc1dlYk1vZHVsZVJlcXVpcmVkLCBpc0VKQk1vZHVsZVJlcXVpcmVkCi0gICogQHBhcmFtIHNlcnZlciBsYWJlbAotICAqIEBwYXJhbSBydW50aW1lIGxhYmVsCi0gICogQHBhcmFtIFdlYiBzZXJ2aWNlIHR5cGUKLSAgKiBAcmV0dXJuIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBvYmplY3QKLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBnZXRXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUoU3RyaW5nIHNlcnZlciwgU3RyaW5nIHJ1bnRpbWUsIFN0cmluZyB0eXBlKQotICB7Ci0KLSAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgd3NzcnQgPSBudWxsOwotICAgIFN0cmluZyBzZXJ2ZXJJZCA9IGdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChzZXJ2ZXIpLmdldElkKCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXIsIHJ1bnRpbWUsIHR5cGUpOwotICAgCi0gICAgaWYoIGVsZW0gPT0gbnVsbCApCi0gICAgewotICAgICAgLy8gV2UgY291bGRuJ3QgZmluZCB0aGUgc2VydmVyIGFuZCBydW50aW1lIHNwZWNpZmllZCBzbyB3ZSB3aWxsCi0gICAgICAvLyBmaW5kIHRoZSBkZWZhdWx0IHNlcnZlciBhbmQgcnVudGltZS4KLSAgICAgIAotICAgICAgc2VydmVyICA9IGdldERlZmF1bHRTZXJ2ZXJWYWx1ZUZvcih0eXBlKTsKLSAgICAgIHJ1bnRpbWUgPSBnZXREZWZhdWx0UnVudGltZVZhbHVlRm9yKHR5cGUpOwotCi0gICAgICBlbGVtID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVyLCBydW50aW1lLCB0eXBlKTsKLSAgICAgIAotICAgIH0KLSAgIAotICAgIHJldHVybiB3c3NydDsKLQotICB9Ci0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSA8Y29kZT5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU8L2NvZGU+IGdpdmVuIHRoZSB0eXBlIG5hbWUuCi0gICogQHBhcmFtIHR5cGUgbmFtZQotICAqIEByZXRydW4gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIG9iamVjdAotICAqLwotICBwdWJsaWMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIGdldFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZUJ5SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIHdzc3J0ID0gbnVsbDsKLSAgICBpZiAoY29uZmlnRWxlbXNCeUlkXy5jb250YWluc0tleShpZCkpCi0gICAgewotICAgICAgdHJ5IHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KWNvbmZpZ0VsZW1zQnlJZF8uZ2V0KGlkKTsKLSAgICAgICAgT2JqZWN0IHdlYlNlcnZpY2VUeXBlID0gZWxlbS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICBpZiAod2ViU2VydmljZVR5cGUgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUpIAotICAgICAgICB7Ci0gICAgICAgICAgd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlKXdlYlNlcnZpY2VUeXBlOwotICAgICAgICAgIHdzc3J0LnNldFNlcnZlckxhYmVsKGVsZW0uZ2V0QXR0cmlidXRlKCJzZXJ2ZXIiKSk7Ci0gICAgICAgICAgd3NzcnQuc2V0UnVudGltZUxhYmVsKGVsZW0uZ2V0QXR0cmlidXRlKCJydW50aW1lIikpOwotICAgICAgICAgIHdzc3J0LnNldFdlYk1vZHVsZVJlcXVpcmVkKCBCb29sZWFuLnZhbHVlT2YoZWxlbS5nZXRBdHRyaWJ1dGUoInJlcXVpcmVXZWJNb2R1bGUiKSkuYm9vbGVhblZhbHVlKCkgKTsKLSAgICAgICAgICB3c3NydC5zZXRFSkJNb2R1bGVSZXF1aXJlZCggQm9vbGVhbi52YWx1ZU9mKGVsZW0uZ2V0QXR0cmlidXRlKCJyZXF1aXJlRUpCTW9kdWxlIikpLmJvb2xlYW5WYWx1ZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGltcGxlbWVudGVkSW50ZXJmYWNlID0gIm9yZy5lY2xpcHNlLmpzdC53cy51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlICI7Ci0gICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJFeHRlbnNpb25zIG9mIHRoZSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVzIGV4dGVuc2lvbiBwb2ludCBtdXN0IGltcGxlbWVudCB0aGUgIjsKLSAgICAgICAgICBlcnJNc2cgPSBlcnJNc2cgKyBpbXBsZW1lbnRlZEludGVyZmFjZSArICJpbnRlcmZhY2UuIjsKLSAgICAgICAgICBsb2dfLmxvZyhMb2cuRVJST1IsIDUwNjEsIHRoaXMsICJnZXRXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVCeUlkIiwgZXJyTXNnKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgICAgIGxvZ18ubG9nKExvZy5FUlJPUiwgNTA2MiwgdGhpcywgImdldFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZUJ5SWQiLCBjZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHdzc3J0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VUeXBlQnlTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0KLSAgICBUeXBlU2VsZWN0aW9uRmlsdGVyIHRzZiA9IG5ldyBUeXBlU2VsZWN0aW9uRmlsdGVyKCk7Ci0gICAgU3RyaW5nW10gd3N0ID0gdHNmLmdldFdlYlNlcnZpY2VUeXBlQnlJbml0aWFsU2VsZWN0aW9uKHNlbGVjdGlvbiwgd2ViU2VydmljZVR5cGVzKTsKLSAgICByZXR1cm4gd3N0ID09IG51bGwgPyBudWxsIDogd3N0OwotCi0gIH0KLQotICBwdWJsaWMgSVdlYlNlcnZpY2VUeXBlIGdldFdlYlNlcnZpY2VUeXBlQnlUeXBlTGFiZWwoU3RyaW5nIHdlYlNlcnZpY2VUeXBlTGFiZWwpCi0gIHsKLQotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVR5cGVJbXBsIHdzdCA9IChXZWJTZXJ2aWNlVHlwZUltcGwpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3N0IT1udWxsKSB7Ci0gICAgICAgIGlmICh3c3QuZ2V0TGFiZWwoKS5lcXVhbHMod2ViU2VydmljZVR5cGVMYWJlbCkpIHsKLSAgICAgICAgICByZXR1cm4gd3N0OyAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbFNlbGVjdGlvblZhbGlkRm9yQ2hvc2VuVHlwZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgewotICAgIFN0cmluZ1tdIHN1cHBvcnRlZFR5cGVzID0gZ2V0V2ViU2VydmljZVR5cGVCeVNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgIGlmIChzdXBwb3J0ZWRUeXBlcyE9bnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8c3VwcG9ydGVkVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChzdXBwb3J0ZWRUeXBlc1tpXS5lcXVhbHModHlwZU5hbWUpKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU3VwcG9ydGVkRm9yQ2hvc2VuVHlwZShTdHJpbmcgdHlwZUlkLCBTdHJpbmcgc2VydmVySUQpCi0gIHsKLSAgICBpZiAoc2VydmVyc0J5VHlwZV8uY29udGFpbnNLZXkodHlwZUlkKSkKLSAgICB7Ci0gICAgICBWZWN0b3IgdmVjdCA9IChWZWN0b3Ipc2VydmVyc0J5VHlwZV8uZ2V0KHR5cGVJZCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8dmVjdC5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcil3ZWJTZXJ2aWNlU2VydmVycy5nZXQoKFN0cmluZyl2ZWN0LmVsZW1lbnRBdChpKSk7Ci0gICAgICAgIGlmIChzZXJ2ZXJJRCE9bnVsbCkgewotICAgICAgICAgIGlmIChzZXJ2ZXJJRC5lcXVhbHNJZ25vcmVDYXNlKHdzcy5nZXRGYWN0b3J5SWQoKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VydmVyUnVudGltZVR5cGVTdXBwb3J0ZWQoU3RyaW5nIHNlcnZlciwgU3RyaW5nIHJ1bnRpbWUsIFN0cmluZyB0eXBlKSAgewotCi0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgd3NzcnQgPSBudWxsOwotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXIsIHJ1bnRpbWUsIHR5cGUpOwotICAgICAgcmV0dXJuIGVsZW0gPT0gbnVsbCA/IGZhbHNlIDogdHJ1ZTsgCi0gICAgICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlcnZlclZhbHVlRm9yKFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJzOyAKLSAgICBpZiAoc2VydmVyc0J5VHlwZV8uY29udGFpbnNLZXkodHlwZUlkKSkKLSAgICB7Ci0gICAgICBWZWN0b3IgdmVjdCA9IChWZWN0b3Ipc2VydmVyc0J5VHlwZV8uZ2V0KHR5cGVJZCk7Ci0gICAgICBzZXJ2ZXJzID0gbmV3IFN0cmluZ1t2ZWN0LnNpemUoKV07Ci0gICAgICBmb3IgKGludCBpPTA7IGk8dmVjdC5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHNlcnZlcklkID0gKFN0cmluZyl2ZWN0LmVsZW1lbnRBdChpKTsKLSAgICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcil3ZWJTZXJ2aWNlU2VydmVycy5nZXQoc2VydmVySWQpOwotICAgICAgICBzZXJ2ZXJzW2ldID0gKFN0cmluZyl3c3MuZ2V0SWQoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzZXJ2ZXJzWzBdOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbG9nXy5sb2coTG9nLkVSUk9SLCA1MDYzLCB0aGlzLCAiZ2V0U2VydmVyQnlUeXBlIiwgIlVuYWJsZSB0byBmaW5kIGRlZmF1bHQgc2VydmVyIGZvciAiK3R5cGVJZCk7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVWYWx1ZUZvcihTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgU3RyaW5nW10gcnVudGltZU5hbWUgPSBnZXRSdW50aW1lc0J5VHlwZSh0eXBlSWQpOwotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lTmFtZS5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICAgIFdlYlNlcnZpY2VSdW50aW1lIHdzciA9IChXZWJTZXJ2aWNlUnVudGltZSl3ZWJTZXJ2aWNlUnVudGltZXMuZ2V0KHJ1bnRpbWVOYW1lW2ldKTsKLSAgICAgICAgaWYgKHdzci5nZXRJc0RlZmF1bHQoKSkKLSAgICAgICAgCXJldHVybiBydW50aW1lTmFtZVtpXTsKLSAgICB9ICAgCi0gICAgcmV0dXJuIHJ1bnRpbWVOYW1lWzBdOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlcklkRm9yRmFjdG9yeUlkKFN0cmluZyBmYWN0b3J5SWQpIHsKLQotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlU2VydmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcilpdGVyLm5leHQoKTsKLSAgICAgIGlmICh3c3MuZ2V0RmFjdG9yeUlkKCkuZXF1YWxzKGZhY3RvcnlJZCkpIHsKLSAgICAgICAgcmV0dXJuIHdzcy5nZXRJZCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLQotICB9Ci0gCi0gIHB1YmxpYyBmaW5hbCBjbGFzcyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfCi0gIHsKLSAgICAKLSAgIHB1YmxpYyBTdHJpbmcgdHlwZUlkXzsKLSAgIHB1YmxpYyBTdHJpbmcgc2VydmVySWRfOwotICAgcHVibGljIFN0cmluZyBydW50aW1lSWRfOwotICAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50XzsKLSAgIAotICAgcHVibGljIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZV8oU3RyaW5nIHNlcnZlcklkLCBTdHJpbmcgcnVudGltZUlkLFN0cmluZyB0eXBlSWQsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtKQotICAgewotICAgIHRoaXMudHlwZUlkXyA9IHR5cGVJZDsKLSAgICB0aGlzLnNlcnZlcklkXyA9IHNlcnZlcklkOwotICAgIHRoaXMucnVudGltZUlkXyA9IHJ1bnRpbWVJZDsKLSAgICB0aGlzLmVsZW1lbnRfID0gZWxlbTsKLSAgIH0KLSAgICAKLSAgIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3IoU3RyaW5nIHNlcnZlcklELCBTdHJpbmcgcnVudGltZUlELCBTdHJpbmcgdHlwZUlEKQotICAgewotICAgIGlmICh0aGlzLnR5cGVJZF8uZXF1YWxzKHR5cGVJRCkgJiYgdGhpcy5zZXJ2ZXJJZF8uZXF1YWxzKHNlcnZlcklEKSAmJiB0aGlzLnJ1bnRpbWVJZF8uZXF1YWxzKHJ1bnRpbWVJRCkpCi0gICAgICByZXR1cm4gdGhpcy5lbGVtZW50XzsKLSAgICByZXR1cm4gbnVsbDsKLSAgIH0KLSAgIAotICAgcHVibGljIGJvb2xlYW4gaGFzQ29uZmlnRWxlbWVudEZvcihTdHJpbmcgZmFjdG9yeUlELCBTdHJpbmcgcnVudGltZUlELCBTdHJpbmcgdHlwZUlEKSAKLSAgIHsKLSAgICAgU3RyaW5nIHNlcnZlcklEID0gZ2V0U2VydmVySWRGb3JGYWN0b3J5SWQoIGZhY3RvcnlJRCApOyAKLSAgICAgICAKLSAgICAgaWYgKHR5cGVJZF8uZXF1YWxzSWdub3JlQ2FzZSh0eXBlSUQpICYmCi0gICAgICAgICBzZXJ2ZXJJZF8uZXF1YWxzSWdub3JlQ2FzZShzZXJ2ZXJJRCkgJiYKLSAgICAgICAgIHJ1bnRpbWVJZF8uZXF1YWxzSWdub3JlQ2FzZShydW50aW1lSUQpKQotICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICB9Ci0gICAgIAotICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIAotICB9Ci0KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5IGdldEZhY3RvcnlGYWN0b3J5KCBTdHJpbmdbXSBpZHMgKQotICB7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgIGhhc2hLZXkgPSBpZHNbMl0gKyAiIyIgKyBpZHNbMV0gKyAiIyIgKyBpZHNbMF07Ci0gICAgQ29tbWFuZFdpZGdldEJpbmRpbmcgIGJpbmRpbmcgPSAoQ29tbWFuZFdpZGdldEJpbmRpbmcpZmFjdG9yeUNhY2hlXy5nZXQoIGhhc2hLZXkgKTsKLSAgICAKLSAgICBpZiggYmluZGluZyA9PSBudWxsICkgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRDb25maWdFbGVtZW50Rm9yKCBpZHNbMl0sIGlkc1sxXSwgaWRzWzBdICk7IAotICAgIAotICAgICAgaWYoIGVsZW1lbnQgPT0gbnVsbCApIHJldHVybiBudWxsOwotICAgIAotICAgICAgYmluZGluZyA9IGNyZWF0ZUJpbmRpbmcoIGVsZW1lbnQgKTsKLSAgICAgIAotICAgICAgZmFjdG9yeUNhY2hlXy5wdXQoIGhhc2hLZXksIGJpbmRpbmcgKTsKLSAgICAgIAotICAgICAgYmluZGluZy5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YU1hcHBpbmdSZWdpc3RyeV8gKTsKLSAgICAgIAotICAgICAgaWYoIHdpZGdldFJlZ2lzdHJ5XyAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKCB3aWRnZXRSZWdpc3RyeV8gKTsKLSAgICAgICAgYmluZGluZy5yZWdpc3RlckNhbkZpbmlzaCggY2FuRmluaXNoUmVnaXN0cnlfICk7Ci0gICAgICB9Ci0gICAgfQotICAgICAgICAgCi0gICAgcmV0dXJuIGJpbmRpbmc7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgKSAKLSAgewotICAgIFZlY3RvciBiaW5kaW5ncyA9IG5ldyBWZWN0b3IoNCk7Ci0gICAgVmVjdG9yIGZyYWdtZW50cyA9IG5ldyBWZWN0b3IoNCk7Ci0gICAgCi0gICAgYWRkQmluZGluZyggZWxlbWVudCwgImRldmVsb3BCaW5kaW5nIiwgYmluZGluZ3MgKTsKLSAgICBhZGRCaW5kaW5nKCBlbGVtZW50LCAiYXNzZW1ibHlCaW5kaW5nIiwgYmluZGluZ3MgKTsKLSAgICBhZGRCaW5kaW5nKCBlbGVtZW50LCAiZGVwbG95QmluZGluZyIsIGJpbmRpbmdzICk7Ci0gICAgYWRkQmluZGluZyggZWxlbWVudCwgImluc3RhbGxCaW5kaW5nIiwgYmluZGluZ3MgKTsKLSAgICAKLSAgICBmcmFnbWVudHMuYWRkKCBuZXcgU2VydmljZVByZURldmVsb3BGcmFnbWVudCgpICk7Ci0gICAgZnJhZ21lbnRzLmFkZCggbmV3IFNlcnZpY2VQcmVBc3NlbWJseUZyYWdtZW50KCkgKTsKLSAgICBmcmFnbWVudHMuYWRkKCBuZXcgU2VydmljZVByZURlcGxveUZyYWdtZW50KCkgKTsKLSAgICBmcmFnbWVudHMuYWRkKCBuZXcgU2VydmljZVByZUluc3RhbGxGcmFnbWVudCgpICk7Ci0gICAgIAotICAgIHJldHVybiBuZXcgQ29tbWFuZFdpZGdldEJpbmRpbmdMaXN0KCBiaW5kaW5ncywgZnJhZ21lbnRzICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBhZGRCaW5kaW5nKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGJpbmRpbmdOYW1lLCBWZWN0b3IgbGlzdCApCi0gIHsKLSAgICBPYmplY3QgYmluZGluZyA9IG51bGw7Ci0gICAgCi0gICAgaWYoIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCBiaW5kaW5nTmFtZSApICE9IG51bGwgKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBiaW5kaW5nID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCBiaW5kaW5nTmFtZSApOyAKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGxpc3QuYWRkKCBiaW5kaW5nICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldERhdGFNYXBwaW5nUmVnaXN0cnkoIERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkgKQotICB7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeV8gPSByZWdpc3RyeTsKLSAgICAKLSAgICAvLyBXZSBuZWVkIHRvIHJlYnVpbGQgdGhlIGZhY3RvcnkgY2FjaGUgZWFjaCB0aW1lIHdlIHN0YXJ0IHRoZSBzZXJ2ZXIKLSAgICAvLyB3aXphcmQuCi0gICAgZmFjdG9yeUNhY2hlXyAgICAgICAgPSBuZXcgSGFzaE1hcCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXaWRnZXRSZWdpc3RyeSggV2lkZ2V0UmVnaXN0cnkgcmVnaXN0cnkgKQotICB7Ci0gICAgd2lkZ2V0UmVnaXN0cnlfID0gcmVnaXN0cnk7OyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENhbkZpbmlzaFJlZ2lzdHJ5KCBDYW5GaW5pc2hSZWdpc3RyeSByZWdpc3RyeSApCi0gIHsKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8gPSByZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBbGxTZXJ2ZXJGYWN0b3J5SWRzKCkKLSAgewotICAJT2JqZWN0W10gc2VydmVycyA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLnRvQXJyYXkoKTsKLSAgCVN0cmluZ1tdIGZhY3RvcnlJZHMgPSBuZXcgU3RyaW5nW3NlcnZlcnMubGVuZ3RoXTsKLSAgCWZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAJewotICAJCVdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgCQlmYWN0b3J5SWRzW2ldID0gd3NzLmdldEZhY3RvcnlJZCgpOwotICAJfQotICAJcmV0dXJuIGZhY3RvcnlJZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyRmFjdG9yeUlkRnJvbVNlcnZlcklkKFN0cmluZyBzZXJ2ZXJJZCkKLSAgewotICAJT2JqZWN0W10gc2VydmVycyA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLnRvQXJyYXkoKTsKLSAgCWZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAJewotICAJCVdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgCQlpZiAoc2VydmVySWQgPT0gd3NzLmdldElkKCkpCi0gIAkJewotICAJCQlyZXR1cm4gd3NzLmdldEZhY3RvcnlJZCgpOwotICAJCX0KLSAgCQkJCi0gIAl9Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoKLSAgICogUmV0dXJucyBhIGNhc2NhZGluZyBsaXN0IG9mIHZhbGlkIGNob2ljZXMgZm9yIHNlcnZlciwgcnVudGltZSwgYW5kIEoyRUUgbGV2ZWxzLiAKLSAgICogVGhpcyBpcyBhbiBpbnRlcnNlY3Rpb24gb2Ygd2hhdCBpcyBhdmFpbGFibGUgZm9yIHNlcnZpY2UgYW5kIGNsaWVudC4gCi0gICAqLwotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0U2VydmVyVG9SdW50aW1lVG9KMkVFKCkKLSAgewotICAJaWYgKHNlcnZlclRvUnVudGltZVRvSjJFRV8hPW51bGwpCi0gIAl7Ci0gIAkJcmV0dXJuIHNlcnZlclRvUnVudGltZVRvSjJFRV87Ci0gIAl9Ci0gIAkKLSAgCVN0cmluZ1tdIHNlcnZlcnMgPSBnZXRTdHJpbmdBcnJheUludGVyc2VjdGlvbihnZXRBbGxTZXJ2ZXJGYWN0b3J5SWRzKCksIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRBbGxDbGllbnRTZXJ2ZXJGYWN0b3J5SWRzKCkpOwotICAgIFNlbGVjdGlvbkxpc3Qgc2VydmVyc0xpc3QgPSBuZXcgU2VsZWN0aW9uTGlzdChzZXJ2ZXJzLCAwKTsKLSAgICBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgCWNob2ljZXMuYWRkKGdldFJ1bnRpbWVDaG9pY2VzKHNlcnZlcnNbaV0pKTsKLSAgICB9Ci0gICAgc2VydmVyVG9SdW50aW1lVG9KMkVFXyA9IG5ldyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyhzZXJ2ZXJzTGlzdCwgY2hvaWNlcyk7Ci0gICAgcmV0dXJuIHNlcnZlclRvUnVudGltZVRvSjJFRV87Ci0gIAkKLSAgfQotICAKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRSdW50aW1lQ2hvaWNlcyhTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gIAlTdHJpbmdbXSBzZXJ2aWNlUnVudGltZXMgPSBnZXRSdW50aW1lSURzQnlTZXJ2ZXJGYWN0b3J5SUQoc2VydmVyRmFjdG9yeUlkKTsKLSAgCVN0cmluZ1tdIGNsaWVudFJ1bnRpbWVzID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJ1bnRpbWVJZHNCeVNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWQpOwotICAJU3RyaW5nW10gcnVudGltZXMgPSBnZXRTdHJpbmdBcnJheUludGVyc2VjdGlvbihzZXJ2aWNlUnVudGltZXMsIGNsaWVudFJ1bnRpbWVzKTsKLSAgCVNlbGVjdGlvbkxpc3QgcnVudGltZXNMaXN0ID0gbmV3IFNlbGVjdGlvbkxpc3QocnVudGltZXMsIDApOwotICAJVmVjdG9yIGNob2ljZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHJ1bnRpbWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAJY2hvaWNlcy5hZGQoZ2V0SjJFRUNob2ljZXMocnVudGltZXNbaV0pKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyhydW50aW1lc0xpc3QsIGNob2ljZXMpOyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRKMkVFQ2hvaWNlcyhTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gIAlTdHJpbmdbXSBzZXJ2aWNlSjJFRVZlcnNpb25zID0gZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHJ1bnRpbWVJZCkuZ2V0SjJFRVZlcnNpb25zKCk7Ci0gIAlTdHJpbmdbXSBjbGllbnRKMkVFVmVyc2lvbnMgPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHJ1bnRpbWVJZCkuZ2V0SjJFRVZlcnNpb25zKCk7Ci0gIAlTdHJpbmdbXSBqMmVlVmVyc2lvbnMgPSBnZXRTdHJpbmdBcnJheUludGVyc2VjdGlvbihzZXJ2aWNlSjJFRVZlcnNpb25zLCBjbGllbnRKMkVFVmVyc2lvbnMpOwotICAJU2VsZWN0aW9uTGlzdCBqMmVlVmVyc2lvbnNMaXN0ID0gbmV3IFNlbGVjdGlvbkxpc3QoajJlZVZlcnNpb25zLCAwKTsKLSAgCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMoajJlZVZlcnNpb25zTGlzdCwgbnVsbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTGFiZWwoU3RyaW5nIGZhY3RvcnlJZCkKLSAgewotICAJaWYgKGZhY3RvcnlJZD09bnVsbCB8fCBmYWN0b3J5SWQubGVuZ3RoKCk9PTApCi0gIAkJcmV0dXJuIG51bGw7Ci0gIAkKLSAgCWlmIChzZXJ2ZXJMYWJlbEJ5RmFjdG9yeUlkXy5jb250YWluc0tleShmYWN0b3J5SWQpKQotICAJewotICAJICByZXR1cm4gKFN0cmluZylzZXJ2ZXJMYWJlbEJ5RmFjdG9yeUlkXy5nZXQoZmFjdG9yeUlkKTsKLSAgCX0KLSAgCWVsc2UKLSAgCXsKLSAgCSAgcmV0dXJuIG51bGw7Ci0gIAl9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyRmFjdG9yeUlkKFN0cmluZyBsYWJlbCkKLSAgewotICAJaWYgKGxhYmVsPT1udWxsIHx8IGxhYmVsLmxlbmd0aCgpPT0wKQotICAJCXJldHVybiBudWxsOwotICAJCi0gIAlpZiAoc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8uY29udGFpbnNLZXkobGFiZWwpKQotICAJewotICAJICByZXR1cm4gKFN0cmluZylzZXJ2ZXJGYWN0b3J5SWRCeUxhYmVsXy5nZXQobGFiZWwpOyAgCi0gIAl9Ci0gIAllbHNlCi0gIAl7Ci0gIAkgIHJldHVybiBudWxsOwotICAJfSAgCSAgCQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbChTdHJpbmcgaWQpCi0gIHsKLSAgCWlmIChpZD09bnVsbCB8fCBpZC5sZW5ndGgoKT09MCkKLSAgCQlyZXR1cm4gbnVsbDsKLSAgCQotICAJcmV0dXJuIChTdHJpbmcpIHJ1bnRpbWVMYWJlbEJ5SWRfLmdldChpZCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUlkKFN0cmluZyBsYWJlbCkKLSAgewotICAJaWYgKGxhYmVsPT1udWxsIHx8IGxhYmVsLmxlbmd0aCgpPT0wKQotICAJCXJldHVybiBudWxsOwotICAJCi0gIAlyZXR1cm4gKFN0cmluZylydW50aW1lSWRCeUxhYmVsXy5nZXQobGFiZWwpOyAgCQotICB9ICAKLSAgCi0gIHByaXZhdGUgU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXlJbnRlcnNlY3Rpb24oU3RyaW5nW10gYTEsIFN0cmluZ1tdIGEyKQotICB7Ci0gIAlWZWN0b3IgdmYgPSBuZXcgVmVjdG9yKCk7Ci0gIAlpZiAoYTE9PW51bGwgfHwgYTI9PW51bGwpCi0gIAl7Ci0gIAkJcmV0dXJuIGNvbnZlcnRUb1N0cmluZ0FycmF5KHZmLnRvQXJyYXkoKSk7Ci0gIAl9ICAJCi0gIAkKLSAgCWZvciAoaW50IGk9MDsgaTxhMS5sZW5ndGg7IGkrKykKLSAgCXsKLSAgCQlmb3IgKGludCBqPTA7IGo8YTIubGVuZ3RoOyBqKyspCi0gIAkJewotICAJCQlpZiAoYTFbaV0uZXF1YWxzKGEyW2pdKSkKLSAgCQkJewotICAJCQkJdmYuYWRkKGExW2ldKTsKLSAgCQkJCWJyZWFrOwotICAJCQl9Ci0gIAkJfQotICAJfQotICAJCi0gIAlyZXR1cm4gY29udmVydFRvU3RyaW5nQXJyYXkodmYudG9BcnJheSgpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBjb252ZXJ0VG9TdHJpbmdBcnJheShPYmplY3RbXSBhKQotICB7Ci0gIAlpZiAoYT09bnVsbCkgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gIAkKLSAgCWludCBsZW5ndGggPSBhLmxlbmd0aDsKLSAgCVN0cmluZ1tdIHNhID0gbmV3IFN0cmluZ1tsZW5ndGhdOwotICAJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKQotICAJewotICAJCU9iamVjdCBvYmogPSBhW2ldOwotICAJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpCi0gIAkJewotICAJCQlzYVtpXSA9IChTdHJpbmcpb2JqOwotICAJCX0KLSAgCX0KLSAgCXJldHVybiBzYTsKLSAgfQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4ZjRmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYSBraW5kIG9mCi0qIFdlYiBTZXJ2aWNlIGFydGlmYWN0LiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIGEgV2ViU2VydmljZVR5cGUKLSogb2JqZWN0IGlzIHRvIG1hbnVmYWN0dXJlIHRoZSB3aXphcmQgcGFnZXMgdGhhdCBzdXBwb3J0IHRoZSB0eXBlLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZVR5cGUKLXsKLSAgLyoqCi0gICogUmV0dXJucyBhIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOWRlNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VUeXBlCi0qIG9iamVjdCBpcyB0byBtYW51ZmFjdHVyZSB0aGUgd2l6YXJkIHBhZ2VzIHRoYXQgc3VwcG9ydCB0aGUgdHlwZS4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVR5cGVJbXBsIGltcGxlbWVudHMgSVdlYlNlcnZpY2VUeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50XzsKLSAgcHVibGljIFN0cmluZyB0eXBlSWRfOwotICBwdWJsaWMgU3RyaW5nIHR5cGVMYWJlbF87Ci0gIHB1YmxpYyBTdHJpbmdbXSBleHRlbnNpb25NZXRhZGF0YV87Ci0gIHB1YmxpYyBTdHJpbmdbXSByZXNvdXJjZVR5cGVNZXRhZGF0YV87Ci0gIHB1YmxpYyBCb29sZWFuIGNhbkZpbmlzaF87Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VUeXBlSW1wbChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lbGVtZW50XyA9IGVsZW07IAotICB9Ci0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKQotICB7Ci0gICAgaWYgKHR5cGVJZF89PW51bGwpCi0gICAgICB0eXBlSWRfID0gZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIHJldHVybiB0eXBlSWRfOwotICB9Ci0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsICgpCi0gIHsKLSAgICBpZiAodHlwZUxhYmVsXyA9PSBudWxsKQotICAgICAgdHlwZUxhYmVsXyA9IGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKLSAgICByZXR1cm4gdHlwZUxhYmVsXzsgICAgCi0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZSdzIGV4dGVuc2lvbiBtZXRhZGF0YS4KLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZSdzIGV4dGVuc2lvbiBtZXRhZGF0YS4KLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEV4dGVuc2lvbk1ldGFkYXRhICgpCi0gIHsKLSAgICBpZiAoZXh0ZW5zaW9uTWV0YWRhdGFfID09bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgiZXh0ZW5zaW9uTWV0YWRhdGEiKSk7Ci0gICAgICBleHRlbnNpb25NZXRhZGF0YV8gPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgICAgaW50IGk9MDsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGV4dGVuID0gKFN0cmluZylzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgaWYgKGV4dGVuIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGFfW2ldPWV4dGVuOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICAgIH0gICAgCi0gICAgfQotICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbk1ldGFkYXRhXzsKLSAgfSAgICAKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZSdzIHJlc291cmNlIG1ldGFkYXRhLgotICAqIEByZXR1cm4gQSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlJ3MgcmVzb3VyY2UgbWV0YWRhdGEuCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZVR5cGVNZXRhZGF0YSAoKQotICB7Ci0gICAgaWYgKHJlc291cmNlVHlwZU1ldGFkYXRhXyA9PSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJyZXNvdXJjZVR5cGVNZXRhZGF0YSIpKTsgICAgCi0gICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YV8gPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgICAgaW50IGk9MDsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc291cmNlVHlwZSA9IChTdHJpbmcpc3QubmV4dFRva2VuKCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZVR5cGUhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YV9baV09cmVzb3VyY2VUeXBlOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc291cmNlVHlwZU1ldGFkYXRhXzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGx1Z2luLnhtbCBjb250YWlucyBhbiBhdHRyaWJ1dGUgb2YgImNhbkZpbmlzaCIgd2l0aCBhIHZhbHVlIG9mIHRydWUuICBPdGhlcndpc2UsIAotICAqIGZhbHNlIGlzIHJldHVybmVkLiAgTm90ZTogaWYgdGhlICJjYW5GaW5pc2giIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkIHRydWUgaXMgcmV0dXJuZWQgYnkgZGVmYXVsdC4KLSAgKiBAcmV0dXJuIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHVzZXIgY2FuIGZpbmlzaCBvbiB0aGUgcGFnZXMgYmVmb3JlIHRoZSB3ZWIgc2VydmljZSB0eXBlIHBhZ2VzLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRDYW5GaW5pc2goKQotICB7Ci0gICAgaWYoIGNhbkZpbmlzaF8gPT0gbnVsbCApCi0gICAgeyAgICAgIAotICAgICAgU3RyaW5nIGNhbkZpbmlzaFN0cmluZyA9IGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgiY2FuRmluaXNoIik7Ci0KLSAgICAgIGNhbkZpbmlzaF8gPSBjYW5GaW5pc2hTdHJpbmcgPT0gbnVsbCA/IG5ldyBCb29sZWFuKCB0cnVlICkgOiBCb29sZWFuLnZhbHVlT2YoIGNhbkZpbmlzaFN0cmluZyApOwotICAgIH0KLQotICAgIHJldHVybiBjYW5GaW5pc2hfLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aAotICAgKiB0aGlzIHR5cGUuCi0gICAqIAotICAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZWxlbWVudF87IAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRPYmplY3RTZWxlY3Rpb25XaWRnZXQoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgib2JqZWN0U2VsZWN0aW9uV2lkZ2V0Iik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjM2ZlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVR5cGVSZWdpc3RyeQotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVR5cGVSZWdpc3RyeSBpbnN0YW5jZV87Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgdHlwZXNCeU5hbWVfOwotICBwcml2YXRlIFN0cmluZ1tdIHR5cGVOYW1lc187Ci0KLSAgLy8KLSAgLy8gTG9hZHMgV2ViU2VydmljZVR5cGUgb2JqZWN0cyBpbnRvIHRoaXMgcmVnaXN0cnkuCi0gIC8vIFRoaXMgaXMgZG9uZSBieSBxdWVyeWluZyB0aGUgcGx1Z2luIHJlZ2lzdHJ5IGZvciBhbGwgZXh0ZW5zaW9ucwotICAvLyBoYW5naW5nIG9uIHRoZSB3ZWJTZXJ2aWNlVHlwZSBleHRlbnNpb24gcG9pbnQuIEV4dGVuc2lvbnMKLSAgLy8gbXVzdCBpbXBsZW1lbnQgdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aS53aXphcmQuV2ViU2VydmljZVR5cGUKLSAgLy8gaW50ZXJmYWNlLgotICAvLwotICBwcml2YXRlIHZvaWQgbG9hZFR5cGVzICgpCi0gIHsKLSAgCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYlNlcnZpY2VUeXBlIik7Ci0KLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8Y29uZmlnLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gY29uZmlnW2lkeF07Ci0gICAgICB0cnkgCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCB3ZWJTZXJ2aWNlVHlwZSA9IGVsZW0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VUeXBlIGluc3RhbmNlb2YgV2ViU2VydmljZVR5cGUpIAotICAgICAgICB7Ci0gICAgICAgICAgYWRkKChXZWJTZXJ2aWNlVHlwZSl3ZWJTZXJ2aWNlVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGltcGxlbWVudGVkSW50ZXJmYWNlID0gIm9yZy5lY2xpcHNlLmpzdC53cy51aS53aXphcmQuV2ViU2VydmljZVR5cGUgIjsKLSAgICAgICAgICBTdHJpbmcgZXJyTXNnID0gIkV4dGVuc2lvbnMgb2YgdGhlIHdlYlNlcnZpY2VUeXBlcyBleHRlbnNpb24gcG9pbnQgbXVzdCBpbXBsZW1lbnQgdGhlICI7Ci0gICAgICAgICAgZXJyTXNnID0gZXJyTXNnICsgaW1wbGVtZW50ZWRJbnRlcmZhY2UgKyAiaW50ZXJmYWNlLiI7Ci0gICAgICAJICBsb2cubG9nKExvZy5FUlJPUiwgNTA1NiwgdGhpcywgImxvYWRUeXBlcyIsIGVyck1zZyk7Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIAlsb2cubG9nKExvZy5FUlJPUiwgNTA1NywgdGhpcywgImxvYWRUeXBlcyIsIGUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vCi0gIC8vIExvYWRzIFdlYlNlcnZpY2VUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBTZWUgbWV0aG9kIGdldEluc3RhbmNlKCkuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkICgpCi0gIHsKLSAgICB0eXBlc0J5TmFtZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgbG9hZFR5cGVzKCk7Ci0gICAgaW5kZXhUeXBlc0J5TmFtZSgpOwotICB9Ci0KLSAgLy8KLSAgLy8gQWRkIHRoZSBnaXZlbiBXZWJTZXJ2aWNlVHlwZSB0byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBTZWUgbWV0aG9kIGxvYWQoKS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGFkZCAoIFdlYlNlcnZpY2VUeXBlIHdzdCApCi0gIHsKLSAgICB0eXBlc0J5TmFtZV8ucHV0KHdzdC5nZXROYW1lKCksd3N0KTsKLSAgfQotCi0gIC8vCi0gIC8vIEJ1aWxkcyBhbiBpbmRleCBvZiBXZWJTZXJ2aWNlVHlwZSBvYmplY3RzIGJ5IHRoZWlyIG5hbWVzLgotICAvLyBTZWUgbWV0aG9kIGxvYWQoKS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGluZGV4VHlwZXNCeU5hbWUgKCkKLSAgewotICAgIGlmICh0eXBlTmFtZXNfID09IG51bGwpCi0gICAgewotICAgICAgdHlwZU5hbWVzXyA9IG5ldyBTdHJpbmdbdHlwZXNCeU5hbWVfLnNpemUoKV07Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gdHlwZXNCeU5hbWVfLmtleXMoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgICAgewotICAgICAgICB0eXBlTmFtZXNfW2ldID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZVR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBXZWJTZXJ2aWNlVHlwZVJlZ2lzdHJ5KCk7Ci0gICAgICBpbnN0YW5jZV8ubG9hZCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gb2JqZWN0cy4KLSAgKiBAcmV0dXJuIEFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VUeXBlPC9jb2RlPiBvYmplY3RzLgotICAqLwotICBwdWJsaWMgV2ViU2VydmljZVR5cGVbXSBnZXRXZWJTZXJ2aWNlVHlwZXMgKCkKLSAgewotICAgIFdlYlNlcnZpY2VUeXBlW10gd3N0cyA9IG5ldyBXZWJTZXJ2aWNlVHlwZVt0eXBlc0J5TmFtZV8uc2l6ZSgpXTsKLSAgICBFbnVtZXJhdGlvbiBlID0gdHlwZXNCeU5hbWVfLmVsZW1lbnRzKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgewotICAgICAgd3N0c1tpXSA9IChXZWJTZXJ2aWNlVHlwZSllLm5leHRFbGVtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiB3c3RzOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+Ci0gICogb2JqZWN0cy4KLSAgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4KLSAgKiBvYmplY3RzLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVR5cGVOYW1lcyAoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVOYW1lc187Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gb2JqZWN0IG9mIHRoZSBnaXZlbgotICAqIDxjb2RlPm5hbWU8L2NvZGU+IG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCBvYmplY3QuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIDxjb2RlPldlYlNlcnZpY2VUeXBlPC9jb2RlPiB0byBmaW5kLgotICAqIEByZXR1cm4gVGhlIDxjb2RlPldlYlNlcnZpY2VUeXBlPC9jb2RlPiBvciBudWxsIGlmIG5vIHN1Y2ggb2JqZWN0Ci0gICogd2FzIGZvdW5kLgotICAqLwotICBwdWJsaWMgV2ViU2VydmljZVR5cGUgZ2V0V2ViU2VydmljZVR5cGVCeU5hbWUgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICByZXR1cm4gKG5hbWUgPT0gbnVsbCA/IG51bGwgOiAoV2ViU2VydmljZVR5cGUpdHlwZXNCeU5hbWVfLmdldChuYW1lKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlJQk0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5SUJNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZWExM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlJQk0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuV1NQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaWNVRERJUmVnaXN0cnlJQk0gaW1wbGVtZW50cyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlCi17Ci0KLSAgICAvLyBDb3B5cmlnaHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gICAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeUlCTSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9JQk0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3VkZGkuaWJtLmNvbS91YnIvaW5xdWlyeWFwaSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdWRkaS5pYm0uY29tL3Vici9wdWJsaXNoYXBpIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaS5pYm0uY29tL3Vici9yZWdpc3RyeS5odG1sIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5SUJNVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlJQk1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZTlmYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlJQk1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLldTUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5SUJNVGVzdCBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5SUJNVGVzdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9JQk1fVEVTVCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaS5pYm0uY29tL3Rlc3RyZWdpc3RyeS9pbnF1aXJ5YXBpIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly91ZGRpLmlibS5jb20vdGVzdHJlZ2lzdHJ5L3B1Ymxpc2hhcGkiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpLmlibS5jb20vdGVzdHJlZ2lzdHJ5L3JlZ2lzdHJ5Lmh0bWwiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWRjYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuV1NQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnQgaW1wbGVtZW50cyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlCi17Ci0KLSAgICAvLyBDb3B5cmlnaHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gICAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3VkZGkubWljcm9zb2Z0LmNvbS9pbnF1aXJlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly91ZGRpLm1pY3Jvc29mdC5jb20vcHVibGlzaCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RyYXRpb25VUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly91ZGRpLm1pY3Jvc29mdC5jb20vcmVnaXN0ZXIuYXNweCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E5MzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5XU1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFB1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QgaW1wbGVtZW50cyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlCi17Ci0KLSAgICAvLyBDb3B5cmlnaHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gICAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUX1RFU1QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3Rlc3QudWRkaS5taWNyb3NvZnQuY29tL2lucXVpcmUiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwczovL3Rlc3QudWRkaS5taWNyb3NvZnQuY29tL3B1Ymxpc2giOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly90ZXN0LnVkZGkubWljcm9zb2Z0LmNvbS9yZWdpc3Rlci5hc3B4IjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlOVFRDb21tLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkY2NhNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlOVFRDb21tLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLldTUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbSBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9OVFRDT01NIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cudWRkaS5uZS5qcC91YnIvaW5xdWlyeWFwaSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vd3d3LnVkZGkubmUuanAvdWJyL3B1Ymxpc2hhcGkiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cubnR0LmNvbS91ZGRpLyI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVNBUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlTQVAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlYjhlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVNBUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5XU1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFB1YmxpY1VERElSZWdpc3RyeVNBUCBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5U0FQKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFdTUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaS5zYXAuY29tL1VEREkvYXBpL2lucXVpcnkvIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly91ZGRpLnNhcC5jb20vVURESS9hcGkvcHVibGlzaC8iOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpLnNhcC5jb20vIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlTQVBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOGJkYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlTQVBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLldTUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdCBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9TQVBfVEVTVCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaXRlc3Quc2FwLmNvbS9VRERJL2FwaS9pbnF1aXJ5LyI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdWRkaXRlc3Quc2FwLmNvbS9VRERJL2FwaS9wdWJsaXNoLyI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RyYXRpb25VUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3VkZGl0ZXN0LnNhcC5jb20vIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZDllNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpOwotCi1wdWJsaWMgaW50ZXJmYWNlIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVhNZXRob2RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVhNZXRob2RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNzBkMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlYTWV0aG9kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5XU1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFB1YmxpY1VERElSZWdpc3RyeVhNZXRob2RzIGltcGxlbWVudHMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotewotCi0gICAgLy8gQ29weXJpZ2h0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAgIHB1YmxpYyBQdWJsaWNVRERJUmVnaXN0cnlYTWV0aG9kcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9YTUVUSE9EUyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICAgICAgLy9yZXR1cm4gImh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlIjsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaS54bWV0aG9kcy5uZXQvaW5xdWlyZTIiOwotICAgIH0KLQotICAgIC8vIFJlYWQtb25seSByZWdpc3RyeS4gVGhlIHB1Ymxpc2ggYW5kIHJlZ2lzdHJhdGlvbiBVUkxzIGRvbid0IGV4aXN0LgotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwczovL3VkZGkueG1ldGhvZHMubmV0L3B1Ymxpc2gyIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnhtZXRob2RzLm5ldC92ZTIvUmVnaXN0ZXIucG8/ZXZlbnQ9cmVnaXN0ZXJPcmciOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0FkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0FkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI2NDk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9BZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2lsLkFkZFdTRExUb1dTSUxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLQotcHVibGljIGNsYXNzIEFkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBBZGRXU0RMVG9XU0lMQ29tbWFuZCBjb21tYW5kOwotICBwcml2YXRlIEFyZ3VtZW50cyBhcmdzOwotCi0gIHB1YmxpYyBBZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsLkFkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZCIsICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5BZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQiKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBpZiAoY29tbWFuZCA9PSBudWxsKQotICAgICAgY29tbWFuZCA9IG5ldyBBZGRXU0RMVG9XU0lMQ29tbWFuZCgpOwotICAgIGlmICghYXJncy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgY29tbWFuZC5zZXRBcmd1bWVudHMoYXJncy5nZXRTdHJpbmdBcmd1bWVudHMoKSk7Ci0gICAgICBjb21tYW5kLnNldFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcihuZXcgRGlhbG9nV1dXQXV0aGVudGljYXRpb24oUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKSk7Ci0gICAgICByZXR1cm4gY29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXJncyhBcmd1bWVudHMgYXJncykKLSAgewotICAgIHRoaXMuYXJncyA9IGFyZ3M7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChBZGRXU0RMVG9XU0lMQ29tbWFuZCBjb21tYW5kKQotICB7Ci0gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvQXJndW1lbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvQXJndW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTc3YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0FyZ3VtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEFyZ3VtZW50cwotewotICBwcml2YXRlIFZlY3RvciBhcmdzXzsKLQotICBwdWJsaWMgQXJndW1lbnRzKCkKLSAgewotICAgIGFyZ3NfID0gbmV3IFZlY3RvcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGFyZ3NfLmFkZChrZXkpOwotICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgYXJnc18uYWRkKHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcga2V5KQotICB7Ci0gICAgaW50IGluZGV4ID0gYXJnc18uaW5kZXhPZihrZXkpOwotICAgIGlmIChpbmRleCA+PSAwKQotICAgIHsKLSAgICAgIGFyZ3NfLnJlbW92ZShpbmRleCk7Ci0gICAgICBhcmdzXy5yZW1vdmUoaW5kZXgrMSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkKLSAgewotICAgIGludCBpbmRleCA9IGFyZ3NfLmluZGV4T2Yoa2V5KTsKLSAgICBpZiAoaW5kZXggPj0gMCkKLSAgICAgIHJldHVybiBhcmdzXy5nZXQoaW5kZXgrMSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gIHsKLSAgICBhcmdzXy5jbGVhcigpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdFtdIGdldEFyZ3VtZW50cygpCi0gIHsKLSAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFthcmdzXy5zaXplKCldOwotICAgIGFyZ3NfLmNvcHlJbnRvKGFyZ3MpOwotICAgIHJldHVybiBhcmdzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ0FyZ3VtZW50cygpCi0gIHsKLSAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1thcmdzXy5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLSAgICAgIGFyZ3NbaV0gPSBhcmdzXy5nZXQoaSkudG9TdHJpbmcoKTsKLSAgICByZXR1cm4gYXJnczsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotICB7Ci0gICAgcmV0dXJuIGFyZ3NfLmlzRW1wdHkoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0RpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvRGlhbG9nV1dXQXV0aGVudGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2MWUyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvRGlhbG9nV1dXQXV0aGVudGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV1dXQXV0aGVudGljYXRpb25IYW5kbGVyOwotCi0KLXB1YmxpYyBjbGFzcyBEaWFsb2dXV1dBdXRoZW50aWNhdGlvbiBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcgotewotCi0gIC8qQ09OVEVYVF9JRCBEQkFTMDAwMSBmb3IgdGhlIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24gdXNlciBuYW1lKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9EQkFTX1VTRVJOQU1FID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLkRCQVMwMDAxIjsKLQotICAvKkNPTlRFWFRfSUQgREJBUzAwMDIgZm9yIHRoZSBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHBhc3N3b3JkKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9EQkFTX1BBU1NXT1JEID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLkRCQVMwMDAyIjsKLQotICBwcml2YXRlIFN0cmluZyB1c2VybmFtZVN0cmluZ187Ci0gIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkU3RyaW5nXzsKLQotICBwcml2YXRlIFRleHQgdXNlcm5hbWVfOwotICBwcml2YXRlIFRleHQgcGFzc3dvcmRfOwotCi0gIHByaXZhdGUgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24gd3d3YWVfOwotCi0gIHB1YmxpYyBEaWFsb2dXV1dBdXRoZW50aWNhdGlvbihTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgICB1c2VybmFtZVN0cmluZ18gPSBudWxsOwotICAgIHBhc3N3b3JkU3RyaW5nXyA9IG51bGw7Ci0gICAgd3d3YWVfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBDYW5jZWwgYnV0dG9uIGlzIHByZXNzZWQuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKQotICB7Ci0gICAgdXNlcm5hbWVTdHJpbmdfID0gbnVsbDsKLSAgICBwYXNzd29yZFN0cmluZ18gPSBudWxsOwotICAgIHN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgcHJlc3NlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkKLSAgewotICAgIFN0cmluZyB1c2VybmFtZVN0cmluZyA9IHVzZXJuYW1lXy5nZXRUZXh0KCk7Ci0gICAgdXNlcm5hbWVTdHJpbmdfID0gKHVzZXJuYW1lU3RyaW5nLmxlbmd0aCgpID4gMCkgPyB1c2VybmFtZVN0cmluZyA6IG51bGw7Ci0gICAgU3RyaW5nIHBhc3N3b3JkU3RyaW5nID0gcGFzc3dvcmRfLmdldFRleHQoKTsKLSAgICBwYXNzd29yZFN0cmluZ18gPSAocGFzc3dvcmRTdHJpbmcubGVuZ3RoKCkgPiAwKSA/IHBhc3N3b3JkU3RyaW5nIDogbnVsbDsKLSAgICBzZXRSZXR1cm5Db2RlKERpYWxvZy5PSyk7Ci0gICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGx9LgotICAqIEBwYXJhbSBzaGVsbCBUaGUgc2hlbGwuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9IVFRQX0JBU0lDX0FVVEgiKSk7Ci0gIH0KLQotICAvKiogCi0gICogQ3JlYXRlcyB0aGUgZGlhbG9nIGFyZWEuCi0gICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLSAgKiBAcmV0dXJuIFRoZSBjb250cm9sIGFyZWEuCi0gICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gNDAwOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wudmVydGljYWxTcGFjaW5nID0gMTU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0KLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9VUkwiKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KHd3d2FlXy5nZXRVUkwoKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUUiKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICB1c2VybmFtZV8gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgIHVzZXJuYW1lXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICB1c2VybmFtZV8uc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodXNlcm5hbWVfLCBJTkZPUE9QX0RCQVNfVVNFUk5BTUUpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgbGFiZWwuc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEIikpOwotICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0gICAgcGFzc3dvcmRfID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICBwYXNzd29yZF8uc2V0RWNob0NoYXIoJyonKTsKLSAgICBwYXNzd29yZF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgcGFzc3dvcmRfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRCIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVzZXJuYW1lXywgSU5GT1BPUF9EQkFTX1BBU1NXT1JEKTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtc2dJZCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKG1zZ0lkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVdXV0F1dGhlbnRpY2F0aW9uKFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlKQotICB7Ci0gICAgdXNlcm5hbWVTdHJpbmdfID0gbnVsbDsKLSAgICBwYXNzd29yZFN0cmluZ18gPSBudWxsOwotICAgIHd3d2FlXyA9IHd3d2FlOwotICAgIG9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHVzZXJuYW1lU3RyaW5nXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQotICB7Ci0gICAgcmV0dXJuIHBhc3N3b3JkU3RyaW5nXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL1RhYmxlVmlld2VyRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvVGFibGVWaWV3ZXJFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5OGMxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvVGFibGVWaWV3ZXJFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotcHVibGljIGNsYXNzIFRhYmxlVmlld2VyRWRpdG9yIGV4dGVuZHMgQ29tcG9zaXRlCi17Ci0gIHByaXZhdGUgaW50IERFRkFVTFRfVEFCTEVfSEVJR0hUX0hJTlQgPSAxMDA7Ci0gIHByaXZhdGUgaW50IERFRkFVTFRfQ09MVU1OX1dJRFRIID0gODA7Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5zXzsKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcl87Ci0gIHByaXZhdGUgVGFibGUgdGFibGVfOwotICBwcml2YXRlIFRhYmxlRWRpdG9yIGVkaXRvcl87Ci0gIHByaXZhdGUgVGFibGVFZGl0b3JMaXN0ZW5lciB0YWJsZUVkaXRvckxpc3RlbmVyXzsKLSAgcHJpdmF0ZSBUZXh0IHRleHRfOwotICBwcml2YXRlIEJ1dHRvbiBhZGRfOwotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVfOwotCi0gIHByaXZhdGUgTGlzdCB2YWx1ZXNfOwotICBwcml2YXRlIE9iamVjdCBkZWZhdWx0VmFsdWVfOwotCi0gIHB1YmxpYyBUYWJsZVZpZXdlckVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBjb2x1bW5zLCBMaXN0IGluaXRWYWx1ZXMsIE9iamVjdCBkZWZhdWx0VmFsdWUpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBjb2x1bW5zXyA9IGNvbHVtbnM7Ci0gICAgdmFsdWVzXyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoaW5pdFZhbHVlcyAhPSBudWxsICYmIGluaXRWYWx1ZXMuc2l6ZSgpID4gMCkKLSAgICAgIHZhbHVlc18uYWRkQWxsKGluaXRWYWx1ZXMpOwotICAgIGRlZmF1bHRWYWx1ZV8gPSAoZGVmYXVsdFZhbHVlICE9IG51bGwpID8gZGVmYXVsdFZhbHVlIDogbmV3IFN0cmluZygiIik7Ci0gICAgY3JlYXRlUGFydENvbnRyb2wodGhpcyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIHNldExheW91dChnbCk7Ci0gICAgc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgdGFibGVfID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IERFRkFVTFRfVEFCTEVfSEVJR0hUX0hJTlQ7Ci0gICAgdGFibGVfLnNldExheW91dERhdGEoZ2QpOwotICAgIHRhYmxlXy5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIHRhYmxlXy5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICBpbnQgbWF4V2lkdGggPSBERUZBVUxUX0NPTFVNTl9XSURUSDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNfLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlXywgU1dULk5PTkUpOwotICAgICAgdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5zX1tpXSk7Ci0gICAgICB0YWJsZUNvbHVtbi5wYWNrKCk7Ci0gICAgICBpbnQgdGFibGVDb2x1bW5XaWR0aCA9IE1hdGgubWF4KERFRkFVTFRfQ09MVU1OX1dJRFRILCB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpKTsKLSAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIHRhYmxlQ29sdW1uV2lkdGgpOwotICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5EYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEodGFibGVDb2x1bW5XaWR0aCwgdGFibGVDb2x1bW5XaWR0aCwgdHJ1ZSk7Ci0gICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbkRhdGEpOwotICAgIH0KLSAgICB0YWJsZV8uc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLSAgICAvLyBpbml0aWFsaXplIHRoZSB0YWJsZSBlZGl0b3IKLSAgICBlZGl0b3JfID0gbmV3IFRhYmxlRWRpdG9yKHRhYmxlXyk7Ci0gICAgLy8gVGhlIGVkaXRvciBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY2VsbCBhbmQgbXVzdAotICAgIC8vIG5vdCBiZSBhbnkgc21hbGxlciB0aGFuIDUwIHBpeGVscy4KLSAgICBlZGl0b3JfLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLSAgICBlZGl0b3JfLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLSAgICBlZGl0b3JfLm1pbmltdW1XaWR0aCA9IG1heFdpZHRoOwotICAgIHRhYmxlRWRpdG9yTGlzdGVuZXJfID0gbmV3IFRhYmxlRWRpdG9yTGlzdGVuZXIoKTsKLSAgICB0YWJsZV8uYWRkTW91c2VMaXN0ZW5lcih0YWJsZUVkaXRvckxpc3RlbmVyXyk7Ci0gICAgdGFibGVWaWV3ZXJfID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlXyk7Ci0gICAgdGFibGVWaWV3ZXJfLmdldENvbnRyb2woKS5hZGRLZXlMaXN0ZW5lcigKLSAgICAgIG5ldyBLZXlMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIERlbAotICAgICAgICAgIGlmICgoKGludCllLmNoYXJhY3RlcikgPT0gMTI3KSAKLSAgICAgICAgICAgIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKTsKLSAgICAgICAgICAvLyBFbnRlciBvciBzcGFjZQotICAgICAgICAgIGlmICgoKGludCllLmNoYXJhY3RlcikgPT0gMTMgfHwgKChpbnQpZS5jaGFyYWN0ZXIpID09IDMyKQotICAgICAgICAgICAgdGFibGVFZGl0b3JMaXN0ZW5lcl8uZWRpdFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgdGFibGVWaWV3ZXJfLnNldENvbnRlbnRQcm92aWRlcihuZXcgTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLSAgICB0YWJsZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcihuZXcgTGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgdGFibGVWaWV3ZXJfLnNldElucHV0KHZhbHVlc18pOwotICAgIHRhYmxlVmlld2VyXy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0gICAgICBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgZW5hYmxlUmVtb3ZlKHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLQotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0gICAgYWRkXyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgYWRkXy5zZXRUZXh0KFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9BREQiKSk7Ci0gICAgYWRkXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICBhZGRfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotICAgICAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotCi0gICAgcmVtb3ZlXyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgcmVtb3ZlXy5zZXRUZXh0KFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9SRU1PVkUiKSk7Ci0gICAgcmVtb3ZlXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICByZW1vdmVfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotICAgICAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIGVuYWJsZVJlbW92ZShmYWxzZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlUmVtb3ZlKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotICAgIHJlbW92ZV8uc2V0RW5hYmxlZChlbmFibGVkICYmICF0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotICAgIHZhbHVlc18uYWRkKGRlZmF1bHRWYWx1ZV8pOwotICAgIHJlZnJlc2goKTsKLSAgICBzZXRTZWxlY3Rpb25Bc09iamVjdCh2YWx1ZXNfLmdldCh0YWJsZV8uZ2V0SXRlbUNvdW50KCktMSkpOwotICAgIHRhYmxlRWRpdG9yTGlzdGVuZXJfLmVkaXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotICAgIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVEZWxldGVLZXlQcmVzc2VkKCkKLSAgewotICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotICAgIHsKLSAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IHRhYmxlXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgaW50IHNlbGVjdGlvbkNvdW50ID0gdGFibGVfLmdldEl0ZW1Db3VudCgpOwotICAgICAgdmFsdWVzXy5yZW1vdmUoc2VsZWN0aW9uSW5kZXgpOwotICAgICAgaWYgKHNlbGVjdGlvbkluZGV4IDwgc2VsZWN0aW9uQ291bnQtMSkKLSAgICAgICAgc2V0U2VsZWN0aW9uQXNPYmplY3QodmFsdWVzXy5nZXQoc2VsZWN0aW9uSW5kZXgpKTsKLSAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbkNvdW50IC0yID49IDApCi0gICAgICAgIHNldFNlbGVjdGlvbkFzT2JqZWN0KHZhbHVlc18uZ2V0KHNlbGVjdGlvbkNvdW50LTIpKTsKLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW50ZXJuYWxSZWZyZXNoKCkKLSAgewotICAgIC8vIHN5bmNocm9uaXplIHRleHQgZmllbGQsIHByZXZpb3VzbHkgc2VsZWN0ZWQgdGFibGUgY2VsbCBhbmQgbW9kZWwgKGlucHV0T2JqZWN0KQotICAgIGlmICh0ZXh0XyAhPSBudWxsKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbSBvbGRUYWJsZUl0ZW0gPSBlZGl0b3JfLmdldEl0ZW0oKTsKLSAgICAgIGludCBvbGRDb2x1bW5JbmRleCA9IGVkaXRvcl8uZ2V0Q29sdW1uKCk7Ci0gICAgICBpZiAob2xkVGFibGVJdGVtICE9IG51bGwgJiYgb2xkQ29sdW1uSW5kZXggPj0gMCAmJiBvbGRDb2x1bW5JbmRleCA8IGNvbHVtbnNfLmxlbmd0aCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG9sZFRleHQgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0gICAgICAgIG9sZFRhYmxlSXRlbS5zZXRUZXh0KG9sZENvbHVtbkluZGV4LCBvbGRUZXh0KTsKLSAgICAgICAgaW50IG9sZFJvd0luZGV4ID0gdGFibGVfLmluZGV4T2Yob2xkVGFibGVJdGVtKTsKLSAgICAgICAgdmFsdWVzXy5zZXQob2xkUm93SW5kZXgsIG9sZFRleHQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRTZWxlY3Rpb25Bc09iamVjdChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgdGFibGVWaWV3ZXJfLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpLCB0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICB0YWJsZV8uc2V0VG9vbFRpcFRleHQoc3RyaW5nKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluZm9wb3AoU3RyaW5nIHN0cmluZykKLSAgewotICAJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YWJsZV8sIHN0cmluZyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KExpc3QgbGlzdCkKLSAgewotICAgIHZhbHVlc18uY2xlYXIoKTsKLSAgICB2YWx1ZXNfLmFkZEFsbChsaXN0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyBUYWJsZUl0ZW1bXSBnZXRJdGVtcygpCi0gIHsKLSAgICBpbnRlcm5hbFJlZnJlc2goKTsKLSAgICByZXR1cm4gdGFibGVfLmdldEl0ZW1zKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotICAgIHN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgYWRkXy5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgIGVuYWJsZVJlbW92ZShlbmFibGVkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgIGlmIChlZGl0b3JfICE9IG51bGwpCi0gICAgICBlZGl0b3JfLmRpc3Bvc2UoKTsKLSAgICBpZiAodGFibGVfICE9IG51bGwpCi0gICAgICB0YWJsZV8uZGlzcG9zZSgpOwotICAgIGlmIChhZGRfICE9IG51bGwpCi0gICAgICBhZGRfLmRpc3Bvc2UoKTsKLSAgICBpZiAocmVtb3ZlXyAhPSBudWxsKQotICAgICAgcmVtb3ZlXy5kaXNwb3NlKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW50ZXJuYWxEaXNwb3NlKCkKLSAgewotICAgIGlmICh0ZXh0XyAhPSBudWxsKQotICAgICAgdGV4dF8uZGlzcG9zZSgpOwotICAgIHRleHRfID0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBUYWJsZUVkaXRvckxpc3RlbmVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lcgotICB7Ci0gICAgcHJpdmF0ZSBpbnQgY3VyclNlbGVjdGlvbkluZGV4XzsKLSAgICBwcml2YXRlIGludCBlZGl0Um93XzsKLSAgICBwcml2YXRlIGludCBlZGl0Q29sdW1uXzsKLQotICAgIHB1YmxpYyBUYWJsZUVkaXRvckxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgICAgY3VyclNlbGVjdGlvbkluZGV4XyA9IC0xOwotICAgICAgZWRpdFJvd18gPSAtMTsKLSAgICAgIGVkaXRDb2x1bW5fID0gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpCi0gICAgewotICAgICAgbW91c2VEb3duKGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpCi0gICAgewotICAgICAgLy8gcmVmcmVzaCB0YWJsZQotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICAvLyBDbGVhbiB1cCBwcmV2aW91cyB0ZXh0IGVkaXRvciBjb250cm9sCi0gICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgIC8vIHVwZGF0ZSB0YWJsZQotICAgICAgaWYgKHRhYmxlXy5pc0ZvY3VzQ29udHJvbCgpKQotICAgICAgewotICAgICAgICBpbnQgc2VsZWN0ZWRSb3dJbmRleCA9IGdldFNlbGVjdGVkUm93KHRhYmxlXywgZS55KTsKLSAgICAgICAgaWYgKGN1cnJTZWxlY3Rpb25JbmRleF8gIT0gLTEgJiYgc2VsZWN0ZWRSb3dJbmRleCAhPSAtMSAmJiBjdXJyU2VsZWN0aW9uSW5kZXhfID09IHNlbGVjdGVkUm93SW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGVfLmdldEl0ZW0oc2VsZWN0ZWRSb3dJbmRleCk7Ci0gICAgICAgICAgaW50IHNlbGVjdGVkQ29sdW1uSW5kZXggPSBnZXRTZWxlY3RlZENvbHVtbih0YWJsZUl0ZW0sIGUueCwgZS55KTsKLSAgICAgICAgICBpZiAoc2VsZWN0ZWRDb2x1bW5JbmRleCAhPSAtMSAmJiAodGV4dF8gPT0gbnVsbCB8fCB0ZXh0Xy5pc0Rpc3Bvc2VkKCkgfHwgc2VsZWN0ZWRDb2x1bW5JbmRleCAhPSBlZGl0b3JfLmdldENvbHVtbigpKSkKLSAgICAgICAgICAgIGVkaXRTZWxlY3Rpb24oc2VsZWN0ZWRSb3dJbmRleCwgc2VsZWN0ZWRDb2x1bW5JbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyclNlbGVjdGlvbkluZGV4XyA9IHNlbGVjdGVkUm93SW5kZXg7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFNlbGVjdGVkUm93KFRhYmxlIHRhYmxlLCBpbnQgeSkKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IHRhYmxlSXRlbXNbaV0uZ2V0Qm91bmRzKDApOwotICAgICAgICBpZiAocmVjdGFuZ2xlICE9IG51bGwgJiYgeSA+PSByZWN0YW5nbGUueSAmJiB5IDwgKHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCkpCi0gICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U2VsZWN0ZWRDb2x1bW4oVGFibGVJdGVtIHRhYmxlSXRlbSwgaW50IHgsIGludCB5KQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmICh0YWJsZUl0ZW0uZ2V0Qm91bmRzKGkpLmNvbnRhaW5zKHgsIHkpKQotICAgICAgICAgIHJldHVybiBpOwotICAgICAgfQotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlZGl0U2VsZWN0aW9uKGludCByb3csIGludCBjb2x1bW4pCi0gICAgewotICAgICAgZWRpdFJvd18gPSByb3c7Ci0gICAgICBlZGl0Q29sdW1uXyA9IGNvbHVtbjsKLSAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZV8uZ2V0SXRlbShyb3cpOwotICAgICAgLy8gU2V0dXAgYWRhcHRlciBmb3IgdGhlIG5ldyBzZWxlY3Rpb24KLSAgICAgIHRleHRfID0gbmV3IFRleHQodGFibGVfLCBTV1QuTk9ORSk7Ci0gICAgICBTdHJpbmcgdGV4dCA9IHRhYmxlSXRlbS5nZXRUZXh0KGNvbHVtbik7Ci0gICAgICB0ZXh0Xy5zZXRUZXh0KCh0ZXh0ICE9IG51bGwpID8gdGV4dCA6ICIiKTsKLSAgICAgIHRleHRfLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gRXNjCi0gICAgICAgICAgICBpZiAoKChpbnQpZS5jaGFyYWN0ZXIpID09IDI3KQotICAgICAgICAgICAgICBjYW5jZWxTZWxlY3Rpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICApOwotICAgICAgdGV4dF8uYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpCi0gICAgICAgICAgICAgIHRyYXZlcnNlVGFiTmV4dCgpOwotICAgICAgICAgICAgZWxzZSBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykKLSAgICAgICAgICAgICAgdHJhdmVyc2VUYWJQcmV2aW91cygpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgKTsKLSAgICAgIGVkaXRvcl8uc2V0RWRpdG9yKHRleHRfLCB0YWJsZUl0ZW0sIGNvbHVtbik7Ci0gICAgICB0ZXh0Xy5zZXRGb2N1cygpOwotICAgICAgdGV4dF8uc2VsZWN0QWxsKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VUYWJOZXh0KCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbFJlZnJlc2goKTsKLSAgICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgICAgaWYgKCEoZWRpdFJvd18gPT0gdGFibGVfLmdldEl0ZW1zKCkubGVuZ3RoLTEgJiYgZWRpdENvbHVtbl8gPT0gY29sdW1uc18ubGVuZ3RoLTEpKQotICAgICAgewotICAgICAgICBpZiAoZWRpdENvbHVtbl8gPCBjb2x1bW5zXy5sZW5ndGgtMSkKLSAgICAgICAgICBlZGl0Q29sdW1uXysrOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0Q29sdW1uXyA9IDA7Ci0gICAgICAgICAgZWRpdFJvd18rKzsKLSAgICAgICAgICB0YWJsZV8uc2VsZWN0KGVkaXRSb3dfKTsKLSAgICAgICAgfQotICAgICAgICBlZGl0U2VsZWN0aW9uKGVkaXRSb3dfLCBlZGl0Q29sdW1uXyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VUYWJQcmV2aW91cygpCi0gICAgewotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgIGlmICghKGVkaXRSb3dfID09IDAgJiYgZWRpdENvbHVtbl8gPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlZGl0Q29sdW1uXyA+IDApCi0gICAgICAgICAgZWRpdENvbHVtbl8tLTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdENvbHVtbl8gPSBjb2x1bW5zXy5sZW5ndGgtMTsKLSAgICAgICAgICBlZGl0Um93Xy0tOwotICAgICAgICAgIHRhYmxlXy5zZWxlY3QoZWRpdFJvd18pOwotICAgICAgICB9Ci0gICAgICAgIGVkaXRTZWxlY3Rpb24oZWRpdFJvd18sIGVkaXRDb2x1bW5fKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZWRpdFNlbGVjdGlvbigpCi0gICAgewotICAgICAgaW50IHNlbGVjdGVkUm93SW5kZXggPSB0YWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGlmIChzZWxlY3RlZFJvd0luZGV4ICE9IC0xICYmIGNvbHVtbnNfLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIC8vIHJlZnJlc2ggdGFibGUKLSAgICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICAgIC8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotICAgICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgICAgZWRpdFNlbGVjdGlvbihzZWxlY3RlZFJvd0luZGV4LCAwKTsKLSAgICAgIH0KLSAgICAgIGN1cnJTZWxlY3Rpb25JbmRleF8gPSBzZWxlY3RlZFJvd0luZGV4OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgICAgdGFibGVWaWV3ZXJfLmFkZChnZXRFbGVtZW50cyhuZXdJbnB1dCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdClpbnB1dEVsZW1lbnQ7Ci0gICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0W2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIG9iamVjdHNbaV0gPSBsaXN0LmdldChpKTsKLSAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlMTdjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBVdGlscwotewotICBwdWJsaWMgVXRpbHMoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvRmlsZVN5c3RlbVVSSShTdHJpbmcgcmVsYXRpdmVQbGF0Zm9ybVVSSSkKLSAgewotICAgIGlmIChyZWxhdGl2ZVBsYXRmb3JtVVJJICE9IG51bGwpCi0gICAgICByZXR1cm4gdG9GaWxlU3lzdGVtVVJJKFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHJlbGF0aXZlUGxhdGZvcm1VUkkpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9GaWxlU3lzdGVtVVJJKElSZXNvdXJjZSByZXMpCi0gIHsKLSAgICBpZiAocmVzICE9IG51bGwpCi0gICAgewotICAgICAgSVBhdGggcGF0aCA9IHJlcy5nZXRMb2NhdGlvbigpOwotICAgICAgaWYgKHBhdGggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gcGF0aC50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkNDU4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJzZXJ2aWNldXRpbHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMjRkZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13ZWJzZXJ2aWNldXRpbHMuamFyCi13c2MuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTg1MTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzZGw8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUuc29hcDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMGFkNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS53c2MuamFyID0gc3JjLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBkb2MvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICB3ZWJzZXJ2aWNldXRpbHMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSB3c2MuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIHdlYnNlcnZpY2V1dGlscy5qYXIKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgd3NjLmphcixcCi0gICAgICAgICAgICAgICB3ZWJzZXJ2aWNldXRpbHMuamFyCi1zb3VyY2Uud2Vic2VydmljZXV0aWxzLmphciA9IHdlYnNlcnZpY2V1dGlscy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODRlMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgQ29uc3VtcHRpb24KLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotWFBfV1NGSU5ERVI9b3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLndzZmluZGVyCi1YUF9XRUJfU0VSVklDRV9TVEFSVF9TRVJWRVJfVFlQRT1XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlCi1YUF9TRVJWRVJfREVGQVVMVEVSPVNlcnZlciBEZWZhdWx0ZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWFhNGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3c2MuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UueHNkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLndzaWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndlYiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9IndzZmluZGVyIgotICAgICAgbmFtZT0iJVhQX1dTRklOREVSIi8+Ci0KLSAgIDwhLS0gVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSByZW1vdmVkLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJ3ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlIgotICAgICAgbmFtZT0iJVhQX1dFQl9TRVJWSUNFX1NUQVJUX1NFUlZFUl9UWVBFIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJzZXJ2ZXJEZWZhdWx0ZXIiCi0gICAgICBuYW1lPSIlWFBfU0VSVkVSX0RFRkFVTFRFUiIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLndlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUiPgotICAgICAgPHdlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuMzIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0VG9tY2F0U2VydmVyIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQzMl9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTdGFydFNlcnZlclR5cGU+Ci0gICAgICA8d2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZQotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU3RhcnRUb21jYXRTZXJ2ZXIiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDQwX0xPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZT4KLSAgICAgIDx3ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFRvbWNhdFNlcnZlciIKLSAgICAgICAgICAgIGlkPSJTRVJWRVJfSURfVE9NQ0FUNDFfTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlPgotICAgICAgPHdlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0VG9tY2F0U2VydmVyIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ1MF9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTdGFydFNlcnZlclR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jb25zdW1wdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzZjkzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgU2FtcGxlIG1lc3NhZ2VzCi0jCi1NU0dfRVJST1JfSlRTX1BST1hZX0hBU19OT19NRVRIT0RTPUlXQUIwMTc5RSBVbmFibGUgdG8gY3JlYXRlIGEgc2FtcGxlIHRvIHRoZSBwcm94eSBiZWNhdXNlIHRoZSBwcm94eSBkb2VzIG5vdCBjb250YWluIG1ldGhvZHMuCi1NU0dfRVJST1JfSlRTX1BST1hZX0hBU19OT19ERUZBVUxUPUlXQUIwMTgwRSBVbmFibGUgdG8gY3JlYXRlIGEgc2FtcGxlIHRvIHRoZSBwcm94eSBiZWNhdXNlIHRoZSBwcm94eSBpcyBub3QgYSBiZWFuIChpLmUuLiB0aGUgc2FtcGxlIGRvZXMgbm90IGhhdmUgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IpLgotTVNHX0VSUk9SX0pUU19OT19QUk9YWV9NRVRIT0RTX1BST0NFU1NFRD1JV0FCMDE4MUUgVW5hYmxlIHRvIGNyZWF0ZSBhIHNhbXBsZSB0byB0aGUgcHJveHkgYmVjYXVzZSBub25lIG9mIHRoZSBtZXRob2RzIGluIHRoZSBwcm94eSB3ZXJlIHByb2Nlc3NlZC4KLU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9UWVBFPUlXQUIwMTgyVyBUaGUgU2FtcGxlIEpTUCBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIHR5cGU6Ci1NU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfSU5ERVhFRF9QUk9QRVJUSUVTPUlXQUIwMTg3VyBUaGUgU2FtcGxlIEpTUCBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCBJbmRleGVkIHByb3BlcnRpZXMuCi1NU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfUEFSQU1FVEVSU19BUlJBWVM9SVdBQjAyMzdXIFRoZSBTYW1wbGUgSlNQIGNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IGFycmF5czoKLU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0lOUFVUUz1JV0FCMDEyNFcgVGhlIFNhbXBsZSBKU1AgY2xpZW50IGRvZXMgbm90IHN1cHBvcnQgaW5wdXQgcGFyYW1ldGVycyB0aGF0IGFyZSBub3QgYmVhbnM6Ci1NU0dfRVJST1JfSlRTX0NZQ0xJQ19CRUFOPUlXQUIwMTg4RSBUaGUgU2FtcGxlIEpTUCBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCBiZWFucyBjb250YWluaW5nIGF0dHJpYnV0ZXMgdGhhdCByZWZlcmVuY2UgdGhlIGJlYW5zLgotTVNHX1dBUk5fSlRTX1BST1hZX01FVEhPRFNfT01JVFRFRD1JV0FCMDE4OVcgVGhlIFNhbXBsZSBKU1AgY2xpZW50IG9taXR0ZWQgc29tZSBtZXRob2RzIGJlY2F1c2UgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdHlwZXMuCi1NU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEPUlXQUIwMDIxRSBTYW1wbGUgY3JlYXRpb24gd2FzIGNhbmNlbGVkCi1NU0dfV0FSTl9VTkFCTEVfVE9fRklORF9QUk9YWT1JV0FCMDAyMlcgVGhlIFByb3h5IFJlc291cmNlIGNvdW5kIG5vdCBub3QgYmUgZm91bmQuCi0KLQotIwotIyBGaWx0ZXJzCi0jCi1GSUxURVJfTVNHX0VSUk9SX05VTExfT0JKRUNUPUlXQUIwMDk3RSBObyBvYmplY3QgaGFzIGJlZW4gcHJvdmlkZWQuCi1GSUxURVJfTVNHX0VSUk9SX05PVF9GSUxFPUlXQUIwMDk4RSBUaGUgb2JqZWN0ICJ7MH0iIGlzIG5vdCBhIGZpbGUuCi1GSUxURVJfTVNHX0VSUk9SX05PVF9GT0xERVI9SVdBQjAxMzdFIFRoZSBvYmplY3QgInswfSIgaXMgbm90IGEgZm9sZGVyLgotCi1KQVZBX0ZJTFRFUl9OQU1FPUphdmEgZmlsZXMKLUpBVkFfRklMVEVSX0RFU0M9RmlsZXMgd2l0aCBuYW1lcyBlbmRpbmcgaW4gIi5qYXZhIiBvciAiLmNsYXNzIi4KLUpBVkFfRklMVEVSX01TR19FUlJPUl9XUk9OR19FWFRFTlNJT049SVdBQjAxMDJFIFRoZSBmaWxlICJ7MH0iIGRvZXMgbm90IGVuZCBpbiAiLmphdmEiIG9yICIuY2xhc3MiLgotCi1XU0RMX0ZJTFRFUl9OQU1FPVdTREwgZmlsZXMKLVdTRExfRklMVEVSX0RFU0M9RmlsZXMgd2l0aCBuYW1lcyBlbmRpbmcgaW4gIi53c2RsIi4KLVdTRExfRklMVEVSX01TR19FUlJPUl9XUk9OR19FWFRFTlNJT049SVdBQjAxMDNFIFRoZSBmaWxlICJ7MH0iIGRvZXMgbm90IGVuZCBpbiAiLndzZGwiLgotCi1JU0RfRklMVEVSX05BTUU9SVNEIGZpbGVzCi1JU0RfRklMVEVSX0RFU0M9RmlsZXMgd2l0aCBuYW1lcyBlbmRpbmcgaW4gIi5pc2QiLgotSVNEX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OPUlXQUIwMDk1RSBUaGUgZmlsZSAiezB9IiBkb2VzIG5vdCBlbmQgaW4gIi5pc2QiLgotCi1GT0xERVJfRklMVEVSX05BTUU9Rm9sZGVycwotRk9MREVSX0ZJTFRFUl9ERVNDPUZvbGRlcnMuCi0KLQotIwotIyBDb21tb24gbWVzc2FnZXMKLSMKLQotCi1NU0dfRVJST1JfUFJPSkVDVF9OT1RfRk9VTkQ9SVdBQjAwNjlFIFdlYiBwcm9qZWN0IHdhcyBub3QgZm91bmQuCi1NU0dfRVJST1JfSU5TVEFOQ0VfTk9UX0ZPVU5EPUlXQUIwMDcwRSBTZXJ2ZXIgd2FzIG5vdCBmb3VuZC4KLQotUFJPR1JFU1NfSU5GT19QVUJMSVNIX1dFQl9QUk9KRUNUPUlXQUIwMDcySSBQdWJsaXNoaW5nIFdlYiBwcm9qZWN0LgotCi0jCi0jIERlcGxveW1lbnQgc3RhdHVzCi0jCi1QUk9HUkVTU19JTkZPX0NPUFlfV0VCU0VSVklDRV9VVElMUz1JV0FCMDAyM0kgQ29weWluZyB0aGUgd2Vic2VydmljZSB1dGlsaXRpZXMuCi1QUk9HUkVTU19JTkZPX0NPUFlJTkdfRklMRT1JV0FCMDE5N0kgQ29weWluZyBTT0FQIHJ1bi10aW1lIGZpbGUuCi1QUk9HUkVTU19JTkZPX1NUQVJUX1dFQl9QUk9KRUNUPUlXQUIwMTk4SSBTdGFydGluZyBXZWIgcHJvamVjdC4KLVBST0dSRVNTX0lORk9fUFVCTElTSElOR19TRVJWRVI9SVdBQjAxOTlJIFB1Ymxpc2hpbmcgc2VydmVyLgotUFJPR1JFU1NfSU5GT19TVEFSVElOR19TRVJWRVI9SVdBQjAyMDBJIFN0YXJ0aW5nIHNlcnZlci4KLVBST0dSRVNTX0lORk9fUFVCTElTSF9XRUJfUFJPSkVDVD1JV0FCMDIwNUkgUHVibGlzaGluZyBXZWIgcHJvamVjdC4KLQotCi0jCi0jIERlcGxveW1lbnQgbWVzc2FnZXMKLSMKLU1TR19FUlJPUl9QUk9KRUNUX05PVF9GT1VORD1JV0FCMDIwN0UgV2ViIHByb2plY3Qgd2FzIG5vdCBmb3VuZC4KLU1TR19FUlJPUl9GSUxFQ09QWV9XRUJTRVJWSUNFX1VUSUxTPUlXQUIwMDI0RSBFcnJvciBpbiBjb3B5aW5nIFdlYnNlcnZpY2UgVXRpbGl0eSBmaWxlLgotTVNHX0VSUk9SX0lOU1RBTkNFX05PVF9GT1VORD1JV0FCMDIxMkUgU2VydmVyIHdhcyBub3QgZm91bmQuCi1NU0dfRVJST1JfU0VSVkVSPUlXQUIwMjEzRSBFcnJvciBpbiBzdGFydGluZyBzZXJ2ZXIuCi1NU0dfRVJST1JfUFVCTElTSD1JV0FCMDIxN0UgRXJyb3IgaW4gcHVibGlzaGluZyBXZWIgcHJvamVjdC4KLQotTVNHX1dBUk5fTk9fREJfRFJJVkVSPUlXQUIwMjIxVyBVbmFibGUgdG8gbG9jYXRlIGRiMmphdmEuemlwLCBwbGVhc2UgZW5zdXJlIGRiMmphdmEuemlwIGlzIGFkZGVkIHRvIHRoZSBzZXJ2ZXIgY2xhc3MgcGF0aC4KLQotTVNHX0VSUk9SX0JBRF9TRVJWRVJfQ09ORklHPUlXQUIwNTM0RSBVbmFibGUgdG8gYWRkIEVBUiBwcm9qZWN0IHRvIFNlcnZlciBDb25maWd1cmF0aW9uLgotTVNHX0VSUk9SX0NSRUFURV9TRVJWRVI9SVdBQjAwMjVFIFVuYWJsZSB0byBjcmVhdGUgc2VydmVyLgotCi0KLQotIwotIyBFSkIgbWVzc2FnZXMKLSMKLVRBU0tfTEFCRUxfQ1JFQVRFX0VKQl9QUk9KRUNUPUNyZWF0ZUVKQlByb2plY3RUYXNrCi1UQVNLX0RFU0NfQ1JFQVRFX0VKQl9QUk9KRUNUPUNyZWF0ZSBhbiBFSkIgUHJvamVjdC4KLU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0VKQl9QUk9KRUNUPUlXQUIwNDMyRSBVbmFibGUgdG8gY3JlYXRlIEVKQiBwcm9qZWN0LgotTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfQVBQX0NMSUVOVF9QUk9KRUNUPUlXQUIwMDI2RSBVbmFibGUgdG8gY3JlYXRlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHswfS4KLU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0pBVkFfUFJPSkVDVD1JV0FCMDAyN0UgVW5hYmxlIHRvIGNyZWF0ZSBKYXZhIHByb2plY3QgezB9LgotTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUFSX1BST0pFQ1Q9SVdBQjAwNjJFIFVuYWJsZSB0byBjcmVhdGUgRUFSIHByb2plY3QgezB9LgotCi0jCi0jIFdlYlNlcnZpY2VNYXBwaW5nUGFnZSBNZXNzYWdlcwotIwotCi0jCi0jIFZhbGlkYXRvciB0YXNrIGRlc2NyaXB0aW9ucwotIwotVEFTS19MQUJFTF9XRUJTRVJWSUNFX0RJU0FCTEVfVkFMSURBVElPTj1EaXNhYmxlIHZhbGlkYXRvcnMuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT049VGVtcG9yYXJpbHkgZGlzYWJsaW5nIHZhbGlkYXRvcnMuCi1UQVNLX0xBQkVMX1dFQlNFUlZJQ0VfUkVTVE9SRV9WQUxJREFUSU9OPVJlc3RvcmUgdmFsaWRhdG9ycy4KLVRBU0tfREVTQ19XRUJTRVJWSUNFX1JFU1RPUkVfVkFMSURBVElPTj1SZXN0b3Jpbmcgc3RhdGVzIG9mIHZhbGlkYXRvcnMuCi1UQVNLX0xBQkVMX1dFQlNFUlZJQ0VfRElTQUJMRV9CVUlMRD1EaXNhYmxlIGF1dG8gYnVpbGQuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX0JVSUxEPVRlbXBvcmFyaWx5IGRpc2FibGluZyBhdXRvIGJ1aWxkLgotVEFTS19MQUJFTF9XRUJTRVJWSUNFX1JFU1RPUkVfQlVJTEQ9UmVzdG9yZSBhdXRvIGJ1aWxkLgotVEFTS19ERVNDX1dFQlNFUlZJQ0VfUkVTVE9SRV9CVUlMRD1SZXN0b3Jpbmcgc3RhdGUgb2YgYXV0byBidWlsZC4KLVRBU0tfTEFCRUxfV0VCU0VSVklDRV9CVUlMRF9QUk9KRUNUPUJ1aWxkIHByb2plY3QuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9CVUlMRF9QUk9KRUNUPUJ1aWxkaW5nIHByb2plY3QuCi0KLSMKLSMgTUlTQwotIwotVEFTS19ERVNDX0NSRUFURV9XRUJfUFJPSkVDVD1DcmVhdGUgV2ViIFByb2plY3QKLVRBU0tfTEFCRUxfQ1JFQVRFX1dFQl9QUk9KRUNUPUNyZWF0ZSBXZWIgUHJvamVjdAotTVNHX0VSUk9SX1dFQl9QUk9KRUNUX0NSRUFURT1JV0FCMDMxMEUgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNyZWF0aW9uIG9mIHRoZSBXZWIgUHJvamVjdC4KLU1TR19FUlJPUl9TRVJWRVJfVklFV19PUEVOPUlXQUIwMTI2RSBUaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGlzIG9wZW4gZm9yIHswfS4gIENsb3NlIGl0IGFuZCByZXN0YXJ0IHRoZSB3aXphcmQuCi0KLSMKLSMgRGVmYXVsdCBQcm94eSBwcm9qZWN0IG1lc3NhZ2VzCi0jCi0KLQotIwotIwlEZXRlY3ROb25KYXZhQ2hhcnNDb21tYW5kCi0jCi1NU0dfV0FSTl9KQVZBX01FVEhPRF9TVEFSVF9XSVRIX1VQUEVSX0NBU0U9SVdBQjAxMjlXIEphdmEgbWV0aG9kIHswfSBpbiBjbGFzcyB7MX0gc3RhcnRzIHdpdGggYW4gdXBwZXIgY2FzZSBsZXR0ZXIuIE1ldGhvZCBuYW1lcyBzaG91bGQgYmVnaW4gd2l0aCBsb3dlciBjYXNlIGxldHRlcnMuCi1NU0dfV0FSTl9NRVRIT0RfTkFNRV9JTlZBTElEPUlXQUIwMTMxVyBKYXZhIG1ldGhvZCB7MH0gbmFtZSBjb250YWlucyB1bmRlcnNjb3JlIG9yIG51bWVyaWMgZGlnaXRzIGZvbGxvd2VkIGJ5IGEgbG93ZXIgY2FzZSBsZXR0ZXIuXAotTWV0aG9kIG5hbWVzIHNob3VsZCBub3QgY29udGFpbiBsb3dlciBjYXNlIGxldHRlcnMgYWZ0ZXIgYSBudW1lcmljIG9yIHVuZGVyc2NvcmUuCi1NU0dfV0FSTl9CT09MRUFOX1BST1BFUlRZX0FDQ0VTU09SUz1JV0FCMDEzMlcgQm9vbGVhbiBwcm9wZXJ0eSBhY2Nlc3NvciB7MH0gaW4gYmVhbiB7MX0gYmVnaW5zIHdpdGggImdldCIuIEJvb2xlYW4gZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlZ2luIHd0aCAiaXMiLgotTVNHX1dBUk5fUEFDS0FHRV9OQU1FX0hBU19VUFBFUl9DQVNFPUlXQUIwMTMzVyBUaGUgcGFja2FnZSBuYW1lIHswfSBvZiBjbGFzcyB7MX0gaW5jbHVkZXMgdXBwZXIgY2FzZSBsZXR0ZXJzLiBQYWNrYWdlIG5hbWVzIHNob3VsZCBjb25zaXN0IG9mIGxvd2VyIGNhc2UgbGV0dGVycyBvbmx5LgotCi0jCi0jIEphdmFUb01vZGVsQ29tbWFuZAotIwotTEFCRUxfT0s9T0sKLURFU0NSSVBUSU9OX09LPVNlbGVjdCBPSyB0byBjb250aW51ZQotCi1MQUJFTF9DQU5DRUw9Q2FuY2VsCi1ERVNDUklQVElPTl9DQU5DRUw9U2VsZWN0IENhbmNlbCB0byBjYW5jZWwKLQotIwotIyBDcmVhdGVNb25pdG9yQ29tbWFuZAotIwotTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SPUlXQUIwMDAxRSBVbmFibGUgdG8gbW9uaXRvciBwb3J0IHswfSBvZiB7MX0uCi1NU0dfSU5GT19NT05JVE9SSU5HX05PVF9TVVBQT1JURUQ9SVdBQjAwMDJJIHswfSBkb2VzIG5vdCBzdXBwb3J0IHBvcnQgbW9uaXRvcmluZy4KLQotIwotIyBDb3B5V1NETENvbW1hbmQKLSMKLUNPTU1BTkRfTEFCRUxfQ09QWV9XU0RMPUNvcHlpbmcgV1NETAotQ09NTUFORF9ERVNDX0NPUFlfV1NETD1Db3B5aW5nIFdTREwgaW50byB0aGUgd29ya3NwYWNlIGZvciBXZWIgc2VydmljZSBkZXBsb3ltZW50Ci1NU0dfRVJST1JfQ09QWV9XU0RMPUlXQUIwMDI4RSBGYWlsZWQgdG8gY29weSBXU0RMIHswfSB0byB7MX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9HZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViYWZjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRvciBpbXBsZW1lbnRzIFZpc2l0b3JBY3Rpb24KLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIC8qKgotICAqIFRoZSBTdHJpbmdCdWZmZXIgdGhhdCBob2xkcyB0aGUgY29kZWdlbiAKLSAgKiAqLwotICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGZidWZmZXI7IAotCi0gIC8qKgotICAqIFRoZSBWaXNpdG9yIHRoYXQgY2FsbHMgdGhlIHZpc2l0IG1ldGhvZCAKLSAgKiAqLwotICBwcm90ZWN0ZWQgVmlzaXRvciBmVmlzaXRvcjsgCi0KLSAgLyoqCi0gICogVmVjdG9yIHRoYXQgaG9sZHMgc3RhdGUgZGF0YSBmb3IgdGhpcyAgZ2VuZXJhdG9yIAotICAqICovCi0gIHByb3RlY3RlZCBWZWN0b3IgZlJlc2lkZW50VmVjdG9yOwotIAotICAvKgotICAqIFRoaXMgaW50IGhvbGRzIHRoZSBjdXJyZW50IG51bWJlciAKLSAgKi8KLSAgcHJvdGVjdGVkIGludCBmVW5pcXVlTnVtYmVyID0wOwotIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZkNsaWVudEZvbGRlclBhdGg7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWSA9ICJGYWN0b3J5IjsgCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCID0gIiAgICAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfVEFCID0gIiAgICAgICAgIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAiICI7Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIEdlbmVyYXRvciAoKQotICB7Ci0gICAgICBmYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgZlJlc2lkZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOyAKLSAgICAKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIEBwYXJhbSBTdHJpbmdCdWZmZXIgVGFrZXMgdGhlIGJ1ZmZlciBpdCB3aWxsIHdyaXRlIGNvZGUgdG8KLSAgKi8KLSAgcHVibGljIEdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgZmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgIGZSZXNpZGVudFZlY3RvciA9IG5ldyBWZWN0b3IoKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHJlc2lkZW50KQotICB7Ci0gICAgLy9ub3RoaW5nIHRvIGJlIGRvbmUgYnV0IG11c3QgYmUgaW1wbGVtZW50ZWQKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRGb2xkZXJQYXRoKCkKLSAgewotICAgIHJldHVybiBmQ2xpZW50Rm9sZGVyUGF0aDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEZvbGRlclBhdGgoU3RyaW5nIGZDbGllbnRGb2xkZXJQYXRoXykKLSAgewotICAgIGZDbGllbnRGb2xkZXJQYXRoID0gZkNsaWVudEZvbGRlclBhdGhfOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlTmFtZSA9ICIiOwotICBwcm90ZWN0ZWQgU3RyaW5nIHBvcnROYW1lID0gIiI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcGFja2FnZU5hbWUgPSAiIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBwcm94eUJhc2VOYW1lID0gIiI7Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5mbyhTdHJpbmcgc2VydmljZSwgU3RyaW5nIHBvcnQsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHByb3h5QmFzZSkKLSAgewotICAgIHNlcnZpY2VOYW1lID0gc2VydmljZTsKLSAgICBwb3J0TmFtZSA9IHBvcnQ7Ci0gICAgdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOyAKLSAgICBwcm94eUJhc2VOYW1lID0gcHJveHlCYXNlOyAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQkFEX1NZTUJPTFMgPSB7Jy0nLCAnICd9OyAvLyBzeW1ib2xzIHRoYXQgY2FuIGFwcGVhciBpbiB0aGUgZm9sZGVyIG5hbWUgYnV0IGl0IGlzIG5vdCBhbGxvd2VkIGluIGEgamF2YSBiZWFuIG5hbWUKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBVTkRFUlNDT1JFID0gJ18nOwkvLyByZXBsYWNlIHRoZSBhYm92ZSBvbmVzIGJ5IHVuZGVyc2NvcmUKLSAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uQmVhbklkKCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gZ2V0Q2xpZW50Rm9sZGVyUGF0aCgpOwotICAgIGludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoIi8iKTsKLSAgICBpbmRleCsrOwotICAgIFN0cmluZyBuZXdOYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgIGZvciAoIGludCBpID0gMDsgaSA8IEJBRF9TWU1CT0xTLmxlbmd0aDsgaSsrICkgewotICAgIAluZXdOYW1lID0gbmV3TmFtZS5yZXBsYWNlICggQkFEX1NZTUJPTFNbaV0sIFVOREVSU0NPUkUgKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld05hbWUrICJpZCI7Ci0gIH0KLQotICAvKgotICAqIFRoZSBOdW1iZXIgRmFjdG9yeSBpcyBoZXJlIGZvciBuYW1pbmcgcHVycG9zZXMuIEluIAotICAqIHRoaXMgd2F5IHdlIGluc3VyZSBubyBuYW1lcyB3ZSBjcmVhdGUgaW4gYSBwaWVjZSBvZgotICAqIGNvZGUgZ2VuIGFyZSB0aGUgc2FtZS4gV2Uga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVycwotICAqIHVzZWQgYW5kIHdlIGhhbmQgYmFjayB0aGUgbmV4dCBvbmUuIExpa2UgdGFrZSBhIG51bWJlciAKLSAgKiBidWRkeQotICAqIEBwYXJhbSBpbnQgbnVtYmVyIHdlIGFyZSBhdCBhcyB0aGUgc3RhdGUgZGF0YSBoYXMgdG8gYmUgc2V0dGFibGUKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TnVtYmVyRmFjdG9yeShpbnQgbnVtYmVyKQotICB7Ci0gICAgIGZVbmlxdWVOdW1iZXIgPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qCi0gICogVGhpcyBpcyBhIHVuaXF1ZSBudW1iZXIgZm9yIHN0YXRlIHB1cnBvc2VzCi0gICogQHJldHVybiBpbnQgCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyRmFjdG9yeSgpCi0gIHsKLSAgICAgcmV0dXJuIGZVbmlxdWVOdW1iZXI7IAotICB9Ci0gIC8qCi0gICogVGhpcyBpcyBhIHVuaXF1ZSBudW1iZXIgZm9yIG5hbWluZyBwdXJwb3NlcwotICAqIEByZXR1cm4gaW50IAotICAqLwotICBwdWJsaWMgaW50IGdldFVuaXF1ZU51bWJlcigpCi0gIHsKLSAgICAgcmV0dXJuIGZVbmlxdWVOdW1iZXIrKzsKLSAgfQotCi0KLSAgLyoqCi0gICogcmV0dXJucyB0aGUgY3VycmVudCBTdHJpbmdCdWZmZXIKLSAgKiBAcmV0dXJuIFN0cmluZ0J1ZmZlciBUYWtlcyB0aGUgYnVmZmVyIGl0IHdpbGwgd3JpdGUgY29kZSB0b28KLSAgKi8KLSAgcHVibGljIFN0cmluZ0J1ZmZlciBnZXRTdHJpbmdCdWZmZXIgKCkKLSAgewotICAgICAgcmV0dXJuIGZidWZmZXI7Ci0gIH0KLQotICAKLSAgLyoqCi0gICogcmV0dXJucyB0aGUgVmlzaXRvciB0aGF0IGNhbGxlZCB0aGlzIGdlbmVyYXRvcgotICAqIEByZXR1cm4gVmlzaXRvciAKLSAgKi8KLSAgcHVibGljIFZpc2l0b3IgZ2V0VmlzaXRvciAoKQotICB7Ci0gICAgICByZXR1cm4gZlZpc2l0b3I7Ci0gIH0KLSAgCi0KLQotCi0gIC8qKgotICAqIHZlY3RvciB1c2VkIHRvIGhvbGQgc3RhdGUgZGF0YSAKLSAgKiBAcGFyYW1ldGVyIFZpc2l0b3IgCi0gICovCi0gIHB1YmxpYyB2b2lkIHB1dFJlc2lkZW50VmVjdG9yIChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgICBmUmVzaWRlbnRWZWN0b3IuYWRkRWxlbWVudChvYmplY3QpOwotICB9Ci0gIAotCi0gIC8qKgotICAqIHZlY3RvciB1c2VkIHRvIGhvbGQgc3RhdGUgZGF0YSAKLSAgKiBAcGFyYW1ldGVyIFZpc2l0b3IgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50VmVjdG9yIChWZWN0b3IgdmVjdG9yKQotICB7Ci0gICAgICBmUmVzaWRlbnRWZWN0b3IgPSB2ZWN0b3I7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICogcmV0dXJucyB0aGUgcmVzaWRlbnQgdmVjdG9yCi0gICogQHJldHVybiBWaXNpdG9yIAotICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFJlc2lkZW50VmVjdG9yICgpCi0gIHsKLSAgICAgIHJldHVybiBmUmVzaWRlbnRWZWN0b3I7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgYW55IHN0YXRlIGEgZ2VuZXJhdG9yIG1heSBoYXZlCi0gICoKLSAgKiovCi0KLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpCi0gIHsKLSAgICAgLy90byBiZSBpbXBsZW1lbnRlZCBpbiBzdWJsYXNzZXMKLSAgfQotCi0KLSAgIC8qKgotICAqIHNldHMgdGhlIHZpc2l0b3IgdGhhdCBjYWxscyB0aGUgdmlzaXQKLSAgKiBAcGFyYW1ldGVyIFZpc2l0b3IgCi0gICovCi0KLSAgcHVibGljIHZvaWQgc2V0VmlzaXRvcihWaXNpdG9yIHZpc2l0b3IpCi0gIHsKLSAgICAgIGZWaXNpdG9yID0gdmlzaXRvcjsKLSAgfQotCi0KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgLy9pbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCi0gIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9SZWxWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vUmVsVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTcyYTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9SZWxWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW47Ci0gICAgICAKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWw7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiBUaGlzIHZpc3RvciB3aWxsIHZpc2l0IGVsZW1lbnRzIGluIGEgbW9kZWwgZ2l2ZW4gYSAKLSogcGFydGljdWxhciByZWwKLSogKi8KLXB1YmxpYyBjbGFzcyBSZWxWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICBwcml2YXRlIGludCBmRWxlbWVudENvdW50ZXI7Ci0gIHByaXZhdGUgaW50IGZUb3RhbEVsZW1lbnRzOwotICBwcml2YXRlIFN0cmluZyBmcmVsTmFtZTsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLQotICBwdWJsaWMgUmVsVmlzaXRvciAoU3RyaW5nIHJlbE5hbWUpCi0gIHsKLSAgICAgZnJlbE5hbWUgPSByZWxOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldFRvdGFsRWxlbWVudHNUb1Zpc2l0KCkKLSAgewotICAgICByZXR1cm4gZlRvdGFsRWxlbWVudHM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KCkKLSAgewotICAgICBpZihnZXRUb3RhbEVsZW1lbnRzVG9WaXNpdCgpIC0gcHJlc2VudEVsZW1lbnQoKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGludCBwcmVzZW50RWxlbWVudCgpCi0gIHsKLSAgICAgcmV0dXJuIGZFbGVtZW50Q291bnRlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShWaXNpdG9yQWN0aW9uIHZhKQotICB7Ci0gICAgLy9pbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCi0gIH0gIAotICBwdWJsaWMgU3RhdHVzIHJ1biAoT2JqZWN0IHNvdXJjZUVsZW1lbnQsVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gIAkgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgICAgICBpbml0aWFsaXplKHZBY3Rpb24pOwotICAKLSAgICAgICAgdkFjdGlvbi5zZXRWaXNpdG9yKHRoaXMpOwotICAgICAgICBSZWwgcmVsID0gKChCYXNpY0VsZW1lbnQpc291cmNlRWxlbWVudCkuZ2V0UmVsKGZyZWxOYW1lKTsKLSAgICAgICAgLy9zZXQgc29tZSBzdGF0ZSBkYXRhCi0gICAgICAgIGZUb3RhbEVsZW1lbnRzID0gcmVsLmdldE51bWJlck9mVGFyZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgZkVsZW1lbnRDb3VudGVyID0gMDsgIAotICAgICAgICAKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IHJlbC5nZXRUYXJnZXRFbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgICAgIEJhc2ljRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gKEJhc2ljRWxlbWVudCllLm5leHRFbGVtZW50KCk7IAotICAgICAgICAgICBmRWxlbWVudENvdW50ZXIrKzsKLSAgICAgICAgICAgaW5pdGlhbGl6ZSh2QWN0aW9uKTsKLSAgICAgICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdCh0YXJnZXRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICB9IAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1Zpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmZTY5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpc2l0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgcnVuIChPYmplY3Qgb2JqZWN0LCBWaXNpdG9yQWN0aW9uIHZBY3Rpb24pOwotICAgICAgICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1Zpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9WaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjBiNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1Zpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBWaXNpdG9yQWN0aW9uLgotKiBUaGUgdmlzaXRvciB3YWxrcyB0aGUgbW9kZWwgYW5kIHRoZSBWaXNpdG9yQWN0aW9uIAotKiBkb2VzIHRoZSBhY3Rpb24KLSogKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlzaXRvckFjdGlvbiAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KTsKLSAgcHVibGljIHZvaWQgc2V0VmlzaXRvcihWaXNpdG9yIHZpc2l0b3IpOwotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyByZXNpZGVudFN0cmluZyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9BdHRyaWJ1dGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9BdHRyaWJ1dGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmZkYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vQXR0cmlidXRlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uUmVsVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5JbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3I7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZVZpc2l0b3IgZXh0ZW5kcyBSZWxWaXNpdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGZSZXNpZGVudFN0cmluZzsgCi0gIHByaXZhdGUgVmVjdG9yIGZSZXNpZGVudFZlY3RvcjE7Ci0gIHByaXZhdGUgVmVjdG9yIGZSZXNpZGVudFZlY3RvcjI7Ci0KLSAgIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotCi0gIHB1YmxpYyBBdHRyaWJ1dGVWaXNpdG9yICgpCi0gIHsKLSAgICBzdXBlcihUeXBlRWxlbWVudC5SRUxfQVRUUklCVVRFUyk7Ci0gICAgZlJlc2lkZW50U3RyaW5nID0gIiI7Ci0gIH0KLQotICBwdWJsaWMgQXR0cmlidXRlVmlzaXRvciAoU3RyaW5nIHJlbCkKLSAgewotICAgIHN1cGVyKHJlbCk7Ci0gICAgZlJlc2lkZW50U3RyaW5nID0gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50U3RyaW5nKFN0cmluZyByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFN0cmluZyA9IHJlc2lkZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRWZWN0b3IxKFZlY3RvciByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFZlY3RvcjEgPSByZXNpZGVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50VmVjdG9yMihWZWN0b3IgcmVzaWRlbnQpCi0gIHsKLSAgICBmUmVzaWRlbnRWZWN0b3IyID0gcmVzaWRlbnQ7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgICAgLy9oYWNrIGZvciAxOTc3MjYKLQotICAgICBpZih2QWN0aW9uIGluc3RhbmNlb2YgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKXsKLSAgICAgICBpZihmUmVzaWRlbnRWZWN0b3IxID09IG51bGwpIGZSZXNpZGVudFZlY3RvcjE9bmV3IFZlY3RvcigpOwotICAgICAgIGlmKGZSZXNpZGVudFZlY3RvcjIgPT0gbnVsbCkgZlJlc2lkZW50VmVjdG9yMj1uZXcgVmVjdG9yKCk7Ci0gICAgICAgKChJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IpdkFjdGlvbikuc2V0UGFyZW50R2V0dGVycyhmUmVzaWRlbnRWZWN0b3IxLGZSZXNpZGVudFZlY3RvcjIpOwotICAgICB9Ci0gIH0KLSAKLSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL0ZpZWxkVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vRmllbGRWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZGIzOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vRmllbGRWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5JbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3I7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEZpZWxkVmlzaXRvciBleHRlbmRzIEF0dHJpYnV0ZVZpc2l0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZlJlc2lkZW50U3RyaW5nOyAKLSAgcHJpdmF0ZSBWZWN0b3IgZlJlc2lkZW50VmVjdG9yMTsKLSAgcHJpdmF0ZSBWZWN0b3IgZlJlc2lkZW50VmVjdG9yMjsKLQotICAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0KLSAgcHVibGljIEZpZWxkVmlzaXRvciAoKQotICB7Ci0gICAgc3VwZXIoVHlwZUVsZW1lbnQuUkVMX0ZJRUxEUyk7Ci0gICAgZlJlc2lkZW50U3RyaW5nID0gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50U3RyaW5nKFN0cmluZyByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFN0cmluZyA9IHJlc2lkZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRWZWN0b3IxKFZlY3RvciByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFZlY3RvcjEgPSByZXNpZGVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50VmVjdG9yMihWZWN0b3IgcmVzaWRlbnQpCi0gIHsKLSAgICBmUmVzaWRlbnRWZWN0b3IyID0gcmVzaWRlbnQ7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgICAgLy9oYWNrIGZvciAxOTc3MjYKLQotICAgICBpZih2QWN0aW9uIGluc3RhbmNlb2YgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKXsKLSAgICAgICBpZihmUmVzaWRlbnRWZWN0b3IxID09IG51bGwpIGZSZXNpZGVudFZlY3RvcjE9bmV3IFZlY3RvcigpOwotICAgICAgIGlmKGZSZXNpZGVudFZlY3RvcjIgPT0gbnVsbCkgZlJlc2lkZW50VmVjdG9yMj1uZXcgVmVjdG9yKCk7Ci0gICAgICAgKChJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IpdkFjdGlvbikuc2V0UGFyZW50R2V0dGVycyhmUmVzaWRlbnRWZWN0b3IxLGZSZXNpZGVudFZlY3RvcjIpOwotICAgICB9Ci0gIH0KLSAKLSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL01ldGhvZFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL01ldGhvZFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2NjQ2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9NZXRob2RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlJlbFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIE1ldGhvZFZpc2l0b3IgZXh0ZW5kcyBSZWxWaXNpdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotCi0gIHB1YmxpYyBNZXRob2RWaXNpdG9yICgpCi0gIHsKLSAgICAgc3VwZXIoQmVhbkVsZW1lbnQuUkVMX01FVEhPRFMpOwotICB9Ci0gIAotICAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1BhcmFtZXRlclZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1BhcmFtZXRlclZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0OTMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9QYXJhbWV0ZXJWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlJlbFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyVmlzaXRvciBleHRlbmRzIFJlbFZpc2l0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0KLSAgcHVibGljIFBhcmFtZXRlclZpc2l0b3IgKCkKLSAgewotICAgICBzdXBlcihNZXRob2RFbGVtZW50LlJFTF9QQVJBTUVURVJTKTsKLSAgfQotICAKLSAgIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9SZXR1cm5QYXJhbWV0ZXJWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9SZXR1cm5QYXJhbWV0ZXJWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjIwNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vUmV0dXJuUGFyYW1ldGVyVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5SZWxWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFJldHVyblBhcmFtZXRlclZpc2l0b3IgZXh0ZW5kcyBSZWxWaXNpdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotCi0gIHB1YmxpYyBSZXR1cm5QYXJhbWV0ZXJWaXNpdG9yICgpCi0gIHsKLSAgICAgc3VwZXIoTWV0aG9kRWxlbWVudC5SRUxfUkVUVVJOX1BBUkFNRVRFUlMpOwotICB9Ci0gIAotICAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1R5cGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9UeXBlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjU0NjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1R5cGVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlJlbFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFR5cGVWaXNpdG9yIGV4dGVuZHMgUmVsVmlzaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLQotICBwdWJsaWMgVHlwZVZpc2l0b3IgKCkKLSAgewotICAgIHN1cGVyKFR5cGVFbGVtZW50LlJFTF9UWVBFKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwMWE3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0RldGVjdE5vbkphdmFDaGFyc0JlYW5WaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZk1ldGhvZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIHRoZSBtZXRob2RzIGluIHRoZSBKYXZhQ2xhc3MKLSogKi8KLXB1YmxpYyBjbGFzcyBEZXRlY3ROb25KYXZhQ2hhcnNCZWFuVmlzaXRvckFjdGlvbiBleHRlbmRzIFZpc2l0b3JBY3Rpb25JbXBsCi17Ci0gIHByaXZhdGUgc3RhdGljIGNoYXIgVU5ERVJTQ09SRSA9ICdfJzsKLSAgcHJpdmF0ZSBib29sZWFuIHNlcnZpY2VCZWFuID0gZmFsc2U7Ci0KLSAgcHVibGljIERldGVjdE5vbkphdmFDaGFyc0JlYW5WaXNpdG9yQWN0aW9uICggVmVjdG9yIG1lc3NhZ2VzLCBWZWN0b3IgYmVhbnMpCi0gIAl7Ci0gIAkJc3VwZXIgKG1lc3NhZ2VzLCBiZWFucyk7Ci0gIAkJLy8gaWYgZmlyc3QgYmVhbiBmaXNpdGVkIHRoYXQgbWVhbnMgaXQgaXMgdGhlIFNlcnZpY2UgYmVhbgotICAJCWlmICggYmVhbnMgPT0gbnVsbCApIAotICAJCQlzZXJ2aWNlQmVhbiA9IHRydWU7Ci0gIAl9Ci0KLSAgLyoqCi0gICogVGhlIHZpc2l0IHdpbGwgY3JlYXRlIHRoZSBiZWFuCi0gICogV2FsayB0aGUgbWV0aG9kcwotICAqIEBwYXJhbSBKYXZhQ2xhc3MgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBiZWFuIG1vZGVsCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3QgamF2YWNsYXNzKQotICB7Ci0gICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpamF2YWNsYXNzOwotICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGphdmFDbGFzcy5nZXRKYXZhUGFja2FnZSgpLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgU3RyaW5nIGJlYW5OYW1lID0gamF2YUNsYXNzLmdldE5hbWUoKTsKLQotICAgIGlmICghaXNCZWFuVmlzaXRlZChqYXZhQ2xhc3MpKSB7Ci0gICAgICAJYWRkVmlzaXRlZEJlYW4oamF2YUNsYXNzKTsKLQkJLy8gY2hlY2sgdGhlIGJlYW4gbmFtZQotCQljaGVja0JlYW5OYW1lKGJlYW5OYW1lKTsKLQkJY2hlY2tQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgYmVhbk5hbWUpOwotCSAgCURldGVjdE5vbkphdmFDaGFyc01ldGhvZFZpc2l0b3JBY3Rpb24gbWV0aG9kVmlzaXRvckFjdGlvbiA9IG5ldyBEZXRlY3ROb25KYXZhQ2hhcnNNZXRob2RWaXNpdG9yQWN0aW9uKGdldE1lc3NhZ2VzKCksIGdldEJlYW5zVmlzaXRlZCgpKTsKLSAgICAgIAlKYXZhTW9mTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IEphdmFNb2ZNZXRob2RWaXNpdG9yKCk7Ci0gICAgCW1ldGhvZFZpc2l0b3IucnVuKGphdmFDbGFzcyxtZXRob2RWaXNpdG9yQWN0aW9uKTsKLSAgICAgfQotICAgIAotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgIH0KLQotICAgcHJpdmF0ZSB2b2lkIGNoZWNrQmVhbk5hbWUoU3RyaW5nIGJlYW5OYW1lKQotICAgCXsKLQkgCi0JIC8vIGNoZWNrIGlmIHRoZSBiZWFuIHN0YXJ0cyB3aXRoIGEgbG93ZXIgY2FzZQotCSBpZiAoIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShiZWFuTmFtZS5jaGFyQXQoMCkpKQotICAgIAlhZGRNZXNzYWdlKCJXQVJOX0JFQU5fTkFNRV9TVEFSVFNfV0lUSF9MT1dFUl9DQVNFIiwgbmV3IFN0cmluZ1tde2JlYW5OYW1lfSk7ICAKLQotCQotICAgICAvL2NoZWNrIGlmIHRoZSBuYW1lIGhhcyBhbiB1bmRlcnNjb3JlLCB0aGVuIG5leHQgbGV0dGVyIHNob3VsZCBiZSB1cHBlciBjYXNlCi0gICAgIGludCB1bmRlclNjb3JlSW5kZXggPSBiZWFuTmFtZS5pbmRleE9mKFVOREVSU0NPUkUpOwotCSBTdHJpbmcgdGVtcE5hbWUgPSBiZWFuTmFtZTsKLQkgd2hpbGUodW5kZXJTY29yZUluZGV4ICE9LTEpIHsKLQkJdGVtcE5hbWUgPSB0ZW1wTmFtZS5zdWJzdHJpbmcodW5kZXJTY29yZUluZGV4KzEpOwotCQlpZiAoIENoYXJhY3Rlci5pc0xvd2VyQ2FzZSh0ZW1wTmFtZS5jaGFyQXQoMCkpKSB7Ci0gICAgICAJCWFkZE1lc3NhZ2UoIk1TR19XQVJOX01FVEhPRF9OQU1FX0lOVkFMSUQiLCBuZXcgU3RyaW5nW10geyBiZWFuTmFtZSB9KTsgIAotICAgICAgCQlicmVhazsKLQkJCX0KLQkJZWxzZQotCQkJdW5kZXJTY29yZUluZGV4ID0gdGVtcE5hbWUuaW5kZXhPZihVTkRFUlNDT1JFKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1BhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGJlYW5OYW1lKQotCQl7Ci0JCQlpZiAoIXBhY2thZ2VOYW1lLmVxdWFscyhwYWNrYWdlTmFtZS50b0xvd2VyQ2FzZSgpKSkKLQkJCQlhZGRNZXNzYWdlKCJNU0dfV0FSTl9QQUNLQUdFX05BTUVfSEFTX1VQUEVSX0NBU0UiLCBuZXcgU3RyaW5nW10geyBwYWNrYWdlTmFtZSwgYmVhbk5hbWUgfSk7Ci0JCX0KLSB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0RldGVjdE5vbkphdmFDaGFyc01ldGhvZFZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWU2NjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mUGFyYW1ldGVyVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIEJlYW5FbGVtZW50IHVzaW5nIHRoZSAKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgdGhlIG1ldGhvZHMgaW4gdGhlIEphdmFDbGFzcwotKiAqLwotcHVibGljIGNsYXNzIERldGVjdE5vbkphdmFDaGFyc01ldGhvZFZpc2l0b3JBY3Rpb24gZXh0ZW5kcyBWaXNpdG9yQWN0aW9uSW1wbCAKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBVTkRFUlNDT1JFID0gJ18nOwotICBwcml2YXRlIGJvb2xlYW4gc2VydmljZUJlYW4gPSBmYWxzZTsKLQotICAgcHVibGljIERldGVjdE5vbkphdmFDaGFyc01ldGhvZFZpc2l0b3JBY3Rpb24gKCBWZWN0b3IgbWVzc2FnZXMsIFZlY3RvciBiZWFucykKLSAgCXsKLSAgCQlzdXBlciAobWVzc2FnZXMsIGJlYW5zKTsKLSAgCQlpZiAoIGJlYW5zLnNpemUoKSA9PSAxKQotICAJCQlzZXJ2aWNlQmVhbiA9IHRydWU7Ci0gIAl9Ci0KLSAgLyoqCi0gICogQ3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgbWV0aG9kIAotICAqIEBwYXJhbSBNZXRob2QgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBpbWV0aG9kKQotICB7Ci0gICAgCi0gICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpaW1ldGhvZDsKLSAgICBTdHJpbmcgIGNsYXNzTmFtZSA9IG1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCkuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQotCWlmICggc2VydmljZUJlYW4gJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgKQotCQljaGVja1VwcGVyQ2FzZShuYW1lLCBjbGFzc05hbWUpOwotCQotCS8vIGZvciBzZXJ2aWNlIGJlYW4gb3IgYW55IHJlZmVyZW5jZWQgYmVhbiBwcm9wZXJ0eSBhY2Nlc3NvcnMKLQkgaWYgKCBzZXJ2aWNlQmVhbiB8fCBuYW1lLnN0YXJ0c1dpdGgoImdldCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgic2V0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJpcyIpKSAKLQkgewotCSAgICBjaGVja1VuZGVyU2NvcmUobmFtZSwgY2xhc3NOYW1lKTsKLQkgICAgY2hlY2tOdW1lcmljRGlnaXRzKG5hbWUsIGNsYXNzTmFtZSk7Ci0JICAgIGNoZWNrQm9vbGVhblByb3BlcnRpZXMobWV0aG9kLCBjbGFzc05hbWUpOwotCQkgIAkKLQkgCURldGVjdE5vbkphdmFDaGFyc1BhcmFtZXRlclZpc2l0b3JBY3Rpb24gcGFyYW1ldGVyVmlzaXRvckFjdGlvbiA9IG5ldyBEZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uKGdldE1lc3NhZ2VzKCksIGdldEJlYW5zVmlzaXRlZCgpKTsKLQkgCS8vIHJzayBQYXNzaW5nIGluIG51bGwgZm9yIHRoZSBlbnZpcm9ubWVudC4gRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbiBhbHdheXMgcmV0dXJucyBhbiBPSyBzdGF0dXMuCi0gICAgCUphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yIHBhcmFtZXRlclZpc2l0b3IgPSBuZXcgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IobnVsbCk7Ci0gICAgCXBhcmFtZXRlclZpc2l0b3IucnVuKG1ldGhvZCwgcGFyYW1ldGVyVmlzaXRvckFjdGlvbik7ICAgCi0JICB9Ci0JIAotCSByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JfQotCi0gIHByaXZhdGUgdm9pZCBjaGVja1VwcGVyQ2FzZShTdHJpbmcgbmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAJIC8vIGluIGEgc2VydmljZSBiZWFuIGNoZWNrIGlmIGFueSBtZXRob2Qgc3RhcnRzIHdpdGggdXBwZXIgY2FzZSBsZXR0ZXIKLQkgaWYgKCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UobmFtZS5jaGFyQXQoMCkpKQotICAgIAkJYWRkTWVzc2FnZSgiTVNHX1dBUk5fSkFWQV9NRVRIT0RfU1RBUlRfV0lUSF9VUFBFUl9DQVNFIiwgbmV3IFN0cmluZ1tde25hbWUsIGNsYXNzTmFtZX0pOyAgCi0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjaGVja1VuZGVyU2NvcmUoU3RyaW5nIG5hbWUsIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICAgLy9jaGVjayBpZiB0aGUgbmFtZSBoYXMgYW4gdW5kZXJzY29yZSwgdGhlbiBuZXh0IGxldHRlciBzaG91bGQgYmUgdXBwZXIgY2FzZQotICAgICBpbnQgdW5kZXJTY29yZUluZGV4ID0gbmFtZS5pbmRleE9mKFVOREVSU0NPUkUpOwotCSBTdHJpbmcgdGVtcE5hbWUgPSBuYW1lOwotCSB3aGlsZSh1bmRlclNjb3JlSW5kZXggIT0tMSkgewotCQl0ZW1wTmFtZSA9IHRlbXBOYW1lLnN1YnN0cmluZyh1bmRlclNjb3JlSW5kZXgrMSk7Ci0JCWlmICggQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHRlbXBOYW1lLmNoYXJBdCgwKSkpIHsKLSAgICAJCWFkZE1lc3NhZ2UoIk1TR19XQVJOX01FVEhPRF9OQU1FX0lOVkFMSUQiLCBuZXcgU3RyaW5nW117bmFtZSwgY2xhc3NOYW1lfSk7ICAKLSAgICAgCQlicmVhazsKLQkJfQotCQllbHNlCi0JCQl1bmRlclNjb3JlSW5kZXggPSB0ZW1wTmFtZS5pbmRleE9mKFVOREVSU0NPUkUpOwotCSAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjaGVja051bWVyaWNEaWdpdHMoU3RyaW5nIG5hbWUsIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICAgLy9jaGVjayBpZiB0aGUgbmFtZSBoYXMgYSBudW1lcmljLCB0aGVuIG5leHQgbGV0dGVyIHNob3VsZCBiZSB1cHBlciBjYXNlCi0gICAgIGZvciAoIGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykKLSAgICAgCXsKLSAgICAgCQlpZiAoIENoYXJhY3Rlci5pc0RpZ2l0KG5hbWUuY2hhckF0KGkpKSkKLSAgICAgCQkJewotICAgICAJCQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShuYW1lLmNoYXJBdChpKzEpKSkgewotCQkJICAgIAkJYWRkTWVzc2FnZSgiTVNHX1dBUk5fTUVUSE9EX05BTUVfSU5WQUxJRCIsIG5ldyBTdHJpbmdbXXtuYW1lLCBjbGFzc05hbWV9KTsgIAotCQkJICAgICAJCWJyZWFrOwotIAkJCQkJfQotCQl9Ci0gICAgIH0KLSAgfQotICBwcml2YXRlIHZvaWQgY2hlY2tCb29sZWFuUHJvcGVydGllcyhNZXRob2QgbWV0aG9kLCBTdHJpbmcgY2xhc3NOYW1lKQotICAJewotICAJCWlmICghc2VydmljZUJlYW4gJiYgbWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKCJnZXQiKSAmJiAKLSAgCQkJKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygiYm9vbGVhbiIpIHx8Ci0gIAkJCSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5Cb29sZWFuIikpKQotICAJCQlhZGRNZXNzYWdlKCJNU0dfV0FSTl9CT09MRUFOX1BST1BFUlRZX0FDQ0VTU09SUyIsIG5ldyBTdHJpbmdbXXttZXRob2QuZ2V0TmFtZSgpLCBjbGFzc05hbWV9KTsgIAotICAJfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0RldGVjdE5vbkphdmFDaGFyc1BhcmFtZXRlclZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjFiZjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZCZWFuVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlIAotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayB0aGUgbWV0aG9kcyBpbiB0aGUgSmF2YUNsYXNzCi0qICovCi1wdWJsaWMgY2xhc3MgRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbiBleHRlbmRzIFZpc2l0b3JBY3Rpb25JbXBsIAotewotCi0gIHB1YmxpYyBEZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uICggVmVjdG9yIG1lc3NhZ2VzLCBWZWN0b3IgYmVhbnMpCi0gIAl7Ci0gIAkJc3VwZXIgKG1lc3NhZ2VzLCBiZWFucyk7Ci0gIAl9Ci0KLSAgLyoqCi0gICogQ3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgbWV0aG9kIAotICAqIEBwYXJhbSBNZXRob2QgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBpamF2YVBhcmFtZXRlcikKLSAgewotICAgIAotICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciA9IChKYXZhUGFyYW1ldGVyKSBpamF2YVBhcmFtZXRlcjsKLSAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsKLSAgICBpZiAoIGphdmFQYXJhbWV0ZXIuZ2V0SmF2YVR5cGUoKSBpbnN0YW5jZW9mIEphdmFDbGFzcykgCi0gICAgCXsKLSAgICAJamF2YUNsYXNzID0gKEphdmFDbGFzcykgamF2YVBhcmFtZXRlci5nZXRKYXZhVHlwZSgpOwotICAgIAlpZiAoamF2YUNsYXNzLmlzQXJyYXkoKSkKLSAgICAJICB7Ci0gICAgCSAgICBKYXZhSGVscGVycyBjb21wb25lbnRUeXBlID0gKChBcnJheVR5cGUpamF2YUNsYXNzKS5nZXRDb21wb25lbnRUeXBlQXNIZWxwZXIoKTsKLSAgICAJICAgIGlmIChjb21wb25lbnRUeXBlIGluc3RhbmNlb2YgSmF2YUNsYXNzKQotICAgIAkgICAgICB7Ci0gICAgCSAgICAgICAgamF2YUNsYXNzID0gKEphdmFDbGFzcyljb21wb25lbnRUeXBlOwotICAgIAkgICAgICB9Ci0gICAgCSAgICBlbHNlCi0gICAgCSAgICAgIHsKLSAgICAJICAgICAgICBqYXZhQ2xhc3MgPSBudWxsOyAvL1RoZSBhcnJheSBjb250YWlucyBwcmltaXRpdmUgdHlwZXMsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGZ1cnRoZXIgY2hlY2tpbmcuCi0gICAgCSAgICAgIH0KLSAgICAJICB9Ci0gICAgCX0KLSAgIAlpZiAodG9CZVZpc2l0ZWQoamF2YUNsYXNzKSkgICAgewotCQkJRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24gYmVhblZpc2l0b3JBY3Rpb24gPSBuZXcgRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24oZ2V0TWVzc2FnZXMoKSwgZ2V0QmVhbnNWaXNpdGVkKCkpOwotCQkJSmF2YU1vZkJlYW5WaXNpdG9yIGJlYW5WaXNpdG9yID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvcigpOwotCQkJYmVhblZpc2l0b3IucnVuKGphdmFDbGFzcyxiZWFuVmlzaXRvckFjdGlvbik7Ci0gIAkgIAl9Ci0gICAJCi0gICAJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotCi0gIHByaXZhdGUgYm9vbGVhbiB0b0JlVmlzaXRlZCAoSmF2YUNsYXNzIGphdmFDbGFzcykKLSAgewotCS8vY2hlY2sgZm9yIHJlY29nbml6ZWQgdHlwZXMgCi0JaWYoIGphdmFDbGFzcyA9PSBudWxsCXx8Ci0JICAgamF2YUNsYXNzLmlzUHJpbWl0aXZlKCkgfHwKLQkgICBqYXZhQ2xhc3MuZ2V0SmF2YU5hbWUoKS5zdGFydHNXaXRoKCJqYXZheCIpIHx8Ci0gICAgICAgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oamF2YUNsYXNzLmdldEphdmFOYW1lKCkpKQotCSAgICAJcmV0dXJuIGZhbHNlOwotCWVsc2UKLQkJICAJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2UzN2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZUeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5BdHRyaWJ1dGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1vbi5TYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIEF0dHJpYnV0ZUVsZW1lbnQgdXNpbmcgdGhlCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIGEgY29tcGxleCB0eXBlCi0qICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24gZXh0ZW5kcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24KLXsKLQkKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbihFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwcm9qZWN0LCBFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRFbGVtZW50LHByb2plY3QsIGVudik7Ci0JU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gIH0KLQotICAvKioKLSAgKiBDcmVhdGUgYSB0eXBlIGVsZW1lbnQgZnJvbSB0aGUgSmF2YUhlbHBlcgotICAqIEBwYXJhbSBKYXZhUGFyYW1ldGVyIHRoZSBtb2YgZWxlbWVudCB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlCi0gICoqLwotCi0KLSAgLy9iZWFuIGluZm8gY29kZQotCi0KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IHByb3BlcnR5RGVjb3JhdG9yKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAkgIAkKLSAgICAvL1Byb3BlcnR5RGVjb3JhdG9yIHBkID0gKFByb3BlcnR5RGVjb3JhdG9yKXByb3BlcnR5RGVjb3JhdG9yOwotICAgIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IChTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IpcHJvcGVydHlEZWNvcmF0b3I7ICAKLSAgICAKLSAgICAKLSAgICB0cnl7Ci0gICAgICAgLy9pZiB0aGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyB1bnN1cHBvcnRlZCBkb250IG1ha2UgYW4gQXR0cmlidXRlCi0gICAgICBpZighKGdldFJldHVyblBhcmFtKCkgJiYgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZSgoSmF2YUhlbHBlcnMpcGQuZ2V0UHJvcGVydHlUeXBlKCkpKSAKLSAgICAgIAkmJiAoVHlwZUZhY3RvcnkuaXNVblN1cHBvcnRlZFR5cGUoKEphdmFIZWxwZXJzKXBkLmdldFByb3BlcnR5VHlwZSgpKSkpewotICAgICAgCSAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9UWVBFIikgKyAoKEphdmFIZWxwZXJzKXBkLmdldFByb3BlcnR5VHlwZSgpKS5nZXRKYXZhTmFtZSgpLCBTdGF0dXMuV0FSTklORyApOwotCSAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0JICAgICAgLy9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfVFlQRSIpICsgKChKYXZhSGVscGVycylwZC5nZXRQcm9wZXJ0eVR5cGUoKSkuZ2V0SmF2YU5hbWUoKSxudWxsKSk7Ci0JICAgICAgcmV0dXJuIHN0YXR1czsKLQkgIH0JCi0KLSAgICAgIE1ldGhvZCBzZXRNZXRob2QgPSBwZC5nZXRXcml0ZU1ldGhvZCgpOwotICAgICAgTWV0aG9kIGdldE1ldGhvZCA9IHBkLmdldFJlYWRNZXRob2QoKTsKLSAgICAgIGlmKHNldE1ldGhvZCAhPSBudWxsKXsKLSAgICAgIAlpZihzZXRNZXRob2QuaXNTdGF0aWMoKSl7Ci0gICAgICAgICAgc2V0TWV0aG9kPW51bGw7IAotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGlmKGdldE1ldGhvZCAhPSBudWxsKXsKLSAgICAgIAlpZihnZXRNZXRob2QuaXNTdGF0aWMoKSl7Ci0gICAgICAgICAgZ2V0TWV0aG9kPW51bGw7Ci0gICAgICAJfQotICAgICAgfQotICAgICAgaWYocGQuaXNmU3RhdGljKCkpewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgICAgCi0gICAgICBBdHRyaWJ1dGVFbGVtZW50IGF0dHJpYnV0ZUVsZW1lbnQgPSAoQXR0cmlidXRlRWxlbWVudClCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudChwcm9wZXJ0eURlY29yYXRvcixmUGFyZW50RWxlbWVudCk7Ci0KLSAgICAgIGlmKGF0dHJpYnV0ZUVsZW1lbnQgIT0gbnVsbCl7Ci0gICAgICAgIAotICAgICAgICAvL2xldHMgY2hlY2sgYW5kIHNlZSBpZiB0aGUgZ2V0dGVyIHRha2VzIGlucHV0IHBhcmFtcwotICAgICAgICAvL2lmIHNvIHRocm93IGFuIGVycm9yCi0gICAgICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICAgICAgaWYoZ2V0TWV0aG9kICE9IG51bGwpewotCSAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcltdID0gZ2V0TWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCSAgICAgICAgaWYoamF2YVBhcmFtZXRlci5sZW5ndGggPiAwKXsKLQkgICAgICAgICAgaWYoZ2V0UmV0dXJuUGFyYW0oKSkgcmV0dXJuIHN0YXR1czsKLQkgICAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9JTkRFWEVEX1BST1BFUlRJRVMiKSArIGdldE1ldGhvZC5nZXROYW1lKCksIFN0YXR1cy5XQVJOSU5HICk7Ci0JICAgICAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyAobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0JICAgICAgICAgIC8vCQlXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfSU5ERVhFRF9QUk9QRVJUSUVTIiApICsgZ2V0TWV0aG9kLmdldE5hbWUoKSxudWxsKSk7Ci0JICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0JICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoc2V0TWV0aG9kICE9IG51bGwpIGF0dHJpYnV0ZUVsZW1lbnQuc2V0U2V0dGVyTWV0aG9kKHNldE1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotICAgICAgICBpZihnZXRNZXRob2QgIT0gbnVsbCkgYXR0cmlidXRlRWxlbWVudC5zZXRHZXR0ZXJNZXRob2QoZ2V0TWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0KLSAgICAgICAgSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uIHR5cGVWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbihhdHRyaWJ1dGVFbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldEJlYW5zQ3JlYXRlZChnZXRCZWFuc0NyZWF0ZWQoKSk7Ci0gICAgICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOyAKLSAgICAgICAgSmF2YU1vZlR5cGVWaXNpdG9yIHR5cGVWaXNpdG9yID0gbmV3IEphdmFNb2ZUeXBlVmlzaXRvcihlbnZfKTsKLSAgICAgICAgdHlwZVZpc2l0b3Iuc2V0Q2xpZW50UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICBzdGF0dXMgPSB0eXBlVmlzaXRvci5ydW4ocGQsdHlwZVZpc2l0b3JBY3Rpb24pOwotICAgICAgIAotICAgICAgfQotICAgIAotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgewotICAgIAllbnZfLmdldExvZygpLmxvZyhMb2cuV0FSTklORywgNTA1NCwgdGhpcywgInZpc2l0IiwgZSk7Ci0gICAgCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yQWN0aW9uIiwgLy8kTk9OLU5MUy0xJAotICAgIAkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSlRTX0pTUF9HRU4iKSwgU3RhdHVzLldBUk5JTkcsIGUpOwotICAgIAl0cnkgewotCQkJZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBlMSkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24iLCAvLyROT04tTkxTLTEkCi0JICAgIAkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSlRTX0pTUF9HRU4iKSwgU3RhdHVzLkVSUk9SKTsKLQkJfQotICAgIAlyZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvL2Vudi5Mb2cud3JpdGUodGhpcywidmlzaXQiLExvZy5PSyxlKTt9Ci0KLSAgfQotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYjAxZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tYW5kLk51bGxTdGF0dXNNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tYW5kLlN0YXR1c01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mQXR0cmlidXRlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZkZpZWxkVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZk1ldGhvZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIHRoZSBtZXRob2RzIGluIHRoZSBKYXZhQ2xhc3MKLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24gaW1wbGVtZW50cyBWaXNpdG9yQWN0aW9uCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcm90ZWN0ZWQgRW52aXJvbm1lbnQgZW52XzsKLSAvLyBwcm90ZWN0ZWQgQmVhbkVsZW1lbnQgZkJlYW5FbGVtZW50OwotCi0gIHByb3RlY3RlZCBWaXNpdG9yIGZWaXNpdG9yOwotCi0gIC8qCi0gICogVGhlIHByb2plY3QgdGhhdCBkZWZpbmVzIHRoZSBjb250ZXh0Ci0gICoqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0KLSAgLyoKLSAgKiBUaGUgU3RhdHVzIG1vbml0b3IKLSAgKiovCi0gIHByb3RlY3RlZCBTdGF0dXNNb25pdG9yIG1vbml0b3JfOwotCi0gIC8qCi0gICogVGhlIG1vZGVsIHRoYXQgd2lsbCBiZSBjcmVhdGVkCi0gICoqLwotICBwcm90ZWN0ZWQgTW9kZWwgZk1vZGVsOwotCi0gIC8qCi0gICogVGhpcyBpcyB0aGUgcGFyZW50IGVsZW1lbnQgdXNlZCB3aGVuIGNyZWF0aW5nIGEKLSAgKiBuZXcgZWxlbWVudAotICAqLwotICBwcm90ZWN0ZWQgRWxlbWVudCBmUGFyZW50RWxlbWVudDsKLQotICAvKgotICAqIE1ldGhvZHMgcHJvY2Vzc2VkIGZyb20gcHJveHkKLSAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBmQmVhbnNDcmVhdGVkOwotCi0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIGZNZXRob2RzU2VsZWN0ZWQ7Ci0KLSAgLyoKLSAgKiB0aGlzIGJvb2xlYW4gdGVsbHMgd2V0aGVyIHRoZSBiZWFuIGlzIGEgcmV0dXJuIHBhcmFtZXRlciBvciBhbiBpbnB1dCBwYXJhbWV0ZXIKLSAgKiB1c3VhbGx5IHRoaXMgc2hvdWxkIGJlIHNldCBhcm91bmQgdGhlIHBhcmFtZXRlcnZpc2l0b3JhY3Rpb24sIGFuZCBwYXNzZWQgb24gZnJvbSB0aGVyZQotICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBmUmV0dXJuUGFyYW09ZmFsc2U7Ci0KLSAgcHVibGljIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbihTdHJpbmcgY2xpZW50UHJvamVjdCxCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcywgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgICBmTWV0aG9kc1NlbGVjdGVkID0gbWV0aG9kczsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsgCi0JZW52XyA9IGVudjsKLSAgfQotCi0KLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiBAcGFyYW0gTW9kZWwgbW9kZWwgaXMgdGhlIE1vZGVsIHRoYXQgdGhpcyBiZWFuIHdpbGwgYmUgcGxhY2VkIGluCi0gICogQHBhcmFtIElQcm9qZWN0IHVzZWQgaW4gbmF0dXJlCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uKE1vZGVsIG1vZGVsLCBTdHJpbmcgY2xpZW50UHJvamVjdCwgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgICBmTW9kZWwgPSBtb2RlbDsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQllbnZfID0gZW52OwotICB9Ci0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICogQHBhcmFtIEVsZW1lbnQgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgdGhpcyBlbGVtZW50IHdpbGwgYmUgYWRkZWQgdG9vCi0gICogQHBhcmFtIElQcm9qZWN0IHVzZWQgaW4gbmF0dXJlCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIGNsaWVudFByb2plY3QsIEVudmlyb25tZW50IGVudiApCi0gIHsKLSAgICBmUGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQllbnZfID0gZW52OwotICB9Ci0KLSAgLyoqCi0gICogVGhlIHZpc2l0IHdpbGwgY3JlYXRlIHRoZSBiZWFuCi0gICogV2FsayB0aGUgbWV0aG9kcwotICAqIEBwYXJhbSBKYXZhQ2xhc3MgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBiZWFuIG1vZGVsCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3QgamF2YWNsYXNzKQotICB7Ci0gIAlDaG9pY2UgT0tDaG9pY2UgPSBuZXcgQ2hvaWNlKCdPJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX09LIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9PSyIpKTsKLSAgCUNob2ljZSBDYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX0NBTkNFTCIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiREVTQ1JJUFRJT05fQ0FOQ0VMIikpOwotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFjbGFzczsKLSAgICAKLSAgICAKLSAgICBCZWFuRWxlbWVudCBiZWFuRWxlbWVudCA9IChCZWFuRWxlbWVudClCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudChqYXZhQ2xhc3MsZlBhcmVudEVsZW1lbnQsZk1vZGVsKTsKLSAgICBpZihiZWFuRWxlbWVudC5pc093bmVyUGFyYW1ldGVyKCkpIHsKLSAgICAgICAgcmVzZXRCZWFuc0NyZWF0ZWQoKTsKLSAgICB9Ci0gICAgZk1vZGVsID0gYmVhbkVsZW1lbnQuZ2V0TW9kZWwoKTsKLQotICAgIC8vdGhpcyBmb3IgdGhlIHN1YnNlcXVlbnQgYmVhbnMgdGhhdCByZXByZXNlbnQgdHlwZXMKLSAgICAvL2ZpcnN0IGRvIHRoZSBhdHRyaWJ1dGVzCi0gICAgLy9pZiB3ZSBhcmUgbm90IG9uIHRoZSByb290Ci0gICAgaWYgKCEoYmVhbkVsZW1lbnQgPT0gZk1vZGVsLmdldFJvb3RFbGVtZW50KCkpKXsKLSAgICAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QmVhbnNDcmVhdGVkKCkuZWxlbWVudHMoKTsKLSAgICAgICB3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIGlmKG5hbWUuZXF1YWxzKGphdmFDbGFzcy5nZXROYW1lKCkpKXsKLSAgICAgICAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfQ1lDTElDX0JFQU4iKSwgU3RhdHVzLldBUk5JTkcpOwotICAgICAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAgICAgCQkJLy9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfRVJST1JfSlRTX0NZQ0xJQ19CRUFOIiApLG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICAKLSAgICAgICBKYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbiBhdHRyaWJ1dGVWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yQWN0aW9uKGJlYW5FbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgIC8vYXR0cmlidXRlVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgICAgVmVjdG9yIGNoaWxkVmVjdG9yID0gKChWZWN0b3IpZ2V0QmVhbnNDcmVhdGVkKCkuY2xvbmUoKSk7Ci0gICAgICAgY2hpbGRWZWN0b3IuYWRkRWxlbWVudChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsgIAotICAgICAgIGF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24uc2V0QmVhbnNDcmVhdGVkKGNoaWxkVmVjdG9yKTsKLSAgICAgICBhdHRyaWJ1dGVWaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotICAgICAgIEphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yIGF0dHJpYnV0ZVZpc2l0b3IgPSBuZXcgSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3IoKTsKLSAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnNldFJldHVyblBhcmFtZXRlcihnZXRSZXR1cm5QYXJhbSgpKTsKLSAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnNldEVudmlyb25tZW50KGVudl8pOwotICAgICAgIHN0YXR1cyA9IGF0dHJpYnV0ZVZpc2l0b3IucnVuKGphdmFDbGFzcyxhdHRyaWJ1dGVWaXNpdG9yQWN0aW9uKTsKLSAgICAgICAvLwotICAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAKLSAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgIHsKLSAgICAgICAgIENob2ljZSByZXN1bHQgPSBlbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICAgICB7Ci0gICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgICB9Ci0gICAgICAgICAJCi0gICAgICAgfQotICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICBKYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uIGZpZWxkVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uKGJlYW5FbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgIC8vZmllbGRWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgICBWZWN0b3IgY2hpbGRWZWN0b3IyID0gKChWZWN0b3IpZ2V0QmVhbnNDcmVhdGVkKCkuY2xvbmUoKSk7Ci0gICAgICAgY2hpbGRWZWN0b3IyLmFkZEVsZW1lbnQoamF2YUNsYXNzLmdldE5hbWUoKSk7ICAKLSAgICAgICBmaWVsZFZpc2l0b3JBY3Rpb24uc2V0QmVhbnNDcmVhdGVkKGNoaWxkVmVjdG9yMik7Ci0gICAgICAgZmllbGRWaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotICAgICAgIEphdmFNb2ZGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEphdmFNb2ZGaWVsZFZpc2l0b3IoKTsKLSAgICAgICBmaWVsZFZpc2l0b3Iuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgIHN0YXR1cyA9IGZpZWxkVmlzaXRvci5ydW4oamF2YUNsYXNzLGZpZWxkVmlzaXRvckFjdGlvbik7Ci0gICAgICAgLy8KLSAgICAgICBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAKLSAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgIHsKLSAgICAgICAgIENob2ljZSByZXN1bHQgPSBlbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICAgICB7Ci0gICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgICB9Ci0gICAgICAgICAJCi0gICAgICAgfQotICAgICAgIC8vICAgICAgIAotICAgICAgIAotICAgfQotCi0gICAgLy90aGlzIGlzIHRvIGluc3VyZSB3ZSBhcmUgb24gdGhlIHByb3h5Ci0gICAgLy9ub3cgZG8gdGhlIG1ldGhvZHMKLSAgICBpZiAoYmVhbkVsZW1lbnQgPT0gZk1vZGVsLmdldFJvb3RFbGVtZW50KCkpewotICAgICAgLy9maXJzdCBsZXRzIG1ha2Ugc3VyZSB0aGUgcHJveHkgaXMgaW4gZ29vZCBmb3JtCi0gICAgICAvLy1pdCBoYXMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAvLy1pdCBoYXMgYXQgbGVhc3Qgb25lIG1ldGhvZAotICAgICAgLy9vdGhlcndpc2UgcmV0dXJuIHRoZSBwcm9ibGVtIGluIHRoZSBmb3JtIG9mIGEgc3RhdHVzCi0KLSAgICAgIGlmICghcHJveHlDaGVjayhqYXZhQ2xhc3MsIHN0YXR1cykpIHJldHVybiBzdGF0dXM7Ci0gICAgICBKYXZhTW9mTWV0aG9kVmlzaXRvckFjdGlvbiBtZXRob2RWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uKGJlYW5FbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgCi0gICAgICAvL21ldGhvZFZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgICAgSmF2YU1vZk1ldGhvZFZpc2l0b3IgbWV0aG9kVmlzaXRvciA9IG5ldyBKYXZhTW9mTWV0aG9kVmlzaXRvcigpOwotICAgICAgbWV0aG9kVmlzaXRvci5zZXRNZXRob2RTZWxlY3Rpb24oZk1ldGhvZHNTZWxlY3RlZCk7Ci0gICAgICBzdGF0dXMgPSBtZXRob2RWaXNpdG9yLnJ1bihqYXZhQ2xhc3MsbWV0aG9kVmlzaXRvckFjdGlvbik7Ci0KLSAgICAgIC8vCi0gICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgCi0gICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgewotICAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICAgIHsKLSAgICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgICAgCQotICAgICAgfQotICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvL1RoaXMgaXMgd2hlcmUgd2UgY2hlY2sgZm9yIHNldmVyYWwgdGhpbmdzOgotICAgICAgLy8taWYgbm8gbWV0aG9kcyB3ZXJlIHByb2Nlc3NlZCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkIHR5cGVzIHRoZW4gd2Ugc2VuZCBiYWNrIHRoYXQgcmVzdWx0Ci0gICAgICAvLy1pZiB0aGVyZSB3ZXJlIGFueSBtZXRob2RzIG9taXR0ZWQgd2Ugc2hvdWxkIHdhcm4gdGhlbQotCi0gICAgICAvL2ZpcnN0IG5vIG1ldGhvZHMKLSAgICAgIGlmICghbWV0aG9kVmlzaXRvckFjdGlvbi53ZXJlTWV0aG9kc1Byb2Nlc3NlZCgpKXsKLSAgICAgICAgLy90aGlzIGhhcyB0byBiZSBkb25lIHRvIGluc3VyZSB0aGUgZGlhbG9nIGlzIGFuIGVycm9yCi0gICAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pUU19OT19QUk9YWV9NRVRIT0RTX1BST0NFU1NFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAvLwkJV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX0VSUk9SX0pUU19OT19QUk9YWV9NRVRIT0RTX1BST0NFU1NFRCIgKSxudWxsKSk7Ci0gICAgICB9ICAgICAgICAJCi0gICAgICAvL25vdyBtZXRob2RzIG9taXR0ZWQKLSAgICAgIGVsc2UgaWYobWV0aG9kVmlzaXRvckFjdGlvbi53ZXJlTWV0aG9kc09taXR0ZWQoKSl7Ci0gICAgICAgIC8vVGhlIGRpYWxvZyBpcyBhbHJlYWR5IGEgd2FybmluZyBzbyB3ZSBqdXN0IG5lZWQgdG8gc2V0IHRoZSBvdmVyYWxsIG1lc3NhZ2UKLSAgICAgIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfV0FSTl9KVFNfUFJPWFlfTUVUSE9EU19PTUlUVEVEIiksIFN0YXR1cy5XQVJOSU5HKTsKLSAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAvLwkJV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX1dBUk5fSlRTX1BST1hZX01FVEhPRFNfT01JVFRFRCIgKSxudWxsKSk7Ci0gICAgICB9CQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgcmVzaWRlbnQpCi0gIHsKLSAgICAvL25vdGhpbmcgdG8gYmUgZG9uZSBidXQgbXVzdCBiZSBpbXBsZW1lbnRlZAotICB9Ci0KLQotICAvKgotICAqIFJldHVybiB0aGUgbW9kZWwgdGhhdCB3YXMgY3JlYXRlZAotICAqIEByZXR1cm4gTW9kZWwgdGhlIGJlYW4gbW9kZWwgdGhhdCB3YXMgY3JlYXRlZAotICAqLwotICBwdWJsaWMgTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIGZNb2RlbDsKLSAgfQotCi0gIC8qCi0gICogVGhlIHByb3h5IGNoZWNrIGluc3VyZXMgdGhlcmUgaXMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZAotICAqIGF0IExlYXN0IG9uZSBtZXRob2QKLSAgKiBAcGFyYW0gSmF2YUNsYXNzIGphdmFDbGFzcyBpcyB1c2VkIHRvIHRyYXZlcnNlIHRoZSBtZXRob2RzIG9uIHRoZSBwcm94eQotICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm94eUNoZWNrKEphdmFDbGFzcyBqYXZhQ2xhc3MsIFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGEgbWV0aG9kCi0gICAgIEl0ZXJhdG9yIG09amF2YUNsYXNzLmdldFB1YmxpY01ldGhvZHMoKS5pdGVyYXRvcigpOwotICAgICBpZiAoIW0uaGFzTmV4dCgpKXsKLSAgICAgCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSlRTX1BST1hZX0hBU19OT19NRVRIT0RTIiksU3RhdHVzLkVSUk9SKTsKLSAgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAvLwkJCVdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCAiJU1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX01FVEhPRFMiICksbnVsbCkpOwotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQkKLSAgICAgLy9ub3cgY2hlY2sgZm9yIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICB3aGlsZSAobS5oYXNOZXh0KCkpIHsKLSAgICAgICBNZXRob2QgbWV0aG9kPShNZXRob2QpbS5uZXh0KCk7Ci0gICAgICAgaWYgKGphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKXsKLSAgICAgICAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgICAgICAgaWYgKGphdmFQYXJhbWV0ZXIubGVuZ3RoID4gMCl7Ci0gICAgICAgICAgICAgLy90aGVuIHdlIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAgIAkgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX0RFRkFVTFQiKSxTdGF0dXMuRVJST1IpOwotICAgICAgICAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAgICAgIAkJLy9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfRVJST1JfSlRTX1BST1hZX0hBU19OT19ERUZBVUxUIiApLG51bGwpKTsKLSAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0KLSAgfQotCi0gLyoqCi0gICogU2V0cyB0aGUgc3RhdHVzIG1vbml0b3IgdGhhdCB0aGlzIGFjdGlvbiB3aWxsIHVzZSB0byByZXBvcnQgc3RhdHVzIHRoYXQgb2NjcmVzIHdoaWxlIGV4ZWN1dGluZyB0aGUgQWN0aW9uLgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGF0dXNNb25pdG9yICggU3RhdHVzTW9uaXRvciBtb25pdG9yICkKLSAgewotCW1vbml0b3JfID0gbW9uaXRvcjsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHN0YXR1cyBtb25pdG9yIHRoYXQgdGhpcyB0YXNrIGlzIHVzaW5nIHRvIHJlcG9ydCBzdGF0dXMuCi0gICovCi0gIHB1YmxpYyBTdGF0dXNNb25pdG9yIGdldFN0YXR1c01vbml0b3IgKCkKLSAgewotICAgIGlmIChtb25pdG9yXyA9PSBudWxsKQotICAgIHsKLSAgICAgIG1vbml0b3JfID0gbmV3IE51bGxTdGF0dXNNb25pdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBtb25pdG9yXzsKLSAgfQotCi0KLSAgIC8qKgotICAqIGNoZWNrIGlmIHRoZSBhY3Rpb24gaGFzIGZpbmlzaGVkIHN1Y3Nlc3NmdWxseSAKLSAgKi8KLSAgLyoKLSAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsICgpCi0gIHsKLSAgIAlyZXR1cm4gZ2V0U3RhdHVzTW9uaXRvcigpLmNhbkNvbnRpbnVlKCk7Ci0gIH0KLSAgKi8gCi0gIHB1YmxpYyB2b2lkIHJlc2V0QmVhbnNDcmVhdGVkKCkKLSAgewotICAgIGZCZWFuc0NyZWF0ZWQgPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCWVudl8gPSBlbnY7Ci0gIH0KLSAgCi0gIC8qCi0gICogVGhlIGNvbW1hbmQgdGhhdCBjYWxsZWQgdGhpcyB3aWxsIGdldCB0aGUgcmVzdWx0cyBvZiB0aGUgb3BlcmF0aW9uIGluIHRoZSBmb3JtCi0gICogb2YgYSBzdGF0dXMuCi0gICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0QmVhbnNDcmVhdGVkICgpCi0gIHsKLSAgICBpZihmQmVhbnNDcmVhdGVkID09IG51bGwpIGZCZWFuc0NyZWF0ZWQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcmV0dXJuIGZCZWFuc0NyZWF0ZWQ7Ci0gIH0KLQotICAvKgotICAqIFRoZSBjb21tYW5kIHRoYXQgY2FsbGVkIHRoaXMgd2lsbCBnZXQgdGhlIHJlc3VsdHMgb2YgdGhlIG9wZXJhdGlvbiBpbiB0aGUgZm9ybQotICAqIG9mIGEgc3RhdHVzLgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRCZWFuc0NyZWF0ZWQgKFZlY3RvciBiZWFuc0NyZWF0ZWQpCi0gIHsKLSAgICBmQmVhbnNDcmVhdGVkID0gYmVhbnNDcmVhdGVkOwotICB9Ci0KLSAgIC8qCi0gICogVGhpcyBib29sZWFuIHRlbGxzIHdldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtIAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRSZXR1cm5QYXJhbSAoKQotICB7Ci0gICAgcmV0dXJuIGZSZXR1cm5QYXJhbTsKLSAgfQotCi0gIC8qCi0gICogVGhpcyBib29sZWFuIHRlbGxzIHdldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtIAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXR1cm5QYXJhbSAoYm9vbGVhbiByZXR1cm5wYXJhbSkKLSAgewotICAgIGZSZXR1cm5QYXJhbSA9IHJldHVybnBhcmFtOwotICB9Ci0KLSAgIC8qCi0gICogVGhpcyBib29sZWFuIHRlbGxzIHdldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtIAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3QgKCkKLSAgewotICAgIHJldHVybiBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIGJvb2xlYW4gdGVsbHMgd2V0aGVyIHdlIGFyZSBkZWFsaW5nIHdpdGggYSByZXR1cm4gcGFyYW0gCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QgKFN0cmluZyBjbGllbnRQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotCi0KLSAgLyoqCi0gICogc2V0cyB0aGUgdmlzaXRvciB0aGF0IGNhbGxzIHRoZSB2aXNpdAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvcgotICAqLwotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoVmlzaXRvciB2aXNpdG9yKQotICB7Ci0gICAgICBmVmlzaXRvciA9IHZpc2l0b3I7Ci0gIH0KLQotICAvKgotICAqIFNldHMgdGhlIHBhcmVudCBlbGVtZW50IHRoZSBjaGlsZCB0aGVuIGtub3dzIHdoZXJlIHRvCi0gICogYWRkIGl0c2VsZiB0byB0aGUgbW9kZWwKLSAgKiBAcGFyYW0gRWxlbWVudCBwYXJlbnQgZWxlbWVudAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGZQYXJlbnRFbGVtZW50ID0gZWxlbWVudDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4ZDZmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZUeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuTW9kZWxFbGVtZW50c0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuRmllbGRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uLgotKiBUaGlzIFZpc2l0b3JBY3Rpb24gd2lsbCBjcmVhdGUgYSBBdHRyaWJ1dGVFbGVtZW50IHVzaW5nIHRoZQotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayBhIGNvbXBsZXggdHlwZQotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24gZXh0ZW5kcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24KLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkZpZWxkVmlzaXRvckFjdGlvbihFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwcm9qZWN0LCBFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRFbGVtZW50LHByb2plY3QsIGVudik7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gIH0KLQotICAvKioKLSAgKiBDcmVhdGUgYSB0eXBlIGVsZW1lbnQgZnJvbSB0aGUgSmF2YUhlbHBlcgotICAqIEBwYXJhbSBKYXZhUGFyYW1ldGVyIHRoZSBtb2YgZWxlbWVudCB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlCi0gICoqLwotCi0KLSAgLy9iZWFuIGluZm8gY29kZQotCi0KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IGZpZWxkXykKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIEZpZWxkIGZpZWxkID0gKEZpZWxkKWZpZWxkXzsKLSAgICAgCi0gICAgdHJ5ewotICAgICAgIC8vaWYgdGhlIHR5cGUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgdW5zdXBwb3J0ZWQgZG9udCBtYWtlIGFuIEF0dHJpYnV0ZQotICAgICAgaWYoIShnZXRSZXR1cm5QYXJhbSgpICYmIFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUoKEphdmFIZWxwZXJzKWZpZWxkLmdldEphdmFDbGFzcygpKSkgCi0gICAgICAJJiYgKFR5cGVGYWN0b3J5LmlzVW5TdXBwb3J0ZWRUeXBlKChKYXZhSGVscGVycylmaWVsZC5nZXRKYXZhQ2xhc3MoKSkpKXsKLSAgICAgIAkgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfVFlQRSIpICsgKChKYXZhSGVscGVycylmaWVsZC5nZXRKYXZhQ2xhc3MoKSkuZ2V0SmF2YU5hbWUoKSwgU3RhdHVzLldBUk5JTkcgKTsKLQkgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotCSAgICAgIC8vV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEUiKSArICgoSmF2YUhlbHBlcnMpZmllbGQuZ2V0SmF2YUNsYXNzKCkpLmdldEphdmFOYW1lKCksbnVsbCkpOwotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JICB9CQotCi0KLSAgICAgIEZpZWxkRWxlbWVudCBmaWVsZEVsZW1lbnQgPSAoRmllbGRFbGVtZW50KUJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KGZpZWxkLGZQYXJlbnRFbGVtZW50KTsKLQotICAgICAgaWYoZmllbGRFbGVtZW50ICE9IG51bGwpewotICAgICAgICAvL2xldHMgY2hlY2sgYW5kIHNlZSBpZiB0aGUgZ2V0dGVyIHRha2VzIGlucHV0IHBhcmFtcwotICAgICAgICAvL2lmIHNvIHRocm93IGFuIGVycm9yCi0gICAgICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICAgICAgCi0gICAgICAgIEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbiB0eXBlVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24oZmllbGRFbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldEJlYW5zQ3JlYXRlZChnZXRCZWFuc0NyZWF0ZWQoKSk7Ci0gICAgICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOyAKLSAgICAgICAgSmF2YU1vZlR5cGVWaXNpdG9yIHR5cGVWaXNpdG9yID0gbmV3IEphdmFNb2ZUeXBlVmlzaXRvcihlbnZfKTsKLSAgICAgICAgdHlwZVZpc2l0b3Iuc2V0Q2xpZW50UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICBzdGF0dXMgPSB0eXBlVmlzaXRvci5ydW4oZmllbGQsdHlwZVZpc2l0b3JBY3Rpb24pOwotICAgICAgIAotICAgICAgfQotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpCi0JewotICAgIAllbnZfLmdldExvZygpLmxvZyhMb2cuV0FSTklORywgNTA1NSwgdGhpcywgInZpc2l0IiwgZSk7Ci0gICAgCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkphdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24iLCAvLyROT04tTkxTLTEkCi0gICAgCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfSlNQX0dFTiIpLCBTdGF0dXMuV0FSTklORywgZSk7Ci0gICAgCXRyeSB7Ci0gICAgCQllbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsKLSAgICAJfSBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIGUxKSB7Ci0gICAgCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uIiwgLy8kTk9OLU5MUy0xJAotICAgIAkJCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pUU19KU1BfR0VOIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLSAgfQotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTlmYWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZk1ldGhvZFZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIEJlYW5FbGVtZW50IHVzaW5nIHRoZSAKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgdGhlIG1ldGhvZHMgaW4gdGhlIEphdmFDbGFzcwotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uIGV4dGVuZHMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHVibGljIFN0cmluZyBmVW5zdXBwb3J0ZWRQYXJhbWV0ZXJOYW1lOwotCi0gLyoKLSAgKiBNZXRob2RzIG9taXR0ZWQgZnJvbSB0aGUgcHJveHkKLSAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBmTWV0aG9kc09taXR0ZWQ7Ci0KLSAgLyoKLSAgKiBNZXRob2RzIHByb2Nlc3NlZCBmcm9tIHByb3h5Ci0gICovCi0gIHByb3RlY3RlZCBWZWN0b3IgZk1ldGhvZHNQcm9jZXNzZWQ7Ci0KLSAgICAgCi0gIC8qCi0gICpDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCxTdHJpbmcgcHJvamVjdCwgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgc3VwZXIocGFyZW50RWxlbWVudCxwcm9qZWN0LCBlbnYpOwotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIGZNZXRob2RzT21pdHRlZCA9IG5ldyBWZWN0b3IoKTsKLSAgICBmTWV0aG9kc1Byb2Nlc3NlZCA9IG5ldyBWZWN0b3IoKTsKLQotICB9Ci0gICAKLSAgLyoqCi0gICogQ3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgbWV0aG9kIAotICAqIEBwYXJhbSBNZXRob2QgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBpbWV0aG9kKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpaW1ldGhvZDsKLSAgICAgICAgICAgCi0gICAgaWYgKG1ldGhvZENoZWNrKG1ldGhvZCkpewotICAgICAgLy90aGlzIGlzIHRvIGNoZWNrIGltbWVkaWF0ZSBpbnB1dCBhbmQgcmV0dXJuIHBhcmFtZXRlcnMKLSAgICAgIC8vaWYgdGhlcmUgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSBpbiB0aGVzZSB3ZSBjYW4gcmVhY3QgaW1tZWRpYXRlbHkKLSAgICAgIC8vd2UgYWRkIGl0IHRvIHRoZSBvbWl0dGVkIG1ldGhvZHMgYW4gZ28gdG8gdGhlIG5leHQgb25lCi0gICAgICBpZighcGFyYW1ldGVyQ2hlY2sobWV0aG9kKSl7Ci0gICAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0FSUkFZUyIpICsgZlVuc3VwcG9ydGVkUGFyYW1ldGVyTmFtZSwgU3RhdHVzLldBUk5JTkcgKTsKLSAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzIChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAgLy8JCVdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCAiJU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0FSUkFZUyIgKSArIGZVbnN1cHBvcnRlZFBhcmFtZXRlck5hbWUsbnVsbCkpOwotICAgICAgICBmTWV0aG9kc09taXR0ZWQuYWRkRWxlbWVudChtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICAgIGlmKCFudWxsQ29uc3RydWN0b3IobWV0aG9kKSl7Ci0gICAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0lOUFVUUyIpICsgZlVuc3VwcG9ydGVkUGFyYW1ldGVyTmFtZSwgU3RhdHVzLldBUk5JTkcgKTsKLSAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzIChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAJLy8JV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1BBUkFNRVRFUlNfSU5QVVRTIiApICsgZlVuc3VwcG9ydGVkUGFyYW1ldGVyTmFtZSxudWxsKSk7Ci0gICAgICAgIGZNZXRob2RzT21pdHRlZC5hZGRFbGVtZW50KG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgCi0gICAgICB9Ci0KLSAgICAgIC8vY2Fycnkgb24gYWxsIHBhcmFtZXRlcnMgc3VwcG9ydGVkCi0gICAgICBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudClCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudChtZXRob2QsZlBhcmVudEVsZW1lbnQpOwotICAgICAgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3JBY3Rpb24gcGFyYW1ldGVyVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mUGFyYW1ldGVyVmlzaXRvckFjdGlvbihtZXRob2RFbGVtZW50LGNsaWVudFByb2plY3QsZW52Xyk7Ci0gICAgICBwYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yIHBhcmFtZXRlclZpc2l0b3IgPSBuZXcgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IoZW52Xyk7Ci0gICAgICBzdGF0dXMgPSBwYXJhbWV0ZXJWaXNpdG9yLnJ1bihtZXRob2QscGFyYW1ldGVyVmlzaXRvckFjdGlvbik7ICAgCi0gICAgICAvL3NvbWV0aGluZyBtYXkgaGF2ZSBnb25lIHdyb25nIHdpdGggYW4gaW50ZXJuYWwgdHlwZQotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spewotICAgICAgICAvL1RoaXMgbWV0aG9kIGhhcyB0byBiZSBvbWl0dGVkCi0gICAgICAgIGZNZXRob2RzT21pdHRlZC5hZGRFbGVtZW50KG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotICAgICAgICBtZXRob2RFbGVtZW50LnNldE1ldGhvZE9tbWlzc2lvbih0cnVlKTsgIAotICAgICAgfQkKLSAgICAgIGVsc2UgewotICAgICAgICBmTWV0aG9kc1Byb2Nlc3NlZC5hZGRFbGVtZW50KG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotICAgICAgfQkKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotIAotICAvKgotICAqIFRlbGxzIHdldGhlciBhbnkgbWV0aG9kcyB3ZXJlIHByb2Nlc3NlZCAKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBhbnkgbWV0aG9kcyB3ZXJlIHByb2Nlc3NlZCAKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2VyZU1ldGhvZHNQcm9jZXNzZWQoKQotICB7Ci0gICAgaWYoZk1ldGhvZHNQcm9jZXNzZWQuaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKgotICAqIFRlbGxzIHdldGhlciB0aGVyZSB3ZXJlIG1ldGhvZHMgb21pdHRlZCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkIHR5cGVzCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgbWV0aG9kcyB3ZXJlIG9taXR0ZWQKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2VyZU1ldGhvZHNPbWl0dGVkKCkKLSAgewotICAgIGlmKGZNZXRob2RzT21pdHRlZC5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICogVGhlcmUgbWF5IGJlIG1ldGhvZHMgdGhhdCB3ZSBkb250IHN1cHBvcnQKLSAgKiBhbmQgZG9udCB3YW50IGluIHRoZSBtb2RlbAotICAqIEBwYXJhbSBib29sZWFuIHRydWUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIGZpbmUKLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIG1ldGhvZENoZWNrKE1ldGhvZCBtZXRob2QpCi0gIHsKLSAgICBib29sZWFuIG9rID0gdHJ1ZTsKLSAgICAvLyBpZiB3ZSBoYXZlIGEgY29uc3RydWN0b3Igd2UgcmV0dXJuIGZhbHNlCi0gICAgaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHJldHVybiBmYWxzZTsKLQotICAgICAgIAotICAgIHJldHVybiBvazsKLSAgfQotCi0gIC8qKgotICAqIFRoZXJlIG1heSBiZSBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kIHRoYXQgaGF2ZSB0eXBlcwotICAqIG5vdCB5ZXQgc3VwcG9ydGVkIHJldHVybiBmYWxzZSBpZiB3ZSBmaW5kIGFueQotICAqIEBwYXJhbSBib29sZWFuIHRydWUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIGZpbmUKLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIHBhcmFtZXRlckNoZWNrKE1ldGhvZCBtZXRob2QpCi0gIHsKLQotICAgIGJvb2xlYW4gb2sgPSB0cnVlOwotICAgIAotICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJbXSA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsgCi0gICAgYm9vbGVhbiBwYXJhbVN1cHBvcnRlZCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7aTxqYXZhUGFyYW1ldGVyLmxlbmd0aDtpKyspIHsKLSAgICAgIEphdmFQYXJhbWV0ZXIgcGFyYW09amF2YVBhcmFtZXRlcltpXTsKLSAgICAgIEphdmFIZWxwZXJzIGphdmFIZWxwZXIxID0gcGFyYW0uZ2V0SmF2YVR5cGUoKTsKLSAgICAgIGlmKFR5cGVGYWN0b3J5LmlzVW5TdXBwb3J0ZWRUeXBlKGphdmFIZWxwZXIxKSkgewotICAgICAgICBmVW5zdXBwb3J0ZWRQYXJhbWV0ZXJOYW1lID0gcGFyYW0uZ2V0TmFtZSgpOyAKLSAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgfSAgICAKLSAgICB9Ci0gIHJldHVybiBvazsKLSAgfQotCi0gCi0gIC8qKgotICAqIFRoZXJlIG1heSBiZSBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kIHRoYXQgaGF2ZSB0eXBlcwotICAqIG5vdCB5ZXQgc3VwcG9ydGVkIHJldHVybiBmYWxzZSBpZiB3ZSBmaW5kIGFueQotICAqIEBwYXJhbSBib29sZWFuIHRydWUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIGZpbmUKLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIG51bGxDb25zdHJ1Y3RvcihNZXRob2QgbWV0aG9kKQotICB7Ci0gICAgCi0gICAgYm9vbGVhbiBvayA9IHRydWU7Ci0gICAgLy9ub3cgdGhlIGlucHV0cwotICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcltdID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOyAKLSAgICBib29sZWFuIHBhcmFtU3VwcG9ydGVkID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDtpPGphdmFQYXJhbWV0ZXIubGVuZ3RoO2krKykgewotICAgICAgSmF2YVBhcmFtZXRlciBwYXJhbT1qYXZhUGFyYW1ldGVyW2ldOwotICAgICAgSmF2YUhlbHBlcnMgamF2YUhlbHBlcjEgPSBwYXJhbS5nZXRKYXZhVHlwZSgpOwotICAgICAgaWYoamF2YUhlbHBlcjEgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpewotICAgICAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcylqYXZhSGVscGVyMTsKLSAgICAgICAgaWYoVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oamF2YUNsYXNzLmdldEphdmFOYW1lKCkpKXJldHVybiB0cnVlOwotICAgICAgICAgIEl0ZXJhdG9yIG09amF2YUNsYXNzLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChtLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDI9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2QyLmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgICAgICAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtW10gPSBtZXRob2QyLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotICAgICAgICAgICAgICBpZiAoamF2YVBhcmFtLmxlbmd0aCA+IDApewotICAgICAgICAgICAgICAgIC8vdGhlbiB3ZSBoYXZlIG5vIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICBmVW5zdXBwb3J0ZWRQYXJhbWV0ZXJOYW1lID0gcGFyYW0uZ2V0TmFtZSgpOyAKLSAgICAJICAgICAgICBvayA9IGZhbHNlOwotICAgICAgICAgICAgICB9ICAgIAotICAgICAgICAgICAgICBlbHNlIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgcmV0dXJuIG9rOwotICB9Ci0KLSAKLQotCi0KLQotCi0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyY2UwNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mUGFyYW1ldGVyVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlBhcmFtZXRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIHBhcmFtZXRlckVsZW1lbnQgdXNpbmcgdGhlIAotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayB0byBpdHMgdHlwZQotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uIGV4dGVuZHMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gICAgCi0gIC8qCi0gICpDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCxTdHJpbmcgcHJvamVjdCwgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgc3VwZXIocGFyZW50RWxlbWVudCxwcm9qZWN0LCBlbnYpOwotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgICAKLSAgfQotICAgCi0gIC8qKgotICAqIENyZWF0ZSBhIHBhcmFtZXRlciBlbGVtZW50IGZyb20gdGhlIG1ldGhvZCAKLSAgKiBAcGFyYW0gSmF2YVBhcmFtZXRlciB0aGUgbW9mIGVsZW1lbnQgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIFBhcmFtZXRlcgotICAqKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IGlqYXZhUGFyYW1ldGVyKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAlDaG9pY2UgT0tDaG9pY2UgPSBuZXcgQ2hvaWNlKCdPJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX09LIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9PSyIpKTsKLSAgCUNob2ljZSBDYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX0NBTkNFTCIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiREVTQ1JJUFRJT05fQ0FOQ0VMIikpOwotICAJCi0gICAgUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gKFBhcmFtZXRlckVsZW1lbnQpQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQoaWphdmFQYXJhbWV0ZXIsZlBhcmVudEVsZW1lbnQpOwotICAgIEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbiB0eXBlVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24ocGFyYW1ldGVyRWxlbWVudCxjbGllbnRQcm9qZWN0LCBlbnZfKTsKLSAgICAvL3R5cGVWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRSZXR1cm5QYXJhbShwYXJhbWV0ZXJFbGVtZW50LmlzUmV0dXJuKCkpOwotICAgIEphdmFNb2ZUeXBlVmlzaXRvciB0eXBlVmlzaXRvciA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3IoZW52Xyk7Ci0gICAgdHlwZVZpc2l0b3Iuc2V0Q2xpZW50UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgIHN0YXR1cyA9IHR5cGVWaXNpdG9yLnJ1bihpamF2YVBhcmFtZXRlcix0eXBlVmlzaXRvckFjdGlvbik7Ci0gICAgLy8KLSAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgCi0gICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICB7Ci0gICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgewotICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgIAkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgfQotICAgICAgCQotICAgIH0KLSAgICAvLyAgICAgICAgICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZTQ5OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mQmVhblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIFR5cGVFbGVtZW50IHVzaW5nIHRoZQotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayBhIGNvbXBsZXggdHlwZQotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbiBleHRlbmRzIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCxTdHJpbmcgcHJvamVjdCwgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgc3VwZXIocGFyZW50RWxlbWVudCxwcm9qZWN0LCBlbnYpOwotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgICAKLSAgfQotCi0gIC8qKgotICAqIENyZWF0ZSBhIHR5cGUgZWxlbWVudCBmcm9tIHRoZSBKYXZhSGVscGVyCi0gICogQHBhcmFtIEphdmFIZWxwZXIgdGhlIG1vZiBlbGVtZW50IHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBUeXBlCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3QgdHlwZU5hdmlnYXRvcikKLSAgewotICAJIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgIAkgQ2hvaWNlIE9LQ2hvaWNlID0gbmV3IENob2ljZSgnTycsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9PSyIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiREVTQ1JJUFRJT05fT0siKSk7Ci0gIAkgQ2hvaWNlIENhbmNlbENob2ljZSA9IG5ldyBDaG9pY2UoJ0MnLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfQ0FOQ0VMIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9DQU5DRUwiKSk7ICAJIAotCi0gICAgIC8vaWYgYmVhbgotCSBKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsKLQkgaWYodHlwZU5hdmlnYXRvciBpbnN0YW5jZW9mIEphdmFDbGFzcyl7Ci0JICAgIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpdHlwZU5hdmlnYXRvcjsKLQkgfQotCi0KLSAgICAgLyogSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHJldHVybiBwYXJhbWV0ZXIgdGhlbiB3ZSBuZWVkIHRvIHRyZWF0IHRoaXMgZGlmZmVyZW50bHkgdGhlbiBpZiBpdCBpcyBhbiBpbnB1dCAKLSAgICAgKiAgcGFyYW1ldGVyLgotICAgICAqICBXZSBuZWVkIHRvIGZpcnN0IHNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgcmV0dXJuIHR5cGVzIGlmIG5vdCB3ZSB0cmVhdCBpdCB0aGUgc2FtZSBhcyBldmVyeXRoaW5nCi0gICAgICogIGVsc2UuCi0gICAgICovCi0gICAgIGlmKGdldFJldHVyblBhcmFtKCkgJiYgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZSgoSmF2YUhlbHBlcnMpdHlwZU5hdmlnYXRvcikpewotICAgICAgIFR5cGVFbGVtZW50IHR5cGVFbGVtZW50ID0gKFR5cGVFbGVtZW50KUJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KHR5cGVOYXZpZ2F0b3IsZlBhcmVudEVsZW1lbnQpOwotICAgICB9CQotICAgICBlbHNlewotCSAgICBpZihUeXBlRmFjdG9yeS5pc1VuU3VwcG9ydGVkVHlwZSgoSmF2YUhlbHBlcnMpdHlwZU5hdmlnYXRvcikpewotCSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfVFlQRSIpICsgKChKYXZhSGVscGVycyl0eXBlTmF2aWdhdG9yKS5nZXRKYXZhTmFtZSgpLCBTdGF0dXMuV0FSTklORyApOwkgICAgCQotCSAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0gICAgICAgICAgICAgIC8vV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEUiICkgKyAoKEphdmFIZWxwZXJzKXR5cGVOYXZpZ2F0b3IpLmdldEphdmFOYW1lKCksbnVsbCkpOwotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JICAgIH0JCi0JICAgIAotCSAgICAvL2lmIGphdmFjbGFzcyBpcyBudWxsIHRoZW4gd2UgaGF2ZSBhIHNpbXBsZSB0eXBlIAotCSAgICBpZigoamF2YUNsYXNzID09IG51bGwpIHx8IFR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKGphdmFDbGFzcy5nZXRKYXZhTmFtZSgpKSl7Ci0JICAgICAgVHlwZUVsZW1lbnQgdHlwZUVsZW1lbnQgPSAoVHlwZUVsZW1lbnQpQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQodHlwZU5hdmlnYXRvcixmUGFyZW50RWxlbWVudCk7Ci0JICAgIH0KLQkgICAgZWxzZXsKLQkgICAgICBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24gYmVhblZpc2l0b3JBY3Rpb24gPSBuZXcgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uKGZQYXJlbnRFbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotCSAgICAgIGJlYW5WaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLQkgICAgICBiZWFuVmlzaXRvckFjdGlvbi5zZXRCZWFuc0NyZWF0ZWQoZ2V0QmVhbnNDcmVhdGVkKCkpOwotICAgICAgICAgIGJlYW5WaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotCQkgIEphdmFNb2ZCZWFuVmlzaXRvciBiZWFuVmlzaXRvciA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3IoKTsKLQkgICAgICBzdGF0dXMgPSBiZWFuVmlzaXRvci5ydW4oamF2YUNsYXNzLGJlYW5WaXNpdG9yQWN0aW9uKTsKLQkgICAgfQotICAgICB9Ci0gICAgIAotICAgICAvLwotICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgCi0gICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgIHsKLSAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICB7Ci0gICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TQU1QTEVfQ1JFQVRJT05fQ0FOQ0VMRUQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICB9Ci0gICAgICAgCQotICAgICB9Ci0gICAgIC8vCi0gICAgIHJldHVybiBzdGF0dXM7Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL1Zpc2l0b3JBY3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL1Zpc2l0b3JBY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjQzZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9WaXNpdG9yQWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBWaXNpdG9yQWN0aW9uLgotKiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgd2FsayB0aGUgbWV0aG9kcyBpbiB0aGUgSmF2YUNsYXNzCi0qICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlzaXRvckFjdGlvbkltcGwgaW1wbGVtZW50cyBWaXNpdG9yQWN0aW9uIAotewotCi0gIHByaXZhdGUgVmlzaXRvciBmVmlzaXRvciA9IG51bGw7Ci0gIHByaXZhdGUgVmVjdG9yIGJlYW5zVmlzaXRlZCA9IG51bGw7Ci0gIHByaXZhdGUgVmVjdG9yIG1lc3NhZ2VzID0gbnVsbDsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0gIHB1YmxpYyBWaXNpdG9yQWN0aW9uSW1wbCggVmVjdG9yIG1lc3NhZ2VzLCBWZWN0b3IgYmVhbnNWaXNpdGVkKQotICAJewotICAJIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlczsKLSAgCSB0aGlzLmJlYW5zVmlzaXRlZCA9IGJlYW5zVmlzaXRlZDsKLSAgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi5wbHVnaW4iLCB0aGlzICk7Ci0gIAl9Ci0gIAotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyByZXNpZGVudCkKLSAgewotICAgIC8vbm90aGluZyB0byBiZSBkb25lIGJ1dCBtdXN0IGJlIGltcGxlbWVudGVkCi0gIH0KLQotIC8qKgotICAqIFJldHVybnMgdGhlIHZlY3RvciBvZiBhbGwgbWVzc2FnZXMgZm91bmQKLSAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRNZXNzYWdlcyAoKQotICB7Ci0gIAlpZiAobWVzc2FnZXMgPT0gbnVsbCkgCi0gIAkJbWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcmV0dXJuIG1lc3NhZ2VzOwotICB9Ci0KLSAgcHVibGljIFZlY3RvciBnZXRCZWFuc1Zpc2l0ZWQoKQotICAJewotCQlpZiAoIGJlYW5zVmlzaXRlZCA9PSBudWxsKQotICAJCQliZWFuc1Zpc2l0ZWQgPSBuZXcgVmVjdG9yKCk7IAotICAgICAgICByZXR1cm4gYmVhbnNWaXNpdGVkOwotICAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFZpc2l0ZWRCZWFuKCBKYXZhQ2xhc3MgYmVhbikKLSAgCXsKLSAgCQlpZiAoIGJlYW5zVmlzaXRlZCA9PSBudWxsKQotICAJCQliZWFuc1Zpc2l0ZWQgPSBuZXcgVmVjdG9yKCk7Ci0gIAkJYmVhbnNWaXNpdGVkLmFkZChiZWFuKTsKLSAgCX0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0JlYW5WaXNpdGVkIChKYXZhQ2xhc3MgYmVhbikKLSAgCXsKLSAgCQlyZXR1cm4gKGJlYW5zVmlzaXRlZCAhPSBudWxsICYmIGJlYW5zVmlzaXRlZC5jb250YWlucyhiZWFuKSk7Ci0gIAl9Ci0KLSAgLyoqCi0gICogc2V0cyB0aGUgdmlzaXRvciB0aGF0IGNhbGxzIHRoZSB2aXNpdAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvcgotICAqLwotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoVmlzaXRvciB2aXNpdG9yKQotICB7Ci0gICAgICBmVmlzaXRvciA9IHZpc2l0b3I7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRNZXNzYWdlICggU3RyaW5nIGtleSApCi0gIHsKLSAgICBnZXRNZXNzYWdlcygpLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZShrZXkpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE1lc3NhZ2UgKCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzICkKLSAgewotICAgIGdldE1lc3NhZ2VzKCkuYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKGtleSxhcmdzKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWQ1ZjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuRmllbGRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbW9uLlNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mQXR0cmlidXRlVmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0OwotICBwcml2YXRlIGJvb2xlYW4gcmV0dXJuUGFyYW1ldGVyOwotICBwcml2YXRlIEVudmlyb25tZW50IGVudjsKLSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCXRoaXMuZW52ID0gZW52OwotICB9Ci0gIAotICAvKgotICAqIFVzZSB0aGlzIHRvIHJlZmxlY3QgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgIC8qCi0gICogVXNlIHRoaXMgdG8gcmVmbGVjdCAKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmV0dXJuUGFyYW1ldGVyKGJvb2xlYW4gcmV0dXJuUGFyYW1ldGVyKQotICB7Ci0gICAgdGhpcy5yZXR1cm5QYXJhbWV0ZXIgPSByZXR1cm5QYXJhbWV0ZXI7Ci0gIH0KLSAKLSAgCi0gIC8qCi0gICogR2V0IHRoZSBhdHRyaWJ1dGUgYmVsb25naW5nIHRvIHRoaXMgY29tcGxleCB0eXBlIAotICAqIEBwYXJhbSBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgdGhhdCBvd25zIHRoZSB0eXBlCi0gICogQHBhcmFtIFZpc2l0b3JBY3Rpb24gQWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBlYWNoIG1ldGhvZAotICAqKi8KLSAgcHVibGljIFN0YXR1cyBydW4gKCBPYmplY3QgamF2YWNsYXNzLCBWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcylqYXZhY2xhc3M7ICAgICAKLQotICAgIEhhc2h0YWJsZSBzcGRNYXAgPSBuZXcgSGFzaHRhYmxlKCk7ICAKLSAgICBmb3IgKEl0ZXJhdG9yIG09amF2YUNsYXNzLmdldFB1YmxpY01ldGhvZHMoKS5pdGVyYXRvcigpOyBtLmhhc05leHQoKTsgKSB7Ci0gICAgICBNZXRob2QgbWV0aG9kPShNZXRob2QpbS5uZXh0KCk7Ci0gICAgICBpZiAoKChtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLnN0YXJ0c1dpdGgoImdldCIpIAotICAgICAgCXx8IG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgiaXMiKSkgCi0gICAgICAgICYmIG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCApCi0gICAgICAgIHx8IChtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLnN0YXJ0c1dpdGgoInNldCIpIAotICAgICAgICAmJiBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID4gMCkpIHsKLSAgICAgICAgaW50IHN1YiA9IDM7Ci0gICAgICAgIGlmKG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgiaXMiKSkKLSAgICAgICAgICBzdWIgPSAyOwkKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3Vic3RyaW5nKHN1Yik7ICAgIAotICAgICAgICBTdHJpbmcgbG93ZXIgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsMSkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgU3RyaW5nIHJlbWFpbmRlciA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7IAotICAgICAgICBwcm9wZXJ0eU5hbWUgPSBsb3dlciArIHJlbWFpbmRlcjsKLSAgICAgICAgaW50IGluZGV4ID0gcHJvcGVydHlOYW1lLmxhc3RJbmRleE9mKCIoIik7Ci0gICAgICAgIFN0cmluZyB0ZW1wID0gcHJvcGVydHlOYW1lOwotICAgICAgICBwcm9wZXJ0eU5hbWUgPSB0ZW1wLnN1YnN0cmluZygwLGluZGV4KTsgCi0gICAgICAgIAotICAgICAgICAvL2ZpbmQgdGhlIHByb3BlcnR5ZGVzY3JpcHRvcgotICAgICAgICBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3Igc3BkID0gKFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcilzcGRNYXAuZ2V0KHByb3BlcnR5TmFtZSk7IAotICAgICAgICBpZihzcGQgPT0gbnVsbCl7Ci0gICAgICAgICAgc3BkID0gbmV3IFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgIHNwZE1hcC5wdXQocHJvcGVydHlOYW1lLHNwZCk7IAotICAgICAgICB9Ci0gICAgICAgIGlmKG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgic2V0IikpCi0gICAgICAgICAgc3BkLnNldFdyaXRlTWV0aG9kKG1ldGhvZCk7Ci0gICAgICAgIGVsc2UgCi0gICAgICAgICAgc3BkLnNldFJlYWRNZXRob2QobWV0aG9kKTsKLQotICAgICAgICBGaWVsZEltcGwgZmllbGQgPSAoRmllbGRJbXBsKWphdmFDbGFzcy5nZXRGaWVsZE5hbWVkKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHByb3BlcnR5VHlwZSA9IG51bGw7IAotICAgICAgICBpZihmaWVsZCAhPSBudWxsKXsKLSAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBmaWVsZC5nZXRKYXZhVHlwZSgpOwotICAgICAgICAgIHNwZC5zZXRmU3RhdGljKGZpZWxkLmlzU3RhdGljKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgaWYobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdGFydHNXaXRoKCJnZXQiKSB8fCBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLnN0YXJ0c1dpdGgoImlzIikpCi0gICAgICAgICAgCXByb3BlcnR5VHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICBKYXZhUGFyYW1ldGVyIHBhcmFtc1tdID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOyAKLSAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBwYXJhbXNbMF0uZ2V0SmF2YVR5cGUoKTsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfQotICAgICAgICAgIAkKLSAgICAgICAgc3BkLnNldFByb3BlcnR5VHlwZShwcm9wZXJ0eVR5cGUpOyAKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIEVudW1lcmF0aW9uIHNwZEVudW0gPSBzcGRNYXAuZWxlbWVudHMoKTsKLSAgICB3aGlsZShzcGRFbnVtLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBzcGQgPSAoU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKXNwZEVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmKHNwZENoZWNrKHNwZCkpCi0gICAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQoc3BkKTsgICAKLSAgICB9IAotICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gc3BkQ2hlY2soU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yIHNwZCkKLSAgeyAgCi0gICAgLy9jaGVjayBmb3IgaW5kZXhlZCBwcm9wZXJ0aWVzCi0gIAlNZXRob2Qgd3JpdGVNZXRob2QgPSBzcGQuZ2V0V3JpdGVNZXRob2QoKTsKLSAgCWlmKHdyaXRlTWV0aG9kICE9IG51bGwpCi0gIAkgIGlmKHdyaXRlTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZTsKLSAgCQotICAJaWYoc3BkLmdldFByb3BlcnR5VHlwZSgpID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBpZihzcGQuZ2V0UHJvcGVydHlUeXBlKCkuaXNQcmltaXRpdmUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYocmV0dXJuUGFyYW1ldGVyICYmIFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUoc3BkLmdldFByb3BlcnR5VHlwZSgpKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYoIXJldHVyblBhcmFtZXRlciAmJiBUeXBlRmFjdG9yeS5pc1VuU3VwcG9ydGVkVHlwZShzcGQuZ2V0UHJvcGVydHlUeXBlKCkpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZighY2hlY2tQb2xhcml0eShzcGQpKSByZXR1cm4gZmFsc2U7ICAgCi0gICAgICAgCi0gICAgLy8gc28gaXRzIGEgYmVhbiBtYWtlIHN1cmUgaXQgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciAgICAgICAKLSAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZiA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICBqYXZhTW9mUmVmLnNldENsaWVudFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICBqYXZhTW9mUmVmLnNldFByb3h5QmVhbigoKEphdmFIZWxwZXJzKXNwZC5nZXRQcm9wZXJ0eVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICBqYXZhTW9mUmVmLmV4ZWN1dGUoZW52KTsKLSAgICBpZihqYXZhTW9mUmVmLmdldEphdmFDbGFzcygpIGluc3RhbmNlb2YgSmF2YUNsYXNzKXsKLSAgICAgICBpZihUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihqYXZhTW9mUmVmLmdldEphdmFDbGFzcygpLmdldEphdmFOYW1lKCkpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICByZXR1cm4gZGVmYXVsdENoZWNrKChKYXZhQ2xhc3MpamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIAotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tQb2xhcml0eShTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3Igc3BkKXsKLSAgICAKLSAgCU1ldGhvZCByZWFkTWV0aG9kID0gc3BkLmdldFJlYWRNZXRob2QoKTsKLSAgCU1ldGhvZCB3cml0ZU1ldGhvZCA9IHNwZC5nZXRXcml0ZU1ldGhvZCgpOwotICAJaWYoKHJlYWRNZXRob2QgPT0gbnVsbCAmJiB3cml0ZU1ldGhvZCAhPSBudWxsKSB8fCAocmVhZE1ldGhvZCAhPSBudWxsICYmIHdyaXRlTWV0aG9kID09IG51bGwpKQotICAJICByZXR1cm4gdHJ1ZTsJCi0gIAlpZihyZWFkTWV0aG9kID09IG51bGwgJiYgd3JpdGVNZXRob2QgPT0gbnVsbCkKLSAgCSAgcmV0dXJuIGZhbHNlOwkKLSAgCSAgCQotICAJSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSB3cml0ZU1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLSAgICBmb3IoaW50IGkgPSAwO2k8IGphdmFQYXJhbWV0ZXIubGVuZ3RoO2krKyl7Ci0gICAgICBKYXZhUGFyYW1ldGVyIGpwID0gamF2YVBhcmFtZXRlcltpXTsgCQotICAgICAgU3RyaW5nIG5hbWUxID0ganAuZ2V0SmF2YVR5cGUoKS5nZXRKYXZhTmFtZSgpOwotICAgICAgU3RyaW5nIG5hbWUgPSByZWFkTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpOwotICAgICAgaWYoanAuZ2V0SmF2YVR5cGUoKS5nZXRKYXZhTmFtZSgpLmVxdWFscyhyZWFkTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpKSkKLSAgICAgICAgcmV0dXJuIHRydWU7IAotICAgIH0KLSAgCXJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRDaGVjayhKYXZhQ2xhc3MgamF2YUNsYXNzKXsKLSAgICAKLSAgICAgICBJdGVyYXRvciBtPWphdmFDbGFzcy5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgLy9ub3cgY2hlY2sgZm9yIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICBib29sZWFuIGRlZmF1bHRDb25zdCA9IHRydWU7Ci0gICAgICAgIHdoaWxlIChtLmhhc05leHQoKSkgewotICAgICAgICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgICAgICBpZiAoamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICAgICAgICAgICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJbXSA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLSAgICAgICAgICAgICAgICBpZiAoamF2YVBhcmFtZXRlci5sZW5ndGggPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAvL3RoZW4gd2UgaGF2ZSBubyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnN0ID0gZmFsc2U7IAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKGphdmFQYXJhbWV0ZXIubGVuZ3RoID09IDApewotICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgCi0gICAgICAgcmV0dXJuIGRlZmF1bHRDb25zdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIHBvbGFyaXR5Q2hlY2soSmF2YUNsYXNzIGphdmFDbGFzcyl7Ci0gICAgCi0gICAgICAgSXRlcmF0b3IgbT1qYXZhQ2xhc3MuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIC8vbm93IGNoZWNrIGZvciBhIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgICAgYm9vbGVhbiBkZWZhdWx0Q29uc3QgPSB0cnVlOwotICAgICAgICB3aGlsZSAobS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICBNZXRob2QgbWV0aG9kPShNZXRob2QpbS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgICAgICAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGphdmFQYXJhbWV0ZXIubGVuZ3RoID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgLy90aGVuIHdlIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb25zdCA9IGZhbHNlOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihqYXZhUGFyYW1ldGVyLmxlbmd0aCA9PSAwKXsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIAotICAgICAgIHJldHVybiBkZWZhdWx0Q29uc3Q7Ci0gIH0KLSAgICAgICAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQmVhblZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZkJlYW5WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMzhhMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQmVhblZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mQmVhblZpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkJlYW5WaXNpdG9yKCkKLSAgewotICB9Ci0gCi0gIHB1YmxpYyBTdGF0dXMgcnVuICggT2JqZWN0IGphdmFDbGFzcywgVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gICAgcmV0dXJuIHZBY3Rpb24udmlzaXQoKEphdmFDbGFzcylqYXZhQ2xhc3MpOyAgIAotICB9Ci0gICAgICAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZkZpZWxkVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mRmllbGRWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYTM5NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mRmllbGRWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5GaWVsZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mRmllbGRWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0KLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZGaWVsZFZpc2l0b3IoKQotICB7Ci0gIH0KLQotICAvKgotICAqIFVzZSB0aGlzIHRvIHJlZmxlY3QgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgIC8qCi0gICogVXNlIHRoaXMgdG8gcmVmbGVjdCAKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgLyoKLSAgKiBHZXQgdGhlIGF0dHJpYnV0ZSBiZWxvbmdpbmcgdG8gdGhpcyBjb21wbGV4IHR5cGUgCi0gICogQHBhcmFtIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciB0aGF0IG93bnMgdGhlIHR5cGUKLSAgKiBAcGFyYW0gVmlzaXRvckFjdGlvbiBBY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGVhY2ggbWV0aG9kCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHJ1biAoIE9iamVjdCBqYXZhY2xhc3MsIFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFjbGFzczsgICAgIAotCi0gICAgYm9vbGVhbiBob2xkZXJDbGFzcyA9IGZhbHNlOwotICAgIEVMaXN0IGltcGxlbWVudGVkID0gamF2YUNsYXNzLmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBsZW1lbnRlZC5zaXplKCk7IGkrKykgewotCSAgSmF2YUNsYXNzIGFuSW50ZXJmYWNlID0gKEphdmFDbGFzcykgaW1wbGVtZW50ZWQuZ2V0KGkpOwotCSAgaWYgKGFuSW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImphdmF4LnhtbC5ycGMuaG9sZGVycy5Ib2xkZXIiKSkKLQkgICAgaG9sZGVyQ2xhc3MgPSB0cnVlOwotCX0gICAgICAKLQotICAgICAvL2JlYW5pbmZvIGNvZGUKLSAgICBpZihob2xkZXJDbGFzcyl7ICAgICAKLSAgICAgIEVMaXN0IGUgID0gamF2YUNsYXNzLmdldEZpZWxkcygpOwotICAgICAgTGlzdEl0ZXJhdG9yIGxpc3QgPSBlLmxpc3RJdGVyYXRvcigpOwotICAgICAgd2hpbGUobGlzdC5oYXNOZXh0KCkpewotICAgICAgICBGaWVsZCBmaWVsZCA9IChGaWVsZClsaXN0Lm5leHQoKTsgICAgIAotICAgICAgICBpZihmaWVsZC5nZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkgPT0gSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQyAmJiAhZmllbGQuaXNGaW5hbCgpICYmICFmaWVsZC5pc1N0YXRpYygpKXsKLSAgICAgICAgICBpZihmaWVsZENoZWNrKChGaWVsZEltcGwpZmllbGQpKQotICAgICAgICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChmaWVsZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfSAgICAgICAKLSAgcHJpdmF0ZSBib29sZWFuIGZpZWxkQ2hlY2soRmllbGRJbXBsIGZpZWxkKQotICB7Ci0gICAgLy8gc28gaXRzIGEgYmVhbiBtYWtlIHN1cmUgaXQgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciAKLSAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZiA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICBqYXZhTW9mUmVmLnNldFByb3h5QmVhbihmaWVsZC5nZXRKYXZhVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgamF2YU1vZlJlZi5zZXRDbGllbnRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0gICAgamF2YU1vZlJlZi5leGVjdXRlKG51bGwpOwotICAgIGlmKGphdmFNb2ZSZWYuZ2V0SmF2YUNsYXNzKCkgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpewotICAgICAgaWYoVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpKSkgcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gZGVmYXVsdENoZWNrKChKYXZhQ2xhc3MpamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gICAgICAgIAotIHByaXZhdGUgYm9vbGVhbiBkZWZhdWx0Q2hlY2soSmF2YUNsYXNzIGphdmFDbGFzcyl7Ci0gICAgCi0gICBJdGVyYXRvciBtPWphdmFDbGFzcy5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKTsKLSAgIC8vbm93IGNoZWNrIGZvciBhIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgIGJvb2xlYW4gZGVmYXVsdENvbnN0ID0gdHJ1ZTsKLSAgIHdoaWxlIChtLmhhc05leHQoKSkgewotICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICBpZiAoamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpewotICAgICAgLy9ub3cgdGhlIGlucHV0cwotICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgICBpZiAoamF2YVBhcmFtZXRlci5sZW5ndGggPiAwKXsKLSAgICAgICAgLy90aGVuIHdlIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICBkZWZhdWx0Q29uc3QgPSBmYWxzZTsgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmKGphdmFQYXJhbWV0ZXIubGVuZ3RoID09IDApewotICAgICAgICBpZiAobWV0aG9kLmdldEphdmFWaXNpYmlsaXR5KCkuZ2V0VmFsdWUoKSA9PSAwKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBlbHNlIGlmKG1ldGhvZC5nZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkgPT0gMSkgCi0gICAgICAgICAgZGVmYXVsdENvbnN0ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgCi0gIHJldHVybiBkZWZhdWx0Q29uc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZk1ldGhvZFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZk1ldGhvZFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiMmQ5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZNZXRob2RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mTWV0aG9kVmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHB1YmxpYyBTdHJpbmcgU0VUX0VORFBPSU5UID0gInNldEVuZFBvaW50IjsKLSAgcHVibGljIFN0cmluZyBHRVRfRU5EUE9JTlQgPSAiZ2V0RW5kUG9pbnQiOwotICBwcml2YXRlIEJvb2xlYW5TZWxlY3Rpb25bXSBmTWV0aG9kc1NlbGVjdGVkOwotCi0KLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZNZXRob2RWaXNpdG9yKCkKLSAgewotICB9Ci0gCi0gIHB1YmxpYyBTdHJpbmcgVU5ERVJfU0NPUkUgPSAiXyI7Ci0KLSAgLyoKLSAgKiBSdW4gdGhyb3VnaCBhbGwgdGhlIG1ldGhvZHMgaW4gdGhpcyBiZWFuCi0gICogQHBhcmFtIEphdmFDbGFzcyBqYXZhY2xhc3MgdGhhdCBob2xkcyB0aGUgbWV0aG9kcwotICAqIEBwYXJhbSBWaXNpdG9yQWN0aW9uIEFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZWFjaCBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgcnVuICggT2JqZWN0IGphdmFjbGFzcywgVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpamF2YWNsYXNzOwotICAgIGZvciAoSXRlcmF0b3IgbT1qYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7IG0uaGFzTmV4dCgpOyApIHsKLSAgICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgIGlmKGZNZXRob2RzU2VsZWN0ZWQgIT0gbnVsbCkgIHsKLSAgICAgICAgYm9vbGVhbiBtZXRob2RTZWxlY3RlZCA9IGZhbHNlOwotICAgICAgCWZvcihpbnQgaSA9MDtpIDwgZk1ldGhvZHNTZWxlY3RlZC5sZW5ndGg7aSsrKXsKLSAgICAgICAgICBpZihmTWV0aG9kc1NlbGVjdGVkW2ldID09IG51bGwpIGNvbnRpbnVlOwotICAgICAgICAgIGlmICggZk1ldGhvZHNTZWxlY3RlZFtpXS5nZXRWYWx1ZSgpLmVxdWFscyhtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKSkKLSAgICAgICAgICAgIG1ldGhvZFNlbGVjdGVkID0gKGJvb2xlYW4pIGZNZXRob2RzU2VsZWN0ZWRbaV0uaXNTZWxlY3RlZCgpOwotICAgICAgICB9CQkgICAgICAgIAkKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICBpZihtZXRob2RTZWxlY3RlZCkKLSAgICAgICAgICBzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KG1ldGhvZCk7ICAKLSAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChtZXRob2QpOyAgIAotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNZXRob2RTZWxlY3Rpb24oQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZFNlbGVjdGVkKQotICB7Ci0gICAgZk1ldGhvZHNTZWxlY3RlZCA9IG1ldGhvZFNlbGVjdGVkOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mUGFyYW1ldGVyVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mUGFyYW1ldGVyVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmU5OTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcml2YXRlIEVudmlyb25tZW50IGVudl87Ci0KLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yKEVudmlyb25tZW50IGVudikKLSAgewotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgCQotICAJZW52XyA9IGVudjsKLSAgfQotICAKLSAgLyoKLSAgKiBSdW4gdGhyb3VnaCBhbGwgdGhlIHBhcmFtZXRlcnMgaW4gdGhpcyBtZXRob2QKLSAgKiBAcGFyYW0gSmF2YUNsYXNzIGphdmFjbGFzcyB0aGF0IGhvbGRzIHRoZSBwYXJhbWV0ZXJzCi0gICogQHBhcmFtIFZpc2l0b3JBY3Rpb24gQWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBlYWNoIG1ldGhvZAotICAqKi8KLSAgcHVibGljIFN0YXR1cyBydW4gKCBPYmplY3QgaW1ldGhvZCwgVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAlDaG9pY2UgT0tDaG9pY2UgPSBuZXcgQ2hvaWNlKCdPJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX09LIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9PSyIpKTsKLSAgCUNob2ljZSBDYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX0NBTkNFTCIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiREVTQ1JJUFRJT05fQ0FOQ0VMIikpOyAgCQotICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKWltZXRob2Q7Ci0gICAKLSAgICBKYXZhSGVscGVycyBqYXZhUmV0dXJuUGFyYW1ldGVyID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAvL3BnbSBUaGlzIHZpc2l0b3IgdXNlZCB0byB0YWtlIGEgSmF2YVBhcmFtZXRlciB0eXBlIGFuZCBub3cgaXQgaXMgYmVpbmcgY2FsbGVkCi0gICAgLy8gICAgd2l0aCBhIEphdmFIZWxwZXJzIHR5cGUuICBHaWwsIHBsZWFzZSBlbnN1cmUgdGhhdCB0aGlzIGlzIE9rLgotICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQoamF2YVJldHVyblBhcmFtZXRlcik7Ci0gICAgLy8KLSAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgCi0gICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICB7Ci0gICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgewotICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgIAkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgfQotICAgICAgCQotICAgIH0KLSAgICAvLyAgICAgICAgICAgCi0KLSAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgTGlzdCBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsgCi0gICAgCi0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhcmFtZXRlcnMuc2l6ZSgpOyBpbmRleCsrKSAKLSAgICB7Ci0gICAgICBKYXZhUGFyYW1ldGVyIHBhcmFtPShKYXZhUGFyYW1ldGVyKXBhcmFtZXRlcnMuZ2V0KGluZGV4KTsKLSAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQocGFyYW0pOwotICAgICAgLy8KLSAgICAgIHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7IAotICAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgIAotICAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICAgIHsKLSAgICAgICAgQ2hvaWNlIHJlc3VsdCA9IGVudl8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgICB7Ci0gICAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAgIAkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICB9Ci0gICAgICAgIAkKLSAgICAgIH0KLSAgICAgIC8vICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gIH0KLSAgCi0gICAgICAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZlR5cGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZUeXBlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDNkY2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZlR5cGVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuRmllbGRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbW9uLlNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZUeXBlVmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBFbnZpcm9ubWVudCBlbnZfOwotCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0KLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZUeXBlVmlzaXRvcihFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCWVudl8gPSBlbnY7Ci0gIH0KLQotICAgLyoKLSAgKiBVc2UgdGhpcyB0byByZWZsZWN0IAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KFN0cmluZyBjbGllbnRQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotCi0gICAvKgotICAqIFVzZSB0aGlzIHRvIHJlZmxlY3QgCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgLyoKLSAgKiBHZXQgdGhlIHR5cGUgYmVsb25naW5nIHRvIHRoZSBwYXJhbWV0ZXIKLSAgKiBAcGFyYW0gSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyIHRoYXQgb3ducyB0aGUgdHlwZQotICAqIEBwYXJhbSBWaXNpdG9yQWN0aW9uIEFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZWFjaCBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgcnVuICggT2JqZWN0IHR5cGVOYXZpZ2F0b3IsIFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIGlmICh0eXBlTmF2aWdhdG9yIGluc3RhbmNlb2YgSmF2YVBhcmFtZXRlcil7Ci0KLSAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciA9IChKYXZhUGFyYW1ldGVyKXR5cGVOYXZpZ2F0b3I7Ci0gICAgICBKYXZhSGVscGVycyBqYXZhSGVscGVycyA9IGphdmFQYXJhbWV0ZXIuZ2V0SmF2YVR5cGUoKTsKLSAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQoamF2YUhlbHBlcnMpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlTmF2aWdhdG9yIGluc3RhbmNlb2YgSmF2YUhlbHBlcnMpewotICAgIAlzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KHR5cGVOYXZpZ2F0b3IpOwkKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZU5hdmlnYXRvciBpbnN0YW5jZW9mIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcil7Ci0gICAgICBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSAoU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKXR5cGVOYXZpZ2F0b3I7Ci0gICAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZiA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICAgIGphdmFNb2ZSZWYuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICAgIGphdmFNb2ZSZWYuc2V0UHJveHlCZWFuKCgoSmF2YUhlbHBlcnMpcGQuZ2V0UHJvcGVydHlUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICBzdGF0dXMgPSBqYXZhTW9mUmVmLmV4ZWN1dGUoZW52Xyk7Ci0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgCi0gICAgICBzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KGphdmFNb2ZSZWYuZ2V0SmF2YUNsYXNzKCkpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlTmF2aWdhdG9yIGluc3RhbmNlb2YgRmllbGQpewotICAgICAgRmllbGRJbXBsIGZpZWxkID0gKEZpZWxkSW1wbCl0eXBlTmF2aWdhdG9yOwotICAgICAgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kIGphdmFNb2ZSZWYgPSBuZXcgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kKCk7Ci0gICAgICBqYXZhTW9mUmVmLnNldENsaWVudFByb2plY3QoY2xpZW50UHJvamVjdCk7Ci0gICAgICBqYXZhTW9mUmVmLnNldFByb3h5QmVhbihmaWVsZC5nZXRKYXZhVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgIAotICAgICAgc3RhdHVzID0gamF2YU1vZlJlZi5leGVjdXRlKGVudl8pOwotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgIAotICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChqYXZhTW9mUmVmLmdldEphdmFDbGFzcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgICAgICAgCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Fic3RyYWN0U3RhcnRTZXJ2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQWJzdHJhY3RTdGFydFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM4OGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQWJzdHJhY3RTdGFydFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0YXJ0U2VydmVyIHsKLSAKLXByaXZhdGUgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci1wcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotcHJpdmF0ZSBMb2cgbG9nXzsKLXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotcHVibGljIEFic3RyYWN0U3RhcnRTZXJ2ZXIoKQotewotCWxvZ18gPSBuZXcgRWNsaXBzZUxvZygpOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgdGhpcyApOwotfQotCi0vKioKLSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAqLwotcHVibGljIHZvaWQgU3RhcnRTZXJ2ZXIgKElQcm9qZWN0IHByb2plY3QsIElTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGJvb2xlYW4gcmVzdGFydCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLXsKLQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0KLSAgIHRyeQotICB7Ci0gICAJCi0vLyAgICBJSmF2YVNlcnZlciBqYXZhU2VydmVyID0gKElKYXZhU2VydmVyKSBzZXJ2ZXIuZ2V0RGVsZWdhdGUoKTsKLS8vICAgIGFkZEphcnNUb0NsYXNzUGF0aChqYXZhU2VydmVyKTsKLSAgICB2YWxpZGF0ZVJlbW90ZVNlcnZlclBhdGgoc2VydmVyKTsKLQotICAgIGlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpICAvLyBUaGUgU2VydmVyIGlzIHJ1bm5pbmcKLSAgICB7IAotICAgICAgaWYgKHNlcnZlci5nZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkKLSAgICAgIHsgICAgCi0gICAgICAJCi0gICAgICAgIHNlcnZlci5zeW5jaHJvbm91c1N0b3AoZmFsc2UpOwotICAgICAgICBsb2dfLmxvZyhMb2cuSU5GTywgNTA1MCwgdGhpcywgIlN0YXJ0U2VydmVyIiwgInByb2plY3Q9Iitwcm9qZWN0KyIsIFN0b3AgY29tbWFuZCBjb21wbGV0ZWQsIHJlc3RhcnQgbmVlZGVkIik7Ci0gICAgICAgIHB1Ymxpc2hQcm9qZWN0KHNlcnZlcik7Ci0gICAgCXN0YXJ0UHJvamVjdChzZXJ2ZXIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCQotICAgICAgICBpZiAocmVzdGFydCkgLy8gV0VCLUlORlxsaWIgbmVlZCB0byBiZSByZWxvYWRlZAotICAgICAgICB7Ci0gICAgICAgICAgcHVibGlzaFByb2plY3Qoc2VydmVyKTsgICAgICAKLSAgICAgICAgICByZXN0YXJ0UHJvamVjdChwcm9qZWN0LCBzZXJ2ZXIpOwotICAgICAgICB9ICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgCQotICAgIAkJcHVibGlzaFByb2plY3Qoc2VydmVyKTsKLSAgICAJCXN0YXJ0UHJvamVjdChzZXJ2ZXIpOwotICAgIAl9Ci19Ci0KLSAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgCXRocm93IGNlOwotICAJfQotICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSxlKSk7Ci0gIH0KLX0KLQotcHJvdGVjdGVkIHZvaWQgcHVibGlzaFByb2plY3QoSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi17Ci0gICAgICBtb25pdG9yLnN1YlRhc2soIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiUFJPR1JFU1NfSU5GT19QVUJMSVNISU5HX1NFUlZFUiIgKSApOwotICAgICAgSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG1vbml0b3IpOwotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spCi0gICAgICAJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLSAgICAgIGxvZ18ubG9nKExvZy5JTkZPLCA1MDUxLCB0aGlzLCAicHVibGlzaFByb2plY3QiLCAiSVNlcnZlcj0iK3NlcnZlcisiLCBQdWJsaXNoIGNvbW1hbmQgY29tcGxldGVkIik7Ci0gfQotCi1wcm90ZWN0ZWQgdm9pZCBzdGFydFByb2plY3QoSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi17Ci0gIHRyeQotICB7Ci0gICAgbW9uaXRvci5zdWJUYXNrKCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIlBST0dSRVNTX0lORk9fU1RBUlRJTkdfU0VSVkVSIiApICk7ICAgIAotICAgIHNlcnZlci5zeW5jaHJvbm91c1N0YXJ0KElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBtb25pdG9yKTsKLSAgICBsb2dfLmxvZyhMb2cuSU5GTywgNTA1MiwgdGhpcywgInN0YXJ0UHJvamVjdCIsICJJU2VydmVyPSIrc2VydmVyKyIsIFN0YXJ0IGNvbW1hbmQgY29tcGxldGVkIik7Ci0gICAgCi0gIH0KLSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0VSVkVSIiksZSkpOwotICB9ICAKLX0KLQotcHJvdGVjdGVkIHZvaWQgcmVzdGFydFByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi17Ci0gIHRyeQotICB7Ci0KLSAgICBtb25pdG9yLnN1YlRhc2soIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiUFJPR1JFU1NfSU5GT19TVEFSVElOR19TRVJWRVIiICkgKTsKLSAgICBFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cyhwcm9qZWN0KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVhcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IGVhcnNbaV0uZ2V0UHJvamVjdCgpOwotICAgICAgaWYgKGVhclByb2plY3QgIT0gbnVsbCAmJiBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlcixSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgbW9uaXRvcikpICAgIAotICAgICAgewotICAgICAgICAobmV3IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuYWN0aW9ucy5SZXN0YXJ0UHJvamVjdEFjdGlvbihlYXJQcm9qZWN0KSkucnVuKCk7Ci0gICAgICAgIGxvZ18ubG9nKExvZy5JTkZPLCA1MDUzLCB0aGlzLCAicmVzdGFydFByb2plY3QiLCAiZWFyUHJvamVjdD0iK2VhclByb2plY3QrIiwgUmVzdGFydCBwcm9qZWN0IGNvbW1hbmQgY29tcGxldGVkIik7Ci0gICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSxlKSk7Ci0gIH0gIAotfQotCi1wdWJsaWMgdm9pZCBydW5QcmVTZXJ2ZXJDb25maWcoSVNlcnZlciBzZXJ2ZXIsIElQcm9qZWN0IEVBUlByb2plY3QpewotCi0JcmV0dXJuOwotCQotfQotCi1wdWJsaWMgdm9pZCBydW5Qb3N0U2VydmVyQ29uZmlnKElTZXJ2ZXIgc2VydmVyLCBJUHJvamVjdCBFQVJQcm9qZWN0KXsKLQotCXJldHVybjsKLX0KLQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRKYXJzVG9DbGFzc1BhdGgoSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVSZW1vdGVTZXJ2ZXJQYXRoKElTZXJ2ZXIgc2VydmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIHZvaWQgc3RvcFNlcnZlcihJU2VydmVyIHNlcnZlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0KLQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJc2VydmVyLnN5bmNocm9ub3VzU3RvcChmYWxzZSk7Ci0JCX0KLQl9CQotCQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0J1aWxkUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQnVpbGRQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDk3NjBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQnVpbGRQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIEJ1aWxkUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIHZhbGlkYXRpb25NYW5hZ2VyOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3RfOwotICBwcml2YXRlIGJvb2xlYW4gZm9yY2VCdWlsZF87Ci0gIC8vIHJtIHByaXZhdGUgTW9kZWwgbW9kZWw7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUjsKLSAgICovCi0gIHB1YmxpYyBCdWlsZFByb2plY3RDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJVRBU0tfTEFCRUxfV0VCU0VSVklDRV9CVUlMRF9QUk9KRUNUIiksCi0gICAgICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlVEFTS19ERVNDX1dFQlNFUlZJQ0VfQlVJTERfUFJPSkVDVCIpICk7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChmb3JjZUJ1aWxkXykKLSAgICAgICAgcHJvamVjdF8uYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICBlbHNlIGlmICh2YWxpZGF0aW9uTWFuYWdlciA9PSBudWxsKQotICAgICAgICBwcm9qZWN0Xy5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25NYW5hZ2VyLmdldFdvcmtzcGFjZUF1dG9CdWlsZFByZWZlcmVuY2UoKSkKLSAgICAgICAgcHJvamVjdF8uYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIC8qCi0gICAgdHJ5Ci0gICAgewotICAgICAgUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmpvaW4obnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgfQotICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkKLSAgICB7Ci0gICAgICAvLyBjb250aW51ZSBleGVjdXRpb24KLSAgICB9Ci0gICAgY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkKLSAgICB7Ci0gICAgICAvLyBjb250aW51ZSBleGVjdXRpb24KLSAgICB9Ci0gICAgKi8KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBmb3JjZUJ1aWxkIFRoZSBmb3JjZUJ1aWxkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZvcmNlQnVpbGQoYm9vbGVhbiBmb3JjZUJ1aWxkKSB7Ci0gICAgdGhpcy5mb3JjZUJ1aWxkXyA9IGZvcmNlQnVpbGQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgdGhpcy5wcm9qZWN0XyA9IHByb2plY3Q7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHZhbGlkYXRpb25NYW5hZ2VyIFRoZSB2YWxpZGF0aW9uTWFuYWdlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uTWFuYWdlcihWYWxpZGF0aW9uTWFuYWdlciB2YWxpZGF0aW9uTWFuYWdlcikgewotICAgIHRoaXMudmFsaWRhdGlvbk1hbmFnZXIgPSB2YWxpZGF0aW9uTWFuYWdlcjsKLSAgfQotCi0gIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NoZWNrUHJvamVjdE9LQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DaGVja1Byb2plY3RPS0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkOTZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NoZWNrUHJvamVjdE9LQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi1wdWJsaWMgY2xhc3MgQ2hlY2tQcm9qZWN0T0tDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJZF87Ci0KLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBDaGVja1Byb2plY3RPS0NvbW1hbmQoKSB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0KLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgCi0gICAgU3RyaW5nIHR5cGVpZCA9IHNlcnZpY2VTZXJ2ZXJUeXBlSWRfOwotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0vLyAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlcnMuaXRlcmF0b3IoKTsKLSAgICBib29sZWFuIHZpZXdPcGVuID0gZmFsc2U7Ci0gICAgU3RyaW5nIHNlcnZlck5hbWUgPSBudWxsOwotCi0gICAgZm9yIChpbnQgaT0wO2k8c2VydmVycy5sZW5ndGg7aSsrKSB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBzZXJ2ZXJzW2ldOwotCi0gICAgICAvLyBJZiB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IgaXMgb3BlbiBmb3IgdGhlIHNlcnZlciB0aGF0IHdlIGFyZQotICAgICAgLy8gZGVwbG95aW5nCi0gICAgICAvLyB0byB3ZSB3aWxsIHByb21wdCB0aGUgdXNlciB0byBjbG9zZSBpdC4KLSAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkuZXF1YWxzKHR5cGVpZCkpIHsKLSAgICAgICAgdmlld09wZW4gPSB0cnVlOwotICAgICAgICBzZXJ2ZXJOYW1lID0gc2VydmVyLmdldE5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZpZXdPcGVuKSB7Ci0gICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVJfVklFV19PUEVOIiwgbmV3IFN0cmluZ1tdIHsgc2VydmVyTmFtZX0pOwotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIGVycm9yTWVzc2FnZSwgU3RhdHVzLkVSUk9SLCBudWxsKTsKLSAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2aWNlU2VydmVySWQKLSAgICogICAgICAgICAgICBUaGUgc2VydmljZVNlcnZlciBmYWN0b3J5IElkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJJZCkgewotICAgIHRoaXMuc2VydmljZVNlcnZlclR5cGVJZF8gPSBzZXJ2aWNlU2VydmVySWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlNTIzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZCI7Ci0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIkVuc3VyZSBEZXBsb3lhYmxlIGlzIGFkZGVkIHRvIFNlcnZlciBDb25maWd1cmF0aW9uIGZvciBjbGllbnQgcHJvamVjdHMiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgQm9vbGVhbiBjcmVhdGlvblNjZW5hcmlvXyA9IEJvb2xlYW4uVFJVRTsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHNfOwotICBwcml2YXRlIElQcm9qZWN0IHNhbXBsZVByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEXzsKLSAgcHJpdmF0ZSBJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci0gIHByaXZhdGUgSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcl87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VQcm9qZWN0VVJMXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdFVSTF87Ci0KLSAgLy9hZGRlZFByb2plY3RUb1NlcnZlcl8gaXMgc2V0IHRvIHRydWUgaWYKLSAgLy8tIHRoZSBwcm9qZWN0IGV4aXN0cyBBTkQKLSAgLy8tIHRoZSBzZXJ2ZXIgZXhpc3RzIChpLmUuIHRoaXMgY29tbWFuZCBkaWQgbm90IGNyZWF0ZSBpdCkgQU5ECi0gIC8vLSB0aGlzIGNvbW1hbmQgYWRkZWQgdGhlIHByb2plY3QgdG8gdGhlIHNlcnZlcgotICBwcml2YXRlIGJvb2xlYW4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gZmFsc2U7ICAKLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUgotICAgKi8KLSAgcHVibGljIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kKCkgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgICBzZXROYW1lKExBQkVMKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZChib29sZWFuIGNyZWF0aW9uU2NlbmFyaW8pIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gICAgc2V0TmFtZShMQUJFTCk7Ci0gICAgY3JlYXRpb25TY2VuYXJpb18gPSBuZXcgQm9vbGVhbihjcmVhdGlvblNjZW5hcmlvKTsKLSAgfQotCi0gIC8qKgotICAgKiBleGVjdXRlCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0KLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgdHJ5IHsKLQotICAgICAgLy8gZGV0ZXJtaW5lIGNsaWVudCBvciBzZXJ2aWNlIHByb2plY3QKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSAgc2FtcGxlUHJvamVjdF87Ci0gICAgICBpZiAocHJvamVjdCA9PSBudWxsKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotCi0gICAgICAvLyBnZXQgc2FtcGxlIHNlcnZlciBmYWN0b3J5IElkIGFuZCBpbnN0YW5jZUlkCi0gICAgICBTdHJpbmcgc2VydmVyRmFjdG9yeUlkID0gY2xpZW50SWRzXy5nZXRTZXJ2ZXJJZCgpOwotICAgICAgU3RyaW5nIGV4aXN0aW5nU2VydmVySW5zdElkID0gY2xpZW50SWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0gICAgICBpZiAoZXhpc3RpbmdTZXJ2ZXJJbnN0SWQgPT1udWxsKSB7Ci0gICAgICAJc2VydmVyPSBzYW1wbGVFeGlzdGluZ1NlcnZlcl87Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgIC8vIGdldCBhbiBJU2VydmVyIG9iamVjdDsgZWl0aGVyIGV4aXN0aW5nIG9yIGNyZWF0ZSBvbmUKLSAgICAgICBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoZXhpc3RpbmdTZXJ2ZXJJbnN0SWQpOwotICAgICAgfQotICAgCi0gICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKLSAgICAgIAkvLyBmaW5kIGV4YWN0IHNlcnZlciBmb3IgZ2l2ZW4gcHJvamVjdAotICAgICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZFNlcnZlciA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBpZiAoc2VydmVyc1tpXS5lcXVhbHMoc2VydmVyKSkKLSAgICAgICAgICAgIGZvdW5kU2VydmVyID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kU2VydmVyKSB7Ci0gICAgICAgIAlTdGF0dXMgbW9kU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiAsc2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgdHJ1ZSwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgICAgICAJaWYgKG1vZFN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgIAkJcmV0dXJuIG1vZFN0YXR1czsKLSAgICAgICAgCQotICAgICAgICAgICAgYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChSZXNvdXJjZVV0aWxzLmlzVHJ1ZUphdmFQcm9qZWN0KHByb2plY3QpKQotICAgICAgICB7Ci0gICAgICAgICAgLy9Eb24ndCBhdHRlbXB0IHRvIGFkZCBhIEphdmEgcHJvamVjdCB0byBhIHNlcnZlciwgdGhlcmVmb3JlIHBhc3NpbmcgaW4gbnVsbCBmb3IgdGhlIG1vZHVsZS4KLSAgICAgICAgICBzZXJ2ZXIgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZVNlcnZlcihlbnYsIG51bGwsIHNlcnZlckZhY3RvcnlJZCwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlciA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlU2VydmVyKGVudiwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIHNlcnZlckZhY3RvcnlJZCwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkgewotICAgICAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ1JFQVRFX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJTW9kdWxlW10gcGFyZW50TW9kdWxlcyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSxudWxsKTsKLSAgICAgICAgaWYgKHBhcmVudE1vZHVsZXMhPW51bGwgJiYgcGFyZW50TW9kdWxlcy5sZW5ndGghPTApIHsKLSAgICAgICAgICBpZiAoIVNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoc2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCkpIHsKLSAgICAgICAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIHNlcnZlciwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIHRydWUsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICAgICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAgICAgIHJldHVybiBtbVN0YXR1czsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vCi0gICAgICBTdHJpbmcgcHJvamVjdFVSTCA9IFJlc291cmNlVXRpbHMuZ2V0V2ViUHJvamVjdFVSTChwcm9qZWN0LCBzZXJ2ZXJGYWN0b3J5SWQsIHNlcnZlcik7Ci0gICAgICBpZiAoY3JlYXRpb25TY2VuYXJpb18uYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgc2VydmljZUV4aXN0aW5nU2VydmVyXyA9IHNlcnZlcjsKLSAgICAgICAgc2VydmljZVByb2plY3RVUkxfID0gcHJvamVjdFVSTDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzYW1wbGVFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2ZXI7Ci0gICAgICAgIHNhbXBsZVByb2plY3RVUkxfID0gcHJvamVjdFVSTDsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0JBRF9TRVJWRVJfQ09ORklHIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChJUHJvamVjdCBzYW1wbGVQcm9qZWN0KSB7Ci0gICAgc2FtcGxlUHJvamVjdF8gPSBzYW1wbGVQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVNlcnZlclR5cGVJRChTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRCkgewotICAgIHNlcnZpY2VTZXJ2ZXJUeXBlSURfID0gc2VydmljZVNlcnZlclR5cGVJRDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVNlcnZlclR5cGVJRChTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEKSB7Ci0gICAgc2FtcGxlU2VydmVyVHlwZUlEXyA9IHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcikgewotICAgIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLQotICBwdWJsaWMgSVNlcnZlciBnZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoKSB7Ci0gICAgcmV0dXJuIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RJZCgpIHsKLQlTdHJpbmcgaWQgPSBudWxsOwotCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7Ci0JaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8hPW51bGwpewotCSAgd2MgPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JICBpZCA9ICh3YyE9bnVsbCA/IHdjLmdldElkKCkgOiBudWxsKTsKLQl9Ci0JcmV0dXJuIGlkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcikgewotICAgIHNhbXBsZUV4aXN0aW5nU2VydmVyXyA9IHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICB9Ci0KLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoKSB7Ci0gICAgcmV0dXJuIHNhbXBsZUV4aXN0aW5nU2VydmVyXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQoKSB7Ci0JU3RyaW5nIGlkID0gbnVsbDsKLQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotCWlmIChzYW1wbGVFeGlzdGluZ1NlcnZlcl8hPW51bGwpewotCSAgd2MgPSBzYW1wbGVFeGlzdGluZ1NlcnZlcl8uY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkgIGlkID0gKHdjIT1udWxsID8gd2MuZ2V0SWQoKSA6IG51bGwpOwotCX0KLQlyZXR1cm4gaWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVByb2plY3RVUkwoKSB7Ci0gICAgcmV0dXJuIHNlcnZpY2VQcm9qZWN0VVJMXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlUHJvamVjdFVSTCgpIHsKLSAgICByZXR1cm4gc2FtcGxlUHJvamVjdFVSTF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHRycyl7Ci0gIAl0aGlzLmNsaWVudElkc18gPSB0cnM7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhZGRlZFByb2plY3RUb1NlcnZlcl8uCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGdldEFkZGVkUHJvamVjdFRvU2VydmVyKCkgewotICAgIHJldHVybiBhZGRlZFByb2plY3RUb1NlcnZlcl87Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Db21wdXRlRW5kcG9pbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvbXB1dGVFbmRwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0ZDNiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvbXB1dGVFbmRwb2ludENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21wdXRlRW5kcG9pbnRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIEJvb2xlYW4gbW9uaXRvclNlcnZpY2U7Ci0gIHByaXZhdGUgSW50ZWdlciBtb25pdG9yZWRQb3J0OwotCi0gIHB1YmxpYyBDb21wdXRlRW5kcG9pbnRDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ29tcHV0ZUVuZHBvaW50Q29tbWFuZCIsICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ29tcHV0ZUVuZHBvaW50Q29tbWFuZCIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBtb25pdG9yZWRQb3J0IFRoZSBtb25pdG9yZWRQb3J0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JlZFBvcnQoSW50ZWdlciBtb25pdG9yZWRQb3J0KQotICB7Ci0gICAgdGhpcy5tb25pdG9yZWRQb3J0ID0gbW9uaXRvcmVkUG9ydDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIG1vbml0b3JTZXJ2aWNlIFRoZSBtb25pdG9yU2VydmljZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yU2VydmljZShCb29sZWFuIG1vbml0b3JTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy5tb25pdG9yU2VydmljZSA9IG1vbml0b3JTZXJ2aWNlOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd3NkbFVSSSBUaGUgd3NkbFVSSSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludCgpCi0gIHsKLSAgICBpZiAobW9uaXRvclNlcnZpY2UgIT0gbnVsbCAmJiBtb25pdG9yU2VydmljZS5ib29sZWFuVmFsdWUoKSAmJiBtb25pdG9yZWRQb3J0ICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJJKTsKLSAgICAgIGlmIChkZWYgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGRlZi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlpdC5uZXh0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpdDIgPSBzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQyLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpaXQyLm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQzID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdDMuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0My5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChleHQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9ICgoU09BUEFkZHJlc3MpZXh0KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIG1vbml0b3JlZFBvcnQuaW50VmFsdWUoKSwgdXJsLmdldEZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW50IHByb3RvY29sSW5kZXggPSBsb2NhdGlvbi5pbmRleE9mKCI6Ly8iKTsKLSAgICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbEluZGV4ICE9IC0xKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSBsb2NhdGlvbi5zdWJzdHJpbmcoMCwgcHJvdG9jb2xJbmRleCszKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGhvc3RQb3J0SW5kZXggPSBsb2NhdGlvbi5pbmRleE9mKCcvJywgcHJvdG9jb2xJbmRleCszKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChob3N0UG9ydEluZGV4ID09IC0xKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaG9zdFBvcnRJbmRleCA9IGxvY2F0aW9uLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGxvY2F0aW9uLnN1YnN0cmluZyhob3N0UG9ydEluZGV4LCBsb2NhdGlvbi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0UG9ydCA9IGxvY2F0aW9uLnN1YnN0cmluZyhwcm90b2NvbEluZGV4KzMsIGhvc3RQb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaG9zdEluZGV4ID0gaG9zdFBvcnQuaW5kZXhPZignOicpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3RJbmRleCAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICBob3N0ID0gaG9zdFBvcnQuc3Vic3RyaW5nKDAsIGhvc3RJbmRleCsxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPSBob3N0UG9ydCArICc6JzsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1BvcnQgPSBTdHJpbmcudmFsdWVPZihtb25pdG9yZWRQb3J0LmludFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZW5kcG9pbnQgPSBuZXcgU3RyaW5nQnVmZmVyKHByb3RvY29sKTsKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQuYXBwZW5kKGhvc3QpOwotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludC5hcHBlbmQobmV3UG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50LmFwcGVuZChmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Db3B5V1NETENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ29weVdTRExDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMTMzOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Db3B5V1NETENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvdmVyeS5OZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqLldTRExGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RQYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIENvcHlXU0RMQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb25VUkk7Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWY7Ci0gIHByaXZhdGUgVmVjdG9yIGlnbm9yZUxpc3Q7Ci0KLSAgcHVibGljIENvcHlXU0RMQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcihXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiQ09NTUFORF9MQUJFTF9DT1BZX1dTREwiKSwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIkNPTU1BTkRfREVTQ19DT1BZX1dTREwiKSk7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlnbm9yZUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBpZiAoZGVmID09IG51bGwpCi0gICAgICAgIGRlZiA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkkpOwotICAgICAgY29weVdTREwoZW52LCB3c2RsVVJJLCBnZXRCYXNlVVJJKGRlc3RpbmF0aW9uVVJJKSwgZ2V0TG9jYWxuYW1lKGRlc3RpbmF0aW9uVVJJKSwgZGVmKTsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ09QWV9XU0RMIiwgbmV3IFN0cmluZ1tde3dzZGxVUkksIGRlc3RpbmF0aW9uVVJJfSksIFN0YXR1cy5FUlJPUiwgdCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5V1NETChFbnZpcm9ubWVudCBlbnYsIFN0cmluZyB1cmksIFN0cmluZyBkZXN0VVJJLCBTdHJpbmcgZGVzdExvY2FsbmFtZSkgdGhyb3dzIFdTRExFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgVVJJRXhjZXB0aW9uCi0gIHsKLSAgCURlZmluaXRpb24gZGVmaW5pdGlvbjsKLQkKLQl0cnkgewotCQlkZWZpbml0aW9uID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb25WZXJib3NlKHVyaSk7Ci0JCWNvcHlXU0RMKGVudiwgdXJpLCBkZXN0VVJJLCBkZXN0TG9jYWxuYW1lLCBkZWZpbml0aW9uKTsJCi0JfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0JCWNvcHlYTUxTY2hlbWEoZW52LCB1cmksIGRlc3RVUkkpOwotCX0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5V1NETChFbnZpcm9ubWVudCBlbnYsIFN0cmluZyB1cmksIFN0cmluZyBkZXN0VVJJLCBTdHJpbmcgZGVzdExvY2FsbmFtZSwgRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBVUklFeGNlcHRpb24KLSAgewotICAgIGlmIChpZ25vcmVMaXN0LmNvbnRhaW5zKHVyaSkpCi0gICAgICByZXR1cm47Ci0gICAgaWdub3JlTGlzdC5hZGQodXJpKTsKLSAgICBpbnQgaW5kZXggPSB3c2RsVVJJLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgU3RyaW5nIGJhc2VVUkkgPSBnZXRCYXNlVVJJKHdzZGxVUkkpOwotICAgIGlmIChkZXN0TG9jYWxuYW1lID09IG51bGwgfHwgZGVzdExvY2FsbmFtZS5sZW5ndGgoKSA8PSAwKQotICAgICAgZGVzdExvY2FsbmFtZSA9IGdldExvY2FsbmFtZSh3c2RsVVJJKTsKLSAgICAvLyBjb3B5IFdTREwKLSAgICBTdHJpbmdCdWZmZXIgZGVzdGluYXRpb25GaWxlVVJJID0gbmV3IFN0cmluZ0J1ZmZlcihhZGRUcmFpbGluZ1NlcGFyYXRvcihkZXN0VVJJKSk7Ci0gICAgZGVzdGluYXRpb25GaWxlVVJJLmFwcGVuZChkZXN0TG9jYWxuYW1lKTsKLSAgICBXU0RMRmFjdG9yeSB3c2RsRmFjdG9yeSA9IG5ldyBXU0RMRmFjdG9yeUltcGwoKTsKLSAgICBXU0RMV3JpdGVyIHdzZGxXcml0ZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMV3JpdGVyKCk7Ci0gICAgT3V0cHV0U3RyZWFtIG9zID0gZW52LmdldFVSSUZhY3RvcnkoKS5uZXdVUkkoZGVzdGluYXRpb25GaWxlVVJJLnRvU3RyaW5nKCkpLmdldE91dHB1dFN0cmVhbSgpOwotICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIG9zKTsKLSAgICBvcy5jbG9zZSgpOwotICAgIC8vIGNvcHkgPHdzZGw6aW1wb3J0PnMKLSAgICBNYXAgaW1wb3J0cyA9IGRlZmluaXRpb24uZ2V0SW1wb3J0cygpOwotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBpbXBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gKExpc3QpaXQubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBsaXN0SXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGxpc3RJdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBJbXBvcnQgd3NkbEltcG9ydCA9IChJbXBvcnQpbGlzdEl0Lm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHdzZGxJbXBvcnRVUkkgPSB3c2RsSW1wb3J0LmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgIGlmIChpc1JlbGF0aXZlKHdzZGxJbXBvcnRVUkkpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGltcG9ydEJhc2VVUkkgPSAobmV3IFN0cmluZ0J1ZmZlcihiYXNlVVJJKSkuYXBwZW5kKHdzZGxJbXBvcnRVUkkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgU3RyaW5nIHdzZGxJbXBvcnRCYXNlVVJJID0gZ2V0QmFzZVVSSSh3c2RsSW1wb3J0VVJJKTsKLSAgICAgICAgICBTdHJpbmdCdWZmZXIgaW1wb3J0RGVzdFVSSSA9IG5ldyBTdHJpbmdCdWZmZXIoZGVzdFVSSSk7Ci0gICAgICAgICAgaWYgKHdzZGxJbXBvcnRCYXNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICBpbXBvcnREZXN0VVJJLmFwcGVuZCh3c2RsSW1wb3J0QmFzZVVSSSk7Ci0gICAgICAgICAgY29weVdTREwoZW52LCBpbXBvcnRCYXNlVVJJLCBpbXBvcnREZXN0VVJJLnRvU3RyaW5nKCksIGdldExvY2FsbmFtZSh3c2RsSW1wb3J0VVJJKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgVHlwZXMgdHlwZXMgPSBkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBzY2hlbWFzID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2NoZW1hcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0Lm5leHQoKTsKLSAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZXh0RWxlbWVudDsKLSAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gbnVsbDsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmNyZWF0ZVNjaGVtYShzY2hlbWFFbGVtZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgYW55IGV4dGVuc2liaWxpdHkgZWxlbWVudHMgdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGludG8gYQotICAgICAgICAgICAgLy8gWFNEU2NoZW1hIGluc3RhbmNlCi0gICAgICAgICAgfQotICAgICAgICAgIGNvcHlYTUxTY2hlbWEoZW52LCB4c2RTY2hlbWEsIGJhc2VVUkksIGRlc3RVUkkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgc2NoZW1hRWxlbWVudCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpZXh0RWxlbWVudDsKLSAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gbnVsbDsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmNyZWF0ZVNjaGVtYShzY2hlbWFFbGVtZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgYW55IGV4dGVuc2liaWxpdHkgZWxlbWVudHMgdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGludG8gYQotICAgICAgICAgICAgLy8gWFNEU2NoZW1hIGluc3RhbmNlCi0gICAgICAgICAgfQotICAgICAgICAgIGNvcHlYTUxTY2hlbWEoZW52LCB4c2RTY2hlbWEsIGJhc2VVUkksIGRlc3RVUkkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgaW50IGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoJ1xcJyk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgcmV0dXJuIHVyaS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldExvY2FsbmFtZShTdHJpbmcgdXJpKQotICB7Ci0gICAgaW50IGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoJ1xcJyk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgcmV0dXJuIHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdXJpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgYWRkVHJhaWxpbmdTZXBhcmF0b3IoU3RyaW5nIHMpCi0gIHsKLSAgICBpZiAoIShzLmVuZHNXaXRoKCIvIikgfHwgcy5lbmRzV2l0aCgiXFwiKSkpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzKTsKLSAgICAgIHNiLmFwcGVuZCgnLycpOwotICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBzOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzUmVsYXRpdmUoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiAodXJpLmluZGV4T2YoJzonKSA9PSAtMSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY29weVhNTFNjaGVtYShFbnZpcm9ubWVudCBlbnYsIFN0cmluZyB1cmksIFN0cmluZyBkZXN0VVJJKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGlnbm9yZUxpc3QuY29udGFpbnModXJpKSkKLSAgICAgIHJldHVybjsKLSAgICBpZ25vcmVMaXN0LmFkZCh1cmkpOwotICAgIC8vIGxvYWQgYXMgYSBjYWNoZWQgc2NoZW1hCi0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKHVyaSk7Ci0gICAgLy8gaWYgc2NoZW1hIGlzIG5vdCBjYWNoZWQsIHBhcnNlIGl0Ci0gICAgaWYgKHhzZFNjaGVtYSA9PSBudWxsKQotICAgIHsKLSAgICAgIFhTRFBhcnNlciBwID0gbmV3IFhTRFBhcnNlcigpOwotICAgICAgSW5wdXRTdHJlYW0gaXMgPSBOZXRVdGlscy5nZXRVUkxJbnB1dFN0cmVhbSh1cmkpOwotICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHAucGFyc2UoaXMpOwotICAgICAgICB4c2RTY2hlbWEgPSBwLmdldFNjaGVtYSgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgLy8gY29weSBzY2hlbWEKLSAgICAgIEVsZW1lbnQgZSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICBET01Tb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShlKTsKLSAgICAgIFRyYW5zZm9ybWVyIHNlcmlhbGl6ZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotICAgICAgc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsKLSAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICAgIE91dHB1dFN0cmVhbSBvcyA9IGVudi5nZXRVUklGYWN0b3J5KCkubmV3VVJJKChuZXcgU3RyaW5nQnVmZmVyKGRlc3RVUkkpKS5hcHBlbmQoZ2V0TG9jYWxuYW1lKHVyaSkpLnRvU3RyaW5nKCkpLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgc2VyaWFsaXplci50cmFuc2Zvcm0oZG9tU291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KG9zKSk7Ci0gICAgICBvcy5jbG9zZSgpOwotICAgICAgLy8gY29weSA8eHNkOmltcG9ydD5zIGFuZCA8eHNkOmluY2x1ZGU+cwotICAgICAgY29weVhNTFNjaGVtYShlbnYsIHhzZFNjaGVtYSwgZ2V0QmFzZVVSSSh1cmkpLCBkZXN0VVJJKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY29weVhNTFNjaGVtYShFbnZpcm9ubWVudCBlbnYsIFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBiYXNlVVJJLCBTdHJpbmcgZGVzdFVSSSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBVUklFeGNlcHRpb24KLSAgewotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBjb3B5IDx4c2Q6aW1wb3J0PnMgYW5kIDx4c2Q6aW5jbHVkZT5zCi0gICAgICBFTGlzdCB4c2RTY2hlbWFDb250ZW50cyA9IHhzZFNjaGVtYS5nZXRDb250ZW50cygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHhzZFNjaGVtYUNvbnRlbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBjb250ZW50ID0gaXQubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSB4c2RTY2hlbWFEaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKWNvbnRlbnQ7Ci0gICAgICAgICAgU3RyaW5nIHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uID0geHNkU2NoZW1hRGlyZWN0aXZlLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgICAgICAgaWYgKHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uICE9IG51bGwgJiYgaXNSZWxhdGl2ZSh4c2RTY2hlbWFEaXJlY3RpdmVMb2NhdGlvbikpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGRpcmVjdGl2ZVVSSSA9IChuZXcgU3RyaW5nQnVmZmVyKGJhc2VVUkkpKS5hcHBlbmQoeHNkU2NoZW1hRGlyZWN0aXZlTG9jYXRpb24pLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZGlyZWN0aXZlQmFzZVVSSSA9IGdldEJhc2VVUkkoeHNkU2NoZW1hRGlyZWN0aXZlTG9jYXRpb24pOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGRpcmVjdGl2ZURlc3RVUkkgPSBuZXcgU3RyaW5nQnVmZmVyKGRlc3RVUkkpOwotICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZUJhc2VVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgZGlyZWN0aXZlRGVzdFVSSS5hcHBlbmQoZGlyZWN0aXZlQmFzZVVSSSk7Ci0gICAgICAgICAgICBjb3B5WE1MU2NoZW1hKGVudiwgZGlyZWN0aXZlVVJJLCBkaXJlY3RpdmVEZXN0VVJJLnRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvblVSSShTdHJpbmcgZGVzdGluYXRpb25VUkkpCi0gIHsKLSAgICB0aGlzLmRlc3RpbmF0aW9uVVJJID0gZGVzdGluYXRpb25VUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgdGhpcy5kZWYgPSBkZWY7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlQXBwQ2xpZW50UHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlQXBwQ2xpZW50UHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkYzYwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUFwcENsaWVudFByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5BcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldC5JU2VydmVyVGFyZ2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgYXBwQ2xpZW50UHJvamVjdE5hbWVfOwotICBwcml2YXRlIFN0cmluZyBlYXJQcm9qZWN0TmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckZhY3RvcnlJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uXzsgIAotICAKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUFwcENsaWVudFByb2plY3RDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZCIpOwotICAgIC8vc2V0UnVuSW5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotCU1lc3NhZ2VVdGlscyBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnBsdWdpbiIsIHRoaXMgKTsKLQkKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgIGlmIChlYXJQcm9qZWN0ICE9IG51bGwgJiYgIWVhclByb2plY3QuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIENyZWF0ZUVBUlByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQoKTsKLSAgICAgICAgYy5zZXRFYXJQcm9qZWN0TmFtZShlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfKTsKLSAgICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOwotICAgICAgICBjLmV4ZWN1dGUoZW52KTsKLSAgICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgfQotICAgICAgSVByb2plY3QgYXBwQ2xpZW50UHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChhcHBDbGllbnRQcm9qZWN0TmFtZV8pOwotICAgICAgaWYgKGFwcENsaWVudFByb2plY3QgIT0gbnVsbCAmJiAhYXBwQ2xpZW50UHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgaW5mbyA9IG5ldyBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNPTVBPTkVOVF9OQU1FLCBhcHBDbGllbnRQcm9qZWN0TmFtZV8pOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkVBUl9NT0RVTEVfTkFNRSwgZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfVE9fRUFSLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAKLSAgICAgICAgLy9TZXQgdGhlIEoyRUUgdmVyc2lvbgotICAgICAgICBTdHJpbmcgZmluYWxKMkVFVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIGlmIChqMmVlVmVyc2lvbl8gIT0gbnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihqMmVlVmVyc2lvbl8pKTsKLSAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gajJlZVZlcnNpb25fOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChlYXJQcm9qZWN0ICE9IG51bGwgJiYgZWFyUHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFQVJOYXR1cmVSdW50aW1lIGVhciA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShlYXJQcm9qZWN0KTsKLSAgICAgICAgICAgIGludCBlYXJWZXJzaW9uID0gZWFyLmdldEoyRUVWZXJzaW9uKCk7Ci0gICAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkoyRUVfVkVSU0lPTiwgbmV3IEludGVnZXIoZWFyVmVyc2lvbikpOwotICAgICAgICAgICAgZmluYWxKMkVFVmVyc2lvbiA9IFN0cmluZy52YWx1ZU9mKGVhclZlcnNpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKSk7Ci0gICAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgc2VydmVyIHRhcmdldAotICAgICAgICBpZiAoc2VydmVyRmFjdG9yeUlkXyE9bnVsbCAmJiBzZXJ2ZXJGYWN0b3J5SWRfLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLQkJLy9UT0RPIC0gQWRkIHRoaXMgbG9naWMgdG8gRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwsIGFuZCBvcC4uLi4KLQkJCi0vLyAgICAgICAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8sIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuQVBQX0NMSUVOVF9UWVBFLCBmaW5hbEoyRUVWZXJzaW9uKTsgCi0vLwkJICBpbmZvLnNldFByb3BlcnR5KEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlNFUlZFUl9UQVJHRVRfSUQsIHJ1bnRpbWVUYXJnZXRJZCApOwotLy8gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfU0VSVkVSX1RBUkdFVCwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBBcHBDbGllbnQgcHJvamVjdAotICAgICAgICBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24oaW5mbyk7Ci0gICAgICAgIG9wZXJhdGlvbi5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9BUFBfQ0xJRU5UX1BST0pFQ1QiLCBuZXcgU3RyaW5nW10ge2FwcENsaWVudFByb2plY3ROYW1lX30pLCBTdGF0dXMuRVJST1IsIGl0ZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfQVBQX0NMSUVOVF9QUk9KRUNUIiwgbmV3IFN0cmluZ1tdIHthcHBDbGllbnRQcm9qZWN0TmFtZV99KSwgU3RhdHVzLkVSUk9SLCBpZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFwcENsaWVudFByb2plY3ROYW1lKFN0cmluZyBhcHBDbGllbnRQcm9qZWN0TmFtZSkKLSAgewotICAgIGFwcENsaWVudFByb2plY3ROYW1lXyA9IGFwcENsaWVudFByb2plY3ROYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXJQcm9qZWN0TmFtZShTdHJpbmcgZWFyUHJvamVjdE5hbWUpCi0gIHsKLSAgICBlYXJQcm9qZWN0TmFtZV8gPSBlYXJQcm9qZWN0TmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyRmFjdG9yeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0gIHsKLSAgCXNlcnZlckZhY3RvcnlJZF8gPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAJajJlZVZlcnNpb25fID0gajJlZVZlcnNpb247CQotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhNDViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIElEX1dFQiA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIjsKLSAgcHJpdmF0ZSBTdHJpbmcgSURfRUpCID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5FSkIiOwotICBwcml2YXRlIFN0cmluZyBJRF9BUFBfQ0xJRU5UID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5BcHBDbGllbnQiOwotICBwcml2YXRlIFN0cmluZyBJRF9KQVZBID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5Db250YWluZXJsZXNzIjsKLQotICBwcml2YXRlIGJvb2xlYW4gcHJveHlDb2RlZ2VuRW5hYmxlZCA9IHRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3RUeXBlSWQ7Ci0gIHByaXZhdGUgSVByb2plY3QgcHJveHlQcm9qZWN0OwotICBwcml2YXRlIElQcm9qZWN0IHByb3h5UHJvamVjdEVBUjsKLSAgcHJpdmF0ZSBTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZF87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckZhY3RvcnlJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIG5lZWRFQVJfOwotICBwcml2YXRlIGJvb2xlYW4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBJU2VydmVyIGZFeGlzdGluZ1NlcnZlciA9IG51bGw7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZCIpOwotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7ICAgIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvYWJsZSgpewotICAJcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHVuZG8oRW52aXJvbm1lbnQgZW52KXsKLSAgCVN0YXR1cyBzdGF0ID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgdHJ5CXsKLSAgICAJCi0gICAgICAvLyBjaGVjayBleGlzdGluZ1NlcnZlcgotICAgICAgaWYgKGZFeGlzdGluZ1NlcnZlciE9bnVsbCkgewotCSAgICAJCi0gICAgCUFic3RyYWN0U3RhcnRTZXJ2ZXIgc3RhcnRTZXJ2ZXJDb21tYW5kID0gbnVsbDsKLSAgICAJV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAJc3RhcnRTZXJ2ZXJDb21tYW5kID0gKEFic3RyYWN0U3RhcnRTZXJ2ZXIpcmVnLmdldFNlcnZlclN0YXJ0QnlUeXBlSWQoZkV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAJaWYgKHByb3h5UHJvamVjdEVBUiE9bnVsbCkgewotICAgIAkJc3RhcnRTZXJ2ZXJDb21tYW5kLnJ1blBvc3RTZXJ2ZXJDb25maWcoZkV4aXN0aW5nU2VydmVyLCBwcm94eVByb2plY3RFQVIpOwotICAgIAl9Ci0gICAgICB9Ci0gICAJfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlICkgewotICAgICAgSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgc3RhdCA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXQpOwotICAJCXJldHVybiBzdGF0OwotICAJfSAgCQotICAJCi0gIAlyZXR1cm4gc3RhdDsKLSAgfSAgCi0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAkvL0dldCB0aGUgZXhpc3Rpbmcgc2VydmVyCi0KLSAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotICAgIElTZXJ2ZXIgZXhpc3RpbmdTZXJ2ZXIgPSBudWxsOwotCWZFeGlzdGluZ1NlcnZlciA9IG51bGw7ICAgIAotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXIgdGhpc1NlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotICAgICAgU3RyaW5nIHRoaXNTZXJ2ZXJJZCA9IG51bGw7Ci0gICAgICBpZiAodGhpc1NlcnZlciE9bnVsbCkgewotICAgICAgCXdjID0gdGhpc1NlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotICAgICAgCXRoaXNTZXJ2ZXJJZCA9ICh3YyE9bnVsbCA/IHdjLmdldElkKCkgOiBudWxsKTsKLSAgICAgIH0KLSAgICAgIGlmICh0aGlzU2VydmVySWQuZXF1YWxzKGV4aXN0aW5nU2VydmVySWRfKSl7Ci0gICAgICAgIGV4aXN0aW5nU2VydmVyID0gdGhpc1NlcnZlcjsKLSAgICAgICAgZkV4aXN0aW5nU2VydmVyID0gZXhpc3RpbmdTZXJ2ZXI7Ci0gICAgICB9Ci0gICAgfSAKLSAgICAKLSAgICAvL0NyZWF0ZSB0aGUgcHJvamVjdAotICAgIGlmIChwcm94eUNvZGVnZW5FbmFibGVkKQotICAgIHsKLSAgICAgIGlmIChjbGllbnRQcm9qZWN0VHlwZUlkID09IG51bGwgfHwgY2xpZW50UHJvamVjdFR5cGVJZC5sZW5ndGgoKSA8PSAwKQotICAgICAgICBjbGllbnRQcm9qZWN0VHlwZUlkID0gKFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCkuZ2V0Q2xpZW50VHlwZXMoKSlbMF07Ci0gICAgICBpZiAoSURfV0VCLmVxdWFscyhjbGllbnRQcm9qZWN0VHlwZUlkKSkKLSAgICAgIHsgIAotICAgICAgICBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZCBjID0gbmV3IENyZWF0ZVdlYlByb2plY3RDb21tYW5kKCk7Ci0gICAgICAgIGMuc2V0UHJvamVjdE5hbWUocHJveHlQcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJveHlQcm9qZWN0RUFSICE9IG51bGwpCi0gICAgICAgICAgYy5zZXRFYXJQcm9qZWN0TmFtZShwcm94eVByb2plY3RFQVIuZ2V0TmFtZSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGMuc2V0RWFyUHJvamVjdE5hbWUoIiIpOwotICAgICAgICAKLSAgICAgICAgYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXyk7Ci0gICAgICAgIGMuc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb25fKTsgICAgICAgICAgICAKLSAgICAgICAgYy5zZXRFeGlzdGluZ1NlcnZlcihleGlzdGluZ1NlcnZlcik7Ci0gICAgICAgIGMuc2V0TmVlZEVBUihuZWVkRUFSXyk7Ci0gICAgICAgIGMuc2V0QWRkZWRQcm9qZWN0VG9TZXJ2ZXIoYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfKTsKLSAgICAgICAgCi0gICAgICAgIHN0YXR1cyA9IGMuZXhlY3V0ZShlbnYpOwotICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUil7Ci0gICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RhdHVzIHN0YXJ0U2VydmVyU3RhdHVzID0gc3RhcnRTZXJ2ZXIoZW52LCBwcm94eVByb2plY3QpOwotICAgICAgaWYgKHN0YXJ0U2VydmVyU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgIAlyZXR1cm4gc3RhcnRTZXJ2ZXJTdGF0dXM7Ci0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoSURfRUpCLmVxdWFscyhjbGllbnRQcm9qZWN0VHlwZUlkKSkKLSAgICAgIHsKLSAgICAgICAgQ3JlYXRlRUpCUHJvamVjdENvbW1hbmQgYyA9IG5ldyBDcmVhdGVFSkJQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgICBjLnNldEVqYlByb2plY3ROYW1lKHByb3h5UHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICBjLnNldEVhclByb2plY3ROYW1lKHByb3h5UHJvamVjdEVBUi5nZXROYW1lKCkpOwotICAgICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfKTsKLSAgICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOwotICAgICAgICBzdGF0dXMgPSBjLmV4ZWN1dGUoZW52KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKElEX0FQUF9DTElFTlQuZXF1YWxzKGNsaWVudFByb2plY3RUeXBlSWQpKQotICAgICAgewotICAgICAgICBDcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZCBjID0gbmV3IENyZWF0ZUFwcENsaWVudFByb2plY3RDb21tYW5kKCk7Ci0gICAgICAgIGMuc2V0QXBwQ2xpZW50UHJvamVjdE5hbWUocHJveHlQcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgIGMuc2V0RWFyUHJvamVjdE5hbWUocHJveHlQcm9qZWN0RUFSLmdldE5hbWUoKSk7Ci0gICAgICAgIGMuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXyk7Ci0gICAgICAgIHN0YXR1cyA9IGMuZXhlY3V0ZShlbnYpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoSURfSkFWQS5lcXVhbHMoY2xpZW50UHJvamVjdFR5cGVJZCkpCi0gICAgICB7Ci0gICAgICAgIENyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZCBjID0gbmV3IENyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgICBjLnNldFByb2plY3ROYW1lKHByb3h5UHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICBzdGF0dXMgPSBjLmV4ZWN1dGUoZW52KTsKLSAgICAgIH0KLSAgICAgICAgIAotICAgIH0KLQotICAgIHRyeQl7Ci0gICAgCQotICAgCQlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAJCVdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChleGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgIAlpZiAocHJveHlQcm9qZWN0RUFSIT1udWxsICYmIGV4aXN0aW5nU2VydmVyIT1udWxsKSB7Ci0gICAgIAkJc3RhcnRTZXJ2ZXJDb21tYW5kLnJ1blByZVNlcnZlckNvbmZpZyhleGlzdGluZ1NlcnZlciwgcHJveHlQcm9qZWN0RUFSKTsKLSAgICAgCQlmRXhpc3RpbmdTZXJ2ZXIgPSBleGlzdGluZ1NlcnZlcjsKLSAgICAgCX0KLSAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UgKSB7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAJc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBzdGF0dXM7ICAgCi0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgU3RhdHVzIHN0YXJ0U2VydmVyKEVudmlyb25tZW50IGVudiwgSVByb2plY3Qgd2ViUHJvamVjdCl7Ci0gIAl0cnl7Ci0gIAkgICAgLy8gc3RhcnQgc2VydmVyKEJ1ZyA0Mzc3KQotICAJICAgIGlmIChuZWVkRUFSXyAmJiAgZkV4aXN0aW5nU2VydmVyICE9IG51bGwpewotICAJICAgIAlTdGFydFByb2plY3RDb21tYW5kIHNwYyA9IG5ldyBTdGFydFByb2plY3RDb21tYW5kKCk7Ci0gIAkgICAgCXNwYy5zZXRTYW1wbGVQcm9qZWN0KHdlYlByb2plY3QpOwotICAJICAgIAlzcGMuc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoZkV4aXN0aW5nU2VydmVyKTsKLSAgCSAgICAJc3BjLnNldENyZWF0aW9uU2NlbmFyaW8obmV3IEJvb2xlYW4oImZhbHNlIikpOwotICAJICAgIAlyZXR1cm4gc3BjLmV4ZWN1dGUoZW52KTsJICAgIAkKLSAgCSAgICAJCi0gIAkgICAgfSAgCQkKLSAgCX0KLSAgCWNhdGNoKEV4Y2VwdGlvbiBjZSl7Ci0gICAgICAgIGVudi5nZXRMb2coKS5sb2coTG9nLkVSUk9SLCA1MDQ2LCB0aGlzLCAiZXhlY3V0ZSIsIGNlKTsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dFQl9QUk9KRUNUX0NSRUFURSIpLCBTdGF0dXMuRVJST1IsIGNlKTsKLSAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwkJCi0gIAl9Ci0gIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0gICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5Q29kZWdlbkVuYWJsZWQoYm9vbGVhbiBwcm94eUNvZGVnZW5FbmFibGVkKQotICB7Ci0gICAgdGhpcy5wcm94eUNvZGVnZW5FbmFibGVkID0gcHJveHlDb2RlZ2VuRW5hYmxlZDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcHJveHlQcm9qZWN0RUFSIFRoZSBwcm94eVByb2plY3RFQVIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJveHlQcm9qZWN0RUFSKElQcm9qZWN0IHByb3h5UHJvamVjdEVBUikKLSAgewotICAgIHRoaXMucHJveHlQcm9qZWN0RUFSID0gcHJveHlQcm9qZWN0RUFSOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwcm94eVByb2plY3QgVGhlIHByb3h5UHJvamVjdCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eVByb2plY3QoSVByb2plY3QgcHJveHlQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5wcm94eVByb2plY3QgPSBwcm94eVByb2plY3Q7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGNsaWVudFByb2plY3RUeXBlSWQgVGhlIGNsaWVudFByb2plY3RUeXBlSWQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdFR5cGVJZChTdHJpbmcgY2xpZW50UHJvamVjdFR5cGVJZCkKLSAgewotICAgIHRoaXMuY2xpZW50UHJvamVjdFR5cGVJZCA9IGNsaWVudFByb2plY3RUeXBlSWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gIAlzZXJ2ZXJGYWN0b3J5SWRfID0gc2VydmVyRmFjdG9yeUlkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgCWoyZWVWZXJzaW9uXyA9IGoyZWVWZXJzaW9uOwkKLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXROZWVkRUFSKGJvb2xlYW4gbmVlZEVBUikKLSAgewotICAgIG5lZWRFQVJfID0gbmVlZEVBUjsKLSAgfSAgICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVySWQoU3RyaW5nIGV4aXN0aW5nU2VydmVySWQpCi0gIHsKLSAgICBleGlzdGluZ1NlcnZlcklkXyA9IGV4aXN0aW5nU2VydmVySWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFkZGVkUHJvamVjdFRvU2VydmVyKGJvb2xlYW4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXIpIAotICB7Ci0gICAgYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gYWRkZWRQcm9qZWN0VG9TZXJ2ZXI7Ci0gIH0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiY2VhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUVBUlByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVBUkNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldC5JU2VydmVyVGFyZ2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZUVBUlByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBlYXJQcm9qZWN0TmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckZhY3RvcnlJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uXzsgIAotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIENyZWF0ZUVBUlByb2plY3RDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQiLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUVBUlByb2plY3RDb21tYW5kIik7Ci0gICAgLy9zZXRSdW5JbldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0JTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgdGhpcyApOwotCQotICAgIHRyeQotICAgIHsKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIGluZm8gPSBuZXcgRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBKMkVFIHZlcnNpb24KLSAgICAgICAgU3RyaW5nIGZpbmFsSjJFRVZlcnNpb24gPSBudWxsOwotICAgICAgICBpZiAoajJlZVZlcnNpb25fICE9IG51bGwgJiYgajJlZVZlcnNpb25fLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNPTVBPTkVOVF9WRVJTSU9OLCBuZXcgSW50ZWdlcihqMmVlVmVyc2lvbl8pKTsKLSAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gajJlZVZlcnNpb25fOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQ09NUE9ORU5UX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKSk7Ci0gICAgICAgICAgZmluYWxKMkVFVmVyc2lvbiA9IFN0cmluZy52YWx1ZU9mKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9TZXQgdGhlIHNlcnZlciB0YXJnZXQKLSAgICAgICAgaWYgKHNlcnZlckZhY3RvcnlJZF8hPW51bGwgJiYgc2VydmVyRmFjdG9yeUlkXy5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0vLwkJCVRPRE8gLSBBZGQgdGhpcyBsb2dpYyB0byBGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbCwgYW5kIG9wLi4uLgotLy8gICAgICAgICAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldElkRnJvbUZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfLCBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkVBUl9UWVBFLCBmaW5hbEoyRUVWZXJzaW9uKTsgCi0vLyAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlNFUlZFUl9UQVJHRVRfSUQsIHJ1bnRpbWVUYXJnZXRJZCApOwotLy8gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfU0VSVkVSX1RBUkdFVCwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBFQVIKLSAgICAgICAgRUFSQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEVBUkNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uKGluZm8pOwotICAgICAgICBvcGVyYXRpb24ucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUFSX1BST0pFQ1QiLCBuZXcgU3RyaW5nW10ge2VhclByb2plY3ROYW1lX30pLCBTdGF0dXMuRVJST1IsIGl0ZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUFSX1BST0pFQ1QiLCBuZXcgU3RyaW5nW10ge2VhclByb2plY3ROYW1lX30pLCBTdGF0dXMuRVJST1IsIGllKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGVhclByb2plY3ROYW1lXyBUaGUgZWFyUHJvamVjdE5hbWVfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3ROYW1lKFN0cmluZyBlYXJQcm9qZWN0TmFtZSkKLSAgewotICAgIHRoaXMuZWFyUHJvamVjdE5hbWVfID0gZWFyUHJvamVjdE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJc2VydmVyRmFjdG9yeUlkXyA9IHNlcnZlckZhY3RvcnlJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gIAlqMmVlVmVyc2lvbl8gPSBqMmVlVmVyc2lvbjsJCi0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFSkJQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFSkJQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjkzNWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlRUpCUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLmFyY2hpdmVvcGVyYXRpb25zLkVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5hcmNoaXZlb3BlcmF0aW9ucy5FamJDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQuSVNlcnZlclRhcmdldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZUVKQlByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSAiJVRBU0tfTEFCRUxfQ1JFQVRFX0VKQl9QUk9KRUNUIjsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gIiVUQVNLX0RFU0NfQ1JFQVRFX0VKQl9QUk9KRUNUIjsKLSAgcHJpdmF0ZSBib29sZWFuIGlzRUpCUHJvamVjdFJlcXVpcmVkXyA9IHRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIGVqYlByb2plY3ROYW1lXyA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lXyA9IG51bGw7Ci0gIAotICBwcml2YXRlIElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0OwotICBwcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWRfOwotICBwcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbl87ICAKLSAgCi0gCi0gIHB1YmxpYyBDcmVhdGVFSkJQcm9qZWN0Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcihMQUJFTCwgREVTQ1JJUFRJT04pOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVFSkJQcm9qZWN0VGFzay4KLSAgICogQHBhcmFtIGFyZzAKLSAgICogQHBhcmFtIGFyZzEKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVFSkJQcm9qZWN0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjKQotICB7Ci0gICAgc3VwZXIobGFiZWwsIGRlc2MpOwotICAgIC8vc2V0UnVuSW5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgdHJ5Ci0gICB7Ci0gICAgaWYgKGVqYlByb2plY3ROYW1lXyAhPSBudWxsICYmIGVqYlByb2plY3ROYW1lXy5sZW5ndGgoKSA+IDAgJiYgZWFyUHJvamVjdE5hbWVfICE9IG51bGwgJiYgZWFyUHJvamVjdE5hbWVfLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gY3JlYXRlRUpCUHJvamVjdChlamJQcm9qZWN0TmFtZV8sIGVhclByb2plY3ROYW1lXywgZW52KTsKLSAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIAotICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgCi0gICAgfQotCi0gICAgLy8gR2V0IHdlYiBwcm9qZWN0IGFuZCBmb3JtIGVqYlByb2plY3ROYW1lCi0gICAgaWYgKCFpc0VKQlByb2plY3RSZXF1aXJlZF8pCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgCi0gICAgaWYgKGVqYlByb2plY3ROYW1lXyA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIAotICAgIC8vIEVKQiBQcm9qZWN0IGFscmVhZHkgZXhpc3RzCi0gICAgSUNvbnRhaW5lciBjb250YWluZXIgPSBKMkVFUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGVqYlByb2plY3ROYW1lXyk7Ci0gICAgaWYgKGNvbnRhaW5lci5leGlzdHMoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIEVKQlByb2plY3RJbmZvCi0gICAgRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgcHJvamVjdEluZm8gPSBuZXcgRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKTsKLSAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eSggRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9OQU1FLCBlamJQcm9qZWN0TmFtZV8gKTsKLSAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5DUkVBVEVfREVGQVVMVF9TRVNTSU9OX0JFQU4sQm9vbGVhbi5UUlVFKTsKLQotICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgaWYgKGVhclByb2plY3ROYW1lXyAhPSBudWxsKQotICAgICAgc3RhdHVzID0gYWRkRUFSVG9Qcm9qZWN0KGVhclByb2plY3ROYW1lXywgcHJvamVjdEluZm8pOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBhZGRFQVJUb1Byb2plY3Qoc2VydmljZVByb2plY3QsIHByb2plY3RJbmZvLCBlbnYpOwotICAgIH0KLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gICB9Ci0gICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgIH0KLSAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RhdHVzIGFkZEVBUlRvUHJvamVjdChTdHJpbmcgZWFyUHJvamVjdE5hbWUsIEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIHByb2plY3RJbmZvKQotICB7Ci0gICAgSVByb2plY3QgZWFyUHJvamVjdCA9IG51bGw7Ci0gICAgLy8gSVByb2plY3QgZWFyUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZSk7Ci0gICAgLy8gaWYgKCFlYXJQcm9qZWN0LmV4aXN0cygpKQotICAgIHsgICAgCQotICAgICAgRUFSTmF0dXJlUnVudGltZSBlYXIgPSBudWxsOwotICAgICAgaWYgKGoyZWVWZXJzaW9uXyE9bnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgIAllYXIgPSBKMkVFVXRpbHMuZ2V0RUFSKEludGVnZXIucGFyc2VJbnQoajJlZVZlcnNpb25fKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVhciA9IEoyRUVVdGlscy5nZXQxM0VBUigpOyAgICAgIAotICAgICAgICBpZiAoZWFyICE9IG51bGwpCi0gICAgICAgICAgZWFyUHJvamVjdCA9IGVhci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVhciA9IEoyRUVVdGlscy5nZXQxMkVBUigpOwotICAgICAgICAgIGlmIChlYXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGVhclByb2plY3QgPSBlYXIuZ2V0UHJvamVjdCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuRUFSX01PRFVMRV9OQU1FLCBlYXJQcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1RPX0VBUiwgQm9vbGVhbi5UUlVFKTsKLSAgICAKLSAgICAvL1NldCB0aGUgSjJFRSB2ZXJzaW9uCi0gICAgU3RyaW5nIGZpbmFsSjJFRVZlcnNpb24gPSBudWxsOyAgICAKLSAgICBpZiAoajJlZVZlcnNpb25fICE9IG51bGwgJiYgajJlZVZlcnNpb25fLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihqMmVlVmVyc2lvbl8pKTsKLSAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBqMmVlVmVyc2lvbl87Ci0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGVhclByb2plY3QgIT0gbnVsbCAmJiBlYXJQcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBFQVJOYXR1cmVSdW50aW1lIGVhciA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShlYXJQcm9qZWN0KTsKLSAgICAgICAgaW50IGVhclZlcnNpb24gPSBlYXIuZ2V0SjJFRVZlcnNpb24oKTsKLSAgICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihlYXJWZXJzaW9uKSk7Ci0gICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihlYXJWZXJzaW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpOwotICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotICAgICAgfSAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBpZiAoc2VydmVyRmFjdG9yeUlkXyE9bnVsbCAmJiBzZXJ2ZXJGYWN0b3J5SWRfLmxlbmd0aCgpPjApCi0gICAgewotCQkvLwkJVE9ETyAtIEFkZCB0aGlzIGxvZ2ljIHRvIEZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLCBhbmQgb3AuLi4uCi0vLyAgICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXywgSVNlcnZlclRhcmdldENvbnN0YW50cy5FSkJfVFlQRSwgajJlZVZlcnNpb25fKTsgCi0vLyAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlNFUlZFUl9UQVJHRVRfSUQsIHJ1bnRpbWVUYXJnZXRJZCApOwotLy8gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfU0VSVkVSX1RBUkdFVCwgQm9vbGVhbi5UUlVFKTsKLSAgICB9Ci0KLSAgICBFamJDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbiBlamJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24gPSBuZXcgRWpiQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24ocHJvamVjdEluZm8pOyAgICAJCi0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBlamJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24ucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCSAgCi0gICAgfQotICAgIGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0VKQl9QUk9KRUNUIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUpCX1BST0pFQ1QiKSwgU3RhdHVzLkVSUk9SLCBleCk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RhdHVzIGFkZEVBUlRvUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCwgRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgcHJvamVjdEluZm8sIEVudmlyb25tZW50IGVudikKLSAgewotICAgICAgICBFQVJOYXR1cmVSdW50aW1lIGVhciA9IG51bGw7Ci0gICAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotICAgICAgICBib29sZWFuIGFkZFNlcnZpY2VFQVJUb1NlcnZlciA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGFkZERpc2NvdmVyZWRFQVJUb1NlcnZlciA9IGZhbHNlOwotICAgICAgICBJU2VydmVyIGRpc2NvdmVyZWRFQVJzU2VydmVyID0gbnVsbDsKLSAgICAgICAgRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBKMkVFVXRpbHMuZ2V0RUFSUHJvamVjdHMoc2VydmljZVByb2plY3QpOwotICAgICAgICB0cnkgeyAgICAJCi0gICAgICAKLQkgICAgaWYgKGVhcnMhPW51bGwgJiYgZWFycy5sZW5ndGggPj0gMSkgewotCSAgICAgIGVhciA9IGVhcnNbMF07ICAgICAgCi0gICAgICAgICAgICAgZWFyUHJvamVjdCA9IGVhci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlciAhPSBudWxsKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0gICAgICAgICAgICAgICAgIHNlcnZpY2VFeGlzdGluZ1NlcnZlci5zeW5jaHJvbm91c1N0b3AoZmFsc2UpOyAgICAgCi0gICAgICAgICAgICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAgICAgICAgCXJldHVybiBtbVN0YXR1czsKLSAgICAgICAgICAgICAgIGFkZFNlcnZpY2VFQVJUb1NlcnZlciA9IHRydWU7Ci0gICAgICAgICAgICAgfQotCi0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgLy9DaGVjayB0byBzZWUgaWYgYW55IGVsaWdpYmxlIEVBUnMgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgICAgICBlYXIgPSBKMkVFVXRpbHMuZ2V0MTJFQVIoKTsKLQkgICAgICBpZiAoZWFyIT1udWxsKQotCSAgICAgIHsKLQkgICAgICAJZWFyUHJvamVjdCA9IGVhci5nZXRQcm9qZWN0KCk7Ci0KLQkgICAgICAJLy8gQWRkIGRlZmF1bHQgc2VydmVyCi0gICAgICAgICAgICAgIElTZXJ2ZXIgZGVmYXVsdFNlcnZlciA9IFNlcnZlclV0aWxzLmdldERlZmF1bHRFeGlzdGluZ1NlcnZlcihlYXJQcm9qZWN0KTsgICAgCi0gICAgICAgICAgICAgIGlmIChkZWZhdWx0U2VydmVyIT1udWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIAlpZiAoZGVmYXVsdFNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgICAgIAkgZGVmYXVsdFNlcnZlci5zeW5jaHJvbm91c1N0b3AoZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCSB9Ci0gICAgICAgICAgICAgIAlTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBkZWZhdWx0U2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAgICAgICAgICAgCXJldHVybiBtbVN0YXR1czsgICAgICAgICAgICAgIAkKLQkJCWFkZERpc2NvdmVyZWRFQVJUb1NlcnZlciA9IHRydWU7Ci0JCQlkaXNjb3ZlcmVkRUFSc1NlcnZlciA9IGRlZmF1bHRTZXJ2ZXI7CQkJCi0gICAgICAgICAgICAgICB9Ci0JICAgICAgIH0KLQkgICAgfQotCSAgICAKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUpCX1BST0pFQ1QiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgICAgfQotCSAgICAgIAotICAgICAgSVByb2plY3QgZWpiUHJvamVjdCA9IG51bGw7Ci0gICAgICAvL0FkZCB0aGUgcHJvamVjdCBiYWNrIHRvIHRoZSBTZXJ2ZXIgY29uZmlnCi0gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5FQVJfTU9EVUxFX05BTUUsIGVhclByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9UT19FQVIsIEJvb2xlYW4uVFJVRSk7CQotICAgICAgRWpiQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24gZWpiUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uID0gbmV3IEVqYkNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uKHByb2plY3RJbmZvKTsgICAgCQotCi0gICAgICB0cnkgewotICAgICAgICBlamJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24ucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0VKQl9QUk9KRUNUIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FSkJfUFJPSkVDVCIpLCBTdGF0dXMuRVJST1IsIGV4KTsgICAgCi0gICAgICB9IAotCi0gICAgICAvL2VqYlByb2plY3QgPSBwcm9qZWN0SW5mby5wcmltR2V0UHJvamVjdCgpOwotCi0gICAgICAvL0FkZCB0aGUgcHJvamVjdCBiYWNrIHRvIHRoZSBTZXJ2ZXIgY29uZmlnCi0gICAgICBpZiAoYWRkU2VydmljZUVBUlRvU2VydmVyKQotICAgICAgewotICAgICAgCVN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIHNlcnZpY2VFeGlzdGluZ1NlcnZlciwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoZWFyUHJvamVjdCksIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAgICAJcmV0dXJuIG1tU3RhdHVzOyAgCi0gICAgICB9Ci0gICAgICBpZiAoYWRkRGlzY292ZXJlZEVBUlRvU2VydmVyKQotICAgICAgewotICAgICAgCVN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIGRpc2NvdmVyZWRFQVJzU2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RhdHVzIGNyZWF0ZUVKQlByb2plY3QoU3RyaW5nIGVqYlByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdE5hbWUsIEVudmlyb25tZW50IGVudikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZSk7Ci0gICAgICBpZiAoZWFyUHJvamVjdCAhPSBudWxsICYmICFlYXJQcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBDcmVhdGVFQVJQcm9qZWN0Q29tbWFuZCBjID0gbmV3IENyZWF0ZUVBUlByb2plY3RDb21tYW5kKCk7Ci0gICAgICAgIGMuc2V0RWFyUHJvamVjdE5hbWUoZWFyUHJvamVjdE5hbWUpOwotICAgICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfKTsKLSAgICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOwotICAgICAgICBjLmV4ZWN1dGUoZW52KTsKLSAgICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZSk7Ci0gICAgICB9Ci0gICAgICBJUHJvamVjdCBlamJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVqYlByb2plY3ROYW1lKTsKLSAgICAgIGlmIChlamJQcm9qZWN0ICE9IG51bGwgJiYgIWVqYlByb2plY3QuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIGluZm8gPSBuZXcgRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5QUk9KRUNUX05BTUUsIGVqYlByb2plY3ROYW1lKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5FQVJfTU9EVUxFX05BTUUsIGVhclByb2plY3ROYW1lKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfVE9fRUFSLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5DUkVBVEVfREVGQVVMVF9TRVNTSU9OX0JFQU4sQm9vbGVhbi5UUlVFKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy9TZXQgdGhlIEoyRUUgdmVyc2lvbgotICAgICAgICBTdHJpbmcgZmluYWxKMkVFVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIGlmIChqMmVlVmVyc2lvbl8gIT0gbnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihqMmVlVmVyc2lvbl8pKTsKLSAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gajJlZVZlcnNpb25fOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVhclByb2plY3QgIT0gbnVsbCAmJiBlYXJQcm9qZWN0LmV4aXN0cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVBUk5hdHVyZVJ1bnRpbWUgZWFyID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKGVhclByb2plY3QpOwotICAgICAgICAgICAgaW50IGVhclZlcnNpb24gPSBlYXIuZ2V0SjJFRVZlcnNpb24oKTsKLSAgICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihlYXJWZXJzaW9uKSk7Ci0gICAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoZWFyVmVyc2lvbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkoyRUVfVkVSU0lPTiwgbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLSAgICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgc2VydmVyIHRhcmdldAotICAgICAgICBpZiAoc2VydmVyRmFjdG9yeUlkXyE9bnVsbCAmJiBzZXJ2ZXJGYWN0b3J5SWRfLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLS8vCQkJVE9ETyAtIEFkZCB0aGlzIGxvZ2ljIHRvIEZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLCBhbmQgb3AuLi4uCi0vLyAgICAgICAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8sSVNlcnZlclRhcmdldENvbnN0YW50cy5FSkJfVFlQRSwgZmluYWxKMkVFVmVyc2lvbik7IAotLy8gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5TRVJWRVJfVEFSR0VUX0lELCBydW50aW1lVGFyZ2V0SWQgKTsKLS8vICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1NFUlZFUl9UQVJHRVQsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0NyZWF0ZSB0aGUgRUpCIFByb2plY3QKLSAgICAgICAgRWpiQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEVqYkNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uKGluZm8pOwotICAgICAgICBvcGVyYXRpb24ucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBhZGQgRUFSIHRvIFNlcnZlcgotICAgICAgaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlciE9bnVsbCl7Ci0gICAgICAgIGJvb2xlYW4gZWFyQWRkZWRUb1NlcnZlciA9IFNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoc2VydmljZUV4aXN0aW5nU2VydmVyLFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghZWFyQWRkZWRUb1NlcnZlcikgewotICAgICAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIHNlcnZpY2VFeGlzdGluZ1NlcnZlciwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoZWFyUHJvamVjdCkgLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgIAotICAgICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAgCXJldHVybiBtbVN0YXR1czsgICAgICAKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0VKQl9QUk9KRUNUIiksIFN0YXR1cy5FUlJPUiwgaXRlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FSkJfUFJPSkVDVCIpLCBTdGF0dXMuRVJST1IsIGllKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGVhclByb2plY3ROYW1lIFRoZSBlYXJQcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFYXJQcm9qZWN0TmFtZShTdHJpbmcgZWFyUHJvamVjdE5hbWUpCi0gIHsKLSAgICB0aGlzLmVhclByb2plY3ROYW1lXyA9IGVhclByb2plY3ROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBlamJQcm9qZWN0TmFtZSBUaGUgZWpiUHJvamVjdE5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWpiUHJvamVjdE5hbWUoU3RyaW5nIGVqYlByb2plY3ROYW1lKQotICB7Ci0gICAgdGhpcy5lamJQcm9qZWN0TmFtZV8gPSBlamJQcm9qZWN0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gaXNFSkJQcm9qZWN0UmVxdWlyZWQgVGhlIGlzRUpCUHJvamVjdFJlcXVpcmVkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVKQlByb2plY3RSZXF1aXJlZChib29sZWFuIGlzRUpCUHJvamVjdFJlcXVpcmVkKQotICB7Ci0gICAgdGhpcy5pc0VKQlByb2plY3RSZXF1aXJlZF8gPSBpc0VKQlByb2plY3RSZXF1aXJlZDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gZWpiUHJvamVjdE5hbWUgVGhlIGVqYlByb2plY3ROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVKQlByb2plY3ROYW1lKFN0cmluZyBlamJQcm9qZWN0TmFtZSkgewotICAgIHRoaXMuZWpiUHJvamVjdE5hbWVfID0gZWpiUHJvamVjdE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNlcnZpY2VFeGlzdGluZ1NlcnZlciBUaGUgc2VydmljZUV4aXN0aW5nU2VydmVyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcikgewotICAgIHRoaXMuc2VydmljZUV4aXN0aW5nU2VydmVyID0gc2VydmljZUV4aXN0aW5nU2VydmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2aWNlUHJvamVjdCBUaGUgc2VydmljZVByb2plY3QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpIHsKLSAgICB0aGlzLnNlcnZpY2VQcm9qZWN0ID0gc2VydmljZVByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gIAlzZXJ2ZXJGYWN0b3J5SWRfID0gc2VydmVyRmFjdG9yeUlkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgCWoyZWVWZXJzaW9uXyA9IGoyZWVWZXJzaW9uOwkKLSAgfSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlSmF2YVByb2plY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzFhMDA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlSmF2YVByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlSmF2YVByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZV87Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUgotICAgKi8KLSAgcHVibGljIENyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZCIsICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlSmF2YVByb2plY3RDb21tYW5kIik7Ci0gICAgLy9zZXRSdW5JbldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZV8pOwotICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuZXhpc3RzKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIE51bGxQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgIHByb2plY3QuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdC5nZXROYW1lKCkpLCBtb25pdG9yKTsKLSAgICAgICAgcHJvamVjdC5vcGVuKG1vbml0b3IpOwotICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGRlc2Muc2V0TmF0dXJlSWRzKG5ldyBTdHJpbmdbXSB7SmF2YUNvcmUuTkFUVVJFX0lEfSk7Ci0gICAgICAgIElDb21tYW5kIGNtZCA9IGRlc2MubmV3Q29tbWFuZCgpOwotICAgICAgICBjbWQuc2V0QnVpbGRlck5hbWUoSmF2YUNvcmUuQlVJTERFUl9JRCk7Ci0gICAgICAgIGRlc2Muc2V0QnVpbGRTcGVjKG5ldyBJQ29tbWFuZFtdIHtjbWR9KTsKLSAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBtb25pdG9yKTsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICBQYXRoIHByb2plY3RSb290ID0gbmV3IFBhdGgoUGF0aC5ST09ULmFwcGVuZChuZXcgUGF0aChwcm9qZWN0LmdldE5hbWUoKSkpLnRvU3RyaW5nKCkpOwotICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3IElDbGFzc3BhdGhFbnRyeVtdIHtKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwcm9qZWN0Um9vdCksIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpKX0sIG1vbml0b3IpOwotICAgICAgICBqYXZhUHJvamVjdC5zZXRPdXRwdXRMb2NhdGlvbihwcm9qZWN0Um9vdCwgbW9uaXRvcik7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0pBVkFfUFJPSkVDVCIsIG5ldyBTdHJpbmdbXSB7cHJvamVjdE5hbWVffSksIFN0YXR1cy5FUlJPUiwgY2UpOwotICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lKQotICB7Ci0gICAgcHJvamVjdE5hbWVfID0gcHJvamVjdE5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlTW9uaXRvckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlTW9uaXRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1MWM3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZU1vbml0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1vbml0b3JlZFNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU2VydmVyTW9uaXRvck1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVNb25pdG9yQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfU0VSVklDRVMgPSAiV2ViIHNlcnZpY2VzIjsKLQotICBwcml2YXRlIEJvb2xlYW4gbW9uaXRvclNlcnZpY2U7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlckluc3RhbmNlSWQ7Ci0KLSAgcHJpdmF0ZSBJbnRlZ2VyIG1vbml0b3JlZFBvcnQ7Ci0KLSAgcHVibGljIENyZWF0ZU1vbml0b3JDb21tYW5kKCkgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlTW9uaXRvckNvbW1hbmQiLAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZU1vbml0b3JDb21tYW5kIik7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgaWYgKG1vbml0b3JTZXJ2aWNlICE9IG51bGwgJiYgbW9uaXRvclNlcnZpY2UuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgIElTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKTsKLSAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCi0gICAgICAgIC8vIElNb25pdG9yYWJsZVNlcnZlciBtb25pdG9yYWJsZVNlcnZlciA9IChJTW9uaXRvcmFibGVTZXJ2ZXIpCi0gICAgICAgIC8vIHNlcnZlckRlbGVnYXRlOwotICAgICAgICBTZXJ2ZXJQb3J0W10gcG9ydHMgPSBzZXJ2ZXIuZ2V0U2VydmVyUG9ydHMoKTsKLSAgICAgICAgU2VydmVyUG9ydCBwb3J0ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaXQgPSAwOyBpdCA8IHBvcnRzLmxlbmd0aDsgaXQrKykgewotICAgICAgICAgIFNlcnZlclBvcnQgcCA9IHBvcnRzW2l0XTsKLSAgICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSBwLmdldFByb3RvY29sKCk7Ci0gICAgICAgICAgaWYgKHByb3RvY29sICE9IG51bGwgJiYgcHJvdG9jb2wudHJpbSgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJodHRwIikpIHsKLSAgICAgICAgICAgIHBvcnQgPSBwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICBJU2VydmVyTW9uaXRvck1hbmFnZXIgc2VydmVyTW9uaXRvck1hbmFnZXIgPSBTZXJ2ZXJNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgIElNb25pdG9yZWRTZXJ2ZXJQb3J0W10gbW9uaXRvcmVkUG9ydHMgPSBzZXJ2ZXJNb25pdG9yTWFuYWdlci5nZXRNb25pdG9yZWRQb3J0cyhzZXJ2ZXIpOwotICAgICAgICAgIGZvciAoaW50IGl0MiA9IDA7IGl0MiA8IG1vbml0b3JlZFBvcnRzLmxlbmd0aDsgaXQyKyspIHsKLSAgICAgICAgICAgIElNb25pdG9yZWRTZXJ2ZXJQb3J0IGltc1BvcnQgPSBtb25pdG9yZWRQb3J0c1tpdDJdOwotICAgICAgICAgICAgaWYgKHBvcnQuZ2V0UG9ydCgpID09IGltc1BvcnQuZ2V0U2VydmVyUG9ydCgpLmdldFBvcnQoKSAmJiBoYXNDb250ZW50V2ViU2VydmljZXMoaW1zUG9ydCkpIC8vIHBvcnQKLSAgICAgICAgICAgIC8vIGFscmVhZHkKLSAgICAgICAgICAgIC8vIGJlaW5nCi0gICAgICAgICAgICAvLyBtb25pdG9yZWQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFpbXNQb3J0LmlzU3RhcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgIHNlcnZlck1vbml0b3JNYW5hZ2VyLnN0YXJ0TW9uaXRvcihpbXNQb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgIFN0YXR1cyBlcnJvciA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1IiLAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IFN0cmluZy52YWx1ZU9mKHBvcnQuZ2V0UG9ydCgpKSwgc2VydmVyLmdldE5hbWUoKX0pLCBTdGF0dXMuRVJST1IsIGNlKTsKLSAgICAgICAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoZXJyb3IpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtb25pdG9yZWRQb3J0ID0gbmV3IEludGVnZXIoaW1zUG9ydC5nZXRNb25pdG9yUG9ydCgpKTsKLSAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgSU1vbml0b3JlZFNlcnZlclBvcnQgaW1zUG9ydCA9IHNlcnZlck1vbml0b3JNYW5hZ2VyLmNyZWF0ZU1vbml0b3Ioc2VydmVyLCBwb3J0LCAtMSwgbmV3IFN0cmluZ1tdIHsgV0VCX1NFUlZJQ0VTfSk7Ci0gICAgICAgICAgICBzZXJ2ZXJNb25pdG9yTWFuYWdlci5zdGFydE1vbml0b3IoaW1zUG9ydCk7Ci0gICAgICAgICAgICBtb25pdG9yZWRQb3J0ID0gbmV3IEludGVnZXIoaW1zUG9ydC5nZXRNb25pdG9yUG9ydCgpKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICAgICAgICAgIFN0YXR1cyBlcnJvciA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1IiLCBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHBvcnQuZ2V0UG9ydCgpKSwgc2VydmVyLmdldE5hbWUoKX0pLCBTdGF0dXMuRVJST1IsIGNlKTsKLSAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoZXJyb3IpOwotICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UgewotICAgICAgICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICAgICAgICBTdGF0dXMgaW5mbyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfSU5GT19NT05JVE9SSU5HX05PVF9TVVBQT1JURUQiLAotICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBzZXJ2ZXIuZ2V0TmFtZSgpfSksIFN0YXR1cy5JTkZPKTsKLSAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEluZm8oaW5mbyk7Ci0gICAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGhhc0NvbnRlbnRXZWJTZXJ2aWNlcyhJTW9uaXRvcmVkU2VydmVyUG9ydCBpbXNQb3J0KSB7Ci0gICAgU3RyaW5nW10gY29udGVudHMgPSBpbXNQb3J0LmdldENvbnRlbnRUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoOyBpKyspCi0gICAgICBpZiAoV0VCX1NFUlZJQ0VTLmVxdWFscyhjb250ZW50c1tpXSkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcikgewotICAgIHRoaXMuc2VydmljZVNlcnZlckluc3RhbmNlSWQgPSB0eXBlUnVudGltZVNlcnZlci5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVySW5zdGFuY2VJZChTdHJpbmcgc2VydmljZVNlcnZlckluc3RhbmNlSWQpIHsKLSAgICB0aGlzLnNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkID0gc2VydmljZVNlcnZlckluc3RhbmNlSWQ7Ci0gIH0KLQotICBwdWJsaWMgSW50ZWdlciBnZXRNb25pdG9yZWRQb3J0KCkgewotICAgIHJldHVybiBtb25pdG9yZWRQb3J0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoQm9vbGVhbiB2YWx1ZSkgewotICAgIG1vbml0b3JTZXJ2aWNlID0gdmFsdWU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjZjU1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklSdW5uaW5nQWN0aW9uU2VydmVyOwotCi0vKioKLSAqIAotICogCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzRUpCID0gZmFsc2U7ICAvLyBmdXR1cmUgaW1wbGVtZW50YXRpb24gcGVyaGFwcwotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNXZWIgPSBmYWxzZTsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lOwotICBwcml2YXRlIFN0cmluZyBleGlzdGluZ1NlcnZlcklkOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWRfOwotICBwcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbl87ICAKLSAgcHJpdmF0ZSBib29sZWFuIG5lZWRFQVJfOwotICBwcml2YXRlIGJvb2xlYW4gaXNTZXJ2aWNlUHJvamVjdEVKQl89IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBJU2VydmVyIGZFeGlzdGluZ1NlcnZlciA9IG51bGw7Ci0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQoKSB7Ci0KLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZCIsCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUoKXsKLSAgCXJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudil7Ci0gIAlTdGF0dXMgc3RhdCA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIHRyeQl7Ci0gICAgCQotICAgICAgLy8gY2hlY2sgZXhpc3RpbmdTZXJ2ZXIKLSAgICAgIGlmIChmRXhpc3RpbmdTZXJ2ZXIhPW51bGwpIHsKLQotICAgICAgICAvLyBnZXQgRUFSIHByb2plY3QKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotICAgICAgICBpZiAoZWFyUHJvamVjdE5hbWUhPW51bGwgJiYgZWFyUHJvamVjdE5hbWUubGVuZ3RoKCk+MCkgewotICAgICAgICAgIGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWUpOwotICAgIAl9ICAgIAotICAgICAgICAKLSAgICAJQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSBudWxsOwotICAgIAlXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSByZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChmRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgIAlpZiAoZWFyUHJvamVjdCE9bnVsbCkgewotICAgIAkJc3RhcnRTZXJ2ZXJDb21tYW5kLnJ1blBvc3RTZXJ2ZXJDb25maWcoZkV4aXN0aW5nU2VydmVyLCBlYXJQcm9qZWN0KTsKLSAgICAJfQotICAgICAgfQotICAgCX0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApIHsKLSAgICAgIElTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgIHN0YXQgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoZW1iZWRkZWRTdGF0dXMpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0KTsKLSAgCQlyZXR1cm4gc3RhdDsKLSAgCX0gIAkKLSAgCQotICAJcmV0dXJuIHN0YXQ7Ci0gIH0gIAotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotCQotICAgIGlmIChwcm9qZWN0TmFtZSA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfQotICAgIAotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgSVNlcnZlciBleGlzdGluZ1NlcnZlciA9IG51bGw7ICAgIAotICAgIGZFeGlzdGluZ1NlcnZlciA9IG51bGw7IAotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXIgdGhpc1NlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotICAgICAgU3RyaW5nIHRoaXNTZXJ2ZXJJZCA9IG51bGw7Ci0gICAgICAKLSAgICAgIGlmICh0aGlzU2VydmVyIT1udWxsKSB7Ci0gICAgICAJd2MgPSB0aGlzU2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0gICAgICAJdGhpc1NlcnZlcklkID0gKHdjIT1udWxsID8gd2MuZ2V0SWQoKSA6IG51bGwpOwotICAgICAgfQotICAgICAgaWYgKHRoaXNTZXJ2ZXJJZC5lcXVhbHMoZXhpc3RpbmdTZXJ2ZXJJZCkpIHsKLSAgICAgICAgZXhpc3RpbmdTZXJ2ZXIgPSB0aGlzU2VydmVyOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaXNTZXJ2aWNlUHJvamVjdEVKQl8pCi0gICAgewotICAgICAgQ3JlYXRlRUpCUHJvamVjdENvbW1hbmQgYyA9IG5ldyBDcmVhdGVFSkJQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgYy5zZXRFamJQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICBjLnNldEVhclByb2plY3ROYW1lKGVhclByb2plY3ROYW1lKTsKLSAgICAgIGMuc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKGV4aXN0aW5nU2VydmVyKTsKLSAgICAgIGMuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOwotICAgICAgc3RhdHVzID0gYy5leGVjdXRlKGVudik7Ci0gICAgfSAKLSAgICBlbHNlCi0gICAgewotICAgICAgQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQgYyA9IG5ldyBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgYy5zZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICBjLnNldEVhclByb2plY3ROYW1lKGVhclByb2plY3ROYW1lKTsKLSAgICAgIGMuc2V0RXhpc3RpbmdTZXJ2ZXIoZXhpc3RpbmdTZXJ2ZXIpOwotICAgICAgYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXyk7Ci0gICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXyk7Ci0gICAgICBjLnNldE5lZWRFQVIobmVlZEVBUl8pOwotICAgICAgYy5zZXRBZGRlZFByb2plY3RUb1NlcnZlcihhZGRlZFByb2plY3RUb1NlcnZlcl8pOwotICAgICAgc3RhdHVzID0gYy5leGVjdXRlKGVudik7Ci0gICAgfQotICAgIAotICAgIHRyeQl7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGVhclByb2plY3ROYW1lIT1udWxsICYmIGVhclByb2plY3ROYW1lLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lKTsKLSAgICAgICAgfSAgICAJCi0gICAgCQotICAgCQlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAJCVdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChleGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgCXN0YXJ0U2VydmVyQ29tbWFuZC5ydW5QcmVTZXJ2ZXJDb25maWcoZXhpc3RpbmdTZXJ2ZXIsIGVhclByb2plY3QpOwotICAgIAlmRXhpc3RpbmdTZXJ2ZXIgPSBleGlzdGluZ1NlcnZlcjsKLSAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UgKSB7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAJc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9Ci0gICAgCi0gICAgLy8gU3RhcnQgc2VydmVyIGlmIHJlcSdkCi0gICAgSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gZkV4aXN0aW5nU2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7ICAgICAKLSAgICBpZiAod2MhPW51bGwpewotICAgICAgdHJ5IHsKLSAgICAgICAgT2JqZWN0IHggPSBmRXhpc3RpbmdTZXJ2ZXIuZ2V0QWRhcHRlcihJUnVubmluZ0FjdGlvblNlcnZlci5jbGFzcyk7Ci0gICAgICAgIGlmICh4IT1udWxsICYmIHggaW5zdGFuY2VvZiBJUnVubmluZ0FjdGlvblNlcnZlcikgewotICAgICAgICAgIGludCBzdGF0ZSA9IGZFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotICAgICAgICAgIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQgfHwgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotICAgICAgICAgICAgZkV4aXN0aW5nU2VydmVyLnN5bmNocm9ub3VzU3RhcnQobW9kZSwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2V4KSB7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZXguZ2V0U3RhdHVzKCk7Ci0gICAgCXN0YXR1cyA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgCQlyZXR1cm4gc3RhdHVzOyAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICAKLSAgIAotICAJCi0gIAlyZXR1cm4gc3RhdHVzOyAgICAKLSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gZWFyUHJvamVjdE5hbWUgVGhlIGVhclByb2plY3ROYW1lIHRvIHNldC4KLSAgICogQHRvZG8gR2VuZXJhdGVkIGNvbW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3ROYW1lKFN0cmluZyBlYXJQcm9qZWN0TmFtZSkgewotCi0gICAgdGhpcy5lYXJQcm9qZWN0TmFtZSA9IGVhclByb2plY3ROYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcklkKFN0cmluZyBleGlzdGluZ1NlcnZlcklkKQotICB7Ci0gICAgdGhpcy5leGlzdGluZ1NlcnZlcklkID0gZXhpc3RpbmdTZXJ2ZXJJZDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHByb2plY3ROYW1lIFRoZSBwcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQotICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHJlcXVpcmVzRUpCIFRoZSByZXF1aXJlc0VKQiB0byBzZXQuCi0gICAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlc0VKQihib29sZWFuIHJlcXVpcmVzRUpCKSB7Ci0KLSAgICB0aGlzLnJlcXVpcmVzRUpCID0gcmVxdWlyZXNFSkI7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSByZXF1aXJlc1dlYiBUaGUgcmVxdWlyZXNXZWIgdG8gc2V0LgotICAgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVxdWlyZXNXZWIoYm9vbGVhbiByZXF1aXJlc1dlYikgewotCi0gICAgdGhpcy5yZXF1aXJlc1dlYiA9IHJlcXVpcmVzV2ViOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJc2VydmVyRmFjdG9yeUlkXyA9IHNlcnZlckZhY3RvcnlJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gIAlqMmVlVmVyc2lvbl8gPSBqMmVlVmVyc2lvbjsJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5lZWRFQVIoYm9vbGVhbiBuZWVkRUFSKQotICB7Ci0gICAgbmVlZEVBUl8gPSBuZWVkRUFSOwotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldElzU2VydmljZVByb2plY3RFSkIoYm9vbGVhbiBpc1NlcnZpY2VQcm9qZWN0RUpCKQotICB7Ci0gICAgdGhpcy5pc1NlcnZpY2VQcm9qZWN0RUpCXyA9IGlzU2VydmljZVByb2plY3RFSkI7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRBZGRlZFByb2plY3RUb1NlcnZlcihib29sZWFuIGFkZGVkUHJvamVjdFRvU2VydmVyKSAKLSAgewotICAgIGFkZGVkUHJvamVjdFRvU2VydmVyXyA9IGFkZGVkUHJvamVjdFRvU2VydmVyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVdlYlByb2plY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVdlYlByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhM2UzMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVXZWJQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQuSVNlcnZlclRhcmdldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotcHVibGljIGNsYXNzIENyZWF0ZVdlYlByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19DUkVBVEVfV0VCX1BST0pFQ1QiOwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9DUkVBVEVfV0VCX1BST0pFQ1QiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX0VBUl9OQU1FID0gIldlYlNlcnZpY2VFQVIiOwotICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZV8gPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBlYXJQcm9qZWN0TmFtZV8gPSBudWxsOwotICBwcml2YXRlIGJvb2xlYW4gcHJveHlDb2RlZ2VuRW5hYmxlZCA9IHRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckZhY3RvcnlJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uXzsKLSAgcHJpdmF0ZSBJU2VydmVyIGV4aXN0aW5nU2VydmVyXzsKLSAgcHJpdmF0ZSBib29sZWFuIG5lZWRFQVJfOwotICBwcml2YXRlIGJvb2xlYW4gd2VBZGRlZFByb2plY3RUb1NlcnZlcl8gPSBmYWxzZTsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZCgpIHsKLQotICAgIHN1cGVyKExBQkVMLCBERVNDUklQVElPTik7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICAvL3NldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgc2VydmljZSBXZWIgUHJvamVjdCB1c2luZyB0aGUgcGFyYW1ldGVyIFByb2plY3QgbmFtZSBOb3RlOiB0byBiZQotICAgKiBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQoU3RyaW5nIHNlcnZpY2VQcm9qZWN0TmFtZSkgewotCi0gICAgc3VwZXIoTEFCRUwsIERFU0NSSVBUSU9OKTsKLSAgICBwcm9qZWN0TmFtZV8gPSBzZXJ2aWNlUHJvamVjdE5hbWU7Ci0gICAgLy9zZXRSdW5JbldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0KLSAgICBpZiAocHJvamVjdE5hbWVfID09IG51bGwgfHwgcHJvamVjdE5hbWVfLmxlbmd0aCgpID09IDApIHsKLSAgICAJZW52LmdldExvZygpLmxvZyhMb2cuRVJST1IsIDUwNDQsIHRoaXMsICJleGVjdXRlIiwgIldlYiBwcm9qZWN0IG5hbWUgbm90IHNldCIpOwotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dFQl9QUk9KRUNUX0NSRUFURSIpLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsgCi0gICAgfQotCi0gICAgaWYgKGV4aXN0aW5nU2VydmVyXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVudi5nZXRMb2coKS5sb2coTG9nLkVSUk9SLCA1MDQ0LCB0aGlzLCAiZXhlY3V0ZSIsICJTZXJ2ZXIgaXMgbnVsbCIpOwotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dFQl9QUk9KRUNUX0NSRUFURSIpLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgSVByb2plY3Qgd2ViUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZV8pOwotICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotICAgIGlmIChlYXJQcm9qZWN0TmFtZV8hPW51bGwgJiYgZWFyUHJvamVjdE5hbWVfLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgIH0KLSAgICAKLSAgICBib29sZWFuIHByb2plY3RFeGlzdHMgPSB3ZWJQcm9qZWN0ICE9IG51bGwgJiYgd2ViUHJvamVjdC5leGlzdHMoKTsKLSAgICBib29sZWFuIGFkZGVkVG9TZXJ2ZXIgPSBmYWxzZTsKLSAgICBpZiAocHJvamVjdEV4aXN0cykKLSAgICB7Ci0gICAgICBhZGRlZFRvU2VydmVyID0gU2VydmVyVXRpbC5jb250YWluc01vZHVsZShleGlzdGluZ1NlcnZlcl8sUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUod2ViUHJvamVjdCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgIH0KLSAgICAKLSAgICBib29sZWFuIGVhckV4aXN0cyA9IGVhclByb2plY3QhPW51bGwgJiYgZWFyUHJvamVjdC5leGlzdHMoKTsKLSAgICBib29sZWFuIGVhckFkZGVkVG9TZXJ2ZXIgPSB0cnVlOwotICAgIGlmIChlYXJFeGlzdHMpCi0gICAgewotICAgICAgZWFyQWRkZWRUb1NlcnZlciA9IFNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoZXhpc3RpbmdTZXJ2ZXJfLFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbGVhbiBhcmVBc3NvY2lhdGVkID0gZmFsc2U7Ci0gICAgaWYgKHByb2plY3RFeGlzdHMgJiYgZWFyRXhpc3RzKQotICAgIHsKLSAgICAgIGFyZUFzc29jaWF0ZWQgPSBKMkVFVXRpbHMuaXNFQVJBc3NvY2lhdGVkKHdlYlByb2plY3QsIGVhclByb2plY3QpOwotICAgIH0KLSAgICAKLSAgICBib29sZWFuIHNlcnZlclJlcXVpcmVzRUFSUmVtb3ZhbCA9IHRydWU7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gY2hlY2sgdGhlIFJlZ2lzdHJ5IHRvIHNlZSBpZiB0aGUgc2VydmVyIHJlcXVpcmVzIEVBUiByZW1vdmFsCi0gICAgICBpZiAoc2VydmVyRmFjdG9yeUlkXyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgd3NzUmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgc2VydmVyUmVxdWlyZXNFQVJSZW1vdmFsID0gd3NzUmVnLmlzUmVtb3ZlRUFSUmVxdWlyZWQoc2VydmVyRmFjdG9yeUlkXyk7ICAgIAkJCi0gICAgICB9ICAgIAotICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgICAgZW52LmdldExvZygpLmxvZyhMb2cuRVJST1IsIDUwNDYsIHRoaXMsICJleGVjdXRlIiwgY2UpOwotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dFQl9QUk9KRUNUX0NSRUFURSIpLCBTdGF0dXMuRVJST1IsIGNlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIAotICAgIAotICAgIGlmICghbmVlZEVBUl8gJiYgcHJvamVjdEV4aXN0cyAmJiBhZGRlZFRvU2VydmVyICYmICF3ZUFkZGVkUHJvamVjdFRvU2VydmVyXykKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfQotICAgIAotICAgIC8vIGV4aXN0aW5nIHByb2plY3QsIGVhciBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICBpZiAobmVlZEVBUl8gJiYgcHJvamVjdEV4aXN0cyAmJiBlYXJFeGlzdHMgJiYgZWFyQWRkZWRUb1NlcnZlciAmJiBhcmVBc3NvY2lhdGVkICYmICF3ZUFkZGVkUHJvamVjdFRvU2VydmVyXyl7Ci0gICAgCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy9BbHdheXMgc3RvcCB0aGUgc2VydmVyCi0gICAgU3RhdHVzIHN0b3BwaW5nU3RhdHVzID0gc3RvcFNlcnZlcihlbnYpOwotICAgIGlmKHN0b3BwaW5nU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICByZXR1cm4gc3RvcHBpbmdTdGF0dXM7Ci0gICAgCi0gICAgaWYgKCFuZWVkRUFSXyAmJiBwcm9qZWN0RXhpc3RzICYmIGFkZGVkVG9TZXJ2ZXIpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIH0gICAgICAgCi0gICAgZWxzZSBpZiAoIW5lZWRFQVJfICYmIHByb2plY3RFeGlzdHMgJiYgIWFkZGVkVG9TZXJ2ZXIpCi0gICAgewotICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgZXhpc3RpbmdTZXJ2ZXJfLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZSh3ZWJQcm9qZWN0KSAsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmICghbmVlZEVBUl8gJiYgIXByb2plY3RFeGlzdHMpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVdlYlByb2plY3QoZW52KTsKLSAgICAgIGlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIHdlYlByb2plY3QgPSByb290LmdldFByb2plY3QocHJvamVjdE5hbWVfKTsKLSAgICAgIAotICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgZXhpc3RpbmdTZXJ2ZXJfLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZSh3ZWJQcm9qZWN0KSAsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvamVjdEV4aXN0cyAmJiBlYXJFeGlzdHMgJiYgYXJlQXNzb2NpYXRlZCAmJiBhZGRlZFRvU2VydmVyKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvamVjdEV4aXN0cyAmJiBlYXJFeGlzdHMgJiYgYXJlQXNzb2NpYXRlZCAmJiAhYWRkZWRUb1NlcnZlcikKLSAgICB7Ci0gICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHdlYlByb2plY3QpICwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChwcm9qZWN0RXhpc3RzICYmICFlYXJFeGlzdHMpCi0gICAgewotICAgICAgLy9DcmVhdGUgdGhlIEVBUiBwcm9qZWN0Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gY3JlYXRlRUFSUHJvamVjdChlbnYpOwotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgIAotICAgICAgLy9Bc3NvY2lhdGUgdGhlIFdlYiBwcm9qZWN0IGFuZCB0aGUgRUFSIHByb2plY3QKLSAgICAgIEoyRUVVdGlscy5hc3NvY2lhdGVXZWJQcm9qZWN0KHdlYlByb2plY3QsIGVhclByb2plY3QpOwotICAgICAgCi0gICAgICAvL0FkZCB0byBzZXJ2ZXIKLSAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIGV4aXN0aW5nU2VydmVyXywgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUod2ViUHJvamVjdCkgLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBtbVN0YXR1czsgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKCFwcm9qZWN0RXhpc3RzICYmICFlYXJFeGlzdHMpCi0gICAgewotICAgICAgLy9DcmVhdGUgRUFSCi0gICAgICBTdGF0dXMgc3RhdHVzID0gY3JlYXRlRUFSUHJvamVjdChlbnYpOwotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgIAotICAgICAgLy9DcmVhdGUgcHJvamVjdAotICAgICAgc3RhdHVzID0gY3JlYXRlV2ViUHJvamVjdChlbnYpOwotICAgICAgaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgd2ViUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZV8pOwotICAgICAgCi0gICAgICAvL0FkZCB0byBzZXJ2ZXIKLSAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIGV4aXN0aW5nU2VydmVyXywgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUod2ViUHJvamVjdCkgLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBtbVN0YXR1czsgICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXByb2plY3RFeGlzdHMgJiYgZWFyRXhpc3RzKQotICAgIHsKLSAgICAgIC8vUmVtb3ZlIHRoZSBlYXIgZnJvbSB0aGUgc2VydmVyIGlmIG5lY2Vzc2FyeQotICAgICAgaWYgKGVhckFkZGVkVG9TZXJ2ZXIgJiYgc2VydmVyUmVxdWlyZXNFQVJSZW1vdmFsKQotICAgICAgewotICAgICAgICAvLyBTdG9wcGluZyBzZXJ2ZXIgYW5kIHJlbW92aW5nIEVBUiBmcm9tIFNlcnZlcgotICAgICAgICBpZiAoZXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotICAgICAgICB7Ci0gICAgICAgICAgZXhpc3RpbmdTZXJ2ZXJfLnN5bmNocm9ub3VzU3RvcChmYWxzZSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vQ3JlYXRlIHRoZSBXZWIgcHJvamVjdAotICAgICAgU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVdlYlByb2plY3QoZW52KTsKLSAgICAgIGlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIHdlYlByb2plY3QgPSByb290LmdldFByb2plY3QocHJvamVjdE5hbWVfKTsKLQotICAgICAgYm9vbGVhbiBlYXJBZGRlZFRvU2VydmVyRmluYWwgPSBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKGV4aXN0aW5nU2VydmVyXyxSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICBpZiAoIWVhckFkZGVkVG9TZXJ2ZXJGaW5hbCkKLSAgICAgIHsKLSAgICAgIAlTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHdlYlByb2plY3QpICwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7ICAKLSAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgCXJldHVybiBtbVN0YXR1czsgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChwcm9qZWN0RXhpc3RzICYmIGVhckV4aXN0cyAmJiAhYXJlQXNzb2NpYXRlZCkKLSAgICB7Ci0gICAgICAvL1JlbW92ZSB0aGUgZWFyIGZyb20gdGhlIHNlcnZlciBpZiBuZWNlc3NhcnkKLSAgICAgIGlmIChlYXJBZGRlZFRvU2VydmVyICYmIHNlcnZlclJlcXVpcmVzRUFSUmVtb3ZhbCkKLSAgICAgIHsKLSAgICAgICAgLy8gU3RvcHBpbmcgc2VydmVyIGFuZCByZW1vdmluZyBFQVIgZnJvbSBTZXJ2ZXIKLSAgICAgICAgaWYgKGV4aXN0aW5nU2VydmVyXy5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLSAgICAgICAgewotICAgICAgICAgIGV4aXN0aW5nU2VydmVyXy5zeW5jaHJvbm91c1N0b3AoZmFsc2UpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgZXhpc3RpbmdTZXJ2ZXJfLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgICAvL0Fzc29jaWF0ZSB0aGUgV2ViIHByb2plY3QgYW5kIHRoZSBFQVIgcHJvamVjdAotICAgICAgSjJFRVV0aWxzLmFzc29jaWF0ZVdlYlByb2plY3Qod2ViUHJvamVjdCwgZWFyUHJvamVjdCk7Ci0gICAgICAKLSAgICAgIGJvb2xlYW4gZWFyQWRkZWRUb1NlcnZlckZpbmFsID0gU2VydmVyVXRpbC5jb250YWluc01vZHVsZShleGlzdGluZ1NlcnZlcl8sUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoZWFyUHJvamVjdCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAgICAgIAotICAgICAgaWYgKCFlYXJBZGRlZFRvU2VydmVyRmluYWwpCi0gICAgICB7Ci0gICAgICAJU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgZXhpc3RpbmdTZXJ2ZXJfLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZSh3ZWJQcm9qZWN0KSAsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAgCi0gICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAgICAgCi0gICAgICB9ICAgICAgCi0gICAgICAKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwcml2YXRlIFN0YXR1cyBjcmVhdGVXZWJQcm9qZWN0KEVudmlyb25tZW50IGVudikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAJCi0gICAgV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgcHJvamVjdEluZm8gPSBuZXcgV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKTsKLSAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lXyk7Ci0gICAgU3RyaW5nIGZpbmFsSjJFRVZlcnNpb24gPSBudWxsOwotICAgIGlmIChqMmVlVmVyc2lvbl8gIT0gbnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uXykpOwotICAgICAgZmluYWxKMkVFVmVyc2lvbiA9IGoyZWVWZXJzaW9uXzsKLSAgICB9ICAgICAgICAKLSAgICBlbHNlICAgICAgICAKLSAgICB7Ci0gICAgICBpZiAoZWFyUHJvamVjdE5hbWVfICE9bnVsbCAmJiBlYXJQcm9qZWN0TmFtZV8ubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgICAgaWYgKGVhclByb2plY3QgIT0gbnVsbCAmJiBlYXJQcm9qZWN0LmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgRUFSTmF0dXJlUnVudGltZSBlYXIgPSBFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUoZWFyUHJvamVjdCk7Ci0gICAgICAgICAgaW50IGVhclZlcnNpb24gPSBlYXIuZ2V0SjJFRVZlcnNpb24oKTsKLSAgICAgICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGVhclZlcnNpb24pKTsKLSAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoZWFyVmVyc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkoyRUVfVkVSU0lPTiwgbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLSAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkoyRUVfVkVSU0lPTiwgbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLSAgICAgICAgZmluYWxKMkVFVmVyc2lvbiA9IFN0cmluZy52YWx1ZU9mKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsgICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgfSAgICAKLSAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gbnVsbDsKLSAgICBpZiAoc2VydmVyRmFjdG9yeUlkXyE9bnVsbCAmJiBzZXJ2ZXJGYWN0b3J5SWRfLmxlbmd0aCgpPjApCi0gICAgewotLy8JCVRPRE8gLSBBZGQgdGhpcyBsb2dpYyB0byBGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbCwgYW5kIG9wLi4uLgotLy8gICAgICBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXyxJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLldFQl9UWVBFLCBmaW5hbEoyRUVWZXJzaW9uKTsgCi0vLyAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlNFUlZFUl9UQVJHRVRfSUQsIHJ1bnRpbWVUYXJnZXRJZCApOwotLy8gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfU0VSVkVSX1RBUkdFVCwgQm9vbGVhbi5UUlVFKTsgICAgICAKLSAgICB9IAotICAgIAotICAgIGlmIChlYXJQcm9qZWN0TmFtZV8gIT1udWxsICYmIGVhclByb2plY3ROYW1lXy5sZW5ndGgoKT4wKQotICAgIHsKLSAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkVBUl9NT0RVTEVfTkFNRSwgZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9UT19FQVIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfVE9fRUFSLCBCb29sZWFuLkZBTFNFKTsKLSAgICB9Ci0gICAgCQotICAgIAotCi0gICAgLy9DcmVhdGUgYW5kIHJ1biB0aGUgb3BlcmF0aW9uCi0gICAgV2ViQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24gb3AgPSBuZXcgV2ViQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24ocHJvamVjdEluZm8pOwotICAgICAgb3AucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAgICAKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZW52LmdldExvZygpLmxvZyhMb2cuRVJST1IsIDUwNDYsIHRoaXMsICJjcmVhdGVXZWJQcm9qZWN0IiwgZSk7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBTdGF0dXMgY3JlYXRlRUFSUHJvamVjdChFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBDcmVhdGVFQVJQcm9qZWN0Q29tbWFuZCB0ID0gbmV3IENyZWF0ZUVBUlByb2plY3RDb21tYW5kKCk7Ci0gICAgdC5zZXRFYXJQcm9qZWN0TmFtZShlYXJQcm9qZWN0TmFtZV8pOwotICAgIHQuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgIHQuc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb25fKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gdC5leGVjdXRlKGVudik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfSAgICAgICAgICAgICAKLSAgCi0gIHByaXZhdGUgU3RhdHVzIHN0b3BTZXJ2ZXIoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gCQotICAgIHRyeQotICAgCXsKLSAgIAkJV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgIAkJQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChleGlzdGluZ1NlcnZlcl8uZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgIAlzdGFydFNlcnZlckNvbW1hbmQuc3RvcFNlcnZlcihleGlzdGluZ1NlcnZlcl8pOwotICAgIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAJfQotICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApCi0gIAl7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAJU3RhdHVzIHN0YXR1cyA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgCQlyZXR1cm4gc3RhdHVzOwotICAJfSAgCQotICAJCi0KLSAgfQotICAKLSAgLy8gVG8gYmUgZGVwcmVjYXRlZAotICAvKgotICBwcml2YXRlIFN0YXR1cyBjcmVhdGVXZWJQcm9qZWN0KFN0cmluZyB3ZWJQcm9qZWN0TmFtZSwgU3RyaW5nIGVhclByb2plY3ROYW1lLCBFbnZpcm9ubWVudCBlbnYpIHsKLQotICAgIHRyeSB7Ci0gICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWUpOwotICAgICAgaWYgKGVhclByb2plY3QgIT0gbnVsbCAmJiAhZWFyUHJvamVjdC5leGlzdHMoKSkgewotICAgICAgICBDcmVhdGVFQVJQcm9qZWN0Q29tbWFuZCBjID0gbmV3IENyZWF0ZUVBUlByb2plY3RDb21tYW5kKCk7Ci0gICAgICAgIGMuc2V0RWFyUHJvamVjdE5hbWUoZWFyUHJvamVjdE5hbWUpOwotICAgICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfKTsKLSAgICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOwotICAgICAgICBjLmV4ZWN1dGUoZW52KTsKLSAgICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZSk7Ci0gICAgICB9Ci0gICAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHdlYlByb2plY3ROYW1lKTsKLSAgICAgIGlmICh3ZWJQcm9qZWN0ICE9IG51bGwgJiYgIXdlYlByb2plY3QuZXhpc3RzKCkpIHsKLSAgICAgICAgV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgaW5mbyA9IG5ldyBXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgd2ViUHJvamVjdE5hbWUpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkVBUl9QUk9KRUNUX05BTUUsIGVhclByb2plY3ROYW1lKTsKLSAgICAgICAgLy9pbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9UT19FQVIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1RPX0VBUiwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRfIT1udWxsICYmIHNlcnZlckZhY3RvcnlJZF8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOyAKLSAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlNFUlZFUl9UQVJHRVRfSUQsIHJ1bnRpbWVUYXJnZXRJZCApOwotICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1NFUlZFUl9UQVJHRVQsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGoyZWVWZXJzaW9uXyAhPSBudWxsICYmIGoyZWVWZXJzaW9uXy5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uXykpOwotICAgICAgICB9ICAgICAgICAgICAgICAgIAotCi0gICAgICAgIFdlYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV2ViUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKGluZm8pOwotICAgICAgICBvcGVyYXRpb24ucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XRUJfUFJPSkVDVF9DUkVBVEUiKSwgU3RhdHVzLkVSUk9SLAotICAgICAgICAgIGl0ZSk7Ci0gICAgfQotICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dFQl9QUk9KRUNUX0NSRUFURSIpLCBTdGF0dXMuRVJST1IsCi0gICAgICAgICAgaWUpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgKi8KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldE5ld0VBUk5hbWUoKSB7Ci0KLSAgICBTdHJpbmcgbmV3RUFSTmFtZSA9IERFRkFVTFRfRUFSX05BTUU7Ci0gICAgLy9DaGVjayB0byBzZWUgaWYgaXQgZXhpc3RzCi0gICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmV3RUFSTmFtZSk7Ci0gICAgcmV0dXJuIG5ld0VBUk5hbWU7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXREZWZhdWx0RUFSUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLSAgICB0cnkgewotICAgICAgRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBudWxsOwotICAgICAgRUFSTmF0dXJlUnVudGltZSBlYXIgPSBudWxsOwotICAgICAgZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7Ci0gICAgICBpZiAoZWFyc1swXSAhPSBudWxsICYmIGVhcnMubGVuZ3RoID49IDEpIHsKLSAgICAgICAgLy8gZm91bmQgYW4gRUFSIGNvbnRhaW5pbmcgdGhlIHdlYiBwcm9qZWN0Ci0gICAgICAgIHJldHVybiBlYXJzWzBdLmdldFByb2plY3QoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGoyZWVWZXJzaW9uXyE9bnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgIAllYXIgPSBKMkVFVXRpbHMuZ2V0RUFSKEludGVnZXIucGFyc2VJbnQoajJlZVZlcnNpb25fKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVhciA9IEoyRUVVdGlscy5nZXQxMkVBUigpOwotICAgICAgICBpZiAoZWFyID09IG51bGwpCi0gICAgICAgICAgZWFyID0gSjJFRVV0aWxzLmdldDEzRUFSKCk7Ci0gICAgICAgIGlmIChlYXIgPT0gbnVsbCkKLSAgICAgICAgICBlYXIgPSBKMkVFVXRpbHMuZ2V0RUFSKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGVhciAhPSBudWxsKQotICAgICAgICByZXR1cm4gZWFyLmdldFByb2plY3QoKTsKLSAgICAgIGVsc2UgewotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9IGdldE5ld0VBUk5hbWUoKTsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIHJldHVybiByb290LmdldFByb2plY3QoZWFyTmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGVhclByb2plY3ROYW1lCi0gICAqICAgICAgICAgIFRoZSBlYXJQcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFYXJQcm9qZWN0TmFtZShTdHJpbmcgZWFyUHJvamVjdE5hbWUpIHsKLQotICAgIHRoaXMuZWFyUHJvamVjdE5hbWVfID0gZWFyUHJvamVjdE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHByb2plY3ROYW1lCi0gICAqICAgICAgICAgIFRoZSBwcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQotICAgIHRoaXMucHJvamVjdE5hbWVfID0gcHJvamVjdE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGV4aXN0aW5nU2VydmVyCi0gICAqICAgICAgICAgIFRoZSBleGlzdGluZ1NlcnZlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcihJU2VydmVyIGV4aXN0aW5nU2VydmVyKSB7Ci0KLSAgICB0aGlzLmV4aXN0aW5nU2VydmVyXyA9IGV4aXN0aW5nU2VydmVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJc2VydmVyRmFjdG9yeUlkXyA9IHNlcnZlckZhY3RvcnlJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gIAlqMmVlVmVyc2lvbl8gPSBqMmVlVmVyc2lvbjsJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5lZWRFQVIoYm9vbGVhbiBuZWVkRUFSKQotICB7Ci0gICAgbmVlZEVBUl8gPSBuZWVkRUFSOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRBZGRlZFByb2plY3RUb1NlcnZlcihib29sZWFuIGFkZGVkUHJvamVjdFRvU2VydmVyKSAKLSAgewotICAgIHdlQWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gYWRkZWRQcm9qZWN0VG9TZXJ2ZXI7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9EaXNhYmxlQnVpbGRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVCdWlsZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3MGViZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVCdWlsZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLnZhbGlkYXRlLlZhbGlkYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIERpc2FibGVCdWlsZENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgTW9kZWwgbW9kZWxfOwotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXJfOwotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1dFQlNFUlZJQ0VfRElTQUJMRV9CVUlMRCI7Ci0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19XRUJTRVJWSUNFX0RJU0FCTEVfQlVJTEQiOwotICAvKioKLSAgICogQ1RPUjsKLSAgICovCi0gIHB1YmxpYyBEaXNhYmxlQnVpbGRDb21tYW5kKCkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCi0gICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX0JVSUxEIikpOwotCi0gICAgaWYgKG1hbmFnZXJfIT1udWxsKSB7Ci0gICAgICBtYW5hZ2VyXy5kaXNhYmxlQXV0b0J1aWxkKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtb2RlbAotICAgKiAKLSAgICogQHBhcmFtIG1vZGVsCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChNb2RlbCBtb2RlbCkgewotICAgIHRoaXMubW9kZWxfID0gbW9kZWw7Ci0gIH0gIAotICAKLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gbWFuYWdlcl8gVGhlIG1hbmFnZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25NYW5hZ2VyKFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICB0aGlzLm1hbmFnZXJfID0gbWFuYWdlcjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVWYWxpZGF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9EaXNhYmxlVmFsaWRhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwMzY0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVWYWxpZGF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGUuVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIERpc2FibGVWYWxpZGF0aW9uQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBWYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT04iOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT04iOwotCi0gIC8qKgotICAgKiBDVE9SOwotICAgKi8KLSAgcHVibGljIERpc2FibGVWYWxpZGF0aW9uQ29tbWFuZCgpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT04iKSk7Ci0KLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gc2VydmljZVByb2plY3RfOwotICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIG1hbmFnZXJfLmRpc2FibGVWYWxpZGF0aW9uRm9yUHJvamVjdChwcm9qZWN0KTsKLQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG1hbmFnZXJfCi0gICAqICAgICAgICAgICAgVGhlIG1hbmFnZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25NYW5hZ2VyKFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICB0aGlzLm1hbmFnZXJfID0gbWFuYWdlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpewotICAgIHRoaXMuc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vR2V0TW9uaXRvckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vR2V0TW9uaXRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxMzRhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0dldE1vbml0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLS8vIFRPRE86IEdldCByaWQgb2YgdGhpcy4gQSByZXBsYWNlbWVudCBpcyBpbiBvcmcuZWNsaXBzZS53c3Qud3MuCi0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuSU1vbml0b3JXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLk1vbml0b3JDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgR2V0TW9uaXRvckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBtb25pdG9yU2VydmljZTsKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZTsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLSAgcHJpdmF0ZSBMaXN0IGVuZHBvaW50czsKLQotICBwdWJsaWMgR2V0TW9uaXRvckNvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5HZXRNb25pdG9yQ29tbWFuZCIsICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uR2V0TW9uaXRvckNvbW1hbmQiKTsKLSAgICBtb25pdG9yU2VydmljZSA9IHRydWU7Ci0gICAgY3JlYXRlID0gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBlbmRwb2ludHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKG1vbml0b3JTZXJ2aWNlICYmIHdlYlNlcnZpY2VzUGFyc2VyICE9IG51bGwgJiYgd3NkbFVSSSAhPSBudWxsICYmIHdzZGxVUkkubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkkpOwotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXQgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlzZXJ2aWNlc0l0Lm5leHQoKTsKLSAgICAgICAgICBNYXAgcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBwb3J0c0l0ID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgcG9ydHNJdC5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBvcnQgd3NkbFBvcnQgPSAoUG9ydClwb3J0c0l0Lm5leHQoKTsKLSAgICAgICAgICAgIExpc3QgZXh0RWxlbWVudHMgPSB3c2RsUG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZXh0RWxlbWVudHNJdCA9IGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IGV4dEVsZW1lbnRzSXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtZW50c0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgVVJMIGVuZHBvaW50VVJMID0gbnVsbDsKLSAgICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICAgICAgICBlbmRwb2ludCA9ICgoU09BUEFkZHJlc3MpZXh0RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIEhUVFBBZGRyZXNzKQotICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gKChIVFRQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICAgICAgICBpZiAoZW5kcG9pbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGVuZHBvaW50VVJMID0gbmV3IFVSTChlbmRwb2ludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRVUkwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCA9IGVuZHBvaW50VVJMLmdldFByb3RvY29sKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBlbmRwb2ludFVSTC5nZXRIb3N0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHBvcnQgPSBlbmRwb2ludFVSTC5nZXRQb3J0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcnQgPT0gLTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCJodHRwIi5lcXVhbHNJZ25vcmVDYXNlKHByb3RvY29sKSkKLSAgICAgICAgICAgICAgICAgICAgcG9ydCA9IDgwOwotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoImh0dHBzIi5lcXVhbHNJZ25vcmVDYXNlKHByb3RvY29sKSkKLSAgICAgICAgICAgICAgICAgICAgcG9ydCA9IDQ0MzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sICE9IG51bGwgJiYgcHJvdG9jb2wuc3RhcnRzV2l0aCgiaHR0cCIpICYmIGhvc3QgIT0gbnVsbCAmJiBob3N0Lmxlbmd0aCgpID4gMCAmJiBwb3J0ICE9IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIElNb25pdG9yIG0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bW9uaXRvcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChob3N0LmVxdWFsc0lnbm9yZUNhc2UobW9uaXRvcnNbaV0uZ2V0UmVtb3RlSG9zdCgpKSAmJiBwb3J0ID09IG1vbml0b3JzW2ldLmdldFJlbW90ZVBvcnQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIG0gPSBtb25pdG9yc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCAmJiBjcmVhdGUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtb25pdG9yZWRQb3J0ID0gU29ja2V0VXRpbC5maW5kVW51c2VkUG9ydCg1MDAwLCAxNTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIElNb25pdG9yV29ya2luZ0NvcHkgbW9uaXRvcldvcmtpbmdDb3B5ID0gTW9uaXRvckNvcmUuY3JlYXRlTW9uaXRvcigpOwotICAgICAgICAgICAgICAgICAgICBtb25pdG9yV29ya2luZ0NvcHkuc2V0TG9jYWxQb3J0KG1vbml0b3JlZFBvcnQpOwotICAgICAgICAgICAgICAgICAgICBtb25pdG9yV29ya2luZ0NvcHkuc2V0UmVtb3RlSG9zdChob3N0KTsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvcldvcmtpbmdDb3B5LnNldFJlbW90ZVBvcnQocG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vbml0b3JXb3JraW5nQ29weS5zZXRQcm90b2NvbCgiSFRUUCIpOwotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIG0gPSBtb25pdG9yV29ya2luZ0NvcHkuc2F2ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyB3YXJuaW5nID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1IiLCBuZXcgT2JqZWN0W117U3RyaW5nLnZhbHVlT2YocG9ydCksIGVuZHBvaW50fSksIFN0YXR1cy5XQVJOSU5HLCB0KTsKLSAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHdhcm5pbmcpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKCFtLmlzUnVubmluZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgbS5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoZW5kcG9pbnRVUkwuZ2V0UHJvdG9jb2woKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6Ly9sb2NhbGhvc3Q6Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG0uZ2V0TG9jYWxQb3J0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZW5kcG9pbnRVUkwuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludHMuYWRkKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyB3YXJuaW5nID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1IiLCBuZXcgT2JqZWN0W117U3RyaW5nLnZhbHVlT2YocG9ydCksIGVuZHBvaW50fSksIFN0YXR1cy5XQVJOSU5HLCB0KTsKLSAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHdhcm5pbmcpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoYm9vbGVhbiBtb25pdG9yU2VydmljZSkKLSAgewotICAgIHRoaXMubW9uaXRvclNlcnZpY2UgPSBtb25pdG9yU2VydmljZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDcmVhdGUoYm9vbGVhbiBjcmVhdGUpCi0gIHsKLSAgICB0aGlzLmNyZWF0ZSA9IGNyZWF0ZTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEVuZHBvaW50cygpCi0gIHsKLSAgICByZXR1cm4gZW5kcG9pbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjQ2MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi0KLS8vY29yZSBzdHVmZgotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIHRvIEJ1aWxkIHRoZSBkYXRhIG1vZGVsCi0qIGZpcnN0IHdlIGdldCB0aGUgamF2YSBjbGFzcyBhbmQgdGhlbiBidWlsZCB0aGUgbW9kZWwKLSovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gIkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJyZWZsZWN0aW9uIGZvciBhIGdpdmVuIGNsYXNzIjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9LX01FU1NBR0UgPSAgIlRoZSBtb2RlbCBoYXMgYmVlbiBidWlsdCAiOyAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBVkFfRVhURU5TSU9OID0gIi5qYXZhIjsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENMQVNTX0VYVEVOU0lPTiA9ICIuY2xhc3MiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIAotICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0OwotICBwcml2YXRlIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotICBwcml2YXRlIEphdmFIZWxwZXJzIGphdmFDbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgcW5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5QmVhbjsKLSAgcHJpdmF0ZSBJUHJvamVjdCBjbGllbnRJUHJvamVjdDsKLSAKLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgYW5kIGRlc2NyaXB0aW9uCi0gICogCi0gICovCi0gIHB1YmxpYyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKQotICB7Ci0JU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0KLSAgICBzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gICAgc2V0TmFtZShMQUJFTCk7Ci0gIH0KLSAgCi0gIC8vIHNldHRlcnMgZm9yIHRoaXMgY29tbWFuZAotICAKLSAgICAKLSAgLyoqCi0gICogVGhlIGVuZCByZXN1bHQgb2YgdGhpcyB3aG9sZSBwcm9jZXNzIGlzIHRvIGdldCB0aGUgSmF2YSBDbGFzcwotICAqLwotICBwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0SmF2YUNsYXNzKCkKLSAgewotICAgIHJldHVybiBqYXZhQ2xhc3M7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NRTmFtZSgpCi0gIHsKLSAgICAgIHFuYW1lID0gcHJveHlCZWFuOwotCSAgaWYgKHFuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoSkFWQV9FWFRFTlNJT04pKSB7Ci0JCSAgcW5hbWUgPSBxbmFtZS5zdWJzdHJpbmcoMCwocW5hbWUubGVuZ3RoKCkgLTUpKTsKLQkgIH0KLQkgIGlmIChxbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKENMQVNTX0VYVEVOU0lPTikpIHsKLQkJICBxbmFtZSA9IHFuYW1lLnN1YnN0cmluZygwLChxbmFtZS5sZW5ndGgoKSAtNikpOwotCSAgfQotICAgfQotICAgICAgCi0gIC8qKgotICAqIEdldCB0aGUgamF2YSBtb2RlbCBmcm9tIHRoZSByZXNvdXJjZSB0aGVuIAotICAqIGJ1aWxkIHRoZSBtb2RlbCBmcm9tIHRoZSBtb2YKLSAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotIAkvL2p1c3QgbWFrZSBzdXJlIHRoZSBwcm9qZWN0IGFuZCBxbmFtZSBhcmUgdGhlcmUKLSAgCS8vdGhleSBhcmUgZXNzZW50aWFsIGZvciB0aGlzIG9wZXJhdGlvbgotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAJSVByb2plY3QgY2xpZW50SVByb2plY3QgPSAoSVByb2plY3QpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoY2xpZW50UHJvamVjdCk7Ci0gIAlwcm9jZXNzUU5hbWUoKTsKLSAgCWlmKGNsaWVudFByb2plY3QgPT0gbnVsbCB8fCBxbmFtZSA9PSBudWxsKQotICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfV0FSTl9VTkFCTEVfVE9fRklORF9QUk9YWSIpLFN0YXR1cy5XQVJOSU5HKTsKLSAgCQotICAgIEphdmFFTUZOYXR1cmUgbmF0dXJlID0gKEphdmFFTUZOYXR1cmUpSmF2YUVNRk5hdHVyZS5nZXRSdW50aW1lKGNsaWVudElQcm9qZWN0KTsKLSAgICBpZihuYXR1cmUgPT0gbnVsbCl7Ci0gICAgICB0cnl7Ci0gICAgICAgIG5hdHVyZSA9IChKYXZhRU1GTmF0dXJlKUphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShjbGllbnRJUHJvamVjdCk7ICAJCi0gICAgICB9Y2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpe30KLSAgICB9Ci0gICAgcmVzb3VyY2VTZXQgPSBuYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKTsKLSAgICBqYXZhQ2xhc3MgPSAoSmF2YUhlbHBlcnMpSmF2YUNsYXNzSW1wbC5yZWZsZWN0KHFuYW1lLCByZXNvdXJjZVNldCk7IAotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgCXRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLSAgCi0gfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9NYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9NYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2M3ZGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLS8qKgotICogQGF1dGhvciBzZW5ncGwKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUSU9OID0gIlN0YXJ0IFdlYiBQcm9qZWN0IjsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgTEFCRUwgPSAiU2VydmVyU3RhcnRVcE1hbmFnZXIiOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkKLQlwcml2YXRlIEJvb2xlYW4gaXNTdGFydFNlcnZpY2VFbmFibGVkXzsKLQlwcml2YXRlIEJvb2xlYW4gaXNUZXN0U2VydmljZUVuYWJsZWRfOwotCQotCXByaXZhdGUgSVByb2plY3Qgc2VydmljZVByb2plY3RfOwotCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSWRfOwotCXByaXZhdGUgSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotCQotCXByaXZhdGUgSVByb2plY3Qgc2FtcGxlUHJvamVjdF87Ci0JcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlkXzsKLQlwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfOwotCQotCXByaXZhdGUgYm9vbGVhbiBpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXzsKLQotCS8qKgotCSAqIERlZmF1bHQgQ1RPUjsKLQkgKi8KLQlwdWJsaWMgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQoKSB7Ci0JCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZAotCSAqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JewotCSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLQkgICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLnJlcG9ydChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiUFJPR1JFU1NfSU5GT19TVEFSVF9XRUJfUFJPSkVDVCIpKTsKLQkgCi0JICAgIGlmIChpc1N0YXJ0U2VydmljZUVuYWJsZWRfLmJvb2xlYW5WYWx1ZSgpICYmIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8hPW51bGwpewotCSAgICAJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNhbGxpbmcgc2VydmljZSBzZXJ2ZXIgc3RhcnQ6ICIrc2VydmljZVByb2plY3RfKyIgICIrc2VydmljZVNlcnZlclR5cGVJZF8pOwotCSAgICAJU3RhcnRQcm9qZWN0Q29tbWFuZCBzcGMgPSBuZXcgU3RhcnRQcm9qZWN0Q29tbWFuZCgpOwotCSAgICAJc3BjLnNldFNlcnZpY2VQcm9qZWN0KHNlcnZpY2VQcm9qZWN0Xyk7Ci0JICAgIAlzcGMuc2V0U2VydmljZVNlcnZlclR5cGVJRChzZXJ2aWNlU2VydmVyVHlwZUlkXyk7Ci0JICAgIAlzcGMuc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8pOwotCSAgICAJc3BjLnNldElzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQoaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF8pOwotCSAgICAJc3BjLmV4ZWN1dGUoZW52KTsKLQkgICAgfQotCSAgICAKLQkgICAgaWYoaXNUZXN0U2VydmljZUVuYWJsZWRfLmJvb2xlYW5WYWx1ZSgpJiYgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfIT1udWxsICYmIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8hPW51bGwgJiYgIXNhbXBsZUV4aXN0aW5nU2VydmVyXy5lcXVhbHMoc2VydmljZUV4aXN0aW5nU2VydmVyXykpewotCSAgICAJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNhbGxpbmcgY2xpZW50IHNlcnZlciBzdGFydDogIitzYW1wbGVQcm9qZWN0XysiICAiK3NhbXBsZUV4aXN0aW5nU2VydmVyX18pOwotCSAgICAJU3RhcnRQcm9qZWN0Q29tbWFuZCBzcGMgPSBuZXcgU3RhcnRQcm9qZWN0Q29tbWFuZCgpOwotCSAgICAJc3BjLnNldFNhbXBsZVByb2plY3Qoc2FtcGxlUHJvamVjdF8pOwotCSAgICAJc3BjLnNldFNhbXBsZVNlcnZlclR5cGVJRChzYW1wbGVTZXJ2ZXJUeXBlSWRfKTsKLQkgICAgCXNwYy5zZXRTYW1wbGVFeGlzdGluZ1NlcnZlcihzYW1wbGVFeGlzdGluZ1NlcnZlcl8pOwotCSAgICAJc3BjLnNldENyZWF0aW9uU2NlbmFyaW8obmV3IEJvb2xlYW4oImZhbHNlIikpOwotCSAgICAJc3BjLmV4ZWN1dGUoZW52KTsJICAgIAkKLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGlzU3RhcnRTZXJ2aWNlRW5hYmxlZCBUaGUgaXNTdGFydFNlcnZpY2VFbmFibGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydFNlcnZpY2UoQm9vbGVhbiBpc1N0YXJ0U2VydmljZUVuYWJsZWQpIHsKLQkJdGhpcy5pc1N0YXJ0U2VydmljZUVuYWJsZWRfID0gaXNTdGFydFNlcnZpY2VFbmFibGVkOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gaXNUZXN0U2VydmljZUVuYWJsZWQgVGhlIGlzVGVzdFNlcnZpY2VFbmFibGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZShCb29sZWFuIGlzVGVzdFNlcnZpY2VFbmFibGVkKSB7Ci0JCXRoaXMuaXNUZXN0U2VydmljZUVuYWJsZWRfID0gaXNUZXN0U2VydmljZUVuYWJsZWQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgVGhlIHNlcnZpY2VFeGlzdGluZ1NlcnZlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKSB7Ci0JCXRoaXMuc2VydmljZUV4aXN0aW5nU2VydmVyXyA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VydmljZVNlcnZlclR5cGVJZCBUaGUgc2VydmljZVNlcnZlclR5cGVJZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVNlcnZlclR5cGVJZChTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJZCkgewotCQl0aGlzLnNlcnZpY2VTZXJ2ZXJUeXBlSWRfID0gc2VydmljZVNlcnZlclR5cGVJZDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNlcnZpY2VQcm9qZWN0IFRoZSBzZXJ2aWNlUHJvamVjdCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpIHsKLQkJdGhpcy5zZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNhbXBsZUV4aXN0aW5nU2VydmVyIFRoZSBzYW1wbGVFeGlzdGluZ1NlcnZlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcikgewotCQl0aGlzLnNhbXBsZUV4aXN0aW5nU2VydmVyXyA9IHNhbXBsZUV4aXN0aW5nU2VydmVyOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc2FtcGxlUHJvamVjdCBUaGUgc2FtcGxlUHJvamVjdCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChJUHJvamVjdCBzYW1wbGVQcm9qZWN0KSB7Ci0JCXRoaXMuc2FtcGxlUHJvamVjdF8gPSBzYW1wbGVQcm9qZWN0OwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc2FtcGxlU2VydmVyVHlwZUlkIFRoZSBzYW1wbGVTZXJ2ZXJUeXBlSWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhbXBsZVNlcnZlclR5cGVJZChTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlkKSB7Ci0JCXRoaXMuc2FtcGxlU2VydmVyVHlwZUlkXyA9IHNhbXBsZVNlcnZlclR5cGVJZDsKLQl9CQotCQotCS8qKgotCSAqIEBwYXJhbSBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkIFRoZSBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKGJvb2xlYW4gaXNSZXN0YXJ0UHJvamVjdE5lZWRlZCkgewotCQl0aGlzLmlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfID0gaXNSZXN0YXJ0UHJvamVjdE5lZWRlZDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9QdWJsaXNoUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUHVibGlzaFByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZDY1MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9QdWJsaXNoUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUSU9OID0gIlB1Ymxpc2ggV2ViIFByb2plY3QiOwotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIExBQkVMICAgICAgID0gIlB1Ymxpc2hQcm9qZWN0Q29tbWFuZCI7Ci1wcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLXByaXZhdGUgU3RyaW5nIHByb2plY3Q7Ci1wcml2YXRlIFN0cmluZyBzZXJ2ZXJUeXBlSUQ7Ci1wcml2YXRlIElTZXJ2ZXIgZXhpc3RpbmdTZXJ2ZXI7Ci0KLQotLyoqCi0gKiBEZWZhdWx0IENUT1I7Ci0gKi8KLXB1YmxpYyBQdWJsaXNoUHJvamVjdENvbW1hbmQoKSB7Ci0gIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotICBzZXROYW1lKExBQkVMKTsgIAotICAvL1RPRE8gc2V0UnVuSW5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oZmFsc2UpOwotfQotCi0vKioKLSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAqLwotcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLXsKLSAgCi0gIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgdHJ5Ci0gIHsKLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIlBST0dSRVNTX0lORk9fUFVCTElTSF9XRUJfUFJPSkVDVCIgKSApOwotICAgIAotICAgIGlmIChwcm9qZWN0ID09IG51bGwpewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX05PVF9GT1VORCIpLCBTdGF0dXMuRVJST1IpOyAKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCQotICAgIElQcm9qZWN0IGlQcm9qZWN0ID0gKElQcm9qZWN0KVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHByb2plY3QpOwotICAgIElTZXJ2ZXIgaW5zdGFuY2UgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoaVByb2plY3QpLCBzZXJ2ZXJUeXBlSUQsIGV4aXN0aW5nU2VydmVyLCB0cnVlLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlNUQU5DRV9OT1RfRk9VTkQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgICBJU3RhdHVzIHJldHVybmVkU3RhdHVzID0gaW5zdGFuY2UucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICAgIHN0YXR1cyA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhyZXR1cm5lZFN0YXR1cyk7Ci0gICAgICAKLSAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyAoaW5zdGFuY2UucHVibGlzaChnZXRQcm9ncmVzc01vbml0b3IoKSkpOwotICAgICAgZW52LmdldExvZygpLmxvZyhMb2cuT0ssIDUwMjYsIHRoaXMsICJleGVjdXRlIiwgbmV3IFN0cmluZygicHJvamVjdD0iK3Byb2plY3QrIiBzdWNjZXNzZnVsbHkgcHVibGlzaGVkIikpOwotICAgICAgLy9Mb2cud3JpdGUoUHVibGlzaFByb2plY3RDb21tYW5kLmNsYXNzLCJleGVjdXRlIixMb2cuT0ssInByb2plY3Q9Iitwcm9qZWN0KyIgc3VjY2Vzc2Z1bGx5IHB1Ymxpc2hlZCIpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BVQkxJU0giKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLQotICB9Ci19Ci0KLQotcHVibGljIHZvaWQgc2V0UHJvamVjdChTdHJpbmcgcHJvamVjdCkKLXsKLSAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLX0KLQotcHVibGljIHZvaWQgc2V0U2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2ZXJUeXBlSUQpCi17Ci0gIHRoaXMuc2VydmVyVHlwZUlEID0gc2VydmVyVHlwZUlEOwotfQotCi1wdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcihJU2VydmVyIGV4aXN0aW5nU2VydmVyKQotewotICB0aGlzLmV4aXN0aW5nU2VydmVyID0gZXhpc3RpbmdTZXJ2ZXI7Ci19Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1Jlc3RvcmVCdWlsZFN0YXRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9SZXN0b3JlQnVpbGRTdGF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwZjU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1Jlc3RvcmVCdWlsZFN0YXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgUmVzdG9yZUJ1aWxkU3RhdGVDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBWYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyXzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfV0VCU0VSVklDRV9SRVNUT1JFX0JVSUxEIjsKLSAgcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX1dFQlNFUlZJQ0VfUkVTVE9SRV9CVUlMRCI7Ci0gIC8qKgotICAgKiBEZWZhdWx0IENUT1I7Ci0gICAqLwotICBwdWJsaWMgUmVzdG9yZUJ1aWxkU3RhdGVDb21tYW5kKCkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCi0gICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7ICAgIAotCi0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRBU0tfREVTQ19XRUJTRVJWSUNFX1JFU1RPUkVfQlVJTEQiKSk7Ci0KLSAgICBtYW5hZ2VyXy5yZXN0b3JlQXV0b0J1aWxkKCk7Ci0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAqIEBwYXJhbSBtYW5hZ2VyXyBUaGUgbWFuYWdlcl8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbk1hbmFnZXIoVmFsaWRhdGlvbk1hbmFnZXIgbWFuYWdlcikgewotICAgIHRoaXMubWFuYWdlcl8gPSBtYW5hZ2VyOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUmVzdG9yZVZhbGlkYXRpb25TdGF0ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUmVzdG9yZVZhbGlkYXRpb25TdGF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3ZGUxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1Jlc3RvcmVWYWxpZGF0aW9uU3RhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLnZhbGlkYXRlLlZhbGlkYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBSZXN0b3JlVmFsaWRhdGlvblN0YXRlQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBWYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyXzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfV0VCU0VSVklDRV9SRVNUT1JFX1ZBTElEQVRJT04iOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfV0VCU0VSVklDRV9SRVNUT1JFX1ZBTElEQVRJT04iOyAgCi0KLSAgcHJpdmF0ZSBib29sZWFuIHJ1blZhbGlkYXRpb25fOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1I7Ci0gICAqLwotICBwdWJsaWMgUmVzdG9yZVZhbGlkYXRpb25TdGF0ZUNvbW1hbmQoIGJvb2xlYW4gcnVuVmFsaWRhdGlvbiApCi0gIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOyAKLSAgICBydW5WYWxpZGF0aW9uXyA9IHJ1blZhbGlkYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRBU0tfREVTQ19XRUJTRVJWSUNFX1JFU1RPUkVfVkFMSURBVElPTiIpKTsKLQotICAgIG1hbmFnZXJfLnJlc3RvcmVWYWxpZGF0aW9uRm9yUHJvamVjdHMoIHJ1blZhbGlkYXRpb25fICk7ICAgIAotCi0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgdmFsaWRhdGlvbiBtYW5hZ2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25NYW5hZ2VyKFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICB0aGlzLm1hbmFnZXJfID0gbWFuYWdlcjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1NlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2ODA4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1NlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIlNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZCI7Ci0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIkVuc3VyZSBEZXBsb3lhYmxlIGlzIGFkZGVkIHRvIFNlcnZlciBDb25maWd1cmF0aW9uIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcml2YXRlIEJvb2xlYW4gY3JlYXRpb25TY2VuYXJpb18gPSBCb29sZWFuLlRSVUU7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0gIHByaXZhdGUgSVByb2plY3Qgc2FtcGxlUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSURfOwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSURfOwotICBwcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyXzsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVByb2plY3RVUkxfOwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVQcm9qZWN0VVJMXzsKLSAgCi0gIC8vYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfIGlzIHNldCB0byB0cnVlIGlmCi0gIC8vLSB0aGUgcHJvamVjdCBleGlzdHMgQU5ECi0gIC8vLSB0aGUgc2VydmVyIGV4aXN0cyAoaS5lLiB0aGlzIGNvbW1hbmQgZGlkIG5vdCBjcmVhdGUgaXQpIEFORAotICAvLy0gdGhpcyBjb21tYW5kIGFkZGVkIHRoZSBwcm9qZWN0IHRvIHRoZSBzZXJ2ZXIKLSAgcHJpdmF0ZSBib29sZWFuIGFkZGVkUHJvamVjdFRvU2VydmVyXyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQoKSB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotICAgIHNldE5hbWUoTEFCRUwpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUgotICAgKi8KLSAgcHVibGljIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZChib29sZWFuIGNyZWF0aW9uU2NlbmFyaW8pIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gICAgc2V0TmFtZShMQUJFTCk7Ci0gICAgY3JlYXRpb25TY2VuYXJpb18gPSBuZXcgQm9vbGVhbihjcmVhdGlvblNjZW5hcmlvKTsKLSAgfQotCi0gIC8qKgotICAgKiBleGVjdXRlCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0KLQkgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kIik7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIHRyeSB7Ci0KLSAgICAgIGlmICghKGNyZWF0aW9uU2NlbmFyaW9fLmJvb2xlYW5WYWx1ZSgpKSApCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgICAgIC8vIGRldGVybWluZSBjbGllbnQgb3Igc2VydmljZSBwcm9qZWN0Ci0gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgPyBzZXJ2aWNlUHJvamVjdF8gOiBzYW1wbGVQcm9qZWN0Xyk7Ci0gICAgICBpZiAocHJvamVjdCA9PSBudWxsKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotCi0gICAgICBzYW1wbGVTZXJ2ZXJUeXBlSURfID0gY2xpZW50SWRzXy5nZXRTZXJ2ZXJJZCgpOwotICAgICAgCi0gICAgICAvLyBkZXRlcm1pbmUgc2VydmljZSBvciBzYW1wbGUgc2VydmVyIGZhY3RvcnkgSWQKLSAgICAgIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQgPSAoKGNyZWF0aW9uU2NlbmFyaW9fLmJvb2xlYW5WYWx1ZSgpKSA/IHNlcnZpY2VTZXJ2ZXJUeXBlSURfIDogc2FtcGxlU2VydmVyVHlwZUlEXyk7Ci0KLSAgICAgIC8vIGdldCBhbiBJU2VydmVyIG9iamVjdDsgZWl0aGVyIGV4aXN0aW5nIG9yIGNyZWF0ZSBvbmUKLSAgICAgIElTZXJ2ZXIgc2VydmVyID0gKChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgPyBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfIDogc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfKTsKLSAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgewotICAgICAgCS8vIGZpbmQgZXhhY3Qgc2VydmVyIGZvciBnaXZlbiBwcm9qZWN0Ci0gICAgICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgICAgICBib29sZWFuIGZvdW5kU2VydmVyID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIGlmIChzZXJ2ZXJzW2ldLmVxdWFscyhzZXJ2ZXIpKQotICAgICAgICAgICAgZm91bmRTZXJ2ZXIgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmRTZXJ2ZXIpIHsKLSAgICAgICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBzZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCB0cnVlLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgCXJldHVybiBtbVN0YXR1czsgICAgICAgICAgICAKLSAgICAgICAgICBhZGRlZFByb2plY3RUb1NlcnZlcl8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKCEoY3JlYXRpb25TY2VuYXJpb18uYm9vbGVhblZhbHVlKCkpICYmIHNlcnZpY2VTZXJ2ZXJUeXBlSURfID09IHNhbXBsZVNlcnZlclR5cGVJRF8pIC8vQ2xpZW50Ci0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXIgPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHNlcnZlciA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlU2VydmVyKGVudiwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIHNlcnZlckZhY3RvcnlJZCwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkgewotICAgICAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ1JFQVRFX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBpZiBtb2R1bGUgaXMgYWxyZWFkeSBhc3NvY2lhdGVkCi0gICAgICAgIElNb2R1bGVbXSBwYXJlbnRNb2R1bGVzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKLSAgICAgICAgaWYgKHBhcmVudE1vZHVsZXMhPW51bGwgJiYgcGFyZW50TW9kdWxlcy5sZW5ndGghPTApIHsKLSAgICAgICAgICBpZiAoIVNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoc2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCkpIHsgICAgICAgIAotICAgICAgICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgc2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgdHJ1ZSwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgICAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAgICAgcmV0dXJuIG1tU3RhdHVzOyAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8KLSAgICAgIFN0cmluZyBwcm9qZWN0VVJMID0gUmVzb3VyY2VVdGlscy5nZXRXZWJQcm9qZWN0VVJMKHByb2plY3QsIHNlcnZlckZhY3RvcnlJZCwgc2VydmVyKTsKLSAgICAgIGlmIChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfID0gc2VydmVyOwotICAgICAgICBzZXJ2aWNlUHJvamVjdFVSTF8gPSBwcm9qZWN0VVJMOwotICAgICAgICBpZiAoc2VydmljZVNlcnZlclR5cGVJRF8uZXF1YWxzKHNhbXBsZVNlcnZlclR5cGVJRF8pICYmIGNsaWVudElkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpPT1udWxsKXsKLSAgICAgICAgCXNhbXBsZUV4aXN0aW5nU2VydmVyXyA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzYW1wbGVFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2ZXI7Ci0gICAgICAgIHNhbXBsZVByb2plY3RVUkxfID0gcHJvamVjdFVSTDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9CQURfU0VSVkVSX0NPTkZJRyIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkgewotICAgIHNlcnZpY2VQcm9qZWN0XyA9IHNlcnZpY2VQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChJUHJvamVjdCBzYW1wbGVQcm9qZWN0KSB7Ci0gICAgc2FtcGxlUHJvamVjdF8gPSBzYW1wbGVQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVNlcnZlclR5cGVJRChTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRCkgewotICAgIHNlcnZpY2VTZXJ2ZXJUeXBlSURfID0gc2VydmljZVNlcnZlclR5cGVJRDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVNlcnZlclR5cGVJRChTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEKSB7Ci0gICAgc2FtcGxlU2VydmVyVHlwZUlEXyA9IHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcikgewotICAgIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLQotICBwdWJsaWMgSVNlcnZlciBnZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoKSB7Ci0gICAgcmV0dXJuIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RJZCgpIHsKLQlTdHJpbmcgaWQgPSBudWxsOwotCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7Ci0KLQlpZiAoc2VydmljZUV4aXN0aW5nU2VydmVyXyE9bnVsbCl7Ci0JICB3YyA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8uY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkgIGlkID0gKHdjIT1udWxsID8gd2MuZ2V0SWQoKSA6IG51bGwpOwotCX0KLQotCXJldHVybiBpZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQoKXsKLQlTdHJpbmcgaWQgPSBudWxsOwotCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7Ci0JaWYgKHNhbXBsZUV4aXN0aW5nU2VydmVyXyE9bnVsbCl7Ci0JICB3YyA9IHNhbXBsZUV4aXN0aW5nU2VydmVyXy5jcmVhdGVXb3JraW5nQ29weSgpOwotCSAgaWQgPSAod2MhPW51bGwgPyB3Yy5nZXRJZCgpIDogbnVsbCk7Ci0JfQotCi0JcmV0dXJuIGlkOwotCQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyKSB7Ci0gICAgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLQotICBwdWJsaWMgSVNlcnZlciBnZXRTYW1wbGVFeGlzdGluZ1NlcnZlcigpIHsKLSAgICByZXR1cm4gc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUHJvamVjdFVSTCgpIHsKLSAgICByZXR1cm4gc2VydmljZVByb2plY3RVUkxfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVQcm9qZWN0VVJMKCkgewotICAgIHJldHVybiBzYW1wbGVQcm9qZWN0VVJMXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWQpewotICAJdGhpcy5jbGllbnRJZHNfID0gY2xpZW50SWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFkZGVkUHJvamVjdFRvU2VydmVyXy4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0QWRkZWRQcm9qZWN0VG9TZXJ2ZXIoKSB7Ci0gICAgcmV0dXJuIGFkZGVkUHJvamVjdFRvU2VydmVyXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TdGFydFByb2plY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1N0YXJ0UHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwNjE3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1N0YXJ0UHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTdGFydFByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVElPTiA9ICJTdGFydCBXZWIgUHJvamVjdCI7Ci1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgTEFCRUwgPSAiU3RhcnRQcm9qZWN0Q29tbWFuZCI7Ci1wcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLXByaXZhdGUgQm9vbGVhbiBjcmVhdGlvblNjZW5hcmlvXyA9IEJvb2xlYW4uVFJVRTsKLQotcHJpdmF0ZSBib29sZWFuIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfOwotcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci1wcml2YXRlIElQcm9qZWN0IHNhbXBsZVByb2plY3RfOwotcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRF87Ci1wcml2YXRlIFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSURfOwotcHJpdmF0ZSBJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci1wcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfOwotCi0vLyBybSBwcml2YXRlIE1vZGVsIG1vZGVsXzsKLQotLyoqCi0gKiBEZWZhdWx0IENUT1I7Ci0gKi8KLXB1YmxpYyBTdGFydFByb2plY3RDb21tYW5kKCkgewotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLQlzZXROYW1lKExBQkVMKTsgICAgCi0gICAgLy9UT0RPIHNldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLX0KLQotLyoqCi0gKiBEZWZhdWx0IENUT1I7Ci0gKi8KLXB1YmxpYyBTdGFydFByb2plY3RDb21tYW5kKGJvb2xlYW4gY3JlYXRpb25TY2VuYXJpbyApIHsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0Jc2V0TmFtZShMQUJFTCk7Ci0JCi0JLy9UT0RPIHNldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLQljcmVhdGlvblNjZW5hcmlvXyA9IG5ldyBCb29sZWFuKGNyZWF0aW9uU2NlbmFyaW8pOwotfQotCi0vKioKLSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAqLwotcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLXsKLSAgICAKLSAgCi0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLnJlcG9ydChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiUFJPR1JFU1NfSU5GT19TVEFSVF9XRUJfUFJPSkVDVCIpKTsKLSAgICAKLSAgICAKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gKChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgPyBzZXJ2aWNlUHJvamVjdF8gOiBzYW1wbGVQcm9qZWN0Xyk7Ci0gICAgU3RyaW5nIHNlcnZlclR5cGVJRCA9ICgoY3JlYXRpb25TY2VuYXJpb18uYm9vbGVhblZhbHVlKCkpID8gc2VydmljZVNlcnZlclR5cGVJRF8gOiBzYW1wbGVTZXJ2ZXJUeXBlSURfKTsKLSAgICBJU2VydmVyIHNlcnZlciA9ICgoY3JlYXRpb25TY2VuYXJpb18uYm9vbGVhblZhbHVlKCkpID8gc2VydmljZUV4aXN0aW5nU2VydmVyXyA6IHNhbXBsZUV4aXN0aW5nU2VydmVyXyk7ICAgCi0gICAgaWYgKHNlcnZlclR5cGVJRCA9PSBudWxsICYmIHNlcnZlciE9bnVsbCkgewotICAgIAlzZXJ2ZXJUeXBlSUQgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgfQotICAgIGlmIChwcm9qZWN0ID09IG51bGwpCi0gICAgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX05PVF9GT1VORCIpLCBTdGF0dXMuRVJST1IpOyAgCi0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0JCi0gICAgSVNlcnZlciBpbnN0YW5jZSA9IFNlcnZlclV0aWxzLmdldFNlcnZlckZvck1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgc2VydmVyVHlwZUlELCBzZXJ2ZXIsIHRydWUsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOU1RBTkNFX05PVF9GT1VORCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgIHRyeQotICAgCXsKLSAgIAkJQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSBudWxsOwotICAgCQlXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSByZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAJc3RhcnRTZXJ2ZXJDb21tYW5kID0gKEFic3RyYWN0U3RhcnRTZXJ2ZXIpcmVnLmdldFNlcnZlclN0YXJ0QnlUeXBlSWQoaW5zdGFuY2UuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgIAlzdGFydFNlcnZlckNvbW1hbmQuU3RhcnRTZXJ2ZXIocHJvamVjdCwgaW5zdGFuY2UsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpLCBpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXyk7Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAJfQotICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApCi0gIAl7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAJc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9Ci0gICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAJewotICAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0VSVkVSIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgCSAgIHJldHVybiBzdGF0dXM7Ci0gICAJfQotICAgCi19Ci0KLXB1YmxpYyB2b2lkIHNldENyZWF0aW9uU2NlbmFyaW8oQm9vbGVhbiBjcmVhdGlvblNjZW5hcmlvKQotewotCWNyZWF0aW9uU2NlbmFyaW9fID0gY3JlYXRpb25TY2VuYXJpbzsKLX0KLQotcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpCi17Ci0gIHNlcnZpY2VQcm9qZWN0XyA9IHNlcnZpY2VQcm9qZWN0OwotfQotCi1wdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KElQcm9qZWN0IHNhbXBsZVByb2plY3QpCi17Ci0gIHNhbXBsZVByb2plY3RfID0gc2FtcGxlUHJvamVjdDsKLX0KLQotcHVibGljIHZvaWQgc2V0U2VydmljZVNlcnZlclR5cGVJRChTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRCkKLXsKLSAgc2VydmljZVNlcnZlclR5cGVJRF8gPSBzZXJ2aWNlU2VydmVyVHlwZUlEOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRCkKLXsKLSAgc2FtcGxlU2VydmVyVHlwZUlEXyA9IHNhbXBsZVNlcnZlclR5cGVJRDsKLX0KLQotcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKQotewotICBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfID0gc2VydmljZUV4aXN0aW5nU2VydmVyOwotICBpZiAoc2VydmljZUV4aXN0aW5nU2VydmVyXyAhPSBudWxsKQotICAgIHNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoc2VydmljZUV4aXN0aW5nU2VydmVyXy5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNhbXBsZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpCi17Ci0gIHNhbXBsZUV4aXN0aW5nU2VydmVyXyA9IHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICBpZiAoc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfICE9IG51bGwpCi0gICAgc2V0U2FtcGxlU2VydmVyVHlwZUlEKHNhbXBsZUV4aXN0aW5nU2VydmVyXy5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldElzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQoYm9vbGVhbiB3ZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCkKLXsKLSAgaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF8gPSB3ZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZDsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TdGFydFRvbWNhdFNlcnZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TdGFydFRvbWNhdFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDhiYzRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU3RhcnRUb21jYXRTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotcHVibGljIGNsYXNzIFN0YXJ0VG9tY2F0U2VydmVyIGV4dGVuZHMgQWJzdHJhY3RTdGFydFNlcnZlciB7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmFyc1RvQ2xhc3NQYXRoKElTZXJ2ZXIgdEluc3RhbmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlbW90ZVNlcnZlclBhdGgoSVNlcnZlciBzZXJ2ZXIpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcFNlcnZlcihJU2VydmVyIHNlcnZlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCi0JCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJc2VydmVyLnN5bmNocm9ub3VzU3RvcChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vRm9sZGVyUmVzb3VyY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0ZvbGRlclJlc291cmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDMyOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vRm9sZGVyUmVzb3VyY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5BbnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci0KLQotLyoqCi0qIFRoaXMgaXMgYSBraW5kIG9mIHtAbGluayBGaWx0ZXJ9IHRoYXQgYWNjZXB0cyBvbmx5IG9iamVjdHMKLSogd2hpY2ggaW5kaWNhdGUgYSBKYXZhIHJlc291cmNlLiBJbiBwYXJ0aWN1bGFyLCBhbnkKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZX0gd2hvc2UKLSogcGF0aG5hbWUsIG9yIGFueSBvYmplY3Qgd2hvc2Ugc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFzCi0qIHJldHVybmVkIGJ5IDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+LCBlbmRzIGluCi0qICI8Y29kZT4uamF2YTwvY29kZT4iIG9yICI8Y29kZT4uY2xhc3M8L2NvZGU+IiB3aWxsIGJlIGFjY2VwdGVkLgotKiBBbGwgb3RoZXIgb2JqZWN0cyB3aWxsIGJlIHJlamVjdGVkLgotKi8KLXB1YmxpYyBjbGFzcyBGb2xkZXJSZXNvdXJjZUZpbHRlciBleHRlbmRzIEFueUZpbHRlcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyPC9jb2RlPiB0aGF0IGZpbHRlcnMKLSAgKiAiPGNvZGU+LmphdmE8L2NvZGU+IiBhbmQgIjxjb2RlPi5jbGFzczwvY29kZT4iIG9iamVjdHMuCi0gICogRXF1aXZhbGVudCB0byA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXIoQUxMX0ZJTEVTKTwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBGb2xkZXJSZXNvdXJjZUZpbHRlciAoKSB7IH0KLQotIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZPTERFUl9GSUxURVJfTkFNRSIpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlRk9MREVSX0ZJTFRFUl9ERVNDIik7Ci0gIH0KLQotIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgMCwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVGSUxURVJfTVNHX0VSUk9SX05VTExfT0JKRUNUIiksCi0gICAgICAgIG51bGwKLSAgICAgICk7Ci0gICAgfQotCi0gICAgU3RyaW5nIG5hbWUgPSBudWxsOwotCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKW9iamVjdDsKLSAgICAgIG5hbWUgPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GT0xERVIpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAgIDAsCi0gICAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVGSUxURVJfTVNHX0VSUk9SX05PVF9GT0xERVIiLG5ldyBPYmplY3RbXSB7bmFtZX0pLAotICAgICAgICAgIG51bGwKLSAgICAgICAgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwiIixudWxsKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBhY2NlcHRzTmFtZSAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9JU2VydmVyRGVmYXVsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9JU2VydmVyRGVmYXVsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWYxZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vSVNlcnZlckRlZmF1bHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotCi0vKioKLSAqIEltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBwcm92aWRlIGxvZ2ljIHRoYXQgY2FuIGJlIHBsdWdnZWQgaW50bwotICogdGhlIHNlcnZlciBkZWZhdWx0aW5nIGFsZ29yaXRobS4gCi0gKiAoU2VlIHRoZSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24uc2VydmVyRGVmYXVsdGVyIGV4dGVuc2lvbiBwb2ludCkgIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJEZWZhdWx0ZXIKLXsKLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gcHJvamVjdAotICAgKiBAcmV0dXJuIFNlcnZlckluZm8uIAotICAgKiBJZiBubyBleGlzdGluZyBzZXJ2ZXIgb3Igc2VydmVyIHR5cGUgaXMgcmVjb21tZW5kZWQsIHJldHVybiBudWxsLgotICAgKiBJZiBhIHNlcnZlciB0eXBlIGlzIHJlY29tbWVuZGVkLCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgU2VydmVySW5mbyB3aXRoIGEgbm9uLW51bGwKLSAgICogbm9uLWVtcHR5IFN0cmluZyBmb3IgdGhlIHNlcnZlckZhY3RvcnlJZCBhbmQgbnVsbCBmb3IgdGhlIHNlcnZlckluc3RhbmNlSWQuCi0gICAqIElmIGEgc2VydmVyIGluc3RhbmNlIGlzIHJlY29tbWVuZGVkLCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgU2VydmVySW5mbyB3aXRoIGEgbm9uLW51bGwKLSAgICogbm9uLWVtcHR5IFN0cmluZyBmb3IgdGhlIHNlcnZlckZhY3RvcnlJZCBhbmQgdGhlIHNlcnZlckluc3RhbmNlSWQuCi0gICAqLwotICBwdWJsaWMgU2VydmVySW5mbyByZWNvbW1lbmREZWZhdWx0U2VydmVyKElQcm9qZWN0IHByb2plY3QpOwotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0phdmFSZXNvdXJjZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vSmF2YVJlc291cmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDRmOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vSmF2YVJlc291cmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkFueUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLQotCi0vKioKLSogVGhpcyBpcyBhIGtpbmQgb2Yge0BsaW5rIEZpbHRlcn0gdGhhdCBhY2NlcHRzIG9ubHkgb2JqZWN0cwotKiB3aGljaCBpbmRpY2F0ZSBhIEphdmEgcmVzb3VyY2UuIEluIHBhcnRpY3VsYXIsIGFueQotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSB3aG9zZQotKiBwYXRobmFtZSwgb3IgYW55IG9iamVjdCB3aG9zZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYXMKLSogcmV0dXJuZWQgYnkgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4sIGVuZHMgaW4KLSogIjxjb2RlPi5qYXZhPC9jb2RlPiIgb3IgIjxjb2RlPi5jbGFzczwvY29kZT4iIHdpbGwgYmUgYWNjZXB0ZWQuCi0qIEFsbCBvdGhlciBvYmplY3RzIHdpbGwgYmUgcmVqZWN0ZWQuCi0qLwotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZUZpbHRlciBleHRlbmRzIEFueUZpbHRlcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIEEgPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyPC9jb2RlPiBjb25zdHJ1Y3RlZCB3aXRoIHRoaXMgdmFsdWUgd2lsbAotICAqIGFjY2VwdCAiPGNvZGU+LmphdmE8L2NvZGU+IiwgYnV0IG5vdCAiPGNvZGU+LmNsYXNzPC9jb2RlPiIsIG9iamVjdHMuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBKQVZBX0ZJTEVTID0gKGJ5dGUpMTsKLQotICAvKioKLSAgKiBBIDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gY29uc3RydWN0ZWQgd2l0aCB0aGlzIHZhbHVlIHdpbGwKLSAgKiBhY2NlcHQgIjxjb2RlPi5jbGFzczwvY29kZT4iLCBidXQgbm90ICI8Y29kZT4uamF2YTwvY29kZT4iLCBvYmplY3RzLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ0xBU1NfRklMRVMgPSAoYnl0ZSkyOwotCi0gIC8qKgotICAqIEEgPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyPC9jb2RlPiBjb25zdHJ1Y3RlZCB3aXRoIHRoaXMgdmFsdWUgd2lsbAotICAqIGFjY2VwdCBib3RoICI8Y29kZT4uamF2YTwvY29kZT4iIGFuZCAiPGNvZGU+LmNsYXNzPC9jb2RlPiIgb2JqZWN0cy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEFMTF9GSUxFUyA9IChieXRlKTI1NTsKLQotICBwcml2YXRlIGJ5dGUgZXh0ZW5zaW9uc187Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXI8L2NvZGU+IHRoYXQgZmlsdGVycwotICAqICI8Y29kZT4uamF2YTwvY29kZT4iIGFuZCAiPGNvZGU+LmNsYXNzPC9jb2RlPiIgb2JqZWN0cy4KLSAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcihBTExfRklMRVMpPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIEphdmFSZXNvdXJjZUZpbHRlciAoKQotICB7Ci0gICAgdGhpcyhBTExfRklMRVMpOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXI8L2NvZGU+IHRoYXQgZmlsdGVycwotICAqICI8Y29kZT4uamF2YTwvY29kZT4iIG9iamVjdHMsICI8Y29kZT4uY2xhc3M8L2NvZGU+IiBvYmplY3RzLAotICAqIG9yIGJvdGggaWYgdGhlIHZhbHVlIG9mIDxjb2RlPmV4dGVuc2lvbnM8L2NvZGU+IGlzCi0gICoge0BsaW5rICNKQVZBX0ZJTEVTfSwge0BsaW5rICNDTEFTU19GSUxFU30gb3Ige0BsaW5rICNBTExfRklMRVN9Ci0gICogcmVzcGVjdGl2ZWx5LgotICAqIEBwYXJhbSBleHRlbnNpb25zIE9uZSBvZgotICAqIHtAbGluayAjSkFWQV9GSUxFU30sIHtAbGluayAjQ0xBU1NfRklMRVN9IG9yIHtAbGluayAjQUxMX0ZJTEVTfS4KLSAgKi8KLSAgcHVibGljIEphdmFSZXNvdXJjZUZpbHRlciAoIGJ5dGUgZXh0ZW5zaW9ucyApCi0gIHsKLSAgICBleHRlbnNpb25zXyA9IGV4dGVuc2lvbnM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVKQVZBX0ZJTFRFUl9OQU1FIik7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVKQVZBX0ZJTFRFUl9ERVNDIik7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30KLSAgKiBkZXNjcmliaW5nIHRoZSA8Y29kZT5GaWx0ZXI8L2NvZGU+J3MgYXNzZXNzbWVudCBvZgotICAqIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqIFNlZSB7QGxpbmsgRmlsdGVyI3N0YXR1c09mfSBmb3IgZ2VuZXJhbCBjb21tZW50cy4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gQW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgaWYgdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4KLSAgKiByZXByZXNlbnRzIGEgSmF2YSByZXNvdXJjZS4KLSAgKi8KLSAgcHVibGljIElTdGF0dXMgc3RhdHVzT2YgKCBPYmplY3Qgb2JqZWN0ICkKLSAgewotICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAwLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZJTFRFUl9NU0dfRVJST1JfTlVMTF9PQkpFQ1QiKSwKLSAgICAgICAgbnVsbAotICAgICAgKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2Upb2JqZWN0OwotICAgICAgbmFtZSA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAgIDAsCi0gICAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVGSUxURVJfTVNHX0VSUk9SX05PVF9GSUxFIixuZXcgT2JqZWN0W10ge25hbWV9KSwKLSAgICAgICAgICBudWxsCi0gICAgICAgICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lID0gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgaWYgKCFhY2NlcHRzTmFtZShuYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAwLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUpBVkFfRklMVEVSX01TR19FUlJPUl9XUk9OR19FWFRFTlNJT04iLG5ldyBPYmplY3RbXSB7bmFtZX0pLAotICAgICAgICBudWxsCi0gICAgICApOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsIiIsbnVsbCk7Ci0gIH0KLQotICAvLwotICAvLyBDaGVja3MgaWYgdGhlIGdpdmVuIG5hbWUgaXMgYWNjZXB0YWJsZSBiYXNlZCB1cG9uIGl0cyBleHRlbnNpb24KLSAgLy8gYW5kIHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZW5zaW9uc18gYml0bWFzay4KLSAgLy8KLSAgcHJpdmF0ZSBib29sZWFuIGFjY2VwdHNOYW1lICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgcmV0dXJuICggCi0gICAgICAobmFtZS5lbmRzV2l0aCgiLmphdmEiKSAmJiAoKGV4dGVuc2lvbnNfICYgSkFWQV9GSUxFUykgIT0gMCkpIHx8Ci0gICAgICAobmFtZS5lbmRzV2l0aCgiLmNsYXNzIikgJiYgKChleHRlbnNpb25zXyAmIENMQVNTX0ZJTEVTKSAhPSAwKSkKLSAgICApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9NYXBwaW5nVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL01hcHBpbmdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWU4NGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL01hcHBpbmdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci0KLQotLyoqCi0qIFRoaXMgY2xhc3MgY29udGFpbnMgdXNlZnVsIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBTZXJ2ZXIgcGx1Z2luIGZ1bmN0aW9ucwotKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXBwaW5nVXRpbHMKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVJWSUNFX0VYVCA9ICJTZXJ2aWNlLndzZGwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CSU5ESU5HX0VYVCA9ICJCaW5kaW5nLndzZGwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WNF9TRVJWSUNFX0VYVCA9ICItc2VydmljZS53c2RsIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVjRfQklORElOR19FWFQgPSAiLWJpbmRpbmcud3NkbCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0VYVEVOU0lPTiA9ICIud3NkbCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZPTERFUiA9ICJ3c2RsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TS0VMRVRPTl9QQUNLQUdFTkFNRSA9ICJzZXJ2aWNlIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBXU0RMIGZvbGRlciBwYXRoCi0gICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJUGF0aCBnZXRXU0RMRm9sZGVyUGF0aCAoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIElQYXRoIHdzZGxGb2xkZXI9bnVsbDsKLS8vICAJSVBhdGggd2ViTW9kdWxlU2VydmVyUm9vdCA9IFJlc291cmNlVXRpbHMuZ2V0V2ViTW9kdWxlU2VydmVyUm9vdCggcHJvamVjdCApLmdldEZ1bGxQYXRoKCk7Ci0gIAlJUGF0aCB3ZWJNb2R1bGVTZXJ2ZXJSb290ID0gSjJFRVV0aWxzLmdldEZpcnN0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0gIAlpZiAod2ViTW9kdWxlU2VydmVyUm9vdCAhPSBudWxsICkKLSAgCQl3c2RsRm9sZGVyID0gd2ViTW9kdWxlU2VydmVyUm9vdC5hcHBlbmQoV1NETF9GT0xERVIpOwotICAgIHJldHVybiB3c2RsRm9sZGVyOwotICB9Ci0gICAgCi0KLSAgIC8qKgotICAqIFJldHVybnMgdGhlIGJhc2UgbmFtZSBiYXNlZCBvbiBXU0RMIGZpbGUgbmFtZQotICAqIEBwYXJhbSB3c2RsTmFtZSBXU0RMIGZpbGUgbmFtZQotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlTmFtZSAoU3RyaW5nIHdzZGxMb2NhdGlvbiApCi0gIHsKLSAgCVN0cmluZyB3c2RsTmFtZT13c2RsTG9jYXRpb247Ci0gIAkKLSAgCWludCBpbmRleCA9IHdzZGxMb2NhdGlvbi5sYXN0SW5kZXhPZignLycpOwotICAgIGlmIChpbmRleCE9IC0xKSB7Ci0gICAgICB3c2RsTmFtZSA9IHdzZGxMb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgrMSx3c2RsTmFtZS5sZW5ndGgoKSk7Ci0gICAgfQotICAgIAotICAgIFN0cmluZyBiYXNlTmFtZT13c2RsTmFtZTsKLSAgICBpZiAoIHdzZGxOYW1lLmVuZHNXaXRoKERFRkFVTFRfU0VSVklDRV9FWFQpICkgewotICAgICAgYmFzZU5hbWUgPSB3c2RsTmFtZS5zdWJzdHJpbmcoMCwod3NkbE5hbWUubGVuZ3RoKCkgLSBERUZBVUxUX1NFUlZJQ0VfRVhULmxlbmd0aCgpKSk7Ci0gICAgfSBlbHNlIGlmICggd3NkbE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChERUZBVUxUX1Y0X1NFUlZJQ0VfRVhUKSApIHsKLSAgICAgIGJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpIC0gREVGQVVMVF9WNF9TRVJWSUNFX0VYVC5sZW5ndGgoKSkpOwotICAgIH0gZWxzZSBpZiAod3NkbE5hbWUuZW5kc1dpdGgoREVGQVVMVF9CSU5ESU5HX0VYVCkpIHsKLSAgICAgIGJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpLURFRkFVTFRfQklORElOR19FWFQubGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgaWYgKHdzZGxOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoREVGQVVMVF9WNF9CSU5ESU5HX0VYVCkpIHsKLSAgICAgIGJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpLURFRkFVTFRfVjRfQklORElOR19FWFQubGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgaWYgKHdzZGxOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoV1NETF9FWFRFTlNJT04pKSB7Ci0gICAgCWJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpIC0gV1NETF9FWFRFTlNJT04ubGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gbm8gcmVjb2duaXphYmxlIHN1ZmZpeCwganVzdCByZW1vdmUgZXh0ZW5zaW9uLCBpZiBhbnkKLSAgICAgIGludCBpbmRleDQgPSBiYXNlTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgaWYgKGluZGV4NCE9LTEpCi0gICAgICAgIGJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4NCk7Ci0gICAgfQotICAgIHJldHVybiBiYXNlTmFtZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9Qcm9wZXJ0aWVzUmVzb3VyY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1Byb3BlcnRpZXNSZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDZiMmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1Byb3BlcnRpZXNSZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5BbnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci0KLQotLyoqCi0qIFRoaXMgaXMgYSBraW5kIG9mIHtAbGluayBGaWx0ZXJ9IHRoYXQgYWNjZXB0cyBvbmx5IG9iamVjdHMKLSogd2hpY2ggaW5kaWNhdGUgYSBKYXZhIHJlc291cmNlLiBJbiBwYXJ0aWN1bGFyLCBhbnkKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZX0gd2hvc2UKLSogcGF0aG5hbWUsIG9yIGFueSBvYmplY3Qgd2hvc2Ugc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFzCi0qIHJldHVybmVkIGJ5IDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+LCBlbmRzIGluCi0qICI8Y29kZT4uamF2YTwvY29kZT4iIG9yICI8Y29kZT4uY2xhc3M8L2NvZGU+IiB3aWxsIGJlIGFjY2VwdGVkLgotKiBBbGwgb3RoZXIgb2JqZWN0cyB3aWxsIGJlIHJlamVjdGVkLgotKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzUmVzb3VyY2VGaWx0ZXIgZXh0ZW5kcyBBbnlGaWx0ZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gdGhhdCBmaWx0ZXJzCi0gICogIjxjb2RlPi5qYXZhPC9jb2RlPiIgYW5kICI8Y29kZT4uY2xhc3M8L2NvZGU+IiBvYmplY3RzLgotICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyKEFMTF9GSUxFUyk8L2NvZGU+LgotICAqLwotICBwdWJsaWMgUHJvcGVydGllc1Jlc291cmNlRmlsdGVyICgpCi0gIHsKLSAgICAKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJVBST1BFUlRJRVNfRklMVEVSX05BTUUiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJVBST1BFUlRJRVNfRklMVEVSX0RFU0MiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogU2VlIHtAbGluayBGaWx0ZXIjc3RhdHVzT2Z9IGZvciBnZW5lcmFsIGNvbW1lbnRzLgotICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBmaWx0ZXIuCi0gICogQHJldHVybiBBbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBpZiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPgotICAqIHJlcHJlc2VudHMgYSBKYXZhIHJlc291cmNlLgotICAqLwotICBwdWJsaWMgSVN0YXR1cyBzdGF0dXNPZiAoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgIDAsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlRklMVEVSX01TR19FUlJPUl9OVUxMX09CSkVDVCIpLAotICAgICAgICBudWxsCi0gICAgICApOwotICAgIH0KLQotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgICAgMCwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZJTFRFUl9NU0dfRVJST1JfTk9UX0ZJTEUiLG5ldyBPYmplY3RbXSB7bmFtZX0pLAotICAgICAgICAgIG51bGwKLSAgICAgICAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWUgPSBvYmplY3QudG9TdHJpbmcoKTsKLSAgICB9Ci0KLQlpZiAoIW5hbWUuZW5kc1dpdGgoIi5wcm9wZXJ0aWVzIikpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgMCwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVQUk9QRVJUSUVTX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OIixuZXcgT2JqZWN0W10ge25hbWV9KSwKLSAgICAgICAgbnVsbAotICAgICAgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLCIiLG51bGwpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1NlcnZlckluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1NlcnZlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyNWNiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9TZXJ2ZXJJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckluZm8KLXsKLSAgU3RyaW5nIHNlcnZlckZhY3RvcnlJZDsKLSAgU3RyaW5nIHNlcnZlckluc3RhbmNlSWQ7Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlckZhY3RvcnlJZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyRmFjdG9yeUlkKCkKLSAgewotICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgVGhlIHNlcnZlckZhY3RvcnlJZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAgIHRoaXMuc2VydmVyRmFjdG9yeUlkID0gc2VydmVyRmFjdG9yeUlkOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlckluc3RhbmNlSWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckluc3RhbmNlSWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZlckluc3RhbmNlSWQ7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2ZXJJbnN0YW5jZUlkIFRoZSBzZXJ2ZXJJbnN0YW5jZUlkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0gIHsKLSAgICB0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9XU0RMUmVzb3VyY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dTRExSZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODcyZjZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dTRExSZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5BbnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci0KLQotLyoqCi0qIFRoaXMgaXMgYSBraW5kIG9mIHtAbGluayBGaWx0ZXJ9IHRoYXQgYWNjZXB0cyBvbmx5IG9iamVjdHMKLSogd2hpY2ggaW5kaWNhdGUgYSBXU0RMIHJlc291cmNlLiBJbiBwYXJ0aWN1bGFyLCBhbnkKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZX0gd2hvc2UKLSogcGF0aG5hbWUsIG9yIGFueSBvYmplY3Qgd2hvc2Ugc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFzCi0qIHJldHVybmVkIGJ5IDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+LCBlbmRzIGluCi0qICI8Y29kZT4ud3NkbDwvY29kZT4iIHdpbGwgYmUgYWNjZXB0ZWQuCi0qIEFsbCBvdGhlciBvYmplY3RzIHdpbGwgYmUgcmVqZWN0ZWQuCi0qLwotcHVibGljIGNsYXNzIFdTRExSZXNvdXJjZUZpbHRlciBleHRlbmRzIEFueUZpbHRlcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+V1NETFJlc291cmNlRmlsdGVyPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIFdTRExSZXNvdXJjZUZpbHRlciAoKQotICB7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVXU0RMX0ZJTFRFUl9OQU1FIik7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVXU0RMX0ZJTFRFUl9ERVNDIik7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30KLSAgKiBkZXNjcmliaW5nIHRoZSA8Y29kZT5GaWx0ZXI8L2NvZGU+J3MgYXNzZXNzbWVudCBvZgotICAqIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqIFNlZSB7QGxpbmsgRmlsdGVyI3N0YXR1c09mfSBmb3IgZ2VuZXJhbCBjb21tZW50cy4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gQW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgaWYgdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4KLSAgKiByZXByZXNlbnRzIGEgV1NETCByZXNvdXJjZS4KLSAgKi8KLSAgcHVibGljIElTdGF0dXMgc3RhdHVzT2YgKCBPYmplY3Qgb2JqZWN0ICkKLSAgewotICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAwLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZJTFRFUl9NU0dfRVJST1JfTlVMTF9PQkpFQ1QiKSwKLSAgICAgICAgbnVsbAotICAgICAgKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2Upb2JqZWN0OwotICAgICAgbmFtZSA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAgIDAsCi0gICAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVGSUxURVJfTVNHX0VSUk9SX05PVF9GSUxFIixuZXcgT2JqZWN0W10ge25hbWV9KSwKLSAgICAgICAgICBudWxsCi0gICAgICAgICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lID0gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIud3NkbCIpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgIDAsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlV1NETF9GSUxURVJfTVNHX0VSUk9SX1dST05HX0VYVEVOU0lPTiIsbmV3IE9iamVjdFtdIHtuYW1lfSksCi0gICAgICAgIG51bGwKLSAgICAgICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwiIixudWxsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMWYzZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmVjbGlwc2UuRWNsaXBzZUxvZzsKLQotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSByZWdpc3RyeSBvZiBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlIG9iamVjdHMuCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5Ci17Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgaW5zdGFuY2VfOwotICBwcml2YXRlIEhhc2h0YWJsZSBTdGFydFNlcnZlclR5cGVzOwotCi0gIC8vCi0gIC8vIExvYWRzIFdlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUgb2JqZWN0cyBpbnRvIHRoaXMgcmVnaXN0cnkuCi0gIC8vIFNlZSBtZXRob2QgZ2V0SW5zdGFuY2UoKS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGxvYWQgKCkKLSAgewotICAgIFN0YXJ0U2VydmVyVHlwZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZSIpOwotCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNvbmZpZy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGNvbmZpZ1tpZHhdOwotICAgICAgdHJ5IAotICAgICAgewotICAgICAgICAgIFN0cmluZyBmYWN0b3J5SWRfID0gZWxlbS5nZXRBdHRyaWJ1dGUoImZhY3RvcnlJZCIpOwotCQkgIFN0YXJ0U2VydmVyVHlwZXMucHV0KGZhY3RvcnlJZF8sIGVsZW0pOwotCSAgCi0gICAgICB9IAotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBFY2xpcHNlTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0gICAgICAgIGxvZy5sb2coTG9nLkVSUk9SLCA1MDQ3LCB0aGlzLCAibG9hZCIsIGUpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IGdldEluc3RhbmNlICgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5KCk7Ci0gICAgICBpbnN0YW5jZV8ubG9hZCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgIHB1YmxpYyBPYmplY3QgZ2V0U2VydmVyU3RhcnRCeVR5cGVJZCAoU3RyaW5nIHR5cGVJRCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgIHsKLSAgICBpZiAodHlwZUlEPT1udWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuICgoSUNvbmZpZ3VyYXRpb25FbGVtZW50KVN0YXJ0U2VydmVyVHlwZXMuZ2V0KHR5cGVJRCkpLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gIH0KLSAgCi0gICBwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZUVBUlJlcXVpcmVkKFN0cmluZyB0eXBlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgIAlpZiAodHlwZUlkIT1udWxsKSB7Ci0gICAJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gKElDb25maWd1cmF0aW9uRWxlbWVudClTdGFydFNlcnZlclR5cGVzLmdldCh0eXBlSWQpOwotICAgCQlpZiAoZWxlbSE9bnVsbCl7Ci0gICAJCQlTdHJpbmcgdmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZSgicmVtb3ZlRUFSIik7Ci0gICAJCQlpZiAodmFsdWUhPW51bGwpewotICAgCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICAgCQkJfQotICAgCQl9Ci0gICAJfQotCXJldHVybiB0cnVlOyAgIAkJIAotICAgfSAgIAotfQotCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXJyYXlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXJyYXlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwN2FhNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0FycmF5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YSBiZWFuLgotKiBOZWFyZXN0IG1vcmFsIGVxdWl2YWxlbnRzOiBqYXZhLmxhbmcuQ2xhc3MsIGphdmEuYmVhbnMuQmVhbkRlc2NyaXB0b3IuCi0qLwotcHVibGljIGNsYXNzIEFycmF5RWxlbWVudCBleHRlbmRzIFR5cGVFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSUkFZX05BTUUgPSAiMTAxMDEwMTBhcnJheTEwMTAxMDEwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX01FVEhPRFMgPSAicmVsbWV0aG9kcyI7Ci0gCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIAotICAqIEBwYXJhbSBwcm9qZWN0RWxlbWVudCBUaGUgcHJvamVjdCB0aGlzIEJlYW4gYmVsb25ncyB0by4KLSAgKi8KLSAgcHVibGljIEFycmF5RWxlbWVudCAoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzKG5hbWUsbmV3IEJhc2ljTW9kZWwoIlByb2plY3QiKSx0cnVlKTsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIAotICAqIEBwYXJhbSBwYXJhbWV0ZXJFbGVtZW50IFRoZSBwYXJhbWV0ZXIgdGhpcyBCZWFuIGJlbG9uZ3MgdG8uCi0gICovCi0gIHB1YmxpYyBBcnJheUVsZW1lbnQgKFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCxib29sZWFuIGlzUm9vdCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwsVHlwZUVsZW1lbnQuQVJSQVkpOwotICAgIGlmKGlzUm9vdCkgbW9kZWwuc2V0Um9vdEVsZW1lbnQodGhpcyk7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LlJPT1Q7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBQYXJhbWV0ZXJFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgYmVhbiBlbGVtZW50LgotICAqLwotICBwdWJsaWMgQXJyYXlFbGVtZW50ICggUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUscGFyYW1ldGVyRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQVJSQVkpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5QQVJBTUVURVJfT1dORVI7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBQYXJhbWV0ZXJFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgUGFyYW1ldGVyRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEFycmF5RWxlbWVudCAoIEF0dHJpYnV0ZUVsZW1lbnQgYXR0cmlidXRlRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGF0dHJpYnV0ZUVsZW1lbnQsVHlwZUVsZW1lbnQuUkVMX09XTkVSLFR5cGVFbGVtZW50LlJFTF9UWVBFLFR5cGVFbGVtZW50LkFSUkFZKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuQVRUUklCVVRFX09XTkVSOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgZm9yIHRoZSBjYXNlIHdoZW4gdGhpcyBpcyBub3QgdGhlIHJvb3Qgb2JqZWN0Ci0gICogaGVyZSBpdCByZXByZXNlbnRzIGNvbXBsZXggdHlwZXMKLSAgKiBAcGFyYW0gRmllbGRFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgUGFyYW1ldGVyRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEFycmF5RWxlbWVudCAoIEZpZWxkRWxlbWVudCBmaWVsZEVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxmaWVsZEVsZW1lbnQsVHlwZUVsZW1lbnQuUkVMX09XTkVSLFR5cGVFbGVtZW50LlJFTF9UWVBFLFR5cGVFbGVtZW50LkFSUkFZKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuRklFTERfT1dORVI7Ci0gIH0KLQotCi0gIC8qCi0gICogZGV0ZXJtaW5lIHdldGhlciB0aGlzIGlzIGFuIG9iamVjdCBhcnJheSBvcgotICAqIHByaW1pdGl2ZSBhcnJheQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiBBUlJBWV9OQU1FICsgZ2V0TmFtZSgpOwotICB9Ci0KLSAKLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BcnJheVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BcnJheVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4YzdlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXJyYXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHJlY29nbml6ZWQgcmV0dXJuIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIEFycmF5VHlwZSBleHRlbmRzIFJlY29nbml6ZWRSZXR1cm5UeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGZUeXBlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIEFycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICB0aGlzKFR5cGVGYWN0b3J5LkFSUkFZX05BTUUsdHlwZU5hbWUpOwotICB9Ci0KLSAgcHVibGljIEFycmF5VHlwZShTdHJpbmcgbmFtZSxTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgICBmVHlwZU5hbWUgPSB0eXBlTmFtZTsKLSAgfSAKLQotIAotICAgLyoqCi0gICogVGhpcyBpcyBiYXNpY2FsbHkgdGhlIGZ1bmN0aW9uIHRoYXQgZGljdGF0ZXMgaG93IHdlIHdhbnQgdG8gZGlzcGxheSB0aGlzIHR5cGUgCi0gICogdXBvbiByZWNlaXZpbmcgaXQgYXMgYSByZXR1cm4gZnJvbSBhIHByb3h5IG1ldGhvZAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIHR5cGUKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZGlzcGxheSBzdHJpbmcKLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSkKLSAgewotICAgICAKLSAgICBTdHJpbmcgbm9uQmVhbiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudXRpbC5MaXN0IGxpc3QiICsgZ2V0VW5pcXVlTmFtZSgpICsgIj0gamF2YS51dGlsLkFycmF5cy5hc0xpc3QoIiArIG5hbWUgKyAiKTsiICtTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wIisgZ2V0VW5pcXVlTmFtZSgpICsiID0gbGlzdCIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiLnRvU3RyaW5nKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JT10ZW1wIisgZ2V0VW5pcXVlTmFtZSgpICsiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIrIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0KLSAgICByZXR1cm4gbm9uQmVhbjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXR0cmlidXRlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0F0dHJpYnV0ZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwNjc5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXR0cmlidXRlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4gbWV0aG9kIHBhcmFtZXRlci4KLSogTmVhcmVzdCBtb3JhbCBlcXVpdmFsZW50czogamF2YS5iZWFucy5QYXJhbWV0ZXJEZXNjcmlwdG9yLgotKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50IGltcGxlbWVudHMgQXR0cmlidXRlRWxlbWVudFR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfVFlQRSA9ICJ0eXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX09XTklOR19CRUFOID0gIm93bmluZ2JlYW4iOwotCi0gIHByaXZhdGUgU3RyaW5nIGZTZXR0ZXJNZXRob2Q7Ci0gIHByaXZhdGUgU3RyaW5nIGZHZXR0ZXJNZXRob2Q7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgdGhpcyB0YWtlcyB0aGUgb3duaW5nIGJlYW4uCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgKiBAcGFyYW0gYmVhbkVsZW1lbnQgdGhlIGJlYW4gdGhhdCBvd25zIHRoaXMgYXR0cmlidXRlLgotICAqLwotICBwdWJsaWMgQXR0cmlidXRlRWxlbWVudCAoIEJlYW5FbGVtZW50IGJlYW5FbGVtZW50LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsYmVhbkVsZW1lbnQsUkVMX09XTklOR19CRUFOLEJlYW5FbGVtZW50LlJFTF9BVFRSSUJVVEVTKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2V0dGVyTWV0aG9kKFN0cmluZyBzZXR0ZXJNZXRob2QpCi0gIHsKLSAgICBmU2V0dGVyTWV0aG9kID0gc2V0dGVyTWV0aG9kOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXR0ZXJNZXRob2QoKQotICB7Ci0gICAgcmV0dXJuIGZTZXR0ZXJNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEdldHRlck1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gZkdldHRlck1ldGhvZDsKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXRHZXR0ZXJNZXRob2QoU3RyaW5nIGdldHRlck1ldGhvZCkKLSAgewotICAgIGZHZXR0ZXJNZXRob2QgPSBnZXR0ZXJNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNldHRlclNpZ25hdHVyZShTdHJpbmcgYXR0cmlidXRlKQotICB7Ci0gICAgaW50IGJyYWNrZXQgPSBmU2V0dGVyTWV0aG9kLmluZGV4T2YoIigiKTsKLSAgICBicmFja2V0Kys7Ci0gICAgU3RyaW5nIHNldHRlciA9IGZTZXR0ZXJNZXRob2Quc3Vic3RyaW5nKDAsYnJhY2tldCk7Ci0gICAgU3RyaW5nIGZ1bGxTZXR0ZXIgPSBzZXR0ZXIgKyBhdHRyaWJ1dGUgKyAiKTsiOwotICAgCi0gICAgcmV0dXJuIGZ1bGxTZXR0ZXI7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBCZWFuIHRoYXQgb3ducyB0aGlzIEF0dHJpYnV0ZS4KLSAgKiBAcmV0dXJuIEJlYW5FbGVtZW50IFRoZSBiZWFuIHRoYXQgb3ducyB0aGlzIGF0dHJpYnV0ZS4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50IGdldE93bmluZ0JlYW5FbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX09XTklOR19CRUFOKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCZWFuRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgdHlwZSB0aGF0IGlzIG93bmVkIGJ5IHRoaXMgYXR0cmlidXR0ZS4KLSAgKiBAcmV0dXJuIFR5cGVFbGVtZW50IFRoZSBUeXBlIHRoYXQgb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICovCi0gIHB1YmxpYyBUeXBlRWxlbWVudCBnZXRUeXBlRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9UWVBFKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChUeXBlRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BdHRyaWJ1dGVFbGVtZW50VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0F0dHJpYnV0ZUVsZW1lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMGI2ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0F0dHJpYnV0ZUVsZW1lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4gbWV0aG9kIHBhcmFtZXRlci4KLSogTmVhcmVzdCBtb3JhbCBlcXVpdmFsZW50czogamF2YS5iZWFucy5QYXJhbWV0ZXJEZXNjcmlwdG9yLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlRWxlbWVudFR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXJNZXRob2QoU3RyaW5nIHNldHRlck1ldGhvZCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyTWV0aG9kKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0R2V0dGVyTWV0aG9kKCk7Ci0gIHB1YmxpYyB2b2lkIHNldEdldHRlck1ldGhvZChTdHJpbmcgZ2V0dGVyTWV0aG9kKTsKLSAgcHVibGljIEJlYW5FbGVtZW50IGdldE93bmluZ0JlYW5FbGVtZW50ICgpOwotICBwdWJsaWMgVHlwZUVsZW1lbnQgZ2V0VHlwZUVsZW1lbnQgKCk7Ci0gIC8qKgotICAqIFJldHVybiB0aGUgc2lnbmF0dXJlIHdpdGggdGhpcyB2YWx1ZSBhcyB0aGUgcGFybWV0ZXIKLSAgKgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNldHRlclNpZ25hdHVyZShTdHJpbmcgYXR0cmlidXRlKTsKLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CZWFuRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2RhOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4uCi0qIE5lYXJlc3QgbW9yYWwgZXF1aXZhbGVudHM6IGphdmEubGFuZy5DbGFzcywgamF2YS5iZWFucy5CZWFuRGVzY3JpcHRvci4KLSovCi1wdWJsaWMgY2xhc3MgQmVhbkVsZW1lbnQgZXh0ZW5kcyBUeXBlRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBTVEFURUxFU1NfQkVBTiA9ICIxMDEwMTAxMHN0YXRlbGVzc2JlYW4xMDEwMTAxMCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9NRVRIT0RTID0gInJlbG1ldGhvZHMiOwotIAotICAvKioKLSAgKiBDb25zdHJ1Y3RvciAKLSAgKiBAcGFyYW0gcHJvamVjdEVsZW1lbnQgVGhlIHByb2plY3QgdGhpcyBCZWFuIGJlbG9uZ3MgdG8uCi0gICovCi0gIHB1YmxpYyBCZWFuRWxlbWVudCAoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzKG5hbWUsbmV3IEJhc2ljTW9kZWwoIlByb2plY3QiKSx0cnVlKTsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIAotICAqIEBwYXJhbSBwYXJhbWV0ZXJFbGVtZW50IFRoZSBwYXJhbWV0ZXIgdGhpcyBCZWFuIGJlbG9uZ3MgdG8uCi0gICovCi0gIHB1YmxpYyBCZWFuRWxlbWVudCAoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLGJvb2xlYW4gaXNSb290KQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCxUeXBlRWxlbWVudC5CRUFOKTsKLSAgICBpZihpc1Jvb3QpIG1vZGVsLnNldFJvb3RFbGVtZW50KHRoaXMpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5ST09UOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgZm9yIHRoZSBjYXNlIHdoZW4gdGhpcyBpcyBub3QgdGhlIHJvb3Qgb2JqZWN0Ci0gICogaGVyZSBpdCByZXByZXNlbnRzIGNvbXBsZXggdHlwZXMKLSAgKiBAcGFyYW0gUGFyYW1ldGVyRWxlbWVudCBUaGUgUGFyYW1ldGVyIHRoYXQgb3ducyB0aGlzIGJlYW4gdHlwZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE5hbWUgb2YgdGhlIGJlYW4gZWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50ICggUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUscGFyYW1ldGVyRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQkVBTik7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LlBBUkFNRVRFUl9PV05FUjsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2FzZSB3aGVuIHRoaXMgaXMgbm90IHRoZSByb290IG9iamVjdAotICAqIGhlcmUgaXQgcmVwcmVzZW50cyBjb21wbGV4IHR5cGVzCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBiZWFuIHR5cGUuCi0gICogQHBhcmFtIFN0cmluZyBOYW1lIG9mIHRoZSBQYXJhbWV0ZXJFbGVtZW50LgotICAqLwotICBwdWJsaWMgQmVhbkVsZW1lbnQgKCBBdHRyaWJ1dGVFbGVtZW50IGF0dHJpYnV0ZUVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxhdHRyaWJ1dGVFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5CRUFOKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuQVRUUklCVVRFX09XTkVSOwotICAKLSAgfQotCi0gICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBQYXJhbWV0ZXJFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgUGFyYW1ldGVyRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50ICggRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGZpZWxkRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQkVBTik7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LkZJRUxEX09XTkVSOwotICAKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIE1ldGhvZCBvYmplY3RzIG9mIHRoaXMgQmVhbi4KLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIEFsbCBNZXRob2Qgb2JqZWN0cyBvZiB0aGlzIEJlYW4uCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRNZXRob2RzICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX01FVEhPRFMpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIE1ldGhvZCBvYmplY3RzIG9mIHRoaXMgQmVhbi4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIE1ldGhvZCBvYmplY3RzIG9mIHRoaXMgQmVhbi4KLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJPZk1ldGhvZEVsZW1lbnRzICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfTUVUSE9EUyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIGlmKGlzU3RhdGVMZXNzKCkpIHJldHVybiBTVEFURUxFU1NfQkVBTiArIGdldE5hbWUoKTsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNTdGF0ZUxlc3MoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZWEgPSBnZXRFbGVtZW50cyhUeXBlRWxlbWVudC5SRUxfQVRUUklCVVRFUyk7Ci0gICAgRW51bWVyYXRpb24gZWYgPSBnZXRFbGVtZW50cyhUeXBlRWxlbWVudC5SRUxfRklFTERTKTsKLSAgICBpZihlYS5oYXNNb3JlRWxlbWVudHMoKSB8fCBlZi5oYXNNb3JlRWxlbWVudHMoKSkgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQ3OTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tb24uU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFR5cGVGYWN0b3J5Ci0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDEyOjQxOjQ4IFBNKQotICogQGF1dGhvcjogR2lsYmVydCBBbmRyZXdzCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTl9QQVJBTV9OQU1FPSJyZXR1cm5wIjsKLQotICBwcml2YXRlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeSgpe30KLQotICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0QmVhbk1vZGVsRWxlbWVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KG9iamVjdCxudWxsLG51bGwpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEJlYW5Nb2RlbEVsZW1lbnQoT2JqZWN0IG9iamVjdCxFbGVtZW50IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQob2JqZWN0LHBhcmVudEVsZW1lbnQsbnVsbCk7Ci0gIH0KLSAgCi0gLyoKLSAgKiBUYWtlIGluIGFuIG9iamVjdCBhbmQgcmV0dXJuIGFuIGVsZW1lbnQgZGVwZW5kaW5nIG9uIHdoYXQgCi0gICogdHlwZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGZyb20gdGhlIGphdmFtb2YKLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRCZWFuTW9kZWxFbGVtZW50KE9iamVjdCBvYmplY3QsRWxlbWVudCBwYXJlbnRFbGVtZW50LCBNb2RlbCBtb2RlbCkKLSAgewotICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSmF2YUNsYXNzKXsKLSAgICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKW9iamVjdDsKLSAgICAgIFN0cmluZyBqYXZhTmFtZSA9IGphdmFDbGFzcy5nZXRKYXZhTmFtZSgpOwotICAgICAgaWYgKCFqYXZhQ2xhc3MuaXNBcnJheSgpKXsgCi0JICAgICAgaWYocGFyZW50RWxlbWVudCA9PSBudWxsICYmIG1vZGVsID09bnVsbCkgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudChqYXZhTmFtZSk7Ci0JICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgbW9kZWwgIT1udWxsKSByZXR1cm5FbGVtZW50ID0gbmV3IEJlYW5FbGVtZW50KGphdmFOYW1lLG1vZGVsLGZhbHNlKTsKLQkgICAgICBlbHNlewotCSAgICAgICAgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtZXRlckVsZW1lbnQpeyAKLQkgICAgICAgICAgIFBhcmFtZXRlckVsZW1lbnQgdGVtcEVsZW1lbnQgPSAoUGFyYW1ldGVyRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVFbGVtZW50KXsKLQkgICAgICAgICAgIEF0dHJpYnV0ZUVsZW1lbnQgdGVtcEVsZW1lbnQgPSAoQXR0cmlidXRlRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBGaWVsZEVsZW1lbnQpewotICAgICAgICAgICAgICAgRmllbGRFbGVtZW50IHRlbXBFbGVtZW50ID0gKEZpZWxkRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KXsKLSAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgUGFyYW1ldGVyRWxlbWVudCgoTWV0aG9kRWxlbWVudClwYXJlbnRFbGVtZW50LFJFVFVSTl9QQVJBTV9OQU1FLE1ldGhvZEVsZW1lbnQuUkVMX1JFVFVSTl9QQVJBTUVURVJTLHRydWUpOwotICAgICAgICAgICAgfQkgICAgICAgICAKLQkgICAgICB9Ci0gICAgICB9IAotICAgICAgZWxzZXsKLSAgICAgICAgICBpZihwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgbW9kZWwgPT1udWxsKSByZXR1cm5FbGVtZW50ID0gbmV3IEFycmF5RWxlbWVudChqYXZhTmFtZSk7Ci0JICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgbW9kZWwgIT1udWxsKSByZXR1cm5FbGVtZW50ID0gbmV3IEFycmF5RWxlbWVudChqYXZhTmFtZSxtb2RlbCxmYWxzZSk7Ci0JICAgICAgZWxzZXsKLQkgICAgICAgIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbGVtZW50KXsgCi0JICAgICAgICAgICBQYXJhbWV0ZXJFbGVtZW50IHRlbXBFbGVtZW50ID0gKFBhcmFtZXRlckVsZW1lbnQpcGFyZW50RWxlbWVudDsKLQkgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgQXJyYXlFbGVtZW50KHRlbXBFbGVtZW50LGphdmFOYW1lKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUVsZW1lbnQpewotCSAgICAgICAgICAgQXR0cmlidXRlRWxlbWVudCB0ZW1wRWxlbWVudCA9IChBdHRyaWJ1dGVFbGVtZW50KXBhcmVudEVsZW1lbnQ7Ci0JICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEFycmF5RWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBGaWVsZEVsZW1lbnQpewotICAgICAgICAgICAgICAgRmllbGRFbGVtZW50IHRlbXBFbGVtZW50ID0gKEZpZWxkRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBBcnJheUVsZW1lbnQodGVtcEVsZW1lbnQsamF2YU5hbWUpOwotCSAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCl7Ci0gICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxSRVRVUk5fUEFSQU1fTkFNRSxNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyx0cnVlKTsKLSAgICAgICAgICAgIH0KLQotCSAgICAgIH0KLSAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IpewotICAgICAgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gKFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcilvYmplY3Q7Ci0gICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEF0dHJpYnV0ZUVsZW1lbnQoKEJlYW5FbGVtZW50KXBhcmVudEVsZW1lbnQscGQuZ2V0TmFtZSgpKTsgIAotICAgIH0KLSAgICBlbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEZpZWxkKXsKLSAgICAgIEZpZWxkIGZpZWxkID0gKEZpZWxkKW9iamVjdDsKLSAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRmllbGRFbGVtZW50KChCZWFuRWxlbWVudClwYXJlbnRFbGVtZW50LGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZCl7Ci0gICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClvYmplY3Q7Ci0gICAgICByZXR1cm5FbGVtZW50ID0gbmV3IE1ldGhvZEVsZW1lbnQoKEJlYW5FbGVtZW50KXBhcmVudEVsZW1lbnQsbWV0aG9kLmdldE5hbWUoKSwgbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0gICAgfQotICAgIC8vbm9uIGJlYW5pbmZvCi0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKXsKLSAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylvYmplY3Q7ICAKLSAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgQXR0cmlidXRlRWxlbWVudCgoQmVhbkVsZW1lbnQpcGFyZW50RWxlbWVudCxuYW1lKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSmF2YVBhcmFtZXRlcil7Ci0gICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgPSAoSmF2YVBhcmFtZXRlcilvYmplY3Q7Ci0KLSAgICAgIAotICAgICAgaWYgKGphdmFQYXJhbWV0ZXIuaXNSZXR1cm4oKSkgCi0gICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxSRVRVUk5fUEFSQU1fTkFNRSxNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyx0cnVlKTsgCi0gICAgICBlbHNleyAKLSAgICAgICAgIC8vYSBqYXZhIHBhcmFtZXRlciBnaXZlcyB1cyB0aGUgcXVhbGlmaWVkIG5hbWUgd2UgZG9udCB3YW50IHRoaXMKLSAgICAgICAgIFN0cmluZyBuYW1lID0gamF2YVBhcmFtZXRlci5nZXRRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICBTdHJpbmcgc2hvcnROYW1lOwotICAgICAgICAgaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICAgaWYgKGluZGV4ICE9IC0xKXsKLSAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgc2hvcnROYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgICAgICAgfQotICAgICAgZWxzZSBzaG9ydE5hbWUgPSBuYW1lOwotCi0gICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxzaG9ydE5hbWUsTWV0aG9kRWxlbWVudC5SRUxfUEFSQU1FVEVSUyxmYWxzZSk7IAotCi0gICAgICB9Ci0gICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBKYXZhSGVscGVycyl7Ci0gICAgICBKYXZhSGVscGVycyBqYXZhSGVscGVyID0gKEphdmFIZWxwZXJzKW9iamVjdDsKLSAgICAgIFN0cmluZyBqYXZhTmFtZTsgCi0gICAgICBpZiAoamF2YUhlbHBlci5pc0FycmF5KCkpIGphdmFOYW1lID0gVHlwZUZhY3RvcnkuQVJSQVlfTkFNRTsKLSAgICAgIGVsc2UgamF2YU5hbWUgPSBqYXZhSGVscGVyLmdldEphdmFOYW1lKCk7Ci0gICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtZXRlckVsZW1lbnQpewotICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgU2ltcGxlRWxlbWVudCgoUGFyYW1ldGVyRWxlbWVudClwYXJlbnRFbGVtZW50LGphdmFOYW1lLGphdmFIZWxwZXIuaXNQcmltaXRpdmUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVFbGVtZW50KXsKLSAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFNpbXBsZUVsZW1lbnQoKEF0dHJpYnV0ZUVsZW1lbnQpcGFyZW50RWxlbWVudCxqYXZhTmFtZSxqYXZhSGVscGVyLmlzUHJpbWl0aXZlKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRmllbGRFbGVtZW50KXsKLSAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFNpbXBsZUVsZW1lbnQoKEZpZWxkRWxlbWVudClwYXJlbnRFbGVtZW50LGphdmFOYW1lLGphdmFIZWxwZXIuaXNQcmltaXRpdmUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KXsKLSAgICAgIAlyZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxSRVRVUk5fUEFSQU1fTkFNRSxNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyx0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldHVybkVsZW1lbnQ7Ci0gIH0KLSAgCi0gIAotICAKLQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CaWdEZWNpbWFsVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0RlY2ltYWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZGEwYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0RlY2ltYWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgQmlnRGVjaW1hbFR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIEJpZ0RlY2ltYWxUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LkJJR19ERUNJTUFMX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAibmV3IGphdmEubWF0aC5CaWdEZWNpbWFsKCIgKyBuYW1lICsgIik7IjsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmFtZSArICIudG9TdHJpbmcoKSI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CaWdJbnRlZ2VyVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0ludGVnZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjYwMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0ludGVnZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgQmlnSW50ZWdlclR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIEJpZ0ludGVnZXJUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LkJJR19JTlRFR0VSX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAibmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKCIgKyBuYW1lICsgIik7IjsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmFtZSArICIudG9TdHJpbmcoKSI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9EYXRhVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NjFhNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzaW1wbGlmeSB0aGUgY29kZWdlbiBwcm9jZXNzCi0qIEJlY2F1c2UgY29kZWdlbiBtYXkgYmUgcHJvY2Vzc2VkIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB0aGUgdHlwZQotKiB3ZSBjYW4gaGFuZGxlIGhvdyBlYWNoIHR5cGUgd2FudHMgdGhlIGNvZGUgdG8gbG9vayBmb3IgYSBzcGVjaWZpYyB0YXNrIAotKiBieSBjcmVhdGluZyBhIGRhdGF0eXBlIGFuZCBjYWxsaW5nIGdlbmVyaWMgbWV0aG9kcyB0aGF0IGFyZSAKLSogdG8gYmUgc3BlY2lhbGl6ZWQgaW4gc3ViY2xhc3NlcwotKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9UWVBFID0gInR5cGUiOwotCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gaGFuZHMgYmFjayB0aGUgY29kZSByZXF1aXJlZCB0byBnbyBmcm9tIHRoZSAKLSAgKiBzdHJpbmcgdGhlIHVzZXIgZW50ZXJlZCB0byB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW0gU3RyaW5nIHR5cGVOYW1lIHRoaXMgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0eXBlIGllIGludCxib29sZWFuCi0gICogQHBhcmFtIFN0cmluZyBub2RlTmFtZSBUaGUgbm9kZU5hbWUgaXMganVzdCB0aGUgYXR0cmlidXRlbmFtZSArIFRlbXAuIAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotICAvKioKLSAgKiBPZnRlbiB0aW1lcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgdHlwZSB0byBzdHJpbmcsIHN0cmluZyB0byB0eXBlIG9yIGp1c3QgcGxhaW4gcHJvdmlkZSBhbiBpbnB1dCBmb3JtCi0gICogQSB0ZW1wb3JhcnkgdmFyaWFibGUgaXMgdXNlZC4gSWYgd2UgcnVuIGludG8gYSBzaXR1dGlvbiB3aGVyZSB0d28gb2YgdGhlIHNhbWUgdHlwZXMgYXJlIHVzZWQgaW4gdGhlICAKLSAgKiBzYW1lIG1ldGhvZCB0aGVzZSB0ZW1wb3JhcnkgdmFyaWFibGVzIHNoYXJlIHRoZSBzYW1lIG5hbWUgc3BhY2UuIEl0IGlzbnQgZW5vdWdoIHRvIHVzZSBhIG5hbWUgCi0gICogYmVjYXVzZSBvZiB3ZSBtYXkgaGF2ZSBhIG5lc3RlZCBzY2VuYXJpby4gVGhlcmVmb3JlIGFueSB0ZW1wb3JhcnkgdmFyaWFibGUgdGhhdCBpcyB1c2VkIGluIGEgZGF0YVR5cGUKLSAgKiBtdXN0IHVzZSBhIHVuaXF1ZSBuYW1lIGFwZWVuZGVkIHRvIHRoZSBlbmQuIFRoaXMgbmFtZSBtdXN0IGJlIHBhc3NlZCBpbiBhbmQgaXQgaXMgdXAgdG8gdGhlIHVzZXIgb2YKLSAgKiBEYXRhVHlwZSB0byBpbnN1cmUgaXQgaXMgdW5pcXVlLgotICAqIEByZXR1cm4gVW5pcXVlIE5hbWUgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIG5hbWUgZWFjaCB0ZW1wIHZhcmlhYmxlIHdpbGwgdXNlCi0gICogCi0gICoKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKCk7Ci0gIAotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGRpY3RhdGVzIGhvdyB5b3Ugd2FudCB0byBwcm9jZXNzIHRoZSAKLSAgKiBpbmNvbWluZyBzdHJpbmcgZnJvbSB0aGUgaW5wdXQganNwLiBZb3UgbWF5IG9yIG1heSBub3QgdXNlIHRoZSBtYXJrdXAgCi0gICogZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB0eXBlLiBUaGUgc2ltcGxlIHR5cGVzIHVzZSBpdC4gRG9tRWxlbWVudCBkb2VzIG5vdAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpOwotCi0KLSAgLyoqCi0gICogSW5wdXQgZm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZm9ybSB1c2VkIHRvIGNvbGxlY3QgdGhlIGRhdGEKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpOwotICAKLSAgLyoqCi0gICogY29udmVydHMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJveHkgCi0gICogYmFjayB0byBhIHN0cmluZyAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSB0eXBlIHRvIHN0cmluZy4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICogcmV0dXJuIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgdGhlIHR5cGUoaW5jbHVkaW5nIHBhY2thZ2UpLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RhdGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRGF0ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4Mzk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRGF0ZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIERhdGVUeXBlIGV4dGVuZHMgU2ltcGxlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBEYXRlVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5CSUdfREVDSU1BTF9OQU1FKTsKLSAgfQotIAotCi0gIC8qKgotICAqIGlucHV0Rm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBUaGUgc2ltcGxlIGZvcm0gaXMganVzdCBhIHRleHQgaW5wdXQgYm94Ci0gICogVGhpcyBoYXMgYmVlbiBzcGVjaWFsaXplZCB0byBzaG93IGFuIGV4YW1wbGUKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZm9ybSB1c2VkIHRvIGNvbGxlY3QgdGhlIGRhdGEKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGlucHV0Rm9ybSA9ICI8VEQgQUxJR049XCJsZWZ0XCI+PElOUFVUIFRZUEU9XCJURVhUXCIgTkFNRT1cIiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIlwiIFNJWkU9MjA+PC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiamF2YS50ZXh0LkRhdGVGb3JtYXQgZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgImphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciBnY0V4YW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIiAgPSBuZXcgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiamF2YS51dGlsLkRhdGUgZGF0ZSIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBnY0V4YW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIi5nZXRUaW1lKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiLmZvcm1hdChkYXRlIiArIGdldFVuaXF1ZU5hbWUoKSsgIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VEQgQUxJR049XCJsZWZ0XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VFI+IiAgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPFREPiA8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPFREIEFMSUdOPVwibGVmdFwiPiBlZy4gPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IDwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8L1RSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICByZXR1cm4gaW5wdXRGb3JtOwotICB9Ci0KLQotICAvKgotICAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgc3BlY2lhbGl6ZWQKLSAgKiBXZSBtdXN0IHVzZSB0aGUgZGF0ZSBmdW5jdGlvbiB0byBoZWxwCi0gICogdXMgY29udmVydCBiYWNrIGFuZCBmb3J0aAotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudGV4dC5EYXRlRm9ybWF0IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gamF2YS50ZXh0LkRhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7IiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAgImphdmEudXRpbC5EYXRlICIgKyBub2RlTmFtZSAgKyAgIj0gZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIucGFyc2UoIiArIGF0dHJpYnV0ZU5hbWUgKyAiKTsiICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAqIHRoaXMgaXMgbmVlZGVkIGZvciBtb3N0IGNhc2UgCi0gICogYnV0IGl0IGlzIHBlcmlwaGVyYWwgYXMgdGhlIHN0cmluZ2NvbnZlcnNpb24gbmVlZGVkIAotICAqIHRvIGJlIG92ZXJyaWRkZW4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICogY29udmVydHMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJveHkgCi0gICogYmFjayB0byBhIHN0cmluZyAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSB0eXBlIHRvIHN0cmluZy4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSkKLSAgewotCi0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJqYXZhLnRleHQuRGF0ZUZvcm1hdCBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGphdmEudGV4dC5EYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgIAkgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLkpzcFV0aWxzLm1hcmt1cChkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIi5mb3JtYXQoIiArIG5hbWUgKyIpKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotCi0KLSAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RvbUVsZW1lbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRG9tRWxlbWVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0MDZhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRG9tRWxlbWVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIERvbUVsZW1lbnRUeXBlIGltcGxlbWVudHMgRGF0YVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBmVW5pcXVlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIERvbUVsZW1lbnRUeXBlKCkKLSAgewotICAgIGZUeXBlID0gIm9yZy53M2MuZG9tLkVsZW1lbnQiOwotICAgIGZVbmlxdWVOYW1lID0gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBpbnB1dEZvcm0gcmV0dXJucyB0aGUgdXNlciBpbnB1dCBodG1sCi0gICogVGhlIERvbUVsZW1lbnQgZm9ybSBpcyBhIHRleHQgYm94Ci0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgVGhlIGZvcm0gdXNlZCB0byBjb2xsZWN0IHRoZSBkYXRhCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgaW5wdXRGb3JtKFN0cmluZyBuYW1lKQotICB7Ci0gICAgIFN0cmluZyBpbnB1dEZvcm0gPSAiPFREIEFMSUdOPVwibGVmdFwiPjxURVhUQVJFQSBSb3dzPTcgQ29scz00NSBOQU1FPVwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiXCI+PC9URVhUQVJFQT48L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBpbnB1dEZvcm07Ci0gIH0KLQotICAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBkaWN0YXRlcyBob3cgeW91IHdhbnQgdG8gcHJvY2VzcyB0aGUgCi0gICogaW5jb21pbmcgc3RyaW5nIGZyb20gdGhlIGlucHV0IGpzcC4gWW91IG1heSBvciBtYXkgbm90IHVzZSB0aGUgbWFya3VwIAotICAqIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdHlwZS4gVGhlIHNpbXBsZSB0eXBlcyB1c2UgaXQuIERvbUVsZW1lbnQgZG9lcyBub3QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29kZSB0byBiZSBnZW5lcmF0ZWQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0Q29kZShTdHJpbmcgbmFtZSwgU3RyaW5nIGlkKQotICB7Ci0gICAgIFN0cmluZyByZXF1ZXN0Q29kZSA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyIgKyBHZW5lcmF0b3IuU1BBQ0UgCi0gICAgIAkgICAgICAgICAgICAgICAgICAgKyBpZCArICI9ICByZXF1ZXN0LmdldFBhcmFtZXRlcihcIiIKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIG5hbWUgKyJcIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiByZXF1ZXN0Q29kZTsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gaGFuZHMgYmFjayB0aGUgY29kZSByZXF1aXJlZCB0byBnbyBmcm9tIHRoZSAKLSAgKiBzdHJpbmcgdGhlIHVzZXIgZW50ZXJlZCB0byB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW0gU3RyaW5nIHR5cGVOYW1lIHRoaXMgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0eXBlIGllIGludCxib29sZWFuCi0gICogQHBhcmFtIFN0cmluZyBub2RlTmFtZSBUaGUgbm9kZU5hbWUgaXMganVzdCB0aGUgYXR0cmlidXRlbmFtZSArIFRlbXAuIAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gIEdlbmVyYXRvci5ET1VCTEVfVEFCIAotICAgICAgICAgICAgICAgICAgICAgICArICJvcmcudzNjLmRvbS5FbGVtZW50ICIgKyBub2RlTmFtZSArICI9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLkRvbUVsZW1lbnRIZWxwZXIuY3JlYXRlRG9tRWxlbWVudEZyb21YTUxTdHJpbmcoIiArIGF0dHJpYnV0ZU5hbWUgKyAiKTsiIAotCSAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBjb252ZXJzaW9uOyAKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBmdW5jdGlvbiB0aGF0IGRpY3RhdGVzIGhvdyB3ZSB3YW50IHRvIGRpc3BsYXkgdGhpcyB0eXBlIAotICAqIHVwb24gcmVjZWl2aW5nIGl0IGFzIGEgcmV0dXJuIGZyb20gYSBwcm94eSBtZXRob2QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGRpc3BsYXkgc3RyaW5nCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgdHlwZVRvU3RyaW5nID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gb3JnLmVjbGlwc2UuanN0LndzLnV0aWwuRG9tRWxlbWVudEhlbHBlci5kb21Xcml0ZXIoIiArIG5hbWUgKyAiLCBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpIiArICIpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JT0gdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0KLSAgICByZXR1cm4gdHlwZVRvU3RyaW5nOwotICB9Ci0KLSAgLyoqCi0gICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBuYW1lKGluY2x1ZGluZyBwYWNrYWdlKS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBmVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZlVuaXF1ZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZlVuaXF1ZU5hbWUgPSBuYW1lOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0ZpZWxkRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0ZpZWxkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY4ZmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9GaWVsZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YSBiZWFuIG1ldGhvZCBwYXJhbWV0ZXIuCi0qIE5lYXJlc3QgbW9yYWwgZXF1aXZhbGVudHM6IGphdmEuYmVhbnMuUGFyYW1ldGVyRGVzY3JpcHRvci4KLSovCi1wdWJsaWMgY2xhc3MgRmllbGRFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50IGltcGxlbWVudHMgQXR0cmlidXRlRWxlbWVudFR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIFN0cmluZyBmU2V0dGVyTWV0aG9kOwotICBwcml2YXRlIFN0cmluZyBmR2V0dGVyTWV0aG9kOwotCi0gCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9UWVBFID0gInR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfT1dOSU5HX0JFQU4gPSAib3duaW5nYmVhbiI7Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RvciB0aGlzIHRha2VzIHRoZSBvd25pbmcgYmVhbi4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotICAqIEBwYXJhbSBiZWFuRWxlbWVudCB0aGUgYmVhbiB0aGF0IG93bnMgdGhpcyBhdHRyaWJ1dGUuCi0gICovCi0gIHB1YmxpYyBGaWVsZEVsZW1lbnQgKCBCZWFuRWxlbWVudCBiZWFuRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGJlYW5FbGVtZW50LFJFTF9PV05JTkdfQkVBTixCZWFuRWxlbWVudC5SRUxfRklFTERTKTsKLSAgICBmU2V0dGVyTWV0aG9kID0gbmFtZTsKLSAgICBmR2V0dGVyTWV0aG9kID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNldHRlck1ldGhvZChTdHJpbmcgc2V0dGVyTWV0aG9kKQotICB7Ci0gICAgZlNldHRlck1ldGhvZCA9IHNldHRlck1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyTWV0aG9kKCkKLSAgewotICAgIHJldHVybiBmU2V0dGVyTWV0aG9kOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRHZXR0ZXJNZXRob2QoKQotICB7Ci0gICAgcmV0dXJuIGZHZXR0ZXJNZXRob2Q7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0R2V0dGVyTWV0aG9kKFN0cmluZyBnZXR0ZXJNZXRob2QpCi0gIHsKLSAgICBmR2V0dGVyTWV0aG9kID0gZ2V0dGVyTWV0aG9kOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXR0ZXJTaWduYXR1cmUoU3RyaW5nIGF0dHJpYnV0ZSkKLSAgewotICAgIHJldHVybiBmU2V0dGVyTWV0aG9kICsgIiA9ICIgKyBhdHRyaWJ1dGUgKyAiOyI7Ci0gIH0KLSAgIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBCZWFuIHRoYXQgb3ducyB0aGlzIEF0dHJpYnV0ZS4KLSAgKiBAcmV0dXJuIEJlYW5FbGVtZW50IFRoZSBiZWFuIHRoYXQgb3ducyB0aGlzIGF0dHJpYnV0ZS4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50IGdldE93bmluZ0JlYW5FbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX09XTklOR19CRUFOKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCZWFuRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgdHlwZSB0aGF0IGlzIG93bmVkIGJ5IHRoaXMgYXR0cmlidXR0ZS4KLSAgKiBAcmV0dXJuIFR5cGVFbGVtZW50IFRoZSBUeXBlIHRoYXQgb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICovCi0gIHB1YmxpYyBUeXBlRWxlbWVudCBnZXRUeXBlRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9UWVBFKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChUeXBlRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9HcmVnb3JpYW5DYWxlbmRhclR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9HcmVnb3JpYW5DYWxlbmRhclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjZmJmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvR3JlZ29yaWFuQ2FsZW5kYXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgR3JlZ29yaWFuQ2FsZW5kYXJUeXBlIGV4dGVuZHMgU2ltcGxlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBHcmVnb3JpYW5DYWxlbmRhclR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuR1JFR09SSUFOX0NBTEVOREFSX05BTUUpOwotICB9Ci0KLQotICAvKioKLSAgKiBpbnB1dEZvcm0gcmV0dXJucyB0aGUgdXNlciBpbnB1dCBodG1sCi0gICogVGhlIHNpbXBsZSBmb3JtIGlzIGp1c3QgYSB0ZXh0IGlucHV0IGJveAotICAqIFRoaXMgaGFzIGJlZW4gc3BlY2lhbGl6ZWQgdG8gc2hvdyBhbiBleGFtcGxlCi0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgVGhlIGZvcm0gdXNlZCB0byBjb2xsZWN0IHRoZSBkYXRhCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgaW5wdXRGb3JtKFN0cmluZyBuYW1lKQotICB7Ci0gICAgIFN0cmluZyBpbnB1dEZvcm0gPSAiPFREIEFMSUdOPVwibGVmdFwiPjxJTlBVVCBUWVBFPVwiVEVYVFwiIE5BTUU9XCIiIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICJcIiBTSVpFPTIwPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgImphdmEudGV4dC5EYXRlRm9ybWF0IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gamF2YS50ZXh0LkRhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIgZ2NFeGFtcCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgID0gbmV3IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcigpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgImphdmEudXRpbC5EYXRlIGRhdGUiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gZ2NFeGFtcCIgKyBnZXRVbmlxdWVOYW1lKCkrICIuZ2V0VGltZSgpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJTdHJpbmcgdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIi5mb3JtYXQoZGF0ZSIgKyBnZXRVbmlxdWVOYW1lKCkrICIpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxURCBBTElHTj1cImxlZnRcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxUUj4iICArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VEQ+IDwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VEQgQUxJR049XCJsZWZ0XCI+IGVnLiA8JT0gdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgJT4gPC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIHJldHVybiBpbnB1dEZvcm07Ci0gIH0KLSAKLSAKLSAgLyoKLSAgKiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHNwZWNpYWxpemVkCi0gICogV2UgbXVzdCB1c2UgdGhlIGRhdGUgZnVuY3Rpb24gdG8gaGVscAotICAqIHVzIGNvbnZlcnQgYmFjayBhbmQgZm9ydGgKLSAgKi8KLSAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGNvbnZlcnNpb24gPSAgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiamF2YS50ZXh0LkRhdGVGb3JtYXQgZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKTsiICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICAiamF2YS51dGlsLkRhdGUgZGF0ZVRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICA9IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiLnBhcnNlKCIgKyBhdHRyaWJ1dGVOYW1lICsgIik7IiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIiICsgR2VuZXJhdG9yLlNQQUNFICsgbm9kZU5hbWUgKyAiID0gIiArICJuZXcgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKCk7IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArIG5vZGVOYW1lICsgIi5zZXRUaW1lKGRhdGVUZW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIik7IgotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAqIHRoaXMgaXMgbmVlZGVkIGZvciBtb3N0IGNhc2UgCi0gICogYnV0IGl0IGlzIHBlcmlwaGVyYWwgYXMgdGhlIHN0cmluZ2NvbnZlcnNpb24gbmVlZGVkIAotICAqIHRvIGJlIG92ZXJyaWRkZW4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBjb252ZXJ0cyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm94eSAKLSAgKiBiYWNrIHRvIGEgc3RyaW5nIAotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHR5cGUgdG8gc3RyaW5nLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0KLSAgICBTdHJpbmcgY29udmVyc2lvbiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudGV4dC5EYXRlRm9ybWF0IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gamF2YS50ZXh0LkRhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgCSAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiamF2YS51dGlsLkRhdGUgZGF0ZSIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSAiICsgbmFtZSArICIuZ2V0VGltZSgpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgIAkgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLkpzcFV0aWxzLm1hcmt1cChkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIi5mb3JtYXQoZGF0ZSIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiKSk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlPSB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiAlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLQotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0KLQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9IYXNodGFibGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvSGFzaHRhYmxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZmMmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9IYXNodGFibGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSByZWNvZ25pemVkIHJldHVybiB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBIYXNodGFibGVUeXBlIGV4dGVuZHMgUmVjb2duaXplZFJldHVyblR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBIYXNodGFibGVUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LkhBU0hUQUJMRV9OQU1FKTsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvTWFwVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL01hcFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzNWJmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvTWFwVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgTWFwVHlwZSBleHRlbmRzIFJlY29nbml6ZWRSZXR1cm5UeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgTWFwVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5NQVBfTkFNRSk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL01ldGhvZEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9NZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODkyZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL01ldGhvZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmEgYmVhbiBtZXRob2QuCi0qIE5lYXJlc3QgbW9yYWwgZXF1aXZhbGVudHM6IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCwgamF2YS5iZWFucy5NZXRob2REZXNjcmlwdG9yLgotKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9CRUFOID0gImJlYW4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUEFSQU1FVEVSUyA9ICJwYXJhbWV0ZXJzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1JFVFVSTl9QQVJBTUVURVJTID0gInJldHVybnBhcmFtZXRlcnMiOwotICBwcml2YXRlIFN0cmluZyBmRGlzcGxheU5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIGJvb2xlYW4gZk1ldGhvZE9taXR0ZWQ7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIGJlYW4gVGhlIEJlYW4gdGhhdCBvd25zIHRoaXMgbWV0aG9kLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuCi0gICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG1ldGhvZC4KLSAgKi8KLSAgcHVibGljIE1ldGhvZEVsZW1lbnQgKCBCZWFuRWxlbWVudCBiZWFuRWxlbWVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkaXNwbGF5TmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsYmVhbkVsZW1lbnQsUkVMX0JFQU4sQmVhbkVsZW1lbnQuUkVMX01FVEhPRFMpOwotICAgIGZEaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgIGZOYW1lID0gbmFtZTsKLSAgICBmTWV0aG9kT21pdHRlZCA9IGZhbHNlOwotICAgIAotICB9Ci0KLSAgLyoKLSAgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGVyZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlCi0gICogd2Ugd2lsbCBzZXQgdGhlIG9tbWlzc2lvbiBib29sZWFuIHZhcmlhYmxlCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhpcyBtZXRob2QgaXMgdG8gYmUgb21taXRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRNZXRob2RPbW1pc3Npb24oKQotICB7Ci0gICAgcmV0dXJuIGZNZXRob2RPbWl0dGVkOwotICB9Ci0KLSAgLyoKLSAgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGVyZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlCi0gICogd2Ugd2lsbCBnZXQgdGhlIG9tbWlzc2lvbiBib29sZWFuIHZhcmlhYmxlCi0gICogQHBhcmFtIGJvb2xlYW4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyB0byBiZSBvbW1pdGVkCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE1ldGhvZE9tbWlzc2lvbihib29sZWFuIGJvb2wpCi0gIHsKLSAgICBmTWV0aG9kT21pdHRlZCA9IGJvb2w7Ci0gIH0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZk5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLSAgewotICAgIHJldHVybiBmRGlzcGxheU5hbWU7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBCZWFuIHRoYXQgb3ducyB0aGlzIG1ldGhvZC4KLSAgKiBAcmV0dXJuIEJlYW4gVGhlIEJlYW4gdGhhdCBvd25zIHRoaXMgbWV0aG9kLgotICAqLwotICBwdWJsaWMgQmVhbkVsZW1lbnQgZ2V0QmVhbkVsZW1lbnQgKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhSRUxfQkVBTik7Ci0gICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoQmVhbkVsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgdGhlIHJldHVybiBwYXJhbWV0ZXIgb2YgdGhpcyBtZXRob2QuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBob2xkcyB0aGUgcmV0dXJuIHBhcmFtZXRlciBvZiB0aGlzIG1ldGhvZC4KLSAgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFJldHVyblBhcmFtZXRlckVudW0gKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfUkVUVVJOX1BBUkFNRVRFUlMpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgcmV0dXJuIHBhcmFtZXRlciBvZiB0aGlzIG1ldGhvZC4KLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIGhvbGRzIHRoZSByZXR1cm4gcGFyYW1ldGVyIG9mIHRoaXMgbWV0aG9kLgotICAqLwotICBwdWJsaWMgUGFyYW1ldGVyRWxlbWVudCBnZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0UmV0dXJuUGFyYW1ldGVyRW51bSgpOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKFBhcmFtZXRlckVsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIFBhcmFtZXRlciBvYmplY3RzIG9mIHRoaXMgbWV0aG9kLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gQWxsIFBhcmFtZXRlciBvYmplY3RzIG9mIHRoaXMgbWV0aG9kLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1ldGVyRWxlbWVudHMgKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfUEFSQU1FVEVSUyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgUGFyYW1ldGVyIG9iamVjdHMgb2YgdGhpcyBtZXRob2QuCi0gICogQHJldHVybiBpbnQgVGhlIG51bWJlciBvZiBQYXJhbWV0ZXIgb2JqZWN0cyBvZiB0aGlzIG1ldGhvZC4KLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlBhcmFtZXRlckVsZW1lbnRzICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfUEFSQU1FVEVSUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1BhcmFtZXRlckVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QYXJhbWV0ZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYjA2NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1BhcmFtZXRlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YSBiZWFuIG1ldGhvZCBwYXJhbWV0ZXIuCi0qIE5lYXJlc3QgbW9yYWwgZXF1aXZhbGVudHM6IGphdmEuYmVhbnMuUGFyYW1ldGVyRGVzY3JpcHRvci4KLSovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9NRVRIT0QgPSAibWV0aG9kIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1RZUEUgPSAidHlwZSI7Ci0KLSAgcHVibGljIGJvb2xlYW4gZlJldHVyblBhcmFtZXRlcj1mYWxzZTsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIEBwYXJhbSBtZXRob2QgVGhlIE1ldGhvZCB0aGF0IG93bnMgdGhpcyBwYXJhbWV0ZXIuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4KLSAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyLgotICAqLwotICBwdWJsaWMgUGFyYW1ldGVyRWxlbWVudCAoIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyByZWxUeXBlLGJvb2xlYW4gcmV0dXJuUGFyYW1ldGVyICkKLSAgewotICAgIHRoaXMobmFtZSxtZXRob2RFbGVtZW50LFJFTF9NRVRIT0QscmVsVHlwZSk7Ci0gICAgZlJldHVyblBhcmFtZXRlciA9IHJldHVyblBhcmFtZXRlcjsKLSAgfQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIG1ldGhvZCBUaGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLgotICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuCi0gICovCi0gIHB1YmxpYyBQYXJhbWV0ZXJFbGVtZW50IChTdHJpbmcgbmFtZSwgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBTdHJpbmcgb3V0UmVsLFN0cmluZyBpblJlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbWV0aG9kRWxlbWVudCxvdXRSZWwsaW5SZWwpOwotICB9Ci0gICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKiBAcmV0dXJuIE1ldGhvZCBUaGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKi8KLSAgcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9NRVRIT0QpOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKE1ldGhvZEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIE1ldGhvZCB0aGF0IG93bnMgdGhpcyBwYXJhbWV0ZXIuCi0gICogQHJldHVybiBNZXRob2QgVGhlIE1ldGhvZCB0aGF0IG93bnMgdGhpcyBwYXJhbWV0ZXIuCi0gICovCi0gIHB1YmxpYyBUeXBlRWxlbWVudCBnZXRUeXBlRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9UWVBFKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChUeXBlRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZXR1cm4oKQotICB7Ci0gICAgcmV0dXJuIGZSZXR1cm5QYXJhbWV0ZXI7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQXJyYXlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQXJyYXlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzMwNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUFycmF5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSByZWNvZ25pemVkIHJldHVybiB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVBcnJheVR5cGUgZXh0ZW5kcyBBcnJheVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVBcnJheVR5cGUoU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTUlUSVZFX0FSUkFZX05BTUUsIHR5cGVOYW1lKTsKLSAgfQotCi0gICAvKioKLSAgKiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgZnVuY3Rpb24gdGhhdCBkaWN0YXRlcyBob3cgd2Ugd2FudCB0byBkaXNwbGF5IHRoaXMgdHlwZSAKLSAgKiB1cG9uIHJlY2VpdmluZyBpdCBhcyBhIHJldHVybiBmcm9tIGEgcHJveHkgbWV0aG9kCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBkaXNwbGF5IHN0cmluZwotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIHRyaXBwbGVUYWIgPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArIEdlbmVyYXRvci5UQUI7Ci0KLSAgICBTdHJpbmcgbm9uQmVhbiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wIiArIGdldFVuaXF1ZU5hbWUoKSArICIgPSBcIltcIjsiIAotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJmb3IoaW50IGkiICsgZ2V0VW5pcXVlTmFtZSgpICsgIj0wO2kiICtnZXRVbmlxdWVOYW1lKCkgKyAiPCAiICsgbmFtZSAKLSAgICAJICAgICAgICAgICAgICAgICAgICsgIi5sZW5ndGg7aSIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiKyspeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAKLSAgICAJICAgICAgICAgICAgICsgdHJpcHBsZVRhYiArICJ0ZW1wIisgZ2V0VW5pcXVlTmFtZSgpICsiID0gdGVtcCIrZ2V0VW5pcXVlTmFtZSgpICsgIiArICIgKyBuYW1lICsgIltpIiArIGdldFVuaXF1ZU5hbWUoKSAKLSAgICAJICAgICAgICAgICAgICAgICAgICsgIl0gKyBcIixcIjsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImludCBsZW5ndGgiICsgZ2V0VW5pcXVlTmFtZSgpICsgIiA9IHRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpICsgIi5sZW5ndGgoKTsiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgInRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpICsgIiA9IHRlbXAiK2dldFVuaXF1ZU5hbWUoKSsiLnN1YnN0cmluZygwLChsZW5ndGgiK2dldFVuaXF1ZU5hbWUoKSsiIC0gMSkpICsgXCJdXCI7IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAKLSAgICAJICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9dGVtcCIrIGdldFVuaXF1ZU5hbWUoKSArIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIG5vbkJlYW47Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUJvb2xlYW5UeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQm9vbGVhblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4YWQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQm9vbGVhblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUJvb2xlYW5UeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVCb29sZWFuVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNX0JPT0xFQU5fTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJCb29sZWFuLnZhbHVlT2YoIiArIG5hbWUgKyAiKS5ib29sZWFuVmFsdWUoKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVCeXRlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUJ5dGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNDVkMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUJ5dGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVCeXRlVHlwZSBleHRlbmRzIFByaW1pdGl2ZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgUHJpbWl0aXZlQnl0ZVR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9CWVRFX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAiQnl0ZS5wYXJzZUJ5dGUoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVDaGFyVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUNoYXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MmY5MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUNoYXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVDaGFyVHlwZSBleHRlbmRzIFByaW1pdGl2ZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgUHJpbWl0aXZlQ2hhclR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9DSEFSX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAiIiArIG5hbWUgKyAiLmNoYXJBdCgwKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVEb3VibGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlRG91YmxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjM2MmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVEb3VibGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVEb3VibGVUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVEb3VibGVUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlBSSU1fRE9VQkxFX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAiRG91YmxlLnBhcnNlRG91YmxlKCIgKyBuYW1lICsgIik7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotICAKLSAgCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlRmxvYXRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlRmxvYXRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMGY5ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUZsb2F0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlRmxvYXRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVGbG9hdFR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9GTE9BVF9OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIkZsb2F0LnBhcnNlRmxvYXQoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVJbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlSW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjMzZGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVJbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVJbnRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVJbnRUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlBSSU1fSU5URUdFUl9OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIkludGVnZXIucGFyc2VJbnQoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVKYXZhVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVKYXZhVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxNTIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlSmF2YVR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlSmF2YVR5cGVzIGV4dGVuZHMgU2ltcGxlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVKYXZhVHlwZXMoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBzdXBlcih0eXBlKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlIC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9IGZUeXBlICsgIi52YWx1ZU9mKCIgKyBuYW1lICsgIik7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsgICAgCi0gIH0KLQotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZVRvU3RyaW5nKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICJTdHJpbmcudmFsdWVPZigiICsgbmFtZSArICIpIjsKLSAgfQotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUxvbmdUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlTG9uZ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwYzgyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlTG9uZ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUxvbmdUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVMb25nVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNX0xPTkdfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJMb25nLnBhcnNlTG9uZygiICsgbmFtZSArICIpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZVNob3J0VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZVNob3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjkxY2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVTaG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZVNob3J0VHlwZSBleHRlbmRzIFByaW1pdGl2ZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgUHJpbWl0aXZlU2hvcnRUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlBSSU1fU0hPUlRfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJTaG9ydC5wYXJzZVNob3J0KCIgKyBuYW1lICsgIik7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotICAKLSAgCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1MTc2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByaW1pdGl2ZVR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBzdXBlcih0eXBlKTsKLSAgfQotIAotIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIlN0cmluZy52YWx1ZU9mKCIgKyBuYW1lICsgIikiOwotICB9Ci0gIAotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1JlY29nbml6ZWRSZXR1cm5UeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUmVjb2duaXplZFJldHVyblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3MjFhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUmVjb2duaXplZFJldHVyblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHJlY29nbml6ZWQgcmV0dXJuIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFJlY29nbml6ZWRSZXR1cm5UeXBlIGltcGxlbWVudHMgRGF0YVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBmVW5pcXVlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFJlY29nbml6ZWRSZXR1cm5UeXBlKFN0cmluZyB0eXBlKQotICB7Ci0gICAgZlR5cGUgPSB0eXBlOwotICAgIGZVbmlxdWVOYW1lID0gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBub3QgcmVsZXZhbnQgYXQgdGhpcyBwb2ludCAKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgcmV0dXJuICIiOwotICB9Ci0KLSAgIC8qKgotICAqIGFnYWluIG5vdCByZWxldmFudAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpCi0gIHsKLSAgICAgcmV0dXJuICIiOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBoYW5kcyBiYWNrIHRoZSBjb2RlIHJlcXVpcmVkIHRvIGdvIGZyb20gdGhlIAotICAqIHN0cmluZyB0aGUgdXNlciBlbnRlcmVkIHRvIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZWxlbWVudAotICAqIEBwYXJhbSBTdHJpbmcgdHlwZU5hbWUgdGhpcyBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHR5cGUgaWUgaW50LGJvb2xlYW4KLSAgKiBAcGFyYW0gU3RyaW5nIG5vZGVOYW1lIFRoZSBub2RlTmFtZSBpcyBqdXN0IHRoZSBhdHRyaWJ1dGVuYW1lICsgVGVtcC4gCi0gICogQHBhcmFtIFN0cmluZyB0aGUgYXR0cmlidXRlTmFtZSAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgZnVuY3Rpb24gdGhhdCBkaWN0YXRlcyBob3cgd2Ugd2FudCB0byBkaXNwbGF5IHRoaXMgdHlwZSAKLSAgKiB1cG9uIHJlY2VpdmluZyBpdCBhcyBhIHJldHVybiBmcm9tIGEgcHJveHkgbWV0aG9kCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBkaXNwbGF5IHN0cmluZwotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIG5vbkJlYW4gPSAgIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImlmKCIgKyBuYW1lICsgIiE9IG51bGwpeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAgCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wIiArIGdldFVuaXF1ZU5hbWUoKSsiID0gIiArIG5hbWUgKyAiLnRvU3RyaW5nKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICAiPCU9dGVtcCIgKyBnZXRVbmlxdWVOYW1lKCkgKyIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIn0iOwotICAgIHJldHVybiBub25CZWFuOwotICB9Ci0KLSAgLyoqCi0gICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBuYW1lKGluY2x1ZGluZyBwYWNrYWdlKS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBmVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZlVuaXF1ZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZlVuaXF1ZU5hbWUgPSBuYW1lOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NPQVBFbGVtZW50VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NPQVBFbGVtZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODllMDA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TT0FQRWxlbWVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFNPQVBFbGVtZW50VHlwZSBpbXBsZW1lbnRzIERhdGFUeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZlR5cGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZlVuaXF1ZU5hbWU7Ci0KLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBTT0FQRWxlbWVudFR5cGUoKQotICB7Ci0gICAgZlR5cGUgPSAiamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQiOwotICAgIGZVbmlxdWVOYW1lID0gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBpbnB1dEZvcm0gcmV0dXJucyB0aGUgdXNlciBpbnB1dCBodG1sCi0gICogVGhlIERvbUVsZW1lbnQgZm9ybSBpcyBhIHRleHQgYm94Ci0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgVGhlIGZvcm0gdXNlZCB0byBjb2xsZWN0IHRoZSBkYXRhCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgaW5wdXRGb3JtKFN0cmluZyBuYW1lKQotICB7Ci0gICAgIFN0cmluZyBpbnB1dEZvcm0gPSAiPFREIEFMSUdOPVwibGVmdFwiPjxURVhUQVJFQSBSb3dzPTcgQ29scz00NSBOQU1FPVwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiXCI+PC9URVhUQVJFQT48L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBpbnB1dEZvcm07Ci0gIH0KLQotICAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBkaWN0YXRlcyBob3cgeW91IHdhbnQgdG8gcHJvY2VzcyB0aGUgCi0gICogaW5jb21pbmcgc3RyaW5nIGZyb20gdGhlIGlucHV0IGpzcC4gWW91IG1heSBvciBtYXkgbm90IHVzZSB0aGUgbWFya3VwIAotICAqIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdHlwZS4gVGhlIHNpbXBsZSB0eXBlcyB1c2UgaXQuIERvbUVsZW1lbnQgZG9lcyBub3QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29kZSB0byBiZSBnZW5lcmF0ZWQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0Q29kZShTdHJpbmcgbmFtZSwgU3RyaW5nIGlkKQotICB7Ci0gICAgIFN0cmluZyByZXF1ZXN0Q29kZSA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyIgKyBHZW5lcmF0b3IuU1BBQ0UgCi0gICAgIAkgICAgICAgICAgICAgICAgICAgKyBpZCArICI9ICByZXF1ZXN0LmdldFBhcmFtZXRlcihcIiIKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIG5hbWUgKyJcIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiByZXF1ZXN0Q29kZTsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gaGFuZHMgYmFjayB0aGUgY29kZSByZXF1aXJlZCB0byBnbyBmcm9tIHRoZSAKLSAgKiBzdHJpbmcgdGhlIHVzZXIgZW50ZXJlZCB0byB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW0gU3RyaW5nIHR5cGVOYW1lIHRoaXMgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0eXBlIGllIGludCxib29sZWFuCi0gICogQHBhcmFtIFN0cmluZyBub2RlTmFtZSBUaGUgbm9kZU5hbWUgaXMganVzdCB0aGUgYXR0cmlidXRlbmFtZSArIFRlbXAuIAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gIEdlbmVyYXRvci5ET1VCTEVfVEFCIAotICAgICAgICAgICAgICAgICAgICAgICArICJqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCAiICsgbm9kZU5hbWUgKyAiPSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbC5Tb2FwRWxlbWVudEhlbHBlci5jcmVhdGVTT0FQRWxlbWVudEZyb21YTUxTdHJpbmcoIiArIGF0dHJpYnV0ZU5hbWUgKyAiKTsiIAotCSAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBpcyBiYXNpY2FsbHkgdGhlIGZ1bmN0aW9uIHRoYXQgZGljdGF0ZXMgaG93IHdlIHdhbnQgdG8gZGlzcGxheSB0aGlzIHR5cGUgCi0gICogdXBvbiByZWNlaXZpbmcgaXQgYXMgYSByZXR1cm4gZnJvbSBhIHByb3h5IG1ldGhvZAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIHR5cGUKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZGlzcGxheSBzdHJpbmcKLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyB0eXBlVG9TdHJpbmcgPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJTdHJpbmcgdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbC5Tb2FwRWxlbWVudEhlbHBlci5zb2FwRWxlbWVudFdyaXRlcigiICsgbmFtZSArICIsIG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCkiICsgIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlPSB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiAlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLQotICAgIHJldHVybiB0eXBlVG9TdHJpbmc7Ci0gIH0KLQotICAvKioKLSAgKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgdGhlIG5hbWUoaW5jbHVkaW5nIHBhY2thZ2UpLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGZUeXBlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKCkKLSAgewotICAgIHJldHVybiBmVW5pcXVlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmVW5pcXVlTmFtZSA9IG5hbWU7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU2ltcGxlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NpbXBsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3ODM0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU2ltcGxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiAxIG9mIHRocmVlIHR5cGUgZWxlbWVudHMgcmVwcmVzZW50cyBwcmltaXRpdmVzIAotKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVFbGVtZW50IGV4dGVuZHMgVHlwZUVsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBzaW1wbGUgdHlwZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE5hbWUgb2YgdGhlIHNpbXBsZSBlbGVtZW50LgotICAqLwotICBwdWJsaWMgU2ltcGxlRWxlbWVudCAoIFBhcmFtZXRlckVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gcHJpbSkKLSAgewotICAgIHN1cGVyKG5hbWUscGFyYW1ldGVyRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuU0lNUExFKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuUEFSQU1FVEVSX09XTkVSOwotICAgIHNldFByaW1pdGl2ZShwcmltKTsKLSAgfQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIEF0dHJpYnV0ZSB0aGF0IG93bnMgdGhpcyBzaW1wbGUgdHlwZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE5hbWUgb2YgdGhlIEF0dHJpYnV0ZUVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBTaW1wbGVFbGVtZW50ICggQXR0cmlidXRlRWxlbWVudCBhdHRyaWJ1dGVFbGVtZW50LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBwcmltKQotICB7Ci0gICAgc3VwZXIobmFtZSxhdHRyaWJ1dGVFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5TSU1QTEUpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5BVFRSSUJVVEVfT1dORVI7Ci0gICAgc2V0UHJpbWl0aXZlKHByaW0pOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIEF0dHJpYnV0ZSB0aGF0IG93bnMgdGhpcyBzaW1wbGUgdHlwZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE5hbWUgb2YgdGhlIEF0dHJpYnV0ZUVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBTaW1wbGVFbGVtZW50ICggRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gcHJpbSkKLSAgewotICAgIHN1cGVyKG5hbWUsZmllbGRFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5TSU1QTEUpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5GSUVMRF9PV05FUjsKLSAgICBzZXRQcmltaXRpdmUocHJpbSk7Ci0gIH0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TaW1wbGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU2ltcGxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE5NDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TaW1wbGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW1wbGVUeXBlIGltcGxlbWVudHMgRGF0YVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBmVW5pcXVlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFNpbXBsZVR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBmVHlwZSA9IHR5cGU7Ci0gIH0KLQotICAvKioKLSAgKiBpbnB1dEZvcm0gcmV0dXJucyB0aGUgdXNlciBpbnB1dCBodG1sCi0gICogVGhlIHNpbXBsZSBmb3JtIGlzIGp1c3QgYSB0ZXh0IGlucHV0IGJveAotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW5wdXQgZWxlbWVudAotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBmb3JtIHVzZWQgdG8gY29sbGVjdCB0aGUgZGF0YQotICAqLwotICBwdWJsaWMgU3RyaW5nIGlucHV0Rm9ybShTdHJpbmcgbmFtZSkKLSAgewotICAgICBTdHJpbmcgaW5wdXRGb3JtID0gIjxURCBBTElHTj1cImxlZnRcIj48SU5QVVQgVFlQRT1cIlRFWFRcIiBOQU1FPVwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiXCIgU0laRT0yMD48L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBpbnB1dEZvcm07Ci0gIH0KLQotICAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBkaWN0YXRlcyBob3cgeW91IHdhbnQgdG8gcHJvY2VzcyB0aGUgCi0gICogaW5jb21pbmcgc3RyaW5nIGZyb20gdGhlIGlucHV0IGpzcC4gWW91IG1heSBvciBtYXkgbm90IHVzZSB0aGUgbWFya3VwIAotICAqIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdHlwZS4gVGhlIHNpbXBsZSB0eXBlcyB1c2UgaXQuIERvbUVsZW1lbnQgZG9lcyBub3QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29kZSB0byBiZSBnZW5lcmF0ZWQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0Q29kZShTdHJpbmcgbmFtZSwgU3RyaW5nIGlkKQotICB7Ci0gICAgIFN0cmluZyByZXF1ZXN0Q29kZSA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyIgKyBHZW5lcmF0b3IuU1BBQ0UgCi0gICAgIAkgICAgICAgICAgICAgICAgICAgKyBpZCArICI9ICByZXF1ZXN0LmdldFBhcmFtZXRlcihcIiIKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIG5hbWUgKyJcIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiByZXF1ZXN0Q29kZTsKLSAgIH0KLSAKLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBoYW5kcyBiYWNrIHRoZSBjb2RlIHJlcXVpcmVkIHRvIGdvIGZyb20gdGhlIAotICAqIHN0cmluZyB0aGUgdXNlciBlbnRlcmVkIHRvIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZWxlbWVudAotICAqIGl0IHVzZXMgYW5vdGhlciBmdW5jdGlvbiB0aGF0IGFsbCBzdWJjbGFzc2VzIG9mIFNpbXBsZVR5cGUgYXJlIHJlcXVpcmVkIHRvIGltcGxlbWVudAotICAqIFRoZSBTdHJpbmdUb1R5cGUgZnVuY3Rpb24KLSAgKiBAcGFyYW0gU3RyaW5nIHR5cGVOYW1lIHRoaXMgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0eXBlIGllIGludCxib29sZWFuCi0gICogQHBhcmFtIFN0cmluZyBub2RlTmFtZSBUaGUgbm9kZU5hbWUgaXMganVzdCB0aGUgYXR0cmlidXRlbmFtZSArIFRlbXAuIAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyB0eXBlTmFtZSArIEdlbmVyYXRvci5TUEFDRSArIG5vZGVOYW1lIAotICAgICAJICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5TUEFDRSArICIgPSAiICsgU3RyaW5nVG9UeXBlKGF0dHJpYnV0ZU5hbWUpIAotICAgICAJICAgICAgICAgICAgICAgICArICIiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgKiBjb252ZXJ0cyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm94eSAKLSAgKiBiYWNrIHRvIGEgc3RyaW5nIAotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHR5cGUgdG8gc3RyaW5nLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0KLSAgICBTdHJpbmcgY29udmVyc2lvbiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLkpzcFV0aWxzLm1hcmt1cCgiICsgVHlwZVRvU3RyaW5nKG5hbWUpICsgIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlPSB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiAlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLQotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0KLSAgIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHR5cGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbmFtZShpbmNsdWRpbmcgcGFja2FnZSkuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZlR5cGU7Ci0gIH0KLQotICAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKCkKLSAgewotICAgIHJldHVybiBmVW5pcXVlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmVW5pcXVlTmFtZSA9IG5hbWU7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU3RhdGVMZXNzQmVhblR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdGF0ZUxlc3NCZWFuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmE5OGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdGF0ZUxlc3NCZWFuVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgU3RhdGVMZXNzQmVhblR5cGUgZXh0ZW5kcyBSZWNvZ25pemVkUmV0dXJuVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotCi0gIHByaXZhdGUgU3RyaW5nIGZUeXBlTmFtZTsKLQotCi0KLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIAotICBwdWJsaWMgU3RhdGVMZXNzQmVhblR5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5TVEFURUxFU1NfQkVBTik7Ci0gICAgZlR5cGVOYW1lID0gbmFtZTsKLQotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdHJpbmdUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU3RyaW5nVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjk5Yzc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdHJpbmdUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgU3RyaW5nVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgU3RyaW5nVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5TVFJJTkdfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSBuYW1lICsgIjsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOyAgICAKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIlN0cmluZy52YWx1ZU9mKCIgKyBuYW1lICsgIikiOwotICB9Ci0gCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVHlwZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGYyMmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0vKioKLSogVHlwZUVsZW1lbnQgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIEphdmEgYmVhbiBmZWF0dXJlcyB0aGF0IGhhdmUgdHlwZXMuCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIGludCBCRUFOID0gMDsKLSAgcHVibGljIHN0YXRpYyBpbnQgU0lNUExFID0gMTsKLSAgcHVibGljIHN0YXRpYyBpbnQgQVJSQVkgPSAyOwotCi0gIHByaXZhdGUgaW50IGZUeXBlOwotICBwcm90ZWN0ZWQgaW50IGZPd25lclR5cGU7Ci0gIHByaXZhdGUgYm9vbGVhbiBmUHJpbWl0aXZlID0gZmFsc2U7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuIEF1dG9tYXRpY2FsbHkgYWRkcyB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gbW9kZWwuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIG93biB0aGlzIG9iamVjdC4KLSAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdCwgb25lIG9mCi0gICogPGNvZGU+QkVBTjwvY29kZT4sIDxjb2RlPlNJTVBMRTwvY29kZT4gb3IgPGNvZGU+QVJSQVk8L2NvZGU+LgotICAqLwotICBwcm90ZWN0ZWQgVHlwZUVsZW1lbnQgKCBTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIGludCB0eXBlICkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIGZUeXBlID0gdHlwZTsKLSAgfQotCi0gIC8qKgotICAqLwotICBwcm90ZWN0ZWQgVHlwZUVsZW1lbnQgKCBTdHJpbmcgbmFtZSwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lLCBTdHJpbmcgaW5ib3VuZFJlbE5hbWUsIGludCB0eXBlICkKLSAgewotICAgIHN1cGVyKG5hbWUsZWxlbWVudCxvdXRib3VuZFJlbE5hbWUsaW5ib3VuZFJlbE5hbWUpOwotICAgIGZUeXBlID0gdHlwZTsKLSAgfQotCi0gIC8qCi0gICpUaGlzIHdpbGwgdGVsbCB5b3Ugd2V0aGVyIHRoZSB0eXBlIGlzIGEgYmVhbgotICAqQHBhcmFtIEJvb2xlYW4gcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYmVhbgotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gaXNCZWFuKCkKLSAgewotICAgIGlmIChmVHlwZSA9PSBCRUFOKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKgotICAqVGhpcyB3aWxsIHRlbGwgeW91IHdldGhlciB0aGUgdHlwZSBpcyBhIGJlYW4KLSAgKkBwYXJhbSBCb29sZWFuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGJlYW4KLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkKLSAgewotICAgIHJldHVybiBmUHJpbWl0aXZlOwotICB9Ci0KLSAgLyoKLSAgKlRoaXMgd2lsbCB0ZWxsIHlvdSB3ZXRoZXIgdGhlIHR5cGUgaXMgYSBiZWFuCi0gICpAcGFyYW0gQm9vbGVhbiByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBiZWFuCi0gICoqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRQcmltaXRpdmUoYm9vbGVhbiBwcmltKQotICB7Ci0gICAgZlByaW1pdGl2ZSA9IHByaW07IAotICB9Ci0KLQotICAvKgotICAqIFRoaXMgaXMgbWFpbmx5IG5lZWRlZCBmb3IgYXJyYXlzIGFzIHdpdGggYWxsIHR5cGVzIHRoZQotICAqIG5hbWVzIGNvbWUgb3V0IGFzIGphdmEudXRpbC50eXBlLCBidXQgd2l0aCBhbiBhcnJheSBpdCAKLSAgKiBpc250IGV4cGxpY2l0IGluIHRlbGxpbmcgdXMgaXRzIGFuIGFycmF5Ci0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgfQotICAKLSAgLyoKLSAgKlRoaXMgd2lsbCB0ZWxsIHlvdSB3ZXRoZXIgdGhlIHR5cGUgaXMgYSBzaW1wbGUKLSAgKkBwYXJhbSBCb29sZWFuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHNpbXBsZQotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGUoKQotICB7Ci0gICAgaWYgKGZUeXBlID09IFNJTVBMRSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoKLSAgKlRoaXMgd2lsbCB0ZWxsIHlvdSB3ZXRoZXIgdGhlIHR5cGUgaXMgYSBhcnJheQotICAqQHBhcmFtIEJvb2xlYW4gcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYXJyYXkKLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIGlzQXJyYXkoKQotICB7Ci0gICAgaWYgKGZUeXBlID09IEFSUkFZKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfQVRUUklCVVRFUyA9ICJhdHRyaWJ1dGVzIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0ZJRUxEUyA9ICJmaWVsZHMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfVFlQRSA9ICJ0eXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX09XTkVSID0gIm93bmVyIjsKLQotICBwdWJsaWMgc3RhdGljIGludCBQQVJBTUVURVJfT1dORVIgPSAwOwotICBwdWJsaWMgc3RhdGljIGludCBBVFRSSUJVVEVfT1dORVIgPSAxOwotICBwdWJsaWMgc3RhdGljIGludCBGSUVMRF9PV05FUiA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IFJPT1QgPSAzOwotCi0gIC8qCi0gICogVGhpcyBjb3VsZCBiZSBUaGUgcm9vdCB0ZXN0IGJlYW4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGlzIGlzIHJvb3QgYmVhbgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoKQotICB7Ci0gICAgaWYoZk93bmVyVHlwZSA9PSBST09UKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKgotICAqIFRoaXMgVHlwZSBjb3VsZCBiZSBvd25lZCBieSBhIFBhcmFtZXRlciBvciBhbiBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGlzIGlzIG93bmVkIGJ5IGEgcGFyYW1ldGVyCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzT3duZXJQYXJhbWV0ZXIoKQotICB7Ci0gICAgaWYoZk93bmVyVHlwZSA9PSBQQVJBTUVURVJfT1dORVIpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qCi0gICogVGhpcyBUeXBlIGNvdWxkIGJlIG93bmVkIGJ5IGEgUGFyYW1ldGVyIG9yIGFuIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoaXMgaXMgb3duZWQgYnkgYW4gYXR0cmlidXRlIAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc093bmVyQXR0cmlidXRlKCkKLSAgewotICAgIGlmKGZPd25lclR5cGUgPT0gQVRUUklCVVRFX09XTkVSKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKgotICAqIFRoaXMgVHlwZSBjb3VsZCBiZSBvd25lZCBieSBhIFBhcmFtZXRlciBvciBhbiBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGlzIGlzIG93bmVkIGJ5IGFuIGF0dHJpYnV0ZSAKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPd25lckZpZWxkKCkKLSAgewotICAgIGlmKGZPd25lclR5cGUgPT0gRklFTERfT1dORVIpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgVHlwZSBtYXkgYmUgb3duZWQgYnkgYSBwYXJhbWV0ZXIgb3IgYW4gYXR0cmlidXRlIAotICAqIFVzZSB0aGlzIG1ldGhvZCBpbiBjb25qdW5jdGlvbiB3aXRoIGlzT3duZXJQYXJhbXRlciwgaXNPd25lcgotICAqIEByZXR1cm4gQmFzaWNFbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgb3ducyB0aGlzIGF0dHJpYnV0ZS4KLSAgKi8KLSAgcHVibGljIEJhc2ljRWxlbWVudCBnZXRPd25pbmdFbGVtZW50ICgpCi0gIHsKLSAgICBpZiAoaXNPd25lclBhcmFtZXRlcigpKXsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhSRUxfT1dORVIpOwotICAgICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoQmFzaWNFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gICAgfQotICAgIGVsc2UgaWYoaXNPd25lckF0dHJpYnV0ZSgpKXsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhSRUxfT1dORVIpOwotICAgICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoQmFzaWNFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gICAgfQotICAgIGVsc2UgaWYoaXNPd25lckZpZWxkKCkpewotICAgICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9PV05FUik7Ci0gICAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCYXNpY0VsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVHlwZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjk4MjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLS8qKgotICogVHlwZUZhY3RvcnkKLSAqIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgMTI6NDE6NDggUE0pCi0gKiBAYXV0aG9yOiBHaWxiZXJ0IEFuZHJld3MKLSAqLwotcHVibGljIGNsYXNzIFR5cGVGYWN0b3J5IAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX05BTUUgICAgICAgICAgICAgICAgICAgPSAiamF2YS5uZXQuVVJMIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX05BTUUgICAgICAgICAgICAgICA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklHX0RFQ0lNQUxfTkFNRSAgICAgICAgICA9ICJqYXZhLm1hdGguQmlnRGVjaW1hbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJR19JTlRFR0VSX05BTUUgICAgICAgICAgPSAiamF2YS5tYXRoLkJpZ0ludGVnZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX05BTUUgICAgICAgICAgICAgICAgID0gImphdmEudXRpbC5EYXRlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFR09SSUFOX0NBTEVOREFSX05BTUUgPSAiamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMRU5EQVJfTkFNRSAgICAgICAgICAgICA9ICJqYXZhLnV0aWwuQ2FsZW5kYXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOX05BTUUgICAgICAgICAgICAgID0gImphdmEubGFuZy5Cb29sZWFuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQllURV9OQU1FICAgICAgICAgICAgICAgICAgPSAiamF2YS5sYW5nLkJ5dGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfTkFNRSAgICAgICAgICAgICAgID0gImphdmEubGFuZy5Eb3VibGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTE9BVF9OQU1FICAgICAgICAgICAgICAgICA9ICJqYXZhLmxhbmcuRmxvYXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFR0VSX05BTUUgICAgICAgICAgICAgICA9ICJqYXZhLmxhbmcuSW50ZWdlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPTkdfTkFNRSAgICAgICAgICAgICAgICAgID0gImphdmEubGFuZy5Mb25nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlRfTkFNRSAgICAgICAgICAgICAgICAgPSAiamF2YS5sYW5nLlNob3J0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUkFDVEVSX05BTUUgICAgICAgICAgICA9ICJqYXZhLmxhbmcuQ2hhcmFjdGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9CT09MRUFOX05BTUUgICAgICAgICA9ICJib29sZWFuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9CWVRFX05BTUUgICAgICAgICAgICA9ICJieXRlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9ET1VCTEVfTkFNRSAgICAgICAgICA9ICJkb3VibGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0ZMT0FUX05BTUUgICAgICAgICAgID0gImZsb2F0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9JTlRFR0VSX05BTUUgICAgICAgICA9ICJpbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0xPTkdfTkFNRSAgICAgICAgICAgID0gImxvbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX1NIT1JUX05BTUUgICAgICAgICAgID0gInNob3J0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9DSEFSX05BTUUgICAgICAgICAgICA9ICJjaGFyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9OQU1FICAgICAgICAgICAgICAgICAgPSAidm9pZCI7Ci0KLSAgLy9zb21lIHNwZWNpYWwgY29tcGxleAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET01fRUxFTUVOVF9OQU1FICAgPSAib3JnLnczYy5kb20uRWxlbWVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRUxFTUVOVF9OQU1FID0gImphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVMRVNTX0JFQU4gPSBCZWFuRWxlbWVudC5TVEFURUxFU1NfQkVBTjsKLQotCi0KLSAgcHVibGljIHN0YXRpYyBIYXNodGFibGUgamF2YVR5cGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgcHVibGljIFR5cGVGYWN0b3J5KCl7fQotCi0gIHN0YXRpY3sKLSAgICBqYXZhVHlwZXMucHV0KEJPT0xFQU5fTkFNRSxuZXcgUHJpbWl0aXZlSmF2YVR5cGVzKEJPT0xFQU5fTkFNRSkpOwotICAgIGphdmFUeXBlcy5wdXQoQllURV9OQU1FLCAgIG5ldyBQcmltaXRpdmVKYXZhVHlwZXMoQllURV9OQU1FKSk7Ci0gICAgamF2YVR5cGVzLnB1dChET1VCTEVfTkFNRSwgbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhET1VCTEVfTkFNRSkpOwotICAgIGphdmFUeXBlcy5wdXQoRkxPQVRfTkFNRSwgIG5ldyBQcmltaXRpdmVKYXZhVHlwZXMoRkxPQVRfTkFNRSkpOwotICAgIGphdmFUeXBlcy5wdXQoSU5URUdFUl9OQU1FLG5ldyBQcmltaXRpdmVKYXZhVHlwZXMoSU5URUdFUl9OQU1FKSk7Ci0gICAgamF2YVR5cGVzLnB1dChMT05HX05BTUUsICAgbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhMT05HX05BTUUpKTsKLSAgICBqYXZhVHlwZXMucHV0KFNIT1JUX05BTUUsICBuZXcgUHJpbWl0aXZlSmF2YVR5cGVzKFNIT1JUX05BTUUpKTsKLSAgICBqYXZhVHlwZXMucHV0KENIQVJBQ1RFUl9OQU1FLCAgbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhDSEFSQUNURVJfTkFNRSkpOwotICB9Ci0KLQotICAvKgotICAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHVzIHRvIGhhbmRsZSByZWNvZ25pemVkIGJlYW5zIAotICAqIGluIGRpc3BsYXlpbmcgYW5kIGdlbmVyYXRpbmcgY29kZSBmb3IgdGhlbSBpbnN0ZWFkIG9mIAotICAqIHRyZWF0aW5nIHRoZW0gYXMgY29tcGxleCB0eXBlcwotICAqLyAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlY29nbml6ZWRCZWFuKFN0cmluZyB0eXBlKQotICB7Ci0KLSAgICAvLyAgICAgCi0gICAgLy9jdXJyZW50IHJlY29nbml6ZWQgYmVhbnMgKG1vc3RseSBqYXZhLmxhbmcpCi0gICAgaWYgKHR5cGUuZXF1YWxzKEJPT0xFQU5fTkFNRSkgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoQllURV9OQU1FKSAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKERPVUJMRV9OQU1FKSAgICAgICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhGTE9BVF9OQU1FKSAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKElOVEVHRVJfTkFNRSkgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoTE9OR19OQU1FKSAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKFNIT1JUX05BTUUpICAgICAgICAgICAgICB8fCAgICAgIAotICAgICAgICB0eXBlLmVxdWFscyhDSEFSQUNURVJfTkFNRSkgICAgICAgICAgfHwgICAgICAKLSAgICAgICAgdHlwZS5lcXVhbHMoRE9NX0VMRU1FTlRfTkFNRSkgICAgICAgIHx8ICAgICAgCi0JICAgIHR5cGUuZXF1YWxzKFNPQVBfRUxFTUVOVF9OQU1FKSAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoQklHX0RFQ0lNQUxfTkFNRSkgICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhCSUdfSU5URUdFUl9OQU1FKSAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKERBVEVfTkFNRSkgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoR1JFR09SSUFOX0NBTEVOREFSX05BTUUpIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKENBTEVOREFSX05BTUUpICAgICAgICAgICB8fCAKLSAgICAgICAgdHlwZS5lcXVhbHMoVVJMX05BTUUpICAgICAgICAgICAgICAgICB8fCAgICAKLSAgICAgICAgdHlwZS5lcXVhbHMoU1RSSU5HX05BTUUpKSAgcmV0dXJuIHRydWU7ICAgICAgCi0gICAgIHJldHVybiBmYWxzZTsgCi0gIAotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB1cyB0byBoYW5kbGUgdW5zdXBwb3J0ZWQgdHlwZXMgCi0gICogaWYgd2UgZG9udCB3YW50IHRvIHN1cHBvcnQgYSB0eXBlIGFuZCB3ZSB3YW50IHRvIG9taXR0IHRoaXMgIAotICAqIG1ldGhvZCBmcm9tIHRoZSBzYW1wbGVzCi0gICogQHBhcmFtIGphdmFIZWxwZXJzIHRoaXMgaXMgdGhlIHR5cGUgdG8gYmUgZXZhbHVhdGVkCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHR5cGUgaXMgbm90IHN1cHBvcnRlZAotICAqLyAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5TdXBwb3J0ZWRUeXBlKEphdmFIZWxwZXJzIGphdmFIZWxwZXJzKQotICB7Ci0gICAgLy93ZSBhbHNvIGRvbnQgc3VwcG9ydCBhcnJheXMKLSAgICBpZiAoamF2YUhlbHBlcnMuaXNBcnJheSgpfHwKLSAgICAJCWphdmFIZWxwZXJzLmdldEphdmFOYW1lKCkuZXF1YWxzKE1BUF9OQU1FKXx8Ci0gICAgCQlqYXZhSGVscGVycy5nZXRKYXZhTmFtZSgpLmVxdWFscyhWRUNUT1JfTkFNRSl8fAotICAgIAkJamF2YUhlbHBlcnMuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5jbGFzcyIpCSkgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFTSFRBQkxFX05BTUUgPSAiamF2YS51dGlsLkhhc2h0YWJsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUF9OQU1FID0gImphdmEudXRpbC5NYXAiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBWRUNUT1JfTkFNRSA9ICJqYXZhLnV0aWwuVmVjdG9yIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQVJSQVlfTkFNRSA9IEFycmF5RWxlbWVudC5BUlJBWV9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUklNSVRJVkVfQVJSQVlfTkFNRSA9ICJwcmltaXRpdmVhcnJheSI7Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVjb2duaXplZFJldHVyblR5cGUoSmF2YUhlbHBlcnMgamF2YUhlbHBlcnMpCi0gIHsKLSAgICAvL2FycmF5cyAKLSAgICAvL0hhc2h0YWJsZQotICAgIC8vVmVjdG9ycwotICAgIGlmIChqYXZhSGVscGVycy5pc0FycmF5KCkpIHJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKGphdmFIZWxwZXJzLmdldEphdmFOYW1lKCkuZXF1YWxzKEhBU0hUQUJMRV9OQU1FKSlyZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIGlmIChqYXZhSGVscGVycy5nZXRKYXZhTmFtZSgpLmVxdWFscyhWRUNUT1JfTkFNRSkpcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAoamF2YUhlbHBlcnMuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoTUFQX05BTUUpKXJldHVybiB0cnVlOwotICAgIGVsc2UgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVjb2duaXplZFJldHVyblR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICAvL2FycmF5cyAKLSAgICAvL0hhc2h0YWJsZQotICAgIC8vVmVjdG9ycwotICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoQVJSQVlfTkFNRSkpIHJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKEhBU0hUQUJMRV9OQU1FKSlyZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhWRUNUT1JfTkFNRSkpcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoTUFQX05BTUUpKXJldHVybiB0cnVlOwotICAgIGVsc2UgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhdGVMZXNzQmVhbihTdHJpbmcgdHlwZSkKLSAgewotICAgIGlmKHR5cGUuc3RhcnRzV2l0aChTVEFURUxFU1NfQkVBTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLSAgLyoqCi0gICogQ3JlYXRlcyBhIHR5cGUgYmFzZWQgb24gdGhlIEphdmFIZWxwZXIgdGhlbiBzZXRzIHRoaXMgdHlwZSBpbiB0aGUgZWxlbWVudAotICAqIEBwYXJhbXMgSmF2YUhlbHBlcnMgdGhpcyBob2xkcyB0aGUgdHlwZQotICAqIEBwYXJhbSBUeXBlRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCB3aWxsIGhvbGQgdGhlIHR5cGUgY3JlYXRlZAotICAqIEBwYXJhbSBTdHJpbmcgVW5pcXVlbmFtZSB0byBiZSB1c2VkIHdoZW4gbmFtaW5nIHRlbXAgdmFyaWFibGVzCi0gICovCi0gCi0gIHB1YmxpYyBzdGF0aWMgRGF0YVR5cGUgY3JlYXRlVHlwZShTdHJpbmcgdHlwZSwgU3RyaW5nIFVuaXF1ZU5hbWUpCi0gIHsKLSAgICAvL3RoaXMgZ3V5IG1pZ2h0IGJlIGJvdGggc3RhdGVsZXNzIGFuZCBvbmUgb2YgdGhlIGJlbG93IGVsZW1lbnRzCi0gICAgLy93ZSB3b3VsZCBsaWtlIHRvIGJlIGFzIHNwZWNpZmljIGFzIHdlIGNhbiwgc3RhdGVsZXNzIGlzIHRoZSB3b3JzdCBjYXNlIAotICAgIGJvb2xlYW4gc3RhdGVsZXNzID0gZmFsc2U7ICAKLSAgICBpZih0eXBlLnN0YXJ0c1dpdGgoU1RBVEVMRVNTX0JFQU4pKSB7Ci0gICAgICBzdGF0ZWxlc3MgPSB0cnVlOwotICAgICAgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDI5KTsgCi0gICAgfQotICAgCi0gICAgRGF0YVR5cGUgZGF0YXR5cGUgPSBudWxsOwotICAgIGlmICAgICAgKHR5cGUuZXF1YWxzKFBSSU1fQk9PTEVBTl9OQU1FKSkgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlQm9vbGVhblR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQUklNX0JZVEVfTkFNRSkpICAgICBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVCeXRlVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fRE9VQkxFX05BTUUpKSAgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlRG91YmxlVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fRkxPQVRfTkFNRSkpICAgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlRmxvYXRUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoUFJJTV9MT05HX05BTUUpKSAgICBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVMb25nVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fSU5URUdFUl9OQU1FKSkgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlSW50VHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fQ0hBUl9OQU1FKSkgICAgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlQ2hhclR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQUklNX1NIT1JUX05BTUUpKSAgIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZVNob3J0VHlwZSgpOwotICAgIAotCi0gICAgLy9zZWUgaWYgdGhpcyBjcml0dGVyIGlzIGEgamF2YXR5cGUKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhCT09MRUFOX05BTUUpICAgICB8fAotICAgICAgICAgICAgdHlwZS5lcXVhbHMoQllURV9OQU1FKSAgICAgICAgfHwKLSAgICAgICAgICAgIHR5cGUuZXF1YWxzKERPVUJMRV9OQU1FKSAgICAgIHx8Ci0gICAgICAgICAgICB0eXBlLmVxdWFscyhGTE9BVF9OQU1FKSAgICAgICB8fAotICAgICAgICAgICAgdHlwZS5lcXVhbHMoSU5URUdFUl9OQU1FKSAgICAgfHwKLSAgICAgICAgICAgIHR5cGUuZXF1YWxzKExPTkdfTkFNRSkgICAgICAgIHx8Ci0gICAgICAgICAgICB0eXBlLmVxdWFscyhDSEFSQUNURVJfTkFNRSkgIHx8Ci0gICAgICAgICAgICB0eXBlLmVxdWFscyhTSE9SVF9OQU1FKSkgICAgICAgIGRhdGF0eXBlID0gKERhdGFUeXBlKWphdmFUeXBlcy5nZXQodHlwZSk7ICAgCi0KLSAgICAvL3NlZSBpZiBpdHMgYSBjYXNlIHdlIGhhbmRsZQotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFNUUklOR19OQU1FKSkgICAgICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBTdHJpbmdUeXBlKCk7IAotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFZPSURfTkFNRSkpICAgICAgICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBWb2lkVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKERPTV9FTEVNRU5UX05BTUUpKSAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBEb21FbGVtZW50VHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFNPQVBfRUxFTUVOVF9OQU1FKSkgICAgICAgICBkYXRhdHlwZSA9IG5ldyBTT0FQRWxlbWVudFR5cGUoKTsgIAotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKEJJR19ERUNJTUFMX05BTUUpKSAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBCaWdEZWNpbWFsVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKEJJR19JTlRFR0VSX05BTUUpKSAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBCaWdJbnRlZ2VyVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKERBVEVfTkFNRSkpICAgICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgRGF0ZVR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhVUkxfTkFNRSkpICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IFVSTFR5cGUoKTsgCi0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoR1JFR09SSUFOX0NBTEVOREFSX05BTUUpKSAgZGF0YXR5cGUgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXJUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoQ0FMRU5EQVJfTkFNRSkpICBkYXRhdHlwZSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhclR5cGUoKTsKLQotICAgIC8vaXQgY291bGQgYmUgYSByZXR1cm4gdHlwZSB3ZSBzdXBwb3J0Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoSEFTSFRBQkxFX05BTUUpKSAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IEhhc2h0YWJsZVR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhWRUNUT1JfTkFNRSkpICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgVmVjdG9yVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKE1BUF9OQU1FKSkgICAgICAgICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBNYXBUeXBlKCk7Ci0KLSAgICAvLyBuZWVkIHRvIHNlZSBpZiBpdCBpcyBhbiBvYmplY3QgYXJyYXkKLSAgICAvL29yIGEgcHJpbWl0aXZlCi0gICAgZWxzZSBpZiAodHlwZS5zdGFydHNXaXRoKEFSUkFZX05BTUUpKXsgICAgICAgICAgICAgIAotICAgIAlTdHJpbmcgbmFtZSA9IHR5cGUuc3Vic3RyaW5nKDIxKTsgCi0gICAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aChQUklNX0JPT0xFQU5fTkFNRSkgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9CWVRFX05BTUUpICAgICB8fAotICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChQUklNX0RPVUJMRV9OQU1FKSAgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9GTE9BVF9OQU1FKSAgICB8fAotICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChQUklNX0xPTkdfTkFNRSkgICAgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9JTlRFR0VSX05BTUUpICB8fAotICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChQUklNX0NIQVJfTkFNRSkgICAgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9TSE9SVF9OQU1FKSkKLSAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZUFycmF5VHlwZShuYW1lKTsgIAotICAgICAgICBlbHNlCi0gICAgICAgIAlkYXRhdHlwZSA9IG5ldyBBcnJheVR5cGUobmFtZSk7Ci0KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RhdGVsZXNzKXsKLSAgICAgICAgZGF0YXR5cGUgPSBuZXcgU3RhdGVMZXNzQmVhblR5cGUodHlwZSk7Ci0KLSAgICB9Ci0KLQotICAgIGRhdGF0eXBlLnNldFVuaXF1ZU5hbWUoVW5pcXVlTmFtZSk7Ci0gICAgcmV0dXJuIGRhdGF0eXBlOwotICAgICAKLSAgfQotICAKLSAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1VSTFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9VUkxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMGZiMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1VSTFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBVUkxUeXBlIGV4dGVuZHMgU2ltcGxlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBVUkxUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlVSTF9OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlIC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJuZXcgamF2YS5uZXQuVVJMKCIgKyBuYW1lICsgIik7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsgICAgCi0gIH0KLQotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZVRvU3RyaW5nKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIG5hbWUgKyAiLnRvU3RyaW5nKCkiOwotICB9Ci0gCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVmVjdG9yVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ZlY3RvclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNzE4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVmVjdG9yVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgVmVjdG9yVHlwZSBleHRlbmRzIFJlY29nbml6ZWRSZXR1cm5UeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgVmVjdG9yVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5WRUNUT1JfTkFNRSk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ZvaWRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVm9pZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkZTkxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVm9pZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFZvaWRUeXBlIGV4dGVuZHMgU2ltcGxlVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFZvaWRUeXBlKCkKLSAgewotICAgIHN1cGVyKCJ2b2lkIik7Ci0gIH0KLQotICAgLyoqCi0gICogZm9yIGEgdm9pZCB0aGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZVRvU3RyaW5nKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICJTdHJpbmcudmFsdWVPZigiICsgbmFtZSArICIpIjsKLSAgfQotIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC92YWxpZGF0ZS9WYWxpZGF0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhOTc2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC92YWxpZGF0ZS9WYWxpZGF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci0KLS8qKgotICAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgdmFsaWRhdGlvbiBzdGF0ZSBvZiBwcm9qZWN0cyB0aGF0IHNvbWUgdGFza3MgbWF5IHdhbnQKLSAgKiB0byBkaXNhYmxlLiAgVGhlIG1hbmFnZXIgY2FuIHRoZW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSB2YWxpZGF0aW9uIHN0YXRlLgotKiovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk1hbmFnZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgICAqIFRoaXMgc2V0IGNvbnRhaW5zIGEgc2V0IG9mIElQcm9qZWN0cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWRhdGVkLgotICAqKi8KLSAgcHJpdmF0ZSBIYXNoU2V0IHByb2plY3RzID0gbnVsbDsgICAgICAgICAgICAgIAotCi0gIC8qKgotICAgICogVGhpcyBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGoyZWUgdmFsaWRhdG9yLgotICAqKi8KLSAgLy9wZ20gcHJpdmF0ZSBWYWxpZGF0b3JNYW5hZ2VyIGoyZWVNYW5hZ2VyID0gbnVsbDsKLQotICAvKioKLSAgICAqIFRoaXMgYm9vbGVhbiBjb250YWlucyB0aGUgYXV0byBidWlsZCBzZXR0aW5nIHVuZGVyIHByZWZlcnJlbmNlCi0gICoqLwotICBwcml2YXRlIGJvb2xlYW4gaXNBdXRvQnVpbGRfOwotICBwcml2YXRlIGJvb2xlYW4gYXV0b0J1aWxkRGlzYWJsZWRfOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBWYWxpZGF0aW9uTWFuYWdlcigpCi0gIHsKLSAgICBwcm9qZWN0cyAgICA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgLy9wZ20gajJlZU1hbmFnZXIgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKTsKLSAgICBzZXRBdXRvQnVpbGRQcmVmZXJlbmNlKCk7Ci0gICAgYXV0b0J1aWxkRGlzYWJsZWRfID0gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgICogRGlzYWJsZXMgdGhlIHZhbGlkYXRpb24gZm9yIGEgcHJvamVjdCBpZiByZXF1aXJlZC4KLSAgKiovCi0gIHB1YmxpYyB2b2lkIGRpc2FibGVWYWxpZGF0aW9uRm9yUHJvamVjdCggSVByb2plY3QgcHJvamVjdCApCi0gIHsgICAgCi0gICAgLy8gV2UgbmVlZCB0byByZW1lbWJlciB0aGF0IHRoaXMgcHJvamVjdCBuZWVkcyBoYXZlIHZhbGlkYXRpb24gdHVybmVkIGJhY2sgb24uCi0gICAgcHJvamVjdHMuYWRkKCBwcm9qZWN0ICk7Ci0gICAgCi0gICAgLy9wZ20gajJlZU1hbmFnZXIuc3VzcGVuZEFsbFZhbGlkYXRpb24oIHRydWUgKTsKLSAgfQotCi0gIC8qKgotICAgICogUmVzdG9yZXMgdGhlIHZhbGlkYXRpb24gc3RhdGUgZm9yIGFsbCBuZWVkZWQgcHJvamVjdHMuCi0gICoqLwotICBwdWJsaWMgdm9pZCByZXN0b3JlVmFsaWRhdGlvbkZvclByb2plY3RzKCBib29sZWFuIHJ1blZhbGlkYXRpb24gKQotICB7Ci0gICAgLy9wZ20gajJlZU1hbmFnZXIuc3VzcGVuZEFsbFZhbGlkYXRpb24oIGZhbHNlICk7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9qZWN0cy5pdGVyYXRvcigpOwotCi0gICAgd2hpbGUoIGl0ZXJhdG9yLmhhc05leHQoKSApCi0gICAgewotICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkoaXRlcmF0b3IubmV4dCgpKTsKLQotICAgICAgLy8gTm93IGtpY2sgb2ZmIHZhbGlkYXRpb24gZm9yIHRoaXMgcHJvamVjdCBpZiB0aGlzIHdhcyByZXF1ZXN0ZWQuCi0gICAgICBpZiggcnVuVmFsaWRhdGlvbiApCi0gICAgICB7Ci0JICAgIC8vcGdtIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIHZhbGlkT3AgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oIHByb2plY3QsIG51bGwgKTsKLQkgICAgLy9wZ20gdmFsaWRPcC5ydW4oIG1vbml0b3IgKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlBdXRvQnVpbGQoYm9vbGVhbiBpc0F1dG9CdWlsZCkgewotICAgIHRyeSB7Ci0gICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3b3Jrc3BhY2VEZXNjID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICB3b3Jrc3BhY2VEZXNjLnNldEF1dG9CdWlsZGluZyhpc0F1dG9CdWlsZCk7Ci0gICAgICB3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24od29ya3NwYWNlRGVzYyk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc2FibGVBdXRvQnVpbGQoKSB7Ci0gICAgaWYgKCFhdXRvQnVpbGREaXNhYmxlZF8pIHsKLSAgICAgIHNldEF1dG9CdWlsZFByZWZlcmVuY2UoKTsKLSAgICAgIG1vZGlmeUF1dG9CdWlsZChmYWxzZSk7Ci0gICAgICBhdXRvQnVpbGREaXNhYmxlZF8gPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc3RvcmVBdXRvQnVpbGQoKSB7Ci0gICAgaWYgKGF1dG9CdWlsZERpc2FibGVkXykgewotICAgICAgbW9kaWZ5QXV0b0J1aWxkKGdldEF1dG9CdWlsZFByZWZlcmVuY2UoKSk7Ci0gICAgICBhdXRvQnVpbGREaXNhYmxlZF8gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRBdXRvQnVpbGRQcmVmZXJlbmNlKCkgewotICAgIGlzQXV0b0J1aWxkXyA9IGdldFdvcmtzcGFjZUF1dG9CdWlsZFByZWZlcmVuY2UoKTsKLSAgICByZXR1cm4gaXNBdXRvQnVpbGRfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b0J1aWxkUHJlZmVyZW5jZSgpIHsKLSAgICByZXR1cm4gaXNBdXRvQnVpbGRfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0V29ya3NwYWNlQXV0b0J1aWxkUHJlZmVyZW5jZSgpIHsKLSAgICBJV29ya3NwYWNlRGVzY3JpcHRpb24gd29ya3NwYWNlRGVzYyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotICAgIHJldHVybiB3b3Jrc3BhY2VEZXNjLmlzQXV0b0J1aWxkaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL0JpbmRpbmdFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvQmluZGluZ0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0ZmI2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvQmluZGluZ0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX1BPUlQgPSAicG9ydCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9PUEVSQVRJT05TID0gIm9wZXJhdGlvbnMiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfUE9SVF9UWVBFID0gInBvcnR0eXBlIjsKLSAgCi0gIHB1YmxpYyBCaW5kaW5nRWxlbWVudCAoUG9ydEVsZW1lbnQgcG9ydEVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLHBvcnRFbGVtZW50LFJFTF9QT1JULFBvcnRFbGVtZW50LlJFTF9CSU5ESU5HKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQb3J0KCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfUE9SVCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UG9ydFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9QT1JUX1RZUEUpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldE9wZXJhdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9PUEVSQVRJT05TKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZPcGVyYXRpb25zKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9PUEVSQVRJT05TKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvRGVmaW5pdGlvbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9EZWZpbml0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTgxNTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9EZWZpbml0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIERlZmluaXRpb25FbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfU0VSVklDRVMgPSAic2VydmljZXMiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfV1NETCA9ICJ3c2RsIjsKLSAgCi0gIHB1YmxpYyBEZWZpbml0aW9uRWxlbWVudCAoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLHdzZGxFbGVtZW50LFJFTF9XU0RMLFdTRExFbGVtZW50LlJFTF9ERUZJTklUSU9OUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0V1NETCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1dTREwpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZpY2VzKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfU0VSVklDRVMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlNlcnZpY2VzKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9TRVJWSUNFUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL01lc3NhZ2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvTWVzc2FnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2YmIxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvTWVzc2FnZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX09QRVJBVElPTiA9ICJvcGVyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfUEFSVFMgPSAicGFydHMiOwotICAKLSAgcHVibGljIE1lc3NhZ2VFbGVtZW50IChPcGVyYXRpb25FbGVtZW50IG9wZXJhdGlvbkVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLG9wZXJhdGlvbkVsZW1lbnQsUkVMX09QRVJBVElPTixPcGVyYXRpb25FbGVtZW50LlJFTF9NRVNTQUdFUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0T3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfT1BFUkFUSU9OKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJ0cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1BBUlRTKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZQYXJ0cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfUEFSVFMpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9PcGVyYXRpb25FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvT3BlcmF0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBhZjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9PcGVyYXRpb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0JJTkRJTkcgPSAiYmluZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9NRVNTQUdFUyA9ICJtZXNzYWdlcyI7Ci0KLSAgcHVibGljIE9wZXJhdGlvbkVsZW1lbnQgKEJpbmRpbmdFbGVtZW50IGJpbmRpbmdFbGVtZW50LFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxiaW5kaW5nRWxlbWVudCxSRUxfQklORElORyxCaW5kaW5nRWxlbWVudC5SRUxfT1BFUkFUSU9OUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QmluZGluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX0JJTkRJTkcpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfTUVTU0FHRVMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZk1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9NRVNTQUdFUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BhcnRFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUGFydEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkZjY3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUGFydEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBQYXJ0RWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX01FU1NBR0UgPSAibWVzc2FnZSI7Ci0gICAgCi0gIHB1YmxpYyBQYXJ0RWxlbWVudCAoTWVzc2FnZUVsZW1lbnQgbWVzc2FnZUVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1lc3NhZ2VFbGVtZW50LFJFTF9NRVNTQUdFLE1lc3NhZ2VFbGVtZW50LlJFTF9QQVJUUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX01FU1NBR0UpOwotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9Qb3J0RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTgwZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgUG9ydEVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9CSU5ESU5HID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfU0VSVklDRSA9ICJzZXJ2aWNlIjsKLSAgCi0gIHB1YmxpYyBQb3J0RWxlbWVudCAoU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLHNlcnZpY2VFbGVtZW50LFJFTF9TRVJWSUNFLFNlcnZpY2VFbGVtZW50LlJFTF9QT1JUUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1NFUlZJQ0UpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEJpbmRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9CSU5ESU5HKTsKLSAgfQotIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUG9ydFR5cGVFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUG9ydFR5cGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWNjZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRUeXBlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFBvcnRUeXBlRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0JJTkRJTkcgPSAiYmluZGluZyI7Ci0gIAotICBwdWJsaWMgUG9ydFR5cGVFbGVtZW50IChCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCxTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsYmluZGluZ0VsZW1lbnQsUkVMX0JJTkRJTkcsQmluZGluZ0VsZW1lbnQuUkVMX1BPUlRfVFlQRSk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QmluZGluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX0JJTkRJTkcpOwotICB9Ci0KLSAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1NlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvU2VydmljZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlODYzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvU2VydmljZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX1BPUlRTID0gInBvcnRzIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0RFRklOSVRJT04gPSAiZGVmaW5pdGlvbiI7Ci0gIAotICBwdWJsaWMgU2VydmljZUVsZW1lbnQgKERlZmluaXRpb25FbGVtZW50IGRlZmluaXRpb25FbGVtZW50LFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxkZWZpbml0aW9uRWxlbWVudCxSRUxfREVGSU5JVElPTixEZWZpbml0aW9uRWxlbWVudC5SRUxfU0VSVklDRVMpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9ERUZJTklUSU9OKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQb3J0cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1BPUlRTKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZQb3J0cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfUE9SVFMpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TdHViYmVkV1NETE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvU3R1YmJlZFdTRExNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTVlMjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TdHViYmVkV1NETE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi1wdWJsaWMgY2xhc3MgU3R1YmJlZFdTRExNb2RlbAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHJvdGVjdGVkIE1vZGVsIGZNb2RlbDsKLSAgcHVibGljIFN0dWJiZWRXU0RMTW9kZWwoKQotICB7Ci0gICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSBuZXcgV1NETEVsZW1lbnQoIldTRExGaWxlcyIpOwotICAgIGZNb2RlbCA9IHdzZGxFbGVtZW50LmdldE1vZGVsKCk7ICAgCi0gIH0KLQotICBwdWJsaWMgTW9kZWwgZ2V0V1NETE1vZGVsKCkKLSAgewotICAgIHJldHVybiBmTW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBidWlsZE1vZGVsKCkKLSAgewotICAgIERlZmluaXRpb25FbGVtZW50IGRlZjEgPSBuZXcgRGVmaW5pdGlvbkVsZW1lbnQoKFdTRExFbGVtZW50KWZNb2RlbC5nZXRSb290RWxlbWVudCgpLCJTdG9ja1F1b3RlIik7IAotICAgIFNlcnZpY2VFbGVtZW50IHNlcjEgPSBuZXcgU2VydmljZUVsZW1lbnQoZGVmMSwiZ2V0UXVvdGUiKTsKLSAgICBTZXJ2aWNlRWxlbWVudCBzZXIyID0gbmV3IFNlcnZpY2VFbGVtZW50KGRlZjEsInNldFF1b3RlIik7Ci0gICAgUG9ydEVsZW1lbnQgcG9ydDEgPSBuZXcgUG9ydEVsZW1lbnQoc2VyMSwicG9ydDEiKTsKLSAgICBQb3J0RWxlbWVudCBwb3J0MiA9IG5ldyBQb3J0RWxlbWVudChzZXIxLCJwb3J0MiIpOwotICAgIFBvcnRFbGVtZW50IHBvcnQzID0gbmV3IFBvcnRFbGVtZW50KHNlcjIsInBvcnQxIik7Ci0gICAgUG9ydEVsZW1lbnQgcG9ydDQgPSBuZXcgUG9ydEVsZW1lbnQoc2VyMiwicG9ydDIiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kMSA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0MSwiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kMiA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0MiwiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kMyA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0MywiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kNCA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0NCwiYmluZDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wMSA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQxLCJvcDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wMiA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQyLCJvcDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wMyA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQzLCJvcDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wNCA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQ0LCJvcDEiKTsKLSAgICBNZXNzYWdlRWxlbWVudCBtZTEgPSBuZXcgTWVzc2FnZUVsZW1lbnQob3AxLCJtZTEiKTsKLSAgICBNZXNzYWdlRWxlbWVudCBtZTIgPSBuZXcgTWVzc2FnZUVsZW1lbnQob3AxLCJtZTIiKTsKLSAgICBQYXJ0RWxlbWVudCBwZTEgID0gbmV3IFBhcnRFbGVtZW50KG1lMSwicGUxIik7Ci0gICAgUGFydEVsZW1lbnQgcGUyICA9IG5ldyBQYXJ0RWxlbWVudChtZTIsInBlMiIpOwotCi0gICAgRGVmaW5pdGlvbkVsZW1lbnQgZGVmMiA9IG5ldyBEZWZpbml0aW9uRWxlbWVudCgoV1NETEVsZW1lbnQpZk1vZGVsLmdldFJvb3RFbGVtZW50KCksIlRlbXBDb252ZXJzaW9uIik7IAotICAgIFNlcnZpY2VFbGVtZW50IHNlcjMgPSBuZXcgU2VydmljZUVsZW1lbnQoZGVmMiwiZ2V0VGVtcCIpOwotICAgIFNlcnZpY2VFbGVtZW50IHNlcjQgPSBuZXcgU2VydmljZUVsZW1lbnQoZGVmMiwic2V0VGVtcCIpOwotICAgIFBvcnRFbGVtZW50IHBvcnQ1ID0gbmV3IFBvcnRFbGVtZW50KHNlcjMsInBvcnQxIik7Ci0gICAgUG9ydEVsZW1lbnQgcG9ydDYgPSBuZXcgUG9ydEVsZW1lbnQoc2VyNCwicG9ydDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kNSA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0NSwiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kNiA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0NiwiYmluZDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wNSA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQ1LCJvcDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wNiA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQ2LCJvcDEiKTsKLQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9XU0RMRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1dTRExFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYWE3OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1dTRExFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgV1NETEVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9ERUZJTklUSU9OUyA9ICJkZWZpbml0aW9ucyI7Ci0gIAotICAvKgotICAqCi0gICoqLwotICBwdWJsaWMgV1NETEVsZW1lbnQgKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcyhuYW1lLG5ldyBCYXNpY01vZGVsKCJXU0RMTW9kZWwiKSk7Ci0gIH0KLQotICBwdWJsaWMgV1NETEVsZW1lbnQgKFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIG1vZGVsLnNldFJvb3RFbGVtZW50KHRoaXMpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldERlZmluaXRpb25zKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfREVGSU5JVElPTlMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZkRlZmluaXRpb25zKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9ERUZJTklUSU9OUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlQXNzZW1ibHlGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlQXNzZW1ibHlGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQ3OWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZUFzc2VtYmx5RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRQcmVBc3NlbWJseUZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlRGVwbG95RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZURlcGxveUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWViZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlRGVwbG95RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRQcmVEZXBsb3lGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZURldmVsb3BGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzVkZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlSW5zdGFsbEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVJbnN0YWxsRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlOTRhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVJbnN0YWxsRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRQcmVJbnN0YWxsRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlQXNzZW1ibHlGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZUFzc2VtYmx5RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkNTZmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlQXNzZW1ibHlGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VQcmVBc3NlbWJseUZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZURlcGxveUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlRGVwbG95RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmNGE0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlRGVwbG95RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUHJlRGVwbG95RnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlRGV2ZWxvcEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlRGV2ZWxvcEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjMxNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZURldmVsb3BGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VQcmVEZXZlbG9wRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlSW5zdGFsbEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlSW5zdGFsbEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTc5MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZUluc3RhbGxGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VQcmVJbnN0YWxsRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vcGx1Z2luL1dlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODRhNzc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vcGx1Z2luL1dlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIHBsdWdpbi4KLSogPHA+Ci0qIFRoaXMgcGx1Z2luIGNvbnRhaW5zIHRoZSBidWxrIG9mIHRoZSBXZWIgU2VydmljZXMgcnVudGltZS4KLSogT25seSB0aGUgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIHBvcnRpb24gb2YgdGhlIHJ1bnRpbWUgaXMKLSogZm91bmQgZWxzZXdoZXJlIC0gaW4gdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aSBwbHVnaW4uCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbiBleHRlbmRzIFBsdWdpbgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbiBpbiBwbHVnaW4ueG1sLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCi0gIC8qKgotICAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luIGluc3RhbmNlXzsKLQotICBwcml2YXRlIExvZyBsb2dfOwotIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbiAoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBpbnN0YW5jZV8gPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgKiAoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuanN0LndzIik7Ci0gICogQHJldHVybiBUaGUgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4gZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAgIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogcGx1Z2luLnByb3BlcnRpZXMuCi0gICogQHJldHVybiBUaGUgU3RyaW5nIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgaW5zdGFuY2VfICk7Ci0gICAgCi0gICAgaWYoIGtleS5zdGFydHNXaXRoKCIlIikpCi0gICAgewotICAgICAga2V5ID0ga2V5LnN1YnN0cmluZyggMSwga2V5Lmxlbmd0aCgpICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBtc2dVdGlscy5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHBsdWdpbi5wcm9wZXJ0aWVzLiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIHRoZSBKREsncwotICAqIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdH0KLSAgKiBjbGFzcyBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLSAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSxhcmdzKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2ZTQ1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkF0dHJpYnV0ZUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIElucHV0RmlsZVR5cGVHZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIGV4dGVuZHMgSW5wdXRGaWxlVHlwZUdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIHByaXZhdGUgYm9vbGVhbiBmU3RhdGVMZXNzOwotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgY3VycmVudExldmVsLCBpbnQgbGV2ZWxzRGVlcCkKLSAgewotICAgICBzdXBlcihidWZmZXIsY3VycmVudExldmVsLGxldmVsc0RlZXApOwotICB9Ci0KLSAKLSAgLyoKLSAgKiBUYWtlcyBpbiBhbiBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbiBieSB0aGlzIHZpc2l0b3IgYWN0aW9uCi0gICogQHBhcmFtIE9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24KLSAgKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICAKLSAgICAgQXR0cmlidXRlRWxlbWVudFR5cGUgYXR0cmlidXRlRWxlbWVudFR5cGUgPSAoQXR0cmlidXRlRWxlbWVudFR5cGUpb2JqZWN0OwotICAgICAvL2lmIGl0IGlzIGEgYmVhbiBpcyBpdCBzdGF0ZWxlc3MKLSAgICAgYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKTsgCi0gICAgICAgIAotICAgICBpZihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpLmlzQmVhbigpKXsKLSAgICAgICBCZWFuRWxlbWVudCBiZWFuID0gKEJlYW5FbGVtZW50KWF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCk7Ci0gICAgICAgZlN0YXRlTGVzcyA9IGJlYW4uaXNTdGF0ZUxlc3MoKTsKLSAgICAgfQkgCi0KLSAgICAgVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgSW5wdXRGaWxlVHlwZUdlbmVyYXRvciBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yID0gbmV3IElucHV0RmlsZVR5cGVHZW5lcmF0b3IoZmJ1ZmZlcixmQ3VycmVudExldmVsLGZMZXZlbHNEZWVwKTsKLSAgICAgaWYoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5pc0JlYW4oKSAmJiAhVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5nZXROYW1lKCkpIAotICAgICAJJiYgIShnZXRSZXR1cm5QYXJhbSgpICYmIChUeXBlRmFjdG9yeS5pc1JlY29nbml6ZWRSZXR1cm5UeXBlKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCkuZ2V0VHlwZU5hbWUoKSkgfHwgZlN0YXRlTGVzcykpKQotICAgICAgICAgICAgICAgIAotICAgICBhZGRQYXJlbnRHZXR0ZXIoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0R2V0dGVyTWV0aG9kKCksYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5nZXROYW1lKCkpOwotICAgICBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yLmFkZFBhcmVudEdldHRlcihyZXR1cm5QYXJlbnRHZXR0ZXIoKSxyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKCkpOwotICAgICBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yLnNldEluc3RhbmNlTmFtZShmSW5zdGFuY2VOYW1lKTsKLSAgICAgaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5zZXRSZXR1cm5QYXJhbShnZXRSZXR1cm5QYXJhbSgpKTsKLSAgICAgdHlwZVZpc2l0b3IucnVuKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLGlucHV0RmlsZVR5cGVHZW5lcmF0b3IpOyAgIAotICAgICBmYnVmZmVyID0gaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICAgCi0gICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjhmZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLk1ldGhvZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIE1ldGhvZEZpbGVnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSW5wdXRGaWxlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHVibGljIFN0cmluZyBmUmVzdWx0TmFtZTsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiB1c2VkIGRpcmVjdGx5IAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlR2VuZXJhdG9yIChTdHJpbmcgcmVzdWx0KQotICB7Ci0gICAgICBzdXBlcigpOwotICAgICAgZlJlc3VsdE5hbWUgPSByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzCi0gICovCi0gIHB1YmxpYyBJbnB1dEZpbGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyByZXN1bHQpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgICBmUmVzdWx0TmFtZSA9IHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIGNhbGxlZCBmcm9tIHN1YmNsYXNzZXMKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWVzKFN0cmluZyByZXN1bHRzKQotICB7Ci0gICAgZlJlc3VsdE5hbWUgPSByZXN1bHRzOwotICB9Ci0KLSAgLy90YWtlcyBpbiBhIGJlYW4gbm9kZQotICAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgIHsKLSAgICAgIEVsZW1lbnQgYmVhbkVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCVAcGFnZSBjb250ZW50VHlwZT1cInRleHQvaHRtbDtjaGFyc2V0PVVURi04XCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEhFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUSVRMRT5JbnB1dHM8L1RJVExFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SDE+SW5wdXRzPC9IMT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICIiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSArICJTdHJpbmcgbWV0aG9kID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCJtZXRob2RcIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoImludCBtZXRob2RJRCA9IDA7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmIChtZXRob2QgPT0gbnVsbCkgbWV0aG9kSUQgPSAtMTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSArICIiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiYm9vbGVhbiB2YWxpZCA9IHRydWU7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmKG1ldGhvZElEICE9IC0xKSBtZXRob2RJRCA9IEludGVnZXIucGFyc2VJbnQobWV0aG9kKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7IAotICAgICAgZmJ1ZmZlci5hcHBlbmQoInN3aXRjaCAobWV0aG9kSUQpeyAiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAJCi0gICAgICAvLyBnbyB0byB0aGUgbmV4dCBnZW5lcmF0b3IKLSAgICAgIE1ldGhvZFZpc2l0b3IgbWV0aG9kVmlzaXRvciA9IG5ldyBNZXRob2RWaXNpdG9yKCk7Ci0gICAgICBJbnB1dEZpbGVIZWxwMUdlbmVyYXRvciBpbnB1dEZpbGVIZWxwMUdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVIZWxwMUdlbmVyYXRvcihmYnVmZmVyLGZSZXN1bHROYW1lKTsgCi0gICAgICBtZXRob2RWaXNpdG9yLnJ1bihiZWFuRWxlbWVudCxpbnB1dEZpbGVIZWxwMUdlbmVyYXRvcik7Ci0gICAgICBmYnVmZmVyID0gaW5wdXRGaWxlSGVscDFHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgIGZidWZmZXIuYXBwZW5kKCJjYXNlIDExMTExMTExMTE6IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoInZhbGlkID0gZmFsc2U7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGT1JNIE1FVEhPRD1cIlBPU1RcIiBBQ1RJT049XCIiICsgZlJlc3VsdE5hbWUgKyAiXCIgVEFSR0VUPVwicmVzdWx0XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiSElEREVOXCIgTkFNRT1cIm1ldGhvZFwiIFZBTFVFPVwiPCU9bWV0aG9kJT5cIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPFRBQkxFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8VFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxURCBDT0xTUEFOPVwiMVwiIEFMSUdOPVwiTEVGVFwiPlVSTFN0cmluZzo8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQgQUxJR049XCJsZWZ0XCI+PElOUFVUIFRZUEU9XCJURVhUXCIgTkFNRT1cInVybDExMTExMTExMTFcIiBTSVpFPTIwPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVEFCTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJTVUJNSVRcIiBWQUxVRT1cIkludm9rZVwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SU5QVVQgVFlQRT1cIlJFU0VUXCIgVkFMVUU9XCJDbGVhclwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0ZPUk0+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoImJyZWFrOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJjYXNlIDExMTExMTExMTI6IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoInZhbGlkID0gZmFsc2U7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGT1JNIE1FVEhPRD1cIlBPU1RcIiBBQ1RJT049XCIiICsgZlJlc3VsdE5hbWUgKyAiXCIgVEFSR0VUPVwicmVzdWx0XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiSElEREVOXCIgTkFNRT1cIm1ldGhvZFwiIFZBTFVFPVwiPCU9bWV0aG9kJT5cIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEJSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SU5QVVQgVFlQRT1cIlNVQk1JVFwiIFZBTFVFPVwiSW52b2tlXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiUkVTRVRcIiBWQUxVRT1cIkNsZWFyXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvRk9STT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiYnJlYWs7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgCi0gICAgICAKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7ICAgIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmICh2YWxpZCkgeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIlNlbGVjdCBhIG1ldGhvZCB0byB0ZXN0LiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLlRBQiArICJyZXR1cm47IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvQk9EWT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9IVE1MPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIAotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2I0OWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5QYXJhbWV0ZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yIGV4dGVuZHMgSW5wdXRGaWxlR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9TVEFURSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTkFMX1NUQVRFID0gMjsKLQotICBwdWJsaWMgaW50IGZzdGF0ZTsKLSAgIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICAgICAgZnN0YXRlID0gSU5JVElBTF9TVEFURTsKLSAgfQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0gIHB1YmxpYyBJbnB1dEZpbGVIZWxwMUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcixTdHJpbmcgcmVzdWx0TmFtZSkKLSAgewotICAgICAgc3VwZXIoYnVmZmVyLHJlc3VsdE5hbWUpOwotICAgICAgZnN0YXRlID0gSU5JVElBTF9TVEFURTsKLSAgfQotICAKLSAgLyoKLSAgKiBUYWtlcyBpbiBhbiBlbGVtZW50Ci0gICogQHBhcmFtIE9iamVjdCBUYWtlcyBpbiBhbiBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbgotICAqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgTWV0aG9kRWxlbWVudCBtZXRob2QgPSAoTWV0aG9kRWxlbWVudCltZXRob2RFbGVtZW50OwotICAgICBpZiAobWV0aG9kLmdldE1ldGhvZE9tbWlzc2lvbigpKSByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgIAotICAgICBQYXJhbWV0ZXJWaXNpdG9yIHBhcmFtZXRlclZpc2l0b3IgPSBuZXcgUGFyYW1ldGVyVmlzaXRvcigpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiY2FzZSAiICsgbWV0aG9kLmdldE51bWJlcklEKCkrICI6IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgidmFsaWQgPSBmYWxzZTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGT1JNIE1FVEhPRD1cIlBPU1RcIiBBQ1RJT049XCIiICsgZlJlc3VsdE5hbWUgKyAiXCIgVEFSR0VUPVwicmVzdWx0XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJISURERU5cIiBOQU1FPVwibWV0aG9kXCIgVkFMVUU9XCI8JT1tZXRob2QlPlwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAKLSAgICAgLy8gZ28gdG8gdGhlIG5leHQgZ2VuZXJhdG9yCi0gICAgIElucHV0RmlsZUhlbHAyR2VuZXJhdG9yIGlucHV0RmlsZUhlbHAyR2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUhlbHAyR2VuZXJhdG9yKGZidWZmZXIpOyAKLSAgICAgcGFyYW1ldGVyVmlzaXRvci5ydW4obWV0aG9kRWxlbWVudCxpbnB1dEZpbGVIZWxwMkdlbmVyYXRvcik7Ci0gICAgIGZidWZmZXIgPSBpbnB1dEZpbGVIZWxwMkdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICAgCi0gICAgIGZidWZmZXIuYXBwZW5kKCI8QlI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJTVUJNSVRcIiBWQUxVRT1cIkludm9rZVwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiUkVTRVRcIiBWQUxVRT1cIkNsZWFyXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPC9GT1JNPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiYnJlYWs7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgCi0KLSAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgICAKLSAgCi0gIH0gICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNmMyODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVIZWxwMkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5SZWxWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuUGFyYW1ldGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IgZXh0ZW5kcyBJbnB1dEZpbGVIZWxwMUdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIC8qCi0gICogVGhpcyBpcyBhY3R1YWxseSB1c2VkIGJ5IHRoZSByZXN1bHQgZ2VuZXJhdG9yIHRvIHNob3cgdGhlIAotICAqIHJlc3VsdGFudCBCZWFuCi0gICogVGhlIG5hbWUgaXMgdGhlIG5hbWUgdGhlIHJlc3VsdGFudCBiZWFuIGlzIHVzaW5nIGFzIGl0cyBpbnN0YW5jZSBuYW1lCi0gICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZkluc3RhbmNlTmFtZTsKLSAgcHJpdmF0ZSBib29sZWFuIGZSZXR1cm5QYXJhbT1mYWxzZTsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZUhlbHAyR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICAgICAgZkluc3RhbmNlTmFtZT0iIjsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgc3RhdGUgZGF0YSB0byBiZSB1c2VkIGJ5IHRoZSBnZW5lcmF0b3JzCi0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBpbnN0YW5jZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXJzIHR5cGUgYmVhbgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnN0YW5jZU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmSW5zdGFuY2VOYW1lID0gbmFtZTsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgc3RhdGUgZGF0YSB0byBiZSB1c2VkIGJ5IHRoZSBnZW5lcmF0b3JzCi0gICogQHJldHVybiBTdHJpbmcgbmFtZSBUaGUgaW5zdGFuY2UgbmFtZSBvZiB0aGUgcGFyYW1ldGVycyB0eXBlIGJlYW4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZJbnN0YW5jZU5hbWU7Ci0gIH0KLQotCi0gIC8qCi0gICogVGFrZXMgaW4gYW4gb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24gYnkgdGhpcyB2aXNpdG9yIGFjdGlvbgotICAqIEBwYXJhbSBPYmplY3QgVGhlIG9iamVjdCB0byBiZSBhY3RlZCB1cG9uCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIEVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIFJlbFZpc2l0b3IgdmlzaXRvciA9IChSZWxWaXNpdG9yKWdldFZpc2l0b3IoKTsKLSAgICAgIFBhcmFtZXRlckVsZW1lbnQgcGFyYW1ldGVyID0gKFBhcmFtZXRlckVsZW1lbnQpcGFyYW1ldGVyRWxlbWVudDsKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUQUJMRT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0KLSAgICAgIFR5cGVWaXNpdG9yIHR5cGVWaXNpdG9yID0gbmV3IFR5cGVWaXNpdG9yKCk7Ci0gICAgICBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yIGlucHV0RmlsZVR5cGVHZW5lcmF0b3IgPSBuZXcgSW5wdXRGaWxlVHlwZUdlbmVyYXRvcihmYnVmZmVyLDApOwotICAgICAgaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5zZXRSZXR1cm5QYXJhbShnZXRSZXR1cm5QYXJhbSgpKTsKLSAgICAgIGlucHV0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0SW5zdGFuY2VOYW1lKGZJbnN0YW5jZU5hbWUpOwotICAgICAgdHlwZVZpc2l0b3IucnVuKHBhcmFtZXRlckVsZW1lbnQsaW5wdXRGaWxlVHlwZUdlbmVyYXRvcik7Ci0gICAgICBmYnVmZmVyID0gaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVEFCTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0UmV0dXJuUGFyYW0oKQotICB7Ci0gICAgcmV0dXJuIGZSZXR1cm5QYXJhbTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJldHVyblBhcmFtKGJvb2xlYW4gcmV0dXJuUGFyYW0pCi0gIHsKLSAgICBmUmV0dXJuUGFyYW0gPSByZXR1cm5QYXJhbTsKLSAgfSAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZVR5cGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlVHlwZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTEzNDQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlVHlwZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5BdHRyaWJ1dGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uRmllbGRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkF0dHJpYnV0ZUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlNpbXBsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSW5wdXRGaWxlVHlwZUdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yIGV4dGVuZHMgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGZQYXJlbnRHZXR0ZXJzOwotICBwcm90ZWN0ZWQgaW50IGZMZXZlbHNEZWVwOwotICBwcm90ZWN0ZWQgaW50IGZDb2xzcGFuOwotICBwcm90ZWN0ZWQgaW50IGZDdXJyZW50TGV2ZWw7Ci0gIHByaXZhdGUgYm9vbGVhbiBmSXNTaW1wbGU7Ci0gIHByaXZhdGUgYm9vbGVhbiBmU3RhdGVMZXNzQmVhbjsKLSAgcHJpdmF0ZSBWZWN0b3IgZkdldHRlcnM7Ci0gIHByaXZhdGUgVmVjdG9yIGZUeXBlczsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZVR5cGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBjdXJyZW50TGV2ZWwpCi0gIHsKLSAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICAgZkN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKLSAgICAgZkxldmVsc0RlZXAgPSAtMTsKLSAgICAgZlBhcmVudEdldHRlcnMgPSAiIjsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlVHlwZUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGN1cnJlbnRMZXZlbCxpbnQgbGV2ZWxzRGVlcCkKLSAgewotICAgICBzdXBlcihidWZmZXIpOwotICAgICBmQ3VycmVudExldmVsID0gY3VycmVudExldmVsOwotICAgICBmTGV2ZWxzRGVlcCA9IGxldmVsc0RlZXA7Ci0gICAgIGZQYXJlbnRHZXR0ZXJzID0gIiI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRHZXR0ZXJzKFZlY3RvciBnZXR0ZXIsVmVjdG9yIHR5cGUpCi0gIHsKLSAgICAgaWYoZkdldHRlcnMgIT0gbnVsbCl7Ci0gICAgICAgZkdldHRlcnMuY2xlYXIoKTsKLSAgICAgICBmVHlwZXMuY2xlYXIoKTsKLSAgICAgfQotICAgICBhZGRQYXJlbnRHZXR0ZXIoZ2V0dGVyLHR5cGUpOwotICB9Ci0KLQotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGhvbGRzIHNvbWUgc3RhdGUgZGF0YSB0aGF0IGlzIGltcG9ydGFudCBpbiBnZXR0aW5nIHRoZSAKLSAgKiBTdHJpbmdzIGZvciBkaXNwbGF5IG9mIHJlc3VsdGFudCBiZWFucwotICAqIEBwYXJhbSBTdHJpbmcgZ2V0dGVyIHRoaXMgaXMgdGhlIGdldHRlciBvZiBhbiBhdHRyaWJ1dGUKLSAgKiBUaGUgaWRlYSBpcyB0aGF0IGJ5IHRoZSB0aW1lIHdlIGdldCB0byB0aGUgc2ltcGxlIHR5cGUKLSAgKiB3ZSBoYXZlIGdldEFkZHJlc3MoKS5nZXRTdHJlZXQoKS4uLi4KLSAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFyZW50R2V0dGVyKFN0cmluZyBnZXR0ZXIsIFN0cmluZyB0eXBlKQotICB7Ci0gICAgaWYoZkdldHRlcnMgPT0gbnVsbCkgZkdldHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYoZlR5cGVzID09IG51bGwpIGZUeXBlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmR2V0dGVycy5hZGRFbGVtZW50KGdldHRlcik7Ci0gICAgZlR5cGVzLmFkZEVsZW1lbnQodHlwZSk7Ci0gIH0KLQotICAvKgotICAqIHRoaXMgd2lsbCBiZSB1c2VkIHdoZW4gcGFzc2luZyBiZXR3ZWVuIHR3byB2aXNpdG9ycwotICAqCi0gICovCi0gIHB1YmxpYyB2b2lkIGFkZFBhcmVudEdldHRlcihWZWN0b3IgZ2V0dGVycywgVmVjdG9yIHR5cGVzKQotICB7Ci0gICAgaWYoZkdldHRlcnMgPT0gbnVsbCkgZkdldHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYoZlR5cGVzID09IG51bGwpIGZUeXBlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpbnQgc2l6ZSA9IGdldHRlcnMuc2l6ZSgpOyAgICAKLSAgICBmb3IoaW50IGkgPSAwOyBpPHNpemU7IGkrKyl7Ci0gICAgICBmR2V0dGVycy5hZGRFbGVtZW50KGdldHRlcnMuZ2V0KGkpKTsKLSAgICAgIGZUeXBlcy5hZGRFbGVtZW50KHR5cGVzLmdldChpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyByZXR1cm5QYXJlbnRHZXR0ZXIoaW50IGNvdW50KQotICB7Ci0gICAgaWYgKGZHZXR0ZXJzID09IG51bGwgfHwgY291bnQgPiBmR2V0dGVycy5zaXplKCkpIHJldHVybiBudWxsOwotICAgIHJldHVybiAoU3RyaW5nKWZHZXR0ZXJzLmdldChjb3VudCk7ICAKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgcmV0dXJuUGFyZW50R2V0dGVyVHlwZShpbnQgY291bnQpCi0gIHsKLSAgICBpZiAoZlR5cGVzID09IG51bGwgfHwgY291bnQgPiBmVHlwZXMuc2l6ZSgpKSByZXR1cm4gbnVsbDsKLSAgICByZXR1cm4gKFN0cmluZylmVHlwZXMuZ2V0KGNvdW50KTsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIFZlY3RvciByZXR1cm5QYXJlbnRHZXR0ZXIoKQotICB7Ci0gICAgaWYgKGZHZXR0ZXJzID09IG51bGwgKSByZXR1cm4gbmV3IFZlY3RvcigpOwotICAgIHJldHVybiBmR2V0dGVyczsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIFZlY3RvciByZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKCkKLSAgewotICAgIGlmIChmVHlwZXMgPT0gbnVsbCApIHJldHVybiBuZXcgVmVjdG9yKCk7Ci0gICAgcmV0dXJuIGZUeXBlczsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBnZXR0ZXJDb3VudCgpCi0gIHsKLSAgICBpZihmR2V0dGVycyA9PSBudWxsKSByZXR1cm4gMDsKLSAgICByZXR1cm4gZkdldHRlcnMuc2l6ZSgpOyAKLSAgfQotCi0KLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHNvbWUgc3RhdGUgZGF0YSB0aGF0IGlzIGltcG9ydGFudCBpbiBnZXR0aW5nIHRoZSAKLSAgKiBTdHJpbmdzIGZvciBkaXNwbGF5IG9mIHJlc3VsdGFudCBiZWFucwotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBzdHJpbmcgb2YgZ2V0dGVycyB0byB0aGlzIHBvaW50Ci0gICogVGhlIGlkZWEgaXMgdGhhdCBieSB0aGUgdGltZSB3ZSBnZXQgdG8gdGhlIHNpbXBsZSB0eXBlCi0gICogd2UgaGF2ZSBnZXRBZGRyZXNzKCkuZ2V0U3RyZWV0KCkuLi4uCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50R2V0dGVycygpCi0gIHsKLSAgICByZXR1cm4gZlBhcmVudEdldHRlcnM7Ci0gIH0KLSAgCi0gIC8qCi0gICogVGFrZXMgaW4gYW4gb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24gYnkgdGhpcyB2aXNpdG9yIGFjdGlvbgotICAqIEBwYXJhbSBPYmplY3QgVGhlIG9iamVjdCB0byBiZSBhY3RlZCB1cG9uCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgVHlwZUVsZW1lbnQgZWxlbWVudCA9IChUeXBlRWxlbWVudClvYmplY3Q7Ci0gICAgICAgICAgCi0gICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2ltcGxlRWxlbWVudCkgZklzU2ltcGxlID0gdHJ1ZTsKLSAgICAgZWxzZSBmSXNTaW1wbGUgPSBmYWxzZTsKLQotICAgICAvL3RoaXMgY291bGQgYmUgYSBzdGF0ZWxlc3NiZWFuIG5lZWQgdG8ga25vdwotICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5FbGVtZW50ICl7Ci0gICAgICAgIEJlYW5FbGVtZW50IGJlYW4gPSAoQmVhbkVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgaWYgKGJlYW4uaXNTdGF0ZUxlc3MoKSkgZlN0YXRlTGVzc0JlYW4gPSB0cnVlOwotICAgICB9Ci0KLQotCi0gICAgIC8vQ29tcGxleCB0eXBlIHN1cHBvcnQKLSAgICAgLy9maXJzdCBJIG5lZWQgdG8gZmluZCBvdXQgaG93IG1hbnkgbGV2ZWxzIGRlZXAKLSAgICAgaWYoZkxldmVsc0RlZXAgPT0gLTEpewotICAgICAgICBBdHRyaWJ1dGVWaXNpdG9yIGF0dHJpYnV0ZVZpc2l0b3IgPSBuZXcgQXR0cmlidXRlVmlzaXRvcigpOwotICAgICAgICBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbiBsZHZhID0gbmV3IExldmVsc0RlZXBWaXNpdG9yQWN0aW9uKCk7Ci0gICAgICAgIGF0dHJpYnV0ZVZpc2l0b3IucnVuKGVsZW1lbnQsbGR2YSk7Ci0gICAgICAgIGZMZXZlbHNEZWVwID0gbGR2YS5nZXRMZXZlbHNEZWVwKCk7Ci0gICAgICAgIC8vY2hlY2sgb3V0IHRoZSBmaWVsZHMgCi0gICAgICAgIEZpZWxkVmlzaXRvciBmaWVsZFZpc2l0b3IgPSBuZXcgRmllbGRWaXNpdG9yKCk7Ci0gICAgICAgIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIGxkdmEyID0gbmV3IExldmVsc0RlZXBWaXNpdG9yQWN0aW9uKCk7Ci0gICAgICAgIGZpZWxkVmlzaXRvci5ydW4oZWxlbWVudCxsZHZhMik7Ci0KLSAgICAgICAgaWYoZkxldmVsc0RlZXAgPCBsZHZhMi5nZXRMZXZlbHNEZWVwKCkpZkxldmVsc0RlZXAgPSBsZHZhMi5nZXRMZXZlbHNEZWVwKCk7IAotICAgICAgICBmTGV2ZWxzRGVlcCsrOwotICAgICB9IAotICAgICBmQ29sc3BhbiA9IGZMZXZlbHNEZWVwIC0gZkN1cnJlbnRMZXZlbDsKLQotICAgICAvL2lmIHdlIGhhdmUgYSByZXR1cm4gcGFyYW0gd2l0aCBubyBnZXR0ZXIgbWFrZSBzdXJlIHdlIGFyZSBvbiB0aGUgCi0gICAgIC8vYXR0cmlidXRlIGFuZCBub3QgdGhlIHBhcmFtZXRlciB0aGVuIHJldHVybgotICAgICBpZihnZXRSZXR1cm5QYXJhbSgpICYmICBlbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUVsZW1lbnRUeXBlICYmKCgoQXR0cmlidXRlRWxlbWVudFR5cGUpZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkpLmdldEdldHRlck1ldGhvZCgpID09IG51bGwpICkgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgIC8vQ29kZSBnZW4gZm9yIGFsbCBlbGVtZW50cwotICAgICBmYnVmZmVyLmFwcGVuZCgiPFRSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmQ3VycmVudExldmVsO2krKyl7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQgV0lEVEg9XCI1JVwiPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICB9Ci0gICAgIGZidWZmZXIuYXBwZW5kKCI8VEQgQ09MU1BBTj1cIiIgKyBmQ29sc3BhbiArICJcIiBBTElHTj1cIkxFRlRcIj4iICsgZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkuZ2V0TmFtZSgpICsgIjo8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgICAKLSAgICAgaWYoZklzU2ltcGxlIHx8IFR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKGVsZW1lbnQuZ2V0TmFtZSgpKSAKLSAgICAgICAgICAgICAgICB8fCAoZ2V0UmV0dXJuUGFyYW0oKSAmJiBmU3RhdGVMZXNzQmVhbikgCi0gICAgICAgICAgICAgICAgfHwgKGdldFJldHVyblBhcmFtKCkgJiYgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZShlbGVtZW50LmdldFR5cGVOYW1lKCkpKSl7Ci0gICAgICAgIGlmKGdldEluc3RhbmNlTmFtZSgpLmVxdWFscygiIikpewotICAgICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZVR5cGUoZWxlbWVudC5nZXROYW1lKCksZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkuZ2V0TVVJRCgpKTsKLSAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoZGF0YVR5cGUuaW5wdXRGb3JtKGVsZW1lbnQuZ2V0T3duaW5nRWxlbWVudCgpLmdldE1VSUQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgIGlmKGdldFJldHVyblBhcmFtKCkgJiYgKFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUoZWxlbWVudC5nZXRUeXBlTmFtZSgpKSB8fCBmU3RhdGVMZXNzQmVhbikpewotICAgICAgICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlVHlwZShlbGVtZW50LmdldFR5cGVOYW1lKCksZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkuZ2V0TVVJRCgpKTsgIAotICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVOYW1lID0gInR5cGUiICsgZGF0YVR5cGUuZ2V0VW5pcXVlTmFtZSgpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIiArICBnZXRJbnN0YW5jZU5hbWUoKSArICIgIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIFN0cmluZyBhZnRlclN0cmluZyA9IGdldEluc3RhbmNlTmFtZSgpOyAKLSAgICAgICAgICAgICBTdHJpbmcgdG1wU3RyaW5nID0gInRlYmVjZSI7Ci0gICAgICAgICAgICAgU3RyaW5nIHByZXZTdHJpbmcgPSBnZXRJbnN0YW5jZU5hbWUoKTsKLSAgICAgICAgICAgICBTdHJpbmcgbmV3VG1wU3RyaW5nID0gIiI7Ci0gICAgICAgICAgICAgZm9yKGludCBpPTA7aTxnZXR0ZXJDb3VudCgpO2krKyl7Ci0gICAgICAgICAgICAgICBuZXdUbXBTdHJpbmcgPSB0bXBTdHJpbmcgKyBpOwotICAgICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQocmV0dXJuUGFyZW50R2V0dGVyVHlwZShpKSArICIgIiArIG5ld1RtcFN0cmluZyArICI9IiArIHByZXZTdHJpbmcgKyAiLiIgKyByZXR1cm5QYXJlbnRHZXR0ZXIoaSkgKyAiOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICAgIHByZXZTdHJpbmcgPSBuZXdUbXBTdHJpbmc7IAotICAgICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmKCIgKyBuZXdUbXBTdHJpbmcgKyAiICE9IG51bGwpeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICAgIGFmdGVyU3RyaW5nID0gbmV3VG1wU3RyaW5nOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChlbGVtZW50LmdldE5hbWUoKSArICIgIiArIHVuaXF1ZU5hbWUgKyAiID0gIiArIGFmdGVyU3RyaW5nICsgIi4iICsgKChBdHRyaWJ1dGVFbGVtZW50VHlwZSllbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKSkuZ2V0R2V0dGVyTWV0aG9kKCkrICI7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChkYXRhVHlwZS5UeXBlQ29udmVyc2lvbih1bmlxdWVOYW1lKSk7Ci0gICAgICAgICAgICAgZm9yKGludCBpPTA7aTxnZXR0ZXJDb3VudCgpO2krKyl7Ci0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIGVsc2V7IAotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIiArICBnZXRJbnN0YW5jZU5hbWUoKSArICIgIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIFN0cmluZyBhZnRlclN0cmluZyA9IGdldEluc3RhbmNlTmFtZSgpOwotICAgICAgICAgICAgIFN0cmluZyB0bXBTdHJpbmcgPSAidGViZWNlIjsKLSAgICAgICAgICAgICBTdHJpbmcgcHJldlN0cmluZyA9IGdldEluc3RhbmNlTmFtZSgpOwotICAgICAgICAgICAgIFN0cmluZyBuZXdUbXBTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPGdldHRlckNvdW50KCk7aSsrKXsKLSAgICAgICAgICAgICAgIG5ld1RtcFN0cmluZyA9IHRtcFN0cmluZyArIGk7Ci0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKGkpICsgIiAiICsgbmV3VG1wU3RyaW5nICsgIj0iICsgcHJldlN0cmluZyArICIuIiArIHJldHVyblBhcmVudEdldHRlcihpKSArICI7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgICAgcHJldlN0cmluZyA9IG5ld1RtcFN0cmluZzsgCi0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIiArIG5ld1RtcFN0cmluZyArICIgIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgICAgYWZ0ZXJTdHJpbmcgPSBuZXdUbXBTdHJpbmc7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiPCU9Iik7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoYWZ0ZXJTdHJpbmcgKyAiLiIgKyAoKEF0dHJpYnV0ZUVsZW1lbnRUeXBlKWVsZW1lbnQuZ2V0T3duaW5nRWxlbWVudCgpKS5nZXRHZXR0ZXJNZXRob2QoKSsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+Iik7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIik7Ci0gICAgICAgICAgICAgZm9yKGludCBpPTA7aTxnZXR0ZXJDb3VudCgpO2krKyl7Ci0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgCi0gICAgIH0KLSAgICAgICAgIAotICAgICAgLy9Ob3cgY2Fycnkgb24gZG93biB0aGUgcmVzdCBvZiB0aGUgYmVhbgotICAgICBlbHNlIHsKLSAgICAgICAgQXR0cmlidXRlVmlzaXRvciBhdHRyaWJ1dGVWaXNpdG9yID0gbmV3IEF0dHJpYnV0ZVZpc2l0b3IoKTsKLSAgICAgICAgYXR0cmlidXRlVmlzaXRvci5zZXRSZXNpZGVudFZlY3RvcjEocmV0dXJuUGFyZW50R2V0dGVyKCkpOwotICAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnNldFJlc2lkZW50VmVjdG9yMihyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKCkpOwotICAgICAgICBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcihmYnVmZmVyLChmQ3VycmVudExldmVsICsgMSksZkxldmVsc0RlZXApOwotICAgICAgICBpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3Iuc2V0UmV0dXJuUGFyYW0oZ2V0UmV0dXJuUGFyYW0oKSk7Ci0gICAgICAgIGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5zZXRJbnN0YW5jZU5hbWUoZkluc3RhbmNlTmFtZSk7Ci0gICAgICAgIGF0dHJpYnV0ZVZpc2l0b3IucnVuKGVsZW1lbnQsaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKTsKLSAgICAgICAgZmJ1ZmZlciA9IGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAKLSAgICAgICAgLy9ub3cgZG8gZmllbGRzIHZlcnkgc2ltaWxhcgotICAgICAgICBGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEZpZWxkVmlzaXRvcigpOwotICAgICAgICBmaWVsZFZpc2l0b3Iuc2V0UmVzaWRlbnRWZWN0b3IxKHJldHVyblBhcmVudEdldHRlcigpKTsKLSAgICAgICAgZmllbGRWaXNpdG9yLnNldFJlc2lkZW50VmVjdG9yMihyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKCkpOwotICAgICAgICBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMiA9IG5ldyBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IoZmJ1ZmZlciwoZkN1cnJlbnRMZXZlbCArIDEpLGZMZXZlbHNEZWVwKTsKLSAgICAgICAgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5zZXRSZXR1cm5QYXJhbShnZXRSZXR1cm5QYXJhbSgpKTsKLSAgICAgICAgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5zZXRJbnN0YW5jZU5hbWUoZkluc3RhbmNlTmFtZSk7Ci0gICAgICAgIGZpZWxkVmlzaXRvci5ydW4oZWxlbWVudCxpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyKTsKLSAgICAgICAgZmJ1ZmZlciA9IGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjIuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgCi0gICAgICAgIAotCi0gICAgIH0KLQotCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxNDEyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0xldmVsc0RlZXBWaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5BdHRyaWJ1dGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uRmllbGRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQXR0cmlidXRlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24uCi0qICovCi1wdWJsaWMgY2xhc3MgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gaW1wbGVtZW50cyBWaXNpdG9yQWN0aW9uIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHJpdmF0ZSBWaXNpdG9yIGZWaXNpdG9yOwotICBwcml2YXRlIGludCBmTGV2ZWxzRGVlcDsKLSAgcHJpdmF0ZSBpbnQgZkRlZXBlc3RMZXZlbDsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIFRoaXMgaXMgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICogCi0gICovCi0gIHB1YmxpYyBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbiAoKQotICB7Ci0gICAgZkxldmVsc0RlZXAgPSAwOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgKiAKLSAgKi8KLSAgcHVibGljIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIChpbnQgY3VycmVudCxib29sZWFuIGluY3JlbWVudCkKLSAgewotICAgIGZMZXZlbHNEZWVwID0gY3VycmVudDsKLSAgICBpZihpbmNyZW1lbnQpIGZMZXZlbHNEZWVwKys7Ci0gICAgZkRlZXBlc3RMZXZlbCA9IGZMZXZlbHNEZWVwOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgcmVzaWRlbnQpCi0gIHsKLSAgICAvL25vdGhpbmcgdG8gYmUgZG9uZSBidXQgbXVzdCBiZSBpbXBsZW1lbnRlZAotICB9Ci0KLQotCi0gIC8qKgotICAqIFRoZSB2aXNpdG9yIHRoYXQgY2FsbGVkIHRoaXMgVmlzaXRvckFjdGlvbgotICAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIHRoYXQgY2FsbGVkIHRoaXMgdmlzaXRvciBhY3Rpb24KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmlzaXRvcihWaXNpdG9yIHZpc2l0b3IpCi0gIHsKLSAgICAgZlZpc2l0b3IgPSB2aXNpdG9yOwotICB9Ci0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsZXZlbCBvZiBuZXN0aW5nIHdpdGhpbiB0aGlzIGJlYW4KLSAgKiBAcmV0dXJuIGludCByZXR1cm5zIHRoZSBpbnQgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG5lc3RzIG9mIHRoaXMgYmVhbgotICAqLwotICBwdWJsaWMgaW50IGdldExldmVsc0RlZXAoKQotICB7Ci0gICAgIHJldHVybiBmRGVlcGVzdExldmVsOwotICB9Ci0gCi0KLSAgLyoqCi0gICogVGFrZXMgaW4gYW4gb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24gYnkgdGhpcyB2aXNpdG9yIGFjdGlvbgotICAqIEBwYXJhbSBPYmplY3QgVGhlIG9iamVjdCB0byBiZSBhY3RlZCB1cG9uCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXR0cmlidXRlRWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgVHlwZUVsZW1lbnQpewotICAgICAgICAgVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgICAgIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIGx2ZGEgPSBuZXcgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24oZkxldmVsc0RlZXAsdHJ1ZSk7Ci0gICAgICAgICB0eXBlVmlzaXRvci5ydW4oZWxlbWVudCxsdmRhKTsKLQotICAgICAgICAgaWYgKGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpID4gZkRlZXBlc3RMZXZlbCkgZkRlZXBlc3RMZXZlbCA9IGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpOyAKLSAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5FbGVtZW50ICYmICEoVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oZWxlbWVudC5nZXROYW1lKCkpKSl7Ci0gICAgICAgICBBdHRyaWJ1dGVWaXNpdG9yIGF0dHJpYnV0ZVZpc2l0b3IgPSBuZXcgQXR0cmlidXRlVmlzaXRvcigpOwotICAgICAgICAgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gbHZkYSA9IG5ldyBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbihmTGV2ZWxzRGVlcCxmYWxzZSk7Ci0gICAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnJ1bihlbGVtZW50LGx2ZGEpOwotICAgICAgICAgaWYgKGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpID4gZkRlZXBlc3RMZXZlbCkgZkRlZXBlc3RMZXZlbCA9IGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpOyAKLSAgIAotICAgICAgICAgRmllbGRWaXNpdG9yIGZpZWxkVmlzaXRvciA9IG5ldyBGaWVsZFZpc2l0b3IoKTsKLSAgICAgICAgIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIGx2ZGEyID0gbmV3IExldmVsc0RlZXBWaXNpdG9yQWN0aW9uKGZMZXZlbHNEZWVwLGZhbHNlKTsKLSAgICAgICAgIGZpZWxkVmlzaXRvci5ydW4oZWxlbWVudCxsdmRhMik7Ci0gICAgICAgICBpZiAobHZkYTIuZ2V0TGV2ZWxzRGVlcCgpID4gZkRlZXBlc3RMZXZlbCkgZkRlZXBlc3RMZXZlbCA9IGx2ZGEyLmdldExldmVsc0RlZXAoKTsgCi0gICAKLSAgICAgIH0KLSAgICAgICAgIAotICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7ICAgCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9NZXRob2RGaWxlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjNmU4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5NZXRob2RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBNZXRob2RGaWxlZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIE1ldGhvZEZpbGVHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwdWJsaWMgU3RyaW5nIGZJbnB1dE5hbWU7Ci0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgTWV0aG9kRmlsZUdlbmVyYXRvciAoU3RyaW5nIGlucHV0cykKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgZklucHV0TmFtZSA9IGlucHV0czsKLSAgfQotCi0gICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gU3RyaW5nQnVmZmVyIGJ1ZmZlciB0byBhcHBlbmQgY29kZWdlbiAKLSAgKi8KLSAgcHVibGljIE1ldGhvZEZpbGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIsU3RyaW5nIGlucHV0cykKLSAgewotICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgZklucHV0TmFtZSA9IGlucHV0czsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWVzKFN0cmluZyBpbnB1dHMpCi0gIHsKLSAgICBmSW5wdXROYW1lID0gaW5wdXRzOwotICB9Ci0KLSAgLy9wdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBVE9SID0gIkxvY2F0b3IiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBCRUFOID0gIlByb3h5IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgR0VUID0gImdldCI7Ci0KLSAgCi0gIC8vdGFrZXMgaW4gYSBiZWFuIG5vZGUKLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgIHsKLSAgICAgIEVsZW1lbnQgYmVhbkVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gICAgICBCZWFuRWxlbWVudCBiZWFuID0gKEJlYW5FbGVtZW50KWJlYW5FbGVtZW50OwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlQHBhZ2UgY29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOFwiJT4iKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8SEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8VElUTEU+TWV0aG9kczwvVElUTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiPC9IRUFEPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjxIMT5NZXRob2RzPC9IMT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8VUw+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IE1ldGhvZFZpc2l0b3IoKTsKLSAgICAgIE1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yIG1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yID0gbmV3IE1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yKGZidWZmZXIsZklucHV0TmFtZSk7IAotICAgICAgbWV0aG9kVmlzaXRvci5ydW4oYmVhbkVsZW1lbnQsbWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IpOwotICAgICAgZmJ1ZmZlciA9IG1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVUw+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjwvSFRNTD4iKTsKLSAgICAgIAotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVIZWxwR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVIZWxwR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2EyM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9NZXRob2RGaWxlSGVscEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgTWV0aG9kRmlsZWdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RGaWxlSGVscEdlbmVyYXRvciBleHRlbmRzIE1ldGhvZEZpbGVHZW5lcmF0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqCi0gICovCi0gIHB1YmxpYyBNZXRob2RGaWxlSGVscEdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcixTdHJpbmcgaW5wdXROYW1lKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIsaW5wdXROYW1lKTsKLSAgfQotCi0KLSAgLy90YWtlcyBpbiBhIE1ldGhvZCBub2RlCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kID0gKE1ldGhvZEVsZW1lbnQpbWV0aG9kRWxlbWVudDsKLSAgICAgIGlmIChtZXRob2QuZ2V0TWV0aG9kT21taXNzaW9uKCkpIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAgIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxMST48QSBIUkVGPVwiIiArIGZJbnB1dE5hbWUgKyAiP21ldGhvZD0iICsgbWV0aG9kLmdldE51bWJlcklEKCkpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIlwiIFRBUkdFVD1cImlucHV0c1wiPiAiICsgbWV0aG9kLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvQT48L0xJPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwOTlkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5UeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5BdHRyaWJ1dGVFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIGV4dGVuZHMgUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHJpdmF0ZSBWZWN0b3IgZlNldHRlclZlY3RvcjsgCi0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIGJ1ZmZlciBTdHJpbmdCdWZmZXIgb2JqZWN0IHRoYXQgdGhpcyBjb2RlIGdlbmVyYXRvciB3cml0ZXMgdG8gCi0gICovCi0gIHB1YmxpYyBSZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAqIFNldHRlciB2ZWN0b3IKLSAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRTZXR0ZXJWZWN0b3IoKQotICB7Ci0gICAgICByZXR1cm4gZlNldHRlclZlY3RvcjsKLSAgfQotICAKLQotICAvKioKLSAgKiBWaXNpdCBNZXRob2QgZ2VuZXJhdGVzIGNvZGUgZm9yIHRoaXMgVmlzaXRvcgotICAqIEBwYXJhbSBQYXJhbWV0ZXIgcGFyYW1ldGVyIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQgCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgQXR0cmlidXRlRWxlbWVudFR5cGUgYXR0cmlidXRlRWxlbWVudFR5cGUgPSAoQXR0cmlidXRlRWxlbWVudFR5cGUpb2JqZWN0OwotICAgICBCYXNpY0VsZW1lbnQgZWxlbWVudCA9IChCYXNpY0VsZW1lbnQpb2JqZWN0OwotICAgICBpZihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpLmlzU2ltcGxlKCkgfHwgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5nZXROYW1lKCkpKXsgICAgICAKLSAgICAgICAgLy9zdGFydCB0aGUgY29kZWdlbgotICAgICAgICAvL2FzayB0aGUgZGF0YXR5cGUgZm9yIGl0cyByZXF1ZXN0IGxpbmUsIGl0IG1heSBuZWVkIG1hcmsgdXAgb3Igbm90LgotICAgICAgICAvL2llIEZvciB0aGUgc2ltcGxlIHR5cGVzIHdlIG5lZWQgdGhlIG1hcmsgdXAKLSAgICAgICAgLy9mb3IgdGhlIGRvbSBlbGVtZW50IHdlIGNhbnQgdXNlIGl0LgotICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZVR5cGUoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5nZXROYW1lKCksZWxlbWVudC5nZXRNVUlEKCkpOwotICAgICAgICBzZXRUeXBlT3duZXJJZChpZE5hbWUoZWxlbWVudC5nZXROYW1lKCkpKTsgCi0gICAgICAgIGZidWZmZXIuYXBwZW5kKGRhdGFUeXBlLmdldFJlcXVlc3RDb2RlKGVsZW1lbnQuZ2V0TVVJRCgpLGdldFR5cGVPd25lcklkKCkpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgfQotICAgICAKLSAgICAgVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IgcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IgPSBuZXcgUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IoZmJ1ZmZlcik7Ci0gICAgIHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0VHlwZU93bmVySWQoZ2V0VHlwZU93bmVySWQoKSk7Ci0gICAgIAotICAgICB0eXBlVmlzaXRvci5ydW4oYXR0cmlidXRlRWxlbWVudFR5cGUscmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IpOwotICAgICBzZXROdW1iZXJGYWN0b3J5KHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgIFZlY3RvciBzZXR0ZXJJbnB1dHMgPSByZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5nZXRSZXNpZGVudFZlY3RvcigpOyAKLSAgICAgaWYoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0U2V0dGVyTWV0aG9kKCkgPT0gbnVsbCkgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOyAKLSAgICAgcHV0UmVzaWRlbnRWZWN0b3IoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0U2V0dGVyU2lnbmF0dXJlKChTdHJpbmcpc2V0dGVySW5wdXRzLmZpcnN0RWxlbWVudCgpKSk7Ci0gICAgIAotICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0gICAKLQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmY0YTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5NZXRob2RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBNZXRob2RGaWxlZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFJlc3VsdEZpbGVHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRSSVBMRV9UQUIgPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArIEdlbmVyYXRvci5UQUI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBRVUFEX1RBQiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgR2VuZXJhdG9yLkRPVUJMRV9UQUI7Ci0gIAotICBwcml2YXRlIFN0cmluZyBzZXRFbmRwb2ludE1ldGhvZDsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVHZW5lcmF0b3IgKCkKLSAgewotICAgICAgc3VwZXIoKTsKLSAgfQotCi0gICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gIH0KLQotICAvL3Rha2VzIGluIGEgYmVhbiBub2RlCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIEVsZW1lbnQgYmVhbkVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gICAgICBCZWFuRWxlbWVudCBiZWFuID0gKEJlYW5FbGVtZW50KWJlYW5FbGVtZW50OwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlQHBhZ2UgY29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOFwiJT4iKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEhFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUSVRMRT5SZXN1bHQ8L1RJVExFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SDE+UmVzdWx0PC9IMT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPGpzcDp1c2VCZWFuIGlkPVwiIisgZ2V0U2Vzc2lvbkJlYW5JZCgpICsgIlwiIHNjb3BlPVwic2Vzc2lvblwiIGNsYXNzPVwiIik7Ci0gICAgICBmYnVmZmVyLmFwcGVuZChiZWFuLmdldE5hbWUoKSArICJcIiAvPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGlmIChzZXRFbmRwb2ludE1ldGhvZCAhPSBudWxsICYmIHNldEVuZHBvaW50TWV0aG9kLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIik7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwiZW5kcG9pbnRcIikgIT0gbnVsbCAmJiByZXF1ZXN0LmdldFBhcmFtZXRlcihcImVuZHBvaW50XCIpLmxlbmd0aCgpID4gMCkiKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKGdldFNlc3Npb25CZWFuSWQoKSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCIuIik7Ci0gICAgICAgIGludCBpbmRleCA9IHNldEVuZHBvaW50TWV0aG9kLmluZGV4T2YoJz8nKTsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoc2V0RW5kcG9pbnRNZXRob2Quc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIihuZXcgIik7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoc2V0RW5kcG9pbnRNZXRob2Quc3Vic3RyaW5nKGluZGV4KzEsIHNldEVuZHBvaW50TWV0aG9kLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIihyZXF1ZXN0LmdldFBhcmFtZXRlcihcImVuZHBvaW50XCIpKSk7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoc2V0RW5kcG9pbnRNZXRob2QpOwotICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCIocmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCJlbmRwb2ludFwiKSk7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIH0KLSAgICAgIGZidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAKLSAgICAgICAgICAgIAotICAgICAgLy9jYXJyeSBvbiB3aXRoIHJlZ3VsYXIgZ29ycAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIlN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihcIm1ldGhvZFwiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaW50IG1ldGhvZElEID0gMDsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYgKG1ldGhvZCA9PSBudWxsKSBtZXRob2RJRCA9IC0xOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJpZihtZXRob2RJRCAhPSAtMSkgbWV0aG9kSUQgPSBJbnRlZ2VyLnBhcnNlSW50KG1ldGhvZCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJib29sZWFuIGdvdE1ldGhvZCA9IGZhbHNlOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0KLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ0cnkgeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJzd2l0Y2ggKG1ldGhvZElEKXsgIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgIAotICAgICAgLy8gZ28gdG8gdGhlIG5leHQgZ2VuZXJhdG9yCi0gICAgICBNZXRob2RWaXNpdG9yIG1ldGhvZFZpc2l0b3IgPSBuZXcgTWV0aG9kVmlzaXRvcigpOwotICAgICAgUmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yIHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvciA9IG5ldyBSZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IoZmJ1ZmZlcik7IAotICAgICAgcmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgIHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5zZXRDbGllbnRGb2xkZXJQYXRoKGdldENsaWVudEZvbGRlclBhdGgoKSk7Ci0gICAgICBtZXRob2RWaXNpdG9yLnJ1bihiZWFuRWxlbWVudCxyZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IpOwotICAgICAgc2V0TnVtYmVyRmFjdG9yeShyZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IuZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLQotICAgICAgZmJ1ZmZlciA9IHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ9IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAgICAKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiZXhjZXB0aW9uOiA8JT0gZSAlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJyZXR1cm47IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIWdvdE1ldGhvZCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoInJlc3VsdDogTi9BIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hUTUw+Iik7Ci0KLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXRFbmRwb2ludE1ldGhvZCBUaGUgc2V0RW5kcG9pbnRNZXRob2QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V0RW5kcG9pbnRNZXRob2QoU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kKQotICB7Ci0gICAgdGhpcy5zZXRFbmRwb2ludE1ldGhvZCA9IHNldEVuZHBvaW50TWV0aG9kOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2M2ExOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlBhcmFtZXRlclZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5SZXR1cm5QYXJhbWV0ZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFJlc3VsdEZpbGVnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yIGV4dGVuZHMgUmVzdWx0RmlsZUdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfU1RBVEUgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5BTF9TVEFURSA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1URU1QID0gIm10ZW1wIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQkVBTiA9ICJQcm94eSI7Ci0KLSAgLyoqCi0gICoga2VlcHMgdGhlIHN0YXRlIG9mIHRoZSB2aXNpdG9yIAotICAqICovCi0KLSAgcHJpdmF0ZSBpbnQgZnN0YXRlOwotCi0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gYnVmZmVyIFN0cmluZ0J1ZmZlciBvYmplY3QgdGhhdCB0aGlzIGNvZGUgZ2VuZXJhdG9yIHdyaXRlcyB0byAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICAgIGZzdGF0ZSA9IElOSVRJQUxfU1RBVEU7Ci0gICAgCi0gIH0KLSAgCi0gIC8qKgotICAqIFZpc2l0IE1ldGhvZCBnZW5lcmF0ZXMgY29kZSBmb3IgdGhpcyBWaXNpdG9yCi0gICogQHBhcmFtIG1ldGhvZCBtZXRob2QgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgRWxlbWVudCBtZXRob2RFbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAKLQotICAgICBNZXRob2RFbGVtZW50IG1ldGhvZCA9IChNZXRob2RFbGVtZW50KW1ldGhvZEVsZW1lbnQ7Ci0gICAgIGlmIChtZXRob2QuZ2V0TWV0aG9kT21taXNzaW9uKCkpIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgICBmYnVmZmVyLmFwcGVuZCgiY2FzZSAiICsgbWV0aG9kLmdldE51bWJlcklEKCkrICI6IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICB2aXNpdEhlbHBlcihtZXRob2QpOwotICAgICAKLSAgICAgZmJ1ZmZlci5hcHBlbmQoImJyZWFrOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgCi0gIAotICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0gICAKLSAgLyoqCi0gICogSGVscHMgb3V0IHRoZSB2aXNpdG9yCi0gICogQHBhcmFtIG1ldGhvZCBtZXRob2QgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgCi0gICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0SGVscGVyIChFbGVtZW50IG1ldGhvZEVsZW1lbnQpCi0gIHsKLQotICAgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJnb3RNZXRob2QgPSB0cnVlOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgCi0gICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kID0gKE1ldGhvZEVsZW1lbnQpbWV0aG9kRWxlbWVudDsKLSAgICAgLy8gZ28gdG8gdGhlIG5leHQgZ2VuZXJhdG9yCi0gICAgIFJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvciByZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IgPSBuZXcgUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yKGZidWZmZXIpOyAKLSAgICAgcmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgUGFyYW1ldGVyVmlzaXRvciBwYXJhbWV0ZXJWaXNpdG9yID0gbmV3IFBhcmFtZXRlclZpc2l0b3IoKTsKLSAgICAgcGFyYW1ldGVyVmlzaXRvci5ydW4obWV0aG9kRWxlbWVudCxyZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IpOwotICAgICBmYnVmZmVyID0gcmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICBzZXROdW1iZXJGYWN0b3J5KHJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvci5nZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICAvLyB3ZSBtdXN0IG5vdyBncmFiIHRoZSBzdGF0ZSBkYXRhIGZyb20gdGhlIHJlc2lkZW50IHZlY3RvcgotICAgICBzZXRSZXNpZGVudFZlY3RvcihyZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IuZ2V0UmVzaWRlbnRWZWN0b3IoKSk7Ci0KLSAgICAgCi0gICAgIC8vdGhlcmUgaXMgbm8gcmV0dXJuIHR5cGUgaWYgdm9pZCBvY2N1cnMgICAgCi0gICAgCi0gICAgIAotICAgICBpZiAobWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBnZXRTZXNzaW9uQmVhbklkKCkgKyAiLiIgK21ldGhvZC5nZXROYW1lKCkgKyAiKCIpOwotCi0gICAgIGVsc2V7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKEdlbmVyYXRvci5ET1VCTEVfVEFCICsgbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSArIEdlbmVyYXRvci5TUEFDRSArIG1ldGhvZC5nZXRNVUlEKCkgKyBNVEVNUCArIEdlbmVyYXRvci5TUEFDRSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCI9IiArIEdlbmVyYXRvci5TUEFDRSArIGdldFNlc3Npb25CZWFuSWQoKSArICIuIiArIG1ldGhvZC5nZXROYW1lKCkgKyAiKCIpOwotICAgICB9Ci0KLSAgICAgRW51bWVyYXRpb24gZSA9IGZSZXNpZGVudFZlY3Rvci5lbGVtZW50cygpOwotICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgIGlmIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiLCIpOyAgICAKLSAgICAgfQotICAgICBmYnVmZmVyLmFwcGVuZCgiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGlmICghbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSAmJiAhbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmlzUHJpbWl0aXZlKCkpewotICAgICAgICAvL2luIGNhc2Ugb3VyIHJlc3VsdCBpcyBudWxsCi0gICAgICAgIGZidWZmZXIuYXBwZW5kKCJpZigiICsgbWV0aG9kLmdldE1VSUQoKSArICJtdGVtcCA9PSBudWxsKXsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlPSIgKyBtZXRob2QuZ2V0TVVJRCgpICsgIm10ZW1wICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCJ9ZWxzZXsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIH0KLSAgICAgCi0gICAgIC8vbm93IGxldHMgZGlzcGxheSB0aGUgcmV0dXJuIGJlYW4KLSAgICAgLy8gaWYgaXQgaXMgc2ltcGxlIHdlIGRvbnQgbmVlZCB0byB1c2UgdGhlIGdlbmVyYXRvcgotICAgICAKLSAgICAgaWYgKCFtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpKXsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5pc1NpbXBsZSgpIAotICAgICAgICAgICB8fCBUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpKQotICAgICAgICAgICB8fCBUeXBlRmFjdG9yeS5pc1N0YXRlTGVzc0JlYW4obWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldFR5cGVOYW1lKCkpCi0gICAgICAgICAgIHx8IFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUobWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldFR5cGVOYW1lKCkpKXsKLSAgICAgICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGVUeXBlKG1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5nZXRUeXBlTmFtZSgpLG1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0TVVJRCgpKTsKLSAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoZGF0YVR5cGUuVHlwZUNvbnZlcnNpb24obWV0aG9kLmdldE1VSUQoKSArIE1URU1QKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICBJbnB1dEZpbGVIZWxwMkdlbmVyYXRvciBpbnB1dEZpbGVIZWxwMkdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVIZWxwMkdlbmVyYXRvcihmYnVmZmVyKTsKLSAgICAgICAgICAgaW5wdXRGaWxlSGVscDJHZW5lcmF0b3Iuc2V0SW5zdGFuY2VOYW1lKG1ldGhvZC5nZXRNVUlEKCkgKyBNVEVNUCk7Ci0gICAgICAgICAgIGlucHV0RmlsZUhlbHAyR2VuZXJhdG9yLnNldFJldHVyblBhcmFtKHRydWUpOwotICAgICAgICAgICBSZXR1cm5QYXJhbWV0ZXJWaXNpdG9yIHJldHVyblBhcmFtZXRlclZpc2l0b3IgPSBuZXcgUmV0dXJuUGFyYW1ldGVyVmlzaXRvcigpOwotICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXJWaXNpdG9yLnJ1bihtZXRob2QsaW5wdXRGaWxlSGVscDJHZW5lcmF0b3IpOwotICAgICAgICAgICBmYnVmZmVyID0gaW5wdXRGaWxlSGVscDJHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgICB9Ci0gICAgIH0KLQotICAgIGlmICghbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSAgJiYgIW1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5pc1ByaW1pdGl2ZSgpKSBmYnVmZmVyLmFwcGVuZCgifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgICAgCi0gICAgCi0gIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVIZWxwMkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjRmZTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlBhcmFtZXRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBSZXN1bHRGaWxlSGVscDJnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHJpdmF0ZSBTdHJpbmcgZlR5cGVPd25lcklkOyAgCi0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gYnVmZmVyIFN0cmluZ0J1ZmZlciBvYmplY3QgdGhhdCB0aGlzIGNvZGUgZ2VuZXJhdG9yIHdyaXRlcyB0byAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICAgIAotICB9Ci0gIAotICAvKioKLSAgKiBWaXNpdCBNZXRob2QgZ2VuZXJhdGVzIGNvZGUgZm9yIHRoaXMgVmlzaXRvcgotICAqIEBwYXJhbSBQYXJhbWV0ZXIgcGFyYW1ldGVyIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQgCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAKLQotICAgICBQYXJhbWV0ZXJFbGVtZW50IHBhcmFtZXRlckVsZW1lbnQgPSAoUGFyYW1ldGVyRWxlbWVudClvYmplY3Q7Ci0gICAgIEVsZW1lbnQgZWxlbWVudD0gcGFyYW1ldGVyRWxlbWVudC5nZXRUeXBlRWxlbWVudCgpOyAKLSAgICAgaWYocGFyYW1ldGVyRWxlbWVudC5nZXRUeXBlRWxlbWVudCgpLmlzU2ltcGxlKCkgfHwgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4ocGFyYW1ldGVyRWxlbWVudC5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSkpeyAgICAgIAotICAgICAgICAvL3N0YXJ0IHRoZSBjb2RlZ2VuCi0gICAgICAgICAvL2FzayB0aGUgZGF0YXR5cGUgZm9yIGl0cyByZXF1ZXN0IGxpbmUsIGl0IG1heSBuZWVkIG1hcmsgdXAgb3Igbm90LgotICAgICAgICAvL2llIEZvciB0aGUgc2ltcGxlIHR5cGVzIHdlIG5lZWQgdGhlIG1hcmsgdXAKLSAgICAgICAgLy9mb3IgdGhlIGRvbSBlbGVtZW50IHdlIGNhbnQgdXNlIGl0LgotICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZVR5cGUocGFyYW1ldGVyRWxlbWVudC5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSxwYXJhbWV0ZXJFbGVtZW50LmdldE1VSUQoKSk7Ci0gICAgICAgIHNldFR5cGVPd25lcklkKGlkTmFtZShwYXJhbWV0ZXJFbGVtZW50LmdldE5hbWUoKSkpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZChkYXRhVHlwZS5nZXRSZXF1ZXN0Q29kZShwYXJhbWV0ZXJFbGVtZW50LmdldE1VSUQoKSxnZXRUeXBlT3duZXJJZCgpKSk7Ci0gICAgIH0KLSAgICAgICAgIAotICAgICAvL3Zpc2l0IHRoZSB0eXBlIGdlbmVyYXRvcgotICAgICBSZXN1bHRGaWxlVHlwZUdlbmVyYXRvciByZXN1bHRGaWxlVHlwZUdlbmVyYXRvciA9IG5ldyBSZXN1bHRGaWxlVHlwZUdlbmVyYXRvcihmYnVmZmVyKTsgCi0gICAgIHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0VHlwZU93bmVySWQoZ2V0VHlwZU93bmVySWQoKSk7Ci0gICAgIFR5cGVWaXNpdG9yIFR5cGVWaXNpdG9yID0gbmV3IFR5cGVWaXNpdG9yKCk7Ci0gICAgIFR5cGVWaXNpdG9yLnJ1bihwYXJhbWV0ZXJFbGVtZW50LHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yKTsKLSAgICAgZmJ1ZmZlciA9IHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICBzZXROdW1iZXJGYWN0b3J5KHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylyZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5nZXRSZXNpZGVudFZlY3RvcigpLmZpcnN0RWxlbWVudCgpOwotICAgICBwdXRSZXNpZGVudFZlY3RvcihuYW1lKTsgCi0gICAgIAotICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU93bmVySWQoKQotICB7Ci0gICAgIGlmIChmVHlwZU93bmVySWQgPT0gbnVsbCkgZlR5cGVPd25lcklkID0gIiI7IAotICAgICByZXR1cm4gZlR5cGVPd25lcklkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VHlwZU93bmVySWQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmVHlwZU93bmVySWQgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBpZE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgCQotICAgIFN0cmluZyB1bmlxdWVOdW0gPSBTdHJpbmcudmFsdWVPZihnZXRVbmlxdWVOdW1iZXIoKSk7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSBuYW1lLnJlcGxhY2UoJy4nLCcxJykgKyAiXyIgK3VuaXF1ZU51bSArICJpZCI7Ci0gICAgcmV0dXJuIG5ld05hbWU7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmFkOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLkF0dHJpYnV0ZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5GaWVsZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBSZXN1bHRGaWxlSGVscDJnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IgZXh0ZW5kcyBSZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZlR5cGVJZE5hbWU7Ci0gCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIEBwYXJhbSBidWZmZXIgU3RyaW5nQnVmZmVyIG9iamVjdCB0aGF0IHRoaXMgY29kZSBnZW5lcmF0b3Igd3JpdGVzIHRvIAotICAqLwotICBwdWJsaWMgUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFZpc2l0IE1ldGhvZCBnZW5lcmF0ZXMgY29kZSBmb3IgdGhpcyBWaXNpdG9yCi0gICogQHBhcmFtIFBhcmFtZXRlciBwYXJhbWV0ZXIgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCAKLSAgKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICBFbGVtZW50IHR5cGVFbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAgICBUeXBlRWxlbWVudCB0eXBlID0gKFR5cGVFbGVtZW50KXR5cGVFbGVtZW50OyAgICAgIAotICAgICAvLyByaWdodCBub3cgd2Ugb25seSBoYXZlIHNpbXBsZSB0byB3b3JyeSBhYm91dAotICAgICBpZih0eXBlLmlzU2ltcGxlKCkgfHwgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4odHlwZS5nZXROYW1lKCkpKXsKLSAgICAgICAvLyBjcmVhdGUgdGhlIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBzaW1wbGUgdHlwZSBuYW1lCi0gICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGVUeXBlKHR5cGUuZ2V0TmFtZSgpLHR5cGUuZ2V0T3duaW5nRWxlbWVudCgpLmdldE1VSUQoKSk7Ci0gIAotICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGdldFR5cGVPd25lcklkKCkrICJUZW1wIjsKLSAgICAgICBmYnVmZmVyLmFwcGVuZChkYXRhVHlwZS5zdHJpbmdDb252ZXJzaW9uKHR5cGUuZ2V0TmFtZSgpLG5vZGVOYW1lLGdldFR5cGVPd25lcklkKCkpKTsKLQotICAgICAgIHB1dFJlc2lkZW50VmVjdG9yKG5vZGVOYW1lKTsKLSAgICAgfQotCi0gICAgIGVsc2UgewotICAgICAgIC8vbXVzdCBiZSBjb21wbGV4Ci0gICAgICAgU3RyaW5nIHR5cGVOYW1lID0gdHlwZUVsZW1lbnQuZ2V0TmFtZSgpOyAKLSAgICAgICBmVHlwZUlkTmFtZSA9IGlkTmFtZSh0eXBlTmFtZSk7Ci0gICAgICAgICAgICAgIAotICAgICAgIEF0dHJpYnV0ZVZpc2l0b3IgYXR0cmlidXRlVmlzaXRvciA9IG5ldyBBdHRyaWJ1dGVWaXNpdG9yKCk7Ci0gICAgICAgUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvciByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yID0gbmV3IFJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IoZmJ1ZmZlcik7Ci0gICAgICAgcmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5zZXROdW1iZXJGYWN0b3J5KGdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgICAgYXR0cmlidXRlVmlzaXRvci5ydW4odHlwZUVsZW1lbnQscmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcik7Ci0gICAgICAgc2V0TnVtYmVyRmFjdG9yeShyZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLmdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgICAgZmJ1ZmZlciA9IHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICBGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEZpZWxkVmlzaXRvcigpOwotICAgICAgIFJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgcmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjIgPSBuZXcgUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcihmYnVmZmVyKTsKLSAgICAgICByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5zZXROdW1iZXJGYWN0b3J5KGdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgICAgZmllbGRWaXNpdG9yLnJ1bih0eXBlRWxlbWVudCxyZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMik7Ci0gICAgICAgc2V0TnVtYmVyRmFjdG9yeShyZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5nZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICAgIGZidWZmZXIgPSByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5nZXRTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgCi0gICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPGpzcDp1c2VCZWFuIGlkPVwiIiArIGZUeXBlSWROYW1lICsgIlwiIHNjb3BlPVwic2Vzc2lvblwiIGNsYXNzPVwiIiArIHR5cGVOYW1lICsgIlwiIC8+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgIGZidWZmZXIuYXBwZW5kKEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgCi0gICAgICAgRW51bWVyYXRpb24gZSA9IHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuZ2V0UmVzaWRlbnRWZWN0b3IoKS5lbGVtZW50cygpOwotICAgICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpewotICAgICAgICAgIGZidWZmZXIuYXBwZW5kKEdlbmVyYXRvci5ET1VCTEVfVEFCICsgZlR5cGVJZE5hbWUgKyAiLiIgKyBlLm5leHRFbGVtZW50KCkgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICB9Ci0KLSAgICAgICBFbnVtZXJhdGlvbiBlMiA9IHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyLmdldFJlc2lkZW50VmVjdG9yKCkuZWxlbWVudHMoKTsKLSAgICAgICB3aGlsZShlMi5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBmVHlwZUlkTmFtZSArICIuIiArIGUyLm5leHRFbGVtZW50KCkgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICB9IAotICAgICAgIHB1dFJlc2lkZW50VmVjdG9yKGZUeXBlSWROYW1lKTsKLSAgICAgICAvL2VuZCBvZiBjaGFuZ2VzCi0gICAgIAotICAgIH0KLSAgICAgCi0gICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfSAgIAotICAKLQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vVGVzdENsaWVudEZpbGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vVGVzdENsaWVudEZpbGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmYjg4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Rlc3RDbGllbnRGaWxlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFRlc3RDbGllbnRGaWxlZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFRlc3RDbGllbnRGaWxlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgU3RyaW5nIGZNZXRob2ROYW1lOwotICBwdWJsaWMgU3RyaW5nIGZJbnB1dE5hbWU7Ci0gIHB1YmxpYyBTdHJpbmcgZlJlc3VsdE5hbWU7Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKgotICAqLwotICBwdWJsaWMgVGVzdENsaWVudEZpbGVHZW5lcmF0b3IgKFN0cmluZyBpbnB1dHMsIFN0cmluZyBtZXRob2RzLCBTdHJpbmcgcmVzdWx0cykKLSAgewotICAgICBzdXBlcigpOwotICAgICBmSW5wdXROYW1lID0gaW5wdXRzOwotICAgICBmTWV0aG9kTmFtZSA9IG1ldGhvZHM7Ci0gICAgIGZSZXN1bHROYW1lID0gcmVzdWx0czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lcyhTdHJpbmcgaW5wdXRzLCBTdHJpbmcgbWV0aG9kcywgU3RyaW5nIHJlc3VsdHMpCi0gIHsKLSAgICBmSW5wdXROYW1lID0gaW5wdXRzOwotICAgIGZNZXRob2ROYW1lID0gbWV0aG9kczsKLSAgICBmUmVzdWx0TmFtZSA9IHJlc3VsdHM7Ci0gIH0KLQotICAvL3Rha2VzIGluIGEgYmVhbiBub2RlCi0gICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICAgewotICAgICAgRWxlbWVudCBiZWFuRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlQHBhZ2UgY29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOFwiJT4iKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEhFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUSVRMRT5XZWIgU2VydmljZXMgVGVzdCBDbGllbnQ8L1RJVExFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiIik7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZSQU1FU0VUICBDT0xTPVwiMjIwLCpcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZSQU1FIFNSQz1cIiIrIGZNZXRob2ROYW1lICsgIlwiIE5BTUU9XCJtZXRob2RzXCIgTUFSR0lOV0lEVEg9XCIxXCIgTUFSR0lOSEVJR0hUPVwiMVwiIFNDUk9MTElORz1cInllc1wiIEZSQU1FQk9SREVSPVwiMVwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8RlJBTUVTRVQgIFJPV1M9XCI4MCUsMjAlXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGUkFNRSBTUkM9XCIiKyBmSW5wdXROYW1lICArICJcIiBOQU1FPVwiaW5wdXRzXCIgIE1BUkdJTldJRFRIPVwiMVwiIE1BUkdJTkhFSUdIVD1cIjFcIiBTQ1JPTExJTkc9XCJ5ZXNcIiBGUkFNRUJPUkRFUj1cIjFcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiU3RyaW5nQnVmZmVyIHJlc3VsdEpTUCA9IG5ldyBTdHJpbmdCdWZmZXIoXCIiKS5hcHBlbmQoZlJlc3VsdE5hbWUpLmFwcGVuZCgiXCIpOyIpLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJyZXN1bHRKU1AuYXBwZW5kKFwiP1wiKTsiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiamF2YS51dGlsLkVudW1lcmF0aW9uIHJlc3VsdEVudW0gPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Iik7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgid2hpbGUgKHJlc3VsdEVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiT2JqZWN0IHJlc3VsdE9iaiA9IHJlc3VsdEVudW0ubmV4dEVsZW1lbnQoKTsiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgicmVzdWx0SlNQLmFwcGVuZChyZXN1bHRPYmoudG9TdHJpbmcoKSkuYXBwZW5kKFwiPVwiKS5hcHBlbmQocmVxdWVzdC5nZXRQYXJhbWV0ZXIocmVzdWx0T2JqLnRvU3RyaW5nKCkpKS5hcHBlbmQoXCImXCIpOyIpLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ9IikuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IikuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGUkFNRSBTUkM9XCI8JT1yZXN1bHRKU1AudG9TdHJpbmcoKSU+XCIgTkFNRT1cInJlc3VsdFwiICBNQVJHSU5XSURUSD1cIjFcIiBNQVJHSU5IRUlHSFQ9XCIxXCIgU0NST0xMSU5HPVwieWVzXCIgRlJBTUVCT1JERVI9XCIxXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvRlJBTUVTRVQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotCi0KLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8Tk9GUkFNRVM+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJUaGUgV2ViIFNlcnZpY2VzIFRlc3QgQ2xpZW50IHJlcXVpcmVzIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIGZyYW1lcy4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L05PRlJBTUVTPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0ZSQU1FU0VUPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hUTUw+Iik7Ci0KLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29tbWFuZC9HZW5lcmF0ZVBhZ2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tYW5kL0dlbmVyYXRlUGFnZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzYjU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tYW5kL0dlbmVyYXRlUGFnZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0KLS8qKgotICogTW9mVG9CZWFuTW9kZWxDb21tYW5kCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDEyOjQxOjQ4IFBNKQotICogQGF1dGhvcjogR2lsYmVydCBBbmRyZXdzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZVBhZ2VDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0JCQotcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiR2VuZXJhdGVQYWdlQ29tbWFuZCI7Ci1wcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJHZW5lcmF0ZSBjb2RlIGJhc2VkIG9uIHRoZSBtb2RlbCI7Ci1wcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLXByaXZhdGUgTW9kZWwgbW9kZWxfOwotcHJpdmF0ZSBHZW5lcmF0b3IgZkdlbmVyYXRvcjsKLXByaXZhdGUgSUZpbGUgZklGaWxlOwotcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0XzsKLXByaXZhdGUgU3RyaW5nQnVmZmVyIGZTdHJpbmdCdWZmZXI7Ci0KLXByaXZhdGUgRWxlbWVudCByb290RWxlbWVudF87Ci0vKioKLSAqIEJ1aWxkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBHZW5lcmF0ZVBhZ2VDb21tYW5kKCkKLXsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0Jc2V0TmFtZShMQUJFTCk7ICAJCQotfQotCi0vKioKLSogQ29uc3RydWN0b3IKLSogVGhpcyBjb21tYW5kIHdpbGwgZ2VuZXJhdGUgY29kZSBmcm9tIGEgTW9kZWwKLSogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0byBiZSB0cmF2ZXJzZWQKLSogQHBhcmFtIGdlbmVyYXRvciBUaGUgY29kZSBnZW5lcmF0b3IgdG8gYmUgdXNlZAotKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIHBsYWNlIHRoZSBmaW5pc2hlZCBwcm9kdWN0Ci0qLwotcHVibGljIEdlbmVyYXRlUGFnZUNvbW1hbmQoUmVzb3VyY2VDb250ZXh0IGNvbnRleHQsIE1vZGVsIG1vZGVsLCBHZW5lcmF0b3IgZ2VuZXJhdG9yLCBJRmlsZSBmaWxlKQotewotICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgc2V0TmFtZShMQUJFTCk7CQotICAKLSAgbW9kZWxfID0gbW9kZWw7Ci0gIGZHZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0gIGZJRmlsZSA9IGZpbGU7Ci0gIHJlc291cmNlQ29udGV4dF8gPSBjb250ZXh0OwotfQotCi1wdWJsaWMgTW9kZWwgZ2V0RGF0YU1vZGVsKCkKLXsKLSAgcmV0dXJuIG1vZGVsXzsKLX0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotewotICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgdHJ5IHsKLSAgICBmR2VuZXJhdG9yLnZpc2l0KG1vZGVsXy5nZXRSb290RWxlbWVudCgpKTsKLSAgICBmU3RyaW5nQnVmZmVyID0gZkdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICBTdHJpbmcgdGVtcFN0cmluZyA9IGZTdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLSAgICBPdXRwdXRTdHJlYW0gZmlsZVJlc291cmNlID0gRmlsZVJlc291cmNlVXRpbHMubmV3RmlsZU91dHB1dFN0cmVhbShyZXNvdXJjZUNvbnRleHRfLCBmSUZpbGUuZ2V0RnVsbFBhdGgoKSwgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLCBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpKTsKLSAgICAvL1ByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGZpbGVSZXNvdXJjZSk7Ci0gICAgLy9wcy5wcmludCh0ZW1wU3RyaW5nKTsKLSAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmaWxlUmVzb3VyY2UsIlVURi04Iik7Ci0gICAgb3N3LndyaXRlKHRlbXBTdHJpbmcsMCxmU3RyaW5nQnVmZmVyLmxlbmd0aCgpKTsgIAotICAgIG9zdy5jbG9zZSgpOwotICAgIGZpbGVSZXNvdXJjZS5jbG9zZSgpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXhjKSB7Ci0gIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBpb2V4Yy5nZXRNZXNzYWdlKCksIFN0YXR1cy5FUlJPUik7Ci0gIAlyZXR1cm4gc3RhdHVzOwotICB9Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFJvb3RFbGVtZW50KEVsZW1lbnQgcm9vdEVsZW1lbnQpCi17Ci0gIHJvb3RFbGVtZW50XyA9IHJvb3RFbGVtZW50OwotfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1hbmQvSmF2YVRvTW9kZWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tYW5kL0phdmFUb01vZGVsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2I3MDE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1hbmQvSmF2YVRvTW9kZWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnMuSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mQmVhblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0vKioKLSogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgY29tbWFuZHMgdGhhdCBuZWVkIHRvIHJlcG9ydCBwcm9ncmVzcwotKiBhbmQgc3RhdHVzIGR1cmluZyBhbmQgYWZ0ZXIgdGhlaXIgZXhlY3V0aW9uLiBUaGlzIGNsYXNzIGV4dGVuZHMKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQgQWJzdHJhY3RDb21tYW5kfQotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0qIHdpdGggbWV0aG9kcyB0byB7QGxpbmsgI3NldFByb2dyZXNzTW9uaXRvciBzZXR9Ci0qIGFuZCB7QGxpbmsgI2dldFByb2dyZXNzTW9uaXRvciBnZXR9IGEgcHJvZ3Jlc3MgbW9uaXRvciwKLSogYW5kIHRvIGdldCBhIHN0YXR1cyBvYmplY3Qge0BsaW5rICNnZXRSZWFkeVN0YXR1cyBiZWZvcmV9Ci0qIG9yIHtAbGluayAjZ2V0UmVzdWx0U3RhdHVzIGFmdGVyfSBleGVjdXRpb24uCi0qIDxwPgotKiBOb3RlIHRoYXQgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHByb3ZpZGluZyBhbgotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgSVByb2dyZXNzTW9uaXRvcn0KLSogcmVzdHMgd2l0aCBmcmFtZXdvcmtzIHRoYXQgY29uc3RydWN0IG9yIHJ1biBQcm9ncmVzc0NvbW1hbmQgb2JqZWN0cywKLSogd2hlcmVhcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgcHJvdmlkaW5nIGFuCi0qIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotKiBvYmplY3QgbGllcyB3aXRoIHRoZSBzdWJjbGFzc2VzIG9mIFByb2dyZXNzQ29tbWFuZC4KLSogU3ViY2xhc3NlcyBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZGVzY3JpYmVkIGZvcgotKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCBBYnN0cmFjdENvbW1hbmR9LgotKi8KLXB1YmxpYyBjbGFzcyBKYXZhVG9Nb2RlbENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotICBwcml2YXRlIElSZXNvdXJjZSByZXNvdXJjZTsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLSAgcHJpdmF0ZSBCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kczsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJveHlCZWFuOwotICBwcml2YXRlIEphdmFDbGFzcyBqYXZhQ2xhc3M7Ci0gIHByaXZhdGUgTW9kZWwgbW9kZWw7Ci0gIHByaXZhdGUgRWxlbWVudCBwYXJlbnRFbGVtZW50OwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJKYXZhVG9Nb2RlbENvbW1hbmQiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJ0aGlzIGNyZWF0ZXMgYSBtb2RlbCBmcm9tIGEgcmVzb3VyY2UiOwotIAotICAKLQotICBwdWJsaWMgSmF2YVRvTW9kZWxDb21tYW5kICgpCi0gIHsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgCQotICAJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotICAJc2V0TmFtZShMQUJFTCk7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSBTdGF0dXMgY3JlYXRlSmF2YVJlZmxlY3Rpb24oRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kIGphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICBqYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICBqYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuc2V0UHJveHlCZWFuKHByb3h5QmVhbik7Ci0gICAgLy9qYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgIHN0YXR1cyA9IGphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgamF2YUNsYXNzID0gKEphdmFDbGFzcylqYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuZ2V0SmF2YUNsYXNzKCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBNb2RlbCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gdGhpcyBqYXZhbW9mCi0gICogQHJldHVybiBNb2RlbCBUaGUgZGF0YSBtb2RlbCB0aGF0IHdhcyBjcmVhdGVkCi0gICoqLwotICBwdWJsaWMgTW9kZWwgZ2V0RGF0YU1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIC8qKgotICAqIEJ1aWxkIHRoZSBkYXRhbW9kZWwgZnJvbSB0aGUgbW9mCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgYnVpbGRNb2RlbEZyb21Nb2YgKEVudmlyb25tZW50IGVudikgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAJCi0gIAlDaG9pY2UgT0tDaG9pY2UgPSBuZXcgQ2hvaWNlKCdPJywgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTEFCRUxfT0siKSwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiREVTQ1JJUFRJT05fT0siKSk7Ci0gIAlDaG9pY2UgQ2FuY2VsQ2hvaWNlID0gbmV3IENob2ljZSgnQycsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX0NBTkNFTCIpLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9DQU5DRUwiKSk7Ci0gIAkKLSAgICAvLyB3ZSBjb3VsZCBoYXZlIG9uZSBvZiB0aHJlZSBjYXNlczoKLSAgICAvLzEuIFRoZSBtb2RlbCBpcyBudWxsIG1lYW5pbmcgd2Ugd2FudCBhbmQgdGhlIHBhcmVudCBlbGVtZW50IGlzIG51bGwsIG1lYW5pbmcgd2Ugd2FudCB0bwotICAgIC8vICAgY3JlYXRlIGEgYnJhbmQgbmV3IG1vZGVsIGFuZCBtYWtlIHRoaXMgYmVhbiBpdHMgcm9vdAotICAgIC8vMi4gVGhlIG1vZGVsIGlzIG51bGwgYnV0IHRoZSBwYXJlbnRFbGVtZW50IGlzIG5vdCwgbWVhbmluZyB3ZSB3YW50IHRvIGFkZCB0aGUgQmVhbiB0byB0aGUKLSAgICAvLyAgIGdpdmVuIHBhcmVudCBlbGVtZW50Ci0gICAgLy8zLiBUaGUgbW9kZWwgaXMgbm90IG51bGwgaG93ZXZlciB0aGUgcGFyZW50RWxlbWVudCBpcywgbWVhbmluZyB3ZSB3YW50IHRvIGFkZCB0aGlzIEJlYW4gdG8KLSAgICAvLyAgIFRoaXMgbW9kZWwgYnV0IGRvbnQgYXR0YWNoIGl0IHRvIGFueXRoaW5nCi0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICAgIGlmKG1vZGVsID09IG51bGwgJiYgcGFyZW50RWxlbWVudCA9PSBudWxsKXsKLSAgICAgICAgIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbiBiZWFuVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24oY2xpZW50UHJvamVjdCxtZXRob2RzLCBlbnYpOwotICAgICAgICAgLy9iZWFuVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0JICAgICBKYXZhTW9mQmVhblZpc2l0b3IgYmVhblZpc2l0b3IgPSBuZXcgSmF2YU1vZkJlYW5WaXNpdG9yKCk7Ci0gICAgICAgICBzdGF0dXMgPSBiZWFuVmlzaXRvci5ydW4oamF2YUNsYXNzLGJlYW5WaXNpdG9yQWN0aW9uKTsKLSAgICAgICAgIC8vCi0gICAgICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgICAgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgICAgewotICAgICAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIAkKLSAgICAgICAgIH0KLSAgICAgICAgIC8vCi0gICAgICAgICBtb2RlbCA9IGJlYW5WaXNpdG9yQWN0aW9uLmdldE1vZGVsKCk7Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG1vZGVsID09IG51bGwgJiYgcGFyZW50RWxlbWVudCAhPSBudWxsKXsKLSAgICAgICAgIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbiBiZWFuVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24ocGFyZW50RWxlbWVudCxjbGllbnRQcm9qZWN0LCBlbnYpOwotICAgICAgICAgLy9iZWFuVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0JICAgICBKYXZhTW9mQmVhblZpc2l0b3IgYmVhblZpc2l0b3IgPSBuZXcgSmF2YU1vZkJlYW5WaXNpdG9yKCk7Ci0gICAgICAgICBzdGF0dXMgPSBiZWFuVmlzaXRvci5ydW4oamF2YUNsYXNzLGJlYW5WaXNpdG9yQWN0aW9uKTsKLSAgICAgICAgIC8vCi0gICAgICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgICAgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgICAgewotICAgICAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIAkKLSAgICAgICAgIH0KLSAgICAgICAgIC8vICAgICAgICAgCi0gICAgICAgICBtb2RlbCA9IGJlYW5WaXNpdG9yQWN0aW9uLmdldE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbiBiZWFuVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24obW9kZWwsY2xpZW50UHJvamVjdCwgZW52KTsKLSAgICAgICAgIC8vYmVhblZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotCSAgICAgSmF2YU1vZkJlYW5WaXNpdG9yIGJlYW5WaXNpdG9yID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvcigpOwotICAgICAgICAgc3RhdHVzID0gYmVhblZpc2l0b3IucnVuKGphdmFDbGFzcyxiZWFuVmlzaXRvckFjdGlvbik7Ci0gICAgICAgICAvLwotICAgICAgICAgaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7IAotICAgICAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAgIAotICAgICAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICAgICAgIHsKLSAgICAgICAgICAgQ2hvaWNlIHJlc3VsdCA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TQU1QTEVfQ1JFQVRJT05fQ0FOQ0VMRUQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICAJCi0gICAgICAgICB9Ci0gICAgICAgICAvLyAgICAgICAgIAotICAgICAgICAgbW9kZWwgPSBiZWFuVmlzaXRvckFjdGlvbi5nZXRNb2RlbCgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICogR2V0IHRoZSBqYXZhIG1vZGVsIGZyb20gdGhlIHJlc291cmNlIHRoZW4KLSAgKiBidWlsZCB0aGUgbW9kZWwgZnJvbSB0aGUgbW9mCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBpZihjbGllbnRQcm9qZWN0ID09IG51bGwpIHJldHVybiBzdGF0dXM7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShjbGllbnRQcm9qZWN0KTsKLSAgICAKLSAgCXN0YXR1cyA9IGNyZWF0ZUphdmFSZWZsZWN0aW9uKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgdHJ5ewotICAgICAgc3RhdHVzID0gYnVpbGRNb2RlbEZyb21Nb2YoZW52KTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKXsKLSAgICAgIElTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBleGMuZ2V0U3RhdHVzKCk7Ci0gICAgICBzdGF0dXMgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoZW1iZWRkZWRTdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRNZXRob2RzKEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzKQotICB7Ci0gIAl0aGlzLm1ldGhvZHMgPSAgbWV0aG9kczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAJdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UGFyZW50RWxlbWVudChFbGVtZW50IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgCXRoaXMucGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7Ci0gIH0KLSAgICAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tb24vU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tb24vU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjRiMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29tbW9uL1NhbXBsZVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFByb3BlcnR5RGVzY3JpcHRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwcml2YXRlIE1ldGhvZCBmUmVhZE1ldGhvZDsKLSAgcHJpdmF0ZSBNZXRob2QgZldyaXRlTWV0aG9kOwotICBwcml2YXRlIFN0cmluZyBmUHJvcGVydHlOYW1lOwotICBwcml2YXRlIEphdmFIZWxwZXJzIGZQcm9wZXJ0eVR5cGU7IAotICBwcml2YXRlIGJvb2xlYW4gZlN0YXRpYzsKLSAgCi0gIC8qCi0gICogQ29uc3RydWN0b3IKLSAgKiovCi0gIHB1YmxpYyBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmUHJvcGVydHlOYW1lID0gbmFtZTsgCi0gIH0KLQotICAvKgotICAqIHNldCB0aGUgUmVhZE1ldGhvZAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWFkTWV0aG9kKE1ldGhvZCByZWFkTWV0aG9kKQotICB7Ci0gICAgZlJlYWRNZXRob2QgPSByZWFkTWV0aG9kOwotICB9Ci0KLSAgIC8qCi0gICogZ2V0IHRoZSBSZWFkTWV0aG9kIAotICAqLwotICBwdWJsaWMgTWV0aG9kIGdldFJlYWRNZXRob2QoKQotICB7Ci0gICAgcmV0dXJuIGZSZWFkTWV0aG9kOwotICB9Ci0KLSAgLyoKLSAgKiBzZXQgdGhlIHdyaXRlTWV0aG9kCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFdyaXRlTWV0aG9kKE1ldGhvZCB3cml0ZU1ldGhvZCkKLSAgewotICAgIGZXcml0ZU1ldGhvZCA9IHdyaXRlTWV0aG9kOwotICB9Ci0KLSAgIC8qCi0gICogZ2V0IHRoZSB3cml0ZU1ldGhvZCAKLSAgKi8KLSAgcHVibGljIE1ldGhvZCBnZXRXcml0ZU1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gZldyaXRlTWV0aG9kOwotICB9Ci0KLSAgLyoKLSAgKiBzZXQgdGhlIHByb3BlcnR5TmFtZQotICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZlByb3BlcnR5TmFtZT0gbmFtZTsKLSAgfQotCi0gICAvKgotICAqIGdldCB0aGUgcHJvcGVydHlOYW1lCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZlByb3BlcnR5TmFtZTsKLSAgfQotCi0gIC8qCi0gICogc2V0IHRoZSBQcm9wZXJ0eVR5cGUKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlUeXBlKEphdmFIZWxwZXJzIHByb3BlcnR5VHlwZSkKLSAgewotICAgIGZQcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eVR5cGU7Ci0gIH0KLQotICAgLyoKLSAgKiBnZXQgdGhlIFByb3BlcnR5VHlwZSAKLSAgKi8KLSAgcHVibGljIEphdmFIZWxwZXJzIGdldFByb3BlcnR5VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZlByb3BlcnR5VHlwZTsKLSAgfQotICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGlzZlN0YXRpYygpCi0gIHsKLSAgCXJldHVybiBmU3RhdGljOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0ZlN0YXRpYyhib29sZWFuIGZTdGF0aWMpCi0gIHsKLSAgICB0aGlzLmZTdGF0aWMgPSBmU3RhdGljOwkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9JV1NGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvSVdTRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYTdmZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9JV1NGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ud3NmaW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBJV1NGaW5kZXIKLXsKLSAgcHVibGljIFN0cmluZyBnZXRJRCgpOwotICBwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKTsKLQotICBwdWJsaWMgTGlzdCBmaW5kKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL0xpdmVXU0RMRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL0xpdmVXU0RMRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYWU0OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9MaXZlV1NETEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ud3NmaW5kZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBMaXZlV1NETEZpbHRlciBleHRlbmRzIFRocmVhZAotewotICBwcml2YXRlIFN0cmluZyB3c2RsVVJMXzsKLSAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaF87Ci0gIHByaXZhdGUgYm9vbGVhbiBsaXZlXzsKLQotICBwdWJsaWMgTGl2ZVdTRExGaWx0ZXIoU3RyaW5nIHdzZGxVUkwpCi0gIHsKLSAgICB3c2RsVVJMXyA9IHdzZGxVUkw7Ci0gICAgZmluaXNoXyA9IGZhbHNlOwotICAgIGxpdmVfID0gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdTRExVUkwoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxVUkxfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2goKQotICB7Ci0gICAgcmV0dXJuIGZpbmlzaF87Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1dTRExMaXZlKCkKLSAgewotICAgIHJldHVybiBsaXZlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBsaXZlXyA9IHZhbGlkYXRlV1NETCgpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgbGl2ZV8gPSBmYWxzZTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGZpbmlzaF8gPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVdTREwoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAJV2ViU2VydmljZXNQYXJzZXJFeHQgcGFyc2VyID0gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBwYXJzZXIuZ2V0V1NETERlZmluaXRpb25WZXJib3NlKHdzZGxVUkxfKTsKLSAgICBNYXAgc2VydmljZXMgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgSXRlcmF0b3Igc2VydmljZUl0ZXJhdG9yID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoc2VydmljZUl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlzZXJ2aWNlSXRlcmF0b3IubmV4dCgpOwotICAgICAgTWFwIHBvcnRzID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgSXRlcmF0b3IgcG9ydEl0ZXJhdG9yID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChwb3J0SXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydClwb3J0SXRlcmF0b3IubmV4dCgpOwotICAgICAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cyA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGV4dGVuc2liaWxpdHlFbGVtZW50c0l0ZXJhdG9yID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChleHRlbnNpYmlsaXR5RWxlbWVudHNJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRlbnNpYmlsaXR5RWxlbWVudHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgaWYgKChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKSB8fCAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBIVFRQQWRkcmVzcykpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvV1NGaW5kZXJDb21tb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvV1NGaW5kZXJDb21tb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjMWNjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL1dTRmluZGVyQ29tbW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi53c2ZpbmRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0LkVKQk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5JRUpCTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSVdlYk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5KMkVFV2ViTmF0dXJlUnVudGltZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRmluZGVyQ29tbW9uIGltcGxlbWVudHMgSVdTRmluZGVyCi17Ci0gIHByaXZhdGUgU3RyaW5nIGlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIGRlc2NfOwotCi0gIHB1YmxpYyBXU0ZpbmRlckNvbW1vbigpCi0gIHsKLSAgICBpZF8gPSBudWxsOwotICAgIG5hbWVfID0gbnVsbDsKLSAgICBkZXNjXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElEKCkKLSAgewotICAgIHJldHVybiBpZF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpCi0gIHsKLSAgICBpZF8gPSBpZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZGVzY187Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYykKLSAgewotICAgIGRlc2NfID0gZGVzYzsKLSAgfQotCi0gIHByb3RlY3RlZCBJUHJvamVjdFtdIGdldFdvcmtzcGFjZVByb2plY3RzKCkKLSAgewotICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIHJldHVybiByb290LmdldFByb2plY3RzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSjJFRVdlYk5hdHVyZVJ1bnRpbWUgZ2V0V2ViTmF0dXJlKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUHJvamVjdE5hdHVyZSBuYXR1cmUgPSBwcm9qZWN0LmdldE5hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLSAgICAgIGlmIChuYXR1cmUgIT0gbnVsbCAmJiBuYXR1cmUgaW5zdGFuY2VvZiBKMkVFV2ViTmF0dXJlUnVudGltZSkKLSAgICAgICAgcmV0dXJuIChKMkVFV2ViTmF0dXJlUnVudGltZSluYXR1cmU7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRUpCTmF0dXJlUnVudGltZSBnZXRFSkJOYXR1cmUoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElQcm9qZWN0TmF0dXJlIG5hdHVyZSA9IHByb2plY3QuZ2V0TmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKTsKLSAgICAgIGlmIChuYXR1cmUgIT0gbnVsbCAmJiBuYXR1cmUgaW5zdGFuY2VvZiBFSkJOYXR1cmVSdW50aW1lKQotICAgICAgICByZXR1cm4gKEVKQk5hdHVyZVJ1bnRpbWUpbmF0dXJlOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGb2xkZXIgZ2V0Rm9sZGVyUm9vdFB1Ymxpc2hhYmxlKEoyRUVXZWJOYXR1cmVSdW50aW1lIHdlYk5hdHVyZSkKLSAgewotICAgIHJldHVybiAoSUZvbGRlcil3ZWJOYXR1cmUuZ2V0Um9vdFB1Ymxpc2hhYmxlRm9sZGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZvbGRlciBnZXRGb2xkZXJXRUJJTkYoSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViTmF0dXJlKQotICB7Ci0gICAgcmV0dXJuIHdlYk5hdHVyZS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKHdlYk5hdHVyZS5nZXRXRUJJTkZQYXRoKCkudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZvbGRlciBnZXRGb2xkZXJNRVRBSU5GKEVKQk5hdHVyZVJ1bnRpbWUgZWpiTmF0dXJlKQotICB7Ci0gICAgcmV0dXJuIGVqYk5hdHVyZS5nZXRNZXRhRm9sZGVyKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvV1NGaW5kZXJSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9XU0ZpbmRlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDdjOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9XU0ZpbmRlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLndzZmluZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1wdWJsaWMgY2xhc3MgV1NGaW5kZXJSZWdpc3RyeQotewotICBwcml2YXRlIHN0YXRpYyBXU0ZpbmRlclJlZ2lzdHJ5IGluc3RhbmNlXzsKLSAgcHJpdmF0ZSBWZWN0b3Igd3NmaW5kZXJzXzsKLQotICBwcml2YXRlIFdTRmluZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgd3NmaW5kZXJzXyA9IG5ldyBWZWN0b3IoKTsKLSAgfQotICAKLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV1NGaW5kZXJSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV1NGaW5kZXJSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFdTRmluZGVyUmVnaXN0cnkoKTsKLSAgICAgIGluc3RhbmNlXy5pbml0KCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBpbml0KCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gcGx1Z2luUmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0Zvcigib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIiwgIndzZmluZGVyIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGNvbmZpZ0VsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJV1NGaW5kZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBJV1NGaW5kZXIgd3NmaW5kZXIgPSAoSVdTRmluZGVyKW9iamVjdDsKLSAgICAgICAgICB3c2ZpbmRlci5zZXRJRChjb25maWdFbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotICAgICAgICAgIHdzZmluZGVyLnNldE5hbWUoY29uZmlnRWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgICAgICAgIHdzZmluZGVyLnNldERlc2NyaXB0aW9uKGNvbmZpZ0VsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKSk7Ci0gICAgICAgICAgd3NmaW5kZXJzXy5hZGQod3NmaW5kZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRXU0ZpbmRlcnMoKQotICB7Ci0gICAgcmV0dXJuIHdzZmluZGVyc187Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VzKCkKLSAgewotICAgIExpc3Qgd3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgTGlzdCB3c0ZpbmRlcnMgPSBnZXRXU0ZpbmRlcnMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gd3NGaW5kZXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgSVdTRmluZGVyIHdzRmluZGVyID0gKElXU0ZpbmRlcilpdC5uZXh0KCk7Ci0gICAgICB3cy5hZGRBbGwod3NGaW5kZXIuZmluZCgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvRG9tRWxlbWVudEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL0RvbUVsZW1lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxY2RmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvRG9tRWxlbWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRG9tRWxlbWVudEhlbHBlciB7Ci0KLQotICBwdWJsaWMgc3RhdGljIG9yZy53M2MuZG9tLkVsZW1lbnQgY3JlYXRlRG9tRWxlbWVudEZyb21YTUxTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB4bWxTdHJpbmcgKQotICB7Ci0gICAgamF2YS5pby5TdHJpbmdSZWFkZXIgc3RyaW5nUmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHhtbFN0cmluZyk7IAotICAgIG9yZy54bWwuc2F4LklucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IG9yZy54bWwuc2F4LklucHV0U291cmNlKHN0cmluZ1JlYWRlcik7IAotICAgIHRyeQotICAgIHsKLSAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jQnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRvY0J1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2NCdWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLSAgICAgIHJldHVybiBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBkb21Xcml0ZXIob3JnLnczYy5kb20uTm9kZSBub2RlLGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgaWYgKCBub2RlID09IG51bGwgKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCWludCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCXN3aXRjaCAoIHR5cGUgKSB7Ci0JICBjYXNlIG9yZy53M2MuZG9tLk5vZGUuRE9DVU1FTlRfTk9ERTogewotCSAgYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpICsgIjxicj4iKTsKLQkgIGRvbVdyaXRlcigoKG9yZy53M2MuZG9tLkRvY3VtZW50KW5vZGUpLmdldERvY3VtZW50RWxlbWVudCgpLGJ1ZmZlcik7Ci0JICBicmVhazsKLQl9Ci0JICBjYXNlIG9yZy53M2MuZG9tLk5vZGUuRUxFTUVOVF9OT0RFOiB7Ci0JICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPCIgKyBub2RlLmdldE5vZGVOYW1lKCkpKTsKLQkgIG9yZy53M2MuZG9tLkF0dHIgYXR0cnNbXSA9IHNvcnRBdHRyaWJ1dGVzKG5vZGUuZ2V0QXR0cmlidXRlcygpKTsKLQkgIGZvciAoIGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrICkgewotCSAgICBvcmcudzNjLmRvbS5BdHRyIGF0dHIgPSBhdHRyc1tpXTsKLQkgICAgYnVmZmVyLmFwcGVuZCgiICIgKyBhdHRyLmdldE5vZGVOYW1lKCkgKyAiPVwiIiArIEpzcFV0aWxzLm1hcmt1cChhdHRyLmdldE5vZGVWYWx1ZSgpKSArICJcIiIpOwotCSAgfQotCSAgICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPiIpKTsKLQkgICAgb3JnLnczYy5kb20uTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkgICAgaWYgKCBjaGlsZHJlbiAhPSBudWxsICkgewotCSAgICAgIGludCBsZW4gPSBjaGlsZHJlbi5nZXRMZW5ndGgoKTsKLQkJICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKLQkJICAgIGlmKCgob3JnLnczYy5kb20uTm9kZSljaGlsZHJlbi5pdGVtKGkpKS5nZXROb2RlVHlwZSgpID09IG9yZy53M2MuZG9tLk5vZGUuRUxFTUVOVF9OT0RFKQotCQkJICBidWZmZXIuYXBwZW5kKCI8YnI+Iik7Ci0JCQlkb21Xcml0ZXIoY2hpbGRyZW4uaXRlbShpKSxidWZmZXIpOwotCQkgIH0KLQkJfQotCQlidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPC8iICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iKSk7Ci0JCWJyZWFrOwotICAgICAgfQotCSAgY2FzZSBvcmcudzNjLmRvbS5Ob2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERTogewotCSAgICBvcmcudzNjLmRvbS5Ob2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCSAgICBpZiAoIGNoaWxkcmVuICE9IG51bGwgKSB7Ci0JCSAgaW50IGxlbiA9IGNoaWxkcmVuLmdldExlbmd0aCgpOwotCQkgIGZvciAoIGludCBpID0gMDsgaSA8IGxlbjsgaSsrICkKLQkgICAgICB7Ci0JCSAgICBidWZmZXIuYXBwZW5kKGNoaWxkcmVuLml0ZW0oaSkpOwotCQkgIH0KLQkJfQotCQlicmVhazsKLQkgIH0KLQkgIGNhc2Ugb3JnLnczYy5kb20uTm9kZS5DREFUQV9TRUNUSU9OX05PREU6IHsKLQkgICAgYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAobm9kZS5nZXROb2RlVmFsdWUoKSkpOwotCSAgICBicmVhazsKLSAgICAgIH0KLQkgIGNhc2Ugb3JnLnczYy5kb20uTm9kZS5URVhUX05PREU6ewotCSAgICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cChub2RlLmdldE5vZGVWYWx1ZSgpKSk7Ci0JICAgIGJyZWFrOwotCSAgfQotCSAgY2FzZSBvcmcudzNjLmRvbS5Ob2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTp7Ci0JCWJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI8PyIpKTsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldE5vZGVOYW1lKCkpOwotCQlTdHJpbmcgZGF0YSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCWlmICggZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwICl7Ci0JICAgICAgYnVmZmVyLmFwcGVuZCgiICIpOwotCQkgIGJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIj8+IikpOwotCQkgIGJyZWFrOwotCQl9Ci0JICB9Ci0JICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotIAotCXB1YmxpYyBzdGF0aWMgb3JnLnczYy5kb20uQXR0cltdIHNvcnRBdHRyaWJ1dGVzKG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcCBhdHRycykKLQl7Ci0JICBpbnQgbGVuID0gKGF0dHJzICE9IG51bGwpID8gYXR0cnMuZ2V0TGVuZ3RoKCkgOiAwOwotCSAgb3JnLnczYy5kb20uQXR0ciBhcnJheVtdID0gbmV3IG9yZy53M2MuZG9tLkF0dHJbbGVuXTsKLQkgIGZvciAoIGludCBpID0gMDsgaSA8IGxlbjsgaSsrICl7Ci0JICAgYXJyYXlbaV0gPSAob3JnLnczYy5kb20uQXR0cilhdHRycy5pdGVtKGkpOwotCSAgfQotCSAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrICkgewotCSAgICBTdHJpbmcgbmFtZSAgPSBhcnJheVtpXS5nZXROb2RlTmFtZSgpOwotCSAgICBpbnQgaW5kZXggPSBpOwotCSAgICBmb3IgKCBpbnQgaiA9IGkgKyAxOyBqIDwgbGVuOyBqKysgKSB7Ci0JICAgICAgU3RyaW5nIGN1ck5hbWUgPSBhcnJheVtqXS5nZXROb2RlTmFtZSgpOwotCQkgIGlmICggY3VyTmFtZS5jb21wYXJlVG8obmFtZSkgPCAwICkgewotCQkgICAgbmFtZSAgPSBjdXJOYW1lOwotCQkJaW5kZXggPSBqOwotCQkgIH0KLQkJfQotCQlpZiAoIGluZGV4ICE9IGkgKSB7Ci0JCSAgb3JnLnczYy5kb20uQXR0ciB0ZW1wID0gYXJyYXlbaV07Ci0JCSAgYXJyYXlbaV0gPSBhcnJheVtpbmRleF07Ci0JCSAgYXJyYXlbaW5kZXhdID0gdGVtcDsKLQkJfQotCSAgfQotCSAgcmV0dXJuIChhcnJheSk7Ci0gICAgfQotIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvSnNwVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Kc3BVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmI5MDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Kc3BVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy51dGlsOwotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSnNwVXRpbHMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hcmt1cChTdHJpbmcgdGV4dCkgewotCQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLQkJCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsKLQkJCQlzd2l0Y2ggKGMpIHsKLQkJCQkJY2FzZSAnPCc6Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCImbHQ7Iik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnJic6Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCImYW1wOyIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJz4nOgotCQkJCQkJYnVmZmVyLmFwcGVuZCgiJmd0OyIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJyInOgotCQkJCQkJYnVmZmVyLmFwcGVuZCgiJnF1b3Q7Iik7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL1NvYXBFbGVtZW50SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4NTE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNvYXBFbGVtZW50SGVscGVyIHsKLS8qCi0gKiBUaGlzIGNsYXNzIGlzIGJlaW5nIGd1dHRlZCBmb3IgdGhlIG1vbWVudCwKLSAqIHVudGlsIGEgbWVhbnMgZm9yIGluY2x1ZGluZyBzYWFqLmphciBvciBhbgotICogZXF1aXZhbGVudCBrZWVwZXIgb2YgdGhlIGphdmF4LnhtbC5zb2FwIHBhY2thZ2UKLSAqIGNhbiBiZSBkZXRlcm1pbmVkLiBUaGUgZGlzYWJsaW5nIG9mIHRoaXMgY2xhc3MKLSAqIHdpbGwgb25seSBjYXVzZSBwcm9ibGVtcyBpZiBTYW1wbGUgSlNQcyBhcmUKLSAqIGdlbmVyYXRlZCBmb3IgV2ViIFNlcnZpY2UgcHJveGllcyB0aGF0IGhhdmUKLSAqIFNPQVBFbGVtZW50cyBvbiB0aGVpciBpbnRlcmZhY2VzLgotICogCi0gIHB1YmxpYyBzdGF0aWMgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQgY3JlYXRlU09BUEVsZW1lbnRGcm9tWE1MU3RyaW5nKFN0cmluZyB4bWxTdHJpbmcpIHRocm93cyBTb2FwRWxlbWVudFJ1bnRpbWVFeGNlcHRpb24KLSAgewotICAgIHRocm93IG5ldyBTb2FwRWxlbWVudFJ1bnRpbWVFeGNlcHRpb24oIlNvYXBFbGVtZW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNhbXBsZSBvbiB0aGUgY3VycmVudCBydW50aW1lLiBQbGVhc2UgdXNlIFdlYlNwaGVyZSB2NS4xIG9yIGhpZ2hlci4iKTsgICAgCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgc29hcEVsZW1lbnRXcml0ZXIoamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQgbm9kZSxqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgIGlmIChub2RlID09IG51bGwgKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIAotICAgICAgYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIjwiICsgbm9kZS5nZXRFbGVtZW50TmFtZSgpLmdldExvY2FsTmFtZSgpKSk7Ci0gICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgYXR0cnMgPSBub2RlLmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgIHdoaWxlKGF0dHJzLmhhc05leHQoKSkgewotICAgICAgICBqYXZheC54bWwuc29hcC5OYW1lIGF0dHIgPSAoamF2YXgueG1sLnNvYXAuTmFtZSlhdHRycy5uZXh0KCk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAiICsgYXR0ci5nZXRRdWFsaWZpZWROYW1lKCkgKyAiPVwiIiArIEpzcFV0aWxzLm1hcmt1cChub2RlLmdldEF0dHJpYnV0ZVZhbHVlKGF0dHIpKSArICJcIiIpOwotICAgICAgfQotICAgICAgYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIj4iKSk7Ci0gICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgIGlmICggY2hpbGRyZW4gIT0gbnVsbCApIHsKLSAgICAgICAgd2hpbGUoY2hpbGRyZW4uaGFzTmV4dCgpKXsKLSAgICAgICAgICBqYXZheC54bWwuc29hcC5Ob2RlIGNoaWxkTm9kZSA9IChqYXZheC54bWwuc29hcC5Ob2RlKWNoaWxkcmVuLm5leHQoKTsKLSAgICAgICAgICBpZihjaGlsZE5vZGUgaW5zdGFuY2VvZiBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCl7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8YnI+Iik7Ci0gICAgICAgICAgICBzb2FwRWxlbWVudFdyaXRlcigoamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQpY2hpbGROb2RlLGJ1ZmZlcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCgoamF2YXgueG1sLnNvYXAuVGV4dCljaGlsZE5vZGUpLmdldFZhbHVlKCkpKTsgCi0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIjwvIiArIG5vZGUuZ2V0RWxlbWVudE5hbWUoKS5nZXRMb2NhbE5hbWUoKSArICI+IikpOwotCSAgfQotICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLSovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRSdW50aW1lRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRSdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzVlZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL1NvYXBFbGVtZW50UnVudGltZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy51dGlsOwotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU29hcEVsZW1lbnRSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uICB7Ci0KLSAgLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNzYxNjkzMzcyNjc0NzQ4NDcxTDsKLQotcHVibGljIFNvYXBFbGVtZW50UnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSl7Ci0gICAgc3VwZXIobWVzc2FnZSk7Ci0gIH0KLSAgCi0gIAotICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMjM0NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOGUzNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZmU2NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIENyZWF0aW9uIEVKQiBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi0jCi0jIFdlYiBzZXJ2aWNlIHR5cGVzCi0jCi1XRUJTRVJWSUNFVFlQRV9OQU1FX0VKQl9UUD1FSkIgV2ViIFNlcnZpY2UKLVdFQlNFUlZJQ0VUWVBFX05BTUVfV1NETF9FSkJfVFA9U2tlbGV0b24gRUpCIFdlYiBTZXJ2aWNlCi0KLSMKLSMgUG9wLXVwIGFjdGlvbnMKLSMKLUFDVElPTl9ERVBMT1lfV0VCU0VSVklDRT1DcmVhdGUgV2ViIHNlcnZpY2UKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiNTA5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIj4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICA8L3JlcXVpcmVzPgotCi0gICA8IS0tIEVKQiBXZWIgU2VydmljZSBUeXBlcyAtLT4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUiPgotPCEtLQotICAgICAgPHdlYlNlcnZpY2VUeXBlCi0gICAgICAgICAgICBsYWJlbD0iJVdFQlNFUlZJQ0VUWVBFX05BTUVfV1NETF9FSkJfVFAiCi0gICAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YT0iRmlsZSBJUmVzb3VyY2UiCi0gICAgICAgICAgICBleHRlbnNpb25NZXRhZGF0YT0iLndzZGwiCi0gICAgICAgICAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5XU0RMU2VsZWN0aW9uV2lkZ2V0IgotICAgICAgICAgICAgaW5jbHVkZU5hdHVyZXM9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlTmF0dXJlcz0iIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLndzZGwuZWpiIj4KLSAgICAgIDwvd2ViU2VydmljZVR5cGU+Ci0tLT4KLSAgICAgIDx3ZWJTZXJ2aWNlVHlwZQotCQkgICAgbGFiZWw9IiVXRUJTRVJWSUNFVFlQRV9OQU1FX0VKQl9UUCIKLQkJICAgIHJlc291cmNlVHlwZU1ldGFkYXRhPSJFSkJPYmplY3Qgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuIFNlc3Npb25JbXBsIgotCQkgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyAuU2Vzc2lvbkltcGwiCi0JCSAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5FSkJTZWxlY3Rpb25XaWRnZXQiCi0JCSAgICBpbmNsdWRlTmF0dXJlcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZSIKLQkJICAgIGV4Y2x1ZGVOYXR1cmVzPSIiCi0JCSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUuZWpiIj4KLSAgCSA8L3dlYlNlcnZpY2VUeXBlPgotCi0JPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gUG9wdXBzIC0tPgotICAgICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLmphdmEiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fREVQTE9ZX1dFQlNFUlZJQ0UiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkuZWpiLnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWJiZGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotd3NzLXVpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0NTRlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3M8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODhlOTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2Uud3NzLXVpLmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHdzcy11aS5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZXhwb3J0X3dzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2V4cG9ydF93cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNDRlZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZXhwb3J0X3dzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2V4cG9ydF93c193aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZXhwb3J0X3dzX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZmNkNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZXhwb3J0X3dzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3X3dlYnNlcnZfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfd2Vic2Vydl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDczN2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfd2Vic2Vydl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDFmOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjQ3MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgQ3JlYXRpb24gR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTPVdlYiBTZXJ2aWNlcwotUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19TRVJWSUNFPVdlYiBTZXJ2aWNlCi1QTFVHSU5fRVhQT1JUX1dJWkFSRF9OQU1FX1dTPVdlYiBTZXJ2aWNlCi1QTFVHSU5fTkVXX1dJWkFSRF9ERVNDX1dTX1NFUlZJQ0U9Q3JlYXRlIGEgbmV3IFhNTCB3ZWIgc2VydmljZS4KLVBMVUdJTl9FWFBPUlRfV0laQVJEX0RFU0NfV1M9QSB3aXphcmQgZm9yIGV4cG9ydGluZyBhIHdlYiBzZXJ2aWNlLgotCi0jCi0jCVdlYiBTZXJ2aWNlcyBQcmVmZXJhbmNlIFBhZ2VzCi0jCi0jIERpYWxvZ3MKLUNIRUNLQk9YX1NIT1dfREVQTE9ZX1dFQl9TRVJWSUNFX0RJQUxPRz1IaWRlIENyZWF0ZSBXZWIgc2VydmljZSBEaWFsb2cKLUNIRUNLQk9YX1NIT1dfR0VORVJBVEVfU0tFTEVUT05fRElBTE9HPUhpZGUgR2VuZXJhdGUgSmF2YSBCZWFuIFNrZWxldG9uIERpYWxvZwotQ0hFQ0tCT1hfU0hPV19HRU5FUkFURV9XU0RMX0ZJTEVTX0RJQUxPRz1IaWRlIEdlbmVyYXRlIFdTREwgRmlsZXMgRGlhbG9nCi1DSEVDS0JPWF9TSE9XX1BVQkxJU0hfV1NETF9ESUFMT0c9SGlkZSBQdWJsaXNoIFdTREwgRGlhbG9nCi0KLVBSRUZFUkVOQ0VfQ0FURUdPUllfU0NFTkFSSU9fREVGQVVMVFM9U2NlbmFyaW8gRGVmYXVsdHMKLQotCi0jCi0jIFByZWZlcmVuY2VzIFRvb2x0aXBzCi0jCi0jQWN0aW9uIERpYWxvZ3MKLVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9ERVBMT1k9SGlkZXMgdGhlIGRpYWxvZyBmb3IgZGVwbG95aW5nIGEgV2ViIHNlcnZpY2UgYWN0aW9uCi1UT09MVElQX1BQQURfQ0hFQ0tCT1hfU0tFTEVUT049SGlkZXMgdGhlIGRpYWxvZyBmb3IgZ2VuZXJhdGluZyBKYXZhIGJlYW4gU2tlbGV0b24gYWN0aW9uCi1UT09MVElQX1BQQURfQ0hFQ0tCT1hfV1NETD1IaWRlcyB0aGUgZGlhbG9nIGZvciBnZW5lcmF0aW5nIFdTREwgZmlsZXMgYWN0aW9uCi1UT09MVElQX1BQQURfQ0hFQ0tCT1hfUFVCTElTSD1IaWRlcyB0aGUgZGlhbG9nIGZvciBwdWJsaXNoaW5nIHRoZSBXU0RMIGFjdGlvbgotCi0jCi0jIFBvcC11cCBhY3Rpb25zCi0jCi1BQ1RJT05fREVQTE9ZX1dFQlNFUlZJQ0U9Q3JlYXRlIFdlYiBzZXJ2aWNlCi1BQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTj1HZW5lcmF0ZSBKYXZhIGJlYW4gc2tlbGV0b24KLUFDVElPTl9QVUJMSVNIX1dTREw9UHVibGlzaCBXU0RMIGZpbGUKLQotIwotIyBXaXphcmRzLgotIwotV0laQVJEX1RJVExFX1dTUz1XZWIgU2VydmljZQotCi0KLSMKLSMgUG9wLXVwIGFjdGlvbnMKLSMKLUFDVElPTl9ERVBMT1lfV0VCU0VSVklDRT1DcmVhdGUgV2ViIHNlcnZpY2UKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjIzMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9Indzcy11aS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5leHBsb3JlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8IS0tIFdpemFyZHMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19TRVJWSUNFIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld193ZWJzZXJ2X3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVQTFVHSU5fTkVXX1dJWkFSRF9ERVNDX1dTX1NFUlZJQ0UKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzX3dpei5naWYiCi0gICAgICAgICAgICB0aXRsZT0iJVdJWkFSRF9USVRMRV9XU1MiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZy5TZXJ2ZXJXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX0VYUE9SVF9XSVpBUkRfTkFNRV9XUyIKLSAgICAgICAgICAgIGljb249Imljb25zL2V4cG9ydF93cy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZCIKLSAgICAgICAgICAgIGlkPSJ3c2V4cG9ydCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlUExVR0lOX0VYUE9SVF9XSVpBUkRfREVTQ19XUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvZXhwb3J0X3dzX3dpei5naWYiCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX0VYUE9SVF9XSVpBUkRfTkFNRV9XUyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkV4cG9ydFdTV2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIGlkPSJ3c2V4cG9ydCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9leHBvcnRfd3Nfd2l6LmdpZiIKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fRVhQT1JUX1dJWkFSRF9OQU1FX1dTIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuRXhwb3J0V1NXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQucHVibGlzaCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSAiRG9uJ3QgU2hvdyBNZSIgUHJlZmVyZW5jZXMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUiPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVDSEVDS0JPWF9TSE9XX0RFUExPWV9XRUJfU0VSVklDRV9ESUFMT0ciCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX0RFUExPWSIKLSAgICAgICAgICAgIGluZm9wb3A9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS5QUEFEMDAwNiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3NzLnBvcHVwLmNhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLmphdmEiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBuYW1lPSIlQ0hFQ0tCT1hfU0hPV19HRU5FUkFURV9TS0VMRVRPTl9ESUFMT0ciCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1NLRUxFVE9OIgotICAgICAgICAgICAgaW5mb3BvcD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLlBQQUQwMDA4IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuc2tlbGV0b24iPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBuYW1lPSIlQ0hFQ0tCT1hfU0hPV19QVUJMSVNIX1dTRExfRElBTE9HIgotICAgICAgICAgICAgdG9vbHRpcD0iJVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9QVUJMSVNIIgotICAgICAgICAgICAgaW5mb3BvcD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLlBQQUQwMDA5IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgIDwvYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGU+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIFBvcHVwcyAtLT4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLmphdmEiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuamF2YSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9ERVBMT1lfV0VCU0VSVklDRSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IiouamF2YSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzZGwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuc2tlbGV0b24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLnNrZWxldG9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfU0tFTEVUT04iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1NLRUxFVE9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuc2tlbGV0b24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluayIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuamF2YSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9ERVBMT1lfV0VCU0VSVklDRSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgIAotICAgICAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzaWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuc2tlbGV0b24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQucHVibGlzaCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9QVUJMSVNIX1dTREwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQucHVibGlzaCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSBQcmVmZXJlbmNlIFBhZ2VzIC0tPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX1NDRU5BUklPX0RFRkFVTFRTIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5wcmVmZXJlbmNlcy5TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnByZWZlcmVuY2VzLlNjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jcmVhdGlvbi91aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0YzQ3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBXU0RMIFRlc3QgRXJyb3JzCi0jCi1NU0dfRVJST1JfVU5BQkxFX1RPX0xBVU5DSF9XU0RMX1RFU1Q9SVdBQjAzNjFFIEFuIGVycm9yIG9jY3VycmVkLiBVbmFibGUgdG8gbGF1bmNoIFdTREwgdGVzdCBmYWNpbGl0eS4KLQotCi0jCi0jIFdpemFyZCBwYWdlcwotIwotUEFHRV9USVRMRV9PQkpFQ1RfU0VMRUNUSU9OPU9iamVjdCBTZWxlY3Rpb24gUGFnZQotUEFHRV9ERVNDX09CSkVDVF9TRUxFQ1RJT049T2JqZWN0IFNlbGVjdGlvbiBQYWdlCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjMzczOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBDcmVhdGlvbiBVSSBwbHVnaW4uCi0qIDxwPgotKiBUaGUgV2ViIFNlcnZpY2VzIENyZWF0aW9uIFVJIHBsdWdpbidzIHNvbGUgZnVuY3Rpb24gaXMgdG8gYWRkIAotKiB1c2VyIGludGVyZmFjZSBvZiB0aGUgV2ViIFNlcnZpY2VzIENyZWF0aW9uIFdpemFyZCwgY29udGFpbmVkIGluICAKLSogdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aSBwbHVnaW4uCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gIC8qKgotICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luIGluIHBsdWdpbi54bWwuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSI7Ci0KLSAgLyoqCi0gICogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotICAqLwotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbiBpbnN0YW5jZV87Ci0gIHByaXZhdGUgTG9nIGxvZ187Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIHJ1bnRpbWUgcGx1Z2luIG9iamVjdCBmb3IgdGhpcyBwbHVnaW4uCi0gICogVGhlICJwbHVnaW4iIGVsZW1lbnQgaW4gcGx1Z2luLnhtbCBzaG91bGQgaW5jbHVkZSB0aGUgYXR0cmlidXRlCi0gICogY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbiIuCi0gICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbiAoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBpbnN0YW5jZV8gPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgKiAoV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiKTsKLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbiBzaW5nbGV0b24uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4gZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHBsdWdpbi5wcm9wZXJ0aWVzLgotICAqIEByZXR1cm4gVGhlIFN0cmluZyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSApCi0gIHsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLnBsdWdpbiIsIGluc3RhbmNlXyApOwotICAgIAotICAgIGlmKCBrZXkuc3RhcnRzV2l0aCgiJSIpKQotICAgIHsKLSAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoIDEsIGtleS5sZW5ndGgoKSApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbXNnVXRpbHMuZ2V0TWVzc2FnZShrZXkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4gU3Vic3RpdHV0aW9uIHNlcXVlbmNlcyBpbiB0aGUgbWVzc2FnZSBzdHJpbmcKLSAgKiBhcmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbiBvYmplY3RzICh3aGljaAotICAqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSB0aGUgSkRLJ3MKLSAgKiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXR9Ci0gICogY2xhc3MgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHJldHVybiBUaGUgU3RyaW5nIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzICkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksYXJncyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZQotICAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAgKiBAcmV0dXJuIEFuIGltYWdlIGRlc2NyaXB0b3IsIHBvc3NpYmx5IG51bGwuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvciAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCBpbnN0YWxsVVJMID0gaW5zdGFuY2VfLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0gICAgICBVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsbmFtZSk7Ci0gICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3ByZWZlcmVuY2VzL1NjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9wcmVmZXJlbmNlcy9TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhYjRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3ByZWZlcmVuY2VzL1NjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSAKLXsKLQlwcml2YXRlIFNlcnZlcldpemFyZFdpZGdldCBzZXJ2ZXJXaWRnZXRfID0gbnVsbDsKLQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgIHsgfQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAKLQl7Ci0JICBVSVV0aWxzIHV0aWxzID0gbmV3IFVJVXRpbHMobnVsbCwgbnVsbCk7Ci0JICAKLQkgIENvbXBvc2l0ZSBwYWdlID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDEgKTsKLQkgIAotICAgICAgc2VydmVyV2lkZ2V0XyA9IG5ldyBTZXJ2ZXJXaXphcmRXaWRnZXQoIGZhbHNlICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLmFkZENvbnRyb2xzKCBwYWdlLCBuZXcgTGlzdGVuZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggRXZlbnQgZXZ0ICl7fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotCSAgaW5pdGlhbGl6ZVZhbHVlcygpOwotCSAgcmV0dXJuIHBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotCXsKLQkgIFNjZW5hcmlvQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpOwotCi0gICAgICAvLyBTZXQgdmFsdWVzIGZyb20gY29udGV4dC4KLQkgIFR5cGVSdW50aW1lU2VydmVyIHNlcnZlcklkcyA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzID0gbmV3IFR5cGVSdW50aW1lU2VydmVyKCk7Ci0JCQotCSAgc2VydmVySWRzLnNldFR5cGVJZCggY29udGV4dC5nZXRXZWJTZXJ2aWNlVHlwZSgpICk7Ci0JICBjbGllbnRJZHMuc2V0VHlwZUlkKCBjb250ZXh0LmdldENsaWVudFdlYlNlcnZpY2VUeXBlKCkgKTsKLQkJCi0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlciggc2VydmVySWRzICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBjbGllbnRJZHMgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0R2VuZXJhdGVQcm94eSggbmV3IEJvb2xlYW4oY29udGV4dC5nZXRHZW5lcmF0ZVByb3h5KCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFB1Ymxpc2hTZXJ2aWNlKCBuZXcgQm9vbGVhbihjb250ZXh0LmdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpKSApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRTdGFydFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0U3RhcnRXZWJTZXJ2aWNlKCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFRlc3RTZXJ2aWNlKCBuZXcgQm9vbGVhbihjb250ZXh0LmdldFRlc3RXZWJTZXJ2aWNlKCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldE1vbml0b3JTZXJ2aWNlKG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0TW9uaXRvcldlYlNlcnZpY2UoKSkpOwotICAgICAgc2VydmVyV2lkZ2V0Xy5pbnRlcm5hbGl6ZSgpOwotCX0KLQkKLSAgICAvKioKLQkgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLQl7Ci0JICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkgIHNldFRvRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFRvRGVmYXVsdHMoKQotCXsKLQkgIFNjZW5hcmlvQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpOwotCi0gICAgICAvLyBTZXQgdmFsdWVzIGZyb20gY29udGV4dC4KLQkgIFR5cGVSdW50aW1lU2VydmVyIHNlcnZlcklkcyA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzID0gbmV3IFR5cGVSdW50aW1lU2VydmVyKCk7Ci0JCQotCSAgc2VydmVySWRzLnNldFR5cGVJZCggY29udGV4dC5nZXRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKSApOwotCSAgY2xpZW50SWRzLnNldFR5cGVJZCggY29udGV4dC5nZXRDbGllbnRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKSApOwotCQkKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBzZXJ2ZXJJZHMgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIGNsaWVudElkcyApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRHZW5lcmF0ZVByb3h5KCBuZXcgQm9vbGVhbihjb250ZXh0LmdldEdlbmVyYXRlUHJveHlEZWZhdWx0KCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFB1Ymxpc2hTZXJ2aWNlKCBuZXcgQm9vbGVhbihjb250ZXh0LmdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlckRlZmF1bHQoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0U3RhcnRTZXJ2aWNlKCBuZXcgQm9vbGVhbihjb250ZXh0LmdldFN0YXJ0V2ViU2VydmljZURlZmF1bHQoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0VGVzdFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0VGVzdFdlYlNlcnZpY2VEZWZhdWx0KCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldE1vbml0b3JTZXJ2aWNlKG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0TW9uaXRvcldlYlNlcnZpY2VEZWZhdWx0KCkpKTsKLSAgICAgIHNlcnZlcldpZGdldF8uaW50ZXJuYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotCXsKLQkgIHN0b3JlVmFsdWVzKCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotCXsKLQkgIFNjZW5hcmlvQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpOwotCSAgCi0JICBUeXBlUnVudGltZVNlcnZlciBzZXJ2ZXJJZHMgPSBzZXJ2ZXJXaWRnZXRfLmdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpOwotCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzID0gc2VydmVyV2lkZ2V0Xy5nZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpOwotCSAgCi0gICAgICBjb250ZXh0LnNldFdlYlNlcnZpY2VUeXBlKCBzZXJ2ZXJJZHMuZ2V0VHlwZUlkKCkgKTsKLSAgICAgIGNvbnRleHQuc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoIGNsaWVudElkcy5nZXRUeXBlSWQoKSApOwotICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVByb3h5KCBzZXJ2ZXJXaWRnZXRfLmdldEdlbmVyYXRlUHJveHkoKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgY29udGV4dC5zZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoIHNlcnZlcldpZGdldF8uZ2V0UHVibGlzaFNlcnZpY2UoKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgY29udGV4dC5zZXRTdGFydFdlYlNlcnZpY2UoIHNlcnZlcldpZGdldF8uZ2V0U3RhcnRTZXJ2aWNlKCkuYm9vbGVhblZhbHVlKCkgKTsKLSAgICAgIGNvbnRleHQuc2V0VGVzdFdlYlNlcnZpY2UoIHNlcnZlcldpZGdldF8uZ2V0VGVzdFNlcnZpY2UoKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgY29udGV4dC5zZXRNb25pdG9yV2ViU2VydmljZShzZXJ2ZXJXaWRnZXRfLmdldE1vbml0b3JTZXJ2aWNlKCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotCXsKLQkgIHBlcmZvcm1PaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFmNGY3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvU2VydmVyV2l6YXJkV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLldlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuTGFiZWxzQW5kSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJXaXphcmRXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsgICAKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldCBjbGllbnRXaWRnZXRfOwotICBwcml2YXRlIFByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0IHByZWZlcmVuY2VzV2lkZ2V0XzsKLSAgcHJpdmF0ZSBMaXN0ZW5lciAgICAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lcl87Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgICAgICAgICAgaWRzXzsKLSAgcHJpdmF0ZSBMYWJlbHNBbmRJZHMgICAgICAgICAgICAgICBsYWJlbElkc187Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVByZWZlcmVuY2VzXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwMSBmb3IgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9QQUdFID0gIlBXUFIwMDAxIjsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwNSBmb3IgdGhlIEdlbmVyYXRlIFByb3h5IGNoZWNrIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0dFTkVSQVRFX1BST1hZID0gIlBXUFIwMDA1IjsKLSAgcHJpdmF0ZSBCdXR0b24gIGdlbmVyYXRlUHJveHlfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDEwIGZvciB0aGUgV2ViIFNlcnZpY2UgVHlwZSBjb21ibyBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DT01CT19UWVBFID0gIlBXUFIwMDEwIjsKLSAgcHJpdmF0ZSBDb21ibyAgd2Vic2VydmljZVR5cGVfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDExIGZvciB0aGUgV2l6YXJkIFNjZW5hcmlvIFNlcnZpY2UgZ3JvdXAgb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9HUk9VUF9TQ0VOQVJJT19TRVJWSUNFID0gIlBXUFIwMDExIjsKLSAgcHJpdmF0ZSBCdXR0b24gc3RhcnRTZXJ2aWNlXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwOSBmb3IgdGhlIFN0YXJ0IFdlYiBQcm9qZWN0IGNoZWNrIGJveCBjaGVjayBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9TVEFSVF9XRUJfUFJPSkVDVCA9ICJQV1BSMDAwOSI7Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdQUjAwMTMgZm9yIHRoZSB0ZXN0IHNlcnZpY2UgY2hlY2tib3ggb2YgdGhlIHByb2plY3QgcGFnZSovICAKLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX1RFU1RfU0VSVklDRSA9ICJQV1BSMDAxMyI7Ci0gIHByaXZhdGUgQnV0dG9uIHRlc3RTZXJ2aWNlXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAxNCBmb3IgdGhlIG1vbml0b3Igc2VydmljZSBjaGVja2JveCBvZiB0aGUgcHJvamVjIHBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfTU9OSVRPUl9TRVJWSUNFID0gIlBXUFIwMDE0IjsKLSAgcHJpdmF0ZSBCdXR0b24gbW9uaXRvclNlcnZpY2U7Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdQUjAwMTIgZm9yIHRoZSBMYXVuY2ggVURESSBjaGVjayBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9MQVVOQ0hfV1MgPSAiUFdQUjAwMTIiOwotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hVZGRpXzsKLSAgCi0gIHB1YmxpYyBTZXJ2ZXJXaXphcmRXaWRnZXQoIGJvb2xlYW4gZGlzcGxheVByZWZlcmVuY2VzICkKLSAgewotICAgIGRpc3BsYXlQcmVmZXJlbmNlc18gPSBkaXNwbGF5UHJlZmVyZW5jZXM7ICAKLSAgfQotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgU3RyaW5nICAgICAgIGNyZWF0ZVBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdXRpbHMgICAgPSBuZXcgVUlVdGlscyggbXNnVXRpbHMsIGNyZWF0ZVBsdWdpbklkICk7Ci0gICAgCi0gICAgc3RhdHVzTGlzdGVuZXJfID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgCi0gIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkICsgIi4iICsgIElORk9QT1BfUFdQUl9QQUdFICk7Ci0gIAkKLSAgCUNvbXBvc2l0ZSBzZXJ2ZXJDb21wb3NpdGUgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMSApOwotICAJCi0gIAlHcm91cCBzZXJ2aWNlR3JvdXAgPSB1dGlscy5jcmVhdGVHcm91cCggc2VydmVyQ29tcG9zaXRlLCAiR1JPVVBfU0NFTkFSSU9fU0VSVklDRSIsCi0gIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdQUl9HUk9VUF9TQ0VOQVJJT19TRVJWSUNFIiwgCi0gIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0dST1VQX1NDRU5BUklPX1NFUlZJQ0UsCi0JCQkJCQkJCQkJCTIsIDEwLCAxMCk7Ci0gIAkKLSAgCQotICAJLy8gQ3JlYXRlIHdlYnNlcnZpY2UgY29tYm8gYm94LgotICAgIHdlYnNlcnZpY2VUeXBlXyA9IHV0aWxzLmNyZWF0ZUNvbWJvKCBzZXJ2aWNlR3JvdXAsICJMQUJFTF9XRUJTRVJWSUNFVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ09NQk9fVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DT01CT19UWVBFLCAKLQkJCQkJCQkJCQkgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgd2Vic2VydmljZVR5cGVfLmFkZExpc3RlbmVyKCBTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lciApOwotICAgIAotICAgIENvbXBvc2l0ZSBidXR0b25zR3JvdXAgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUoIHNlcnZpY2VHcm91cCwgMSApOwotICAgIEdyaWREYXRhICBidXR0b25HcmlkICAgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBidXR0b25HcmlkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBidXR0b25zR3JvdXAuc2V0TGF5b3V0RGF0YSggYnV0dG9uR3JpZCApOwotICAgIAotICAgIC8vIENyZWF0ZSBzdGFydCBzZXJ2aWNlIGNoZWNrIGJveC4KLSAgICBzdGFydFNlcnZpY2VfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goIGJ1dHRvbnNHcm91cCwgIkJVVFRPTl9TVEFSVF9XRUJfUFJPSkVDVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1BSX0NIRUNLQk9YX1NUQVJUX1dFQl9QUk9KRUNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9TVEFSVF9XRUJfUFJPSkVDVCApOwotICAgIHN0YXJ0U2VydmljZV8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RhcnRQcmVzc2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgbGF1bmNoVWRkaV8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggYnV0dG9uc0dyb3VwLCAiQlVUVE9OX1dTX1BVQkxJU0giLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ0hFQ0tCT1hfTEFVTkNIX1dTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfTEFVTkNIX1dTICk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIHByb3h5Q29tcG9zaXRlID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBzZXJ2ZXJDb21wb3NpdGUsIDEsIDUsIDAgKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgZ2VuZXJhdGUgcHJveHkgY2hlY2sgYm94LgotICAgIGdlbmVyYXRlUHJveHlfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goIHByb3h5Q29tcG9zaXRlLCAiQlVUVE9OX0dFTkVSQVRFX1BST1hZIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1BSX0NIRUNLQk9YX0dFTkVSQVRFX1BST1hZIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfR0VORVJBVEVfUFJPWFkgKTsKLSAgICBnZW5lcmF0ZVByb3h5Xy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V2lkZ2V0Xy5lbmFibGVXaWRnZXQoIGdlbmVyYXRlUHJveHlfLmdldFNlbGVjdGlvbigpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICAvLyBDcmVhdGUgY2xpZW50IHNlbGVjdGlvbiB3aWRnZXQuCi0gICAgY2xpZW50V2lkZ2V0XyA9IG5ldyBXZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldCgpOwotICAgIGNsaWVudFdpZGdldF8uYWRkQ29udHJvbHMoIHNlcnZlckNvbXBvc2l0ZSwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICBDb21wb3NpdGUgdGVzdEdyb3VwID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKHNlcnZlckNvbXBvc2l0ZSwxKTsKLSAgICAKLSAgICAvLyAgQ3JlYXRlIHRlc3Qgc2VydmljZSBjaGVjayBib3guCi0gICAgdGVzdFNlcnZpY2VfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goIHRlc3RHcm91cCwgIkNIRUNLQk9YX1RFU1RfV0VCU0VSVklDRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ0hFQ0tCT1hfVEVTVF9TRVJWSUNFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX1RFU1RfU0VSVklDRSApOwotCi0gICAgbW9uaXRvclNlcnZpY2UgPSB1dGlscy5jcmVhdGVDaGVja2JveCggdGVzdEdyb3VwLCAiQ0hFQ0tCT1hfTU9OSVRPUl9XRUJTRVJWSUNFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdQUl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfTU9OSVRPUl9TRVJWSUNFICk7Ci0gICAgCi0gICAgaWYoIGRpc3BsYXlQcmVmZXJlbmNlc18gKQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSB0aGUgcHJlZmVyZW5jZXMgd2lkZ2V0cy4KLSAgICAgIHByZWZlcmVuY2VzV2lkZ2V0XyA9IG5ldyBQcmVmZXJlbmNlc1NlbGVjdGlvbldpZGdldCgpOwotICAgICAgcHJlZmVyZW5jZXNXaWRnZXRfLmFkZENvbnRyb2xzKCBzZXJ2ZXJDb21wb3NpdGUsIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVN0YXJ0UHJlc3NlZCgpCi0gIHsKLSAgICBib29sZWFuIGVuYWJsZWQgPSBzdGFydFNlcnZpY2VfLmdldFNlbGVjdGlvbigpOwotICAgIAotICAgIHRlc3RTZXJ2aWNlXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgbW9uaXRvclNlcnZpY2Uuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICBsYXVuY2hVZGRpXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgZ2VuZXJhdGVQcm94eV8uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgIGNsaWVudFdpZGdldF8uZW5hYmxlV2lkZ2V0KCBnZXRHZW5lcmF0ZVByb3h5KCkuYm9vbGVhblZhbHVlKCkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBjbGllbnRXaWRnZXRfLnNldFR5cGVSdW50aW1lU2VydmVyKCBpZHMgKTsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgcmVnaXN0cnkgICA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgTGFiZWxzQW5kSWRzICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxJZHMgICA9IHJlZ2lzdHJ5LmdldFNlcnZpY2VUeXBlTGFiZWxzKCk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICA9IDA7Ci0gICAgU3RyaW5nW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUlkcyA9IGxhYmVsSWRzLmdldElkc18oKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZElkID0gaWRzLmdldFR5cGVJZCgpOwotICAgIAotICAgIHdlYnNlcnZpY2VUeXBlXy5yZW1vdmVMaXN0ZW5lciggU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXJfICk7Ci0gICAgd2Vic2VydmljZVR5cGVfLnNldEl0ZW1zKCBsYWJlbElkcy5nZXRMYWJlbHNfKCkgKTsKLSAgICAgICAgCi0gICAgLy8gTm93IGZpbmQgdGhlIHNlbGVjdGVkIG9uZS4KLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgc2VydmljZUlkcy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGlmKCBzZWxlY3RlZElkLmVxdWFscyggc2VydmljZUlkc1tpbmRleCBdKSApCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9IGluZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgd2Vic2VydmljZVR5cGVfLnNlbGVjdCggc2VsZWN0aW9uICk7Ci0gICAgd2Vic2VydmljZVR5cGVfLmFkZExpc3RlbmVyKCBTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lcl8gKTsKLSAgICBpZHNfICAgICAgPSBpZHM7ICAKLSAgICBsYWJlbElkc18gPSBsYWJlbElkczsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSB3ZWJzZXJ2aWNlVHlwZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAKLSAgICBpZHNfLnNldFR5cGVJZCggbGFiZWxJZHNfLmdldElkc18oKVtzZWxlY3Rpb25JbmRleF0gKTsKLSAgICAKLSAgICByZXR1cm4gaWRzXzsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRTdGFydFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBzdGFydFNlcnZpY2VfLmdldFNlbGVjdGlvbigpICk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U3RhcnRTZXJ2aWNlKCBCb29sZWFuIHZhbHVlICkKLSAgewotICAgIHN0YXJ0U2VydmljZV8uc2V0U2VsZWN0aW9uKCB2YWx1ZS5ib29sZWFuVmFsdWUoKSApOwotICB9Ci0KLSAgcHVibGljIEJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCB0ZXN0U2VydmljZV8uZ2V0U2VsZWN0aW9uKCkgJiYgc3RhcnRTZXJ2aWNlXy5nZXRTZWxlY3Rpb24oKSApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZSggQm9vbGVhbiB2YWx1ZSApCi0gIHsKLSAgICB0ZXN0U2VydmljZV8uc2V0U2VsZWN0aW9uKCB2YWx1ZS5ib29sZWFuVmFsdWUoKSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldE1vbml0b3JTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbihtb25pdG9yU2VydmljZS5nZXRTZWxlY3Rpb24oKSAmJiBzdGFydFNlcnZpY2VfLmdldFNlbGVjdGlvbigpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoQm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIG1vbml0b3JTZXJ2aWNlLnNldFNlbGVjdGlvbih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgQm9vbGVhbiBnZXRQdWJsaXNoU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIGxhdW5jaFVkZGlfLmdldFNlbGVjdGlvbigpICYmIHN0YXJ0U2VydmljZV8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFNlcnZpY2UoIEJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgbGF1bmNoVWRkaV8uc2V0U2VsZWN0aW9uKCB2YWx1ZS5ib29sZWFuVmFsdWUoKSApOyAgCi0gIH0KLQotICBwdWJsaWMgQm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2VuZXJhdGVQcm94eV8uZ2V0U2VsZWN0aW9uKCkgJiYgc3RhcnRTZXJ2aWNlXy5nZXRTZWxlY3Rpb24oKSApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KCBCb29sZWFuIHZhbHVlICkKLSAgewotICAgIGdlbmVyYXRlUHJveHlfLnNldFNlbGVjdGlvbiggdmFsdWUuYm9vbGVhblZhbHVlKCkgKTsgIAotICB9Ci0KLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIHByZWZlcmVuY2VzV2lkZ2V0Xy5nZXRSZXNvdXJjZUNvbnRleHQoKTsgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCBjb250ZXh0ICkKLSAgewotICAgIHByZWZlcmVuY2VzV2lkZ2V0Xy5zZXRSZXNvdXJjZUNvbnRleHQoIGNvbnRleHQgKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkKLSAgewotICAgIGhhbmRsZVN0YXJ0UHJlc3NlZCgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIAotICAgIC8vIElmIHRoZSB3ZWJzZXJ2aWNlIGhhcyBub3QgYmVlbiBzZWxlY3RlZCB0aGVuIHVzZXIgY2FuIG5vdCBtb3ZlCi0gICAgLy8gZm9yd2FyZCB0byB0aGUgbmV4dCBwYWdlLgotICAgIGlmKCB3ZWJzZXJ2aWNlVHlwZV8uZ2V0VGV4dCgpLmVxdWFscygiIikgKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCAiIiwgU3RhdHVzLkVSUk9SICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTk4ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kCi17ICAgIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uXzsKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgCi0gICAgU3RyaW5nIHR5cGUgICAgICA9IGdldFNjZW5hcmlvQ29udGV4dCgpLmdldFdlYlNlcnZpY2VUeXBlKCk7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcnVudGltZSAgID0gcmVnaXN0cnkuZ2V0RGVmYXVsdFJ1bnRpbWVWYWx1ZUZvciggdHlwZSApOwotICAgIFN0cmluZyBzZXJ2ZXJJRCAgPSByZWdpc3RyeS5nZXREZWZhdWx0U2VydmVyVmFsdWVGb3IoIHR5cGUgKTsKLSAgICBTdHJpbmcgZmFjdG9yeUlEID0gcmVnaXN0cnkuZ2V0U2VydmVyRmFjdG9yeUlkRnJvbVNlcnZlcklkKCBzZXJ2ZXJJRCApOwotICAgICAgICAKLSAgICB0eXBlUnVudGltZVNlcnZlcl8gPSBuZXcgVHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLSAgICAKLSAgICB0eXBlUnVudGltZVNlcnZlcl8uc2V0VHlwZUlkKCB0eXBlICk7Ci0gICAgdHlwZVJ1bnRpbWVTZXJ2ZXJfLnNldFJ1bnRpbWVJZCggcnVudGltZSApOwotICAgIHR5cGVSdW50aW1lU2VydmVyXy5zZXRTZXJ2ZXJJZCggZmFjdG9yeUlEICk7Ci0gICAgCi0gICAgLy9EZWZhdWx0IHRoZSB0eXBlSWQgZnJvbSB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICBTdHJpbmdbXSB0eXBlSWRzID0gcmVnaXN0cnkuZ2V0V2ViU2VydmljZVR5cGVCeVNlbGVjdGlvbihpbml0aWFsU2VsZWN0aW9uXyk7Ci0gICAgaWYgKHR5cGVJZHMhPW51bGwgJiYgdHlwZUlkcy5sZW5ndGg+MCkKLSAgICB7Ci0gICAgICB0eXBlUnVudGltZVNlcnZlcl8uc2V0VHlwZUlkKHR5cGVJZHNbMF0pOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaW5pdGlhbFNlbGVjdGlvbl8gPSBzZWxlY3Rpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7IAotICAgIHJldHVybiB0eXBlUnVudGltZVNlcnZlcl87Ci0gIH0KLQotICBwdWJsaWMgQm9vbGVhbiBnZXRTdGFydFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRTdGFydFdlYlNlcnZpY2UoKSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldFB1Ymxpc2hTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkgKTsKLSAgfQotCi0gIHB1YmxpYyBCb29sZWFuIGdldEdlbmVyYXRlUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRHZW5lcmF0ZVByb3h5KCkgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRNb25pdG9yU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0TW9uaXRvcldlYlNlcnZpY2UoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0ZmQ5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQgZXh0ZW5kcyBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kCi17ICAgIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBzdGFydFNlcnZpY2VfOwotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgIHRlc3RTZXJ2aWNlXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBwdWJsaXNoU2VydmljZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgZ2VuZXJhdGVQcm94eV87Ci0gICAgCi0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkKLSAgeyAKLSAgICByZXR1cm4gdHlwZVJ1bnRpbWVTZXJ2ZXJfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBzdGFydFNlcnZpY2VfOyAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdFNlcnZpY2VfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gcHVibGlzaFNlcnZpY2VfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVQcm94eV87ICAKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBnZW5lcmF0ZVByb3h5XyBUaGUgZ2VuZXJhdGVQcm94eV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHlfKQotICB7Ci0gICAgdGhpcy5nZW5lcmF0ZVByb3h5XyA9IGdlbmVyYXRlUHJveHlfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcHVibGlzaFNlcnZpY2VfIFRoZSBwdWJsaXNoU2VydmljZV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFNlcnZpY2UoYm9vbGVhbiBwdWJsaXNoU2VydmljZV8pCi0gIHsKLSAgICB0aGlzLnB1Ymxpc2hTZXJ2aWNlXyA9IHB1Ymxpc2hTZXJ2aWNlXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHN0YXJ0U2VydmljZV8gVGhlIHN0YXJ0U2VydmljZV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhcnRTZXJ2aWNlKGJvb2xlYW4gc3RhcnRTZXJ2aWNlXykKLSAgewotICAgIHRoaXMuc3RhcnRTZXJ2aWNlXyA9IHN0YXJ0U2VydmljZV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB0ZXN0U2VydmljZV8gVGhlIHRlc3RTZXJ2aWNlXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZShib29sZWFuIHRlc3RTZXJ2aWNlXykKLSAgewotICAgIHRoaXMudGVzdFNlcnZpY2VfID0gdGVzdFNlcnZpY2VfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gdHlwZVJ1bnRpbWVTZXJ2ZXJfIFRoZSB0eXBlUnVudGltZVNlcnZlcl8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyXykKLSAgewotICAgIHRoaXMudHlwZVJ1bnRpbWVTZXJ2ZXJfID0gdHlwZVJ1bnRpbWVTZXJ2ZXJfOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvRXhwb3J0V1NXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9FeHBvcnRXU1dpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkM2U1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9FeHBvcnRXU1dpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5QdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5QdWJsaXNoV1NXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIEV4cG9ydFdTV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHByaXZhdGUgQ2FuRmluaXNoUmVnaXN0cnkgICBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5OwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeTsKLSAgcHJpdmF0ZSBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWc7Ci0KLSAgcHVibGljIEV4cG9ydFdTV2lkZ2V0QmluZGluZygpCi0gIHsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcgPSBuZXcgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQoKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFNlcXVlbmNlRnJhZ21lbnQgcm9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICAgICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoIldTRXhwb3J0IikpOwotICAgICAgICAgICAgICAgcm9vdC5hZGQocHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCgpLCAiIikpOwotICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Q7ICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuY2FuRmluaXNoUmVnaXN0cnkgPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJDYW5GaW5pc2godGhpcy5jYW5GaW5pc2hSZWdpc3RyeSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmRhdGFNYXBwaW5nUmVnaXN0cnkgPSBkYXRhUmVnaXN0cnk7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKHRoaXMuZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gICAgCi0gICAgLy8gUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiUHVibGlzaFRvUHJpdmF0ZVVEREkiLCBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gTGF1bmNoV2ViU2VydmljZXNFeHBsb3JlckNvbW1hbmQKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiRm9yY2VMYXVuY2hPdXRzaWRlSURFIiwgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkxhdW5jaE9wdGlvbnMiLCBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmNsYXNzKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkKLSAgewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICB0aGlzLndpZGdldFJlZ2lzdHJ5ID0gd2lkZ2V0UmVnaXN0cnk7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3ModGhpcy53aWRnZXRSZWdpc3RyeSk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIldTRXhwb3J0IiwgCi0gICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1BVQkxJU0giKSwKLSAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU19QVUJMSVNIIiksCi0gICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFB1Ymxpc2hXU1dpZGdldCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9QdWJsaXNoV1NETFdpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL1B1Ymxpc2hXU0RMV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmMzMDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL1B1Ymxpc2hXU0RMV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoV1NETFdpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwdWJsaWMgUHVibGlzaFdTRExXaWRnZXRCaW5kaW5nKCkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUZyYWdtZW50KCk7ICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKSwgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkKLSAgewotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvU2VydmVyV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvU2VydmVyV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZjMDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL1NlcnZlcldpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNvbXB1dGVFbmRwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb25pdG9yQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5NYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkNoZWNrRm9yTWlzc2luZ0ZpbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGEuU2VydmVySW5zdFRvSVNlcnZlclRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uRmluaXNoRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHVibGlzaFdTV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5DbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdFdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaERlZmF1bHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoSmF2YVRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LlRlc3REZWZhdWx0aW5nRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XU0RMVGVzdExhdW5jaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5TZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5TZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5ydW50aW1lLlNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0LkxhdW5jaEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3QuU2VydmljZVRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0LlNlcnZpY2VUZXN0V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIFNlcnZlcldpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnlfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnlfOwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeV87Ci0gIHByaXZhdGUgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnOwotCi0gIHB1YmxpYyBTZXJ2ZXJXaWRnZXRCaW5kaW5nKCkKLSAgewotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZyA9IG5ldyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VSb290Q29tbWFuZEZyYWdtZW50KCk7ICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlckNhbkZpbmlzaChjYW5GaW5pc2hSZWdpc3RyeV8pOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKSwgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyA9IGRhdGFSZWdpc3RyeTsKLSAgICAKLSAgICAvLyBCZWZvcmUgU2VydmVyV2l6YXJkV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU3RhcnRTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIk1vbml0b3JTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIk1vbml0b3JTZXJ2aWNlIiwgQ3JlYXRlTW9uaXRvckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlB1Ymxpc2hTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICAKLSAgICAvLyBBZnRlciBTZXJ2ZXJXaXphcmRXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiU3RhcnRTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIENyZWF0ZU1vbml0b3JDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIENvbXB1dGVFbmRwb2ludENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlB1Ymxpc2hTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQmVmb3JlIE9iamVjdFNlbGVjdGlvbldpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQmVmb3JlIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QyRUFSUHJvamVjdCIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VKMkVFVmVyc2lvbiIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZU5lZWRFQVIiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgICAgICAgICAKLSAgICAvLyBBZnRlciBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0ICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlNlcnZpY2VKMkVFVmVyc2lvbiIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlNlcnZpY2VOZWVkRUFSIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIAotCi0gICAgLy8gTWFwIGZyYWdtZW50cyB0aGF0IGRlcGVuZCBvbiBkYXRhLiAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQuY2xhc3MpOwotICAgIAotICAgIC8vIENyZWF0ZU1vbml0b3JDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ3JlYXRlTW9uaXRvckNvbW1hbmQuY2xhc3MsICJNb25pdG9yZWRQb3J0IiwgQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQ29tcHV0ZUVuZHBvaW50Q29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbXB1dGVFbmRwb2ludENvbW1hbmQuY2xhc3MsICJFbmRwb2ludCIsIFNlcnZpY2VUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzLCAiRW5kcG9pbnQiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLQotICAgIC8vU2VydmljZVRlc3RXaWRnZXQgbWFwcGluZ3MgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgU2VydmljZVRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgQ3JlYXRlTW9uaXRvckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgU2VydmljZVRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUZXN0RmFjaWxpdGllcyIsIFNlcnZpY2VUZXN0V2lkZ2V0LmNsYXNzKTsgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgU2VydmljZVRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VUZXN0V2lkZ2V0LmNsYXNzLCAiTGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZVRlc3RXaWRnZXQuY2xhc3MsICJMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSIsIEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZVRlc3RXaWRnZXQuY2xhc3MsICJMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSIsIFRlc3REZWZhdWx0aW5nRnJhZ21lbnQuY2xhc3MpOwotICAgIAotICAgIC8vIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJveHlQcm9qZWN0RUFSIiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RUeXBlIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0VHlwZUlkIiwgbnVsbCk7ICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiU2VydmVyRmFjdG9yeUlkIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiSjJFRVZlcnNpb24iLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RJZCIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCAiQWRkZWRQcm9qZWN0VG9TZXJ2ZXIiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQmVmb3JlIENsaWVudCBUZXN0IHdpZGdldC4KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICAKLSAgICAvLyBCZWZvcmUgQ2xpZW50VGVzdFdpZGdldAotICAgICAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUnVuQ2xpZW50VGVzdCIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIk1ldGhvZHMiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIAotICAgIC8vIEFmdGVyIENsaWVudFRlc3RXaWRnZXQgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJKc3BGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiTWV0aG9kcyIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RTZXJ2aWNlIixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJUZXN0SUQiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIklzVGVzdFdpZGdldCIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAvLyBQdWJsaXNoV1NXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlB1Ymxpc2hTZXJ2aWNlIiwgUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiUHVibGlzaFRvUHVibGljVURESSIsIG51bGwpOwotICAgIAotICAgIC8vIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiUHVibGlzaFRvUHJpdmF0ZVVEREkiLCBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gTGF1bmNoV2ViU2VydmljZXNFeHBsb3JlckNvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9Qcml2YXRlVURESSIsIExhdW5jaEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9QdWJsaWNVRERJIiwgTGF1bmNoRnJhZ21lbnQuY2xhc3MpOwotICAgIC8vIFRPRE8gTmVlZCBkZWZhdWx0cyBmb3IgdGhlc2UgcHJvcGVydGllcy4KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJGb3JjZUxhdW5jaE91dHNpZGVJREUiLCBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJMYXVuY2hPcHRpb25zIiwgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZC5jbGFzcyk7Ci0gIAotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5XyA9IHdpZGdldFJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5Xyk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJTZXJ2ZXJXaXphcmRXaWRnZXQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfUFJPSkVDVCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX1BST0pFQ1QiKSwKLQkJCQkgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotCQkJCSAgICAgICAgewotCQkJCSAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJCQkgICAgICAgICAgewotCQkJCSAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyV2l6YXJkV2lkZ2V0KCB0cnVlICk7Ci0JCQkJICAgICAgICAgIH0KLQkJCQkgICAgICAgIH0gKTsKLQotICAgIE1lc3NhZ2VVdGlscyBjcmVhdGlvblVJTWVzc2FnZVV0aWxzID0gbmV3IE1lc3NhZ2VVdGlscygib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLnBsdWdpbiIsIHRoaXMpOwotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIk9iamVjdFNlbGVjdGlvbldpZGdldCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25VSU1lc3NhZ2VVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX09CSkVDVF9TRUxFQ1RJT04iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uVUlNZXNzYWdlVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX09CSkVDVF9TRUxFQ1RJT04iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19SVU5USU1FX1NFTEVDVElPTiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX1JVTlRJTUVfU0VMRUNUSU9OIiksCi0JCQkJCQluZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkJCQkJCSAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JCQkJCQkgIHsKLQkJCQkJCSAgICByZXR1cm4gbmV3IFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQoKTsKLQkJCQkJCSAgfQotCQkJCQkJfSApOyAKLSAgICAKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJUZXN0U2VydmljZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU1RFU1QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU1RFU1QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmljZVRlc3RXaWRnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkNsaWVudFRlc3RXaWRnZXQiLCAKLSAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfU0FNUExFIiksCi0gICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfU0FNUExFIiksCi0gICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudFRlc3RXaWRnZXQoKTsgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIlB1Ymxpc2giLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfUFVCTElTSCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX1BVQkxJU0giKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHVibGlzaFdTV2lkZ2V0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSBjbGFzcyBJbml0UmVnaXN0cmllcyBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLSAgeyAgCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IGNsaWVudFJlZ2lzdHJ5XyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHNlcnZlclJlZ2lzdHJ5XyA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgCi0gICAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLSAgICB7Ci0gICAgICBjbGllbnRSZWdpc3RyeV8uc2V0RGF0YU1hcHBpbmdSZWdpc3RyeSggZGF0YU1hcHBpbmdSZWdpc3RyeV8gKTsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXRXaWRnZXRSZWdpc3RyeSggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgICBjbGllbnRSZWdpc3RyeV8uc2V0Q2FuRmluaXNoUmVnaXN0cnkoIGNhbkZpbmlzaFJlZ2lzdHJ5XyApOwotICAgICAgCi0gICAgICBzZXJ2ZXJSZWdpc3RyeV8uc2V0RGF0YU1hcHBpbmdSZWdpc3RyeSggZGF0YU1hcHBpbmdSZWdpc3RyeV8gKTsKLSAgICAgIHNlcnZlclJlZ2lzdHJ5Xy5zZXRXaWRnZXRSZWdpc3RyeSggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgICBzZXJ2ZXJSZWdpc3RyeV8uc2V0Q2FuRmluaXNoUmVnaXN0cnkoIGNhbkZpbmlzaFJlZ2lzdHJ5XyApOwotICAgICAgCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgQ2xpZW50RnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLSAgewotICAgIGJvb2xlYW4gZ2VuUHJveHlfID0gZmFsc2U7Ci0gICAgCi0gICAgcHVibGljIENsaWVudEZyYWdtZW50KCkKLSAgICB7ICAgICAgCi0gICAgICBzZXRDb25kaXRpb24oIG5ldyBDb25kaXRpb24oKSAKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuUHJveHlfOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAKLSAgICAgIFNlcXVlbmNlRnJhZ21lbnQgY2xpZW50Um9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICAKLSAgICAgIGNsaWVudFJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCggZmFsc2UgKSwgIiIpKTsKLSAgICAgIGNsaWVudFJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQoKSwgIiIpKTsgLy9Ob3RlOiBhZGRlZCBoZXJlIGZvciBjbGllbnQKLSAgICAgIGNsaWVudFJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZCgpLCAiIikpOyAgICAgIAotICAgICAgY2xpZW50Um9vdC5hZGQoIG5ldyBDbGllbnRFeHRlbnNpb25GcmFnbWVudCgpICk7Ci0gICAgICBjbGllbnRSb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIAotICAgICAgc2V0VHJ1ZUZyYWdtZW50KCBjbGllbnRSb290ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIGJvb2xlYW4gZ2VuUHJveHkgKQotICAgIHsKLSAgICAgIGdlblByb3h5XyA9IGdlblByb3h5OwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICAgIHsKLSAgICAgIC8vIE1hcCB0aGUgb3V0cHV0IG9mIHRoZSBzZXJ2aWNlIHNjZW5hcmlvIHRvIHRoZSBjbGllbnQgc2NlbmFyaW8uCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgU2VydmljZVJvb3RDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci0gIHsKLSAgICBwdWJsaWMgU2VydmljZVJvb3RDb21tYW5kRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2hlY2tGb3JNaXNzaW5nRmlsZXMoKSwgIiIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBJbml0UmVnaXN0cmllcygpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggIlNlcnZlcldpemFyZFdpZGdldCIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kKCksICIiICkpOwotICAgICAgYWRkKCBuZXcgT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQoKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldCIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kKCksICIiKSk7IC8vTm90ZTogYWRkZWQgaGVyZSAgICAgICAgICAgIAotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNlcnZlckV4dGVuc2lvbkZyYWdtZW50KCkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENyZWF0ZU1vbml0b3JDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDb21wdXRlRW5kcG9pbnRDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTZXJ2aWNlVGVzdEZyYWdtZW50KCAiVGVzdFNlcnZpY2UiKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFRlc3REZWZhdWx0aW5nRnJhZ21lbnQoKSwiIikpOwotICAgICAgYWRkKCBuZXcgQ2xpZW50RnJhZ21lbnQoKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQobmV3IE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kKCksIiIpKTsKLSAgICAgIGFkZCggbmV3IENsaWVudFRlc3RGcmFnbWVudCggIkNsaWVudFRlc3RXaWRnZXQiKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJQdWJsaXNoIikgKTsKLSAgICAgIGFkZChwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcpOwotICAgICAgYWRkKG5ldyBMYXVuY2hGcmFnbWVudCgpKTsKLSAgICAgIGFkZChuZXcgRmluaXNoRnJhZ21lbnQoKSk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gICAgewotICAgICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKGRhdGFNYXBwaW5nUmVnaXN0cnlfKTsgICAKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotCi0gICAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotICAgICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEluaXRpYWxTZWxlY3Rpb24iLCBudWxsKTsKLQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRJbml0aWFsU2VsZWN0aW9uIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluaXRpYWxQcm9qZWN0IiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEluaXRpYWxQcm9qZWN0IiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgICAgCi0gICAgICAvLyBNYXAgU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQdWJsaXNoU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBPYmplY3RTZWxlY3Rpb25GcmFnbWVudC5jbGFzcywgIlR5cGVSdW50aW1lU2VydmVyIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiU3RhcnRTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlB1Ymxpc2hTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlB1Ymxpc2hTZXJ2aWNlIiwgUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiUHVibGlzaFRvUHVibGljVURESSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy90byB0aGUgdGVzdCB3aXphcmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgU2VydmljZVRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFdTRExUZXN0TGF1bmNoQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBXU0RMVGVzdExhdW5jaENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAKLSAgICAgIAotICAgICAgLy8gTWFwIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0IiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VKMkVFVmVyc2lvbiIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlTmVlZEVBUiIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIAotICAgICAgLy8gTWFwIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlckV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBTZXJ2aWNlVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHVibGlzaCIsIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmNsYXNzKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIixXU0RMVGVzdExhdW5jaENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdE5hbWUiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdEVBUiIsIENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5jbGFzcywgIkVhclByb2plY3ROYW1lIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclNlcnZlciIsIENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5jbGFzcywiU2VydmVyRmFjdG9yeUlkIixudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZUoyRUVWZXJzaW9uIiwgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzLCAiSjJFRVZlcnNpb24iLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJTZXJ2aWNlTmVlZEVBUiIsQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzLCJOZWVkRUFSIixudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJJc1NlcnZpY2VQcm9qZWN0RUpCIixDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gCi0gICAgICAvLyBNYXAgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRFeHRlbnNpb25GcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkNsaWVudElkcyIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRUZXN0RnJhZ21lbnQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkxhdW5jaGVkU2VydmljZVRlc3ROYW1lIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RFQVIiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSjJlZVZlcnNpb24iLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVyIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBGaW5pc2hKYXZhVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIAotICAgICAgLy9TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU3RhcnRTZXJ2aWNlIiwgU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkIiwgU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmNsYXNzLCJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIiLCBuZXcgU2VydmVySW5zdFRvSVNlcnZlclRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJTZXJ2ZXIiLCBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsIlNlcnZpY2VTZXJ2ZXJUeXBlSUQiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiU2VydmljZUV4aXN0aW5nU2VydmVySW5zdGFuY2VJZCIsbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlckluc3RJZCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJDbGllbnRFeGlzdGluZ1NlcnZlckluc3RhbmNlSWQiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RJZCIsIENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5jbGFzcywiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmNsYXNzLCAiQWRkZWRQcm9qZWN0VG9TZXJ2ZXIiLCBDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmNsYXNzLCAiU2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkIiwgQ3JlYXRlTW9uaXRvckNvbW1hbmQuY2xhc3MsICJTZXJ2aWNlU2VydmVySW5zdGFuY2VJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQiLCBGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVySWQiLCBudWxsKTsKLQotICAgICAgLy8gTWFwIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQgZm9yIFNlcnZlclN0YXJ0KCkKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdEVBUiIsIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJFYXJQcm9qZWN0TmFtZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmNsYXNzLCAiU2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgICAgICAgIAotICAgICAgLy8gTWFwIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb3h5UHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RFQVIiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb3h5UHJvamVjdEVBUiIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlckluc3RhbmNlIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJFeGlzdGluZ1NlcnZlciIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlNlcnZlckZhY3RvcnlJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiSjJFRVZlcnNpb24iLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50TmVlZEVBUiIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiTmVlZEVBUiIsIG51bGwpOwotICAgICAgICAKLSAgICAgIC8vU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kIGZvciBjbGllbnQgc2lkZQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVySW5zdGFuY2UiLCBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywiU2FtcGxlRXhpc3RpbmdTZXJ2ZXIiLCBuZXcgU2VydmVySW5zdFRvSVNlcnZlclRyYW5zZm9ybWVyKCkpOwotCi0gICAgICAvLyBNQVAgcG9zdCBzZXJ2ZXIgY29uZmlnIGNhbGwKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJFYXJQcm9qZWN0TmFtZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXJJbnN0YW5jZSIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlNldEVuZHBvaW50TWV0aG9kIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIklzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQiLCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyU2VydmVyIiwgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuY2xhc3MsIlNlcnZpY2VTZXJ2ZXJUeXBlSWQiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RJZCIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzLCJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIiLCBuZXcgU2VydmVySW5zdFRvSVNlcnZlclRyYW5zZm9ybWVyKCkpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXJJbnN0YW5jZSIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzLCJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIoKSk7ICAgICAgCi0gICAgICAKLSAgICAgIC8vIE1hcCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUnVuQ2xpZW50VGVzdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiTWV0aG9kcyIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7ICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOyAgICAgCi0gICAgCi0gICAgICAvL01hcCBGaW5pc2ggQ29tbWFuZCAKLSAgICAgIAotICAgICAgCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvcnVudGltZS9TZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvcnVudGltZS9TZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTVmOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMucnVudGltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlZhbGlkYXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lLkNsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5Qcm9qZWN0U2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuUnVudGltZVNlcnZlclNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotLyoKLSAqCi0gKiBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0Ci0gKiBUaGlzIHdpZGdldCBpcyB0aGUgcGFyZW50IHdpZGdldCBmb3Igc2VydmVyIGFuZCBjbGllbnQgZGVwbG95bWVudC9lbnZpcm9ubWVudCBzZXR0aW5ncyAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSI7Ci0gIAotICAvKiBDT05URVhUX0lEIFBXUlMwMDAyIGZvciB0aGUgV2l6YXJkIFNjZW5hcmlvIFNlcnZpY2UgY29uZmlndXJhdGlvbiBvZiB0aGUgUnVudGltZSBTZWxlY3Rpb24gUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfR1JPVVBfU0VSVklDRSA9ICAiUFdSUzAwMDIiOwotICAKLSAgcHJpdmF0ZSBSdW50aW1lU2VydmVyU2VsZWN0aW9uV2lkZ2V0IHJ1bnRpbWVXaWRnZXRfOwotICBwcml2YXRlIFByb2plY3RTZWxlY3Rpb25XaWRnZXQgICAgICAgcHJvamVjdFdpZGdldF87Ci0gIHByaXZhdGUgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldCBjbGllbnRXaWRnZXRfOwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzICAgICAgICAgc2VydmljZUNob2ljZXNfOwotICBwcml2YXRlIFRleHRNb2RpZnlMaXN0ZW5lciAgICAgICAgICAgdGV4dExpc3RlbmVyXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50V2lkZ2V0VmlzaWJsZV8gPSB0cnVlOwotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzXywgY3JlYXRlUGx1Z2luSWRfICk7IAotICAgIAotICAgIENvbXBvc2l0ZSByb290ID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMSApOwotICAgIAotICAgIFRleHQgbWVzc2FnZVRleHQgPSBuZXcgVGV4dCggcm9vdCwgU1dULldSQVAgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgCi0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsgCi0gICAgZ2QuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotICAgIAotICAgIG1lc3NhZ2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotICAgIG1lc3NhZ2VUZXh0LnNldFRleHQoCi0gICAgICAgIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfR0VORVJBTF9QUk9KRUNUX0FORF9FQVIiLCBuZXcgU3RyaW5nW10geyBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1NFUlZJQ0VfU1VCIil9KQotICAgICAgICArICJcbiIKLSAgICAgICAgKyBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VBUl9QUk9KRUNUX1dJTExfQkVfQ1JFQVRFRCIpKTsKLSAgICAKLSAgICBDb21wb3NpdGUgc2VydmVyQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCByb290LCAxLCA1LCAwICk7Ci0gICAgCi0gICAgR3JvdXAgc2VydmVyR3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUdyb3VwKCBzZXJ2ZXJDb21wLCAiTEFCRUxfU0VMRUNUSU9OX1ZJRVdfVElUTEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgSU5GT1BPUF9QV1JTX0dST1VQX1NFUlZJQ0UsCi0JCQkJCQkJCQkJCSAyLCA1LCA1KTsKLSAgICAKLSAgICBydW50aW1lV2lkZ2V0XyA9IG5ldyBSdW50aW1lU2VydmVyU2VsZWN0aW9uV2lkZ2V0KCBmYWxzZSApOwotICAgIHJ1bnRpbWVXaWRnZXRfLmFkZENvbnRyb2xzKCBzZXJ2ZXJHcm91cCwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICB0ZXh0TGlzdGVuZXJfID0gbmV3IFRleHRNb2RpZnlMaXN0ZW5lcigpOwotICAgIHJ1bnRpbWVXaWRnZXRfLmFkZE1vZGlmeUxpc3RlbmVyKCB0ZXh0TGlzdGVuZXJfICk7Ci0gICAgICAgICAgICAgCi0gICAgcHJvamVjdFdpZGdldF8gPSBuZXcgUHJvamVjdFNlbGVjdGlvbldpZGdldCgpOwotICAgIHByb2plY3RXaWRnZXRfLmFkZENvbnRyb2xzKCBzZXJ2ZXJHcm91cCwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICBjbGllbnRXaWRnZXRfID0gbmV3IENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQoKTsKLSAgICBjbGllbnRXaWRnZXRfLmFkZENvbnRyb2xzKCByb290LCBzdGF0dXNMaXN0ZW5lciApOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIC8vSWYgZ2VuZXJhdGUgcHJveHkgaXMgbm90IHNlbGVjdGVkLCBkb24ndCBzaG93IHRoZSBjbGllbnQgcG9ydGlvbiBvZiB0aGUgcGFnZS4KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eSggQm9vbGVhbiB2YWx1ZSApCi0gIHsKLSAgICBjbGllbnRXaWRnZXRfLnNldFZpc2libGUoIHZhbHVlLmJvb2xlYW5WYWx1ZSgpICk7IAotICAgIGlzQ2xpZW50V2lkZ2V0VmlzaWJsZV8gPSB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gcnVudGltZVdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKTsgIAotICB9Ci0gICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgcnVudGltZVdpZGdldF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoIHRleHRMaXN0ZW5lcl8gKTsKLSAgICBydW50aW1lV2lkZ2V0Xy5zZXRUeXBlUnVudGltZVNlcnZlciggaWRzICk7ICAKLSAgICBwcm9qZWN0V2lkZ2V0Xy5zZXRUeXBlUnVudGltZVNlcnZlcihpZHMpOwotICAgIHJ1bnRpbWVXaWRnZXRfLmFkZE1vZGlmeUxpc3RlbmVyKCB0ZXh0TGlzdGVuZXJfICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpOyAgCi0gIH0KLSAgIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewotICAgIGNsaWVudFdpZGdldF8uc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIGlkcyApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0V2lkZ2V0Xy5nZXRQcm9qZWN0Q2hvaWNlcygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KFNlbGVjdGlvbkxpc3RDaG9pY2VzIHNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QpCi0gIHsKLSAgICBwcm9qZWN0V2lkZ2V0Xy5zZXRQcm9qZWN0Q2hvaWNlcyhzZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KTsKLSAgfQotICAKLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0UnVudGltZTJDbGllbnRUeXBlcygpOwotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWUyQ2xpZW50VHlwZXMoU2VsZWN0aW9uTGlzdENob2ljZXMgcnVudGltZTJDbGllbnRUeXBlcykKLSAgewotICAgIGNsaWVudFdpZGdldF8uc2V0UnVudGltZTJDbGllbnRUeXBlcyhydW50aW1lMkNsaWVudFR5cGVzKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSjJFRVZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIHJ1bnRpbWVXaWRnZXRfLmdldEoyRUVWZXJzaW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgICBydW50aW1lV2lkZ2V0Xy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbik7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEoyRUVWZXJzaW9uKCkKLSAgewotICAgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldEoyRUVWZXJzaW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAgIGNsaWVudFdpZGdldF8uc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRTZXJ2aWNlTmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gcHJvamVjdFdpZGdldF8uZ2V0TmVlZEVBUigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmVlZEVBUihib29sZWFuIGIpCi0gIHsKLSAgICBwcm9qZWN0V2lkZ2V0Xy5zZXROZWVkRUFSKGIpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnROZWVkRUFSKCkKLSAgewotICAgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldENsaWVudE5lZWRFQVIoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50TmVlZEVBUihib29sZWFuIGIpCi0gIHsKLSAgICBjbGllbnRXaWRnZXRfLnNldENsaWVudE5lZWRFQVIoYik7Ci0gIH0gIAotICAKLSAgcHJpdmF0ZSBjbGFzcyBUZXh0TW9kaWZ5TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciAKLSAgewotICAJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICAJewotCQlpZiggY2xpZW50V2lkZ2V0Xy5pc1Zpc2libGUoKSApCi0gIAkJeyAgCSAgCi0JCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmljZUlkcyA9IHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCk7Ci0gIAkJICBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHMgID0gY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpOwotICAJCQotICAJCSAgY2xpZW50SWRzLnNldFJ1bnRpbWVJZCggc2VydmljZUlkcy5nZXRSdW50aW1lSWQoKSApOwotICAJCSAgY2xpZW50SWRzLnNldFNlcnZlcklkKCBzZXJ2aWNlSWRzLmdldFNlcnZlcklkKCkgKTsKLSAgCQkgIGNsaWVudElkcy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKCBzZXJ2aWNlSWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSApOwotCi0gIAkJICBjbGllbnRXaWRnZXRfLnNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBjbGllbnRJZHMgKTsKLSAgCQkgIGNsaWVudFdpZGdldF8uc2V0SjJFRVZlcnNpb24ocnVudGltZVdpZGdldF8uZ2V0SjJFRVZlcnNpb24oKSk7ICAJCi0gIAkJfQotCQkKLQkJLy9TZXQgdGhlIGN1cnJlbnQgc2VydmVyIHNlbGVjdGlvbiBhbmQgSjJFRSBsZXZlbCBvbiB0aGUgUHJvamVjdFNlbGVjdGlvbldpZGdldAotCQlwcm9qZWN0V2lkZ2V0Xy5zZXRUeXBlUnVudGltZVNlcnZlcihydW50aW1lV2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpKTsKLQkJcHJvamVjdFdpZGdldF8uc2V0SjJFRVZlcnNpb24ocnVudGltZVdpZGdldF8uZ2V0SjJFRVZlcnNpb24oKSk7Ci0gIAl9Ci0gIH0KLSAKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNnZXRTdGF0dXMoKQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSAKLSAgewotICAgIFN0YXR1cyBzZXJ2aWNlU3RhdHVzID0gcnVudGltZVdpZGdldF8uZ2V0U3RhdHVzKCk7Ci0gICAgU3RhdHVzIHByb2plY3RTdGF0dXMgPSBwcm9qZWN0V2lkZ2V0Xy5nZXRTdGF0dXMoKTsKLSAgICBTdGF0dXMgY2xpZW50U3RhdHVzICA9IGNsaWVudFdpZGdldF8uZ2V0U3RhdHVzKCk7ICAgIAotICAgIFN0YXR1cyBmaW5hbFN0YXR1cyAgID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICAKLSAgICAvLyBjYWxsIGNoaWxkIHdpZGdldHMnIGdldFN0YXR1cygpCi0gICAgaWYoIHNlcnZpY2VTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAgIHsKLSAgICAgIGZpbmFsU3RhdHVzID0gc2VydmljZVN0YXR1czsKLSAgICB9Ci0gICAgZWxzZSBpZiggY2xpZW50U3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgICB7Ci0gICAgICBpZiAoaXNDbGllbnRXaWRnZXRWaXNpYmxlXykKLSAgICAgICAgZmluYWxTdGF0dXMgPSBjbGllbnRTdGF0dXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBwcm9qZWN0U3RhdHVzLmdldFNldmVyaXR5KCk9PSBTdGF0dXMuRVJST1IpIHsKLSAgICAgIGZpbmFsU3RhdHVzID0gcHJvamVjdFN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgLy9WYWxpZGF0ZSBzZXJ2aWNlIHNpZGUgc2VydmVyIHRhcmdldCBhbmQgSjJFRSBsZXZlbAotICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHNlcnZpY2VQcm9qZWN0cyA9IHByb2plY3RXaWRnZXRfLmdldFByb2plY3RDaG9pY2VzKCk7Ci0gICAgU3RyaW5nIHNlcnZpY2VFQVJOYW1lID0gbnVsbDsKLSAgICBTdHJpbmcgc2VydmljZVByb2pOYW1lID0gbnVsbDsKLSAgICBTdHJpbmcgc2VydmljZVNlcnZlckZhY3RvcnlJZCA9IG51bGw7Ci0gICAgVmFsaWRhdGlvblV0aWxzIHZhbFV0aWxzID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotICAgIGlmIChzZXJ2aWNlUHJvamVjdHMhPW51bGwpCi0gICAgewotICAgICAgc2VydmljZUVBUk5hbWUgID0gc2VydmljZVByb2plY3RzLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIHNlcnZpY2VQcm9qTmFtZSA9IHNlcnZpY2VQcm9qZWN0cy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBzZXJ2aWNlU2VydmVyRmFjdG9yeUlkID0gcnVudGltZVdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRTZXJ2ZXJJZCgpOwotICAgICAgU3RyaW5nIHNlcnZpY2VKMkVFbGV2ZWwgPSBydW50aW1lV2lkZ2V0Xy5nZXRKMkVFVmVyc2lvbigpOwotICAgICAgU3RhdHVzIHNlcnZpY2VQcm9qZWN0U3RhdHVzID0gdmFsVXRpbHMudmFsaWRhdGVQcm9qZWN0VGFyZ2V0QW5kSjJFRShzZXJ2aWNlUHJvak5hbWUsIHNlcnZpY2VFQVJOYW1lLCBzZXJ2aWNlU2VydmVyRmFjdG9yeUlkLCBzZXJ2aWNlSjJFRWxldmVsKTsKLSAgICAgIGlmKHNlcnZpY2VQcm9qZWN0U3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgIHsKLSAgICAgICAgZmluYWxTdGF0dXMgPSBzZXJ2aWNlUHJvamVjdFN0YXR1czsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9FbnN1cmUgdGhlIHNlcnZpY2UgcHJvamVjdCB0eXBlIChXZWIvRUpCKSBpcyB2YWxpZAotICAgIGlmIChzZXJ2aWNlUHJvak5hbWUhPW51bGwgJiYgc2VydmljZVByb2pOYW1lLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgSVByb2plY3Qgc2VydmljZVByb2ogPSAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtKHNlcnZpY2VQcm9qTmFtZSkpKTsKLSAgICAgIGlmIChzZXJ2aWNlUHJvai5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgLy9EZXRlcm1pbmUgd2hldGhlciBhbiBFSkIgcHJvamVjdCBpcyByZXF1aXJlZAotICAgICAgICBTdHJpbmcgd2ViU2VydmljZVJ1bnRpbWVJZCA9IHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCkuZ2V0UnVudGltZUlkKCk7Ci0gICAgICAgIFN0cmluZyB3ZWJTZXJ2aWNlVHlwZUlkID0gcnVudGltZVdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRUeXBlSWQoKTsKLSAgICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgd3NzcnRSZWdpc3RyeSA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2ZXJUeXBlSWQgPSB3c3NydFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChzZXJ2aWNlU2VydmVyRmFjdG9yeUlkKS5nZXRJZCgpOwotICAgICAgICBib29sZWFuIGlzRUpCUmVxdWlyZWQgPSB3c3NydFJlZ2lzdHJ5LnJlcXVpcmVzRUpCTW9kdWxlRm9yKHNlcnZlclR5cGVJZCwgd2ViU2VydmljZVJ1bnRpbWVJZCwgd2ViU2VydmljZVR5cGVJZCk7Ci0gICAgICAgIGlmICghaXNFSkJSZXF1aXJlZCkKLSAgICAgICAgewotICAgICAgICAgIC8vQ2hlY2sgdGhlIFdlYiBzZXJ2aWNlIHR5cGUgdG8gc2VlIGlmIGFuIEVKQiBwcm9qZWN0IGlzIHJlcXVpcmVkCi0gICAgICAgICAgaXNFSkJSZXF1aXJlZCA9IHdzc3J0UmVnaXN0cnkucmVxdWlyZXNFSkJQcm9qZWN0KHdlYlNlcnZpY2VUeXBlSWQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaXNFSkJSZXF1aXJlZCAmJiAhUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3Qoc2VydmljZVByb2opKQotICAgICAgICB7Ci0gICAgICAgICAgZmluYWxTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfSU5WQUxJRF9FSkJfUFJPSkVDVCIsbmV3IFN0cmluZ1tde3NlcnZpY2VQcm9qTmFtZX0pLFN0YXR1cy5FUlJPUik7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNFSkJSZXF1aXJlZCAmJiAhUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3Qoc2VydmljZVByb2opKQotICAgICAgICB7Ci0gICAgICAgICAgZmluYWxTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfSU5WQUxJRF9XRUJfUFJPSkVDVCIsbmV3IFN0cmluZ1tde3NlcnZpY2VQcm9qTmFtZX0pLFN0YXR1cy5FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGlzQ2xpZW50V2lkZ2V0VmlzaWJsZV8pIAotICAgIHsKLSAgICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNsaWVudFByb2plY3RzID0gY2xpZW50V2lkZ2V0Xy5nZXRQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0KCkuZ2V0UHJvamVjdENob2ljZXMoKTsgICAgICAKLSAgICAgIGlmIChjbGllbnRQcm9qZWN0cyE9bnVsbCAmJiBzZXJ2aWNlUHJvamVjdHMhPW51bGwpIAotICAgICAgewotICAgICAgICBTdHJpbmcgY2xpZW50RUFSTmFtZSAgID0gY2xpZW50UHJvamVjdHMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgICAgICBTdHJpbmcgY2xpZW50UHJvak5hbWUgID0gY2xpZW50UHJvamVjdHMuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgIC8vIGNoZWNrIHNhbWUgRUFSLW5lc3MgLS0tLS0KLSAgICAgICAgU3RyaW5nIHdhcm5pbmdfbXNnID0gZ2V0RUFSUHJvamVjdFdhcm5pbmdNZXNzYWdlKHNlcnZpY2VFQVJOYW1lLCBjbGllbnRFQVJOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBjbGllbnRQcm9qTmFtZSAhPSBudWxsICYmIHNlcnZpY2VQcm9qTmFtZSAhPSBudWxsICYmIAotICAgICAgICAgICAgY2xpZW50UHJvak5hbWUuZXF1YWxzSWdub3JlQ2FzZSggc2VydmljZVByb2pOYW1lICkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZmluYWxTdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLkVSUk9SKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdhcm5pbmdfbXNnID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJNU0dfU0FNRV9DTElFTlRfQU5EX1NFUlZJQ0VfRUFSUyIsIG5ldyBTdHJpbmdbXXsgIldFQiIgfSApOwotICAgICAgICAgICAgZmluYWxTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgd2FybmluZ19tc2csIFN0YXR1cy5XQVJOSU5HICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdhcm5pbmdfbXNnICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZmluYWxTdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLkVSUk9SKQotICAgICAgICAgIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIsIHdhcm5pbmdfbXNnLCBTdGF0dXMuV0FSTklORyApOyAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgIAotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICAvLyBUT0RPOiB2YWxpZGF0ZSBwcm9qZWN0cyAoaS5lIDEuMiB2cyAxLjMgV2ViIFByb2plY3RzKSBhZ2FpbnN0IHNlcnZlcnMKLSAgICAKLSAgICAKLSAgICAKLSAgICByZXR1cm4gZmluYWxTdGF0dXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEVBUlByb2plY3RXYXJuaW5nTWVzc2FnZShTdHJpbmcgc2VydmljZUVBUk5hbWUsIFN0cmluZyBjbGllbnRFQVJOYW1lICkgewotCi0gICAgLy8gY2hlY2sgaWYgc2VydmljZSBhbmQgY2xpZW50IHNoYXJlIHRoZSBzYW1lIEVBUgotICAgIGlmIChzZXJ2aWNlRUFSTmFtZSE9bnVsbCAmJiBjbGllbnRFQVJOYW1lIT1udWxsKSB7Ci0gICAgCi0gICAgICBpZiAoY2xpZW50RUFSTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNlcnZpY2VFQVJOYW1lKSAmJiBjbGllbnRFQVJOYW1lLmxlbmd0aCgpPjApIHsKLSAgICAgICAgcmV0dXJuIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfU0FNRV9DTElFTlRfQU5EX1NFUlZJQ0VfRUFSUyIsIG5ldyBTdHJpbmdbXXsgIkVBUiIgfSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0KLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvcnVudGltZS9TZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1NlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDllNzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1NlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMucnVudGltZTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5TZXJ2ZXJTZWxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5JV2ViU2VydmljZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3RDaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBERUZBVUxUX0NMSUVOVF9FQVJfUFJPSkVDVF9FWFQgPSAiRUFSIjsJCi0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgZ2VuZXJhdGVQcm94eV87Ci0gIAotICAvLyB3ZWJTZXJ2aWNlUnVudGltZUoyRUVUeXBlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IFdlYiBzZXJ2aWNlIHJ1bnRpbWUgYW5kIEoyRUUgbGV2ZWwgYmFzZWQgb24gdGhlIGluaXRpYWwgc2VsZWN0aW9uLgotICAvLyBJZiB0aGUgaW5pdGlhbFNlbGVjaXRvbiBkb2VzIG5vdCByZXN1bHQgaW4gYSB2YWxpZCBXZWIgc2VydmljZSBydW50aW1lIGFuZCBKMkVFIGxldmVsLCB3ZWJTZXJ2aWNlUnVudGltZUoyRUVUeXBlCi0gIC8vIHNob3VsZCByZW1haW4gbnVsbCBmb3IgdGhlIGxpZmUgb2YgdGhpcyBpbnN0YW5jZS4KLSAgcHJpdmF0ZSBXU1J1bnRpbWVKMkVFVHlwZSB3ZWJTZXJ2aWNlUnVudGltZUoyRUVUeXBlID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmljZUlkc187Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgc2VydmljZVByb2plY3QyRUFSUHJvamVjdF87Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbl87Ci0gIHByaXZhdGUgSVByb2plY3QgaW5pdGlhbFByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlSjJFRVZlcnNpb25fOwotICBwcml2YXRlIGJvb2xlYW4gc2VydmljZU5lZWRFQVJfID0gdHJ1ZTsKLQotICBwdWJsaWMgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgIFN0YXR1cyBjbGllbnRTaWRlU3RhdHVzID0gc3VwZXIuZXhlY3V0ZShlbnYpOwotICAgICBpZiAoY2xpZW50U2lkZVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgIHsKLSAgICAgICByZXR1cm4gY2xpZW50U2lkZVN0YXR1czsKLSAgICAgfQotICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICAgc2V0RGVmYXVsdFNlcnZpY2VSdW50aW1lRnJvbVByZWZlcmVuY2UoKTsKLSAgICAgc2V0RGVmYXVsdFNlcnZpY2VKMkVFVmVyc2lvbkZyb21QcmVmZXJlbmNlKCk7ICAgICAgCi0gICAgIHdlYlNlcnZpY2VSdW50aW1lSjJFRVR5cGUgPSBnZXRXU1J1bnRpbWVBbmRKMkVFRnJvbVByb2plY3QoaW5pdGlhbFByb2plY3RfKTsKLSAgICAgaWYgKHdlYlNlcnZpY2VSdW50aW1lSjJFRVR5cGUgIT0gbnVsbCkKLSAgICAgewotICAgICAgIHNlcnZpY2VKMkVFVmVyc2lvbl8gPSB3ZWJTZXJ2aWNlUnVudGltZUoyRUVUeXBlLmdldEoyZWVWZXJzaW9uSWQoKTsKLSAgICAgICBzZXJ2aWNlSWRzXy5zZXRSdW50aW1lSWQod2ViU2VydmljZVJ1bnRpbWVKMkVFVHlwZS5nZXRXc3JJZCgpKTsgCi0gICAgIH0KLSAgIAotICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgY2xpZW50IHR5cGUgdG8gYSB3ZWIgY2xpZW50IHR5cGUuCi0gICAgIHNldFdlYkNsaWVudFR5cGUoKTsKLSAgICAgCi0gICAgIC8vIERlZmF1bHQgcHJvamVjdHMgRUFScyBhbmQgc2VydmVycy4KLSAgICAgc2V0RGVmYXVsdFByb2plY3RzKCk7Ci0gICAgIHNldERlZmF1bHRFQVJzKCk7Ci0gICAgIHNldERlZmF1bHRTZXJ2ZXIoKTsKLSAgICAgdXBkYXRlU2VydmljZUVBUnMoKTsKLSAgICAgdXBkYXRlQ2xpZW50RUFScygpOwotICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vQ2F0Y2ggYWxsIEV4Y2VwdGlvbnMgaW4gb3JkZXIgdG8gZ2l2ZSBzb21lIGZlZWRiYWNrIHRvIHRoZSB1c2VyCi0gICAgICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQiLG5ldyBTdHJpbmdbXXtlLmdldE1lc3NhZ2UoKX0pLFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLSAgICAgIHJldHVybiBlcnJvclN0YXR1czsKLSAgICB9Ci0gICAgCi0gIH0gIAotCi0gIHByaXZhdGUgdm9pZCBzZXRXZWJDbGllbnRUeXBlKCkKLSAgewotICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNob2ljZXMgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCk7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgd2ViSWQgICA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIjsKLSAgICAKLSAgICBpZiggY2hvaWNlcyAhPSBudWxsICkKLSAgICB7Ci0gICAgICBjaG9pY2VzLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZSggd2ViSWQgKTsgICAKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRhcmdldCBSdW50aW1lIGFuZCBKMkVFIHZhbHVlCi0gICAqIEBwYXJhbSBwcm9qZWN0Ci0gICAqIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgV1NSdW50aW1lSjJFRVR5cGUgZ2V0V1NSdW50aW1lQW5kSjJFRUZyb21Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBXU1J1bnRpbWVKMkVFVHlwZSB3c3JKMkVFID0gbnVsbDsKLSAgICAvL0lmIHRoZXJlIGlzIGEgdmFsaWQgaW5pdGlhbCBzZWxlY3Rpb24sIHVzZSBpdCB0byBkZXRlcm1pbmUKLSAgICAvL3JlYXNvbmFibGUgSjJFRSB2ZXJzaW9uIGFuZCBXZWIgc2VydmljZSBydW50aW1lIHZhbHVlcwotCi0gICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIGlmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0KSB8fCBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChwcm9qZWN0KSkKLSAgICAgIHsKLSAgICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgd3NzcnRSZWcgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgLy9HZXQgdGhlIEoyRUUgbGV2ZWwKLSAgICAgICAgaW50IHZlcnNpb25JZCA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihwcm9qZWN0KTsKLSAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBTdHJpbmcudmFsdWVPZih2ZXJzaW9uSWQpOwotICAgICAgICAKLSAgICAgICAgLy9HZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRSdW50aW1lVGFyZ2V0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IG51bGw7Ci0gICAgICAgIGlmIChydW50aW1lVGFyZ2V0ICE9IG51bGwpIAotICAgICAgICAgIHJ1bnRpbWVUYXJnZXRJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgICAKLSAgICAgICAgLy9JZiB0aGUgcHJlZmVycmVkIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgc3VwcG9ydHMgdGhpcyBKMkVFIGxldmVsIGFuZCB0aGlzIHNlcnZlciB0YXJnZXQsIGtlZXAgaXQKLSAgICAgICAgaWYgKHdzc3J0UmVnLmRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbCh2ZXJzaW9uU3RyaW5nLCBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSkgJiYKLSAgICAgICAgICAgICgocnVudGltZVRhcmdldCA9PSBudWxsKSB8fCAKLSAgICAgICAgICAgICAocnVudGltZVRhcmdldCAhPSBudWxsICYmIHdzc3J0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydW50aW1lVGFyZ2V0SWQsIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpKSkKLSAgICAgICAgICAgICkKLSAgICAgICAgICAgKQotICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICAvL1NldCB0aGUgSjJFRSBsZXZlbCBhbmQgV2ViIHNlcnZpY2UgcnVudGltZQotICAgICAgICAgICAgd3NySjJFRSA9IG5ldyBXU1J1bnRpbWVKMkVFVHlwZSgpOwotICAgICAgICAgICAgd3NySjJFRS5zZXRXc3JJZChzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSk7Ci0gICAgICAgICAgICB3c3JKMkVFLnNldEoyZWVWZXJzaW9uSWQodmVyc2lvblN0cmluZyk7Ci0gICAgICAgICAgICByZXR1cm4gd3NySjJFRTsKLQotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vTG9vayBmb3IgYSBydW50aW1lIHRoYXQgbWF0Y2hlcyBib3RoIHRoZSBKMkVFIGxldmVsIGFuZCB0aGUgc2VydmVyIHRhcmdldC4KLSAgICAgICAgICBTdHJpbmdbXSB2YWxpZFJ1bnRpbWVzID0gd3NzcnRSZWcuZ2V0UnVudGltZXNCeVR5cGUoc2VydmljZUlkc18uZ2V0VHlwZUlkKCkpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRSdW50aW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAod3NzcnRSZWcuZG9lc1J1bnRpbWVTdXBwb3J0SjJFRUxldmVsKHZlcnNpb25TdHJpbmcsIHZhbGlkUnVudGltZXNbaV0pICYmCi0gICAgICAgICAgICAgICAgKChydW50aW1lVGFyZ2V0ID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgIChydW50aW1lVGFyZ2V0IT1udWxsICYmIHdzc3J0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydW50aW1lVGFyZ2V0SWQsIHZhbGlkUnVudGltZXNbaV0pKQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHdzckoyRUUgPSBuZXcgV1NSdW50aW1lSjJFRVR5cGUoKTsKLSAgICAgICAgICAgICAgd3NySjJFRS5zZXRXc3JJZCh2YWxpZFJ1bnRpbWVzW2ldKTsKLSAgICAgICAgICAgICAgd3NySjJFRS5zZXRKMmVlVmVyc2lvbklkKHZlcnNpb25TdHJpbmcpOwotICAgICAgICAgICAgICByZXR1cm4gd3NySjJFRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIHJldHVybiB3c3JKMkVFOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFNlcnZpY2VSdW50aW1lRnJvbVByZWZlcmVuY2UoKQotICB7Ci0gIAkKLSAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgICBTdHJpbmcgcFJ1bnRpbWVJZCA9IGNvbnRleHQuZ2V0UnVudGltZUlkKCk7Ci0gICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgd3NzcnRSZWcgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIC8vaWYgdGhlIHByZWZlcnJlZCBydW50aW1lIGluIGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSwgc2VsZWN0IGl0LgotICAgIGlmICh3c3NydFJlZy5pc1J1bnRpbWVTdXBwb3J0ZWRGb3JUeXBlKHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpLCBwUnVudGltZUlkKSkKLSAgICB7Ci0gICAgICBzZXJ2aWNlSWRzXy5zZXRSdW50aW1lSWQocFJ1bnRpbWVJZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL1NldCB0aGUgV2ViIHNlcnZpY2UgcnVudGltZSB0byBvbmUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIHR5cGUuCi0gICAgICBTdHJpbmdbXSB2YWxpZFJ1bnRpbWVzID0gd3NzcnRSZWcuZ2V0UnVudGltZXNCeVR5cGUoc2VydmljZUlkc18uZ2V0VHlwZUlkKCkpOwotICAgICAgaWYgKHZhbGlkUnVudGltZXMgIT0gbnVsbCAmJiB2YWxpZFJ1bnRpbWVzLmxlbmd0aD4wKQotICAgICAgewotICAgICAgICBzZXJ2aWNlSWRzXy5zZXRSdW50aW1lSWQodmFsaWRSdW50aW1lc1swXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAKLSAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRTZXJ2aWNlSjJFRVZlcnNpb25Gcm9tUHJlZmVyZW5jZSgpCi0gIHsKLSAgICBpZiAoc2VydmljZUlkc18gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcnVudGltZUlkID0gc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCk7Ci0gICAgICBpZiAocnVudGltZUlkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpOwotICAgICAgICBpZiAod3NyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmdbXSB2ZXJzaW9ucyA9IHdzci5nZXRKMkVFVmVyc2lvbnMoKTsgICAgICAgICAgCi0gICAgICAgICAgLy9JZiB0aGUgcHJlZmVycmVkIEoyRUUgdmVyc2lvbiBpcyBpbiB2ZXJzaW9ucywgcGljayB0aGUgcHJlZmVycmVkIG9uZS4gCi0gICAgICAgICAgLy9PdGhlcndpc2UsIHBpY2sgdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgICBpZiAodmVyc2lvbnMgIT0gbnVsbCAmJiB2ZXJzaW9ucy5sZW5ndGggPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAJUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICAgICAgCVN0cmluZyBwSjJFRSA9IGNvbnRleHQuZ2V0SjJFRVZlcnNpb24oKTsKLSAgICAgICAgICAJaWYgKHBKMkVFIT1udWxsICYmIHBKMkVFLmxlbmd0aCgpPjApCi0gICAgICAgICAgCXsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8dmVyc2lvbnMubGVuZ3RoO2krKykKLSAgICAgICAgICAJICB7Ci0gICAgICAgICAgCQlpZiAodmVyc2lvbnNbaV0uZXF1YWxzKHBKMkVFKSkKLSAgICAgICAgICAJCXsKLSAgICAgICAgICAJCQlzZXJ2aWNlSjJFRVZlcnNpb25fID0gdmVyc2lvbnNbaV07Ci0gICAgICAgICAgCQkgICAgcmV0dXJuOwotICAgICAgICAgIAkJfQotICAgICAgICAgIAkgIH0KLSAgICAgICAgICAJfQotICAgICAgICAgIAlzZXJ2aWNlSjJFRVZlcnNpb25fID0gdmVyc2lvbnNbMF07Ci0gICAgICAgICAgCXJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgCi0gIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0UHJvamVjdHMoKQotICB7Ci0JCi0JLy9IYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbm8gdmFsaWQgaW5pdGlhbCBzZWxlY3Rpb24gZXhpc3RzCi0gICAgaWYgKGluaXRpYWxQcm9qZWN0Xz09IG51bGwgfHwgKGluaXRpYWxQcm9qZWN0XyE9bnVsbCAmJiB3ZWJTZXJ2aWNlUnVudGltZUoyRUVUeXBlPT1udWxsKSkKLSAgICB7Ci0gICAgICAvL1NlbGVjdCB0aGUgZmlyc3QgZXhpc3RpbmcgcHJvamVjdCB0aGF0IGlzIHZhbGlkLgotICAgICAgc2V0U2VydmljZVByb2plY3RUb0ZpcnN0VmFsaWQoKTsKLSAgICAgIFN0cmluZyBzZXJ2aWNlUHJvamVjdE5hbWUgPSBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgICAKLSAgICAgIC8vU2VsZWN0IGEgY2xpZW50IHByb2plY3Qgd2l0aCAiY2xpZW50IiBhZGRlZCB0byB0aGUgYWJvdmUgcHJvamVjdCBuYW1lLgotICAgICAgU3RyaW5nIGNsaWVudFByb2plY3ROYW1lID0gUmVzb3VyY2VVdGlscy5nZXRDbGllbnRXZWJQcm9qZWN0TmFtZShzZXJ2aWNlUHJvamVjdE5hbWUsIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpICk7Ci0gICAgICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGNsaWVudFByb2plY3ROYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9ICAgIAotCSAgICAKLQotCi0JLy9TZXQgdGhlIHNlcnZpY2UgcHJvamVjdCBzZWxlY3Rpb24gdG8gdGhpcyBpbml0aWFsUHJvamVjdAotCWdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoaW5pdGlhbFByb2plY3RfLmdldE5hbWUoKSk7Ci0JU3RyaW5nIGNsaWVudFByb2plY3ROYW1lID0gUmVzb3VyY2VVdGlscy5nZXRDbGllbnRXZWJQcm9qZWN0TmFtZShpbml0aWFsUHJvamVjdF8uZ2V0TmFtZSgpLCBzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSApOyAKLQkvL1NldCB0aGUgY2xpZW50IHByb2plY3Qgc2VsZWN0aW9uIHRvIGNsaWVudFByb2plY3QKLQlnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGNsaWVudFByb2plY3ROYW1lKTsKLQkJICAgICAgCSAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldFNlcnZpY2VQcm9qZWN0VG9GaXJzdFZhbGlkKCkKLSAgewotICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7aTxwcm9qZWN0TmFtZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0ocHJvamVjdE5hbWVzW2ldKSkpOwotICAgICAgaWYgKHByb2plY3QuaXNPcGVuKCkgJiYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3QpIHx8IFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3QpKSkKLSAgICAgIHsKLSAgICAgICAgLy9HZXQgdGhlIEoyRUUgbGV2ZWwKLSAgICAgICAgaW50IHZlcnNpb25JZCA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihwcm9qZWN0KTsKLSAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBTdHJpbmcudmFsdWVPZih2ZXJzaW9uSWQpOwotICAgICAgICAKLSAgICAgICAgLy9HZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRSdW50aW1lVGFyZ2V0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IG51bGw7Ci0gICAgICAgIGlmIChydW50aW1lVGFyZ2V0ICE9IG51bGwpIAotICAgICAgICAgIHJ1bnRpbWVUYXJnZXRJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHNlcnZpY2VKMkVFVmVyc2lvbl8hPW51bGwgJiYgc2VydmljZUoyRUVWZXJzaW9uXy5sZW5ndGgoKT4wICYmIHNlcnZpY2VKMkVFVmVyc2lvbl8uZXF1YWxzKHZlcnNpb25TdHJpbmcpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHdzc3J0UmVnLmRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbCh2ZXJzaW9uU3RyaW5nLCBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSkgJiYKLSAgICAgICAgICAgICAoKHJ1bnRpbWVUYXJnZXQgPT0gbnVsbCkgfHwgCi0gICAgICAgICAgICAgKChydW50aW1lVGFyZ2V0IT1udWxsKSAmJiB3c3NydFJlZy5kb2VzUnVudGltZVN1cHBvcnRTZXJ2ZXJUYXJnZXQocnVudGltZVRhcmdldElkLCBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSkpKSAKLSAgICAgICAgICAgICApCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShwcm9qZWN0TmFtZXNbaV0pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL0RpZG4ndCBmaW5kIGEgc2luZ2xlIHByb2plY3QgdGhhdCB3b3JrZWQuIERlZmF1bHQgdG8gYSBuZXcgcHJvamVjdCBuYW1lLgotICAgIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0V2ViUHJvamVjdE5hbWUoKSk7Ci0gIH0KLSAgCi0gIAotICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdEVBUnMoKQotICB7Ci0KLSAgCS8vU2VydmljZS1zaWRlCi0gICAgU3RyaW5nIGluaXRpYWxQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7IAotICAgIElQcm9qZWN0IGluaXRpYWxQcm9qZWN0ID0gICBGaWxlUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChpbml0aWFsUHJvamVjdE5hbWUpOyAgCQotICAJSVByb2plY3QgZGVmYXVsdFNlcnZpY2VFQVIgPSBnZXREZWZhdWx0RUFSRnJvbVNlcnZpY2VQcm9qZWN0KGluaXRpYWxQcm9qZWN0KTsKLSAgCWdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdFNlcnZpY2VFQVIuZ2V0TmFtZSgpKTsKLSAgCQotICAJLy9DbGllbnQtc2lkZQotICAgIFN0cmluZyBpbml0aWFsQ2xpZW50UHJvamVjdE5hbWUgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOyAKLSAgICBJUHJvamVjdCBpbml0aWFsQ2xpZW50UHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGluaXRpYWxDbGllbnRQcm9qZWN0TmFtZSkpOyAgCQotICAJSVByb2plY3QgZGVmYXVsdENsaWVudEVBUiA9IGdldERlZmF1bHRFQVJGcm9tQ2xpZW50UHJvamVjdChpbml0aWFsQ2xpZW50UHJvamVjdCk7Ci0gIAkKLSAgCS8vSWYgdGhlIGNsaWVudCBwcm9qZWN0IGV4aXN0cyBhbmQgdGhlIGRlZmF1bHQgRUFSIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIHNlcnZpY2UgcHJvamVjdCwgCi0gIAkvL3BpY2sgdGhlIGRlZmF1bHRDbGllbnRFQVIKLSAgCWlmKGluaXRpYWxDbGllbnRQcm9qZWN0IT1udWxsICYmIGluaXRpYWxDbGllbnRQcm9qZWN0LmV4aXN0cygpIAotICAJICAgJiYgZGVmYXVsdENsaWVudEVBUi5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShkZWZhdWx0U2VydmljZUVBUi5nZXROYW1lKCkpKQotICAJewotICAJCWdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdENsaWVudEVBUi5nZXROYW1lKCkpOwotICAJfQotICAJZWxzZQotICAJewotICAgICAgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBwdGM9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCk7Ci0gICAgICBpZiAoIXB0Yy5pc1VzZVR3b0VBUnMoKSkgewotICAgICAgCWdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdFNlcnZpY2VFQVIuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBJUHJvamVjdCBwcm94eUVBUlByb2plY3QgPSBnZXRVbmlxdWVDbGllbnRFQVIoZGVmYXVsdENsaWVudEVBUi5nZXROYW1lKCksIGRlZmF1bHRTZXJ2aWNlRUFSLmdldE5hbWUoKSwgaW5pdGlhbENsaWVudFByb2plY3ROYW1lKTsKLSAgICAgICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShwcm94eUVBUlByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgIH0gIAkJCi0gIAl9Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0VW5pcXVlQ2xpZW50RUFSKFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgc2VydmljZVByb2plY3QsIFN0cmluZyBjbGllbnRQcm9qZWN0TmFtZSkgewotCi0gICAgU3RyaW5nIHByb2plY3ROYW1lID0gbmV3IFN0cmluZygpOwotICAgIGlmICghZWFyUHJvamVjdC5lcXVhbHNJZ25vcmVDYXNlKHNlcnZpY2VQcm9qZWN0KSkgewotICAgICAgcHJvamVjdE5hbWUgPSBlYXJQcm9qZWN0OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHByb2plY3ROYW1lID0gY2xpZW50UHJvamVjdE5hbWUrREVGQVVMVF9DTElFTlRfRUFSX1BST0pFQ1RfRVhUOwotICAgICAgaW50IGk9MTsgICAgICAKLSAgICAgIHdoaWxlIChwcm9qZWN0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNlcnZpY2VQcm9qZWN0KSkgewotICAgICAgICBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lK2k7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb2plY3ROYW1lLmVxdWFscygiIikgPyBudWxsIDogUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0U2VydmVyKCkKLSAgewotICAgIC8vQ2FsY3VsYXRlIHJlYXNvbmFibGUgZGVmYXVsdCBzZXJ2ZXIgYmFzZWQgb24gdGhlIGRlZmF1bHQgcHJvamVjdCBzZWxlY3Rpb24uIAotCi0gICAgU3RyaW5nIGluaXRpYWxQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7IAotICAgIElQcm9qZWN0IGluaXRpYWxQcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKS50cmFuc2Zvcm0oaW5pdGlhbFByb2plY3ROYW1lKSk7Ci0gICAgaWYgKGluaXRpYWxQcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRTZXJ2ZXJJbmZvRnJvbUV4aXN0aW5nUHJvamVjdChpbml0aWFsUHJvamVjdCwgc2VydmljZUlkc18uZ2V0VHlwZUlkKCksIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpLCB0cnVlKTsKLSAgICAgIGlmIChzZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAoc2VydmVySW5mb1swXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzBdLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmVySW5mb1sxXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzFdLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZlckluZm9bMV0pOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL3RoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LgotICAgIHsKLSAgICAgIC8vRG9lcyB0aGUgRUFSIGV4aXN0PwotICAgICAgU3RyaW5nIGluaXRpYWxFQVJQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBJUHJvamVjdCBpbml0aWFsRUFSUHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGluaXRpYWxFQVJQcm9qZWN0TmFtZSkpOwotICAgICAgaWYgKGluaXRpYWxFQVJQcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0U2VydmVySW5mb0Zyb21FeGlzdGluZ1Byb2plY3QoaW5pdGlhbEVBUlByb2plY3QsIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpLCBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSwgZmFsc2UpOwotICAgICAgICBpZiAoc2VydmVySW5mbyE9bnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChzZXJ2ZXJJbmZvWzBdIT1udWxsICYmIHNlcnZlckluZm9bMF0ubGVuZ3RoKCk+MCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMV0hPW51bGwgJiYgc2VydmVySW5mb1sxXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVySW5mb1sxXSk7Ci0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL1dlIGhhdmUgYSBuZXcgcHJvamVjdCBhbmQgRUFSLiBVc2UgdGhlIHJ1bnRpbWUvc2VydmVyIHNlbGVjdGlvbiAKLSAgICAgICAgLy9wcmVmZXJlbmNlcyB0byBzZXQgdGhlIGRlZmF1bHQgc2VydmVyL3NlcnZlciB0eXBlLgotICAgICAgICAvL1BpY2sgYSBzZXJ2ZXIgdHlwZSB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgV2ViIHNlcnZpY2UgcnVudGltZQotICAgICAgICAvL0lmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHNlcnZlciB0aGF0IHdvcmtzLCBwaWNrIHRoYXQgb25lLgotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gc2VydmVySW5mbyA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFNlcnZlckZyb21XZWJTZXJ2Y2VSdW50aW1lQW5kSjJFRShzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSwgc2VydmljZUoyRUVWZXJzaW9uXyk7Ci0gICAgICAgIGlmIChzZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMF0hPW51bGwgJiYgc2VydmVySW5mb1swXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlcklkKHNlcnZlckluZm9bMF0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc2VydmVySW5mb1sxXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzFdLmxlbmd0aCgpPjApCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbmZvWzFdKTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIC8vRGVmYXVsdCB0aGUgY2xpZW50IHNlcnZlciAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlcnZpY2VFQVJzKCkKLSAgewotICAJLy9TZXQgRUFSIHNlbGVjdGlvbiB0byBudWxsIGlmIHRoZSBwcm9qZWN0L3NlcnZlciBkZWZhdWx0cyBpbXBseSBhbiBFQVIgc2hvdWxkIG5vdCBiZSBjcmVhdGVkCi0gIAlTdHJpbmcgc2VydmljZVByb2plY3ROYW1lID0gZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgCUlQcm9qZWN0IHNlcnZpY2VQcm9qZWN0ID0gRmlsZVJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3Qoc2VydmljZVByb2plY3ROYW1lKTsKLSAgCWlmIChzZXJ2aWNlUHJvamVjdCAhPSBudWxsICYmIHNlcnZpY2VQcm9qZWN0LmV4aXN0cygpKQotICAJewotICAJICAvL0dldCB0aGUgcnVudGltZSB0YXJnZXQgb24gdGhlIHNlcnZpY2VQcm9qZWN0Ci0gIAkgIElSdW50aW1lIHNlcnZpY2VUYXJnZXQgPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRSdW50aW1lVGFyZ2V0KHNlcnZpY2VQcm9qZWN0TmFtZSk7Ci0gIAkgIFN0cmluZyBqMmVlVmVyc2lvbiA9IFN0cmluZy52YWx1ZU9mKEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihzZXJ2aWNlUHJvamVjdCkpOwotICAJICBpZiAoc2VydmljZVRhcmdldCAhPSBudWxsKQotICAJICB7Ci0gIAkgIAlpZiAoIVNlcnZlclV0aWxzLmlzVGFyZ2V0VmFsaWRGb3JFQVIoc2VydmljZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCksajJlZVZlcnNpb24pKQotICAJICAJewotICAJICAgICAgLy9EZWZhdWx0IHRoZSBFQVIgc2VsZWN0aW9uIHRvIGJlIGVtcHR5Ci0gIAkgIAkgIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0SW5kZXgoLTEpOwotICAJICAJICBzZXJ2aWNlTmVlZEVBUl8gPSBmYWxzZTsKLSAgCSAgCX0KLSAgCSAgCQkKLSAgCSAgfQotICAJfQotICAJZWxzZQotICAJewotICAJCS8vVXNlIHRoZSBzZXJ2ZXIgdHlwZQotICAJCVN0cmluZyBzZXJ2ZXJUYXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFJ1bnRpbWVUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmljZUlkc18uZ2V0U2VydmVySWQoKSk7Ci0gIAkJaWYgKHNlcnZlclRhcmdldElkIT1udWxsICYmIHNlcnZlclRhcmdldElkLmxlbmd0aCgpPjApCi0gIAkJewotICAJCSAgaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKHNlcnZlclRhcmdldElkLHNlcnZpY2VKMkVFVmVyc2lvbl8pKQotICAJICAJICB7Ci0gIAkgICAgICAgIC8vRGVmYXVsdCB0aGUgRUFSIHNlbGVjdGlvbiB0byBiZSBlbXB0eQotICAJICAJICAgIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0SW5kZXgoLTEpOwotICAJICAJICAgIHNlcnZpY2VOZWVkRUFSXyA9IGZhbHNlOwotICAJICAJICB9Ci0gIAkJfQotICAJfQotICAJCi0gIAkJCi0gIH0KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpbml0aWFsU2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFByb2plY3QoSVByb2plY3QgaW5pdGlhbFByb2plY3QpCi0gIHsKLSAgICBpbml0aWFsUHJvamVjdF8gPSBpbml0aWFsUHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgc2VydmljZUlkc18gPSBpZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfOyAKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkKLSAgewotICAgIGlmIChzZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0XyA9PSBudWxsKQotICAgIHsKLSAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RzQnlXZWJTZXJ2aWNlVHlwZShzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7Ci0JICAKLQkgIFN0cmluZ1tdIHByb2plY3ROYW1lcyA9IG5ldyBTdHJpbmdbcHJvamVjdHMubGVuZ3RoXTsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgCQlwcm9qZWN0TmFtZXNbaV0gPSBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0JICB9Ci0JICBTZWxlY3Rpb25MaXN0IGxpc3QgPSBuZXcgU2VsZWN0aW9uTGlzdChwcm9qZWN0TmFtZXMsIDApOwotCSAgVmVjdG9yIGNob2ljZXMgPSBuZXcgVmVjdG9yKCk7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JICAgIGNob2ljZXMuYWRkKGdldFByb2plY3RFQVJDaG9pY2UocHJvamVjdHNbaV0pKTsKLQkgIH0KLQkgIHNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3RfID0gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKGxpc3QsIGNob2ljZXMsIGdldEVBUlByb2plY3RzKCkpOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVByb2plY3QyRUFSUHJvamVjdF87IAotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdlbmVyYXRlUHJveHlfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVQcm94eV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBnZW5lcmF0ZVByb3h5XyBUaGUgZ2VuZXJhdGVQcm94eV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHlfKQotICB7Ci0gICAgdGhpcy5nZW5lcmF0ZVByb3h5XyA9IGdlbmVyYXRlUHJveHlfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSjJFRVZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VKMkVFVmVyc2lvbl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFNlcnZpY2VOZWVkRUFSKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlTmVlZEVBUl87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBFQVIgZm9yIGEgZ2l2ZW4gcHJvamVjdAotICAgKiBAcGFyYW0gcHJvamVjdAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIElQcm9qZWN0IGdldERlZmF1bHRFQVJGcm9tU2VydmljZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIGlmIChwcm9qZWN0IT1udWxsICYmIHByb2plY3QuZXhpc3RzKCkpIAotICAgIHsKLSAgICAgIElTZXJ2ZXJbXSBjb25maWd1cmVkU2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKLSAgICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb25maWd1cmVkU2VydmVycywgc2VydmljZUlkc18uZ2V0VHlwZUlkKCkgKTsKLSAgICAgIAotICAgICAgRUFSTmF0dXJlUnVudGltZVtdIGVhclByb2plY3RzID0gSjJFRVV0aWxzLmdldEVBUlByb2plY3RzKHByb2plY3QsIGZpcnN0U3VwcG9ydGVkU2VydmVyKTsKLSAgICAgIGlmIChlYXJQcm9qZWN0cyE9bnVsbCAmJiBlYXJQcm9qZWN0c1swXSBpbnN0YW5jZW9mIEVBUk5hdHVyZVJ1bnRpbWUpIAotICAgICAgICByZXR1cm4gZWFyUHJvamVjdHNbMF0uZ2V0UHJvamVjdCgpOwotICAgIH0KLSAgICAKLSAgICBpbnQgdmVyc2lvbklkID0gLTE7Ci0gICAgaWYgKHNlcnZpY2VKMkVFVmVyc2lvbl8gIT0gbnVsbCAmJiBzZXJ2aWNlSjJFRVZlcnNpb25fLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgdmVyc2lvbklkID0gSW50ZWdlci5wYXJzZUludChzZXJ2aWNlSjJFRVZlcnNpb25fKTsKLSAgICB9Ci0gICAgRUFSTmF0dXJlUnVudGltZSBuZXdFQVIgPSBKMkVFVXRpbHMuZ2V0RUFSKHZlcnNpb25JZCk7Ci0gICAgSVByb2plY3QgZWFyUHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0U2VydmljZUVBUlByb2plY3ROYW1lKCkpOwotICAgICAgCi0gICAgaWYgKG5ld0VBUiE9bnVsbCkKLSAgICAgIGVhclByb2plY3QgPSBuZXdFQVIuZ2V0UHJvamVjdCgpOwotCi0gICAgcmV0dXJuIGVhclByb2plY3Q7ICAJCi0gIH0KLSAgCi0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L0xhdW5jaEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9MYXVuY2hGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmJkMzBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L0xhdW5jaEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIExhdW5jaEZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50Ci17Ci0gIHByaXZhdGUgYm9vbGVhbiBwdWJsaXNoVG9QdWJsaWNVRERJXzsgIAotICBwcml2YXRlIGJvb2xlYW4gcHVibGlzaFRvUHJpdmF0ZVVERElfOwotICAKLSAgcHVibGljIExhdW5jaEZyYWdtZW50KCkKLSAgewotICAgIENvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAocHVibGlzaFRvUHVibGljVURESV8gfHwgcHVibGlzaFRvUHJpdmF0ZVVERElfKTsKLSAgICAgIH0KLSAgICB9OwotICAgIHNldENvbmRpdGlvbiggY29uZGl0aW9uICk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCksICIiICkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHVibGljVURESShib29sZWFuIHB1Ymxpc2hUb1B1YmxpY1VEREkpCi0gIHsKLSAgICBwdWJsaXNoVG9QdWJsaWNVRERJXyA9IHB1Ymxpc2hUb1B1YmxpY1VEREk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKGJvb2xlYW4gcHVibGlzaFRvUHJpdmF0ZVVEREkpCi0gIHsKLSAgCXB1Ymxpc2hUb1ByaXZhdGVVRERJXyA9IHB1Ymxpc2hUb1ByaXZhdGVVRERJOwotICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5ZDA0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9TZXJ2aWNlVGVzdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XU0RMVGVzdExhdW5jaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2VUZXN0RnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RTZXJ2aWNlOwotICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVQcm94eTsKLSAgCi0gIAotICBwdWJsaWMgU2VydmljZVRlc3RGcmFnbWVudCggU3RyaW5nIGlkICkKLSAgewotICAJU2VxdWVuY2VGcmFnbWVudCB0ZXN0Um9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gIAlDb25kaXRpb24gY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RTZXJ2aWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBzZXRDb25kaXRpb24oIGNvbmRpdGlvbiApOwotICAgIAotICAgIHRlc3RSb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgdGVzdFJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIGlkICkgKTsKLSAgICBzZXRUcnVlRnJhZ21lbnQoIHRlc3RSb290ICk7Ci0gICAgICAKLSAgfQotIAotICAKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgCQotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RJRCIsV1NETFRlc3RMYXVuY2hDb21tYW5kLmNsYXNzKTsKLSAgCQotICAJLy9mcm9tIHRoZSB3aXphcmQgCi0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcywgIlRlc3RJRCIsV1NETFRlc3RMYXVuY2hDb21tYW5kLmNsYXNzKTsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJFeHRlcm5hbEJyb3dzZXIiLFdTRExUZXN0TGF1bmNoQ29tbWFuZC5jbGFzcyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoYm9vbGVhbiBnZW5lcmF0ZVByb3h5KQotICB7Ci0gIAl0aGlzLmdlbmVyYXRlUHJveHkgPSBnZW5lcmF0ZVByb3h5OwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAJcmV0dXJuIGdlbmVyYXRlUHJveHk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRlc3RTZXJ2aWNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoIGJvb2xlYW4gdGVzdFNlcnZpY2UgKQotICB7Ci0gICAgdGhpcy50ZXN0U2VydmljZSA9IHRlc3RTZXJ2aWNlOwotICB9Ci0KLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3Rlc3QvU2VydmljZVRlc3RXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMWIxNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3Rlc3QvU2VydmljZVRlc3RXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XU0RMVGVzdExhdW5jaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlVGVzdFdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSI7Ci0KLSAgcHJpdmF0ZSBDb21ibyB0ZXN0VHlwZUNvbWJvXzsKLSAgLypDT05URVhUX0lEIFBTVFAwMDAxIGZvciB0aGUgVGVzdCBUeXBlIENvbWJvIGJveCBvZiB0aGUgU2VydmljZSBUZXN0IFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BTVFBfQ09NQk9CT1hfVEVTVCA9ICJQU1RQMDAwMSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUFNUUF9DT01CT0JPWF9URVNUID0gIlRPT0xUSVBfUFNUUF9DT01CT0JPWF9URVNUIjsKLQotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUFNUUDAwMDIgZm9yIHRoZSBsYXVuY2ggYnV0dG9uIG9mIHRoZSBTZXJ2aWNlIFRlc3QgUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFNUUF9MQVVOQ0hfQlVUVE9OID0gIlBTVFAwMDAyIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QU1RQX0xBVU5DSF9CVVRUT04gPSAiVE9PTFRJUF9QU1RQX0xBVU5DSF9CVVRUT04iOwotICAKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IGZhY2lsaXRpZXNfOwotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBjcmVhdGVQbHVnaW5JZF8gKTsKLSAgICAgICAgCi0gICAgQ29tcG9zaXRlIHRlc3RDb21wb3NpdGUgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAzLCAwLCAwICk7Ci0gICAgCi0gICAgdGVzdFR5cGVDb21ib18gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKCB0ZXN0Q29tcG9zaXRlLCAiTEFCRUxfVEVTVF9UWVBFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BTVFBfQ09NQk9CT1hfVEVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFNUUF9DT01CT0JPWF9URVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgCi0gICAgbGF1bmNoQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggdGVzdENvbXBvc2l0ZSwgIkJVVFRPTl9MQVVOQ0hfU0VSVklDRV9URVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUFNUUF9MQVVOQ0hfQlVUVE9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QU1RQX0xBVU5DSF9CVVRUT04gKTsKLSAgICBsYXVuY2hCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTGF1bmNoQnV0dG9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHNlcnZpY2VpZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlclByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gIiI7Ci0gIHByaXZhdGUgRW52aXJvbm1lbnQgZW52OwotICBwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUxhdW5jaEJ1dHRvbigpCi0gIHsKLSAgCQotICAJU3RyaW5nIHRlc3RJRCA9IHRlc3RUeXBlQ29tYm9fLmdldFRleHQoKTsKLSAgCWxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gdGVzdElEOwotICAJV1NETFRlc3RMYXVuY2hDb21tYW5kIHd0bGMgPSBuZXcgV1NETFRlc3RMYXVuY2hDb21tYW5kKCk7Ci0gIAl3dGxjLnNldFRlc3RJRCh0ZXN0SUQpOwotICAJd3RsYy5zZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoc2VydmljZWlkcyk7Ci0gIAl3dGxjLnNldFNlcnZlclByb2plY3Qoc2VydmVyUHJvamVjdCk7Ci0gIAl3dGxjLnNldFdzZGxVUkkod3NkbFVSSSk7Ci0gIAl3dGxjLnNldEV4dGVybmFsQnJvd3Nlcih0cnVlKTsKLSAgCXd0bGMuc2V0RW5kcG9pbnQoZW5kcG9pbnRzKTsKLSAgCVN0YXR1cyBzdGF0dXMgPSB3dGxjLmV4ZWN1dGUoZW52KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVRlc3RGYWNpbGl0aWVzKCBTZWxlY3Rpb25MaXN0IGZhY2lsaXRpZXMgKQotICB7Ci0gICAgZmFjaWxpdGllc18gPSBmYWNpbGl0aWVzOwotICAgIHRlc3RUeXBlQ29tYm9fLnNldEl0ZW1zKCBmYWNpbGl0aWVzLmdldExpc3QoKSApOwotICAgIHRlc3RUeXBlQ29tYm9fLnNlbGVjdCggZmFjaWxpdGllcy5nZXRJbmRleCgpICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldFNlcnZpY2VUZXN0RmFjaWxpdGllcygpCi0gIHsKLSAgICBmYWNpbGl0aWVzXy5zZXRJbmRleCggdGVzdFR5cGVDb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAgIHJldHVybiBmYWNpbGl0aWVzXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdElEKCkKLSAgewotICAJcmV0dXJuIHRlc3RUeXBlQ29tYm9fLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAJdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KFN0cmluZyBzZXJ2ZXJQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBzZXJ2aWNlaWRzKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlaWRzID0gc2VydmljZWlkczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCXRoaXMuZW52ID0gZW52OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50KQotICB7Ci0gICAgaWYgKGVuZHBvaW50ICE9IG51bGwgJiYgZW5kcG9pbnQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgdi5hZGQoZW5kcG9pbnQpOwotICAgICAgc2V0RW5kcG9pbnRzKHYpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRzKExpc3QgZW5kcG9pbnRzKQotICB7Ci0gICAgdGhpcy5lbmRwb2ludHMgPSBlbmRwb2ludHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3ZmYxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE1LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLQotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICAKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IHNlcnZpY2VUZXN0RmFjaWxpdGllczsJCi0gIHByaXZhdGUgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0gIHByaXZhdGUgU3RyaW5nIHRlc3RJRDsKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCkuY29weSgpOwotICAJdGVzdElEID0gc2NlbmFyaW9Db250ZXh0LmdldE5vbkphdmFUZXN0U2VydmljZSgpOwotICAJU3RyaW5nW10gdGVzdFR5cGVzID0gc2NlbmFyaW9Db250ZXh0LmdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLSAgCQotICAJCi0gIAllbnZpcm9ubWVudCA9IGVudjsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgCVdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgd3N0dFJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAJCi0gICAgCi0gIAlWZWN0b3Igd3NkbE5hbWVzID0gbmV3IFZlY3RvcigpOwotICAJZm9yKGludCBpID0wIDtpPHRlc3RUeXBlcy5sZW5ndGg7aSsrKXsKLSAgCSAgV2ViU2VydmljZVRlc3RFeHRlbnNpb24gd3NjdGUgPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pd3N0dFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKHRlc3RUeXBlc1tpXSk7ICAJCi0gIAkgIGlmKCF3c2N0ZS5pc0phdmEoKSl7Ci0gIAkgICAgd3NkbE5hbWVzLmFkZEVsZW1lbnQodGVzdFR5cGVzW2ldKTsKLSAgCSAgfQotICAJfQotICAgIAotICAJU3RyaW5nIGphdmFOYW1lc0FycmF5W10gPSBuZXcgU3RyaW5nW3dzZGxOYW1lcy5zaXplKCldOwotICAJRW51bWVyYXRpb24gZSA9IHdzZGxOYW1lcy5lbGVtZW50cygpOwotICAJaW50IGkgPSAwOwotICAJd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICBqYXZhTmFtZXNBcnJheVtpXSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAJICBpKys7Ci0gIAl9Ci0gIAkKLSAgCQotICAJc2VydmljZVRlc3RGYWNpbGl0aWVzID0gbmV3IFNlbGVjdGlvbkxpc3QoamF2YU5hbWVzQXJyYXksMCk7ICAJCi0gIAkKLSAJcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldFNlcnZpY2VUZXN0RmFjaWxpdGllcygpCi0gIHsKLSAgCXJldHVybiBzZXJ2aWNlVGVzdEZhY2lsaXRpZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRlc3RJRCgpCi0gIHsKLSAgCXJldHVybiB0ZXN0SUQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpCi0gIHsKLSAgCXJldHVybiBlbnZpcm9ubWVudDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEV4dGVybmFsQnJvd3NlcigpCi0gIHsKLSAgCXJldHVybiBmYWxzZTsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkNmEwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi11ZGRpcmVnaXN0cnkuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTk5ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3M8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWQxMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UudWRkaXJlZ2lzdHJ5LmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHVkZGlyZWdpc3RyeS5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3JlZ2lzdHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9pY29ucy9yZWdpc3RyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDNjYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3JlZ2lzdHJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9pY29ucy91ZGRpcHJpdmF0ZWNvbmZpZ193aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3VkZGlwcml2YXRlY29uZmlnX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNjExZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3VkZGlwcml2YXRlY29uZmlnX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2ZiZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIFVuaXZlcnNhbCBEZXNjcmlwdGlvbiBEaXNjb3ZlcnkgYW5kIEludGVncmF0aW9uIFJlZ2lzdHJ5Ci1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19VTklUX1RFU1RfVUREST1Vbml0IFRlc3QgVURESQotCi1YUF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVM9UHJpdmF0ZSBVRERJIFJlZ2lzdHJ5IFR5cGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWZjMmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIG5hbWU9IiVQTFVHSU5fTkFNRSIKLSAgIHByb3ZpZGVyLW5hbWU9IiVQTFVHSU5fUFJPVklERVIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS5wbHVnaW4uV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0idWRkaXJlZ2lzdHJ5LmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0KLSAgPGRlc2NyaXB0aW9uPgotICAlUExVR0lOX0RFU0MKLSAgPC9kZXNjcmlwdGlvbj4KLSAgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiIG5hbWU9IiVYUF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVMiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5wcml2YXRlVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHJpdmF0ZVVERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQUklWQVRFX1VERElfUkVHSVNUUllfVFlQRV9JTVBMIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwiPgotICAgICAgPC9wcml2YXRlVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfV0laQVJEX05BTUVfV1NfVU5JVF9URVNUX1VEREkiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9yZWdpc3RyeS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5iaW5kaW5nLlByaXZhdGVVRERJV2lkZ2V0QmluZGluZyI+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19VTklUX1RFU1RfVURESSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuYmluZGluZy5Qcml2YXRlVURESVdpZGdldEJpbmRpbmciCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy91ZGRpcHJpdmF0ZWNvbmZpZ193aXouZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5iaW5kaW5nLlByaXZhdGVVRERJV2lkZ2V0QmluZGluZyI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDwhLS0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX1VOSVRfVEVTVF9VRERJIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvcmVnaXN0cnkuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy51aS5uZXciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQuUHJpdmF0ZVVERElXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQuUHJpdmF0ZVVERElXaXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVBMVUdJTl9ORVdfV0laQVJEX0RFU0NfV1NfVU5JVF9URVNUX1VEREkKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvcGx1Z2luL1dlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS9wbHVnaW4vV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGEzMjNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS9wbHVnaW4vV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgVURESSBSZWdpc3RyeSBwbHVnaW4uCi0qIDxwPgotKiBUaGUgV2ViIFNlcnZpY2VzIFVEREkgUmVnaXN0cnkgcGx1Z2luJ3MgaXMgdG8gYWRkIHRoZQotKiBvcHRpb24gdG8gY3JlYXRlIGEgdW5pdCB0ZXN0IFVEREkgcmVnaXN0cnkgCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0gIC8qKgotICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luIGluIHBsdWdpbi54bWwuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkiOwotCi0gIC8qKgotICAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbiBpbnN0YW5jZV87Ci0gIHByaXZhdGUgTG9nIGxvZ187Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4gKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgaW5zdGFuY2VfID0gdGhpczsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4gRXF1aXZhbGVudCB0byBjYWxsaW5nCi0gICogKFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Iik7Ci0gICogQHJldHVybiBUaGUgV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbiBzaW5nbGV0b24uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbiBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlCi0gICogYXMgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uLgotICAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIGluc3RhbGxVUkwgPSBpbnN0YW5jZV8uZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLSAgICAgIFVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCxuYW1lKTsKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHBsdWdpbi5wcm9wZXJ0aWVzLgotICAqIEByZXR1cm4gVGhlIFN0cmluZyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSApCi0gIHsKLSAgICByZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoaW5zdGFuY2VfLmdldEJ1bmRsZSgpLGtleSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHBsdWdpbi5wcm9wZXJ0aWVzLiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIHRoZSBKREsncwotICAqIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdH0KLSAgKiBjbGFzcyBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLSAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSxhcmdzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwNTg0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLS8qCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkucGx1Z2luLldlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW47Ci0qLwotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIGJ5dGUgb3BlcmF0aW9uVHlwZTsKLSAgcHJpdmF0ZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSByZWdpc3RyeVR5cGU7Ci0gIAotICAvKgotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgCWlmIChyZWdpc3RyeVR5cGUgIT0gbnVsbCkKLSAgCXsKLSAgCSAgc3dpdGNoIChvcGVyYXRpb25UeXBlKQotICAJICB7Ci0gIAkgIAljYXNlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX0RFUExPWToKLSAgCSAgICAgIHJldHVybiByZWdpc3RyeVR5cGUuZGVwbG95KGVudik7Ci0gIAkgIAljYXNlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX1VQREFURToKLSAgCSAgCSAgcmV0dXJuIHJlZ2lzdHJ5VHlwZS51cGRhdGUoZW52KTsKLSAgCSAgCWNhc2UgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuT1BfUkVNT1ZFOgotICAJICAJICByZXR1cm4gcmVnaXN0cnlUeXBlLnJlbW92ZShlbnYpOwotICAJICAJZGVmYXVsdDoKLSAgCSAgfQotICAJfQotICAJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gICovCi0KLSAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIGdldFJlZ2lzdHJ5VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKTsKLSAgfQotICAKLSAgcHVibGljIGJ5dGUgZ2V0T3BlcmF0aW9uVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uVHlwZTsKLSAgfQotICAKLSAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIGdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkKLSAgewotICAJcmV0dXJuIHJlZ2lzdHJ5VHlwZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlZ2lzdHJ5VHlwZShQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSByZWdUeXBlKQotICB7Ci0gIAlzZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZShyZWdUeXBlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uVHlwZShieXRlIHR5cGUpCi0gIHsKLSAgICBvcGVyYXRpb25UeXBlID0gdHlwZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgcmVnVHlwZSkKLSAgewotICAJcmVnaXN0cnlUeXBlID0gcmVnVHlwZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc0MTE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5BYnN0cmFjdENvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSByZWdpc3RyeVR5cGU7Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5OwotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5OwotICAKLSAgcHVibGljIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50KCkKLSAgewotICAJc3VwZXIoKENvbW1hbmRGYWN0b3J5KW51bGwsICIiKTsKLSAgfQotCi0gIC8qKiAKLSAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKQotICB7Ci0gIAlpZiAocmVnaXN0cnlUeXBlICE9IG51bGwpCi0gIAl7Ci0gICAgICByZWdpc3RyeVR5cGUucmVnaXN0ZXJDYW5GaW5pc2goY2FuRmluaXNoUmVnaXN0cnkpOwotICAgICAgcmVnaXN0cnlUeXBlLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKGRhdGFNYXBwaW5nUmVnaXN0cnkpOwotICAgICAgcmVnaXN0cnlUeXBlLnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mod2lkZ2V0UmVnaXN0cnkpOwotICAgICAgcmV0dXJuIHJlZ2lzdHJ5VHlwZS5jcmVhdGUoKS5jcmVhdGUoKTsKLSAgCX0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCkKLSAgewotICAJcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgZGF0YSBtYXBwaW5ncyBmb3IgdGhpcyBjb21tYW5kIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSkKLSAgewotICAJZGF0YU1hcHBpbmdSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5ID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy53aWRnZXRSZWdpc3RyeSA9IHdpZGdldFJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAgKiBBbGwgd2l6YXJkIGZyYWdtZW50cyBuZWVkIHRvIGJlIGNsb25lYWJsZS4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gIAlQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCgpOwotICAJZnJhZ21lbnQucmVnaXN0ZXJEYXRhTWFwcGluZ3MoZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlckNhbkZpbmlzaChjYW5GaW5pc2hSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5KTsKLSAgCWZyYWdtZW50LnNldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKHJlZ2lzdHJ5VHlwZSk7Ci0gIAlyZXR1cm4gZnJhZ21lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHJlZ2lzdHJ5VHlwZSkKLSAgewotICAJdGhpcy5yZWdpc3RyeVR5cGUgPSByZWdpc3RyeVR5cGU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5YmUzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS5wbHVnaW4uV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotLyoqCi0qIFRoaXMgVURESSBjb25maWd1cmF0aW9uIHBhZ2UgcHJvbXB0cyB0aGUgdXNlcgotKiBmb3IgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUKLSogdW5pdCB0ZXN0IFVEREkgcmVnaXN0cnkuCi0qLwotcHVibGljIGNsYXNzIFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotCi0gIHByaXZhdGUgQnV0dG9uIGRlcGxveVJhZGlvXzsKLSAgcHJpdmF0ZSBMYWJlbCB0eXBlc0xhYmVsXzsKLSAgcHJpdmF0ZSBDb21ibyB0eXBlc0NvbWJvXzsKLSAgcHJpdmF0ZSBCdXR0b24gdXBkYXRlUmFkaW9fOwotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVSYWRpb187Ci0gIHByaXZhdGUgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVbXSB0eXBlc187Ci0gIHByaXZhdGUgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgaW5zdGFsbGVkVHlwZV87Ci0KLSAgLy8gSW5mb3BvcAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BVUFJfUFJJVkFURV9VRERJX1BBR0UgPSBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wdXByMDAwMSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFVQUl9QUklWQVRFX1VERElfVFlQRSA9IFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnB1cHIwMDAyIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QVVBSX0RFUExPWV9QUklWQVRFX1VEREkgPSBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wdXByMDAwMyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFVQUl9VUERBVEVfUFJJVkFURV9VRERJID0gV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5JRCArICIucHVwcjAwMDUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BVUFJfUkVNT1ZFX1BSSVZBVEVfVURESSA9IFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnB1cHIwMDA0IjsKLQotICBwdWJsaWMgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQoKQotICB7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gIAl0aGlzLnN0YXR1c0xpc3RlbmVyID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfUEFHRSIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSU5GT1BPUF9QVVBSX1BSSVZBVEVfVURESV9QQUdFKTsKLQotICAgIEdyaWRMYXlvdXQgZ2w7Ci0gICAgR3JpZERhdGEgZ2Q7Ci0gICAgCi0gICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgCWhhbmRsZVdpZGdldEV2ZW50KGV2ZW50KTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAgIAotICAgIGRlcGxveVJhZGlvXyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgIGRlcGxveVJhZGlvXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkJVVFRPTl9ERVBMT1lfVURESV9SRUdJU1RSWSIpKTsKLSAgICBkZXBsb3lSYWRpb18uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIGRlcGxveVJhZGlvXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0gICAgZGVwbG95UmFkaW9fLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFVQUl9ERVBMT1lfUFJJVkFURV9VRERJIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChkZXBsb3lSYWRpb18sIElORk9QT1BfUFVQUl9ERVBMT1lfUFJJVkFURV9VRERJKTsKLQotICAgIENvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSA1OwotICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDE1OwotICAgIGdsLm1hcmdpbldpZHRoID0gMjA7Ci0gICAgdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIHR5cGVzTGFiZWxfID0gbmV3IExhYmVsKHR5cGVDb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICB0eXBlc0xhYmVsXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX1BSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFUyIpKTsKLSAgICB0eXBlc0xhYmVsXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BVUFJfUFJJVkFURV9VRERJX1RZUEUiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHR5cGVzTGFiZWxfLCBJTkZPUE9QX1BVUFJfUFJJVkFURV9VRERJX1RZUEUpOwotCi0gICAgdHlwZXNDb21ib18gPSBuZXcgQ29tYm8odHlwZUNvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgdHlwZXNDb21ib18uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgdHlwZXNDb21ib18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotICAgIHR5cGVzQ29tYm9fLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfVFlQRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAodHlwZXNDb21ib18sIElORk9QT1BfUFVQUl9QUklWQVRFX1VERElfVFlQRSk7Ci0KLSAgICB1cGRhdGVSYWRpb18gPSBuZXcgQnV0dG9uKHBhcmVudCxTV1QuUkFESU8pOwotICAgIHVwZGF0ZVJhZGlvXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkJVVFRPTl9VUERBVEVfVURESV9SRUdJU1RSWSIpKTsKLSAgICB1cGRhdGVSYWRpb18uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICB1cGRhdGVSYWRpb18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbixsaXN0ZW5lcik7Ci0gICAgdXBkYXRlUmFkaW9fLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFVQUl9VUERBVEVfUFJJVkFURV9VRERJIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh1cGRhdGVSYWRpb18sIElORk9QT1BfUFVQUl9VUERBVEVfUFJJVkFURV9VRERJKTsKLQotICAgIHJlbW92ZVJhZGlvXyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgIHJlbW92ZVJhZGlvXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkJVVFRPTl9SRU1PVkVfVURESV9SRUdJU1RSWSIpKTsKLSAgICByZW1vdmVSYWRpb18uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICByZW1vdmVSYWRpb18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotICAgIHJlbW92ZVJhZGlvXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BVUFJfUkVNT1ZFX1BSSVZBVEVfVURESSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocmVtb3ZlUmFkaW9fLCBJTkZPUE9QX1BVUFJfUkVNT1ZFX1BSSVZBVEVfVURESSk7ICAgICAgICAgICAgICAgIAotCi0gICAgbG9hZFR5cGVzKCk7Ci0gICAgaW5pdCgpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGxvYWRUeXBlcygpCi0gIHsKLSAgICB0eXBlc18gPSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZXMoKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBpbml0KCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXNfLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0eXBlc19baV0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHlwZXNDb21ib18uYWRkKHR5cGVzX1tpXS5nZXROYW1lKCkpOwotICAgICAgICBpZiAodHlwZXNfW2ldLmlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpKQotICAgICAgICAgIGluc3RhbGxlZFR5cGVfID0gdHlwZXNfW2ldOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHlwZXNDb21ib18uZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgICAgdHlwZXNDb21ib18uc2V0VGV4dCh0eXBlc0NvbWJvXy5nZXRJdGVtKDApKTsKLSAgICBpZiAoaW5zdGFsbGVkVHlwZV8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVSYWRpb18uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIHJlbW92ZVJhZGlvXy5zZXRFbmFibGVkKHRydWUpOyAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHVwZGF0ZVJhZGlvXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIHJlbW92ZVJhZGlvXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlV2lkZ2V0RXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHJlbW92ZVJhZGlvXyB8fCBldmVudC53aWRnZXQgPT0gdXBkYXRlUmFkaW9fKQotICAgIHsKLSAgICAgIGJvb2xlYW4gaXNVcGRhdGVPclJlbW92ZVNlbGVjdGVkID0gKChCdXR0b24pZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIHR5cGVzTGFiZWxfLnNldEVuYWJsZWQoIWlzVXBkYXRlT3JSZW1vdmVTZWxlY3RlZCk7Ci0gICAgICB0eXBlc0NvbWJvXy5zZXRFbmFibGVkKCFpc1VwZGF0ZU9yUmVtb3ZlU2VsZWN0ZWQpOwotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGVwbG95UmFkaW9fKQotICAgIHsKLSAgICAgIGJvb2xlYW4gaXNEZXBsb3lTZWxlY3RlZCA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICB0eXBlc0xhYmVsXy5zZXRFbmFibGVkKGlzRGVwbG95U2VsZWN0ZWQpOwotICAgICAgdHlwZXNDb21ib18uc2V0RW5hYmxlZChpc0RlcGxveVNlbGVjdGVkKTsKLSAgICB9Ci0gICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotICB9Ci0gIAotICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKQotICB7Ci0gIAlpZiAoZGVwbG95UmFkaW9fLmdldFNlbGVjdGlvbigpKQotICAJewotICAJICBTdHJpbmcgc2VsZWN0ZWRSZWdpc3RyeU5hbWUgPSB0eXBlc0NvbWJvXy5nZXRUZXh0KCk7Ci0gIAkgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXNfLmxlbmd0aDsgaSsrKQotICAgICAgICBpZiAoc2VsZWN0ZWRSZWdpc3RyeU5hbWUuZXF1YWxzKHR5cGVzX1tpXS5nZXROYW1lKCkpKQotICAJICAJICByZXR1cm4gdHlwZXNfW2ldOwotICAgICAgcmV0dXJuIG51bGw7Ci0gIAl9Ci0gIAllbHNlCi0gIAkgIHJldHVybiBpbnN0YWxsZWRUeXBlXzsKLSAgfQotICAKLSAgcHVibGljIGJ5dGUgZ2V0T3BlcmF0aW9uVHlwZSgpCi0gIHsKLSAgCWlmIChkZXBsb3lSYWRpb18uZ2V0U2VsZWN0aW9uKCkpCi0gIAkgIHJldHVybiBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5PUF9ERVBMT1k7Ci0gIAllbHNlIGlmICh1cGRhdGVSYWRpb18uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICByZXR1cm4gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuT1BfVVBEQVRFOwotICAJZWxzZSBpZiAocmVtb3ZlUmFkaW9fLmdldFNlbGVjdGlvbigpKQotICAgICAgcmV0dXJuIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX1JFTU9WRTsKLSAgCWVsc2UKLSAgCSAgcmV0dXJuIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX0RFUExPWTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHByaXZhdGVVRERJUmVnaXN0cnlUeXBlID0gZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKTsKLSAgICBpZiAocHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgIT0gbnVsbCkKLSAgICAgIHJldHVybiBwcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5nZXRPcGVyYXRpb25TdGF0dXMoZ2V0T3BlcmF0aW9uVHlwZSgpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX1VERElfUkVHSVNUUllfQVZBSUxBQkxFIiksIFN0YXR1cy5FUlJPUik7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldENvbmRpdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY5MmQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCBpbXBsZW1lbnRzIENvbmRpdGlvbgotewotICBwcml2YXRlIGJvb2xlYW4gY29uZGl0aW9uOwotCi0gIHB1YmxpYyBQcml2YXRlVURESVNlbGVjdGlvbldpZGdldENvbmRpdGlvbkNvbW1hbmQoKQotICB7Ci0gICAgY29uZGl0aW9uID0gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIGNvbmRpdGlvbiA9ICFjb25kaXRpb247Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHVuZG8oRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgY29uZGl0aW9uID0gIWNvbmRpdGlvbjsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2lzVW5kb2FibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLSAgewotICAgIHJldHVybiBjb25kaXRpb247Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9iaW5kaW5nL1ByaXZhdGVVRERJV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvYmluZGluZy9Qcml2YXRlVURESVdpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiN2JkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9iaW5kaW5nL1ByaXZhdGVVRERJV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LnBsdWdpbi5XZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzLlByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBQcml2YXRlVURESVdpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnk7Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeTsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0gIHByaXZhdGUgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kRnJhZ21lbnQgcHJpdmF0ZVVERElTZWxGcmFnbWVudDsKLSAgcHJpdmF0ZSBQcml2YXRlVURESVNlbGVjdGlvbldpZGdldENvbmRpdGlvbkNvbW1hbmQgY29uZGl0aW9uQ29tbWFuZDsKLSAgCi0gIHB1YmxpYyBQcml2YXRlVURESVdpZGdldEJpbmRpbmcoKQotICB7Ci0gICAgcHJpdmF0ZVVERElTZWxGcmFnbWVudCA9IG5ldyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCgpOwotICAgIGNvbmRpdGlvbkNvbW1hbmQgPSBuZXcgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgewotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgewotICAgICAgICBTZXF1ZW5jZUZyYWdtZW50IHJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoY29uZGl0aW9uQ29tbWFuZCwgIiIpKTsKLSAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCJQcml2YXRlVURESVNlbGVjdGlvbldpZGdldCIpKTsKLSAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KGNvbmRpdGlvbkNvbW1hbmQsICIiKSk7Ci0gICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kKCksICIiKSk7Ci0gICAgICAgIHJvb3QuYWRkKHByaXZhdGVVRERJU2VsRnJhZ21lbnQpOwotICAgICAgICByZXR1cm4gcm9vdDsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5ID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gICAgcHJpdmF0ZVVERElTZWxGcmFnbWVudC5yZWdpc3RlckNhbkZpbmlzaCh0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5KTsKLSAgICAKLSAgICBjYW5GaW5pc2hSZWdpc3RyeS5hZGRDb25kaXRpb24oY29uZGl0aW9uQ29tbWFuZCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5ID0gZGF0YVJlZ2lzdHJ5OwotICAgIHByaXZhdGVVRERJU2VsRnJhZ21lbnQucmVnaXN0ZXJEYXRhTWFwcGluZ3MoZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gICAgCi0gICAgLy8gUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kCi0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiLCBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQcml2YXRlVURESVNlbGVjdGlvbldpZGdldC5jbGFzcywgIk9wZXJhdGlvblR5cGUiLCBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiLCBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudC5jbGFzcyk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHRoaXMud2lkZ2V0UmVnaXN0cnkgPSB3aWRnZXRSZWdpc3RyeTsKLSAgICBwcml2YXRlVURESVNlbEZyYWdtZW50LnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3ModGhpcy53aWRnZXRSZWdpc3RyeSk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIlByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0IiwgCi0gICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1BSSVZBVEVfVURESV9DT05GSUciKSwKLSAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19QUklWQVRFX1VERElfQ09ORklHIiksCi0JICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgIHsKLQkgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JICAgIHsKLQkgICAgICByZXR1cm4gbmV3IFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0KCk7Ci0JICAgIH0KLQkgIH0KLSAgICApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNWIwMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci0KLQotcHVibGljIGludGVyZmFjZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSBleHRlbmRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIC8vIG9wZXJhdGlvbiB0eXBlcwotICBwdWJsaWMgc3RhdGljIGJ5dGUgT1BfREVQTE9ZID0gMHgwOwotICBwdWJsaWMgc3RhdGljIGJ5dGUgT1BfVVBEQVRFID0gMHgxOwotICBwdWJsaWMgc3RhdGljIGJ5dGUgT1BfUkVNT1ZFID0gMHgyOwotCi0gIC8vIGdlbmVyYWwgaW5mb3JtYXRpb24KLSAgcHVibGljIFN0cmluZyBnZXRJRCgpOwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCk7Ci0gIHB1YmxpYyBTdGF0dXMgZ2V0T3BlcmF0aW9uU3RhdHVzKGJ5dGUgb3BlcmF0aW9uKTsKLQotICAvLyByZWdpc3RyeSBVUkxzCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeUFQSSgpOwotICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hBUEkoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiYmM3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuYmluZGluZy5Qcml2YXRlVURESVdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci0KLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS51ZGRpLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlCi17Ci0gICAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSB7Ci0gICAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlW10gdHlwZXMgPSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHR5cGVzW2ldLmlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJpdmF0ZVVERElSZWdpc3RyeUlucXVpcnlBUEkoKSB7Ci0gICAgICAgIFZlY3RvciBpbnF1aXJ5QVBJVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzID0gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0eXBlc1tpXS5pc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gdHlwZXNbaV0uZ2V0SW5xdWlyeUFQSSgpOwotICAgICAgICAgICAgICAgIGlmIChpbnF1aXJ5QVBJICE9IG51bGwgJiYgaW5xdWlyeUFQSS5zdGFydHNXaXRoKCJodHRwIikpCi0gICAgICAgICAgICAgICAgICAgIGlucXVpcnlBUElWZWN0b3IuYWRkKGlucXVpcnlBUEkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gaW5xdWlyeUFQSUFycmF5ID0gbmV3IFN0cmluZ1tpbnF1aXJ5QVBJVmVjdG9yLnNpemUoKV07Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBpbnF1aXJ5QVBJVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgaW5xdWlyeUFQSUFycmF5W2pdID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlucXVpcnlBUElBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVB1Ymxpc2hBUEkoKSB7Ci0gICAgICAgIFZlY3RvciBwdWJsaXNoQVBJVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzID0gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0eXBlc1tpXS5pc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaXNoQVBJID0gdHlwZXNbaV0uZ2V0UHVibGlzaEFQSSgpOwotICAgICAgICAgICAgICAgIGlmIChwdWJsaXNoQVBJICE9IG51bGwgJiYgcHVibGlzaEFQSS5zdGFydHNXaXRoKCJodHRwIikpCi0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hBUElWZWN0b3IuYWRkKHB1Ymxpc2hBUEkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcHVibGlzaEFQSUFycmF5ID0gbmV3IFN0cmluZ1twdWJsaXNoQVBJVmVjdG9yLnNpemUoKV07Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBwdWJsaXNoQVBJVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgcHVibGlzaEFQSUFycmF5W2pdID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHB1Ymxpc2hBUElBcnJheTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENvbW1hbmRXaWRnZXRCaW5kaW5nIGdldEJpbmRpbmcoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgUHJpdmF0ZVVERElXaWRnZXRCaW5kaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxZDZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IGluc3RhbmNlXzsKLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzXzsKLQotICAgIHByaXZhdGUgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSgpIHsKLSAgICB9Ci0gIAotICAgIC8qKgotICAgICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgICogQHJldHVybiBBIHNpbmdsZXRvbiBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IG9iamVjdC4KLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YW5jZV8gPSBuZXcgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSgpOwotICAgICAgICAgICAgaW5zdGFuY2VfLmdldENvbmZpZ0VsZW1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgICB9Ci0gIAotICAgIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWdFbGVtZW50cygpIHsKLSAgICAgICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgIGNvbmZpZ0VsZW1lbnRzXyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcml2YXRlVURESVJlZ2lzdHJ5VHlwZSIpOwotICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbGVtZW50c18ubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgd2VpZ2h0ID0gZ2V0V2VpZ2h0KGNvbmZpZ0VsZW1lbnRzX1tpXSk7Ci0gICAgICAgICAgaW50IGluZGV4ID0gLTE7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IHYuc2l6ZSgpLTE7IGogPj0gMDsgai0tKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh3ZWlnaHQgPiBnZXRXZWlnaHQoKElDb25maWd1cmF0aW9uRWxlbWVudCl2LmdldChqKSkpCi0gICAgICAgICAgICAgIGluZGV4ID0gajsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgICAgIHYuYWRkKGluZGV4LCBjb25maWdFbGVtZW50c19baV0pOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHYuYWRkKGNvbmZpZ0VsZW1lbnRzX1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgdi5jb3B5SW50byhjb25maWdFbGVtZW50c18pOwotICAgICAgICByZXR1cm4gY29uZmlnRWxlbWVudHNfOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFdlaWdodChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoIndlaWdodCIpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICAgICAgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnRWxlbWVudEJ5SUQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDxjb25maWdFbGVtZW50c18ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjb25maWdFbGVtZW50c19baV0uZ2V0QXR0cmlidXRlKCJpZCIpLmVxdWFscyhpZCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ0VsZW1lbnRzX1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVbXSBnZXRUeXBlcygpIHsKLSAgICAgICAgVmVjdG9yIHR5cGVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdHlwZU9iaiA9IGNvbmZpZ0VsZW1lbnRzX1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlT2JqIGluc3RhbmNlb2YgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHR5cGVzLmFkZCh0eXBlT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgfQotCi0gICAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlW10gdHlwZXNBcnJheSA9IG5ldyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVt0eXBlcy5zaXplKCldOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICB0eXBlc0FycmF5W2pdID0gKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKXR5cGVzLmVsZW1lbnRBdChqKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZXNBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgZ2V0VHlwZUJ5SUQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3QgdHlwZU9iaiA9IGdldENvbmZpZ0VsZW1lbnRCeUlEKGlkKS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICAgICAgaWYgKHR5cGVPYmogaW5zdGFuY2VvZiBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKXR5cGVPYmo7IAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFNlcnZlckZhY3RvcnlJREJ5SUQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gZ2V0Q29uZmlnRWxlbWVudEJ5SUQoaWQpOwotICAgICAgICBpZiAoY29uZmlnRWxlbWVudCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIFZlY3RvciBpZFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgic2VydmVyRmFjdG9yeUlEIiksICIsIik7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIGlkVmVjdG9yLmFkZChzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1tpZFZlY3Rvci5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZHNbaV0gPSAoU3RyaW5nKWlkVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaWRzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdWRkaXJlZ2lzdHJ5L3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdWRkaXJlZ2lzdHJ5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQ4YWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3VkZGlyZWdpc3RyeS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgUHJpdmF0ZVVERElDb25maWdQYWdlCi0jCi1QQUdFX1RJVExFX1BSSVZBVEVfVURESV9DT05GSUc9VW5pdCBUZXN0IFVEREkgUmVnaXN0cnkgQ29uZmlndXJhdGlvbgotUEFHRV9ERVNDX1BSSVZBVEVfVURESV9DT05GSUc9Q29uZmlndXJlIHRoZSB1bml0IHRlc3QgVURESSByZWdpc3RyeS4KLQotIwotIyBUb29sdGlwIGZvciBQcml2YXRlVURESUNvbmZpZ1BhZ2UKLSMKLVRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfUEFHRT1EZXBsb3kgb3IgcmVtb3ZlIGEgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkKLVRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfVFlQRT1DaG9vc2UgdGhlIHR5cGUgb2YgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkgeW91IHdhbnQgdG8gZGVwbG95Ci1UT09MVElQX1BVUFJfREVQTE9ZX1BSSVZBVEVfVUREST1EZXBsb3kgYSBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotVE9PTFRJUF9QVVBSX1VQREFURV9QUklWQVRFX1VEREk9VXBkYXRlIHRoZSBleGlzdGluZyBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotVE9PTFRJUF9QVVBSX1JFTU9WRV9QUklWQVRFX1VEREk9UmVtb3ZlIHRoZSBleGlzdGluZyBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotCi0jCi0jIENvbW1vbiB3aXphcmQgc3RyaW5ncy4KLSMKLUxBQkVMX1BSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFUz1Qcml2YXRlIFVEREkgUmVnaXN0cnkgdHlwZToKLUJVVFRPTl9ERVBMT1lfVURESV9SRUdJU1RSWT1EZXBsb3kgdGhlIFVuaXQgVGVzdCBVRERJIFJlZ2lzdHJ5Ci1CVVRUT05fVVBEQVRFX1VERElfUkVHSVNUUlk9VXBkYXRlIHRoZSBwcmV2aW91c2x5IGRlcGxveWVkIFVEREkgcmVnaXN0cnkKLUJVVFRPTl9SRU1PVkVfVURESV9SRUdJU1RSWT1SZW1vdmUgdGhlIHByZXZpb3VzbHkgZGVwbG95ZWQgVURESSByZWdpc3RyeQotCi0jCi0jIFdpemFyZCBwYWdlIHRhc2sgbGFiZWxzIGFuZCBkZXNjcmlwdGlvbnMKLSMgKHVzZWQgb25seSBmb3IgcHJvZ3Jlc3MgaW5kaWNhdGlvbikuCi0jCi0KLSMKLSMgRGlhbG9nIG1lc3NhZ2VzCi0jCi0KLSMKLSMgUHJvZ3Jlc3MgbWVzc2FnZXMKLSMKLQotIwotIyBXYXJuaW5nIG1lc3NhZ2VzCi0jCi0KLSMKLSMgRXJyb3IgbWVzc2FnZXMKLSMKLU1TR19FUlJPUl9OT19VRERJX1JFR0lTVFJZX0FWQUlMQUJMRT1JV0FCMDM2M0UgTm8gVURESSByZWdpc3RyeSBhdmFpbGFibGUuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZhZDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotd3MtdWkuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2VmOWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNGNjYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXNvdXJjZS53cy11aS5qYXIgPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSB3cy11aS5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZG9jLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIHRlc3QvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9pY29ucy9qYXJfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2ljb25zL2phcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTJmNGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2ljb25zL2phcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhZWU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1QTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1M9V2ViIFNlcnZpY2VzCi0KLSMKLSMJV2ViIFNlcnZpY2VzIFByZWZlcmFuY2UgUGFnZXMKLSMKLSMgQ2F0ZWdvcmllcwotUFJFRkVSRU5DRV9DQVRFR09SWV9SRVNPVVJDRV9NQU5BR0VNRU5UPVJlc291cmNlIE1hbmFnZW1lbnQKLQotIwotIyAgV1MtSSBQcmVmZXJlbmNlIHBhZ2VzCi0jCi0jIFdTLUkgQ29tcGxpYW5jZSBQYWdlCi0jCi1QUkVGRVJFTkNFX0NBVEVHT1JZX1dTST1XUy1JIENvbXBsaWFuY2UKLQotIwotIyBQb3B1cCBhY3Rpb24gQ2F0ZWdvcnkKLSMKLUxBQkVMX1BPUFVQX0NBVEVHT1JZX1dFQl9TRVJWSUNFUz1XZWIgU2VydmljZXMKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDliYWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnVpIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV2ViU2VydmljZVVJUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3cy11aS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9SRVNPVVJDRV9NQU5BR0VNRU5UIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQotICAgICAgCi0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudSI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9QT1BVUF9DQVRFR09SWV9XRUJfU0VSVklDRVMiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwb3B1cEFjdGlvbnMiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotPCEtLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkuZWpiLnBvcHVwTWVudSI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9QT1BVUF9DQVRFR09SWV9XRUJfU0VSVklDRVMiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LmVqYi5wb3B1cE1lbnUiPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0icG9wdXBBY3Rpb25zIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0tLT4gICAgICAKLQotICAgPC9leHRlbnNpb24+Ci0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vTGF1bmNoSW1wb3J0V2l6YXJkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9MYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5MjY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9MYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgbGF1bmNoZXMgdGhlIGltcG9ydCB3aXphcmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUKLXsKLSAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbl87Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIAotICAgIHsKLSAgICAgIER5bmFtaWNXaXphcmQgd2l6YXJkID0gbmV3IER5bmFtaWNXaXphcmQoKTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHdpemFyZC5zZXRJbml0aWFsRGF0YSggIndzaW1wb3J0IiApOwotICAgICAgICB3aXphcmQuaW5pdCggUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uXyApOwotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgCi0gIAkgIFdpemFyZERpYWxvZyBkaWFsb2c9IG5ldyBXaXphcmREaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCB3aXphcmQpOwotCSAgZGlhbG9nLnNldFBhZ2VTaXplKCA1MDAsIDQwMCApOwotCSAgZGlhbG9nLmNyZWF0ZSgpOwotCSAgZGlhbG9nLm9wZW4oKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgCi0gICAgewotICAgICAgaWYoIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICkKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uXyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ0OGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvYWN0aW9uL1dlYlNlcnZpY2VEZXBsb3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VEZXBsb3kgewotCXB1YmxpYyB2b2lkIHJ1bihJUmVzb3VyY2Ugc2VsZWN0aW9uKTsgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XZWJTZXJ2aWNlRGVwbG95QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XZWJTZXJ2aWNlRGVwbG95QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YjEwOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRGVwbG95QWN0aW9uIGV4dGVuZHMgV2luZG93QWN0aW9uRGVsZWdhdGUgewotcHVibGljIHZvaWQgcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uIGFjdGlvbikgewotCi0gICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZVByb2plY3QoKTsKLQotICAgU3RyaW5nIFtdIHR5cGVJZHMgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUeXBlSWRzQnlNb2R1bGUocHJvamVjdCk7Ci0gICBPYmplY3QgdGhlQWN0aW9uID0gbnVsbDsKLQotICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy51aSIsICJ3ZWJzZXJ2aWNlZGVwbG95Iik7Ci0gICB0cnkgewotICAgCQotICAgCWlmICh0eXBlSWRzID09IG51bGwgfHwgdHlwZUlkcy5sZW5ndGggPD0gMCkKLSAgIAl7Ci0gICAJIAkvLyB0aGF0IG1lYW5zIHRoZSBtb2R1bGUgaXMgbm90IGF0dGFjaGVkIHRvIGEgc2VydmVyIHRoZW4gcGljayB0aGUgZmlyc3QgZXh0ZW5zaW9uIGZvdW5kCi0gICAJICAgIHRoZUFjdGlvbiA9IGVsZW1lbnRzWzBdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAJfQotICAgCWVsc2UgaWYgKCB0eXBlSWRzLmxlbmd0aCA9PSAxKQotICAgCXsKLSAgIAkJLy8gdGhhdCBtZWFucyB0aGUgbW9kdWxlIGlzIGF0dGFjaGVkIHRvIG9uZSBzZXJ2ZXIgdGhlbiBmaW5kcyBpdCBpZCBhbmQgYSBtYXRjaGluIGV4dGVuc2lvbiBvciBnaXZlIGEgbWVzc2FnZQotICAgCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgCXsKLQkJICAgCVN0cmluZyBpZCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiZmFjdG9yeUlkIik7Ci0gICAgCSAgIAlpZiAoIHR5cGVJZHNbMF0uZXF1YWxzKGlkKSkKLQkJICAgCXsKLQkJICAgCQl0aGVBY3Rpb24gPSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkgICAJCWJyZWFrOwotCQkgICAJfQotICAgCQl9Ci0gICAJCWlmICh0aGVBY3Rpb24gPT0gbnVsbCApCi0gICAJCQl7Ci0gICAJCQkJLy8gZ2l2ZSBhIG1lc3NhZ2UKLSAgIAkJCX0KLSAgIAl9Ci0gICAJZWxzZQotICAgCXsKLQkJLy8gVGhlIG1vZHVsZSBpcyBhdHRhY2hlZCB0byBtb3JlIHRoYW4gb25lIHNlcnZlciBmaW5kIHRoZSBmaXJzdCBzZXJ2ZXItZXh0ZW5zaW9uIGNvdXBsZQotCQkvLyBUQkQ6IGFkZCBhIGRpYWxvZyB0byBjaG9vc2UgdGhlIHNlcnZlciBmb3IgZGVwbG95bWVudAotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgCXsKLQkJICAgCVN0cmluZyBpZCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiZmFjdG9yeUlkIik7Ci0JCSAgIAlmb3IgKCBpbnQgaz0wOyBrPCB0eXBlSWRzLmxlbmd0aDsgaysrKQotCQkgICAJewotICAgIAkgICAJCWlmICggdHlwZUlkc1trXS5lcXVhbHMoaWQpKQotCQkgICAJCXsKLQkJICAgCQkJdGhlQWN0aW9uID0gZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJICAgCQkJYnJlYWs7Ci0JCSAgIAkJfQotCQkgICAJfQotCQkgICBpZiAodGhlQWN0aW9uICE9IG51bGwpIGJyZWFrOwotICAgCQkgfQotCQlpZiAodGhlQWN0aW9uID09IG51bGwpIAotCQkJewotCQkJCS8vIGdpdmUgYSBNZXNzYWdlCi0JCQl9Ci0gICAJfQotCi0gICAgaWYgKHRoZUFjdGlvbiBpbnN0YW5jZW9mIFdlYlNlcnZpY2VEZXBsb3kpCi0gICAgICAgICAgKChXZWJTZXJ2aWNlRGVwbG95KXRoZUFjdGlvbikucnVuKHByb2plY3QpOyAgIAotICB9Ci0KLSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotfQotIAotCi0JcHJpdmF0ZSBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCi0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHByb2plY3QpOwotCQlpZiAobW9kdWxlcyE9bnVsbCAmJiBtb2R1bGVzLmxlbmd0aCE9MCkgewotCQkJcmV0dXJuIG1vZHVsZXNbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotIAl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XaW5kb3dBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2luZG93QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ZTI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XaW5kb3dBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdpbmRvd0FjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi1wdWJsaWMgV2luZG93QWN0aW9uRGVsZWdhdGUoKSB7Ci0gICAgc3VwZXIoKTsKLSB9Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSAKLSB7Ci0gfQotCi1wdWJsaWMgdm9pZCBpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7IH0KLQotcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICBmU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gfQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLX0KLXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JcmV0dXJuIGZTZWxlY3Rpb247Ci19Ci0KLXB1YmxpYyBJUHJvamVjdCBnZXRTZWxlY3RlZFJlc291cmNlUHJvamVjdCgpIHsKLSBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSBJUmVzb3VyY2UgcmVzb3VyY2VfID0gbnVsbDsKLSAgIHRyeSB7Ci0gICAJCWlmIChmU2VsZWN0aW9uICE9IG51bGwgJiYgZlNlbGVjdGlvbi5zaXplKCkgPT0gMSkgICAgewotICAgICAgCQlPYmplY3Qgb2JqID0gZlNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgCQlpZiAob2JqICE9IG51bGwpICAgIHsKLSAgICAgIAkJCWlmICggb2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSAKLSAgICAgIAkJCQl7Ci0gICAgICAJCQkJCXJlc291cmNlXyA9IChJUmVzb3VyY2UpIG9iajsKLSAgICAgIAkJCQl9Ci0gICAgICAJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQotICAgICAgCQkJewotICAgICAgICAJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBVbml0ID0gKElDb21waWxhdGlvblVuaXQpb2JqOwotICAgICAgICAJCQlyZXNvdXJjZV89IGNvbXBVbml0LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotICAgICAgCQkJfQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCQlwcm9qZWN0ID0gKChJSmF2YVByb2plY3QpIG9iaikuZ2V0UHJvamVjdCgpOwotCQkJCX0KLQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQkJCQl9Ci0KLSAgICAgIAkJCWlmICggcmVzb3VyY2VfICE9IG51bGwgKQotICAgCQkJCQlwcm9qZWN0ID0gcmVzb3VyY2VfLmdldFByb2plY3QoKTsKLSAgICAgICAgIAkJCi0gICAgCQl9Ci0gICAJCX0KLSAgIAl9CQotICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgcmV0dXJuIHByb2plY3Q7Ci0gfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9EaWFsb2dSZXNvdXJjZUJyb3dzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0RpYWxvZ1Jlc291cmNlQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGZmYjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0RpYWxvZ1Jlc291cmNlQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0qIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkaWFsb2cgZm9yIGJyb3dzaW5nIHdvcmtzcGFjZSByZXNvdXJjZXMuCi0qIFNlZSBhbHNvIHtAbGluayBEaWFsb2dVdGlscyNicm93c2VSZXNvdXJjZXN9LgotKi8KLXB1YmxpYyBjbGFzcyBEaWFsb2dSZXNvdXJjZUJyb3dzZXIgZXh0ZW5kcyBEaWFsb2cKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9SRVNPVVJDRV9UUkVFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5EUkVTMDAwMSI7Ci0KLSAgcHJpdmF0ZSBTaGVsbCBzaGVsbF87Ci0gIHByaXZhdGUgSVJlc291cmNlIHJvb3RfOwotICBwcml2YXRlIElGaWx0ZXJbXSBmaWx0ZXJzXzsKLSAgcHJpdmF0ZSBib29sZWFuIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF87Ci0gIHByaXZhdGUgSVJlc291cmNlW10gc2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBUcmVlIHJlc291cmNlVHJlZV87Ci0gIHByaXZhdGUgVHJlZVZpZXdlciBmaWxlVmlld2VyXzsKLQotICBwdWJsaWMgRGlhbG9nUmVzb3VyY2VCcm93c2VyKFNoZWxsIHNoZWxsLCBJUmVzb3VyY2Ugcm9vdCwgSUZpbHRlciBmaWx0ZXIpCi0gIHsKLSAgICB0aGlzKHNoZWxsLCByb290LCBuZXcgSUZpbHRlcltde2ZpbHRlcn0pOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5EaWFsb2dSZXNvdXJjZUJyb3dzZXI8L2NvZGU+Ci0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnBhcmVudCBTaGVsbDwvY29kZT4uCi0gICogVGhlIGRpYWxvZyByZW5kZXJzIGFsbCByZXNvdXJjZXMgaW5jbHVkaW5nIGFuZAotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5yb290IElSZXNvdXJjZTwvY29kZT4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsfS4KLSAgKiBvciBudWxsIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbCBzaGVsbC4KLSAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSwKLSAgKiBvciBudWxsIHRvIGJlZ2luIHdpdGggdGhlIHdvcmtzcGFjZSByb290LgotICAqIEBwYXJhbSBmaWx0ZXJzIEFuIGFycmF5IG9mIGphdmEubGFuZy5TdHJpbmcKLSAgKi8KLSAgcHVibGljIERpYWxvZ1Jlc291cmNlQnJvd3NlcihTaGVsbCBzaGVsbCwgSVJlc291cmNlIHJvb3QsIElGaWx0ZXJbXSBmaWx0ZXJzKQotICB7Ci0gICAgc3VwZXIoc2hlbGwpOwotICAgIHNoZWxsXyA9IHNoZWxsOwotCi0gICAgSVJlc291cmNlIG1vZHVsZVJvb3QgPSByb290OwotICAgIGlmIChyb290IGluc3RhbmNlb2YgSVByb2plY3QpCi0gICAgewotICAgICAgSVByb2plY3QgcCA9IChJUHJvamVjdCltb2R1bGVSb290OwotICAgICAgSjJFRU5hdHVyZSBuYXR1cmUgPSAoSjJFRU5hdHVyZSkgSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZShwKTsKLSAgICAgIGlmIChuYXR1cmUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbW9kdWxlUm9vdCA9IG5hdHVyZS5nZXRNb2R1bGVTZXJ2ZXJSb290KCk7Ci0gICAgICB9Ci0gICAgCi0gICAgfQotCi0gICAgcm9vdF8gPSAobW9kdWxlUm9vdCA9PSBudWxsKSA/IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkgOiBtb2R1bGVSb290OwotICAgIGZpbHRlcnNfID0gKGZpbHRlcnMgPT0gbnVsbCkgPyBuZXcgSUZpbHRlclswXSA6IGZpbHRlcnM7Ci0gICAgbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXyA9IGZhbHNlOwotICAgIHNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0gIH0KLQotICAvKioKLSAgKiBFbmFibGVzIG9yIGRpc2FibGVzIG11bHRpcGxlIHNlbGVjdGlvbiBpbiB0aGUgdHJlZSB2aWV3LgotICAqIE11bHRpcGxlIHNlbGVjdGlvbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAqIEBwYXJhbSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQgVHJ1ZSB0byBlbmFibGVkIG9yIGZhbHNlIHRvIGRpc2FibGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZChib29sZWFuIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZCkKLSAgewotICAgIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF8gPSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQ7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIG1hZGUgaW4gdGhlIGRpYWxvZyBpZiBPSyB3YXMgcHJlc3NlZCwKLSAgKiBvciBudWxsIGlmIENhbmNlbCB3YXMgcHJlc3NlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBkaWFsb2cKLSAgKiBoYXMgbmV2ZXIgYmVlbiBvcGVuZWQuCi0gICogQHJldHVybiBBbiBhcnJheSBvZiBzZWxlY3RlZCByZXNvdXJjZXMsIHBvc3NpYmx5IGVtcHR5LCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgSVJlc291cmNlW10gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25fOwotICB9Ci0KLSAgcHVibGljIElSZXNvdXJjZSBnZXRGaXJzdFNlbGVjdGlvbigpCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uXyAhPSBudWxsICYmIHNlbGVjdGlvbl8ubGVuZ3RoID4gMCkKLSAgICAgIHJldHVybiBzZWxlY3Rpb25fWzBdOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBDYW5jZWwgYnV0dG9uIGlzIHByZXNzZWQuCi0gICogSW5zdXJlcyB0aGF0IHtAbGluayAjZ2V0UmVzdWx0fSB3aWxsIHJldHVybiBudWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkKLSAgewotICAgIHNlbGVjdGlvbl8gPSBudWxsOwotICAgIHNldFJldHVybkNvZGUoRGlhbG9nLkNBTkNFTCk7Ci0gICAgc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBwcmVzc2VkLgotICAqIFNxdWlycmVscyBhd2F5IHRoZSBsaXN0IG9mIHplcm8gb3IgbW9yZSBzZWxlY3RlZAotICAqIDxjb2RlPklSZXNvdXJjZTwvY29kZT5zIHRvIGJlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UmVzdWx0fS4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkKLSAgewotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZmlsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgc2VsZWN0aW9uXyA9IG5ldyBJUmVzb3VyY2Vbc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCldOwotICAgICAgaW50IGkgPSAwOwotICAgICAgSXRlcmF0b3IgaXQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICAgIHNlbGVjdGlvbl9baSsrXSA9IChJUmVzb3VyY2Upb2JqZWN0OwotICAgICAgfQotICAgIH0KLSAgICBzZXRSZXR1cm5Db2RlKERpYWxvZy5PSyk7Ci0gICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGx9LgotICAqIEBwYXJhbSBzaGVsbCBUaGUgc2hlbGwuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9SRVNPVVJDRV9CUk9XU0VSIikpOwotICB9Ci0KLSAgLyoqIAotICAqIENyZWF0ZXMgdGhlIGRpYWxvZyBhcmVhLgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0gICogQHJldHVybiBUaGUgY29udHJvbCBhcmVhLgotICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGdkLndpZHRoSGludCA9IDQwMDsKLSAgICBnZC5oZWlnaHRIaW50ID0gMzAwOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBpZiAobXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXykKLSAgICB7Ci0gICAgICByZXNvdXJjZVRyZWVfID0gbmV3IFRyZWUoY29tcG9zaXRlLFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzb3VyY2VUcmVlXyA9IG5ldyBUcmVlKGNvbXBvc2l0ZSxTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgfQotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICBnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgcmVzb3VyY2VUcmVlXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICByZXNvdXJjZVRyZWVfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1JFU09VUkNFX1RSRUUiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXNvdXJjZVRyZWVfLCBJTkZPUE9QX1JFU09VUkNFX1RSRUUpOwotCi0gICAgZmlsZVZpZXdlcl8gPSBuZXcgVHJlZVZpZXdlcihyZXNvdXJjZVRyZWVfKTsKLSAgICBmaWxlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLSAgICBmaWxlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotICAgIGZpbGVWaWV3ZXJfLmFkZEZpbHRlcigKLSAgICAgIG5ldyBWaWV3ZXJGaWx0ZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudE9iamVjdCwgT2JqZWN0IG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKSAmJiAoKElSZXNvdXJjZSlvYmplY3QpLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnNfLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZmlsdGVyc19baV0uYWNjZXB0cyhvYmplY3QpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0SW5wdXQocm9vdF8pOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtc2dJZCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShtc2dJZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0ZpbGVFeHRlbnNpb25GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0ZpbGVFeHRlbnNpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzNTVjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9GaWxlRXh0ZW5zaW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIGNsYXNzIG9mIG9iamVjdHMgdGhhdCBmaWx0ZXIKLSogb3RoZXIgb2JqZWN0cyBmb3IgaW5jbHVzaW9uIG9yIGV4Y2x1c2lvbiBieSBzb21lIGNvbnN1bWVyLgotKi8KLXB1YmxpYyBjbGFzcyBGaWxlRXh0ZW5zaW9uRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlcgotewotICBwcml2YXRlIFN0cmluZ1tdIGV4dGVuc2lvbnNfOwotCi0gIHB1YmxpYyBGaWxlRXh0ZW5zaW9uRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMpCi0gIHsKLSAgICBleHRlbnNpb25zXyA9IChleHRlbnNpb25zICE9IG51bGwpID8gZXh0ZW5zaW9ucyA6IG5ldyBTdHJpbmdbMF07Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS5lZGl0b3IuY29tbW9uLkZpbGVFeHRlbnNpb25GaWx0ZXIiOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkuZWRpdG9yLmNvbW1vbi5GaWxlRXh0ZW5zaW9uRmlsdGVyIjsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LiBUaGlzIG1ldGhvZAotICAqIG11c3QgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYge0BsaW5rICNzdGF0dXNPZn0KLSAgKiByZXR1cm5zIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IHdpdGggYSBzZXZlcml0eSBvZgotICAqIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgewotICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSlvYmplY3Q7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnNfLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoZXh0ZW5zaW9uc19baV0pKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0lGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0lGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1ZGI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9JRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbjsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYSBjbGFzcyBvZiBvYmplY3RzIHRoYXQgZmlsdGVyCi0qIG90aGVyIG9iamVjdHMgZm9yIGluY2x1c2lvbiBvciBleGNsdXNpb24gYnkgc29tZSBjb25zdW1lci4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIKLXsKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gICogYWNjZXB0cyB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4gVGhpcyBtZXRob2QKLSAgKiBtdXN0IHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHtAbGluayAjc3RhdHVzT2Z9Ci0gICogcmV0dXJucyBhbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiB3aXRoIGEgc2V2ZXJpdHkgb2YKLSAgKiBsZXNzIHRoYW4gPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4uCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gICogYWNjZXB0cyB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyhPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL1VJVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL1VJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1ZDIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9VSVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFVJVXRpbHMgCi17Ci0gIFN0cmluZyAgICAgICBpbmZvUG9waWRfOwotICBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICAKLSAgcHVibGljIFVJVXRpbHMoIE1lc3NhZ2VVdGlscyBtc2dVdGlscywgU3RyaW5nIGluZm9Qb3BpZCApCi0gIHsKLSAgICBtc2dVdGlsc18gID0gbXNnVXRpbHM7Ci0gICAgaW5mb1BvcGlkXyA9IGluZm9Qb3BpZDsKLSAgfQotICAKLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbiggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAgIHJldHVybiBjcmVhdGVCdXR0b24oIFNXVC5SQURJTywgcGFyZW50LCBsYWJlbE5hbWUsIHRvb2x0aXAsIGluZm9wb3AgKTsKLSAgfQotICAKLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAgIHJldHVybiBjcmVhdGVCdXR0b24oIFNXVC5DSEVDSywgcGFyZW50LCBsYWJlbE5hbWUsIHRvb2x0aXAsIGluZm9wb3AgKTsKLSAgfQotICAKLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxOYW1lLCBTdHJpbmcgdG9vbHRpcCwgU3RyaW5nIGluZm9wb3AgKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUJ1dHRvbiggU1dULk5PTkUsIHBhcmVudCwgbGFiZWxOYW1lLCB0b29sdGlwLCBpbmZvcG9wICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlQnV0dG9uKCBpbnQga2luZCwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIGtpbmQgKTsKLSAgICAKLSAgICB0b29sdGlwID0gdG9vbHRpcCA9PSBudWxsID8gbGFiZWxOYW1lIDogdG9vbHRpcDsKLSAgICBidXR0b24uc2V0VGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIGxhYmVsTmFtZSApICk7Ci0gICAgYnV0dG9uLnNldFRvb2xUaXBUZXh0KCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggdG9vbHRpcCApICk7Ci0gICAgCi0gICAgaWYoIGluZm9wb3AgIT0gbnVsbCApIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIGJ1dHRvbiwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0gIAotICBwdWJsaWMgQ29tYm8gY3JlYXRlQ29tYm8oIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbE5hbWUsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCwgaW50IHN0eWxlICkKLSAgeyAgICAKLSAgICB0b29sdGlwID0gdG9vbHRpcCA9PSBudWxsID8gbGFiZWxOYW1lIDogdG9vbHRpcDsKLSAgICAKLSAgICBpZiggbGFiZWxOYW1lICE9IG51bGwgKQotICAgIHsKLSAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5XUkFQKTsKLSAgICAgIGxhYmVsLnNldFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCBsYWJlbE5hbWUgKSApOwotICAgICAgbGFiZWwuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCB0b29sdGlwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oIHBhcmVudCwgc3R5bGUgKTsKLSAgICBHcmlkRGF0YSBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgICAKLSAgICBjb21iby5zZXRMYXlvdXREYXRhKCBncmlkZGF0YSApOwotICAgIGNvbWJvLnNldFRvb2xUaXBUZXh0KCBtc2dVdGlsc18uZ2V0TWVzc2FnZSh0b29sdGlwKSk7Ci0gICAgCi0gICAgaWYoIGluZm9wb3AgIT0gbnVsbCApIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIGNvbWJvLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCApOwotICAgIAotICAgIHJldHVybiBjb21ibzsgICAgICAKLSAgfQotICAKLSAgcHVibGljIFRleHQgY3JlYXRlVGV4dCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wLCBpbnQgc3R5bGUgKQotICB7ICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyBsYWJlbE5hbWUgOiB0b29sdGlwOwotICAgIAotICAgIGlmKCBsYWJlbE5hbWUgIT0gbnVsbCApCi0gICAgewotICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULldSQVApOwotICAgICAgbGFiZWwuc2V0VGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIGxhYmVsTmFtZSApICk7Ci0gICAgICBsYWJlbC5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIHRvb2x0aXAgKSApOwotICAgIH0KLSAgICAKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dCggcGFyZW50LCBzdHlsZSApOwotICAgIEdyaWREYXRhIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgCi0gICAgdGV4dC5zZXRMYXlvdXREYXRhKCBncmlkZGF0YSApOwotICAgIHRleHQuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKHRvb2x0aXApKTsKLSAgICAKLSAgICBpZiggaW5mb3BvcCAhPSBudWxsICkgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggdGV4dCwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gdGV4dDsgICAgICAKLSAgfQotICAKLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoIENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5zICkKLSAgewotICAgIHJldHVybiBjcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgY29sdW1ucywgLTEsIC0xICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKCBDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucywgaW50IG1hcmdpbkhlaWdodCwgaW50IG1hcmdpbldpZHRoICkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgCi0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ICAgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRsYXlvdXQubnVtQ29sdW1ucyAgID0gY29sdW1uczsKLSAgCi0gICAgaWYoIG1hcmdpbkhlaWdodCA+PSAwICkgZ3JpZGxheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQ7Ci0gICAgaWYoIG1hcmdpbldpZHRoID49IDAgKSAgZ3JpZGxheW91dC5tYXJnaW5XaWR0aCAgPSBtYXJnaW5XaWR0aDsKLSAgICAKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBncmlkbGF5b3V0ICk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggZ3JpZGRhdGEgKTsKLSAgICAKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIAotICB9Ci0gIHB1YmxpYyBHcm91cCBjcmVhdGVHcm91cCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAJcmV0dXJuIGNyZWF0ZUdyb3VwKCBwYXJlbnQsIGdyb3VwTmFtZSwgdG9vbHRpcCwgaW5mb3BvcCwgMSwgLTEsIC0xICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBHcm91cCBjcmVhdGVHcm91cCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wLCBpbnQgY29sdW1ucywgaW50IG1hcmdpbkhlaWdodCwgaW50IG1hcmdpbldpZHRoICkKLSAgewotICAgIEdyb3VwICAgICAgbmV3R3JvdXAgICAgPSBuZXcgR3JvdXAoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICBHcmlkRGF0YSAgIGdyaWRkYXRhICAgID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ICA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgCi0gICAgZ3JpZGxheW91dC5udW1Db2x1bW5zICA9IGNvbHVtbnM7Ci0gIAotICAgIGlmKCBtYXJnaW5IZWlnaHQgPj0gMCApIGdyaWRsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotICAgIGlmKCBtYXJnaW5XaWR0aCA+PSAwICkgIGdyaWRsYXlvdXQubWFyZ2luV2lkdGggID0gbWFyZ2luV2lkdGg7Ci0gICAgICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyBncm91cE5hbWUgOiB0b29sdGlwOwotICAgIG5ld0dyb3VwLnNldExheW91dCggZ3JpZGxheW91dCApOwotICAgIG5ld0dyb3VwLnNldFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCBncm91cE5hbWUgKSApOwotICAgIG5ld0dyb3VwLnNldExheW91dERhdGEoIGdyaWRkYXRhICk7Ci0gICAgbmV3R3JvdXAuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCB0b29sdGlwICkpOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5ld0dyb3VwLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCk7Ci0gICAgCi0gICAgcmV0dXJuIG5ld0dyb3VwOwotICB9Ci0gIAotICBwdWJsaWMgVHJlZSBjcmVhdGVUcmVlKCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdG9vbHRpcCwgU3RyaW5nIGluZm9wb3AsIGludCBzdHlsZSApCi0gIHsKLSAgICAKLSAgICB0b29sdGlwID0gdG9vbHRpcCA9PSBudWxsID8gIiIgOiB0b29sdGlwOwotICAgIAotICAgIFRyZWUgdHJlZSA9IG5ldyBUcmVlKCBwYXJlbnQsIHN0eWxlICk7Ci0gICAgIAotICAgIHRyZWUuc2V0TGF5b3V0RGF0YSggY3JlYXRlRmlsbEFsbCgpICk7Ci0gICAgdHJlZS5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UodG9vbHRpcCkpOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCB0cmVlLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCApOwotICAgIAotICAgIHJldHVybiB0cmVlOyAgICAgIAotICAgIAotICB9Ci0gIAotICBwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCwgaW50IHN0eWxlICkKLSAgewotICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyAiIiA6IHRvb2x0aXA7Ci0gICAgCi0gICAgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoIHBhcmVudCwgc3R5bGUgKTsKLSAgICAgCi0gICAgLy90YWJsZS5zZXRMYXlvdXREYXRhKCBjcmVhdGVGaWxsQWxsKCkgKTsKLSAgICB0YWJsZS5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UodG9vbHRpcCkpOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCB0YWJsZSwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gdGFibGU7ICAgICAgCi0gICAgCi0gIH0gIAotICAKLSAgcHVibGljIExhYmVsIGNyZWF0ZUhvcml6b250YWxTZXBhcmF0b3IoIENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFjaW5nICkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMSwgc3BhY2luZywgLTEgKTsKLSAgICAgCi0JTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCApOwotCQotCUdyaWREYXRhIGdyaWRkYXRhICA9IG5ldyBHcmlkRGF0YSggR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMICk7Ci0Jc2VwYXJhdG9yLnNldExheW91dERhdGEoIGdyaWRkYXRhICk7Ci0gICAKLQlyZXR1cm4gc2VwYXJhdG9yOwotICB9Ci0gIAotICBwdWJsaWMgR3JpZERhdGEgY3JlYXRlRmlsbEFsbCgpCi0gIHsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfAotCQkJICAgICAgICAgICAgICAgICAgICAgIEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCApOwotICAgIHJldHVybiBkYXRhOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9EaWFsb2dVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9kaWFsb2cvRGlhbG9nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlYWYwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9EaWFsb2dVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lclNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLQotCi0vKioKLSogQ29udGFpbnMgdXRpbGl0eSBtZXRob2RzIGZvciBsYXVuY2hpbmcgdmFyaW91cyBjb21tb24gZGlhbG9ncy4KLSovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlhbG9nVXRpbHMKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgY29udGFpbmVycy4KLSAgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCwgb3B0aW9uYWxseSBudWxsLgotICAqIEBwYXJhbSBpbml0aWFsUGF0aG5hbWUgVGhlIGluaXRpYWwgc2VsZWN0aW9uLgotICAqIEByZXR1cm4gVGhlIHNlbGVjdGVkIGNvbnRhaW5lciBvciBudWxsIGlmIHRoZSBkaWFsb2cKLSAgKiBpcyBjYW5jZWxsZWQsIG9yIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiwgb3IgdGhlIHNlbGVjdGlvbgotICAqIGlzIG5vdCBhIHByb2plY3Qgb3IgYSBmb2xkZXIuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUNvbnRhaW5lcnMgKCBTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGluaXRpYWxQYXRobmFtZSApCi0gIHsKLSAgICBTdHJpbmcgc2VsZWN0ZWRQYXRobmFtZSA9IG51bGw7Ci0gICAgSVBhdGggaW5pdGlhbFBhdGggPSBuZXcgUGF0aChpbml0aWFsUGF0aG5hbWUpOwotICAgIElSZXNvdXJjZSBpbml0aWFsUmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKGluaXRpYWxQYXRoKTsKLSAgICBpZiAoaW5pdGlhbFJlc291cmNlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGluaXRpYWxQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIGluaXRpYWxSZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoaW5pdGlhbFBhdGguc2VnbWVudCgwKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbml0aWFsUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0gICAgICB7Ci0gICAgICAgIGluaXRpYWxSZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZvbGRlcihpbml0aWFsUGF0aCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW5pdGlhbFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgaW5pdGlhbFJlc291cmNlID0gaW5pdGlhbFJlc291cmNlLmdldFBhcmVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyhwYXJlbnRTaGVsbCwoSUNvbnRhaW5lcilpbml0aWFsUmVzb3VyY2UsdHJ1ZSxudWxsKTsKLSAgICBkaWFsb2cub3BlbigpOwotICAgIE9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCA+IDApCi0gICAgewotICAgICAgaWYgKHJlc3VsdFswXSBpbnN0YW5jZW9mIElQYXRoKQotICAgICAgewotICAgICAgICBJUGF0aCBwYXRoID0gKElQYXRoKXJlc3VsdFswXTsKLSAgICAgICAgc2VsZWN0ZWRQYXRobmFtZSA9IHBhdGgudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNlbGVjdGVkUGF0aG5hbWU7Ci0gIH0KLQotICAvKioKLSAgKiBSYWlzZXMgYSBkaWFsb2cgZm9yIGJyb3dzaW5nIHJlc291cmNlcy4KLSAgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCwgb3B0aW9uYWxseSBudWxsLgotICAqIEBwYXJhbSB0b3BSZXNvdXJjZSBUaGUgcmVzb3VyY2UgdW5kZXIgd2hpY2ggdG8gYnJvd3NlLgotICAqIElmIG51bGwsIGFsbCByZXNvdXJjZXMgaW4gdGhlIHdvcmtzcGFjZSBhcmUgYnJvd3NlZC4KLSAgKiBAcGFyYW0gaW5pdGlhbFNlbGVjdGlvbiBUaGUgaW5pdGlhbCBzZWxlY3Rpb24sIG9yIG51bGwgZm9yIG5vbmUuCi0gICogSWYgdGhlIGluaXRpYWwgc2VsZWN0aW9uIGlzIG5vdCBudWxsIGFuZCBleGlzdHMgaW4gdGhlIHNldCBvZgotICAqIHJlc291cmNlcyBmb3VuZCBieSB0aGUgYnJvd3NlciwgdGhhdCByZXNvdXJjZSBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LgotICAqIEBwYXJhbSBmaWx0ZXIgVGhlIHJlc291cmNlIGZpbHRlciBvYmplY3QuCi0gICogQHJldHVybiBUaGUgc2VsZWN0ZWQgcmVzb3VyY2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGJyb3dzZVJlc291cmNlcyAoIFNoZWxsIHBhcmVudFNoZWxsLCBJUmVzb3VyY2UgdG9wUmVzb3VyY2UsIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uLCBGaWx0ZXIgZmlsdGVyKQotICB7Ci0gICAgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgcmRzID0gbmV3IFJlc291cmNlU2VsZWN0aW9uRGlhbG9nKHBhcmVudFNoZWxsLHRvcFJlc291cmNlLGluaXRpYWxTZWxlY3Rpb24sZmlsdGVyKTsKLSAgICByZHMuc2V0TXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkKGZhbHNlKTsKLSAgICBpZiAocmRzLm9wZW4oKSA9PSBEaWFsb2cuT0spCi0gICAgewotICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gcmRzLmdldFJlc3VsdCgpOwotICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlcy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VzWzBdOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIDxiPkltcGxlbWVudGF0aW9uIHJlbWFpbnMgVEJELjwvYj48YnI+Ci0gICogUmFpc2VzIGEgZGlhbG9nIGZvciBicm93c2luZyBjbGFzc2VzIG9uIGEgcHJvamVjdCdzIGNsYXNzIHBhdGguCi0gICogQHBhcmFtIHBhcmVudFNoZWxsIFRoZSBwYXJlbnQgc2hlbGwsIG9wdGlvbmFsbHkgbnVsbC4KLSAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdC4KLSAgKiBAcmV0dXJuIFRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgamF2YSBjbGFzcy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQ2xhc3NlcyAoIFNoZWxsIHBhcmVudFNoZWxsLCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgewotICAgIHJldHVybiBicm93c2VDbGFzc2VzKHBhcmVudFNoZWxsLCBwcm9qZWN0LCAoSVJ1bm5hYmxlQ29udGV4dCludWxsKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUNsYXNzZXMgKCBTaGVsbCBwYXJlbnRTaGVsbCwgSVByb2plY3QgcHJvamVjdCwgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIpCi0gIHsKLSAgICByZXR1cm4gYnJvd3NlQ2xhc3NlcyhwYXJlbnRTaGVsbCwgcHJvamVjdCwgKElSdW5uYWJsZUNvbnRleHQpY29udGFpbmVyKTsKLSAgfQotCi0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgY2xhc3NlcyBvbiBhIHByb2plY3QncyBjbGFzcyBwYXRoLgotICAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsLCBvcHRpb25hbGx5IG51bGwuCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuCi0gICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBsYXVuY2hpbmcgd2l6YXJkLgotICAqIEByZXR1cm4gVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWxlY3RlZCBqYXZhIGNsYXNzLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VDbGFzc2VzICggU2hlbGwgcGFyZW50U2hlbGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUnVubmFibGVDb250ZXh0IGN0eHQpIAotICB7Ci0gICAgcmV0dXJuIGJyb3dzZUNsYXNzZXMocGFyZW50U2hlbGwsIG5ldyBJUmVzb3VyY2VbXSB7cHJvamVjdH0sIGN0eHQpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VDbGFzc2VzKFNoZWxsIHBhcmVudFNoZWxsLCBJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElSdW5uYWJsZUNvbnRleHQgY3R4dCkKLSAgewotICAgIElUeXBlIGl0eXBlID0gYnJvd3NlQ2xhc3Nlc0FzSVR5cGUocGFyZW50U2hlbGwsIHJlc291cmNlcywgY3R4dCk7Ci0gICAgaWYgKGl0eXBlICE9IG51bGwpCi0gICAgICByZXR1cm4gaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgSVR5cGUgYnJvd3NlQ2xhc3Nlc0FzSVR5cGUoU2hlbGwgcGFyZW50U2hlbGwsIElSZXNvdXJjZVtdIHJlc291cmNlcywgSVJ1bm5hYmxlQ29udGV4dCBjdHh0KQotICB7Ci0JVmVjdG9yIGphdmFFbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykKLQl7Ci0JICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2VzW2ldKTsKLQkgIGlmIChqYXZhRWxlbWVudCAhPSBudWxsKQotCSAgICBqYXZhRWxlbWVudHMuYWRkKGphdmFFbGVtZW50KTsKLQl9Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSAoSUphdmFFbGVtZW50W10pamF2YUVsZW1lbnRzLnRvQXJyYXkobmV3IElKYXZhRWxlbWVudFswXSk7Ci0JCi0gICAgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotICAgIHNjb3BlLnNldEluY2x1ZGVzQ2xhc3NwYXRocyh0cnVlKTsKLSAgICBzY29wZS5zZXRJbmNsdWRlc0JpbmFyaWVzKHRydWUpOwotCi0gICAgLy9DcmVhdGluZyBhbmQgb3BlbmluZyBhIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSAgICB0cnkKLQl7Ci0gICAgICBTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2cocGFyZW50U2hlbGwsIGN0eHQsIHNjb3BlLCBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgZmFsc2UpOwotICAgICAgZGlhbG9nLnNldFRpdGxlKFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlRElBTE9HX1RJVExFX0NMQVNTX0JST1dTRSIpKTsKLSAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlRElBTE9HX1RJVExFX0NMQVNTX0JST1dTRSIpKTsgICAgCi0gICAgICBkaWFsb2cub3BlbigpOwotCi0gICAgICAvL0dldHRpbmcgdGhlIHJlc3VsdCBhbmQgcmV0dXJuaW5nIGl0Ci0gICAgICBPYmplY3RbXSByZXN1bHRzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgaWYgKHJlc3VsdHMgIT0gbnVsbCAmJiByZXN1bHRzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXN1bHRzWzBdIGluc3RhbmNlb2YgSVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKElUeXBlKXJlc3VsdHNbMF07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpCi0JewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgaW50ZXJmYWNlcyBvbiBhIHByb2plY3QncyBjbGFzcyBwYXRoLgotICAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsLCBvcHRpb25hbGx5IG51bGwuCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuCi0gICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBsYXVuY2hpbmcgd2l6YXJkLgotICAqIEByZXR1cm4gVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWxlY3RlZCBqYXZhIGludGVyZmFjZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlSW50ZXJmYWNlcyggU2hlbGwgcGFyZW50U2hlbGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIpIAotICAJCQkJCQkJCQkgICAgCi0gIHsKLSAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IG51bGw7Ci0KLSAgICAvL0xpbWl0aW5nIHNlYXJjaCBzY29wZSB0byB0aGUgcHJvamVjdAotICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbMV07Ci0gICAgcmVzb3VyY2VzWzBdPXByb2plY3Q7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50WzFdOwotCWVsZW1lbnRzWzBdID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlc1swXSk7Ci0gICAgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotICAgIHNjb3BlLnNldEluY2x1ZGVzQ2xhc3NwYXRocyh0cnVlKTsKLSAgICBzY29wZS5zZXRJbmNsdWRlc0JpbmFyaWVzKHRydWUpOwotCi0gICAgLy9DcmVhdGluZyBhbmQgb3BlbmluZyBhIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSAgICB0cnkKLQl7Ci0gICAgCVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZyhwYXJlbnRTaGVsbCwgY29udGFpbmVyLCBzY29wZSwgSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX1RZUEVTLCBmYWxzZSk7Ci0gICAgCWRpYWxvZy5zZXRUaXRsZShXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9JTlRFUkZBQ0VfQlJPV1NFIikpOwotICAgIAlkaWFsb2cuc2V0TWVzc2FnZShXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9JTlRFUkZBQ0VfQlJPV1NFIikpOyAgICAKLSAgICAJZGlhbG9nLm9wZW4oKTsKLQotICAgIAkvL0dldHRpbmcgdGhlIHJlc3VsdCBhbmQgcmV0dXJuaW5nIGl0Ci0gICAgCU9iamVjdFtdIHJlc3VsdHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgCWlmIChyZXN1bHRzICE9IG51bGwgJiYgcmVzdWx0cy5sZW5ndGggPiAwKQotICAgIAl7Ci0gICAgCQlpZiAocmVzdWx0c1swXSBpbnN0YW5jZW9mIElUeXBlKQotICAgIAkJewotICAgIAkJCUlUeXBlIHJlc3VsdEludGVyZmFjZSA9IChJVHlwZSlyZXN1bHRzWzBdOwotICAgIAkJCWludGVyZmFjZU5hbWUgPSByZXN1bHRJbnRlcmZhY2UuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpCi0JewotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW50ZXJmYWNlTmFtZTsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvZGlhbG9nL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQ3OGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvZGlhbG9nL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkFueUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLQotLyoqCi0qIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkaWFsb2cgZm9yIGJyb3dzaW5nIHdvcmtzcGFjZSByZXNvdXJjZXMuCi0qIFNlZSBhbHNvIHtAbGluayBEaWFsb2dVdGlscyNicm93c2VSZXNvdXJjZXN9LgotKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIExpc3RlbmVyCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8vCi0gIC8vIERpYWxvZyBjb250cm9scy4KLSAgLy8KLSAgcHJpdmF0ZSBMYWJlbCBmaWx0ZXJMYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gZmlsdGVyQ29tYm9fOwotICAvKkNPTlRFWFRfSUQgRFJFUzAwMDEgZm9yIHRoZSBSZXNvdXJjZSBUeXBlIGNvbWJvIGJveCBvZiB0aGUgUmVzb3VyY2UgU2VsZWN0aW9uIERpYWxvZyovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUE9QX0RSRVNfQ09NQk9fUkVTT1VSQ0VfVFlQRSA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuRFJFUzAwMDEiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFRJUF9EUkVTX0NPTUJPX1JFU09VUkNFX1RZUEUgPSAiJVRPT0xUSVBfRFJFU19DT01CT19SRVNPVVJDRV9UWVBFIjsKLSAgLy8KLSAgcHJpdmF0ZSBUcmVlIHJlc291cmNlVHJlZV87Ci0gIHByaXZhdGUgVHJlZVZpZXdlciBmaWxlVmlld2VyXzsKLSAgLypDT05URVhUX0lEIERSRVMwMDAyIGZvciB0aGUgUmVzb3VyY2UgdHJlZSBvZiB0aGUgUmVzb3VyY2UgU2VsZWN0aW9uIERpYWxvZyovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUE9QX0RSRVNfVFJFRV9SRVNPVVJDRSA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuRFJFUzAwMDIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFRJUF9EUkVTX1RSRUVfUkVTT1VSQ0UgPSAiJVRPT0xUSVBfRFJFU19UUkVFX1JFU09VUkNFIjsKLQotICAvLwotICAvLyBFc3NlbnRpYWwgZ29vZGllcy4KLSAgLy8KLSAgcHJpdmF0ZSBTaGVsbCBzaGVsbF87Ci0gIHByaXZhdGUgSVJlc291cmNlIHJvb3RfOwotICBwcml2YXRlIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBGaWx0ZXJbXSBmaWx0ZXJzXzsKLSAgcHJpdmF0ZSBGaWx0ZXIgY3VycmVudEZpbHRlcl87Ci0gIHByaXZhdGUgSVJlc291cmNlW10gc2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF87Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZzwvY29kZT4KLSAgKiB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cGFyZW50IFNoZWxsPC9jb2RlPi4KLSAgKiBUaGUgZGlhbG9nIHJlbmRlcnMgYWxsIHJlc291cmNlcyBpbmNsdWRpbmcgYW5kCi0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnJvb3QgSVJlc291cmNlPC9jb2RlPi4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsfSwKLSAgKiBvciBudWxsIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbCBzaGVsbC4KLSAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSwKLSAgKiBvciBudWxsIHRvIGJlZ2luIHdpdGggdGhlIHdvcmtzcGFjZSByb290LgotICAqIEBwYXJhbSBpbml0aWFsU2VsZWN0aW9uIFRoZSBpbml0aWFsbHkgc2VsZWN0ZWQgb2JqZWN0IG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nICggU2hlbGwgcGFyZW50LCBJUmVzb3VyY2Ugcm9vdCwgSVJlc291cmNlIGluaXRpYWxTZWxlY3Rpb24gKQotICB7Ci0gICAgdGhpcyhwYXJlbnQscm9vdCxpbml0aWFsU2VsZWN0aW9uLG5ldyBGaWx0ZXJbXSB7bmV3IEFueUZpbHRlcigpfSk7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nPC9jb2RlPgotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5wYXJlbnQgU2hlbGw8L2NvZGU+LgotICAqIFRoZSBkaWFsb2cgcmVuZGVycyBhbGwgcmVzb3VyY2VzIGluY2x1ZGluZyBhbmQKLSAgKiB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cm9vdCBJUmVzb3VyY2U8L2NvZGU+IHRoYXQKLSAgKiBhcmUgYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlci4KLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyI2FjY2VwdHN9LgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGx9LAotICAqIG9yIG51bGwgdG8gY3JlYXRlIGEgdG9wLWxldmVsIHNoZWxsLgotICAqIEBwYXJhbSByb290IFRoZSByb290IHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9LAotICAqIG9yIG51bGwgdG8gYmVnaW4gd2l0aCB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gVGhlIGluaXRpYWxseSBzZWxlY3RlZCBvYmplY3Qgb3IgbnVsbCBpZiBub25lLgotICAqIEBwYXJhbSBmaWx0ZXIgVGhlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcn0sCi0gICogb3IgbnVsbCB0byBkZWZhdWx0IHRvIGFsbCByZXNvdXJjZXMgdW5kZXIgdGhlIDxjb2RlPnJvb3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgKCBTaGVsbCBwYXJlbnQsIElSZXNvdXJjZSByb290LCBJUmVzb3VyY2UgaW5pdGlhbFNlbGVjdGlvbiwgRmlsdGVyIGZpbHRlciApCi0gIHsKLSAgICB0aGlzKHBhcmVudCxyb290LGluaXRpYWxTZWxlY3Rpb24sbmV3IEZpbHRlcltdIHtmaWx0ZXJ9KTsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+UmVzb3VyY2VTZWxlY3Rpb25EaWFsb2c8L2NvZGU+Ci0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnBhcmVudCBTaGVsbDwvY29kZT4uCi0gICogVGhlIGRpYWxvZyByZW5kZXJzIGFsbCByZXNvdXJjZXMgaW5jbHVkaW5nIGFuZAotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5yb290IElSZXNvdXJjZTwvY29kZT4gdGhhdAotICAqIGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVycy4KLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyI2FjY2VwdHN9LgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGx9LgotICAqIG9yIG51bGwgdG8gY3JlYXRlIGEgdG9wLWxldmVsIHNoZWxsLgotICAqIEBwYXJhbSByb290IFRoZSByb290IHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9LAotICAqIG9yIG51bGwgdG8gYmVnaW4gd2l0aCB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gVGhlIGluaXRpYWxseSBzZWxlY3RlZCBvYmplY3Qgb3IgbnVsbCBpZiBub25lLgotICAqIEBwYXJhbSBmaWx0ZXJzIEFuIGFycmF5IG9mIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcn0KLSAgKiBvYmplY3RzLgotICAqIElmIHRoZSBhcnJheSBpcyBudWxsIG9yIG9mIGxlbmd0aCB6ZXJvLCB0aGVuIGFsbCByZXNvdXJjZXMgYXJlIGFjY2VwdGVkCi0gICogKGllLiBlcXVpdmFsZW50IHRvIDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nKHBhcmVudCxyb290KTwvY29kZT4uCi0gICogSWYgdGhlIGFycmF5IGlzIG9mIGxlbmd0aCBvbmUsIHRoZW4gdGhlIGRpYWxvZyB3aWxsIGNvbnNpc3Qgb2YgYSBzaW5nbGUKLSAgKiBjb250cm9sIHNob3dpbmcgYSBsaXN0IG9mIGFsbCBmaWx0ZXJlZCByZXNvdXJjZXMuCi0gICogSWYgdGhlIGFycmF5IGlzIG9mIGxlbmd0aCBncmVhdGVyIHRoYW4gb25lLCB0aGVuIHRoZSBkaWFsb2cgd2lsbAotICAqIGNvbnNpc3Qgb2YgYSBjb21ibyBib3ggY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGZpbHRlcnMgYW5kIHdpdGggdGhlCi0gICogZmlyc3QgZmlsdGVyIChpZS4gPGNvZGU+ZmlsdGVyc1swXTwvY29kZT4pIHNlbGVjdGVkIGJ5IGRlZmF1bHQsIGZvbGxvd2VkCi0gICogYnkgYSBjb250cm9sIHNob3dpbmcgYSBsaXN0IG9mIGFsbCByZXNvdXJjZXMgZmlsdGVyZWQgYnkgdGhlIHNlbGVjdGVkIGZpbHRlci4gCi0gICovCi0gIHB1YmxpYyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyAoIFNoZWxsIHBhcmVudCwgSVJlc291cmNlIHJvb3QsIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uLCBGaWx0ZXJbXSBmaWx0ZXJzICkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgc2hlbGxfID0gcGFyZW50OwotICAgIHJvb3RfID0gcm9vdCA9PSBudWxsID8gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkgOiByb290OwotICAgIGluaXRpYWxTZWxlY3Rpb25fID0gaW5pdGlhbFNlbGVjdGlvbjsKLSAgICBmaWx0ZXJzXyA9IChmaWx0ZXJzID09IG51bGwgfHwgZmlsdGVycy5sZW5ndGggPT0gMCkgPyBuZXcgRmlsdGVyW10ge25ldyBBbnlGaWx0ZXIoKX0gOiBmaWx0ZXJzOwotICAgIGN1cnJlbnRGaWx0ZXJfID0gZmlsdGVyc19bMF07Ci0gICAgbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXyA9IGZhbHNlOwotICAgIHNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0gIH0KLQotICAvKioKLSAgKiBFbmFibGVzIG9yIGRpc2FibGVzIG11bHRpcGxlIHNlbGVjdGlvbiBpbiB0aGUgdHJlZSB2aWV3LgotICAqIE11bHRpcGxlIHNlbGVjdGlvbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAqIEBwYXJhbSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQgVHJ1ZSB0byBlbmFibGVkIG9yIGZhbHNlIHRvIGRpc2FibGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZCAoIGJvb2xlYW4gbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkICkKLSAgewotICAgIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF8gPSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQ7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIG1hZGUgaW4gdGhlIGRpYWxvZyBpZiBPSyB3YXMgcHJlc3NlZCwKLSAgKiBvciBudWxsIGlmIENhbmNlbCB3YXMgcHJlc3NlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBkaWFsb2cKLSAgKiBoYXMgbmV2ZXIgYmVlbiBvcGVuZWQuCi0gICogQHJldHVybiBBbiBhcnJheSBvZiBzZWxlY3RlZCByZXNvdXJjZXMsIHBvc3NpYmx5IGVtcHR5LCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgSVJlc291cmNlW10gZ2V0UmVzdWx0ICgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uXzsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBDYW5jZWwgYnV0dG9uIGlzIHByZXNzZWQuCi0gICogSW5zdXJlcyB0aGF0IHtAbGluayAjZ2V0UmVzdWx0fSB3aWxsIHJldHVybiBudWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkICgpCi0gIHsKLSAgICBzZWxlY3Rpb25fID0gbnVsbDsKLSAgICBzZXRSZXR1cm5Db2RlKERpYWxvZy5DQU5DRUwpOwotICAgIHN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgcHJlc3NlZC4KLSAgKiBTcXVpcnJlbHMgYXdheSB0aGUgbGlzdCBvZiB6ZXJvIG9yIG1vcmUgc2VsZWN0ZWQKLSAgKiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+cyB0byBiZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFJlc3VsdH0uCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCAoKQotICB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBmaWxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBzZWxlY3Rpb25fID0gbmV3IElSZXNvdXJjZVtzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKV07Ci0gICAgICBpbnQgaT0wOwotICAgICAgSXRlcmF0b3IgaXRlciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgc2VsZWN0aW9uX1tpKytdID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0UmV0dXJuQ29kZShEaWFsb2cuT0spOwotICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICB9Ci0KLSAgLyoqCi0gICogU2VlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsfS4KLSAgKiBAcGFyYW0gc2hlbGwgVGhlIHNoZWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbCAoIFNoZWxsIHNoZWxsICkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICBzaGVsbC5zZXRUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlRElBTE9HX1RJVExFX1JFU09VUkNFX0JST1dTRSIpKTsKLSAgfQotCi0gIC8qKiAKLSAgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYXJlYS4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlLgotICAqIEByZXR1cm4gVGhlIGNvbnRyb2wgYXJlYS4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYSAoIENvbXBvc2l0ZSBwYXJlbnQgKQotICB7Ci0gICAgR3JpZExheW91dCBnbDsKLSAgICBHcmlkRGF0YSBnZDsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gNDAwOwotICAgIGdkLmhlaWdodEhpbnQgPSAzMDA7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGlmIChmaWx0ZXJzXy5sZW5ndGggPiAxKQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBmID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsU1dULk5PTkUpOwotICAgICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgICAgZi5zZXRMYXlvdXQoZ2wpOwotICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgIGYuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgIGZpbHRlckxhYmVsXyA9IG5ldyBMYWJlbChmLFNXVC5XUkFQKTsKLSAgICAgIGZpbHRlckxhYmVsXy5zZXRUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfUkVTT1VSQ0VfRklMVEVSIikpOwotICAgICAgZmlsdGVyTGFiZWxfLnNldFRvb2xUaXBUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKFRPT0xUSVBfRFJFU19DT01CT19SRVNPVVJDRV9UWVBFKSk7Ci0KLSAgICAgIGZpbHRlckNvbWJvXyA9IG5ldyBDb21ibyhmLFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgICBmaWx0ZXJDb21ib18uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICBmaWx0ZXJDb21ib18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbix0aGlzKTsKLSAgICAgIGZpbHRlckNvbWJvXy5zZXRUb29sVGlwVGV4dChXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShUT09MVElQX0RSRVNfQ09NQk9fUkVTT1VSQ0VfVFlQRSkpOwotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmaWx0ZXJDb21ib18sSU5GT1BPUF9EUkVTX0NPTUJPX1JFU09VUkNFX1RZUEUpOwotICAgIH0KLQotICAgIGlmIChtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWRfKQotICAgIHsKLSAgICAgIHJlc291cmNlVHJlZV8gPSBuZXcgVHJlZShjb21wb3NpdGUsU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXNvdXJjZVRyZWVfID0gbmV3IFRyZWUoY29tcG9zaXRlLFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLSAgICB9Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICByZXNvdXJjZVRyZWVfLnNldExheW91dERhdGEoZ2QpOwotLy8gIHJlc291cmNlVHJlZV8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbix0aGlzKTsKLSAgICByZXNvdXJjZVRyZWVfLnNldFRvb2xUaXBUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKFRPT0xUSVBfRFJFU19UUkVFX1JFU09VUkNFKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXNvdXJjZVRyZWVfLElORk9QT1BfRFJFU19UUkVFX1JFU09VUkNFKTsKLQotICAgIGZpbGVWaWV3ZXJfID0gbmV3IFRyZWVWaWV3ZXIocmVzb3VyY2VUcmVlXyk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0JCQkJICAgICAgICBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCAKLQkJCQkgICAgICAgIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKSk7Ci0gICAgZmlsZVZpZXdlcl8uYWRkRmlsdGVyKAotICAgICAgbmV3IFZpZXdlckZpbHRlciAoKQotICAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QgKCBWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50T2JqZWN0LCBPYmplY3Qgb2JqZWN0ICkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybgotICAgICAgICAgICgKLSAgICAgICAgICAgICgob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKSAmJiAoKElSZXNvdXJjZSlvYmplY3QpLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgIHx8IChSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy50aGlzLmN1cnJlbnRGaWx0ZXJfLmFjY2VwdHMob2JqZWN0KSkKLSAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgICBmaWxlVmlld2VyXy5zZXRJbnB1dChyb290Xyk7Ci0gICAgZmlsZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotICAgICAgbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCAoIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCApCi0gICAgICAgIHsKLS8vICAgICAgICBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy50aGlzLnZhbGlkYXRlUGFnZVRvU3RhdHVzKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uXyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZpbGVWaWV3ZXJfLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy50aGlzLmluaXRpYWxTZWxlY3Rpb25fKSx0cnVlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYW4gZXZlbnQgb2NjdXJzIG9uIHRoZSBwYWdlLgotICAqIEhhbmRsZXMgdGhlIGV2ZW50IGFuZCByZXZhbGlkYXRlcyB0aGUgcGFnZS4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgb2NjdXJlZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKCBFdmVudCBldmVudCApCi0gIHsKLS8vICB2YWxpZGF0ZVBhZ2VUb1N0YXR1cygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3BsdWdpbi9XZWJTZXJ2aWNlVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcGx1Z2luL1dlYlNlcnZpY2VVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTkxNzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcGx1Z2luL1dlYlNlcnZpY2VVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgcGx1Z2luLgotKiA8cD4KLSogVGhpcyBwbHVnaW4gY29udGFpbnMgdGhlIGdyYXBoaWMgdXNlciBpbnRlcmZhY2UgdG8gdGhlCi0qIFdlYiBTZXJ2aWNlcyBydW50aW1lIGZvdW5kIGluIG9yZy5lY2xpcHNlLmpzdC53cy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotCS8vIENvcHlyaWdodAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9Ci0JCSIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLnVpIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VVSVBsdWdpbiBpbnN0YW5jZV87Ci0KLSAgcHJpdmF0ZSBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgYWN0aW9uRGlhbG9nc0NvbnRleHRfOwotICBwcml2YXRlIExvZyBsb2dfOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VVSVBsdWdpbigpIHsKLQlzdXBlcigpOwotCWluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3MudWkiKTsKLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlVUlQbHVnaW4gc2luZ2xldG9uLgotICAqLwotICBzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLQotICBwdWJsaWMgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGdldEFjdGlvbkRpYWxvZ3NDb250ZXh0KCkgCi0gIAl7Ci0gIAkgIGlmIChhY3Rpb25EaWFsb2dzQ29udGV4dF8gPT0gbnVsbCkKLSAgCSAgCXsKLSAgCSAgCQlhY3Rpb25EaWFsb2dzQ29udGV4dF8gPSBuZXcgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0KCk7Ci0gIAkgIAkJYWN0aW9uRGlhbG9nc0NvbnRleHRfLmxvYWQoKTsKLSAgCSAgCX0KLSAgCSAgcmV0dXJuIGFjdGlvbkRpYWxvZ3NDb250ZXh0XzsKLSAgCX0KLQkJCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0gICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgCi0JewotCSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLnVpLnBsdWdpbiIsIGluc3RhbmNlXyApOwotCSAgICAKLQkgICAgaWYoIGtleS5zdGFydHNXaXRoKCIlIikpCi0JICAgIHsKLQkgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKCAxLCBrZXkubGVuZ3RoKCkgKTsKLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIG1zZ1V0aWxzLmdldE1lc3NhZ2Uoa2V5KTsKLSAgICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAgKiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGZvcgotICAqIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICAqIEBwYXJhbSBhcmdzIFRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZQotICAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBtZXNzYWdlIGluIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZAotICAqIGJ5IHRoZSBydWxlcyBvZiBjbGFzcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLSAgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSwgYXJncyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZQotICAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAgKiBAcmV0dXJuIEFuIGltYWdlIGRlc2NyaXB0b3IsIHBvc3NpYmx5IG51bGwuCi0gICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGluc3RhbmNlXy5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIGltYWdlVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBuYW1lKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpblN0YXRlTG9jYXRpb24oKSB7Ci0gICAgcmV0dXJuIFBsYXRmb3JtLmdldFBsdWdpblN0YXRlTG9jYXRpb24odGhpcykudG9PU1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpLmdldEZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMmJhOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkXzsKLQlwdWJsaWMgdm9pZCBzZXRJZCAoU3RyaW5nIGlkKSB7Ci0JCWlkXyA9IGlkOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgIAlyZXR1cm4gaWRfOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIG5hbWVfOwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJbmFtZV8gPSBuYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgCXJldHVybiBuYW1lXzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBpbmZvcG9wXzsKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcG9wIChTdHJpbmcgaW5mb3BvcCkgewotICAgIAlpbmZvcG9wXyA9IGluZm9wb3A7Ci0gICAgCX0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluZm9wb3AgKCkgewotICAgIAlyZXR1cm4gaW5mb3BvcF87Ci0gICAgCX0KLQotCXByaXZhdGUgU3RyaW5nIHRvb2x0aXBfOwotICAgIHB1YmxpYyB2b2lkIHNldFRvb2x0aXAgKFN0cmluZyB0b29sdGlwKSB7Ci0gICAgCXRvb2x0aXBfPSB0b29sdGlwOwotICAgIAl9Ci0gICAgcHVibGljIFN0cmluZyBnZXRUb29sdGlwICgpIHsKLSAgICAJcmV0dXJuIHRvb2x0aXBfOwotICAgIAl9Ci0KLSB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmEzYTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgc3RhdGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIHR5cGVzQnlOYW1lXzsKLQotICAvLwotICAvLyBMb2FkcyBXZWJTZXJ2aWNlVHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gVGhpcyBpcyBkb25lIGJ5IHF1ZXJ5aW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIGFsbCBleHRlbnNpb25zCi0gIC8vIGhhbmdpbmcgb24gdGhlIHdlYlNlcnZpY2VUeXBlIGV4dGVuc2lvbiBwb2ludC4gRXh0ZW5zaW9ucwotICAvLyBtdXN0IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2UuanN0LndzLnVpLndpemFyZC5XZWJTZXJ2aWNlVHlwZQotICAvLyBpbnRlcmZhY2UuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkRGlhbG9nc1ByZWZlcmVuY2VzICgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MudWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSIpOwotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBjb25maWdbaWR4XTsKLSAgICAgIHRyeSAKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlID0gZWxlbS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICBpZiAoYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgaW5zdGFuY2VvZiBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBkaWFsb2cgPSAoQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUpIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlOwotICAgICAgICAgIGRpYWxvZy5zZXRJZCgoU3RyaW5nKWVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLSAgICAgICAgICBkaWFsb2cuc2V0TmFtZSgoU3RyaW5nKWVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgICAgICAgIGRpYWxvZy5zZXRJbmZvcG9wKChTdHJpbmcpZWxlbS5nZXRBdHRyaWJ1dGUoImluZm9wb3AiKSk7Ci0gICAgICAgICAgZGlhbG9nLnNldFRvb2x0aXAoKFN0cmluZyllbGVtLmdldEF0dHJpYnV0ZSgidG9vbHRpcCIpKTsKLSAgICAgICAgICBhZGQoZGlhbG9nKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vCi0gIC8vIExvYWRzIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBTZWUgbWV0aG9kIGdldEluc3RhbmNlKCkuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkICgpCi0gIHsKLSAgICB0eXBlc0J5TmFtZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgbG9hZERpYWxvZ3NQcmVmZXJlbmNlcygpOwotICB9Ci0KLSAgLy8KLSAgLy8gQWRkIHRoZSBnaXZlbiBXZWJTZXJ2aWNlVHlwZSB0byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBTZWUgbWV0aG9kIGxvYWQoKS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGFkZCAoIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGRpYWxvZyApCi0gIHsKLSAgICB0eXBlc0J5TmFtZV8ucHV0KGRpYWxvZy5nZXRJZCgpLGRpYWxvZyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICogQHJldHVybiBBIHNpbmdsZXRvbiBXZWJTZXJ2aWNlVHlwZVJlZ2lzdHJ5IG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlICgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkoKTsKLSAgICAgIGluc3RhbmNlXy5sb2FkKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VUeXBlPC9jb2RlPiBvYmplY3RzLgotICAqIEByZXR1cm4gQWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+IG9iamVjdHMuCi0gICovCi0gIHB1YmxpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVtdIGdldEFjdGlvbkRpYWxvZ3NQcmVmcmVuY2VzICgpCi0gIHsKLSAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVtdIGRpYWxvZ3MgPSBuZXcgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbdHlwZXNCeU5hbWVfLnNpemUoKV07Ci0gICAgRW51bWVyYXRpb24gZSA9IHR5cGVzQnlOYW1lXy5lbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIHsKLSAgICAgIGRpYWxvZ3NbaV0gPSAoQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUpZS5uZXh0RWxlbWVudCgpOwotICAgIH0KLSAgICByZXR1cm4gZGlhbG9nczsKLSAgfQotCi0gIHB1YmxpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBnZXRBY3Rpb25EaWFsb2dQcmVmcmVuY2VUeXBlQnlOYW1lIChTdHJpbmcgbmFtZSkKLSAgewotICAJcmV0dXJuIChuYW1lID09IG51bGwgPyBudWxsIDogKEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlKXR5cGVzQnlOYW1lXy5nZXQobmFtZSkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3YmM0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi07Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgTGlzdGVuZXIKLXsKLSAgLypDT05URVhUX0lEIFBQQUQwMDAxIGZvciB0aGUgQWN0aW9uIERpYWxvZ3MgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUEFEX1BBR0UgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQQUQwMDAxIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gc2hvd0FsbDsKLSAgLypDT05URVhUX0lEIFBQQUQwMDAyIGZvciB0aGUgIHNob3cgYWxsIGNoZWNrIGJveCBvbiB0aGUgQWN0aW9uIERpYWxvZ3MgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUEFEX0JVVFRPTl9TSE9XX0FMTCA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuUFBBRDAwMDIiOwotICAvLwotICBwcml2YXRlIEJ1dHRvbiBoaWRlQWxsOwotICAvKkNPTlRFWFRfSUQgUFBBRDAwMDMgZm9yIHRoZSAgaGlkZSBhbGwgY2hlY2sgYm94IG9uIHRoZSBBY3Rpb24gRGlhbG9ncyBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BQQURfQlVUVE9OX0hJREVfQUxMID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUEFEMDAwMyI7Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgY2hlY2tCb3hlc187Ci0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIGNoZWNrQm94ZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGFkZE9wdGlvbmFsRGlhbG9nc0NoZWNrQm94ZXMgKHN1cGVycGFyZW50KTsKLQluZXcgTGFiZWwoc3VwZXJwYXJlbnQsIFNXVC5IT1JJWk9OVEFMKTsKLQkKLQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQQURfUEFHRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LElORk9QT1BfUFBBRF9QQUdFKTsKLQkKLSAgICBzaG93QWxsID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBzaG93QWxsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUJVVFRPTl9TSE9XX0FMTF9ESUFMT0dTIikpOwotICAgIHNob3dBbGwuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgc2hvd0FsbC5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QUEFEX0JVVFRPTl9TSE9XX0FMTCIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAoc2hvd0FsbCxJTkZPUE9QX1BQQURfQlVUVE9OX1NIT1dfQUxMKTsKLSAgIAotICAgIGhpZGVBbGwgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGhpZGVBbGwuc2V0VGV4dChnZXRNZXNzYWdlKCIlQlVUVE9OX0hJREVfQUxMX0RJQUxPR1MiKSk7Ci0gICAgaGlkZUFsbC5hZGRMaXN0ZW5lciAoIFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIGhpZGVBbGwuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFBBRF9CVVRUT05fSElERV9BTEwiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGhpZGVBbGwsSU5GT1BPUF9QUEFEX0JVVFRPTl9ISURFX0FMTCk7Ci0KLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVycGFyZW50KTsKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSAKLSAgewotICAJCXJldHVybiBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShrZXkpOwotICB9Ci0KLSBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIAotIHsKLSAgICBpZiAoc2hvd0FsbCA9PSBldmVudC53aWRnZXQpCi0JCWhhbmRsZVNob3dBbGxFdmVudCgpOwotICAgIAotICAgIGVsc2UgaWYgKCBoaWRlQWxsID09IGV2ZW50LndpZGdldCkKLSAgICAJaGFuZGxlSGlkZUFsbEV2ZW50KCk7Ci0gfQotCi0gcHJpdmF0ZSB2b2lkIGhhbmRsZVNob3dBbGxFdmVudCAoKQotIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gY2hlY2tCb3hlc18uZWxlbWVudHMoKTsKLSAJZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgCXsKLSAgICAJCUJ1dHRvbiBkaWFsb2cgPSAoQnV0dG9uKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgCQlkaWFsb2cuc2V0U2VsZWN0aW9uKCB0cnVlICk7Ci0gICAgCX0gICAgICAgICAgICAgICAgICAgICAgCi0gfQotCi0gcHJpdmF0ZSB2b2lkIGhhbmRsZUhpZGVBbGxFdmVudCAoKQotIHsKLSAJRW51bWVyYXRpb24gZSA9IGNoZWNrQm94ZXNfLmVsZW1lbnRzKCk7Ci0gCWZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIAl7Ci0gICAgCQlCdXR0b24gZGlhbG9nID0gKEJ1dHRvbikgZS5uZXh0RWxlbWVudCgpOwotICAgIAkJZGlhbG9nLnNldFNlbGVjdGlvbiggZmFsc2UgKTsKLSAgICAJfQotIH0KLSAKLSBwcml2YXRlIHZvaWQgYWRkT3B0aW9uYWxEaWFsb2dzQ2hlY2tCb3hlcyAoIENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEFjdGlvbkRpYWxvZ3NDb250ZXh0KCk7Ci0gICAgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSBkaWFsb2dzID0gY29udGV4dC5nZXREaWFsb2dzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgCUJ1dHRvbiBjaGVja0JveCA9IGNyZWF0ZUNoZWNrQm94KHBhcmVudCAsIGRpYWxvZ3NbaV0uZ2V0TmFtZSgpKTsKLSAgICAJY2hlY2tCb3guc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZShkaWFsb2dzW2ldLmdldFRvb2x0aXAoKSkpOwotICAgIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNoZWNrQm94LGRpYWxvZ3NbaV0uZ2V0SW5mb3BvcCgpKTsKLSAgICAJY2hlY2tCb3hlc18ucHV0KGRpYWxvZ3NbaV0uZ2V0SWQoKSwgY2hlY2tCb3gpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCb3goIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0ICkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5DSEVDSyApOwotICAgIGJ1dHRvbi5zZXRUZXh0KCB0ZXh0ICk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgeyB9Ci0KLSAgLyoqCi0gICAqIFRoZSBwcm94eSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLSAgICogaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5lbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIHsKLSAgICAgIEJ1dHRvbiBkaWFsb2cgPSAoQnV0dG9uKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBkaWFsb2cuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2VzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gICAgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRBY3Rpb25EaWFsb2dzQ29udGV4dCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5rZXlzKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGNoZWNrQm94ZXNfLmdldChpZCk7Ci0gICAgICBidXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNBY3Rpb25EaWFsb2dFbmFibGVkKGlkKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAgIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QWN0aW9uRGlhbG9nc0NvbnRleHQoKTsKLQotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5rZXlzKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgY29udGV4dC5zZXRBY3Rpb25EaWFsb2dFbmFibGVkKGlkLCAoKEJ1dHRvbiljaGVja0JveGVzXy5nZXQoaWQpKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNiNjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0Ci17Ci0gcHJpdmF0ZSBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBbXSBkaWFsb2dzXzsKLQotcHVibGljIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCAoKSAKLXsKLQlzdXBlciggIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLX0KLXB1YmxpYyB2b2lkIGxvYWQoKSAKLXsKLSAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5IHJlZyA9IEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBkaWFsb2dzXyA9IHJlZy5nZXRBY3Rpb25EaWFsb2dzUHJlZnJlbmNlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlhbG9nc18ubGVuZ3RoOyBpKyspIHsKLSAgICAJc2V0RGVmYXVsdChkaWFsb2dzX1tpXS5nZXRJZCgpLCB0cnVlKTsKLSAgIH0KLX0KLQotcHVibGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlW10gZ2V0RGlhbG9ncygpCi17Ci0gIHJldHVybiBkaWFsb2dzXzsKLX0KLQotcHVibGljIHZvaWQgc2V0QWN0aW9uRGlhbG9nRW5hYmxlZCAoIFN0cmluZyBpZCwgYm9vbGVhbiB2YWx1ZSkKLXsKLSAJc2V0VmFsdWUgKGlkLCB2YWx1ZSk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQWN0aW9uRGlhbG9nRW5hYmxlZCggU3RyaW5nIGlkKQotewotICAgICBpZiAoaWQgPT0gbnVsbCApIAotICAgICAJcmV0dXJuIHRydWU7Ci0JIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihpZCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliNjQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1Byb2plY3RUb3BvbG9neVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlByb2plY3RUb3BvbG9neURlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VG9wb2xvZ3lQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lcgotewotICAvKkNPTlRFWFRfSUQgUFBTRDAwMDEgZm9yIHRoZSBQcm9qZWN0IFRvcG9sb2d5IFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFRQUF9QQUdFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFRQMDAwMSI7Ci0KLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciBjbGllbnRUeXBlVmlld2VyXzsKLSAgcHJpdmF0ZSBCdXR0b24gbW92ZVVwXzsKLSAgcHJpdmF0ZSBCdXR0b24gbW92ZURvd25fOwotICBwcml2YXRlIFZlY3RvciBjbGllbnRUeXBlc187Ci0gIC8qIENPTlRFWFRfSUQgUFRQUDAwMDIgZm9yIHRoZSBjbGllbnQgdHlwZSB0YWJsZSB2aWV3ZXIgb24gdGhlIFByb2plY3QgVG9wb2xvZ3kgUHJlZmVyZW5jZSBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFRQUF9DTElFTlRfVFlQRSA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuUFRQUDAwMDIiOwotICAvKiBDT05URVhUX0lEIFBUUFAwMDAzIGZvciB0aGUgbW92ZSB1cCBidXR0b24gb24gdGhlIFByb2plY3QgVG9wb2xvZ3kgUHJlZmVyZW5jZSBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFRQUF9NT1ZFX1VQID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QVFBQMDAwMyI7Ci0gIC8qIENPTlRFWFRfSUQgUFRQUDAwMDQgZm9yIHRoZSBtb3ZlIGRvd24gYnV0dG9uIG9uIHRoZSBQcm9qZWN0IFRvcG9sb2d5IFByZWZlcmVuY2UgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BUUFBfTU9WRV9ET1dOID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QVFBQMDAwNCI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gdHdvRUFSXzsKLSAgLyogQ09OVEVYVF9JRCBQVFBQMDAwNSBmb3IgdGhlIGVuYWJsZSAyIEVBUnMgY2hlY2tib3ggb24gdGhlIFByb2plY3QgVG9wb2xvZ3kgUHJlZmVyZW5jZSBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFRQUF9UV09fRUFSX0NIRUNLQk9YID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QVFBQMDAwNSI7Ci0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSAgIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoIHN1cGVycGFyZW50LCBTV1QuTk9ORSApOwkKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIHBhcmVudC5zZXRMYXlvdXQoIGxheW91dCApOwotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QVFBQX1BBR0UiKSk7Ci0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCxJTkZPUE9QX1BUUFBfUEFHRSk7ICAgIAotCi0gICAgVGV4dCBjbGllbnRUeXBlTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUCk7Ci0gICAgY2xpZW50VHlwZUxhYmVsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX0NMSUVOVF9UWVBFX05BTUUiKSk7Ci0KLSAgICBDb21wb3NpdGUgY2xpZW50VHlwZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY2xpZW50VHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgVGFibGUgdGFibGU9IG5ldyBUYWJsZShjbGllbnRUeXBlQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMjU2OwotICAgIHRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgIHRhYmxlLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX0NMSUVOVF9UWVBFX1RBQkxFX1ZJRVdFUiIpKTsKLQotICAgIGNsaWVudFR5cGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjbGllbnRUeXBlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgY2xpZW50VHlwZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDbGllbnRUeXBlQ29udGVudFByb3ZpZGVyKCkpOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IENsaWVudFR5cGVMYWJlbFByb3ZpZGVyKCkpOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnNldElucHV0KGNsaWVudFR5cGVzXyk7Ci0KLSAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgdGFibGVDb2x1bW4uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfQ0xJRU5UX1RZUEUiKSk7Ci0gICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5EYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMjU2LCAyNTYsIGZhbHNlKTsKLSAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbkRhdGEpOwotICAgIHRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoY2xpZW50VHlwZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMTsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBjLnNldExheW91dChnbCk7Ci0KLSAgICBtb3ZlVXBfID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgbW92ZVVwXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9NT1ZFX1VQIikpOwotICAgIG1vdmVVcF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgbW92ZVVwXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBtb3ZlVXBfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX01PVkVfVVAiKSk7Ci0KLSAgICBtb3ZlRG93bl8gPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLSAgICBtb3ZlRG93bl8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfTU9WRV9ET1dOIikpOwotICAgIG1vdmVEb3duXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICBtb3ZlRG93bl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgbW92ZURvd25fLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX01PVkVfRE9XTiIpKTsKLQotICAgIHR3b0VBUl8gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICB0d29FQVJfLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX0VOQUJMRV9UV09fRUFSUyIpKTsKLSAgICB0d29FQVJfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX0VOQUJMRV9UV09fRUFSUyIpKTsKLQotICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJwYXJlbnQpOyAgICAKLQotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgCi0gIHsKLSAgICAgIAlyZXR1cm4gV2ViU2VydmljZVVJUGx1Z2luLmdldE1lc3NhZ2Uoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgeyB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdG8gdGhlaXIgYnVybmVkLWluIGRlZmF1bHRzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpCi0gIHsKLSAgICBjbGllbnRUeXBlc18uY2xlYXIoKTsKLSAgICBTdHJpbmdbXSB0eXBlcyA9IFByb2plY3RUb3BvbG9neURlZmF1bHRzLmdldENsaWVudFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIGNsaWVudFR5cGVzXy5hZGQodHlwZXNbaV0pOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICB0d29FQVJfLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2UgaGVscGVyLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gICAgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsKLSAgICBTdHJpbmdbXSB0eXBlcyA9IGNvbnRleHQuZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgY2xpZW50VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgLy8gY2hlY2sgd2hldGhlciB3ZSBtaXNzZWQgYW55IHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgbGlzdAotICAgIGJvb2xlYW4gbWlzc2VkID0gZmFsc2U7Ci0gICAgdHlwZXMgPSBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5nZXRDbGllbnRUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGNsaWVudFR5cGVzXy5pbmRleE9mKHR5cGVzW2ldKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgY2xpZW50VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgICAgIG1pc3NlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtaXNzZWQpCi0gICAgewotICAgICAgdHlwZXMgPSBuZXcgU3RyaW5nW2NsaWVudFR5cGVzXy5zaXplKCldOwotICAgICAgY2xpZW50VHlwZXNfLmNvcHlJbnRvKHR5cGVzKTsKLSAgICAgIGNvbnRleHQuc2V0Q2xpZW50VHlwZXModHlwZXMpOwotICAgIH0KLSAgICAvLyByZWZyZXNoIHZpZXdlcgotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICB0d29FQVJfLnNldFNlbGVjdGlvbihjb250ZXh0LmlzVXNlVHdvRUFScygpKTsKLSAgIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2UgaGVscGVyLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAgIFByb2plY3RUb3BvbG9neUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCk7Ci0gICAgU3RyaW5nW10gdHlwZXMgPSBuZXcgU3RyaW5nW2NsaWVudFR5cGVzXy5zaXplKCldOwotICAgIGNsaWVudFR5cGVzXy5jb3B5SW50byh0eXBlcyk7Ci0gICAgY29udGV4dC5zZXRDbGllbnRUeXBlcyh0eXBlcyk7Ci0gICAgY29udGV4dC5zZXRVc2VUd29FQVJzKHR3b0VBUl8uZ2V0U2VsZWN0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBjbGllbnRUeXBlVmlld2VyXy5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGlmIChlLndpZGdldCA9PSBtb3ZlVXBfICYmIGluZGV4ID4gMCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGNsaWVudFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICBjbGllbnRUeXBlc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXgtMSk7Ci0gICAgICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1vdmVEb3duXyAmJiBpbmRleCA8IGNsaWVudFR5cGVzXy5zaXplKCktMSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGNsaWVudFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICBjbGllbnRUeXBlc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXgrMSk7Ci0gICAgICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIENsaWVudFR5cGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHZhbHVlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gKChWZWN0b3IpdmFsdWUpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIAotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgCi0gICAgewotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgQ2xpZW50VHlwZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzXzsKLQotICAgIHB1YmxpYyBDbGllbnRUeXBlTGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICBjb25maWdFbGVtZW50c18gPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAiY2xpZW50UHJvamVjdFR5cGUiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5sZW5ndGg7IGkrKykKLSAgICAgICAgaWYgKGNvbmZpZ0VsZW1lbnRzX1tpXS5nZXRBdHRyaWJ1dGUobmFtZSkuZXF1YWxzKHZhbHVlKSkKLSAgICAgICAgICByZXR1cm4gY29uZmlnRWxlbWVudHNfW2ldOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQotICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBhcmcwKSAKLSAgICB7IAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgdmFsdWUpIAotICAgIHsKLSAgICAgIHJldHVybiBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoImlkIiwgdmFsdWUudG9TdHJpbmcoKSkuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUmVzb3VyY2VNYW5hZ21lbnRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MTU2MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VEZWZhdWx0czsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLSAgLypDT05URVhUX0lEIFBQUk0wMDAxIGZvciB0aGUgUmVzb3VyY2UgTWFuYWdtZW50IFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFBSTV9QQUdFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwMSI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIG92ZXJXcml0ZUZpbGVzOwotICAvKkNPTlRFWFRfSUQgUFBSTTAwMDIgZm9yIHRoZSBmaWxlIG92ZXJ3cml0ZSBjaGVjayBib3ggb24gdGhlIFJlc291cmNlIE1hbmFnZW1lbnQgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuUFBSTTAwMDIiOwotICAvLwotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVGb2xkZXJzOwotICAvKkNPTlRFWFRfSUQgUFBSTTAwMDMgZm9yIHRoZSBjcmVhdGUgZm9sZGVycyBjaGVjayBib3ggb24gdGhlIFJlc291cmNlIE1hbmFnZW1lbnQgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFJNX0NIRUNLQk9YX0NSRUFURV9GT0xERVJTID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwMyI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIGNoZWNrb3V0RmlsZXM7Ci0gIC8qQ09OVEVYVF9JRCBQUFJNMDAwNCBmb3IgdGhlIGNoZWNrb3V0IGZpbGVzIGNoZWNrIGJveCBvbiB0aGUgUmVzb3VyY2UgTWFuYWdlbWVudCBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BQUk1fQ0hFQ0tCT1hfQ0hFQ0tfT1VUID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwNCI7Ci0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAJCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQUk1fUEFHRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LCBJTkZPUE9QX1BQUk1fUEFHRSk7Ci0KLSAgICBvdmVyV3JpdGVGaWxlcyA9IGNyZWF0ZUNoZWNrQm94KHBhcmVudCwgV2ViU2VydmljZVVJUGx1Z2luLmdldE1lc3NhZ2UoIiVCVVRUT05fT1ZFUldSSVRFX0ZJTEVTIiApKTsKLSAgICBvdmVyV3JpdGVGaWxlcy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAob3ZlcldyaXRlRmlsZXMsIElORk9QT1BfUFBSTV9DSEVDS0JPWF9PVkVSV1JJVEVfRklMRVMpOwotCi0gICAgY3JlYXRlRm9sZGVycyAgPSBjcmVhdGVDaGVja0JveChwYXJlbnQsIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlQlVUVE9OX0NSRUFURV9GT0xERVJTIiApKTsKLSAgICBjcmVhdGVGb2xkZXJzLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQUk1fQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlMiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGNyZWF0ZUZvbGRlcnMsIElORk9QT1BfUFBSTV9DSEVDS0JPWF9DUkVBVEVfRk9MREVSUyk7Ci0KLSAgICBjaGVja291dEZpbGVzID0gY3JlYXRlQ2hlY2tCb3gocGFyZW50LCBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJUJVVFRPTl9DSEVDS09VVF9GSUxFUyIgKSk7ICAgIAotICAgIGNoZWNrb3V0RmlsZXMuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFBSTV9DSEVDS0JPWF9DSEVDS19PVVQiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGNoZWNrb3V0RmlsZXMsIElORk9QT1BfUFBSTV9DSEVDS0JPWF9DSEVDS19PVVQpOwotCi0gICAgaW5pdGlhbGl6ZVZhbHVlcygpOwotICAgIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nLmFwcGx5RGlhbG9nRm9udChzdXBlcnBhcmVudCk7ICAgIAotCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotIAotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIAotICB7Ci0gIAkJcmV0dXJuIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVDaGVja0JveCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQgKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULkNIRUNLICk7Ci0gICAgYnV0dG9uLnNldFRleHQoIHRleHQgKTsKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgLyoqCi0gICAqIERvZXMgYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotICB7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0gIH0KLQotICAvKioKLSAgICogRG8gYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLSAgewotICAgIHN0b3JlVmFsdWVzKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotICB7Ci0gICAgcGVyZm9ybU9rKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpICB7IH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyB1c2luZyBkZWZhdWx0IHZhbHVlcwotICAgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKQotICB7Ci0gICAgb3ZlcldyaXRlRmlsZXMuc2V0U2VsZWN0aW9uKCBSZXNvdXJjZURlZmF1bHRzLmdldE92ZXJ3cml0ZUZpbGVzRGVmYXVsdCgpKTsKLSAgICBjcmVhdGVGb2xkZXJzLnNldFNlbGVjdGlvbiggUmVzb3VyY2VEZWZhdWx0cy5nZXRDcmVhdGVGb2xkZXJzRGVmYXVsdCgpKTsKLSAgICBjaGVja291dEZpbGVzLnNldFNlbGVjdGlvbiggUmVzb3VyY2VEZWZhdWx0cy5nZXRDaGVja291dEZpbGVzRGVmYXVsdCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0gIHsKLSAgICAvLyBnZXQgdGhlIHBlcnNpc3RlbnQgY29udGV4dCBmcm9tIHRoZSBwbHVnaW4KLSAgICBSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZUNvbnRleHQoKTsKLSAgICBvdmVyV3JpdGVGaWxlcy5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSk7Ci0gICAgY3JlYXRlRm9sZGVycy5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpKTsKLSAgICBjaGVja291dEZpbGVzLnNldFNlbGVjdGlvbiggY29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpOyAgICAKLSAgIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgLy8gZ2V0IHRoZSBwZXJzaXN0ZW50IGNvbnRleHQgZnJvbSB0aGUgcGx1Z2luCi0gICAgUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgY29udGV4dC5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQoIG92ZXJXcml0ZUZpbGVzLmdldFNlbGVjdGlvbigpICk7Ci0gICAgY29udGV4dC5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZCggY3JlYXRlRm9sZGVycy5nZXRTZWxlY3Rpb24oKSApOwotICAgIGNvbnRleHQuc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoIGNoZWNrb3V0RmlsZXMuZ2V0U2VsZWN0aW9uKCkgKTsgICAgCi0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDlkMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9EZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIAotICBwcml2YXRlIFRhYmxlVmlld2VyIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl87IAotICBwcml2YXRlIEJ1dHRvbiBtb3ZlVXBfOwotICBwcml2YXRlIEJ1dHRvbiBtb3ZlRG93bl87Ci0gIHByaXZhdGUgVmVjdG9yIHdlYlNlcnZpY2VUZXN0VHlwZXNfOwotICAKLSAgLypDT05URVhUX0lEIFBQU0QwMDAxIGZvciB0aGUgU2NlbmFyaW8gRGVmYXVsdHMgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFNEX1BBR0UgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAxIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gbGF1bmNoU2FtcGxlOwotICAvKkNPTlRFWFRfSUQgUFBTRDAwMDIgZm9yIHRoZSBsYXVuY2ggc2FtcGxlIGNoZWNrIGJveCBvbiB0aGUgU2NlbmFyaW8gRGVmYXVsdHMgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QUFNEX0NIRUNLQk9YX0xBVU5DSF9TQU1QTEUgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAyIjsKLSAgLy8KLSAgcHJpdmF0ZSBMYWJlbCBzYW1wbGVHZW5lcmF0aW9uTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHNhbXBsZUdlbmVyYXRpb25UeXBlc187Ci0gIC8qQ09OVEVYVF9JRCBQUFNEMDAwNCBmb3IgdGhlIHNhbXBsZSBKU1AgdHlwZSBjb21ibyBib3ggb24gdGhlIFNjZW5hcmlvIERlZmF1bHRzIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFBTRF9DT01CT19TQU1QTEVfR0VOID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFNEMDAwNCI7Ci0KLSAgcHJpdmF0ZSBMYWJlbCB3c2V4cGxvcmVyVHlwZXNMYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gd3NleHBsb3JlclR5cGVzXzsKLSAgLypDT05URVhUX0lEIFBQU0QwMDAzIGZvciB0aGUgd2ViIGV4cGxvcmVyIHR5cGUgY29tYm8gYm94IG9uIHRoZSBTY2VuYXJpbyBEZWZhdWx0cyBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BQU0RfQ09NQk9fRVhQTE9SRVIgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAzIjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIAotICAJQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQU0RfUEFHRSIpKTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LElORk9QT1BfUFBTRF9QQUdFKTsgICAgCi0KLSAgICBsYXVuY2hTYW1wbGUgPSBjcmVhdGVDaGVja0JveChwYXJlbnQsIGdldE1lc3NhZ2UoIiVCVVRUT05fTEFVTkNIX1NBTVBMRSIpKTsKLSAgICBsYXVuY2hTYW1wbGUuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFBTRF9DSEVDS0JPWF9MQVVOQ0hfU0FNUExFIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobGF1bmNoU2FtcGxlLCBJTkZPUE9QX1BQU0RfQ0hFQ0tCT1hfTEFVTkNIX1NBTVBMRSk7Ci0KLSAgICAKLSAgICBUZXh0IHRlc3RTZXJ2aWNlVHlwZUxhYmVsID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVApOwotICAgIHRlc3RTZXJ2aWNlVHlwZUxhYmVsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1NBTVBMRV9UWVBFUyIpKTsKLQotICAgIENvbXBvc2l0ZSB3ZWJTZXJ2aWNlVGVzdFR5cGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIHdlYlNlcnZpY2VUZXN0VHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgVGFibGUgdGFibGU9IG5ldyBUYWJsZSh3ZWJTZXJ2aWNlVGVzdFR5cGVDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLSAgICBnZC53aWR0aEhpbnQgPSAyNTY7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgdGFibGUuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfQ0xJRU5UX1RZUEVfVEFCTEVfVklFV0VSIikpOwotCi0gICAgd2ViU2VydmljZVRlc3RUeXBlc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdlYlNlcnZpY2VUZXN0VHlwZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IFdlYlNlcnZpY2VUZXN0VHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXy5zZXRJbnB1dCh3ZWJTZXJ2aWNlVGVzdFR5cGVzXyk7Ci0KLSAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgdGFibGVDb2x1bW4uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfQ0xJRU5UX1RZUEVfTkFNRSIpKTsKLSAgICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbkRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyNTYsIDI1NiwgZmFsc2UpOwotICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uRGF0YSk7Ci0gICAgdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZSh3ZWJTZXJ2aWNlVGVzdFR5cGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgYy5zZXRMYXlvdXQoZ2wpOwotCi0gICAgbW92ZVVwXyA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotICAgIG1vdmVVcF8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfTU9WRV9VUCIpKTsKLSAgICBtb3ZlVXBfLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgIG1vdmVVcF8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgbW92ZVVwXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9NT1ZFX1VQIikpOwotCi0gICAgbW92ZURvd25fID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgbW92ZURvd25fLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX01PVkVfRE9XTiIpKTsKLSAgICBtb3ZlRG93bl8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgbW92ZURvd25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIG1vdmVEb3duXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9NT1ZFX0RPV04iKSk7Ci0KLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVycGFyZW50KTsgICAgCi0KLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSAKLSAgewotICAgICAgCXJldHVybiBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShrZXkpOwotICB9Ci0gCi0gIHByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCApCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuQ0hFQ0sgKTsKLSAgICBidXR0b24uc2V0VGV4dCggdGV4dCApOwotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICAvKioKLSAgICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICBpbml0aWFsaXplRGVmYXVsdHMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotICB7Ci0gICAgdHJ5ewotICAgICAgc3RvcmVWYWx1ZXMoKTsKLSAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBleGMpewotICAgIAlleGMucHJpbnRTdGFja1RyYWNlKCk7fQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHRyeXsKLSAgCXBlcmZvcm1PaygpOwotICAgIH1jYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGMpewotICAgICAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgIHsgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHRvIHRoZWlyIGJ1cm5lZC1pbiBkZWZhdWx0cy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKQotICB7Ci0gICAgU2NlbmFyaW9EZWZhdWx0cyBkZWZhdWx0cyA9IG5ldyBTY2VuYXJpb0RlZmF1bHRzKCk7Ci0gICAgLy9wZ20gbGF1bmNoU2FtcGxlLnNldFNlbGVjdGlvbiggZGVmYXVsdHMuZ2V0TGF1bmNoU2FtcGxlRGVmYXVsdCgpKTsKLSAgICAKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5jbGVhcigpOwotICAgIFN0cmluZ1tdIHR5cGVzID0gZGVmYXVsdHMuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5hZGQodHlwZXNbaV0pOwotICAgIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8ucmVmcmVzaCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBoZWxwZXIuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0gIHsKLSAgCVNjZW5hcmlvQ29udGV4dCAgY29udGV4dCAgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0gICAgU2NlbmFyaW9EZWZhdWx0cyBkZWZhdWx0cyA9IG5ldyBTY2VuYXJpb0RlZmF1bHRzKCk7Ci0gICAgLy9wZ20gbGF1bmNoU2FtcGxlLnNldFNlbGVjdGlvbiggY29udGV4dC5pc0xhdW5jaFNhbXBsZUVuYWJsZWQoKSk7Ci0gICAgICAgIAotICAgIFN0cmluZ1tdIHR5cGVzID0gY29udGV4dC5nZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIHdlYlNlcnZpY2VUZXN0VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgLy8gY2hlY2sgd2hldGhlciB3ZSBtaXNzZWQgYW55IHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgbGlzdAotICAgIGJvb2xlYW4gbWlzc2VkID0gZmFsc2U7Ci0gICAgdHlwZXMgPSBkZWZhdWx0cy5nZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAod2ViU2VydmljZVRlc3RUeXBlc18uaW5kZXhPZih0eXBlc1tpXSkgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHdlYlNlcnZpY2VUZXN0VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgICAgIG1pc3NlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtaXNzZWQpCi0gICAgewotICAgICAgdHlwZXMgPSBuZXcgU3RyaW5nW3dlYlNlcnZpY2VUZXN0VHlwZXNfLnNpemUoKV07Ci0gICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5jb3B5SW50byh0eXBlcyk7Ci0gICAgICBjb250ZXh0LnNldFdlYlNlcnZpY2VUZXN0VHlwZXModHlwZXMpOwotICAgIH0KLSAgICAvLyByZWZyZXNoIHZpZXdlcgotICAgIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgfQotCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBoZWxwZXIuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgU2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0gICAgU3RyaW5nW10gdHlwZXMgPSBuZXcgU3RyaW5nW3dlYlNlcnZpY2VUZXN0VHlwZXNfLnNpemUoKV07Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlc18uY29weUludG8odHlwZXMpOwotICAgIGNvbnRleHQuc2V0V2ViU2VydmljZVRlc3RUeXBlcyh0eXBlcyk7Ci0gICAgCi0gICAgLy9wZ20gY29udGV4dC5zZXRMYXVuY2hTYW1wbGVFbmFibGVkKGxhdW5jaFNhbXBsZS5nZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGludCBpbmRleCA9IHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8uZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoZS53aWRnZXQgPT0gbW92ZVVwXyAmJiBpbmRleCA+IDApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5pbnNlcnRFbGVtZW50QXQob2JqZWN0LCBpbmRleC0xKTsKLSAgICAgICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBtb3ZlRG93bl8gJiYgaW5kZXggPCB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5zaXplKCktMSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IHdlYlNlcnZpY2VUZXN0VHlwZXNfLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIHdlYlNlcnZpY2VUZXN0VHlwZXNfLmluc2VydEVsZW1lbnRBdChvYmplY3QsIGluZGV4KzEpOwotICAgICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFdlYlNlcnZpY2VUZXN0VHlwZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgdmFsdWUpIAotICAgIHsKLSAgICAgIHJldHVybiAoKFZlY3Rvcil2YWx1ZSkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSAKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBXZWJTZXJ2aWNlVGVzdFR5cGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50c187Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZVRlc3RUeXBlTGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgV2ViU2VydmljZVRlc3RSZWdpc3RyeSB3c3RyID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgY29uZmlnRWxlbWVudHNfID0gd3N0ci5nZXRDb25maWdFbGVtZW50cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLSAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgYXJnMCkgCi0gICAgeyAKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IHZhbHVlKSAKLSAgICB7Ci0gICAgICAvL3JldHVybiBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoImlkIiwgdmFsdWUudG9TdHJpbmcoKSkuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAKLSAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS91ZGRpL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3VkZGkvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxODg4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3VkZGkvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLQotcHVibGljIGludGVyZmFjZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZQotewotICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpOwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5SW5xdWlyeUFQSSgpOwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5UHVibGlzaEFQSSgpOwotICAgIHB1YmxpYyBDb21tYW5kV2lkZ2V0QmluZGluZyBnZXRCaW5kaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3VpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy91aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlNGU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UKLVBMVUdJTl9WRU5ET1I9SW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLgotUExVR0lOX0RFU0M9XAotVGhlIFdlYiBzZXJ2aWNlcyBHVUkgcGx1Z2luIGRlbGl2ZXJzIHRoZSBncmFwaGljYWwgXAotdXNlciBpbnRlcmZhY2UgdG8gdGhlIFdlYiBzZXJ2aWNlcyBmdW5jdGlvbiBvZiB0aGUgXAotV2ViIHNlcnZpY2VzIHBsdWdpbi4KLQotUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTPVdlYiBTZXJ2aWNlcwotCi0jCi0jCVdlYiBTZXJ2aWNlcyBQcmVmZXJhbmNlIFBhZ2VzCi0jCi0jIENhdGVnb3JpZXMKLVBSRUZFUkVOQ0VfQ0FURUdPUllfUkVTT1VSQ0VfTUFOQUdFTUVOVD1SZXNvdXJjZSBNYW5hZ2VtZW50Ci1QUkVGRVJFTkNFX0NBVEVHT1JZX0NPREVfR0VORVJBVElPTj1Db2RlIEdlbmVyYXRpb24KLVBSRUZFUkVOQ0VfQ0FURUdPUllfU0NFTkFSSU9fREVGQVVMVFM9U2NlbmFyaW8gRGVmYXVsdHMKLVBSRUZFUkVOQ0VfQ0FURUdPUllfUFJPSkVDVF9UT1BPTE9HWT1Qcm9qZWN0IFRvcG9sb2d5Ci1QUkVGRVJFTkNFX0NBVEVHT1JZX0RSSVZFUl9KQVJTPUpEQkMgZHJpdmVycwotCi0KLSMKLSNTY2VuYXJpbyBEZWZhdWx0cwotQlVUVE9OX0xBVU5DSF9TQU1QTEU9TGF1bmNoIHRoZSBzYW1wbGUgd2hlbiBnZW5lcmF0ZWQKLUxBQkVMX1VERElfQ0FUX0RBVEFfQ09MVU1OX0RFTElNPVVzZXIgZGVmaW5lZCBVRERJIENhdGVnb3J5IGRhdGEgY29sdW1uIGRlbGltaXRlcjoKLUxBQkVMX1VERElfQ0FUX0RBVEFfU1RSSU5HX0RFTElNPVVzZXIgZGVmaW5lZCBVRERJIENhdGVnb3J5IGRhdGEgc3RyaW5nIGRlbGltaXRlcjoKLU1TR19FUlJPUl9DT0xVTU5fU1RSSU5HX0RFTElNU19JREVOVElDQUw9SVdBQjA0ODFFIFVEREkgY29sdW1uIGFuZCBzdHJpbmcgZGVsaW1pdGVycyBtdXN0IG5vdCBiZSBpZGVudGljYWwuCi1MQUJFTF9NT1ZFX1VQPU1vdmUgdXAKLUxBQkVMX01PVkVfRE9XTj1Nb3ZlIGRvd24KLQotIwotIyBQcmVmZXJlbmNlcyBUb29sdGlwcwotIwotCi0jU2NlbmFyaW8gRGVmYXVsdHMKLVRPT0xUSVBfUFBTRF9QQUdFPVNldCB0aGUgZGVmYXVsdHMgZm9yIHRoZSBXZWIgc2VydmljZSBzY2VuYXJpb3MuCi1UT09MVElQX1BQU0RfQ0hFQ0tCT1hfTEFVTkNIX1NBTVBMRT1MYXVuY2ggdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBhZnRlciBnZW5lcmF0aW9uLgotVE9PTFRJUF9QUFNEX0NPTUJPX1NBTVBMRV9HRU49U2VsZWN0IHRoZSB0eXBlIG9mIHNhbXBsZSBKU1AgdG8gYmUgZ2VuZXJhdGVkLgotVE9PTFRJUF9QUFNEX0NPTUJPX0VYUExPUkVSPVNlbGVjdCB0aGUgdHlwZSBvZiB0aGUgV2ViIHNlcnZpY2VzIGV4cGxvcmVyIHRvIGJlIHVzZWQuCi1UT09MVElQX1BQU0RfVURESV9DQVRfREFUQV9DT0xVTU5fREVMSU09Y29sdW1uIGRlbGltaXRlciBmb3IgdXNlciBkZWZpbmVkIFVEREkgY2F0ZWdvcnkgZGF0YQotVE9PTFRJUF9QUFNEX1VERElfQ0FUX0RBVEFfU1RSSU5HX0RFTElNPXN0cmluZyBkZWxpbWl0ZXIgZm9yIHVzZXIgZGVmaW5lZCBVRERJIGNhdGVnb3J5IGRhdGEKLVRPT0xUSVBfQ0xJRU5UX1RZUEVfVEFCTEVfVklFV0VSPVByZWZlcnJlZCBvcmRlciBvZiB0aGUgbGlzdCBvZiBjbGllbnQgdHlwZXMKLVRPT0xUSVBfTU9WRV9VUD1Nb3ZlIHRoZSBzZWxlY3RlZCBjbGllbnQgdHlwZSB1cCB0aGUgbGlzdAotVE9PTFRJUF9NT1ZFX0RPV049TW92ZSB0aGUgc2VsZWN0ZWQgY2xpZW50IHR5cGUgZG93biB0aGUgbGlzdAotCi0jCi0jIFJlc291cmNlIE1hbmFnbWVudAotVE9PTFRJUF9QUFJNX1BBR0U9U2V0IHByZWZlcmVuY2VzIHRoYXQgY29udHJvbCByZXNvdXJjZXMgdXNlZC9nZW5lcmF0ZWQgYnkgdGhlIFdlYiBzZXJ2aWNlLgotVE9PTFRJUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUz1PdmVyd3JpdGUgZmlsZXMgd2l0aG91dCB3YXJuaW5nLgotVE9PTFRJUF9QUFJNX0NIRUNLQk9YX0NSRUFURV9GT0xERVJTPUNyZWF0ZSBmb2xkZXJzIHdoZW4gbmVjZXNzYXJ5LgotVE9PTFRJUF9QUFJNX0NIRUNLQk9YX0NIRUNLX09VVD1DaGVjayBvdXQgZmlsZXMgd2l0aG91dCB3YXJuaW5nLgotQlVUVE9OX0NSRUFURV9GT0xERVJTPUNyZWF0ZSBmb2xkZXJzIHdoZW4gbmVjZXNzYXJ5Ci1CVVRUT05fT1ZFUldSSVRFX0ZJTEVTPU92ZXJ3cml0ZSBmaWxlcyB3aXRob3V0IHdhcm5pbmcKLUJVVFRPTl9DSEVDS09VVF9GSUxFUz1DaGVjayBvdXQgZmlsZXMgd2l0aG91dCB3YXJuaW5nCi0KLSMKLSMgR2VuZXJhbCBtZXNzYWdlcy4KLSMKLUlTVEFUVVNfV0lUSE9VVF9FWENFUFRJT049ezB9Ci1JU1RBVFVTX1dJVEhfRVhDRVBUSU9OPXswfVxuRXhjZXB0aW9uOiB7MX0KLU1TR19JTkZPX1NBVkVEX1NUQVRVUz1JV0FCMDI5N0kgUHJlc3MgdGhlIERldGFpbHMgYnV0dG9uIHRvIHNlZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotCi0jCi0jIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSMKLURJQUxPR19USVRMRV9DTEFTU19CUk9XU0U9QnJvd3NlIENsYXNzZXMKLURJQUxPR19USVRMRV9JTlRFUkZBQ0VfQlJPV1NFPUJyb3dzZSBJbnRlcmZhY2VzCi0KLSMKLSMgQ29tbW9uIHdpemFyZCBzdHJpbmdzLgotIwotTEFCRUxfV1NFWFBMT1JFUl9UWVBFUz1XZWIgU2VydmljZXMgRXhwbG9yZXIKLUxBQkVMX1NBTVBMRV9UWVBFUz1KYXZhIHByb3h5IHNhbXBsZQotCi0jCi0jIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nCi0jCi1ESUFMT0dfVElUTEVfUkVTT1VSQ0VfQlJPV1NFPUJyb3dzZSBGaWxlcwotTEFCRUxfUkVTT1VSQ0VfRklMVEVSPUZpbHRlcjoKLQotIwotIyBUb29sdGlwcyBmb3IgZGlhbG9nLlJlc291cmNlU2VsZWN0aW9uRGlhbG9nCi0jIERSRVM9RGlhbG9nL1JFU291cmNlcwotIwotVE9PTFRJUF9EUkVTX0NPTUJPX1JFU09VUkNFX1RZUEU9VHlwZSBvZiByZXNvdXJjZXMgdG8gYnJvd3NlLgotVE9PTFRJUF9EUkVTX1RSRUVfUkVTT1VSQ0U9UmVzb3VyY2VzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uLgotCi0KLQotIwotIyBIVFRQIEJhc2ljIEF1dGhlbnRpY2F0aW9uCi0jCi1QUkVGRVJFTkNFX0NBVEVHT1JZX0hUVFBfQkFTSUNfQVVUSD1IVFRQIEJhc2ljIEF1dGgKLUNIRUNLQk9YX1BSRUZFUkVOQ0VfRU5BQkxFX0hUVFBfQkFTSUNfQVVUSD1FbmFibGUgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbgotTEFCRUxfUFJFRkVSRU5DRV9IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUU9SFRUUCBiYXNpYyBhdXRoIHVzZXIgbmFtZToKLUxBQkVMX1BSRUZFUkVOQ0VfSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEPUhUVFAgYmFzaWMgYXV0aCBwYXNzd29yZDoKLQotVE9PTFRJUF9FTkFCTEVfSFRUUF9CQVNJQ19BVVRIPVNwZWNpZnkgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiBzZXR0aW5nIGZvciBXZWIgc2VydmljZXMgdG9vbGluZ3MuCi1UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9VU0VSTkFNRT1Vc2VyIG5hbWUgZm9yIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24uCi1UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRD1QYXNzd29yZCBmb3IgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbi4KLQotCi0jCi0jIE1lc3NhZ2VzIGZvciBwcm9qZWN0IHRvcG9sb2d5IHByZWZlcmVuY2UgcGFnZQotIwotVE9PTFRJUF9QVFBQX1BBR0U9UHJlZmVyZW5jZSB0aGF0IGNvbnRyb2wgdGhlIHByb2plY3QgdG9wb2xvZ3kgb2YgeW91ciBXZWIgc2VydmljZSBhbmQgY2xpZW50IHNjZW5hcmlvcy4KLVRPT0xUSVBfRU5BQkxFX1RXT19FQVJTPUVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSB5b3VyIFdlYiBzZXJ2aWNlIGFuZCBXZWIgc2VydmljZSBjbGllbnQgaW4gZGlmZmVyZW50IEVBUiBwcm9qZWN0cy4KLQotTEFCRUxfRU5BQkxFX1RXT19FQVJTPUdlbmVyYXRlIFdlYiBzZXJ2aWNlIGFuZCBXZWIgc2VydmljZSBjbGllbnQgaW4gZGlmZmVyZW50IEVBUiBwcm9qZWN0cwotTEFCRUxfQ0xJRU5UX1RZUEVfTkFNRT1DbGllbnQgdHlwZToKLQotCi0jCi0jCUFjdGlvbkRpYWxvZ3MgUGFnZQotIwotUFJFRkVSRU5DRV9DQVRFR09SWV9ESUFMT0dTPURpYWxvZ3MKLQotIwotIyBSZXNvdXJjZSBCcm93c2VyCi0jCi1ESUFMT0dfVElUTEVfUkVTT1VSQ0VfQlJPV1NFUj1SZXNvdXJjZSBicm93c2VyCi1UT09MVElQX1JFU09VUkNFX1RSRUU9Q2hvb3NlIGEgcmVzb3VyY2UuCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGU1N2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotd3MuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY2Mjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC53c2RsPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3MudWRkaTRqPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1YWRiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGRvYy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB3cy5qYXIKLXNvdXJjZS53cy5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ4YzhiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzIj4KLSAgIDxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPgotICAgPC9jb21wb25lbnQtZGVwZW5kcz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cyIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmV4cGxvcmVyIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1YThiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcwotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkNzRjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cyIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgbmFtZT0iJVBMVUdJTl9OQU1FIgotICAgcHJvdmlkZXItbmFtZT0iJVBMVUdJTl9QUk9WSURFUiIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPiAKLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLnVkZGk0aiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL051bGxTdGF0dXNNb25pdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvTnVsbFN0YXR1c01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyY2JjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvTnVsbFN0YXR1c01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0qIEEgTnVsbFN0YXR1c1JlbmRlcmVyIHRocm93cyBhd2F5IElTdGF0dXMgaW5mb3JtYXRpb24uCi0qLwotcHVibGljIGNsYXNzIE51bGxTdGF0dXNNb25pdG9yIGltcGxlbWVudHMgU3RhdHVzTW9uaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByb3RlY3RlZCBib29sZWFuIHJlc3VsdDsKLQotICAvKioKLSAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAqLwotICBwdWJsaWMgTnVsbFN0YXR1c01vbml0b3IgKCkgIHt9Ci0gIC8qKgotICAqIERvZXMgbm90aGluZy4KLSAgKi8KLSAgcHVibGljIGludCByZXBvcnRTdGF0dXMoSVN0YXR1cyBzdGF0dXMsIFZlY3RvciBvcHRpb25zKSB7IHJldHVybiAwOyB9Ci0gIHB1YmxpYyBib29sZWFuIHJlcG9ydFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgCi0gIHsgCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICBjYXNlIElTdGF0dXMuRVJST1I6Ci0gICAgICBjYXNlIElTdGF0dXMuV0FSTklORzoKLSAgICAgIAkJcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAJCWJyZWFrOwotCSAgY2FzZSBJU3RhdHVzLklORk86Ci0gICAgICBkZWZhdWx0OiAvL0lTdGF0dXMuT0sKLSAgICAgIAkJcmVzdWx0ID0gdHJ1ZTsgCi0gICAgICAJCWJyZWFrOwotICAgICB9Ci0gCXJldHVybiByZXN1bHQ7Ci0gIH0KLSAgcHVibGljIHZvaWQgZHVtcFNhdmVkU3RhdHVzKCkgeyB9Ci0gIHB1YmxpYyBib29sZWFuIGNhbkNvbnRpbnVlKCkgCi0gIHsgCi0JcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0ICgpIHsKLSAgCQlyZXN1bHQgPSB0cnVlOwotICAJfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzTW9uaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL1N0YXR1c01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlOTFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSogQSBTdGF0dXNNb25pdG9yIHJlcG9ydHMgSVN0YXR1cyBpbmZvcm1hdGlvbiB0byBhIGRpc3BsYXkgc3lzdGVtLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdHVzTW9uaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIHJlcG9ydHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBzdGF0dXMgb2JqZWN0LgotICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVwb3J0Ci0gICogSVN0YXR1cyBpbmZvcm1hdGlvbiB0byBhIGdpdmVuIGRpc3BsYXkgc3lzdGVtLAotICAqIHN1Y2ggYXMgU1dULCB0aGUgY29tbWFuZCBsaW5lLCBvciBhIHRyYWNlIGZpbGUuCi0gICovCi0gIHB1YmxpYyBpbnQgcmVwb3J0U3RhdHVzKElTdGF0dXMgc3RhdHVzLCBWZWN0b3Igb3B0aW9ucyk7Ci0gIHB1YmxpYyBib29sZWFuIHJlcG9ydFN0YXR1cyhJU3RhdHVzIHN0YXR1cyk7Ci0gIHB1YmxpYyB2b2lkIGR1bXBTYXZlZFN0YXR1cygpOwotICBwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZSgpOwotICBwdWJsaWMgdm9pZCByZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL1N0YXR1c1JlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmZjNhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSogQSBTdGF0dXNSZW5kZXJlciByZW5kZXJzIElTdGF0dXMgaW5mb3JtYXRpb24gdG8gYSBkaXNwbGF5IHN5c3RlbS4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1c1JlbmRlcmVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogUmVuZGVycyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHN0YXR1cyBvYmplY3QuCi0gICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW5kZXIKLSAgKiBJU3RhdHVzIGluZm9ybWF0aW9uIHRvIGEgZ2l2ZW4gZGlzcGxheSBzeXN0ZW0sCi0gICogc3VjaCBhcyBTV1QsIHRoZSBjb21tYW5kIGxpbmUsIG9yIGEgdHJhY2UgZmlsZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcmVuZGVyICggSVN0YXR1cyBzdGF0dXMgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0FueUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vQW55RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDBhMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vQW55RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotCi0KLS8qKgotKiBUaGlzIGlzIGEga2luZCBvZiB7QGxpbmsgRmlsdGVyfSB0aGF0IGFjY2VwdHMgYWxsIG9iamVjdHMsCi0qIGFuZCBpcyBhIHN1aXRhYmxlIGJhc2UgY2xhc3MgZm9yIG5ldyA8Y29kZT5GaWx0ZXJzPC9jb2RlPi4KLSovCi1wdWJsaWMgY2xhc3MgQW55RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5BbnlGaWx0ZXI8L2NvZGU+LgotICAqLwotICBwdWJsaWMgQW55RmlsdGVyICgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVBTllfRklMVEVSX05BTUUiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVBTllfRklMVEVSX0RFU0MiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogU2VlIHtAbGluayBGaWx0ZXIjc3RhdHVzT2Z9IGZvciBnZW5lcmFsIGNvbW1lbnRzLgotICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkFueUZpbHRlcjwvY29kZT4KLSAgKiByZXR1cm5zIGEgc3RhdHVzIHdpdGggc2V2ZXJpdHkgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4uCi0gICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIEFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30uCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLFdlYlNlcnZpY2VQbHVnaW4uSUQsMCwiIixudWxsKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB7QGxpbmsgI3N0YXR1c09mfSByZXR1cm5zCi0gICogYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfSB3aXRoIGEKLSAgKiBzZXZlcml0eSBvZiBsZXNzIHRoYW4gPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4uCi0gICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhIGhpZ2hlci1wZXJmb3JtYW5jZQotICAqIGltcGxlbWVudGF0aW9uLgotICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBmaWx0ZXIuCi0gICogQHJldHVybiBUcnVlIGlmIGFuZCBvbmx5IGlmIHtAbGluayAjc3RhdHVzT2Z9IHJldHVybnMKLSAgKiBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9IHdpdGggYQotICAqIHNldmVyaXR5IG9mIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyAoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgcmV0dXJuICFzdGF0dXNPZihvYmplY3QpLm1hdGNoZXMoSVN0YXR1cy5FUlJPUik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2ZDE0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9FbnZpcm9ubWVudFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlRyYW5zaWVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVByb2dyZXNzTW9uaXRvcjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbnZpcm9ubWVudFV0aWxzCi17Ci0gIC8qKgotICAgKiBAcGFyYW0gZW52Ci0gICAqIEByZXR1cm4gSVByb2dyZXNzTW9uaXRvcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldElQcm9ncmVzc01vbml0b3IoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAkgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgIAkgSVByb2dyZXNzTW9uaXRvciBlY2xpcHNlTW9uaXRvciA9IG51bGw7Ci0gICAgIAkgaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKQotICAgICAJIHsKLSAgICAgCSAJZWNsaXBzZU1vbml0b3IgPSAoKEVjbGlwc2VQcm9ncmVzc01vbml0b3IpbW9uaXRvcikuZ2V0TW9uaXRvcigpOwotICAgICAJIH0KLSAgICAgCSByZXR1cm4gZWNsaXBzZU1vbml0b3I7Ci0gIH0KLSAgCi0gIAotICAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGVudiBUaGlzIHNob3VsZCBiZSBhbiBFY2xpcHNlRW52aXJvbm1lbnQuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFJlc291cmNlQ29udGV4dC4KLSAgICovIAotICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoIEVudmlyb25tZW50IGVudiApCi0gIHsKLSAgICBSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgCi0gICAgaWYoIGVudiBpbnN0YW5jZW9mIEVjbGlwc2VFbnZpcm9ubWVudCApCi0gICAgewotICAgICAgY29udGV4dCA9ICgoRWNsaXBzZUVudmlyb25tZW50KWVudikuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY29udGV4dDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBpc3RhdHVzCi0gICAqIEByZXR1cm4gU3RhdHVzCi0gICAqLwotCi0gIC8qKgotICAgKiBUT0RPOiBEZWxldGUuIFRoZXJlJ3MgYSByZXBsYWNlbWVudCBpbiB0aGUgZW52IHBsdWdpbi4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0YXR1cyBjb252ZXJ0SVN0YXR1c1RvU3RhdHVzKElTdGF0dXMgaXN0YXR1cykKLSAgewotICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSBpc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBpc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgaW50IG5vT2ZDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICBpZiAobm9PZkNoaWxkcmVuID4gMCkKLSAgICB7Ci0gICAgICBTdGF0dXNbXSBzdGF0dXNDaGlsZHJlbiA9IG5ldyBTdGF0dXNbbm9PZkNoaWxkcmVuXTsKLSAgICAgIGZvciAoaW50IGk9MDtpPG5vT2ZDaGlsZHJlbjtpKyspCi0gICAgICB7Ci0gICAgICAgIHN0YXR1c0NoaWxkcmVuW2ldID0gY29udmVydElTdGF0dXNUb1N0YXR1cyhjaGlsZHJlbltpXSk7Ci0gICAgICB9Ci0KLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbWVzc2FnZSxzdGF0dXNDaGlsZHJlbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc2V2ZXJpdHkgPSBpc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0gICAgICBpbnQgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuT0s7Ci0gICAgICBzd2l0Y2ggKHNldmVyaXR5KQotICAgICAgewotICAgICAgICBjYXNlIElTdGF0dXMuRVJST1I6Ci0gICAgICAgICAgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuRVJST1I7Ci0gICAgICAgIAlicmVhazsKLSAgICAgICAgY2FzZSBJU3RhdHVzLldBUk5JTkc6Ci0gICAgICAgICAgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuV0FSTklORzsKLSAgICAgICAgCWJyZWFrOwotICAgICAgICBjYXNlIElTdGF0dXMuSU5GTwk6Ci0gICAgICAgICAgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuSU5GTzsKLSAgICAgICAgCWJyZWFrOyAgICAgIAkKLSAgICAgICAgY2FzZSBJU3RhdHVzLk9LOgotICAgICAgICAgIHN0YXR1c1NldmVyaXR5ID0gU3RhdHVzLk9LOwotICAgICAgICAJYnJlYWs7ICAgICAgCQotICAgICAgICBkZWZhdWx0OgotICAgICAgfQotICAgICAgVGhyb3dhYmxlIGUgPSBpc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtZXNzYWdlLHN0YXR1c1NldmVyaXR5LGUpOwotICAgIH0KLSAgICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogVE9ETzogRGVsZXRlLiBUaGVyZSdzIGEgcmVwbGFjZW1lbnQgaW4gdGhlIGVudiBwbHVnaW4uIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoU3RhdHVzIHN0YXR1cywgU3RyaW5nIHBsdWdpbklkKQotICB7Ci0gICAgSVN0YXR1cyBpc3RhdHVzOwotICAgIFN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICBUaHJvd2FibGUgdGhyb3dhYmxlID0gc3RhdHVzLmdldFRocm93YWJsZSgpOwotICAgIGlmIChzdGF0dXMuaGFzQ2hpbGRyZW4oKSkKLSAgICB7Ci0gICAgICBTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgICAgaW50IG5vT2ZDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgIElTdGF0dXNbXSBpc3RhdHVzQ2hpbGRyZW4gPSBuZXcgSVN0YXR1c1tub09mQ2hpbGRyZW5dOwotICAgICAgZm9yIChpbnQgaT0wO2k8bm9PZkNoaWxkcmVuO2krKykKLSAgICAgIHsKLSAgICAgICAgaXN0YXR1c0NoaWxkcmVuW2ldID0gY29udmVydFN0YXR1c1RvSVN0YXR1cyhjaGlsZHJlbltpXSwgcGx1Z2luSWQpOwotICAgICAgfQotCi0gICAgICBpc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLDAsaXN0YXR1c0NoaWxkcmVuLG1lc3NhZ2UsdGhyb3dhYmxlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotICAgICAgaW50IGlzdGF0dXNTZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0gICAgICBzd2l0Y2ggKHNldmVyaXR5KQotICAgICAgewotICAgICAgICBjYXNlIFN0YXR1cy5FUlJPUjoKLSAgICAgICAgICBpc3RhdHVzU2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotICAgICAgICAJYnJlYWs7Ci0gICAgICAgIGNhc2UgU3RhdHVzLldBUk5JTkc6Ci0gICAgICAgICAgaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotICAgICAgICAJYnJlYWs7Ci0gICAgICAgIGNhc2UgU3RhdHVzLklORk86Ci0gICAgICAgICAgaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotICAgICAgICAJYnJlYWs7ICAgICAgCQotICAgICAgICBjYXNlIFN0YXR1cy5PSzoKLSAgICAgICAgICBpc3RhdHVzU2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotICAgICAgICAJYnJlYWs7ICAgICAgCQotICAgICAgICBkZWZhdWx0OgotICAgICAgfSAgICAgIAotICAgICAgaXN0YXR1cyA9IG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKGlzdGF0dXNTZXZlcml0eSxwbHVnaW5JZCwwLG1lc3NhZ2UsdGhyb3dhYmxlKTsKLSAgICB9Ci0gICAgICAKLSAgICByZXR1cm4gaXN0YXR1czsKLSAgfSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmMGJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGEgY2xhc3Mgb2Ygb2JqZWN0cyB0aGF0IGZpbHRlcgotKiBvdGhlciBvYmplY3RzIGZvciBpbmNsdXNpb24gb3IgZXhjbHVzaW9uIGJ5IHNvbWUgY29uc3VtZXIuCi0qLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogZGVzY3JpYmluZyB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPidzIGFzc2Vzc21lbnQgb2YKLSAgKiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKiBUaGUgc2V2ZXJpdHkgb2YgdGhlCi0gICogcmV0dXJuZWQgPGNvZGU+SVN0YXR1czwvY29kZT4gaXMgYXMgZm9sbG93czoKLSAgKiA8dWw+Ci0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNPS30KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBhY2NlcHRzIHRoZSA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogd2l0aCBubyBmdXJ0aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgY2FsbGVyIChtZWFuaW5nIHRoZQotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRNZXNzYWdlfSBhbmQKLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjZ2V0RXhjZXB0aW9ufSBtZXRob2RzCi0gICogYXJlIGlnbm9yZWQpLgotICAqIDxsaT4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjSU5GT30KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBhY2NlcHRzIHRoZSA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNXQVJOSU5HfQotICAqIGlmIHRoZSA8Y29kZT5GaWx0ZXI8L2NvZGU+IGFjY2VwdHMgdGhlIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNFUlJPUn0KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBkb2VzIG5vdCBhY2NlcHQgdGhlIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPC91bD4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gQW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApOwotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LiBUaGlzIG1ldGhvZAotICAqIG11c3QgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYge0BsaW5rICNzdGF0dXNPZn0KLSAgKiByZXR1cm5zIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IHdpdGggYSBzZXZlcml0eSBvZgotICAqIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzICggT2JqZWN0IG9iamVjdCApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vSVByb2plY3RUb1N0cmluZ1RyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9JUHJvamVjdFRvU3RyaW5nVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzMDAwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9JUHJvamVjdFRvU3RyaW5nVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotCi0vKioKLSAqIFRyYW5zZnJvbXMgYSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2plY3QgdG8gamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgSVByb2plY3RUb1N0cmluZ1RyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgewotCQotCSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotCSAgewotCSAgCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpdmFsdWU7Ci0JICAgIHJldHVybiBwcm9qZWN0LmdldE5hbWUoKTsKLQkgIH0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTk4ZGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA4LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLQotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqLwotcHVibGljIGNsYXNzIEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeSB7Ci0JCi0gCQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMVVJJKFNlcnZpY2VJbXBsIHNlcnZpY2VJbXBsKQotICB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBzZXJ2aWNlSW1wbC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gIAlTdHJpbmcgbG9jYXRpb24gPSBkZWZpbml0aW9uLmdldExvY2F0aW9uKCk7Ci0gIAkKLSAgCXJldHVybiBsb2NhdGlvbjsKLSAgfQotICAgCi0gIC8vaGFzIHRvIGJlIHVuZGVyIHRoZSB3ZWJjb250ZW50Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQl9DT05URU5UID0gIldlYkNvbnRlbnQiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMVVJJKFNlcnZpY2VSZWYgc2VydmljZUltcGwpCi0gIHsKLSAgCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2VydmljZUltcGwpOwotICAJSVBhdGggcGF0aCA9IHByb2plY3QuZ2V0TG9jYXRpb24oKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAJcGF0aCA9IHBhdGguYXBwZW5kKFdFQl9DT05URU5UKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAJcGF0aCA9IHBhdGguYXBwZW5kKHNlcnZpY2VJbXBsLmdldFdzZGxGaWxlKCkpOwotICAJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aC50b1N0cmluZygpKTsKLSAgCXRyeXsKLSAgCSAgVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKLSAgCSAgcmV0dXJuIHVybC50b1N0cmluZygpOwotICAJfWNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXtyZXR1cm4gbnVsbDt9Ci0gIAkKLSB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMVVJJKFdTRExSZXNvdXJjZUltcGwgd3NkbFJJKQotICB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsUkkuZ2V0RGVmaW5pdGlvbigpOwotICAJU3RyaW5nIGxvY2F0aW9uID0gZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpOwotICAJCi0gIAlyZXR1cm4gbG9jYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTSUxQYXRoKFdTRExSZXNvdXJjZUltcGwgd3NkbFJJKQotICB7Ci0gIAlyZXR1cm4gY29udmVydFRvUmVsYXRpdmUoZ2V0V1NETFVSSSh3c2RsUkkpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NJTFBhdGgoU2VydmljZVJlZiBzZXJ2aWNlSW1wbCkKLSAgewotICAJcmV0dXJuIGNvbnZlcnRUb1JlbGF0aXZlKGdldFdTRExVUkkoc2VydmljZUltcGwpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NJTFBhdGgoU2VydmljZUltcGwgc2VydmljZUltcGwpCi0gIHsKLSAgCXJldHVybiBjb252ZXJ0VG9SZWxhdGl2ZShnZXRXU0RMVVJJKHNlcnZpY2VJbXBsKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTEU9ImZpbGU6LyI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTEVMPSJmaWxlOiI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9SZWxhdGl2ZShTdHJpbmcgdXJpKQotICB7Ci0gIAkvL3JlbW92ZSBmaWxlOgotICAJU3RyaW5nIHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLSAgICByb290ID0gRklMRSArIHJvb3Q7Ci0gIAlTdHJpbmcgcm9vdEwgPSBGSUxFTCArIHJvb3Q7Ci0gICAgaWYodXJpLnN0YXJ0c1dpdGgocm9vdCkgfHwgdXJpLnN0YXJ0c1dpdGgocm9vdEwpKXsKLSAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKHJvb3QubGVuZ3RoKCkpOyAgCQotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KMkVFVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU0M2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uQWRkTW9kdWxlVG9FQVJQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklFQVJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3QuRUpCTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklFSkJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSjJFRVdlYk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLm1vZHVsZWNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBzb21lIHVzZWZ1bCBKMkVFIHV0aWxpdGllcy4KLSAqIAotICogQGF1dGhvciBQZXRlciBNb29nawotICogQGRhdGUgQXVndXN0IDIzLCAyMDAxCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKMkVFVXRpbHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB3ZWJQcm9qZWN0TmF0dXJlID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRTsgLy8gSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZWpiUHJvamVjdE5hdHVyZSA9IElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEU7IC8vIElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlYXJQcm9qZWN0TmF0dXJlID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRTsgLy8gSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQ7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKMkVFIHZlcnNpb24gaWQgKGRlZmluZWQgaW4gSjJFRVZlcnNpb25Db25zdGFudHMpIG9mIHRoZQotCSAqIHByb2plY3QuIElmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGhhdmUgYSBKMkVFTmF0dXJlLCAtMSBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqIEByZXR1cm4gdGhlIEoyRUUgdmVyc2lvbiBpZCAoZGVmaW5lZCBpbiBKMkVFVmVyc2lvbkNvbnN0YW50cyksIC0xIGlmIHAKLQkgKiAgICAgICAgIGRvZXMgbm90IGhhdmUgYSBKMkVFTmF0dXJlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgbW9kdWxlJ3MgajJlZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SjJFRVZlcnNpb24oSVByb2plY3QgcCkgewotCQlpbnQgajJlZVZlciA9IC0xOwotCQlTdHJ1Y3R1cmVFZGl0IG1jID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCQlpZiAod2Jjcy5sZW5ndGghPTApIHsKLQkJCQlqMmVlVmVyID0gZ2V0V2ViTW9kdWxlSjJFRVZlcnNpb24od2Jjc1swXSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCWZpbmFsbHl7Ci0JCQlpZiAobWMhPW51bGwpCi0JCQkJbWMuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBqMmVlVmVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEoyRUVWZXJzaW9uQXNTdHJpbmcoSVByb2plY3QgcCl7Ci0JCWludCBqMmVlVmVyID0gZ2V0SjJFRVZlcnNpb24ocCk7Ci0JCWlmIChqMmVlVmVyIT0tMSl7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoajJlZVZlcik7Ci0JCX0KLQkJZWxzZSAKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBXZWIgTW9kdWxlJ3MgSjJFRSB2ZXJzaW9uCi0JICogQHBhcmFtIHdiTW9kdWxlCi0JICogQHJldHVybiB0aGUgSjJFRSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0V2ViTW9kdWxlSjJFRVZlcnNpb24oV29ya2JlbmNoQ29tcG9uZW50IHdiTW9kdWxlKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsKLQkJaW50IG5WZXJzaW9uID0gMTI7Ci0JCXRyeSB7Ci0JCQl3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQod2JNb2R1bGUpOwotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkgewotCQkJCW5WZXJzaW9uID0gd2ViRWRpdC5nZXRKMkVFVmVyc2lvbigpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpCi0JCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIG5WZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIG9mIHRoZSBFQVIgcHJvamVjdHMgdGhhdCByZWZlcmVuY2UgdGhlIHNwZWNpZmllZAotCSAqIHByb2plY3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWVbXSBnZXRFQVJQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQotCQlFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCXJldHVybiBlYXJzOwotCX0KLQkJCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFQVJQcm9qZWN0TmFtZXNGb3JXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJVmVjdG9yIEVBUk5hbWVzID0gbmV3IFZlY3RvcigpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IGdldEVBUlByb2plY3RzKHByb2plY3QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRUFSTmFtZXMuYWRkKGVhcnNbaV0uZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVBUk5hbWVzLmlzRW1wdHkoKSA/IG51bGwgOiAoU3RyaW5nW10pIEVBUk5hbWVzCi0JCQkJLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBhbGwgb2YgdGhlIEVBUiBwcm9qZWN0cyB0aGF0IHJlZmVyZW5jZSB0aGUgc3BlY2lmaWVkCi0JICogZWpiIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBFQVJOYXR1cmVSdW50aW1lW10gZ2V0RUpCRUFSUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCkgewotCQlFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCXJldHVybiBlYXJzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RUFSUHJvamVjdE5hbWVzRm9yRUpCUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVZlY3RvciBFQVJOYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBnZXRFSkJFQVJQcm9qZWN0cyhwcm9qZWN0KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykgewotCQkJCUVBUk5hbWVzLmFkZChlYXJzW2ldLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBFQVJOYW1lcy5pc0VtcHR5KCkgPyBudWxsIDogKFN0cmluZ1tdKSBFQVJOYW1lcwotCQkJCS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRUFSTmF0dXJlUnVudGltZVtdIGdldEFwcENsaWVudEVBUlByb2plY3RzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcwotCQkJCS5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOwotCQlyZXR1cm4gZWFyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFQVIgbmF0dXJlIHJ1bnRpbWUgZnJvbSBhbiBFQVIgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBJUHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIEVBUiBwcm9qZWN0Ci0JICogQHJldHVybiBFQVJOYXR1cmVSdW50aW1lIG9mIHRoZSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBFQVJOYXR1cmVSdW50aW1lIGdldEVBUk5hdHVyZVJ1bnRpbWVGcm9tUHJvamVjdCgKLQkJCUlQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBFQVIgbmFtZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgd2ViIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFQVJOYW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJzID0gZ2V0RUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCVN0cmluZ1tdIGVhck5hbWVzID0gbmV3IFN0cmluZ1tlYXJzID09IG51bGwgPyAwIDogZWFycy5sZW5ndGhdOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlYXJOYW1lcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCWVhck5hbWVzW2luZGV4XSA9IGVhcnNbaW5kZXhdLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gZWFyTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhbGwgRUpCIHByb2plY3RzIGZvciBhIHBhcnRpY3VsYXIgRUFSIE5hdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmVjdG9yIG9mIEVKQk5hdHVyZVJ1bnRpbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIGdldEVKQlByb2plY3RzKEVBUk5hdHVyZVJ1bnRpbWUgZWFyKSB7Ci0JCVZlY3RvciBlamJzID0gbmV3IFZlY3RvcigpOwotCQlJdGVyYXRvciBlYXJQcm9qZWN0cyA9IGVhci5nZXRNb2R1bGVQcm9qZWN0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGVhclByb2plY3RzLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iamVjdCA9IGVhclByb2plY3RzLm5leHQoKTsKLQotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJSjJFRU5hdHVyZSBqMmVlTmF0dXJlID0gKEoyRUVOYXR1cmUpIG9iamVjdDsKLQotCQkJCWlmIChqMmVlTmF0dXJlIGluc3RhbmNlb2YgRUpCTmF0dXJlUnVudGltZSkgewotCQkJCQllamJzLmFkZChqMmVlTmF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWpiczsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGFsbCBXZWIgcHJvamVjdHMgZm9yIGEgcGFydGljdWxhciBFQVIgTmF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gYSB2ZWN0b3Igb2YgSjJFRVdlYk5hdHVyZVJ1bnRpbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIGdldFdlYlByb2plY3RzKEVBUk5hdHVyZVJ1bnRpbWUgZWFyKSB7Ci0JCVZlY3RvciB3ZWJQcm9qZWN0cyA9IG5ldyBWZWN0b3IoKTsKLQkJSXRlcmF0b3IgZWFyUHJvamVjdHMgPSBlYXIuZ2V0TW9kdWxlUHJvamVjdHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChlYXJQcm9qZWN0cy5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBlYXJQcm9qZWN0cy5uZXh0KCk7Ci0KLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCUoyRUVOYXR1cmUgajJlZU5hdHVyZSA9IChKMkVFTmF0dXJlKSBvYmplY3Q7Ci0KLQkJCQlpZiAoajJlZU5hdHVyZSBpbnN0YW5jZW9mIEoyRUVXZWJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJCXdlYlByb2plY3RzLmFkZChqMmVlTmF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gd2ViUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiByZXR1cm5zIGEgbGlzdCBvZiBwcm9qZWN0cyBuYW1lcyBmb3IgYSBnaXZlbiBlYXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFSkJQcm9qZWN0TmFtZXMoRUFSTmF0dXJlUnVudGltZSBlYXIpIHsKLQkJVmVjdG9yIGVqYk5hdHVyZXMgPSBnZXRFSkJQcm9qZWN0cyhlYXIpOwotCQlTdHJpbmdbXSBlamJQcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW2VqYk5hdHVyZXMuc2l6ZSgpXTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWpiUHJvamVjdE5hbWVzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJZWpiUHJvamVjdE5hbWVzW2luZGV4XSA9ICgoRUpCTmF0dXJlUnVudGltZSkgKGVqYk5hdHVyZXMKLQkJCQkJLmVsZW1lbnRBdChpbmRleCkpKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGVqYlByb2plY3ROYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHJldHVybnMgYSBWZWN0b3Igb2YgYmVhbiBTdHJpbmcgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgZ2V0QmVhbk5hbWVzKEVKQkphciBqYXIpIHsKLQkJLy8gV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucy4KLQkJLy8gTGlzdCBjbXBCZWFucyA9IGphci5nZXRCZWFuTWFuYWdlZEJlYW5zKCk7Ci0JCS8vIExpc3QgYm1wQmVhbnMgPSBqYXIuZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0JCUxpc3Qgc2Vzc2lvbkJlYW5zID0gamFyLmdldFNlc3Npb25CZWFucygpOwotCi0JCVZlY3RvciBuYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQotCQkvLyBnZXRCZWFuTmFtZXMoIG5hbWVzLCBjbXBCZWFucyApOwotCQkvLyBnZXRCZWFuTmFtZXMoIG5hbWVzLCBibXBCZWFucyApOwotCQlnZXRCZWFuTmFtZXMobmFtZXMsIHNlc3Npb25CZWFucyk7Ci0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lcwotCSAqICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgdmVjdG9yIG9mIHN0cmluZ3MgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWRkIGJlYW4KLQkgKiAgICAgICAgICAgIG5hbWVzIHRvLgotCSAqIEBwYXJhbSBiZWFucwotCSAqICAgICAgICAgICAgc3BlY2lmaWVzIGEgbGlzdCBvZiBiZWFucy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEJlYW5OYW1lcyhWZWN0b3IgbmFtZXMsIExpc3QgYmVhbnMpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBiZWFucy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIChpdGVyYXRvci5uZXh0KCkpOwotCi0JCQlpZiAoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJCVNlc3Npb24gc2Vzc2lvbkJlYW4gPSAoU2Vzc2lvbikgYmVhbjsKLQotCQkJCWlmIChzZXNzaW9uQmVhbi5nZXRTZXNzaW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gU2Vzc2lvblR5cGUuU1RBVEVMRVNTKSB7Ci0JCQkJCW5hbWVzLmFkZChiZWFuLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBXZWJQcm9qZWN0LCBnaXZlbiB0aGUgRUpCCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbUVKQihFbnRlcnByaXNlQmVhbiBlamIpIHsKLQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlamIpOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBhcnJheSBvZiBJUHJvamVjdCwgZ2l2ZW4gYSBWZWN0b3Igb2YgSjJFRU5hdHVyZSdzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldElQcm9qZWN0c0Zyb21KMkVFTmF0dXJlcyhWZWN0b3IgajJlZW5hdHVyZVZlY3RvcikgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElQcm9qZWN0W2oyZWVuYXR1cmVWZWN0b3IgPT0gbnVsbAotCQkJCT8gMAotCQkJCTogajJlZW5hdHVyZVZlY3Rvci5zaXplKCldOwotCQlFbnVtZXJhdGlvbiBlID0gajJlZW5hdHVyZVZlY3Rvci5lbGVtZW50cygpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlKMkVFTmF0dXJlIG5hdHVyZSA9IChKMkVFTmF0dXJlKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbmF0dXJlLmdldFByb2plY3QoKTsKLQkJCXByb2plY3RzW2ldID0gcHJvamVjdDsKLQkJCWkrKzsKLQkJfQotCi0JCXJldHVybiBwcm9qZWN0czsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0RUFSUHJvamVjdHMoKSB7Ci0JCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLS8vCQkJCWlmIChwcm9qZWN0c1tpXS5oYXNOYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKSB7Ci0JCQkJaWYgKFJlc291cmNlVXRpbHMuaXNFQVJQcm9qZWN0KHByb2plY3RzW2ldKSkgewotCQkJCQl2LmFkZChwcm9qZWN0c1tpXSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQkJfQotCi0JCX0KLQkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFt2LnNpemUoKV07Ci0JCXYuY29weUludG8oZWFyUHJvamVjdHMpOwotCQlyZXR1cm4gZWFyUHJvamVjdHM7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXQgYSBKMkVFIDEuMiBFQVIgUHJvamVjdC4gUmV0dXJucyBudWxsIGlmIG5vIEoyRUUgMS4yIEVBUiBQcm9qZWN0cwotCSAqIGV4aXN0Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWUgZ2V0MTJFQVIoKSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIGFsbEVBUnMgPSBnZXRFQVJQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFQVJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSBmaXJzdCAxLjIgRUFSIGVuY291bnRlcmVkCi0JCQkJRUFSTmF0dXJlUnVudGltZSB0aGlzRUFSID0gKEVBUk5hdHVyZVJ1bnRpbWUpIChhbGxFQVJzW2ldCi0JCQkJCQkuZ2V0TmF0dXJlKElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSk7Ci0JCQkJaWYgKHRoaXNFQVIuZ2V0SjJFRVZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCkgewotCQkJCQlyZXR1cm4gdGhpc0VBUjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vIGhhbmRsZSBleGNlcHRpb24KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0MTJFQVJQcm9qZWN0KCl7Ci0JCXRyeXsKLQkJCUlQcm9qZWN0W10gYWxsRUFScyA9IGdldEVBUlByb2plY3RzKCk7Ci0JCQlmb3IgKGludCBpPTA7aTxhbGxFQVJzLmxlbmd0aDtpKyspewotCQkJCS8vIHJldHVybiB0aGUgZmlyc3QgMS4yIEVBUiBwcm9qZWN0Ci0JCQkJSVByb2plY3QgZWFyID0gYWxsRUFSc1tpXTsKLQkJCQlpZiAoZ2V0SjJFRVZlcnNpb25Bc1N0cmluZyhlYXIpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkoyRUVfVkVSU0lPTl8xXzIpKXsKLQkJCQkJcmV0dXJuIGVhcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBKMkVFIDEuMyBFQVIgUHJvamVjdC4gUmV0dXJucyBudWxsIGlmIG5vIEoyRUUgMS4zIEVBUiBQcm9qZWN0cwotCSAqIGV4aXN0Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWUgZ2V0MTNFQVIoKSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIGFsbEVBUnMgPSBnZXRFQVJQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFQVJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSBmaXJzdCAxLjMgRUFSIGVuY291bnRlcmVkCi0JCQkJRUFSTmF0dXJlUnVudGltZSB0aGlzRUFSID0gKEVBUk5hdHVyZVJ1bnRpbWUpIChhbGxFQVJzW2ldCi0JCQkJCQkuZ2V0TmF0dXJlKElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSk7Ci0JCQkJaWYgKHRoaXNFQVIuZ2V0SjJFRVZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkgewotCQkJCQlyZXR1cm4gdGhpc0VBUjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoqCi0JICogR2V0IGEgSjJFRSAxLjMgRUFSIFByb2plY3QuIFJldHVybnMgbnVsbCBpZiBubyBKMkVFIDEuMyBFQVIgUHJvamVjdHMgZXhpc3RzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0MTNFQVJQcm9qZWN0KCl7Ci0JCXRyeXsKLQkJCUlQcm9qZWN0W10gYWxsRUFScyA9IGdldEVBUlByb2plY3RzKCk7Ci0JCQlmb3IgKGludCBpPTA7aTxhbGxFQVJzLmxlbmd0aDtpKyspewotCQkJCS8vIHJldHVybiB0aGUgZmlyc3QgMS4zIEVBUiBwcm9qZWN0Ci0JCQkJSVByb2plY3QgZWFyID0gYWxsRUFSc1tpXTsKLQkJCQlpZiAoZ2V0SjJFRVZlcnNpb25Bc1N0cmluZyhlYXIpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkoyRUVfVkVSU0lPTl8xXzMpKXsKLQkJCQkJcmV0dXJuIGVhcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdmVyc2lvbklkCi0JICogQHJldHVybgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFQVJOYXR1cmVSdW50aW1lIGdldEVBUihpbnQgdmVyc2lvbklkKSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIGFsbEVBUnMgPSBnZXRFQVJQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFQVJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRUFSTmF0dXJlUnVudGltZSB0aGlzRUFSID0gKEVBUk5hdHVyZVJ1bnRpbWUpIChhbGxFQVJzW2ldCi0JCQkJCQkuZ2V0TmF0dXJlKElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSk7Ci0JCQkJaWYgKHRoaXNFQVIuZ2V0SjJFRVZlcnNpb24oKSA9PSB2ZXJzaW9uSWQpIHsKLQkJCQkJcmV0dXJuIHRoaXNFQVI7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBoYW5kbGUgZXhjZXB0aW9uCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IEVBUiBwcm9qZWN0IG9mIGEgZ2l2ZW4gdmVyc2lvbiBpZAotCSAqIEBwYXJhbSB2ZXJzaW9uSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRFQVJQcm9qZWN0T2ZWZXJzaW9uKGludCB2ZXJzaW9uSWQpewotCQl0cnkgewotCQkJSVByb2plY3RbXSBhbGxFQVJzID0gZ2V0RUFSUHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRUFScy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IGVhciA9IGFsbEVBUnNbaV07Ci0JCQkJaWYgKGdldEoyRUVWZXJzaW9uKGVhcikgPT0gdmVyc2lvbklkKSB7Ci0JCQkJCXJldHVybiBlYXI7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsRnJvbUoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbkludCkgewotCQlpZiAoajJlZVZlcnNpb25JbnQgPT0gbnVsbCB8fCBqMmVlVmVyc2lvbkludC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOwotCi0JCWludCBqMmVlVmVyc2lvbiA9IEludGVnZXIucGFyc2VJbnQoajJlZVZlcnNpb25JbnQpOwotCQlzd2l0Y2ggKGoyZWVWZXJzaW9uKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80X1RFWFQ7Ci0JCQlkZWZhdWx0IDoKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoaXMgaXMgbm90IGEgSjJFRSB2ZXJzaW9uISEiKTsKLQkJCQlyZXR1cm4gIiI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKMkVFVmVyc2lvbkZyb21MYWJlbChTdHJpbmcgajJlZUxhYmVsKSB7Ci0JCVN0cmluZyBqMmVlMTJTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0JCVN0cmluZyBqMmVlMTNTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCVN0cmluZyBqMmVlMTRTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCWlmIChqMmVlTGFiZWwuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpKQotCQkJcmV0dXJuIGoyZWUxMlN0cmluZzsKLQotCQlpZiAoajJlZUxhYmVsLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUKSkKLQkJCXJldHVybiBqMmVlMTNTdHJpbmc7Ci0KLQkJaWYgKGoyZWVMYWJlbC5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVCkpCi0JCQlyZXR1cm4gajJlZTE0U3RyaW5nOwotCi0JCXJldHVybiAiIjsKLQotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGVhciBwcm9qZWN0cyBpbiB3aGljaCB0aGlzIHByb2plY3QgaXMgYSBuZXN0ZWQgbW9kdWxlOwotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdAotCSAqIEByZXR1cm4gRUFScyBFQVIgcHJvamVjdHMsIHBvc3NpYmx5IG51bGwKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqICAgVGhpcyBtZXRob2QgaGFzIHRvbyBtdWNoIGNvbXBsZXhpdHk7IHRvIGJlIHNpbXBsaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWVbXSBnZXRFQVJQcm9qZWN0cyhJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCwKLQkJCUlTZXJ2ZXIgc2VydmVyKSB7Ci0KLQkJRUFSTmF0dXJlUnVudGltZVtdIGVhclByb2plY3RzID0gbnVsbDsKLQkJRUFSTmF0dXJlUnVudGltZSBlYXIgPSBudWxsOwotCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAoc2VydmljZVByb2plY3QgIT0gbnVsbCAmJiBzZXJ2aWNlUHJvamVjdC5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQotCQkJCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJzID0gbnVsbDsKLQkJCQlib29sZWFuIGlzV2ViRUpCT3JBcHBDbGllbnQgPSBSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChzZXJ2aWNlUHJvamVjdCkgLy9zZXJ2aWNlUHJvamVjdC5oYXNOYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkKLQkJCQkJCXx8ICBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChzZXJ2aWNlUHJvamVjdCkgLy9zZXJ2aWNlUHJvamVjdC5oYXNOYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpCi0JCQkJCQl8fCAgUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3Qoc2VydmljZVByb2plY3QpOy8vc2VydmljZVByb2plY3QuaGFzTmF0dXJlKElBcHBsaWNhdGlvbkNsaWVudE5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpOwotCQkJCWlmICghaXNXZWJFSkJPckFwcENsaWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQllYXJzID0gSjJFRVByb2plY3RVdGlsaXRpZXMKLQkJCQkJCS5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHNlcnZpY2VQcm9qZWN0KTsKLQotCQkJCS8vIHNlcGFyYXRlIEVBUnMgd2hpY2ggYXJlIGFscmVhZHkgZGVwbG95ZWQgdG8gdGhlIGV4aXN0aW5nCi0JCQkJLy8gc2VydmVyCi0JCQkJaWYgKGVhcnMgIT0gbnVsbCAmJiBlYXJzLmxlbmd0aCA+PSAxKSB7Ci0JCQkJCUFycmF5TGlzdCBwcmVmZXJyZWRFQVJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlBcnJheUxpc3Qgc2Vjb25kYXJ5RUFSTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQllYXIgPSBlYXJzW2ldOwotCQkJCQkJZWFyUHJvamVjdCA9IGVhci5nZXRQcm9qZWN0KCk7Ci0JCQkJCQlJTW9kdWxlIG1vZHVsZSA9IFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpOwotCQkJCQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHNlcnZlciAhPSBudWxsCi0JCQkJCQkJCQl8fCBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlciwKLQkJCQkJCQkJCQkJbW9kdWxlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKSkgewotCQkJCQkJCQlwcmVmZXJyZWRFQVJMaXN0LmFkZChlYXIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNlY29uZGFyeUVBUkxpc3QuYWRkKGVhcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGFkZCBzZWNvbmRhcnlFQVJMaXN0IGl0ZW1zIHRvIGVuZCBvZiBwcmltYXJ5IGxpc3QKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWNvbmRhcnlFQVJMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCQlwcmVmZXJyZWRFQVJMaXN0LmFkZChzZWNvbmRhcnlFQVJMaXN0LmdldChqKSk7Ci0JCQkJCX0KLQkJCQkJLy8gdG9BcnJheQotCQkJCQlpZiAocHJlZmVycmVkRUFSTGlzdCAhPSBudWxsKSB7Ci0JCQkJCQllYXJQcm9qZWN0cyA9IChFQVJOYXR1cmVSdW50aW1lW10pIHByZWZlcnJlZEVBUkxpc3QKLQkJCQkJCQkJLnRvQXJyYXkobmV3IEVBUk5hdHVyZVJ1bnRpbWVbMF0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNlKSB7Ci0JCQkJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0JCQkJbG9nLmxvZyhMb2cuRVJST1IsIDUwMzksIEoyRUVVdGlscy5jbGFzcywgImdldEVBUlByb2plY3RzIiwgY2UpOwotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVhclByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IEVBUiBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdCBhbmQgc2VydmVyCi0JICogQHBhcmFtIHNlcnZpY2VQcm9qZWN0Ci0JICogQHBhcmFtIHNlcnZlcgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0RGVmYXVsdEVBUlByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QsIElTZXJ2ZXIgc2VydmVyKSB7Ci0KLQkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IG51bGw7Ci0JCUlQcm9qZWN0IGVhciA9IG51bGw7Ci0KLQkJaWYgKHNlcnZpY2VQcm9qZWN0ICE9IG51bGwgJiYgc2VydmljZVByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0KLQkJCQlib29sZWFuIGlzV2ViRUpCT3JBcHBDbGllbnQgPSBSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChzZXJ2aWNlUHJvamVjdCkgLy9zZXJ2aWNlUHJvamVjdC5oYXNOYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkKLQkJCQkJCXx8ICBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChzZXJ2aWNlUHJvamVjdCkgLy9zZXJ2aWNlUHJvamVjdC5oYXNOYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpCi0JCQkJCQl8fCAgUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3Qoc2VydmljZVByb2plY3QpOy8vc2VydmljZVByb2plY3QuaGFzTmF0dXJlKElBcHBsaWNhdGlvbkNsaWVudE5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpOwotCQkJCWlmICghaXNXZWJFSkJPckFwcENsaWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlJUHJvamVjdFtdIGVhcnMgPSBnZXRFQVJQcm9qZWN0cygpOwotCi0JCQkJLy8gc2VwYXJhdGUgRUFScyB3aGljaCBhcmUgYWxyZWFkeSBkZXBsb3llZCB0byB0aGUgZXhpc3RpbmcKLQkJCQkvLyBzZXJ2ZXIKLQkJCQlpZiAoZWFycyAhPSBudWxsICYmIGVhcnMubGVuZ3RoID49IDEpIHsKLQkJCQkJQXJyYXlMaXN0IHByZWZlcnJlZEVBUkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUFycmF5TGlzdCBzZWNvbmRhcnlFQVJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWVhciA9IGVhcnNbaV07Ci0JCQkJCQlJTW9kdWxlIG1vZHVsZSA9IFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhcik7Ci0JCQkJCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoc2VydmVyICE9IG51bGwKLQkJCQkJCQkJCXx8IFNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoc2VydmVyLAotCQkJCQkJCQkJCQltb2R1bGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpKSB7Ci0JCQkJCQkJCXByZWZlcnJlZEVBUkxpc3QuYWRkKGVhcik7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2Vjb25kYXJ5RUFSTGlzdC5hZGQoZWFyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gYWRkIHNlY29uZGFyeUVBUkxpc3QgaXRlbXMgdG8gZW5kIG9mIHByaW1hcnkgbGlzdAotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlY29uZGFyeUVBUkxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJCXByZWZlcnJlZEVBUkxpc3QuYWRkKHNlY29uZGFyeUVBUkxpc3QuZ2V0KGopKTsKLQkJCQkJfQotCQkJCQkvLyB0b0FycmF5Ci0JCQkJCWlmIChwcmVmZXJyZWRFQVJMaXN0ICE9IG51bGwpIHsKLQkJCQkJCWVhclByb2plY3RzID0gKElQcm9qZWN0W10pIHByZWZlcnJlZEVBUkxpc3QudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNlKSB7Ci0JCQkJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0JCQkJbG9nLmxvZyhMb2cuRVJST1IsIDUwMzksIEoyRUVVdGlscy5jbGFzcywgImdldEVBUlByb2plY3RzIiwgY2UpOwotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVhclByb2plY3RzWzBdOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIEVKQiBwcm9qZWN0cyBpbiB0aGUgZWFycwotCSAqIAotCSAqIEBwYXJhbSBlYXJQcm9qZWN0cwotCSAqIEByZXR1cm4gcHJvamVjdHMgRUpCIHByb2plY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEVKQjJfMFByb2plY3RzRnJvbUVBUlMoRUFSTmF0dXJlUnVudGltZVtdIGVhclByb2plY3RzKSB7Ci0JCWlmIChlYXJQcm9qZWN0cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQXJyYXlMaXN0IGVqYlByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWFyUHJvamVjdHNbaV0gaW5zdGFuY2VvZiBFQVJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJRUFSTmF0dXJlUnVudGltZSBlYXIgPSAoRUFSTmF0dXJlUnVudGltZSkgZWFyUHJvamVjdHNbaV07Ci0JCQkJTWFwIHByb2plY3RzSW5FQVIgPSBlYXIuZ2V0TW9kdWxlUHJvamVjdHMoKTsKLQkJCQlpZiAocHJvamVjdHNJbkVBUiAhPSBudWxsICYmICFwcm9qZWN0c0luRUFSLmlzRW1wdHkoKSkgewotCQkJCQlJdGVyYXRvciBpdGVyID0gcHJvamVjdHNJbkVBUi52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBNT0ZPYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChNT0ZPYmplY3QgaW5zdGFuY2VvZiBFSkJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJCQkJaWYgKCgoRUpCTmF0dXJlUnVudGltZSkgTU9GT2JqZWN0KQotCQkJCQkJCQkJLmdldE1vZHVsZVZlcnNpb24oKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB7Ci0JCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKEVKQk5hdHVyZVJ1bnRpbWUpIE1PRk9iamVjdCkKLQkJCQkJCQkJCQkuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCQllamJQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvciBlYXJQcm9qZWN0cyBsb29wCi0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSBlamJQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFSkIgcHJvamVjdHMgaW4gdGhlIGVhcnMKLQkgKiAKLQkgKiBAcGFyYW0gZWFyUHJvamVjdHMKLQkgKiBAcmV0dXJuIHByb2plY3RzIEVKQiBwcm9qZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRFSkJQcm9qZWN0c0Zyb21FQVJTKAotCQkJRUFSTmF0dXJlUnVudGltZVtdIGVhclByb2plY3RzKSB7Ci0JCWlmIChlYXJQcm9qZWN0cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQXJyYXlMaXN0IGVqYlByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWFyUHJvamVjdHNbaV0gaW5zdGFuY2VvZiBFQVJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJRUFSTmF0dXJlUnVudGltZSBlYXIgPSAoRUFSTmF0dXJlUnVudGltZSkgZWFyUHJvamVjdHNbaV07Ci0JCQkJTWFwIHByb2plY3RzSW5FQVIgPSBlYXIuZ2V0TW9kdWxlUHJvamVjdHMoKTsKLQkJCQlpZiAocHJvamVjdHNJbkVBUiAhPSBudWxsICYmICFwcm9qZWN0c0luRUFSLmlzRW1wdHkoKSkgewotCQkJCQlJdGVyYXRvciBpdGVyID0gcHJvamVjdHNJbkVBUi52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBNT0ZPYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChNT0ZPYmplY3QgaW5zdGFuY2VvZiBFSkJOYXR1cmVSdW50aW1lKSB7Ci0KLQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKChFSkJOYXR1cmVSdW50aW1lKSBNT0ZPYmplY3QpCi0JCQkJCQkJCQkuZ2V0UHJvamVjdCgpOwotCQkJCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJZWpiUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQkJCQkJCX0KLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IC8vIGVuZCBmb3IgZWFyUHJvamVjdHMgbG9vcAotCi0JCXJldHVybiAoSVByb2plY3RbXSkgZWpiUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBjb21iaW5lUHJvamVjdEFycmF5cyhJUHJvamVjdFtdIHByb2plY3RBcnJheTEsCi0JCQlJUHJvamVjdFtdIHByb2plY3RBcnJheTIpIHsKLQotCQkvLyBjaGVjayBpZiBlaXRoZXIgb3IgYm90aCBhcnJheXMgYXJlIG51bGwuCi0JCWlmIChwcm9qZWN0QXJyYXkxID09IG51bGwgJiYgcHJvamVjdEFycmF5MiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKHByb2plY3RBcnJheTEgIT0gbnVsbCAmJiBwcm9qZWN0QXJyYXkyID09IG51bGwpCi0JCQlyZXR1cm4gcHJvamVjdEFycmF5MTsKLQkJZWxzZSBpZiAocHJvamVjdEFycmF5MSA9PSBudWxsICYmIHByb2plY3RBcnJheTIgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9qZWN0QXJyYXkyOwotCi0JCUlQcm9qZWN0W10gY29tYmluZWRQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0QXJyYXkxLmxlbmd0aAotCQkJCSsgcHJvamVjdEFycmF5Mi5sZW5ndGhdOwotCi0JCVN5c3RlbS5hcnJheWNvcHkocHJvamVjdEFycmF5MSwgMCwgY29tYmluZWRQcm9qZWN0cywgMCwKLQkJCQlwcm9qZWN0QXJyYXkxLmxlbmd0aCk7Ci0JCWlmIChwcm9qZWN0QXJyYXkyLmxlbmd0aCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJvamVjdEFycmF5MiwgMCwgY29tYmluZWRQcm9qZWN0cywKLQkJCQkJcHJvamVjdEFycmF5MS5sZW5ndGgsIHByb2plY3RBcnJheTIubGVuZ3RoKTsKLQkJfQotCi0JCXJldHVybiBjb21iaW5lZFByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIFdlYiBwcm9qZWN0cyBpbiB0aGUgZWFyKHMpCi0JICogCi0JICogQHBhcmFtIGVhclByb2plY3RzCi0JICogQHJldHVybiBwcm9qZWN0cyBXZWIgcHJvamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0V2ViUHJvamVjdHNGcm9tRUFSUygKLQkJCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJQcm9qZWN0cykgewotCQlpZiAoZWFyUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUFycmF5TGlzdCB3ZWJQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVhclByb2plY3RzW2ldIGluc3RhbmNlb2YgRUFSTmF0dXJlUnVudGltZSkgewotCQkJCUVBUk5hdHVyZVJ1bnRpbWUgZWFyID0gKEVBUk5hdHVyZVJ1bnRpbWUpIGVhclByb2plY3RzW2ldOwotCQkJCU1hcCBwcm9qZWN0c0luRUFSID0gZWFyLmdldE1vZHVsZVByb2plY3RzKCk7Ci0JCQkJaWYgKHByb2plY3RzSW5FQVIgIT0gbnVsbCAmJiAhcHJvamVjdHNJbkVBUi5pc0VtcHR5KCkpIHsKLQkJCQkJSXRlcmF0b3IgaXRlciA9IHByb2plY3RzSW5FQVIudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQkvLyBJUHJvamVjdE5hdHVyZSBuYXR1cmUgPQotCQkJCQkJLy8gaXRlci5uZXh0KCkuZ2V0TmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpOwotCQkJCQkJT2JqZWN0IE1PRk9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKE1PRk9iamVjdCBpbnN0YW5jZW9mIEoyRUVXZWJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSjJFRVdlYk5hdHVyZVJ1bnRpbWUpIE1PRk9iamVjdCkKLQkJCQkJCQkJCS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQl3ZWJQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvciBlYXJQcm9qZWN0cyBsb29wCi0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSB3ZWJQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCMl8wUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLQkJaWYgKFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQl0cnkgewotCi0JCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKQotCQkJCQkJJiYgRUpCTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3QpCi0JCQkJCQkJCS5nZXRNb2R1bGVWZXJzaW9uKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhbiBFQVIgMS4yIG9yIEVBUiAxLjMKLQkgKiBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYW4gRUFSIDEuMiBvciBhbiBFQVIgMS4zIFByb2plY3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFQVJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFQVJBc3NvY2lhdGVkKElQcm9qZWN0IG1vZHVsZSwgSVByb2plY3QgRUFSKSB7Ci0KLQkJRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBnZXRFQVJQcm9qZWN0cyhtb2R1bGUsIG51bGwpOwotCQlpZiAoZWFycyAhPSBudWxsICYmIGVhcnMubGVuZ3RoICE9IDApIHsKLQkJCVZlY3RvciBFQVJOYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykgewotCQkJCUVBUk5hbWVzLmFkZChlYXJzW2ldLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQkJfQotCQkJU3RyaW5nW10gZWFyTmFtZXMgPSAoU3RyaW5nW10pIEVBUk5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCQlpZiAoQXJyYXlzLmJpbmFyeVNlYXJjaChlYXJOYW1lcywgRUFSLmdldE5hbWUoKSkgPj0gMCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzb2NpYXRlV2ViUHJvamVjdChJUHJvamVjdCBtb2R1bGUsIElQcm9qZWN0IEVBUlByb2plY3QpIHsKLQkJdHJ5IHsKLQotCQkJU3RyaW5nIHVyaSA9IG1vZHVsZS5nZXROYW1lKCkgKyAiLndhciI7Ci0JCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2R1bGUuZ2V0TmFtZSgpOwotCQkJQWRkTW9kdWxlVG9FQVJQcm9qZWN0Q29tbWFuZCBhbWllYyA9IG5ldyBBZGRNb2R1bGVUb0VBUlByb2plY3RDb21tYW5kKAotCQkJCQltb2R1bGUsIEVBUlByb2plY3QsIHVyaSwgY29udGV4dFJvb3QsIG51bGwpOwotCQkJaWYgKGFtaWVjLmNhbkV4ZWN1dGUoKSkKLQkJCQlhbWllYy5leGVjdXRlKCk7Ci0JCQkvKgotCQkJICogRUFSTmF0dXJlUnVudGltZSBFQVJOYXR1cmUgPQotCQkJICogKEVBUk5hdHVyZVJ1bnRpbWUpZ2V0RUFSTmF0dXJlUnVudGltZUZyb21Qcm9qZWN0KEVBUlByb2plY3QpOwotCQkJICogCi0JCQkgKiBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IEVBUk5hdHVyZS5nZXRBcHBsaWNhdGlvbigpOyBNb2R1bGUgbW9kID0KLQkJCSAqIChNb2R1bGUpYXBwbGljYXRpb24uZ2V0Rmlyc3RNb2R1bGUobW9kdWxlLmdldE5hbWUoKSk7Ci0JCQkgKiBFQVJFZGl0TW9kZWwgZWRtID0gRUFSTmF0dXJlLmdldEVhckVkaXRNb2RlbEZvclJlYWQoKTsKLQkJCSAqIGVkbS5hZGRNb2R1bGVNYXBwaW5nKG1vZCwgRUFSUHJvamVjdCk7IGVkbS5yZWxlYXNlQWNjZXNzKCk7Ci0JCQkgKiAKLQkJCSAqLwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzb2NpYXRlRUpCUHJvamVjdChJUHJvamVjdCBlamJQcm9qZWN0LAotCQkJSVByb2plY3QgRUFSUHJvamVjdCkgewotCQl0cnkgewotCQkJU3RyaW5nIHVyaSA9IGVqYlByb2plY3QuZ2V0TmFtZSgpICsgIi5qYXIiOwotCQkJU3RyaW5nIGNvbnRleHRSb290ID0gZWpiUHJvamVjdC5nZXROYW1lKCk7Ci0JCQlBZGRNb2R1bGVUb0VBUlByb2plY3RDb21tYW5kIGFtaWVjID0gbmV3IEFkZE1vZHVsZVRvRUFSUHJvamVjdENvbW1hbmQoCi0JCQkJCWVqYlByb2plY3QsIEVBUlByb2plY3QsIHVyaSwgY29udGV4dFJvb3QsIG51bGwpOwotCQkJaWYgKGFtaWVjLmNhbkV4ZWN1dGUoKSkKLQkJCQlhbWllYy5leGVjdXRlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgTW9kdWxlJ3MgV0VCLUlORiBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEZpcnN0V2ViSW5mUGF0aChJUHJvamVjdCBwcm9qZWN0KXsKLQkJSVBhdGggbW9kdWxlUGF0aCA9IG51bGw7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIAotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCSAgd2ViRWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHdiY3NbMF0pOwotCQkJICBpZiAod2ViRWRpdCE9bnVsbCl7Ci0JCQkJICBJUGF0aCB3ZWJYTUxQYXRoID0gd2ViRWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclBhdGgoKTsKLQkJCQkgIG1vZHVsZVBhdGggPSB3ZWJYTUxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViTW9kdWxlUGF0aC9ERFBhdGggPSAiK21vZHVsZVBhdGgpOwotCQkJICB9Ci0JCQl9Ci0JCQlmaW5hbGx5ewotCQkJCWlmICh3ZWJFZGl0IT1udWxsKQotCQkJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJICB9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGV4KXt9Ci0JCWZpbmFsbHl7Ci0JCQlpZiAobWMhPW51bGwpCi0JCQkJbWMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZHVsZVBhdGg7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRGaXJzdFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QpewotCQkKLQkJSVBhdGggbW9kdWxlUGF0aCA9IG51bGw7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCSAgd2ViRWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHdiY3NbMF0pOwotCQkJICBpZiAod2ViRWRpdCE9bnVsbCl7Ci0JCQkJICBJUGF0aCB3ZWJYTUxQYXRoID0gd2ViRWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclBhdGgoKTsKLQkJCQkgIG1vZHVsZVBhdGggPSB3ZWJYTUxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygyKTsKLQkJCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViQ29udGVudCBQYXRoID0gIittb2R1bGVQYXRoKTsKLQkJCSAgfQotCQkJfQotCQkJZmluYWxseXsKLQkJCQlpZiAod2ViRWRpdCE9bnVsbCkKLQkJCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCSAgfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBleCl7fQotCQlmaW5hbGx5ewotCQkJaWYgKG1jIT1udWxsKQotCQkJCW1jLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXJldHVybiBtb2R1bGVQYXRoOwkJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0Rmlyc3RXZWJDb250ZW50Q29udGFpbmVyKElQcm9qZWN0IHByb2plY3QpewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCUlQYXRoIG1vZHVsZVBhdGggPSBnZXRGaXJzdFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQlJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UobW9kdWxlUGF0aCk7Ci0JCWlmIChyZXMhPW51bGwpewotCQkgIGNvbnRhaW5lciA9IHJlcy5nZXRQYXJlbnQoKTsKLQkJfQkJCi0JCSAgCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IE1vZHVsZSBuYW1lIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpcnN0V2ViTW9kdWxlTmFtZShJUHJvamVjdCBwcm9qZWN0KXsKLQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBudWxsOwotCQlTdHJ1Y3R1cmVFZGl0IG1jID0gbnVsbDsKLQkJdHJ5IHsKLQkJICBtYyA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCSAgV29ya2JlbmNoQ29tcG9uZW50W10gd2JjcyA9IG1jLmdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLQkJICBpZiAod2Jjcy5sZW5ndGghPTApIHsKLQkJCSAgbW9kdWxlTmFtZSA9IHdiY3NbMF0uZ2V0TmFtZSgpOwotCQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpcnN0IE1vZHVsZSBuYW1lID0gIittb2R1bGVOYW1lKTsKLQkJICB9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGV4KXt9Ci0JCWZpbmFsbHl7Ci0JCQlpZiAobWMhPW51bGwpCi0JCQkJbWMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZHVsZU5hbWU7CQkJCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vSmF2YU1PRlV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KYXZhTU9GVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4Y2RiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KYXZhTU9GVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YUNsYXNzSW1wbDsKLQotLyoqCi0qIFRoaXMgY2xhc3MgY29udGFpbnMgc29tZSB1c2VmdWwgdXRpbGl0aWVzIGZvciBkZWFsaW5nIHdpdGggdGhlIEphdmFNT0YKLSovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhTU9GVXRpbHMKLXsKLSAvKioKLSAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIG9mIHRoZSBnaXZlbiBuYW1lIGlzIGxvYWRhYmxlIGluIHRoZSBnaXZlbgotICAqIHByb2plY3QuCi0gICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGlzIGxvYWRhYmxlIGFuZCBubyBleGNlcHRpb25zIGFyZSB0aHJvd24uIAotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGFzc0xvYWRhYmxlKFN0cmluZyBjbGFzc05hbWUsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgIAlyZXR1cm4gaXNDbGFzc0xvYWRhYmxlKGdldEphdmFDbGFzcyhjbGFzc05hbWUscHJvamVjdCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NMb2FkYWJsZShKYXZhQ2xhc3MgamF2YUNsYXNzKQotICB7Ci0JcmV0dXJuIGphdmFDbGFzcy5pc0V4aXN0aW5nVHlwZSgpOyAgICAKLSAgfQotCi0gIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaGFzIGEgcHVibGljIGNvbnN0cnVjdG9yCi0gICogd2l0aCBhbiBlbXB0eSBwYXJhbWV0ZXIgbGlzdC4KLSAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MKLSAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdAotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xhc3MgaXMgbG9hZGFibGUgZnJvbSB0aGUgcHJvamVjdCBhbmQgdGhlIAotICAqICAgICAgICAgY2xhc3MgaGFzIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggYW4gZW1wdHkgcGFyYW1ldGVyIGxpc3QgIAotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHVibGljRGVmYXVsdEN0b3IoU3RyaW5nIGNsYXNzTmFtZSwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBoYXNQdWJsaWNEZWZhdWx0Q3RvcihnZXRKYXZhQ2xhc3MoY2xhc3NOYW1lLCBwcm9qZWN0KSk7Ci0gIH0KLQotCi0gcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1B1YmxpY0RlZmF1bHRDdG9yKEphdmFDbGFzcyBqYXZhQ2xhc3MpCi0gIHsKLSAgIAotICAgIExpc3QgbWV0aG9kTGlzdCA9IGphdmFDbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgaWYgKG1ldGhvZExpc3Q9PW51bGwpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEl0ZXJhdG9yIGlNZXRob2RzID0gbWV0aG9kTGlzdC5pdGVyYXRvcigpOwotICAgIGJvb2xlYW4gdXNlckRlZmluZWRDdG9yID0gZmFsc2U7Ci0gICAgd2hpbGUgKGlNZXRob2RzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBNZXRob2QgdGhpc01ldGhvZCA9IChNZXRob2QpaU1ldGhvZHMubmV4dCgpOwotCi0gICAgICBpZiAodGhpc01ldGhvZC5pc0NvbnN0cnVjdG9yKCkpCi0gICAgICB7Ci0gICAgICAgIHVzZXJEZWZpbmVkQ3RvciA9IHRydWU7IAotCi0gICAgICAgIC8vU2luY2UgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBjdG9yLCB0aGUgZGVmYXVsdCBjdG9yIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCi0gICAgICAgIC8vV2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgdXNlciBoYXMgcHJvdmlkZWQgYSBwdWJsaWMgY3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0KLSAgICAgICAgLy9jaGVjayBpZiBwdWJsaWMKLSAgICAgICAgaWYgKHRoaXNNZXRob2QuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpID09IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUMpCi0gICAgICAgIHsKLSAgICAgICAgICAvL3NlZSBpZiBwYXJhbWV0ZXIgbGlzdCBpcyBlbXB0eQotICAgICAgICAgIExpc3QgcGFyYW1MaXN0ID0gdGhpc01ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgaWYgKHBhcmFtTGlzdC5pc0VtcHR5KCkgKQotICAgICAgICAgIHsKLQkgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLQotICAgIGlmICh1c2VyRGVmaW5lZEN0b3IpCi0gICAgewotCSAgcmV0dXJuIGZhbHNlOyAvL2lmIHRoZSB1c2VyIGRlZmluZWQgYSBjdG9yIGFuZCB3ZSBzdGlsbCBoYXZlbid0Ci0JICAJICAgICAgICAgICAgLy9yZXR1cm5lZCB0cnVlLCBub25lIG9mIHRoZW0gd2VyZSBwdWJsaWMgd2l0aCBubyBwYXJhbWV0ZXJzLgotICAgIH0KLSAgICBlbHNlCi0gICAgeyAKLSAgICAgICByZXR1cm4gdHJ1ZTsgICAgCi0gICAgfQotCi0gIH0KLSAgLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlLgotICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotICAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgaW50ZXJmYWNlCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGFuZCBpbnRlcmZhY2UgYXJlIGxvYWRhYmxlIGZyb20gdGhlIHByb2plY3QgYW5kCi0gICogICAgICAgICB0aGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW1wbGVtZW50c0ludGVyZmFjZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgSVByb2plY3QgcHJvamVjdCkKLSAgCQkJdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgcmV0dXJuIGltcGxlbWVudHNJbnRlcmZhY2UoZ2V0SmF2YUNsYXNzKGNsYXNzTmFtZSwgcHJvamVjdCksIGdldEphdmFDbGFzcyhpbnRlcmZhY2VOYW1lLCBwcm9qZWN0KSk7Ci0gIH0KLQotcHVibGljIHN0YXRpYyBib29sZWFuIGltcGxlbWVudHNJbnRlcmZhY2UoSmF2YUNsYXNzIGphdmFDbGFzcywgSmF2YUNsYXNzIGludGVyZmFjZUNsYXNzKQotICB7Ci0gICAKLSAgICBpZiAoIWphdmFDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFpbnRlcmZhY2VDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICByZXR1cm4gamF2YUNsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UoaW50ZXJmYWNlQ2xhc3MpOwotICB9Ci0KLSAgLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBleHRlbmRzIHRoZSBzcGVjaWZpZWQgc3VwZXJjbGFzcwotICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotICAqIEBwYXJhbSBzdXBlckNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHN1cGVyY2xhc3MKLSAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdAotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xhc3MgYW5kIHN1cGVyQ2xhc3MgYXJlIGxvYWRhYmxlIGZyb20gdGhlIHByb2plY3QgYW5kCi0gICogICAgICAgICB0aGUgY2xhc3MgZXh0ZW5kcyB0aGUgc3VwZXJDbGFzcwotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXh0ZW5kc0NsYXNzKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBzdXBlckNsYXNzTmFtZSwgSVByb2plY3QgcHJvamVjdCkKLSAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5kc0NsYXNzKGdldEphdmFDbGFzcyhjbGFzc05hbWUscHJvamVjdCksIGdldEphdmFDbGFzcyhzdXBlckNsYXNzTmFtZSwgcHJvamVjdCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4dGVuZHNDbGFzcyhKYXZhQ2xhc3MgamF2YUNsYXNzLCBKYXZhQ2xhc3Mgc3VwZXJDbGFzcykKLSAgewotICAgIHJldHVybiBzdXBlckNsYXNzLmlzQXNzaWduYWJsZUZyb20oamF2YUNsYXNzKTsKLSAgfQotCi0gIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYWN0dWFsbHkgYW4gaW50ZXJmYWNlCi0gICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGlzIGxvYWRhYmxlIGZyb20gdGhlIHByb2plY3QgYW5kIGlzIAotICAqICAgICAgICAgYWN0dWFsbHkgYW4gaW50ZXJmYWNlCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZmFjZShTdHJpbmcgY2xhc3NOYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgIHJldHVybiBpc0ludGVyZmFjZShnZXRKYXZhQ2xhc3MoY2xhc3NOYW1lLCBwcm9qZWN0KSk7Ci0gIH0KLQotIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZmFjZShKYXZhQ2xhc3MgamF2YUNsYXNzKQotICB7Ci0gICAgICByZXR1cm4gamF2YUNsYXNzLmlzSW50ZXJmYWNlKCk7Ci0gIH0KLSBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQWJzdHJhY3RNZXRob2RzIChTdHJpbmcgY2xhc3NOYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotIAl7Ci0JICAgIHJldHVybiBoYXNBYnN0cmFjdE1ldGhvZHMoZ2V0SmF2YUNsYXNzKGNsYXNzTmFtZSwgcHJvamVjdCkpOwotICAJfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNBYnN0cmFjdE1ldGhvZHMgKEphdmFDbGFzcyBqYXZhQ2xhc3MpCi0gCXsKLQkgICBMaXN0IG1ldGhvZExpc3QgPSBqYXZhQ2xhc3MuZ2V0TWV0aG9kcygpOwotICAgICAgIGlmIChtZXRob2RMaXN0PT1udWxsKQotICAgICAgCXJldHVybiBmYWxzZTsKLQotCSAgIEl0ZXJhdG9yIGlNZXRob2RzID0gbWV0aG9kTGlzdC5pdGVyYXRvcigpOwotCSAgIHdoaWxlIChpTWV0aG9kcy5oYXNOZXh0KCkpCi0gICAgCXsKLSAgICAgIAkJTWV0aG9kIHRoaXNNZXRob2QgPSAoTWV0aG9kKWlNZXRob2RzLm5leHQoKTsKLQkJCWlmICggdGhpc01ldGhvZC5pc0Fic3RyYWN0KCkpIHJldHVybiB0cnVlOwotCSAgIAl9Ci0JCXJldHVybiBmYWxzZTsKLSAJfQotCi0gcHVibGljIHN0YXRpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKFN0cmluZyBjbGFzc05hbWUgLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotIAl7Ci0gCQlKYXZhRU1GTmF0dXJlIGpNT0YgPSAoSmF2YUVNRk5hdHVyZSlKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUocHJvamVjdCk7Ci0gICAgCXJldHVybiAgKEphdmFDbGFzcylKYXZhQ2xhc3NJbXBsLnJlZmxlY3QoY2xhc3NOYW1lLCBqTU9GLmdldFJlc291cmNlU2V0KCkpOwotIAl9Ci0KLSBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFNFSUZpbGUoSmF2YUNsYXNzIGJlYW5DbGFzcywgSmF2YUNsYXNzIHNlaUNsYXNzKQotIAl7Ci0gCQlpZiAoIXNlaUNsYXNzLmlzSW50ZXJmYWNlKCkpCi0gCQkJcmV0dXJuIGZhbHNlOwotCi0JCVZlY3RvciBiZWFuTWV0aG9kc0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gCQlMaXN0IGJlYW5NZXRob2RzID0gYmVhbkNsYXNzLmdldE1ldGhvZHMoKTsKLQkJSXRlcmF0b3IgYmVhbk1ldGhvZHNJdGVyYXRvciA9IGJlYW5NZXRob2RzLml0ZXJhdG9yKCk7Ci0JICAgCXdoaWxlIChiZWFuTWV0aG9kc0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAJewotICAgICAgCQlNZXRob2QgdGhpc01ldGhvZCA9IChNZXRob2QpYmVhbk1ldGhvZHNJdGVyYXRvci5uZXh0KCk7Ci0JCQliZWFuTWV0aG9kc0xpc3QuYWRkKHRoaXNNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQkgICAJfQotCi0JCUxpc3Qgc2VpTWV0aG9kcyA9IHNlaUNsYXNzLmdldE1ldGhvZHMoKTsKLSAJCWlmIChiZWFuTWV0aG9kcyA9PSBudWxsICkgewotIAkJCWlmICggc2VpTWV0aG9kcyA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAJCQllbHNlCXJldHVybiBmYWxzZTsKLSAJCX0KLQkJaWYgKHNlaU1ldGhvZHMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCi0JCUl0ZXJhdG9yIHNlaU1ldGhvZHNJdGVyYXRvciA9IHNlaU1ldGhvZHMuaXRlcmF0b3IoKTsKLQkgICAJd2hpbGUgKHNlaU1ldGhvZHNJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgCXsKLSAgICAgIAkJTWV0aG9kIHRoaXNNZXRob2QgPSAoTWV0aG9kKXNlaU1ldGhvZHNJdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoICFiZWFuTWV0aG9kc0xpc3QuY29udGFpbnModGhpc01ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCSAgIAl9Ci0JCXJldHVybiB0cnVlOwotIAkJCi0gCX0KLSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1Jlc291cmNlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1Jlc291cmNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdiNmQ3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9SZXNvdXJjZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50Lm1vZHVsZWNvcmUudXRpbC5BcHBDbGllbnRBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5tb2R1bGVjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZHVsZWNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLm1vZHVsZWNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmVjbGlwc2UuRWNsaXBzZUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHVzZWZ1bCBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggRWNsaXBzZSByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZVV0aWxzIHsKLQotCS8vCi0JLy8gS2VlcHMgdGhlIElXb3Jrc3BhY2VSb290IGhhbmdpbmcgYXJvdW5kLiBTZWUgZ2V0V29ya3NwYWNlUm9vdCgpLgotCS8vCi0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZVJvb3Qgcm9vdF8gPSBudWxsOwotCi0JLy8KLQkvLyBLZWVwcyB0aGUgSVdvcmtzcGFjZSBoYW5naW5nIGFyb3VuZC4gU2VlIGdldFdvcmtzcGFjZSgpLgotCS8vCi0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZSB3b3Jrc3BhY2VfID0gbnVsbDsKLQotCS8qKgotCSAqIEFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UHJvamVjdFR5cGUgZ2V0UHJvamVjdFR5cGUoKX0sIGluZGljYXRlcyB0aGF0Ci0JICogdGhlIGdpdmVuIHByb2plY3QgaGFzIG5vIEphdmEgb3IgV2ViIG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgUFJPSkVDVF9UWVBFX05PTkUgPSAwOwotCi0JLyoqCi0JICogQXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRQcm9qZWN0VHlwZSBnZXRQcm9qZWN0VHlwZSgpfSwgaW5kaWNhdGVzIHRoYXQKLQkgKiB0aGUgZ2l2ZW4gcHJvamVjdCBoYXMgYSBKYXZhIHByb2plY3QgbmF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBQUk9KRUNUX1RZUEVfSkFWQSA9IDE7Ci0KLQkvKioKLQkgKiBBcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFByb2plY3RUeXBlIGdldFByb2plY3RUeXBlKCl9LCBpbmRpY2F0ZXMgdGhhdAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyBhIFdlYiBwcm9qZWN0IG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgUFJPSkVDVF9UWVBFX1dFQiA9IDI7Ci0KLQkvKioKLQkgKiBBcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFByb2plY3RUeXBlIGdldFByb2plY3RUeXBlKCl9LCBpbmRpY2F0ZXMgdGhhdAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyBhbiBFSkIgcHJvamVjdCBuYXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIFBST0pFQ1RfVFlQRV9FSkIgPSA0OwotCi0JLyoqCi0JICogU3RhdHVzIENvZGUgZXhwbGFpbmluZyB0aGUgQ29yZUV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlamJQcm9qZWN0TmF0dXJlID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRTsKLQkvLyBrc2MgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVqYjJQcm9qZWN0TmF0dXJlID0KLQkvLyBJRUpCTmF0dXJlQ29uc3RhbnRzLkVKQl8yMF9OQVRVUkVfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgU09BUCBycGNyb3V0ZXIgc2VydmxldCBleHRlbnNpb24gdG8gYmUgYWRkZWQgdG8gd2ViIHByb2plY3QgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9FWFQgPSAiL3NlcnZsZXQvcnBjcm91dGVyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NMSUVOVF9XRUJfUFJPSkVDVF9FWFQgPSAiQ2xpZW50IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FSkJfUFJPSkVDVF9OQU1FID0gIldlYlNlcnZpY2VFSkJQcm9qZWN0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XRUJfUFJPSkVDVF9OQU1FID0gIldlYlNlcnZpY2VQcm9qZWN0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ST1VURVJfUFJPSkVDVF9FWFQgPSAiUm91dGVyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFUlZJQ0VfRUFSX1BST0pFQ1RfTkFNRSA9ICJXZWJTZXJ2aWNlRUFSIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DTElFTlRfRUFSX1BST0pFQ1RfTkFNRSA9ICJXZWJTZXJ2aWNlQ2xpZW50RUFSIjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElXb3Jrc3BhY2VSb290IG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBJV29ya3NwYWNlUm9vdCBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotCQlpZiAocm9vdF8gPT0gbnVsbCkgewotCQkJcm9vdF8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQl9Ci0JCXJldHVybiByb290XzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJV29ya3NwYWNlIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBJV29ya3NwYWNlIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlpZiAod29ya3NwYWNlXyA9PSBudWxsKSB7Ci0JCQlpZiAocm9vdF8gPT0gbnVsbCkgewotCQkJCXJvb3RfID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCX0KLQkJCXdvcmtzcGFjZV8gPSByb290Xy5nZXRXb3Jrc3BhY2UoKTsKLQkJfQotCQlyZXR1cm4gd29ya3NwYWNlXzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfW9mIHRoZQotCSAqIGdpdmVuIGFic29sdXRlIHBhdGhuYW1lIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZShTdHJpbmcgYWJzb2x1dGVQYXRobmFtZSkgewotCQlpZiAoYWJzb2x1dGVQYXRobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmluZFJlc291cmNlKG5ldyBQYXRoKGFic29sdXRlUGF0aG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfW9mIHRoZQotCSAqIGdpdmVuIGFic29sdXRlIHBhdGggb3IgbnVsbCBpZiBubyBzdWNoIHJlc291cmNlIGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgPGNvZGU+SVBhdGg8L2NvZGU+IG9mIHRoZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZShJUGF0aCBhYnNvbHV0ZVBhdGgpIHsKLQkJaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZmluZE1lbWJlcihhYnNvbHV0ZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIGEgbmFtZSBmb3IgYSByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4gdHlwZShzKS4KLQkgKiBUaGlzIG1ldGhvZCBvYmV5cyB0aGUgY29udHJhY3Qgb2YKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSN2YWxpZGF0ZU5hbWUgSVdvcmtzcGFjZS52YWxpZGF0ZU5hbWUoKX0uCi0JICogCi0JICogQHBhcmFtIHNlZ21lbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIHZhbGlkYXRlLgotCSAqIEBwYXJhbSB0eXBlTWFzawotCSAqICAgICAgICAgICAgVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdHlwZSBvciB0eXBlcy4KLQkgKiBAcmV0dXJuIFRoZSBzdGF0dXMgd2l0aCBhIHZhbHVlIGlmIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBwYXRoCi0JICogICAgICAgICBpcyB2YWxpZCwgb3Igd2l0aCBhcHByb3ByaWF0ZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBpbmZvcm1hdGlvbiBpZgotCSAqICAgICAgICAgdGhlIHBhdGggaXMgbm90IHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZU5hbWUoU3RyaW5nIHNlZ21lbnQsIGludCB0eXBlTWFzaykgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShzZWdtZW50LCB0eXBlTWFzayk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBzdHJpbmcgYXMgdGhlIHBhdGggb2YgYSByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4KLQkgKiB0eXBlKHMpLiBUaGlzIG1ldGhvZCBvYmV5cyB0aGUgY29udHJhY3Qgb2YKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSN2YWxpZGF0ZVBhdGggSVdvcmtzcGFjZS52YWxpZGF0ZVBhdGgoKX0uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIHZhbGlkYXRlLgotCSAqIEBwYXJhbSB0eXBlTWFzawotCSAqICAgICAgICAgICAgVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdHlwZSBvciB0eXBlcy4KLQkgKiBAcmV0dXJuIFRoZSBzdGF0dXMgd2l0aCBhIHZhbHVlIGlmIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBwYXRoCi0JICogICAgICAgICBpcyB2YWxpZCwgb3Igd2l0aCBhcHByb3ByaWF0ZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBpbmZvcm1hdGlvbiBpZgotCSAqICAgICAgICAgdGhlIHBhdGggaXMgbm90IHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVBhdGgoU3RyaW5nIHBhdGgsIGludCB0eXBlTWFzaykgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlUGF0aChwYXRoLCB0eXBlTWFzayk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBKYXZhIHR5cGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBKYXZhIHR5cGUgbmFtZS4KLQkgKiBAcmV0dXJuIFRoZSBzdGF0dXMgd2l0aCBhIHZhbHVlIG9mIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBuYW1lCi0JICogICAgICAgICBpcyB2YWxpZCwgb3Igd2l0aCBhcHByb3ByaWF0ZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBpbmZvcm1hdGlvbiBpZgotCSAqICAgICAgICAgbmFtZSBpcyBub3QgdmFsaWQuIFRoZSBwcmltaXRpdmUgdHlwZXMgKGJvb2xlYW4sIGNoYXIsIGJ5dGUsCi0JICogICAgICAgICBzaG9ydCwgaW50LCBsb25nLCBmbG9hdCwgZG91YmxlKSBhcmUgdmFsaWQuIEFycmF5cyBvZiB2YWxpZCB0eXBlcwotCSAqICAgICAgICAgYXJlIHRoZW1zZWx2ZXMgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSmF2YVR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgewotCQkvLwotCQkvLyBTdHJpcCBvZmYgdGhlIHRyYWlsaW5nIGFycmF5IGJpdHMsIGlmIGFueS4KLQkJLy8KLQkJaW50IGEgPSB0eXBlTmFtZS5pbmRleE9mKCdbJyk7Ci0JCWlmIChhID4gMCkgewotCQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgYSk7Ci0JCX0KLQkJLy8KLQkJLy8gQWxsb3cgcHJpbWl0aXZlcy4KLQkJLy8KLQkJaWYgKGlzUHJpbWl0aXZlSmF2YVR5cGUodHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBXZWJTZXJ2aWNlUGx1Z2luLklELCAwLCAiIiwgbnVsbCk7Ci0JCX0KLQkJLy8KLQkJLy8gRGVmZXIgdG8gSmF2YUNvbnZlbnRpb25zLgotCQkvLwotCQlyZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKHR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnR5cGVOYW1lPC9jb2RlPiBpcyBhIEphdmEgcHJpbWl0aXZlCi0JICogKGJvb2xlYW4sIGNoYXIsIGJ5dGUsIHNob3J0LCBpbnQsIGxvbmcsIGZsb2F0LCBkb3VibGUpLgotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdHlwZSBuYW1lIGlzIGEgSmF2YSBwcmltaXRpdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlSmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiAodHlwZU5hbWUuZXF1YWxzKCJib29sZWFuIikgfHwgdHlwZU5hbWUuZXF1YWxzKCJjaGFyIikKLQkJCQl8fCB0eXBlTmFtZS5lcXVhbHMoImJ5dGUiKSB8fCB0eXBlTmFtZS5lcXVhbHMoInNob3J0IikKLQkJCQl8fCB0eXBlTmFtZS5lcXVhbHMoImludCIpIHx8IHR5cGVOYW1lLmVxdWFscygibG9uZyIpCi0JCQkJfHwgdHlwZU5hbWUuZXF1YWxzKCJmbG9hdCIpIHx8IHR5cGVOYW1lLmVxdWFscygiZG91YmxlIikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhbmRsZSBvZiB0aGUgSVByb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+LiBOZWl0aGVyIHRoZSBnaXZlbiBwYXRoIG5vciB0aGUgcHJvamVjdCBuZWVkCi0JICogZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4gVGhlIHBhdGggbXVzdCBiZSBhYnNvbHV0ZSwgYW5kIG11c3QgY29uc2lzdCBvZiBhdAotCSAqIGxlYXN0IG9uZSBzZWdtZW50LgotCSAqIAotCSAqIEByZXR1cm4gQW4gSVByb2plY3QgaGFuZGxlIGZvciB0aGUgcHJvamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnaXZlbgotCSAqICAgICAgICAgPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcGF0aCBkb2VzIG5vdAotCSAqICAgICAgICAgc3BlY2lmeSBhIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0T2YoSVBhdGggYWJzb2x1dGVQYXRoKSB7Ci0JCWlmIChhYnNvbHV0ZVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBhYnNvbHV0ZVBhdGguc2VnbWVudCgwKTsKLQkJCWlmIChwcm9qZWN0TmFtZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGEgSmF2YSBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYSBKYXZhIFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGEgSmF2YSBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYSBKYXZhIFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZUphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuICghaXNXZWJQcm9qZWN0KHByb2plY3QpICYmICFpc0FwcENsaWVudFByb2plY3QocHJvamVjdCkgJiYgIWlzRUFSUHJvamVjdChwcm9qZWN0KQotCQkJCSYmICFpc0VKQlByb2plY3QocHJvamVjdCkgJiYgaXNKYXZhUHJvamVjdChwcm9qZWN0KSk7Ci0JCS8qCi0JCSAqIHRyeSB7IFN0cmluZ1tdIG5hdHVyZXMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0JCSAqIHJldHVybiAobmF0dXJlcy5sZW5ndGggPT0gMSAmJgotCQkgKiBuYXR1cmVzWzBdLmVxdWFscyhKYXZhQ29yZS5OQVRVUkVfSUQpKTsgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7IH0KLQkJICogcmV0dXJuIGZhbHNlOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGEgV2ViIFByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyBhIFdlYiBQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGlzV2ViID0gZmFsc2U7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJICBpc1dlYiA9IFdlYkFydGlmYWN0RWRpdC5pc1ZhbGlkV2ViTW9kdWxlKHdiY3NbMF0pOwotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpewotCQkJLy8gaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCWZpbmFsbHl7Ci0JCQlpZiAobWMhPW51bGwpCi0JCQkJbWMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGlzV2ViOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VBUlByb2plY3QoSVByb2plY3QgcHJvamVjdCl7Ci0JCWJvb2xlYW4gaXNFQVIgPSBmYWxzZTsKLQkJU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCSAgbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkgIFdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCSAgaWYgKHdiY3MubGVuZ3RoIT0wKSB7Ci0JCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJICBlYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQod2Jjc1swXSk7Ci0JCQkgIGlmIChlYXJFZGl0IT1udWxsKXsKLQkJCQlpc0VBUiA9IHRydWU7Ci0JCQkgIH0KLQkJCX0KLQkJCWZpbmFsbHl7Ci0JCQkJaWYgKGVhckVkaXQhPW51bGwpCi0JCQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0VBUjsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhbiBFSkIgMS4xIG9yIEVKQiAyLjAKLQkgKiBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYW4gRUpCIDEuMSBvciBhbiBFSkIgMi4wIFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXNFSkIgPSBmYWxzZTsKLQkJU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCSAgbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkgIFdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCSAgaWYgKHdiY3MubGVuZ3RoIT0wKSB7Ci0JCQlFSkJBcnRpZmFjdEVkaXQgZWpiRWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJICBlamJFZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQod2Jjc1swXSk7Ci0JCQkgIGlmIChlamJFZGl0IT1udWxsKXsKLQkJCQlpc0VKQiA9IHRydWU7Ci0JCQkgIH0KLQkJCX0KLQkJCWZpbmFsbHl7Ci0JCQkJaWYgKGVqYkVkaXQhPW51bGwpCi0JCQkJCWVqYkVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0VKQjsJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhbiBBcHBsaWNhdGlvbiBDbGllbnQKLQkgKiBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYW4gQXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBDbGllbnRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBpc0FwcENsaWVudCA9IGZhbHNlOwotCQlTdHJ1Y3R1cmVFZGl0IG1jID0gbnVsbDsKLQkJdHJ5IHsKLQkJICBtYyA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCSAgV29ya2JlbmNoQ29tcG9uZW50W10gd2JjcyA9IG1jLmdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLQkJICBpZiAod2Jjcy5sZW5ndGghPTApIHsKLQkJCUFwcENsaWVudEFydGlmYWN0RWRpdCBhcHBDbGllbnRFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYXBwQ2xpZW50RWRpdCA9IEFwcENsaWVudEFydGlmYWN0RWRpdC5nZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkKHdiY3NbMF0pOwotCQkJICBpZiAoYXBwQ2xpZW50RWRpdCE9bnVsbCl7Ci0JCQkJICBpc0FwcENsaWVudCA9IHRydWU7Ci0JCQkgIH0KLQkJCX0KLQkJCWZpbmFsbHl7Ci0JCQkJaWYgKGFwcENsaWVudEVkaXQhPW51bGwpCi0JCQkJCWFwcENsaWVudEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0FwcENsaWVudDsJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+cHJvamVjdDwvY29kZT4gYXMgYSBiaXRtYXNrLgotCSAqIFJlbGV2YW50IGJpdG1hc2sgdmFsdWVzIGFyZToKLQkgKiA8b2w+Ci0JICogPGxpPntAbGluayAjUFJPSkVDVF9UWVBFX0pBVkEgUFJPSkVDVF9UWVBFX0pBVkF9Ci0JICogPGxpPntAbGluayAjUFJPSkVDVF9UWVBFX1dFQiBQUk9KRUNUX1RZUEVfV0VCfQotCSAqIDxsaT57QGxpbmsgI1BST0pFQ1RfVFlQRV9FSkIgUFJPSkVDVF9UWVBFX0VKQn0KLQkgKiA8bGk+e0BsaW5rICNQUk9KRUNUX1RZUEVfTk9ORSBQUk9KRUNUX1RZUEVfTk9ORX0KLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSB0eXBlIGJpdG1hc2sgb2YgdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIGdldFByb2plY3RUeXBlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJYnl0ZSBwcm9qZWN0VHlwZSA9IFBST0pFQ1RfVFlQRV9OT05FOwotCQlpZiAoUmVzb3VyY2VVdGlscy5pc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlwcm9qZWN0VHlwZSB8PSBQUk9KRUNUX1RZUEVfSkFWQTsKLQkJfQotCQlpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCXByb2plY3RUeXBlIHw9IFBST0pFQ1RfVFlQRV9XRUI7Ci0JCX0KLQkJaWYgKFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlwcm9qZWN0VHlwZSB8PSBQUk9KRUNUX1RZUEVfRUpCOwotCQl9Ci0JCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotCQlsb2cubG9nKExvZy5JTkZPLCA1MDMxLCBSZXNvdXJjZVV0aWxzLmNsYXNzLCAiZ2V0UHJvamVjdFR5cGUiLAotCQkJCSJwcm9qZWN0PSIgKyBwcm9qZWN0ICsgIixwcm9qZWN0VHlwZT0iICsgcHJvamVjdFR5cGUpOwotCi0JCXJldHVybiBwcm9qZWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvamVjdFR5cGVBc1N0cmluZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9FSkIiKTsKLQkJZWxzZSBpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfV0VCIik7Ci0JCWVsc2UgaWYgKFJlc291cmNlVXRpbHMuaXNKYXZhUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9KQVZBIik7Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIFdlYk1vZHVsZSBEZXBsb3lhYmxlIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhcyBhbgotCSAqIDxjb2RlPklEZXBsb3lhYmxlPC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViIG5hdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBXZWJNb2R1bGUgRGVwbG95YWJsZSBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4gb3IgbnVsbCBpZiB0aGUKLQkgKiAgICAgICAgIHByb2plY3QgaGFzIG5vIFdlYiBuYXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHByb2plY3QpOwotCQlpZiAobW9kdWxlcyE9bnVsbCAmJiBtb2R1bGVzLmxlbmd0aCE9MCkgewotCQkJcmV0dXJuIG1vZHVsZXNbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGQgb3V0cHV0IGxvY2F0aW9uIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhcyBhbgotCSAqIDxjb2RlPklQYXRoPC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gSmF2YSBuYXR1cmUuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIGJ1aWxkIG91dHB1dCBsb2NhdGlvbiBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4gb3IgbnVsbAotCSAqICAgICAgICAgaWYgdGhlIHByb2plY3QgaGFzIG5vIEphdmEgbmF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YU91dHB1dExvY2F0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhdGggb3V0cHV0TG9jYXRpb24gPSBudWxsOwotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlvdXRwdXRMb2NhdGlvbiA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0JCWxvZy5sb2coTG9nLklORk8sIDUwMzIsIFJlc291cmNlVXRpbHMuY2xhc3MsICJnZXRKYXZhT3V0cHV0TG9jYXRpb24iLAotCQkJCSJwcm9qZWN0PSIgKyBwcm9qZWN0ICsgIixvdXRwdXRMb2NhdGlvbj0iICsgb3V0cHV0TG9jYXRpb24pOwotCi0JCXJldHVybiBvdXRwdXRMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYnVpbGQgc291cmNlIGxvY2F0aW9uIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhcyBhbgotCSAqIDxjb2RlPklQYXRoPC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBlaXRoZXIgaGFzIG5vIEphdmEgbmF0dXJlCi0JICogb3IgaWYgdGhlIHByb2plY3QncyBidWlsZCBjbGFzc3BhdGggY29udGFpbnMgbm8gZm9sZGVycyBsb2NhbCB0byB0aGUKLQkgKiBwcm9qZWN0LiBJZiB0aGUgcHJvamVjdCBoYXMgbW9yZSB0aGFuIG9uZSBvZiBpdHMgb3duIGZvbGRlcnMgb24gdGhlIGJ1aWxkCi0JICogY2xhc3NwYXRoLCB0aGVuIG9uZSBvZiB0aGVtIGlzIGNob3NlbiBhcmJpdHJhcmlseSBhcyB0aGUgYnVpbGQgc291cmNlCi0JICogbG9jYXRpb24uIFRvIHdvcmsgd2l0aCBhbGwgZW50cmllcyBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoLCB1c2UKLQkgKiB7QGxpbmsgI2dldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cyBnZXRKYXZhUGFja2FnZUZyYWdtZW50Um9vdHMoKX1vcgotCSAqIHtAbGluayAjZ2V0SmF2YUNsYXNzcGF0aCBnZXRKYXZhQ2xhc3NwYXRoKCl9LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIEEgYnVpbGQgc291cmNlIGxvY2F0aW9uIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBvciBudWxsIGlmCi0JICogICAgICAgICB0aGUgcHJvamVjdCBoYXMgbm8gSmF2YSBuYXR1cmUgb3IgaWYgdGhlIHByb2plY3QncyBidWlsZAotCSAqICAgICAgICAgY2xhc3NwYXRoIGNvbnRhaW5zIG5vIGZvbGRlcnMgbG9jYWwgdG8gdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhU291cmNlTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlJUGF0aCBzb3VyY2VMb2NhdGlvbiA9IG51bGw7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gZnJhZ21lbnRSb290cyA9IGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cyhwcm9qZWN0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudFJvb3RzLmxlbmd0aCAmJiBzb3VyY2VMb2NhdGlvbiA9PSBudWxsOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVJlc291cmNlIGZyYWdtZW50Um9vdCA9IGZyYWdtZW50Um9vdHNbaV0KLQkJCQkJCS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQlpZiAoZnJhZ21lbnRSb290ICE9IG51bGwKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKSkgewotCQkJCQlzb3VyY2VMb2NhdGlvbiA9IGZyYWdtZW50Um9vdC5nZXRGdWxsUGF0aCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhMb2cuSU5GTywgNTAzMCwgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldEphdmFTb3VyY2VMb2NhdGlvbiIsCi0JCQkJInByb2plY3Q9IiArIHByb2plY3QgKyAiLHNvdXJjZUxvY2F0aW9uPSIgKyBzb3VyY2VMb2NhdGlvbik7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkphdmEgc291cmNlTG9jYXRpb24gPSAiK3NvdXJjZUxvY2F0aW9uKTsKLQkJcmV0dXJuIHNvdXJjZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhdGhbXSBnZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKElQcm9qZWN0IHByb2plY3QpIHsKLQkJVmVjdG9yIHBhdGhWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gZnJhZ21lbnRSb290cyA9IGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cyhwcm9qZWN0KTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50Um9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVJlc291cmNlIGZyYWdtZW50Um9vdCA9IGZyYWdtZW50Um9vdHNbaV0KLQkJCQkJCS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQlpZiAoZnJhZ21lbnRSb290ICE9IG51bGwKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKSkgewotCQkJCQlwYXRoVmVjdG9yLmFkZChmcmFnbWVudFJvb3QuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhMb2cuSU5GTywgNTAzMywgUmVzb3VyY2VVdGlscy5jbGFzcywKLQkJCQkiZ2V0QWxsSmF2YVNvdXJjZUxvY2F0aW9ucyIsICJwcm9qZWN0PSIgKyBwcm9qZWN0KTsKLQotCQlyZXR1cm4gKElQYXRoW10pIHBhdGhWZWN0b3IudG9BcnJheShuZXcgUGF0aFtwYXRoVmVjdG9yLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBidWlsZCBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290IG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPgotCSAqIGFzIGFuIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBlaXRoZXIKLQkgKiBoYXMgbm8gSmF2YSBuYXR1cmUgb3IgaWYgdGhlIHByb2plY3QncyBidWlsZCBjbGFzc3BhdGggY29udGFpbnMgbm8KLQkgKiBmb2xkZXJzIGxvY2FsIHRvIHRoZSBwcm9qZWN0LiBJZiB0aGUgcHJvamVjdCBoYXMgbW9yZSB0aGFuIG9uZSBvZiBpdHMgb3duCi0JICogZm9sZGVycyBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoLCB0aGVuIG9uZSBvZiB0aGVtIGlzIGNob3NlbiBhcmJpdHJhcmlseSBhcwotCSAqIHRoZSBidWlsZCBzb3VyY2UgbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gQSBidWlsZCBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290IG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPgotCSAqICAgICAgICAgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gSmF2YSBuYXR1cmUgb3IgaWYgdGhlIHByb2plY3QncwotCSAqICAgICAgICAgYnVpbGQgY2xhc3NwYXRoIGNvbnRhaW5zIG5vIGZvbGRlcnMgbG9jYWwgdG8gdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXZhU291cmNlUGFja2FnZUZyYWdtZW50Um9vdCgKLQkJCUlQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IG51bGw7Ci0JCUlQYXRoIGphdmFTb3VyY2VMb2NhdGlvbiA9IGdldEphdmFTb3VyY2VMb2NhdGlvbihwcm9qZWN0KTsKLQkJdHJ5IHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZUZyYWdtZW50Um9vdCA9IGphdmFQcm9qZWN0Ci0JCQkJCQkuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QoamF2YVNvdXJjZUxvY2F0aW9uKTsKLQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotCQlsb2cubG9nKExvZy5JTkZPLCA1MDM0LCBSZXNvdXJjZVV0aWxzLmNsYXNzLAotCQkJCSJnZXRKYXZhU291cmNlUGFja2FnZUZyYWdtZW50Um9vdCIsICJwcm9qZWN0PSIgKyBwcm9qZWN0Ci0JCQkJCQkrICIsc291cmNlTG9jYXRpb249IiArIGphdmFTb3VyY2VMb2NhdGlvbgotCQkJCQkJKyAiLHNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3Q9IiArIHBhY2thZ2VGcmFnbWVudFJvb3QpOwotCi0JCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IGFzIGFuCi0JICogYXJyYXkgb2YgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+IG9iamVjdHMuIElmIHRoZSBwcm9qZWN0IGhhcwotCSAqIG5vIEphdmEgbmF0dXJlIHRoZW4gdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgb2YgbGVuZ3RoIHplcm8uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRKYXZhUGFja2FnZUZyYWdtZW50Um9vdHMoCi0JCQlJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdAotCQkJCQkJLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3RzOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGQgY2xhc3NwYXRoIGVudHJpZXMgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IGFzIGFuCi0JICogYXJyYXkgb2YgPGNvZGU+SUNsYXNzcGF0aEVudHJ5PC9jb2RlPiBvYmplY3RzLiBJZiB0aGUgcHJvamVjdCBoYXMgbm8KLQkgKiBKYXZhIG5hdHVyZSB0aGVuIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIG9mIGxlbmd0aCB6ZXJvLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSBjbGFzc3BhdGggZW50cmllcyBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRKYXZhQ2xhc3NwYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qZWN0Ci0JCQkJCQkuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQkJcmV0dXJuIGNsYXNzcGF0aEVudHJpZXM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGFpbmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3Qgb2YgdGhlCi0JICogcHJvamVjdCAoaWUuIHRoZSAid2ViQXBwbGljYXRpb24iIGZvbGRlcikgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8KLQkgKiBXZWIgbmF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSB3ZWIgc2VydmVyIG1vZHVsZSByb290IGNvbnRhaW5lciBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGhhcwotCSAqICAgICAgICAgbm8gV2ViIG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlDb250YWluZXIgd2ViTW9kdWxlU2VydmVyUm9vdCA9IG51bGw7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkJbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50W10gd2JjcyA9IG1jLmdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLQkJCWlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJCXdlYk1vZHVsZVNlcnZlclJvb3QgPSBTdHJ1Y3R1cmVFZGl0LmdldE91dHB1dENvbnRhaW5lclJvb3Qod2Jjc1swXSk7Ci0JCQkJSUZvbGRlcltdIGZvbGRlciA9IFN0cnVjdHVyZUVkaXQuZ2V0T3V0cHV0Q29udGFpbmVyc0ZvclByb2plY3QocHJvamVjdCk7Ci0JCQkJCi0JCQkJaWYgKGZvbGRlci5sZW5ndGghPTApCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJXZWJNb2R1bGVTZXJ2ZXJSb290ID0gIitmb2xkZXJbMF0pOwotCQkJCQotCQkJfQotLy8JCQlJUHJvamVjdE5hdHVyZSBuYXR1cmUgPSBwcm9qZWN0LmdldE5hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLS8vCQkJaWYgKG5hdHVyZSAhPSBudWxsICYmIChuYXR1cmUgaW5zdGFuY2VvZiBJRHluYW1pY1dlYk5hdHVyZSkpIHsKLS8vCQkJICBJRHluYW1pY1dlYk5hdHVyZSB3ZWJOYXR1cmUgPSAoSUR5bmFtaWNXZWJOYXR1cmUpIG5hdHVyZTsKLS8vCQkJCXdlYk1vZHVsZVNlcnZlclJvb3QgPSB3ZWJOYXR1cmUuZ2V0Um9vdFB1Ymxpc2hhYmxlRm9sZGVyKCk7Ci0vLwkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotCQkJbG9nLmxvZyhMb2cuRVJST1IsIDUwMzUsIFJlc291cmNlVXRpbHMuY2xhc3MsICJnZXRXZWJNb2R1bGVTZXJ2ZXJSb290IiwKLQkJCQkJInByb2plY3Q9IiArIHByb2plY3QgKyAiLHdlYk1vZHVsZVNlcnZlclJvb3Q9IgotCQkJCQkJCSsgd2ViTW9kdWxlU2VydmVyUm9vdCk7CQkJCi0JCX0KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlyZXR1cm4gd2ViTW9kdWxlU2VydmVyUm9vdDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdCBvZiB0aGUKLQkgKiBwcm9qZWN0IGluIGEgc2VydmVyIGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYiBuYXR1cmUgb3IKLQkgKiBoYXMgbm8gYXNzb2NpYXRpb24gdG8gYSBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3QgVVJMIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYgotCSAqICAgICAgICAgbmF0dXJlIG9yIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJQcm9qZWN0VVJMKElQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBJU2VydmVyIHNlcnZlcikgewotCi0JCVN0cmluZyB3ZWJQcm9qZWN0VVJMID0gbnVsbDsKLQkJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUocHJvamVjdCk7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJSVNlcnZlciBzZXJ2ZXJJbnN0YW5jZSA9IFNlcnZlclV0aWxzLmdldFNlcnZlckZvck1vZHVsZShtb2R1bGUsCi0JCQkJCXNlcnZlckZhY3RvcnlJZCwgc2VydmVyLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWlmIChzZXJ2ZXJJbnN0YW5jZSAhPSBudWxsKSB7Ci0vLwkJCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIHNlcnZlckluc3RhbmNlLmdldERlbGVnYXRlKCkpLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlKTsKLQkJCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpc2VydmVySW5zdGFuY2UuZ2V0QWRhcHRlcihJVVJMUHJvdmlkZXIuY2xhc3MpKS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZSk7Ci0JCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzID0gdXJsLnRvU3RyaW5nKCk7Ci0JCQkJCXdlYlByb2plY3RVUkwgPSAocy5lbmRzV2l0aCgiLyIpID8gcy5zdWJzdHJpbmcoMCwgcwotCQkJCQkJCS5sZW5ndGgoKSAtIDEpIDogcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhMb2cuSU5GTywgNTAzNiwgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldFdlYlByb2plY3RVUkwiLAotCQkJCSJwcm9qZWN0PSIgKyBwcm9qZWN0ICsgIix3ZWJQcm9qZWN0VVJMPSIgKyB3ZWJQcm9qZWN0VVJMKTsKLQotCQlyZXR1cm4gd2ViUHJvamVjdFVSTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JnZWQgVVJMIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSB3ZWIgc2VydmVyIG1vZHVsZSByb290Ci0JICogb2YgdGhlIHByb2plY3QgaW4gYSBzZXJ2ZXIgaW5zdGFuY2Ugb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViCi0JICogbmF0dXJlIG9yIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gVGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3QgVVJMIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYgotCSAqICAgICAgICAgbmF0dXJlIG9yIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcmdlZFdlYlByb2plY3RVUkwoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgSVNlcnZlciBzZXJ2ZXIpewotICAJCi0gIAlTdHJpbmcgd2ViUHJvamVjdFVSTCA9IG51bGw7Ci0gIAlJTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShwcm9qZWN0KTsKLSAgCWlmIChtb2R1bGUgIT0gbnVsbCkKLSAgCXsKLSAgCQkvL0lTZXJ2ZXIgc2VydmVySW5zdGFuY2UgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUobW9kdWxlLAotCQkgIC8vIHNlcnZlckZhY3RvcnlJZCwgc2VydmVyLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgCQlpZiAoc2VydmVyICE9IG51bGwpCi0gIAkJewotICAJCQlTdHJpbmcgaG9zdG5hbWUgPSBzZXJ2ZXIuZ2V0SG9zdCgpOwotCi0gIAkJCS8vIGdldCBTZXJ2ZXJQb3J0Ci0gIAkJCWludCBwb3J0TnVtYmVyID0gMDsKLQotICAJICAgICAgICAgIFNlcnZlclBvcnRbXSBwb3J0cyA9IHNlcnZlci5nZXRTZXJ2ZXJQb3J0cygpOwotICAJICAgICAgICAgIFNlcnZlclBvcnQgcG9ydCA9IG51bGw7Ci0gIAkgICAgICAgICAgZm9yIChpbnQgaXQgPSAwOyBpdDxwb3J0cy5sZW5ndGg7IGl0KyspCi0gIAkgICAgICAgICAgewotICAJICAgICAgICAgICAgU2VydmVyUG9ydCBwID0gcG9ydHNbaXRdOwotICAJICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gcC5nZXRQcm90b2NvbCgpOwotICAJICAgICAgICAgICAgaWYgKHByb3RvY29sICE9IG51bGwgJiYgcHJvdG9jb2wudHJpbSgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJodHRwIikpCi0gIAkgICAgICAgICAgICB7Ci0gIAkgICAgICAgICAgICAgIHBvcnQgPSBwOwotICAJICAgICAgICAgICAgICBwb3J0TnVtYmVyID0gcC5nZXRQb3J0KCk7Ci0gIAkgICAgICAgICAgICAgIGJyZWFrOwotICAJICAgICAgICAgICAgfQotICAJICAgICAgICAgIH0KLSAgCSAgICAgICAgICAKLSAgCSAgICAgICAgCi0gIAkgICAgICAgIAotICAJICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgCSAgICAgICAgdHJ5IHsKLSAgCSAgICAgICAgCXVybCA9IG5ldyBVUkwoImh0dHAiLCBob3N0bmFtZSwgcG9ydE51bWJlciwgIiIpOwotICAJICAgICAgICB9Ci0gIAkgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgCSAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gIAkgICAgICAgIH0KLQotICAJICAgICAgICAKLSAgCQkJLy9VUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIHNlcnZlckluc3RhbmNlLmdldERlbGVnYXRlKCkpLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlKTsKLSAgCQkJCi0gIAkJCWlmICh1cmwgIT0gbnVsbCkKLSAgCQkJewotICAJCQkJU3RyaW5nIHMgPSB1cmwudG9TdHJpbmcoKTsKLSAgCQkJCXdlYlByb2plY3RVUkwgPSBzICsgIi8iK3Byb2plY3QuZ2V0TmFtZSgpOwotICAJCQkJLy93ZWJQcm9qZWN0VVJMID0gKHMuZW5kc1dpdGgoIi8iKSA/IHMuc3Vic3RyaW5nKDAscy5sZW5ndGgoKS0xKSA6IHMpOwotICAJCQl9Ci0gIAkJfQotICAJfQotIAlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLSAgICBsb2cubG9nKExvZy5JTkZPLCA1MDM2LCBSZXNvdXJjZVV0aWxzLmNsYXNzLCAiZ2V0V2ViUHJvamVjdFVSTCIsICJwcm9qZWN0PSIrcHJvamVjdCsiLHdlYlByb2plY3RVUkw9Iit3ZWJQcm9qZWN0VVJMKTsKLSAgCXJldHVybiB3ZWJQcm9qZWN0VVJMOyAgCQotICB9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSB3ZWIgc2VydmVyIG1vZHVsZSByb290IG9mIHRoZQotCSAqIHByb2plY3QgaW4gYSBzZXJ2ZXIgaW5zdGFuY2Ugb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViIG5hdHVyZSBvcgotCSAqIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBUaGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdCBVUkwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViCi0JICogICAgICAgICBuYXR1cmUgb3IgaGFzIG5vIGFzc29jaWF0aW9uIHRvIGEgc2VydmVyIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYlByb2plY3RVUkwoSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmcgd2ViUHJvamVjdFVSTCA9IG51bGw7Ci0JCUlNb2R1bGUgbW9kdWxlID0gZ2V0TW9kdWxlKHByb2plY3QpOwotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXIgc2VydmVySW5zdGFuY2UgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUobW9kdWxlKTsKLQkJCWlmIChzZXJ2ZXJJbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKXNlcnZlckluc3RhbmNlLmdldEFkYXB0ZXIoSVVSTFByb3ZpZGVyLmNsYXNzKSkuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGUpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcyA9IHVybC50b1N0cmluZygpOwotCQkJCQl3ZWJQcm9qZWN0VVJMID0gKHMuZW5kc1dpdGgoIi8iKSA/IHMuc3Vic3RyaW5nKDAsIHMKLQkJCQkJCQkubGVuZ3RoKCkgLSAxKSA6IHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhMb2cuSU5GTywgNTAzNywgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldFdlYlByb2plY3RVUkwiLAotCQkJCSJwcm9qZWN0PSIgKyBwcm9qZWN0ICsgIix3ZWJQcm9qZWN0VVJMPSIgKyB3ZWJQcm9qZWN0VVJMKTsKLQotCQlyZXR1cm4gd2ViUHJvamVjdFVSTDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbmNvZGVkV2ViUHJvamVjdFVSTChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyB1cmwgPSBnZXRXZWJQcm9qZWN0VVJMKHByb2plY3QpOwotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IHVybC5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGVuY29kZWRVUkwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZW5jb2RlZFVSTC5hcHBlbmQodXJsLnN1YnN0cmluZygwLCBpbmRleCArIDEpKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgY3R4dFJvb3QgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwuc3Vic3RyaW5nKGluZGV4ICsgMSwgdXJsLmxlbmd0aCgpKSwgIlVURi04Iik7Ci0JCQkJCWludCBwbHVzSW5kZXggPSBjdHh0Um9vdC5pbmRleE9mKCcrJyk7Ci0JCQkJCXdoaWxlIChwbHVzSW5kZXggIT0gLTEpIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCXNiLmFwcGVuZChjdHh0Um9vdC5zdWJzdHJpbmcoMCwgcGx1c0luZGV4KSk7Ci0JCQkJCQlzYi5hcHBlbmQoIiUyMCIpOwotCQkJCQkJc2IuYXBwZW5kKGN0eHRSb290LnN1YnN0cmluZyhwbHVzSW5kZXggKyAxLCBjdHh0Um9vdAotCQkJCQkJCS5sZW5ndGgoKSkpOwotCQkJCQkJY3R4dFJvb3QgPSBzYi50b1N0cmluZygpOwotCQkJCQkJcGx1c0luZGV4ID0gY3R4dFJvb3QuaW5kZXhPZignKycpOwotCQkJCQl9Ci0JCQkJCWVuY29kZWRVUkwuYXBwZW5kKGN0eHRSb290KTsKLQkJCQl9Y2F0Y2ggKElPRXhjZXB0aW9uIGlvKXsKLQkJCQkJLy9oYW5kbGVyIGV4Y2VwdGlvbgotCQkJCX0JCQkJCi0JCQkJdXJsID0gZW5jb2RlZFVSTC50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gb2YgYSBKYXZhIHJlc291cmNlLCByZXR1cm5zIHRoZQotCSAqIHBhY2thZ2UgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgcmVzb3VyY2UgaXMgbm90IHByb3Blcmx5Ci0JICogbG9jYXRlZCBpbiBhIHByb2plY3Qgb3IgZm9sZGVyIG9uIHRoZSBidWlsZCBjbGFzc3BhdGggb3IgdGhhdCBpcyB0aGUKLQkgKiBidWlsZCBvdXRwdXQgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgSmF2YSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIEphdmEgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YVJlc291cmNlUGFja2FnZU5hbWUoSVBhdGggYWJzb2x1dGVQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBqYXZhRm9sZGVyUGF0aCA9IGFic29sdXRlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdE9mKGFic29sdXRlUGF0aCk7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQgPSBqYXZhUHJvamVjdAotCQkJCQkJLmZpbmRQYWNrYWdlRnJhZ21lbnQoamF2YUZvbGRlclBhdGgpOwotCQkJCWlmIChmcmFnbWVudCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQkJCX0KLQkJCQlJUGF0aCBvdXRwdXRQYXRoID0gZ2V0SmF2YU91dHB1dExvY2F0aW9uKHByb2plY3QpOwotCQkJCWlmIChvdXRwdXRQYXRoLmlzUHJlZml4T2YoamF2YUZvbGRlclBhdGgpKSB7Ci0JCQkJCUlQYXRoIGphdmFQYWNrYWdlUGF0aCA9IGphdmFGb2xkZXJQYXRoCi0JCQkJCQkJLnJlbW92ZUZpcnN0U2VnbWVudHMob3V0cHV0UGF0aC5zZWdtZW50Q291bnQoKSk7Ci0JCQkJCXJldHVybiBqYXZhUGFja2FnZVBhdGguaXNFbXB0eSgpID8gbnVsbCA6IGphdmFQYWNrYWdlUGF0aAotCQkJCQkJCS50b1N0cmluZygpLnJlcGxhY2UoSVBhdGguU0VQQVJBVE9SLCAnLicpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBvZiBhIEphdmEgcmVzb3VyY2UsIHJldHVybnMgdGhlCi0JICogcGFja2FnZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBhcyBhIHJlbGF0aXZlIHBhdGhuYW1lIG9yIG51bGwgaWYgdGhlCi0JICogcmVzb3VyY2UgaXMgbm90IHByb3Blcmx5IGxvY2F0ZWQgaW4gYSBwcm9qZWN0IG9yIGZvbGRlciBvbiB0aGUgYnVpbGQKLQkgKiBjbGFzc3BhdGguCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIEphdmEgcmVzb3VyY2UuCi0JICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBKYXZhIHJlc291cmNlIGFzIGEgcmVsYXRpdmUgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFSZXNvdXJjZVBhY2thZ2VQYXRoKElQYXRoIGFic29sdXRlUGF0aCkgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBSZXNvdXJjZVV0aWxzCi0JCQkJLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKGFic29sdXRlUGF0aCk7Ci0JCXJldHVybiAocGFja2FnZU5hbWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aChwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywKLQkJCQlJUGF0aC5TRVBBUkFUT1IpKSk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gb2YgYSBKYXZhIHJlc291cmNlLCByZXR1cm5zIHRoZQotCSAqIGFic29sdXRlIHBhdGggb2YgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgaXMgb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBvcgotCSAqIGlzIHRoZSBidWlsZCBvdXRwdXQgcGF0aCBhbmQgdGhhdCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEKLQkgKiByZXNvdXJjZSwgb3IgbnVsbCBpZiBubyBzdWNoIHByb2plY3Qgb3IgZm9sZGVyIGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgSmF2YSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwcm9qZWN0IG9yIGZvbGRlciBjb250YWluaW5nIHRoZSBmdWxseQotCSAqICAgICAgICAgcXVhbGlmaWVkIEphdmEgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUmVzb3VyY2VSb290UGF0aChJUGF0aCBhYnNvbHV0ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0T2YoYWJzb2x1dGVQYXRoKTsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwZnJzID0gamF2YVByb2plY3QKLQkJCQkJCS5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGZycy5sZW5ndGg7IGkrKykgewotCQkJCQlJUmVzb3VyY2UgZnJhZ21lbnRSb290ID0gcGZyc1tpXS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQkJaWYgKGZyYWdtZW50Um9vdCAhPSBudWxsKSB7Ci0JCQkJCQlJUGF0aCBmcmFnbWVudFBhdGggPSBmcmFnbWVudFJvb3QuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCWlmIChmcmFnbWVudFBhdGguaXNQcmVmaXhPZihhYnNvbHV0ZVBhdGgpKSB7Ci0JCQkJCQkJcmV0dXJuIGZyYWdtZW50UGF0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlJUGF0aCBvdXRwdXRQYXRoID0gZ2V0SmF2YU91dHB1dExvY2F0aW9uKHByb2plY3QpOwotCQkJCWlmIChvdXRwdXRQYXRoLmlzUHJlZml4T2YoYWJzb2x1dGVQYXRoKSkgewotCQkJCQlyZXR1cm4gb3V0cHV0UGF0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBhbiBVUkwgKEhUVFAgb3IgRklMRSkgdG8gYW4gRWNsaXBzZSByZXNvdXJjZSwgcmV0dXJuaW5nIHRoZQotCSAqIFVSTCBzdHJpbmcgaWYgc3VjY2Vzc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiBBIHZhbHVlIG9mIG51bGwgd2lsbAotCSAqIGRlZmluaXRlbHkgYmUgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbm90IG1ldDoKLQkgKiA8b2w+Ci0JICogPGxpPlRoZSBhYnNvbHV0ZSBwYXRoIGJlZ2lucyB3aXRoIGEgV2ViIFByb2plY3QuCi0JICogPGxpPlRoZSBsZWFkaW5nIHBvcnRpb24gb2YgdGhlIGFic29sdXRlIHBhdGggbWF0Y2hlcyB0aGUgcGF0aCBvZiB0aGUKLQkgKiBjb250YWluZXIgcmV0dXJuZWQgYnkgeyNsaW5rICNnZXRXZWJNb2R1bGVTZXJ2ZXJSb290Ci0JICogZ2V0V2ViTW9kdWxlU2VydmVyUm9vdH0gZm9yIHRoZSBwcm9qZWN0LgotCSAqIDxsaT5UaGUgcGF0aCBkb2VzIG5vdCBsZWFkIHRvIHRoZSBXRUItSU5GIGZvbGRlciBvciBhbnkgZGVzY2VuZGVudAotCSAqIHRoZXJlb2YuCi0JICogPGxpPlRoZSBXZWIgUHJvamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZXhwbGljaXQgb3IgZGVmYXVsdCBzZXJ2ZXIKLQkgKiBpbnN0YW5jZS4KLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSBVUkwgb2YgdGhlIGZpbGUsIG9yIG51bGwgaWYgbm8gVVJMIGNhbiBiZSBkZXRlcm1pbmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVSTEZyb21QYXRoKElQYXRoIGFic29sdXRlUGF0aCwKLQkJCVN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBnZXRVUkxGcm9tUGF0aChhYnNvbHV0ZVBhdGgsIGdldFdlYlByb2plY3RVUkwoCi0JCQkJZ2V0UHJvamVjdE9mKGFic29sdXRlUGF0aCksIHNlcnZlckZhY3RvcnlJZCwgc2VydmVyKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJMRnJvbVBhdGgoSVBhdGggYWJzb2x1dGVQYXRoLCBTdHJpbmcgd2ViUHJvamVjdFVSTCkgewotCQlTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdE9mKGFic29sdXRlUGF0aCk7Ci0JCUlDb250YWluZXIgd2ViTW9kdWxlU2VydmVyUm9vdCA9IGdldFdlYk1vZHVsZVNlcnZlclJvb3QocHJvamVjdCk7Ci0JCWlmICh3ZWJNb2R1bGVTZXJ2ZXJSb290ICE9IG51bGwpIHsKLQkJCUlQYXRoIHdlYk1vZHVsZVNlcnZlclJvb3RQYXRoID0gd2ViTW9kdWxlU2VydmVyUm9vdC5nZXRGdWxsUGF0aCgpOwotCQkJaWYgKHdlYk1vZHVsZVNlcnZlclJvb3RQYXRoLmlzUHJlZml4T2YoYWJzb2x1dGVQYXRoKSkgewotCQkJCWludCBudW1TZWdtZW50ID0gd2ViTW9kdWxlU2VydmVyUm9vdFBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJaW50IG51bVNlZ21lbnRGcm9tUGF0aCA9IGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQlpZiAobnVtU2VnbWVudEZyb21QYXRoID4gbnVtU2VnbWVudCkgewotCQkJCQlTdHJpbmcgbmV4dFNlZ21lbnQgPSBhYnNvbHV0ZVBhdGguc2VnbWVudChudW1TZWdtZW50KTsKLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIFdlYk1vZHVsZVNlcnZlclJvb3QgaXMKLQkJCQkJLy8gV0VCLUlORiAoaWdub3JpbmcgY2FzZSkKLQkJCQkJaWYgKG5leHRTZWdtZW50ICE9IG51bGwJJiYgIW5leHRTZWdtZW50LmVxdWFsc0lnbm9yZUNhc2UoIldFQi1JTkYiKSkgewotCQkJCQkJSVBhdGggcmVsYXRpdmVQYXRoID0gYWJzb2x1dGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobnVtU2VnbWVudCk7Ci0JCQkJCQlpZiAod2ViUHJvamVjdFVSTCAhPSBudWxsKQotCQkJCQkJCXVybC5hcHBlbmQod2ViUHJvamVjdFVSTCkuYXBwZW5kKElQYXRoLlNFUEFSQVRPUikuYXBwZW5kKHJlbGF0aXZlUGF0aC50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAobnVtU2VnbWVudEZyb21QYXRoID09IG51bVNlZ21lbnQpCi0JCQkJCXVybC5hcHBlbmQod2ViUHJvamVjdFVSTCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVybC5sZW5ndGgoKSA8IDEpIHsKLQkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQl1cmwuYXBwZW5kKGdldFJlc291cmNlVVJJKHdvcmtzcGFjZS5nZXRGaWxlKGFic29sdXRlUGF0aCkpKTsKLQkJfQotCQlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhMb2cuSU5GTywgNTAzOCwgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldFVSTEZyb21QYXRoIiwKLQkJCQkiYWJzb2x1dGVQYXRoPSIgKyBhYnNvbHV0ZVBhdGggKyAiLHVybD0iICsgdXJsKTsKLQotCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGZpbGUgb2YgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYW5kIHJldHVybnMgaXRzCi0JICogaGFuZGxlIGFzIGFuIDxjb2RlPklGaWxlPC9jb2RlPi4gSWYgdGhlIGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQsIGEKLQkgKiA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBjb250YWluaW5nIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IG9iamVjdAotCSAqIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byBjcmVhdGUuIFRoZSBwcm9qZWN0IGF0IHRoZQotCSAqICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBwYXRoIG11c3QgYWxyZWFkeSBleGlzdCwgdGhhdCBpcywgdGhpcyBtZXRob2QKLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLQkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9aGFuZGxlIG9mIHRoZQotCSAqICAgICAgICAgZmlsZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfXdpdGggYQotCSAqICAgICAgICAgICAgIHNldmVyaXR5IG9mIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+IGFuZCBhCi0JICogICAgICAgICAgICAgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLQkgKi8KLQkvLyAgcHVibGljIHN0YXRpYyBJRmlsZSBjcmVhdGVGaWxlICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBJUGF0aCBhYnNvbHV0ZVBhdGgsCi0JLy8gICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIGlmICghYWJzb2x1dGVQYXRoLmlzQWJzb2x1dGUoKSkKLQkvLyAgICB7Ci0JLy8gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlUGx1Z2luLklELDAsV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX1BBVEhfTk9UX0FCU09MVVRFIixuZXcKLQkvLyBPYmplY3RbXSB7YWJzb2x1dGVQYXRoLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0JLy8gICAgfQotCS8vICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAxKQotCS8vICAgIHsKLQkvLyAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VQbHVnaW4uSUQsMCxXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfUEFUSF9FTVBUWSIsbmV3Ci0JLy8gT2JqZWN0W10ge2Fic29sdXRlUGF0aC50b1N0cmluZygpfSksbnVsbCkpOwotCS8vICAgIH0KLQkvLyAgICBpZiAoYWJzb2x1dGVQYXRoLnNlZ21lbnRDb3VudCgpIDwgMikKLQkvLyAgICB7Ci0JLy8gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlUGx1Z2luLklELDAsV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX1BBVEhfTk9UX0ZPTERFUiIsbmV3Ci0JLy8gT2JqZWN0W10ge2Fic29sdXRlUGF0aC50b1N0cmluZygpfSksbnVsbCkpOwotCS8vICAgIH0KLQkvLyAgICBJQ29udGFpbmVyIHBhcmVudCA9IG1ha2VGb2xkZXJQYXRoKHJlc291cmNlQ29udGV4dCwKLQkvLyBhYnNvbHV0ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c01vbml0b3IpOwotCS8vICAgIFN0cmluZyBmaWxlTmFtZSA9IGFic29sdXRlUGF0aC5sYXN0U2VnbWVudCgpOwotCS8vICAgIHJldHVybiBtYWtlRmlsZShyZXNvdXJjZUNvbnRleHQsIHBhcmVudCwgZmlsZU5hbWUsIGlucHV0U3RyZWFtLAotCS8vIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0JLy8gIH0KLQkvKioKLQkgKiBDcmVhdGVzIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhIGZpbGUgb2YgdGhlIGdpdmVuCi0JICogPGNvZGU+cmVsYXRpdmVQYXRoPC9jb2RlPiBhbmQgcmV0dXJucyBpdHMgaGFuZGxlIGFzIGFuCi0JICogPGNvZGU+SUZpbGU8L2NvZGU+LiBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgYQotCSAqIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcgYW4gPGNvZGU+SVN0YXR1czwvY29kZT4gb2JqZWN0Ci0JICogaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4gVGhlIHByb2plY3QgYXQgdGhlCi0JICogICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIHBhdGggbXVzdCBhbHJlYWR5IGV4aXN0LCB0aGF0IGlzLCB0aGlzIG1ldGhvZAotCSAqICAgICAgICAgICAgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotCSAqIEBwYXJhbSBjcmVhdGVGb2xkZXJzCi0JICogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotCSAqICAgICAgICAgICAge0BsaW5rICNDUkVBVEUgQ1JFQVRFfW9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPkNSRUFURTwvY29kZT4tIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbgotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gZG8gbm90IGV4aXN0LCB0aGV5IHdpbGwKLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQuCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9DUkVBVEU8L2NvZGU+LSBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMKLQkgKiAgICAgICAgICAgIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGRvIG5vdCBleGlzdCwgdGhlCi0JICogICAgICAgICAgICBtZXRob2Qgd2lsbCB0aHJvdyBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZQotCSAqICAgICAgICAgICAgVGhlIHBvbGljeSBmb3IgZXhpc3RpbmcgZmlsZXMsIG9uZSBvZgotCSAqICAgICAgICAgICAge0BsaW5rICNPVkVSV1JJVEUgT1ZFUldSSVRFfW9yCi0JICogICAgICAgICAgICB7QGxpbmsgI0RPTlRfT1ZFUldSSVRFIERPTlRfT1ZFUldSSVRFfS4KLQkgKiAgICAgICAgICAgIDx1bD4KLQkgKiAgICAgICAgICAgIDxsaT48Y29kZT5PVkVSV1JJVEU8L2NvZGU+LSBJZiBhIHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUKLQkgKiAgICAgICAgICAgIGFzIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzIGFuZCBpcwotCSAqICAgICAgICAgICAgYSBmaWxlLCBpdCB3aWxsIGJlIHJlcGxhY2VkLiBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMKLQkgKiAgICAgICAgICAgIGFuZCBpdCBpcyBub3QgYSBmaWxlLCB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZCBhCi0JICogICAgICAgICAgICA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLQkgKiAgICAgICAgICAgIDxsaT48Y29kZT5ET05UX09WRVJXUklURTwvY29kZT4tIElmIGFueSByZXNvdXJjZSBvZiB0aGUKLQkgKiAgICAgICAgICAgIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5Ci0JICogICAgICAgICAgICBleGlzdHMsIHRoZW4gbm8gZmlsZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGEKLQkgKiAgICAgICAgICAgIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLQkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9aGFuZGxlIG9mIHRoZQotCSAqICAgICAgICAgZmlsZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfXdpdGggYQotCSAqICAgICAgICAgICAgIHNldmVyaXR5IG9mIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+IGFuZCBhCi0JICogICAgICAgICAgICAgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLQkgKi8KLQkvLyAgcHVibGljIHN0YXRpYyBJRmlsZSBjcmVhdGVGaWxlICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBJUHJvamVjdCBwcm9qZWN0LAotCS8vICAgIElQYXRoIHJlbGF0aXZlUGF0aCwKLQkvLyAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwKLQkvLyAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLQkvLyAgICBTdGF0dXNNb25pdG9yIHN0YXR1c01vbml0b3IKLQkvLyAgKQotCS8vICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCS8vICB7Ci0JLy8gICAgSVBhdGggYWJzb2x1dGVQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZChyZWxhdGl2ZVBhdGgpOwotCS8vICAgIHJldHVybiBjcmVhdGVGaWxlKHJlc291cmNlQ29udGV4dCwgYWJzb2x1dGVQYXRoLCBpbnB1dFN0cmVhbSwKLQkvLyBwcm9ncmVzc01vbml0b3IsIHN0YXR1c01vbml0b3IpOwotCS8vICB9Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBvdXRwdXQgc3RyZWFtIHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgdG8gdGhlIGdpdmVuCi0JICogPGNvZGU+ZmlsZTwvY29kZT4uIEFjdHVhbCBjaGFuZ2VzIHRvIHRoZSB3b3Jrc3BhY2UgbWF5IG9jY3VyIGR1cmluZwotCSAqIGNyZWF0aW9uIG9mIHRoZSBzdHJlYW0sIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHN0cmVhbSwgb3Igd2hlbiB0aGUgc3RyZWFtCi0JICogaXMgY2xvc2VkLiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcgYW4KLQkgKiA8Y29kZT5JU3RhdHVzPC9jb2RlPiB3aWxsIGJlIHRocm93biBhdCBzb21lIHBvaW50IGluIHRoZSBsaWZlY3ljbGUgb2YKLQkgKiB0aGUgc3RyZWFtIGlmIHRoZSBmaWxlIHJlc291cmNlIGNhbm5vdCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfWhhbmRsZSBvZgotCSAqICAgICAgICAgICAgdGhlIGZpbGUgcmVzb3VyY2UgdG8gY3JlYXRlLiBUaGUgcHJvamVjdCBpbXBsaWVkIGJ5IHRoZQotCSAqICAgICAgICAgICAgcGF0aG5hbWUgb2YgdGhlIGZpbGUgbXVzdCBhbHJlYWR5IGV4aXN0LCB0aGF0IGlzLCB0aGlzIG1ldGhvZAotCSAqICAgICAgICAgICAgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotCSAqIEByZXR1cm4gQW4gPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiB0aWVkIHRvIHRoZSBmaWxlIHJlc291cmNlLiBBY3R1YWwKLQkgKiAgICAgICAgIGNoZWNrcyBvZiBvciBjaGFuZ2VzIHRvIHRoZSB3b3Jrc3BhY2UgbWF5IG9jY3VyIGFzIGVhcmx5IGR1cmluZwotCSAqICAgICAgICAgc3RyZWFtIGNyZWF0aW9uLCBjbG9zdXJlLCBvciBhbnkgdGltZSBpbiBiZXR3ZWVuLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiBjb250YWluaW5nIGFuCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9d2l0aCBhCi0JICogICAgICAgICAgICAgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLQkgKiAgICAgICAgICAgICBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLiBSZWFzb25zIGluY2x1ZGU6Ci0JICogICAgICAgICAgICAgPG9sPgotCSAqICAgICAgICAgICAgIDxsaT5UaGUgcHJvamVjdCBvZiB0aGUgZ2l2ZW4gZmlsZSdzIHBhdGggZG9lcyBub3QgZXhpc3QuCi0JICogICAgICAgICAgICAgPGxpPkEgbm9uLWZpbGUgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBvZiB0aGUgZ2l2ZW4gZmlsZQotCSAqICAgICAgICAgICAgIGFscmVhZHkgZXhpc3RzLgotCSAqICAgICAgICAgICAgIDxsaT5BIGZpbGUgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBvZiB0aGUgZ2l2ZW4gZmlsZQotCSAqICAgICAgICAgICAgIGFscmVhZHkgZXhpc3RzLCBhbmQgPGNvZGU+b3ZlcndyaXRlRmlsZTwvY29kZT4gaXMgZmFsc2UuCi0JICogICAgICAgICAgICAgPGxpPk9uZSBvciBtb3JlIGludGVybWVkaWF0ZSBmb2xkZXJzIHRvIHRoZSBnaXZlbiBmaWxlIGRvCi0JICogICAgICAgICAgICAgbm90IGV4aXN0LCBhbmQgPGNvZGU+Y3JlYXRlRm9sZGVyczwvY29kZT4gaXMgZmFsc2UuCi0JICogICAgICAgICAgICAgPC9vbD4KLQkgKi8KLQotCS8vICBwdWJsaWMgc3RhdGljIE91dHB1dFN0cmVhbSBuZXdGaWxlT3V0cHV0U3RyZWFtICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IGNvbnRleHQsCi0JLy8gICAgSUZpbGUgZmlsZSwKLQkvLyAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLQkvLyAgICBTdGF0dXNNb25pdG9yIHN0YXR1c01vbml0b3IKLQkvLyAgKQotCS8vICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCS8vICB7Ci0JLy8gICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0oY29udGV4dCwgZmlsZSwgcHJvZ3Jlc3NNb25pdG9yLAotCS8vIHN0YXR1c01vbml0b3IpOwotCS8vICB9Ci0JLyoqCi0JICogQ29waWVzIGEgc2V0IG9mIGZpbGVzIGZyb20gYSBwbHVnaW4ncyBpbnN0YWxsYXRpb24gbG9jYXRpb24gdG8gYW4gRWNsaXBzZQotCSAqIGZvbGRlci4gVGhlIGZpbGVzIGFyZSBuYW1lZCBpbiBhbiBpbmRleCBmaWxlIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlCi0JICogcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBpbmRleFBhdGhuYW1lCi0JICogICAgICAgICAgICBBIGZpbGUgY29udGFpbmluZyBhIHdoaXRlc3BhY2UtZGVsaW1pdHRlZCBsaXN0IG9mIHBhdGhuYW1lcyBvZgotCSAqICAgICAgICAgICAgdGhlIGZpbGVzIHRvIGNvcHkuIFRoZSBwYXRobmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgPGNvZGU+cGx1Z2luIHNvdXJjZVBhdGg8L2NvZGU+LiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgRWNsaXBzZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gd2hpY2ggdGhlIGZpbGVzCi0JICogICAgICAgICAgICB3aWxsIGJlIGNvcGllZC4gVGhlIHJlbGF0aXZlIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgbmFtZWQgaW4KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5pbmRleFBhdGhuYW1lPC9jb2RlPiBmaWxlIGFyZSBwcmVzZXJ2ZWQuIE11c3Qgbm90Ci0JICogICAgICAgICAgICBiZSBudWxsLgotCSAqIEBwYXJhbSBjcmVhdGVGb2xkZXJzCi0JICogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotCSAqICAgICAgICAgICAge0BsaW5rICNDUkVBVEUgQ1JFQVRFfW9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPkNSRUFURTwvY29kZT4tIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbgotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gZG8gbm90IGV4aXN0LCB0aGV5IHdpbGwKLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQuCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9DUkVBVEU8L2NvZGU+LSBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMKLQkgKiAgICAgICAgICAgIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGRvIG5vdCBleGlzdCwgdGhlCi0JICogICAgICAgICAgICBtZXRob2Qgd2lsbCB0aHJvdyBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZXMKLQkgKiAgICAgICAgICAgIFRoZSBwb2xpY3kgZm9yIGV4aXN0aW5nIGZpbGVzLCBvbmUgb2YKLQkgKiAgICAgICAgICAgIHtAbGluayAjT1ZFUldSSVRFIE9WRVJXUklURX1vcgotCSAqICAgICAgICAgICAge0BsaW5rICNET05UX09WRVJXUklURSBET05UX09WRVJXUklURX0uCi0JICogICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICA8bGk+PGNvZGU+T1ZFUldSSVRFPC9jb2RlPi0gSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lCi0JICogICAgICAgICAgICBhcyB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cyBhbmQgaXMKLQkgKiAgICAgICAgICAgIGEgZmlsZSwgaXQgd2lsbCBiZSByZXBsYWNlZC4gSWYgdGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzCi0JICogICAgICAgICAgICBhbmQgaXQgaXMgbm90IGEgZmlsZSwgdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQgYQotCSAqICAgICAgICAgICAgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9PVkVSV1JJVEU8L2NvZGU+LSBJZiBhbnkgcmVzb3VyY2Ugb2YgdGhlCi0JICogICAgICAgICAgICBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeQotCSAqICAgICAgICAgICAgZXhpc3RzLCB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZCBhCi0JICogICAgICAgICAgICA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c313aXRoIGEKLQkgKiAgICAgICAgICAgICBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotCSAqICAgICAgICAgICAgIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0JICovCi0JLy8gIHN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5SW5kZXhlZEZpbGVzICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBQbHVnaW4gcGx1Z2luLAotCS8vICAgIElQYXRoIHNvdXJjZVBhdGgsCi0JLy8gICAgSVBhdGggaW5kZXhQYXRobmFtZSwKLQkvLyAgICBJUGF0aCB0YXJnZXRQYXRoLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvcgotCS8vICApCi0JLy8gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JLy8gIHsKLQkvLyAgICB0cnkKLQkvLyAgICB7Ci0JLy8gICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHBsdWdpbi5vcGVuU3RyZWFtKGluZGV4UGF0aG5hbWUpOwotCS8vICAgICAgRW51bWVyYXRpb24gZmlsZW5hbWVzID0gU3RyaW5nVXRpbHMucGFyc2VGaWxlbmFtZXNGcm9tU3RyZWFtKGlucHV0KTsKLQkvLyAgICAgIGNvcHlFbnVtZXJhdGVkRmlsZXMocmVzb3VyY2VDb250ZXh0LCBwbHVnaW4sIHNvdXJjZVBhdGgsIGZpbGVuYW1lcywKLQkvLyB0YXJnZXRQYXRoLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c01vbml0b3IpOwotCS8vICAgIH0KLQkvLyAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkvLyAgICB7Ci0JLy8gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixwbHVnaW4uZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwwLFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9JTyIpLGUpKTsKLQkvLyAgICB9Ci0JLy8gIH0KLQkvKioKLQkgKiBDb3BpZXMgYSBzZXQgb2YgZmlsZXMgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbiB0byBhbiBFY2xpcHNlCi0JICogZm9sZGVyLiBUaGUgZmlsZXMgYXJlIG5hbWVkIGluIGFuIGVudW1lcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBwYXRobmFtZXMKLQkgKiAgICAgICAgICAgIEFuIGVudW1lcmF0aW9uIG9mIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgdG8gY29weS4gVGhlCi0JICogICAgICAgICAgICBwYXRobmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW4gc291cmNlUGF0aDwvY29kZT4uCi0JICogICAgICAgICAgICBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgRWNsaXBzZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gd2hpY2ggdGhlIGZpbGVzCi0JICogICAgICAgICAgICB3aWxsIGJlIGNvcGllZC4gVGhlIHJlbGF0aXZlIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgbmFtZWQgaW4KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5wYXRobmFtZXM8L2NvZGU+IGVudW1lcmF0aW9uIGFyZSBwcmVzZXJ2ZWQuIE11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSBjcmVhdGVGb2xkZXJzCi0JICogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotCSAqICAgICAgICAgICAge0BsaW5rICNDUkVBVEUgQ1JFQVRFfW9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPkNSRUFURTwvY29kZT4tIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbgotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gZG8gbm90IGV4aXN0LCB0aGV5IHdpbGwKLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQuCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9DUkVBVEU8L2NvZGU+LSBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMKLQkgKiAgICAgICAgICAgIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGRvIG5vdCBleGlzdCwgdGhlCi0JICogICAgICAgICAgICBtZXRob2Qgd2lsbCB0aHJvdyBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZXMKLQkgKiAgICAgICAgICAgIFRoZSBwb2xpY3kgZm9yIGV4aXN0aW5nIGZpbGVzLCBvbmUgb2YKLQkgKiAgICAgICAgICAgIHtAbGluayAjT1ZFUldSSVRFIE9WRVJXUklURX1vcgotCSAqICAgICAgICAgICAge0BsaW5rICNET05UX09WRVJXUklURSBET05UX09WRVJXUklURX0uCi0JICogICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICA8bGk+PGNvZGU+T1ZFUldSSVRFPC9jb2RlPi0gSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lCi0JICogICAgICAgICAgICBhcyB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cyBhbmQgaXMKLQkgKiAgICAgICAgICAgIGEgZmlsZSwgaXQgd2lsbCBiZSByZXBsYWNlZC4gSWYgdGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzCi0JICogICAgICAgICAgICBhbmQgaXQgaXMgbm90IGEgZmlsZSwgdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQgYQotCSAqICAgICAgICAgICAgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9PVkVSV1JJVEU8L2NvZGU+LSBJZiBhbnkgcmVzb3VyY2Ugb2YgdGhlCi0JICogICAgICAgICAgICBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeQotCSAqICAgICAgICAgICAgZXhpc3RzLCB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZCBhCi0JICogICAgICAgICAgICA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c313aXRoIGEKLQkgKiAgICAgICAgICAgICBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotCSAqICAgICAgICAgICAgIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0JICovCi0JLy8gIHN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RW51bWVyYXRlZEZpbGVzICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBQbHVnaW4gcGx1Z2luLAotCS8vICAgIElQYXRoIHNvdXJjZVBhdGgsCi0JLy8gICAgRW51bWVyYXRpb24gcGF0aG5hbWVzLAotCS8vICAgIElQYXRoIHRhcmdldFBhdGgsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIHdoaWxlIChwYXRobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gICAgewotCS8vICAgICAgU3RyaW5nIGZpbGVuYW1lID0gKFN0cmluZylwYXRobmFtZXMubmV4dEVsZW1lbnQoKTsKLQkvLyAgICAgIGNvcHlGaWxlKHJlc291cmNlQ29udGV4dCwgcGx1Z2luLCBzb3VyY2VQYXRoLCBuZXcgUGF0aChmaWxlbmFtZSksCi0JLy8gdGFyZ2V0UGF0aCwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICB9Ci0JLy8gIH0KLQkvKioKLQkgKiBDb3BpZXMgYSBmaWxlIGZyb20gYSBwbHVnaW4ncyBpbnN0YWxsYXRpb24gbG9jYXRpb24gdG8gYW4gRWNsaXBzZSBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgVGhlIHBsdWdpbiBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSBzb3VyY2VQYXRoCi0JICogICAgICAgICAgICBUaGUgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIDxjb2RlPnBsdWdpbjwvY29kZT4gaW5zdGFsbAotCSAqICAgICAgICAgICAgbG9jYXRpb24sIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGNvcHkuIElmIG51bGwsIHRoZW4gdGhlCi0JICogICAgICAgICAgICBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbiBpcyB0aGUgc291cmNlIHBhdGggKGllLiBudWxsIGlzCi0JICogICAgICAgICAgICBlcXVpdmFsZW50IHRvICIuIikuCi0JICogQHBhcmFtIHBhdGhuYW1lCi0JICogICAgICAgICAgICBUaGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgdG8gY29weS4gVGhlIHBhdGhuYW1lIGlzIHJlbGF0aXZlIHRvCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+cGx1Z2luIHNvdXJjZVBhdGg8L2NvZGU+LiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgRWNsaXBzZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gd2hpY2ggdGhlIGZpbGUgd2lsbAotCSAqICAgICAgICAgICAgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgaXMgcHJlc2VydmVkLgotCSAqICAgICAgICAgICAgTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gY3JlYXRlRm9sZGVycwotCSAqICAgICAgICAgICAgVGhlIGludGVybWVkaWF0ZSBmb2xkZXIgY3JlYXRpb24gcG9saWN5LCBvbmUgb2YKLQkgKiAgICAgICAgICAgIHtAbGluayAjQ1JFQVRFIENSRUFURX1vciB7QGxpbmsgI0RPTlRfQ1JFQVRFIERPTlRfQ1JFQVRFfS4KLQkgKiAgICAgICAgICAgIDx1bD4KLQkgKiAgICAgICAgICAgIDxsaT48Y29kZT5DUkVBVEU8L2NvZGU+LSBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4KLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGRvIG5vdCBleGlzdCwgdGhleSB3aWxsCi0JICogICAgICAgICAgICBiZSBjcmVhdGVkLgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPkRPTlRfQ1JFQVRFPC9jb2RlPi0gSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzCi0JICogICAgICAgICAgICBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBkbyBub3QgZXhpc3QsIHRoZQotCSAqICAgICAgICAgICAgbWV0aG9kIHdpbGwgdGhyb3cgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPi4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHBhcmFtIG92ZXJ3cml0ZUZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBwb2xpY3kgZm9yIGV4aXN0aW5nIGZpbGVzLCBvbmUgb2YKLQkgKiAgICAgICAgICAgIHtAbGluayAjT1ZFUldSSVRFIE9WRVJXUklURX1vcgotCSAqICAgICAgICAgICAge0BsaW5rICNET05UX09WRVJXUklURSBET05UX09WRVJXUklURX0uCi0JICogICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICA8bGk+PGNvZGU+T1ZFUldSSVRFPC9jb2RlPi0gSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lCi0JICogICAgICAgICAgICBhcyB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cyBhbmQgaXMKLQkgKiAgICAgICAgICAgIGEgZmlsZSwgaXQgd2lsbCBiZSByZXBsYWNlZC4gSWYgdGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzCi0JICogICAgICAgICAgICBhbmQgaXQgaXMgbm90IGEgZmlsZSwgdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQgYQotCSAqICAgICAgICAgICAgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9PVkVSV1JJVEU8L2NvZGU+LSBJZiBhbnkgcmVzb3VyY2Ugb2YgdGhlCi0JICogICAgICAgICAgICBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeQotCSAqICAgICAgICAgICAgZXhpc3RzLCB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZCBhCi0JICogICAgICAgICAgICA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c313aXRoIGEKLQkgKiAgICAgICAgICAgICBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotCSAqICAgICAgICAgICAgIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0JICovCi0JLy8gIHN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RmlsZSAoCi0JLy8gICAgICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JLy8gICAgUGx1Z2luIHBsdWdpbiwKLQkvLyAgICBJUGF0aCBzb3VyY2VQYXRoLAotCS8vICAgIElQYXRoIHBhdGhuYW1lLAotCS8vICAgIElQYXRoIHRhcmdldFBhdGgsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIHRyeQotCS8vICAgIHsKLQkvLyAgICAgIElQYXRoIHRhcmdldCA9IHRhcmdldFBhdGguYXBwZW5kKHBhdGhuYW1lKTsKLQkvLyAgICAgIElQYXRoIHNvdXJjZSA9IHNvdXJjZVBhdGggPT0gbnVsbCA/IHBhdGhuYW1lIDoKLQkvLyBzb3VyY2VQYXRoLmFwcGVuZChwYXRobmFtZSk7Ci0JLy8gICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHBsdWdpbi5vcGVuU3RyZWFtKHNvdXJjZSk7Ci0JLy8gICAgICBjcmVhdGVGaWxlKHJlc291cmNlQ29udGV4dCwgdGFyZ2V0LCBpbnB1dCwgcHJvZ3Jlc3NNb25pdG9yLAotCS8vIHN0YXR1c01vbml0b3IpOwotCS8vICAgIH0KLQkvLyAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkvLyAgICB7Ci0JLy8gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixwbHVnaW4uZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwwLFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9JTyIpLGUpKTsKLQkvLyAgICB9Ci0JLy8gIH0KLQkvKioKLQkgKiBDb3BpZXMgYSBzZXQgb2YgZmlsZXMgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbiB0byBhIG5hdGl2ZQotCSAqIGRpcmVjdG9yeS4gVGhlIGZpbGVzIGFyZSBuYW1lZCBpbiBhbiBpbmRleCBmaWxlIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlCi0JICogcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBpbmRleFBhdGhuYW1lCi0JICogICAgICAgICAgICBBIGZpbGUgY29udGFpbmluZyBhIHdoaXRlc3BhY2UtZGVsaW1pdHRlZCBsaXN0IG9mIHBhdGhuYW1lcyBvZgotCSAqICAgICAgICAgICAgdGhlIGZpbGVzIHRvIGNvcHkuIFRoZSBwYXRobmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgPGNvZGU+cGx1Z2luIHNvdXJjZVBhdGg8L2NvZGU+LiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgbmF0aXZlIGRpcmVjdG9yeSB0byB3aGljaCB0aGUgZmlsZXMKLQkgKiAgICAgICAgICAgIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWVzIG9mIHRoZSBmaWxlcyBuYW1lZCBpbgotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPmluZGV4UGF0aG5hbWU8L2NvZGU+IGZpbGUgYXJlIHByZXNlcnZlZC4gTXVzdCBub3QKLQkgKiAgICAgICAgICAgIGJlIG51bGwuCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGFuIElPIGVycm9yIGhhcyBvY2N1cmVkLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5SW5kZXhlZEZpbGVzVG9PUyhQbHVnaW4gcGx1Z2luLCBJUGF0aCBzb3VyY2VQYXRoLAotCQkJSVBhdGggaW5kZXhQYXRobmFtZSwgSVBhdGggdGFyZ2V0UGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IHBsdWdpbi5vcGVuU3RyZWFtKGluZGV4UGF0aG5hbWUpOwotCQlFbnVtZXJhdGlvbiBmaWxlbmFtZXMgPSBTdHJpbmdVdGlscy5wYXJzZUZpbGVuYW1lc0Zyb21TdHJlYW0oaW5wdXQpOwotCQljb3B5RW51bWVyYXRlZEZpbGVzVG9PUyhwbHVnaW4sIHNvdXJjZVBhdGgsIGZpbGVuYW1lcywgdGFyZ2V0UGF0aCwKLQkJCQlwcm9ncmVzc01vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhIHNldCBvZiBmaWxlcyBmcm9tIGEgcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIHRvIGEgbmF0aXZlCi0JICogZGlyZWN0b3J5LiBUaGUgZmlsZXMgYXJlIG5hbWVkIGluIGFuIGVudW1lcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBwYXRobmFtZXMKLQkgKiAgICAgICAgICAgIEFuIGVudW1lcmF0aW9uIG9mIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgdG8gY29weS4gVGhlCi0JICogICAgICAgICAgICBwYXRobmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW4gc291cmNlUGF0aDwvY29kZT4uCi0JICogICAgICAgICAgICBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgbmF0aXZlIGRpcmVjdG9yeSB0byB3aGljaCB0aGUgZmlsZXMKLQkgKiAgICAgICAgICAgIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWVzIG9mIHRoZSBmaWxlcyBuYW1lZCBpbgotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPnBhdGhuYW1lczwvY29kZT4gZW51bWVyYXRpb24gYXJlIHByZXNlcnZlZC4gTXVzdAotCSAqICAgICAgICAgICAgbm90IGJlIG51bGwuCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGFuIElPIGVycm9yIGhhcyBvY2N1cmVkLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RW51bWVyYXRlZEZpbGVzVG9PUyhQbHVnaW4gcGx1Z2luLCBJUGF0aCBzb3VyY2VQYXRoLAotCQkJRW51bWVyYXRpb24gcGF0aG5hbWVzLCBJUGF0aCB0YXJnZXRQYXRoLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXdoaWxlIChwYXRobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBmaWxlbmFtZSA9IChTdHJpbmcpIHBhdGhuYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJY29weUZpbGVUb09TKHBsdWdpbiwgc291cmNlUGF0aCwgbmV3IFBhdGgoZmlsZW5hbWUpLCB0YXJnZXRQYXRoLAotCQkJCQlwcm9ncmVzc01vbml0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGEgZmlsZSBmcm9tIGEgcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIHRvIGEgbmF0aXZlCi0JICogZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBwYXRobmFtZQotCSAqICAgICAgICAgICAgVGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGNvcHkuIFRoZSBwYXRobmFtZSBpcyByZWxhdGl2ZSB0bwotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPnBsdWdpbiBzb3VyY2VQYXRoPC9jb2RlPi4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gdGFyZ2V0UGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG5hdGl2ZSBkaXJlY3RvcnkgdG8gd2hpY2ggdGhlIGZpbGUKLQkgKiAgICAgICAgICAgIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgaXMKLQkgKiAgICAgICAgICAgIHByZXNlcnZlZC4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGluZGljYXRpbmcgYW4gSU8gZXJyb3IgaGFzIG9jY3VyZWQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGNvcHlGaWxlVG9PUyhQbHVnaW4gcGx1Z2luLCBJUGF0aCBzb3VyY2VQYXRoLAotCQkJSVBhdGggcGF0aG5hbWUsIElQYXRoIHRhcmdldFBhdGgsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVBhdGggdGFyZ2V0ID0gdGFyZ2V0UGF0aC5hcHBlbmQocGF0aG5hbWUpOwotCQlJUGF0aCBzb3VyY2UgPSBzb3VyY2VQYXRoID09IG51bGwgPyBwYXRobmFtZSA6IHNvdXJjZVBhdGgKLQkJCQkuYXBwZW5kKHBhdGhuYW1lKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBwbHVnaW4ub3BlblN0cmVhbShzb3VyY2UpOwotCQlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0LnRvT1NTdHJpbmcoKSk7Ci0JCWNvcHlTdHJlYW0oaW5wdXQsIG91dHB1dCk7Ci0JCWlucHV0LmNsb3NlKCk7Ci0JCW91dHB1dC5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBkYXRhIGZyb20gb25lIHN0cmVhbSB0byBhbm90aGVyLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgVGhlIGlucHV0IHN0cmVhbS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHN0cmVhbS4KLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBBbiBleGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcgZWl0aGVyIG9mCi0JICogICAgICAgICAgICAgdGhlIHN0cmVhbXMuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBpbnQgY29weVN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCB0ID0gMDsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQlpbnQgbiA9IGlucHV0LnJlYWQoYnVmZmVyKTsKLQkJd2hpbGUgKG4gPj0gMCkgewotCQkJb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgbik7Ci0JCQl0ICs9IG47Ci0JCQluID0gaW5wdXQucmVhZChidWZmZXIpOwotCQl9Ci0JCXJldHVybiB0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuYXRpdmUgZGlyZWN0b3J5IHBhdGggZXF1YWwgdG8gdGhlIHBhcmVudCBwb3J0aW9uIG9mIHRoZSBnaXZlbgotCSAqIDxjb2RlPnBhdGhuYW1lPC9jb2RlPi4gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgdGhlbiBubyBhY3Rpb24KLQkgKiBpcyB0YWtlbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSB3aG9zZSBwYXJlbnQgZGlyZWN0b3J5IHNob3VsZCBiZQotCSAqICAgICAgICAgICAgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGlmIGFuIElPIGVycm9yIG9jY3Vycy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgY3JlYXRlUGFyZW50RGlyZWN0b3J5Rm9yKFN0cmluZyBwYXRobmFtZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGhuYW1lKTsKLQkJRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQubWtkaXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJUmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBUaGUgc2VsZWN0aW9uCi0JICogQHJldHVybiBJUmVzb3VyY2UgaWYgdGhlIHNlbGVjdGlvbiByZXByZXNlbnRzIGFuIElSZXNvdXJjZS4gUmV0dXJucyBudWxsCi0JICogICAgICAgICBvdGhlcndpc2UuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKE9iamVjdCBvYmopCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0ID0gIisgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXMgPSAoSVJlc291cmNlKSBvYmo7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBVbml0ID0gKElDb21waWxhdGlvblVuaXQpIG9iajsKLQkJCQlyZXMgPSBjb21wVW5pdC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pIHsKLQkJCQlFbnRlcnByaXNlQmVhbiBlamJCZWFuID0gKEVudGVycHJpc2VCZWFuKSBvYmo7Ci0JCQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlamJCZWFuKTsKLQkJCQlpZiAoZWpiUHJvamVjdCAhPSBudWxsKQotCQkJCQlyZXMgPSBlamJQcm9qZWN0OwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIE5hdWdodHkgYml0cy4uLgotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLy8KLQkvLyBDcmVhdGVzIGEgcGF0aCBvZiBmb2xkZXJzLgotCS8vIERvIG5vdCBjYWxsIHdpdGggYW4gYWJzb2x1dGVQYXRoIG9mIGxlc3MgdGhhbiBvbmUgc2VnbWVudC4KLQkvLwotCS8vICBwcml2YXRlIHN0YXRpYyBJQ29udGFpbmVyIG1ha2VGb2xkZXJQYXRoICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBJUGF0aCBhYnNvbHV0ZVBhdGgsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPD0gMSkKLQkvLyAgICB7Ci0JLy8gICAgICByZXR1cm4gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoYWJzb2x1dGVQYXRoLnNlZ21lbnQoMCkpOwotCS8vICAgIH0KLQkvLyAgICBlbHNlCi0JLy8gICAgewotCS8vICAgICAgSUNvbnRhaW5lciBwYXJlbnQgPSBtYWtlRm9sZGVyUGF0aChyZXNvdXJjZUNvbnRleHQsCi0JLy8gYWJzb2x1dGVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICAgIFN0cmluZyBmb2xkZXJOYW1lID0gYWJzb2x1dGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JLy8gICAgICByZXR1cm4gbWFrZUZvbGRlcihyZXNvdXJjZUNvbnRleHQsIHBhcmVudCxmb2xkZXJOYW1lLCBwcm9ncmVzc01vbml0b3IgLAotCS8vIHN0YXR1c01vbml0b3IpOwotCS8vICAgIH0KLQkvLyAgfQotCS8vCi0JLy8gQ3JlYXRlcyBhIGZvbGRlciB1bmRlciBhIGNvbnRhaW5lci4KLQkvLyBUaGUgY29udGFpbmVyIG11c3QgYWxyZWFkeSBleGlzdC4KLQkvLwotCS8vIHByaXZhdGUgc3RhdGljIElGb2xkZXIgbWFrZUZvbGRlciAoCi0JLy8gICAgICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JLy8gICAgSUNvbnRhaW5lciBwYXJlbnQsCi0JLy8gICAgU3RyaW5nIGZvbGRlck5hbWUsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIElSZXNvdXJjZSBjaGlsZCA9IHBhcmVudC5maW5kTWVtYmVyKGZvbGRlck5hbWUpOwotCS8vICAgIGlmIChjaGlsZCA9PSBudWxsKQotCS8vICAgIHsKLQkvLyAgICAgIGlmICghcmVzb3VyY2VDb250ZXh0LmlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSkgewotCS8vICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMobmV3Ci0JLy8gU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlUGx1Z2luLklELDAsCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRk9MREVSX0NSRUFUSU9OX0RJU0FCTEVEIiwKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmb2xkZXJOYW1lfSksbnVsbCksCi0JLy8gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkpOwotCS8vICAgICAgICBpZiAocmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JLy8KLQkvLyAgICAgICAgICBpZiAoIHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQpCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQodHJ1ZSk7Ci0JLy8KLQkvLyAgICAgIH0KLQkvLyAgICAgIElGb2xkZXIgZm9sZGVyID0gcGFyZW50LmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJOYW1lKSk7Ci0JLy8gICAgICBmb2xkZXIuY3JlYXRlKHRydWUsdHJ1ZSxwcm9ncmVzc01vbml0b3IpOwotCS8vICAgICAgcmV0dXJuIGZvbGRlcjsKLQkvLyAgICB9Ci0JLy8gICAgZWxzZSBpZiAoY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpCi0JLy8gICAgewotCS8vICAgICAgcmV0dXJuIChJRm9sZGVyKWNoaWxkOwotCS8vICAgIH0KLQkvLyAgICBlbHNlCi0JLy8gICAgewotCS8vICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3Ci0JLy8gU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZVBsdWdpbi5JRCwwLFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSIixuZXcKLQkvLyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZvbGRlck5hbWUpLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0JLy8gICAgfQotCS8vICB9Ci0KLQkvLwotCS8vIENyZWF0ZXMgYSBmaWxlIHVuZGVyIGEgY29udGFpbmVyLgotCS8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotCS8vCi0JLy8gcHJpdmF0ZSBzdGF0aWMgSUZpbGUgbWFrZUZpbGUgKAotCS8vICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JLy8gICAgSUNvbnRhaW5lciBwYXJlbnQsCi0JLy8gICAgU3RyaW5nIGZpbGVOYW1lLAotCS8vICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvcgotCS8vICApCi0JLy8gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JLy8gIHsKLQkvLyAgICBJUmVzb3VyY2UgY2hpbGQgPSBwYXJlbnQuZmluZE1lbWJlcihmaWxlTmFtZSk7Ci0JLy8gICAgaWYgKGNoaWxkICE9IG51bGwpCi0JLy8gICAgewotCS8vICAgICAgaWYgKGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkvLyAgICAgIHsKLQkvLyAgICAgICAgaWYgKCFyZXNvdXJjZUNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSkgewotCS8vICAgICAgICAgIGludCByZXN1bHQgPSBzdGF0dXNNb25pdG9yLnJlcG9ydFN0YXR1cyggbmV3Ci0JLy8gU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlUGx1Z2luLklELDAsCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQiLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLGZpbGVOYW1lfSksbnVsbCksCi0JLy8gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkpOwotCS8vCi0JLy8gICAgICAgICAgaWYgKHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCS8vCi0JLy8gICAgICAgICAgaWYgKCByZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCh0cnVlKTsKLQkvLyAgICAgICAgfQotCS8vICAgICAgICAvL1dlIGhhdmUgcGVybWlzc2lvbiB0byBvdmVyd3JpdGUgc28gY2hlY2sgaWYgZmlsZSBpcyByZWFkLW9ubHkKLQkvLyAgICAgICAgaWYgKGNoaWxkLmlzUmVhZE9ubHkoKSkKLQkvLyAgICAgICAgewotCS8vICAgICAgICAgIGlmICghcmVzb3VyY2VDb250ZXh0LmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSkgewotCS8vCi0JLy8gICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoIG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0ZJTEVfQ0hFQ0tPVVRfRElTQUJMRUQiLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLGZpbGVOYW1lfSksbnVsbCksCi0JLy8gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkpOwotCS8vCi0JLy8gICAgICAgICAgICBpZiAocmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JLy8KLQkvLyAgICAgICAgICAgIGlmICggcmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29udGV4dC5zZXRDaGVja291dEZpbGVzRW5hYmxlZCh0cnVlKTsKLQkvLyAgICAgICAgICB9Ci0JLy8KLQkvLyAgICAgICAgICBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotCS8vICAgICAgICAgIGZpbGVzWzBdID0gKElGaWxlKWNoaWxkOwotCS8vCi0JLy8gICAgICAgICAgaWYgKAotCS8vICFzdGF0dXNNb25pdG9yLnJlcG9ydFN0YXR1cyhnZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsbnVsbCkpKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQkvLyAgICAgICAgfQotCS8vCi0JLy8gICAgICAgIC8vQ2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgZXhpc3RpbmcgZmlsZS4KLQkvLyAgICAgICAgICAgIElGaWxlIGZpbGUgPSBwYXJlbnQuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOwotCS8vICAgICAgICBmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLHRydWUsdHJ1ZSxwcm9ncmVzc01vbml0b3IpOwotCS8vICAgICAgICByZXR1cm4gZmlsZTsKLQkvLwotCS8vICAgICAgfQotCS8vICAgICAgZWxzZQotCS8vICAgICAgewotCS8vICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlUGx1Z2luLklELDAsV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFIixuZXcKLQkvLyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZpbGVOYW1lKX0pLG51bGwpKTsKLQkvLyAgICAgIH0KLQkvLyAgICB9Ci0JLy8gICAgZWxzZQotCS8vICAgIHsKLQkvLyAgICAgICAgLy9DcmVhdGUgYSBuZXcgZmlsZS4KLQkvLyAgICAgICAgSUZpbGUgZmlsZSA9IHBhcmVudC5nZXRGaWxlKG5ldyBQYXRoKGZpbGVOYW1lKSk7Ci0JLy8gICAgICAgIGZpbGUuY3JlYXRlKGlucHV0U3RyZWFtLHRydWUscHJvZ3Jlc3NNb25pdG9yKTsKLQkvLyAgICAgICAgcmV0dXJuIGZpbGU7Ci0JLy8gICAgfQotCS8vICB9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgZmlsZSB1bmRlciBhIGNvbnRhaW5lci4gVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUgLQotCSAqICAgICAgICAgICAgdGhlIElGaWxlIHRvIGJlIGRlbGV0ZWQKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHN0YXR1c01vbml0b3IKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcwotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuIEZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQkvLyAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUgKAotCS8vICAgICAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCS8vICAgIElGaWxlIGZpbGUsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yICkKLQkvLyAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCS8vICAgIHsKLQkvLyAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCi0JLy8gICAgICAgIHsKLQkvLyAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKSB7Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoIG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQiLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10KLQkvLyB7ZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksZmlsZS5nZXROYW1lKCl9KSxudWxsKSwKLQkvLyBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSk7Ci0JLy8KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCS8vCi0JLy8gICAgICAgICAgICAgICAgaWYgKCByZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKHRydWUpOwotCS8vICAgICAgICAgICAgICAgICAgICAgICAgfQotCS8vICAgICAgICAgICAgICAgIC8vV2UgaGF2ZSBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSBzbyBjaGVjayBpZiBmaWxlIGlzIHJlYWQtb25seQotCS8vICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzUmVhZE9ubHkoKSkKLQkvLyAgICAgICAgICAgICAgICB7Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpIHsKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoIG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRCIsCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXQotCS8vIHtmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmaWxlLmdldE5hbWUoKX0pLG51bGwpLAotCS8vIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpKTsKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JLy8KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldENoZWNrb3V0RmlsZXNFbmFibGVkKHRydWUpOwotCS8vCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbMV07Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1swXSA9IGZpbGU7Ci0JLy8KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKLQkvLyAhc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLG51bGwpKSkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCS8vICAgICAgICAgICAgICAgIH0KLQkvLyAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZSh0cnVlLHByb2dyZXNzTW9uaXRvcik7Ci0JLy8gICAgICAgICAgICAgICAgfQotCS8vICAgICAgICAvL0F0IHRoaXMgcG9pbnQsIGVpdGhlciB0aGUgZmlsZSBkaWQgbm90IGV4aXN0IG9yIHdlIHN1Y2Nlc3NmdWxseSBkZWxldGVkCi0JLy8gaXQuIFJldHVybiBzdWNjZXNzLgotCS8vICAgICAgICByZXR1cm4gdHJ1ZTsKLQkvLyAgfQotCS8qKgotCSAqIERlbGV0ZXMgYSBmb2xkZXIgdW5kZXIgYSBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGZvbGRlciAtCi0JICogICAgICAgICAgICB0aGUgSUZvbGRlciB0byBiZSBkZWxldGVkCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSBzdGF0dXNNb25pdG9yCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcwotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgYWxvbmcgd2l0aCBpdHMgbWVtYmVycy4gRmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCS8vICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRm9sZGVyICgKLQkvLyAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCS8vICAgIElGb2xkZXIgZm9sZGVyLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvcgotCS8vICApCi0JLy8gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JLy8gIHsKLQkvLyAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkgcmV0dXJuIHRydWU7Ci0JLy8KLQkvLyAgICBib29sZWFuIGRlbGV0ZWQgPSB0cnVlOwotCS8vICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0JLy8gICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlcy5sZW5ndGg7IGkrKykKLQkvLyAgICB7Ci0JLy8gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JLy8gICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQkvLyAgICAgIHsKLQkvLyAgICAgICAgZGVsZXRlZCA9IGRlbGV0ZUZpbGUocmVzb3VyY2VDb250ZXh0LCAoSUZpbGUpcmVzb3VyY2UsIHByb2dyZXNzTW9uaXRvciwKLQkvLyBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICAgIH0KLQkvLyAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpCi0JLy8gICAgICB7Ci0JLy8gICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGb2xkZXIoIHJlc291cmNlQ29udGV4dCwgKElGb2xkZXIpcmVzb3VyY2UsCi0JLy8gcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICAgIH0KLQkvLwotCS8vICAgICAgaWYgKCFkZWxldGVkKSBicmVhazsKLQkvLyAgICB9Ci0JLy8gICAgaWYgKGRlbGV0ZWQpIHsKLQkvLyAgICAgIGZvbGRlci5kZWxldGUodHJ1ZSwgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQkvLyAgICAgIHJldHVybiB0cnVlOwotCS8vICAgIH0KLQkvLyAgICBlbHNlCi0JLy8gICAgICByZXR1cm4gZmFsc2U7Ci0JLy8KLQkvLyAgfQotCS8qKgotCSAqIERlbGV0ZXMgYSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgbmFtZWQgaW4gYW4gaW5kZXggZmlsZSBsb2NhdGVkIHJlbGF0aXZlCi0JICogdG8gdGhlIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIGluZGV4ZWQgZmlsZSBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSBzb3VyY2VQYXRoIC0KLQkgKiAgICAgICAgICAgIHJlbGF0aXZlIHBhdGggb2YgdGhlIGluZGV4ZWQgZmlsZSBwYXNzaW5nIGEgbnVsbCBpbiBoYXMgdGhlCi0JICogICAgICAgICAgICBzYW1lIGVmZmVjdCBhcyBwYXNzaW5nIGEgIi4iIGluCi0JICogQHBhcmFtIGluZGV4RmlsZVBhdGggLQotCSAqICAgICAgICAgICAgdGhlIGluZGV4ZWQgZmlsZW5hbWUgTXVzdCBub3QgYmUgbnVsbAotCSAqIEBwYXJhbSB0YXJnZXRQYXRoIC0KLQkgKiAgICAgICAgICAgIHBhdGggY29udGFpbmluZyB0aGUgZmlsZXMgbmFtZWQgaW4gdGhlIGluZGV4ZWQgZmlsZSBNdXN0IG5vdAotCSAqICAgICAgICAgICAgYmUgbnVsbCwgdGhpcyBwYXRoIG11c3QgZW5kIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3IKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JLy8gIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVJbmRleEZpbGVzRnJvbU9TICgKLQkvLyAgICBQbHVnaW4gcGx1Z2luLAotCS8vICAgIElQYXRoIGluZGV4RmlsZVBhdGgsCi0JLy8gICAgSVBhdGggdGFyZ2V0UGF0aAotCS8vICApCi0JLy8gIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBwbHVnaW4ub3BlblN0cmVhbShpbmRleEZpbGVQYXRoKTsKLQkvLyAgICBFbnVtZXJhdGlvbiBmaWxlbmFtZXMgPSBTdHJpbmdVdGlscy5wYXJzZUZpbGVuYW1lc0Zyb21TdHJlYW0oaW5wdXQpOwotCS8vICAgIHdoaWxlIChmaWxlbmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkvLyAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9Ci0JLy8gdGFyZ2V0UGF0aC5hcHBlbmQoKFN0cmluZylmaWxlbmFtZXMubmV4dEVsZW1lbnQoKSkudG9GaWxlKCk7Ci0JLy8gICAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSkKLQkvLyAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLQkvLyAgICB9Ci0JLy8gIH0KLQkvKioKLQkgKiBSZXR1cm5zIGEgVVJJIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gRWNsaXBzZSByZXNvdXJjZSwgb3IgbnVsbCBpZiBubyBzdWNoCi0JICogcmVmZXJlbmNlIGNhbiBiZSBkZXRlcm1pbmVkIChmb3IgZXhhbXBsZSwgaWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0Ci0JICogaW4gdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UuCi0JICogQHJldHVybiBUaGUgVVJJIGFzIGEgc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIFVSSSB0byB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVN0cmluZyB1cmkgPSBudWxsOwotCQlJUGF0aCBsb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQl1cmkgPSAiZmlsZToiICsgbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBVUkkgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBFY2xpcHNlIHJlc291cmNlIHVzaW5nIHRoZQotCSAqICJwbGF0Zm9ybToiIHByb3RvY29sLCBvciBudWxsIGlmIG5vIHN1Y2ggcmVmZXJlbmNlIGNhbiBiZSBkZXRlcm1pbmVkIChmb3IKLQkgKiBleGFtcGxlLCBpZiB0aGUgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UuCi0JICogQHJldHVybiBUaGUgVVJJIGFzIGEgc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIFVSSSB0byB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1SZXNvdXJjZVVSSShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCXVyaSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgYmluZGluZyBuYW1lc3BhY2Ugc3RyaW5nIGdpdmVuIGEgSmF2YSBiZWFuIG5hbWUKLQkgKiAodXNpbmcgdGhlIGNvbnZlbnRpb24gdXNlZCBieSBDVEMgaW4gR00pLiBlLmcuIEphdmEgYmVhbiBNeUNsYXNzIHJlc3VsdAotCSAqIGluIGJpbmRpbmcgbmFtZXNwYWNlIG9mCi0JICogImh0dHA6Ly93d3cubXljbGFzcy5jb20vZGVmaW5pdGlvbnMvTXlDbGFzc1JlbW90ZUludGVyZmFjZSIKLQkgKiAKLQkgKiBAcGFyYW0gYmVhbk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBqYXZhIGJlYW4uCi0JICogQHJldHVybiBUaGUgYmluZGluZyBuYW1lc3BhY2UgYXMgYSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmluZGluZ05hbWVzcGFjZShTdHJpbmcgYmVhbk5hbWUpIHsKLQkJcmV0dXJuICJodHRwOi8vd3d3LiIgKyBiZWFuTmFtZS50b0xvd2VyQ2FzZSgpICsgIi5jb20vZGVmaW5pdGlvbnMvIgotCQkJCSsgYmVhbk5hbWUgKyAiUmVtb3RlSW50ZXJmYWNlIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNjaGVtYSBuYW1lc3BhY2Ugc3RyaW5nIGdpdmVuIGEgSmF2YSBiZWFuIG5hbWUgKHVzaW5nCi0JICogdGhlIGNvbnZlbnRpb24gdXNlZCBieSBDVEMgaW4gR00pLiBlLmcuIEphdmEgYmVhbiBNeUNsYXNzIHJlc3VsdCBpbgotCSAqIHNjaGVtYSBuYW1lc3BhY2Ugb2YKLQkgKiAiaHR0cDovL3d3dy5teWNsYXNzLmNvbS9zY2hlbWFzL015Q2xhc3NSZW1vdGVJbnRlcmZhY2UiCi0JICogCi0JICogQHBhcmFtIGJlYW5OYW1lCi0JICogICAgICAgICAgICBUaGUgamF2YSBiZWFuLgotCSAqIEByZXR1cm4gVGhlIHNjaGVtYXMgbmFtZXNwYWNlIGFzIGEgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNjaGVtYU5hbWVzcGFjZShTdHJpbmcgYmVhbk5hbWUpIHsKLQkJcmV0dXJuICJodHRwOi8vd3d3LiIgKyBiZWFuTmFtZS50b0xvd2VyQ2FzZSgpICsgIi5jb20vc2NoZW1hcy8iCi0JCQkJKyBiZWFuTmFtZSArICJSZW1vdGVJbnRlcmZhY2UiOwotCX0KLQotCS8vICBwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSB7Ci0JLy8gICAgICAgIFZlY3RvciBvcHRpb25zID0gbmV3IFZlY3RvcigpOwotCS8vICAgIG9wdGlvbnMuYWRkKG5ldwotCS8vIFN0YXR1c09wdGlvbihJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19JRCxJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwiIiwiIikpOwotCS8vICAgIG9wdGlvbnMuYWRkKG5ldwotCS8vIFN0YXR1c09wdGlvbihJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQsSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCIiLCIiKSk7Ci0JLy8gICAgb3B0aW9ucy5hZGQobmV3Ci0JLy8gU3RhdHVzT3B0aW9uKElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCIiLCIiKSk7Ci0JLy8gICAgcmV0dXJuIG9wdGlvbnM7Ci0JLy8gIH0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLyoqCi0JICogR2V0cyB0aGUgU09BUCBycGNyb3V0ZXIgc2VydmxldCBVUkwgZm9yIHRoZSBzZXJ2aWNlIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZAotCSAqICAgICAgICAgICAgVGhlIHNlcnZlciBmYWN0b3J5IGlkCi0JICogQHBhcmFtIHNlcnZlcgotCSAqICAgICAgICAgICAgVGhlIHNlcnZlcgotCSAqIEByZXR1cm4gVGhlIFVSTCwgcG9zc2libHkgbnVsbC4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZsZXRVUkwoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBnZXRTZXJ2bGV0VVJMKGdldFdlYlByb2plY3RVUkwocHJvamVjdCwgc2VydmVyRmFjdG9yeUlkLCBzZXJ2ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2bGV0VVJMKFN0cmluZyB3ZWJQcm9qZWN0VVJMKSB7Ci0JCWlmICh3ZWJQcm9qZWN0VVJMID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIHdlYlByb2plY3RVUkwgKyBTRVJWTEVUX0VYVDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjbGllbnQgV2ViIHByb2plY3QgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QgbmFtZSB0byBiYXNlIG9uLgotCSAqIEBwYXJhbSB0eXBlSWQgdGhlIHdlYnNlcnZpY2UgdHlwZSBpZC4KLQkgKiBAcmV0dXJuIFRoZSBjbGllbnQgV2ViIHByb2plY3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGllbnRXZWJQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyB0eXBlSWQpIAotCXsKLQkJU3RyaW5nICAgYmFzZUNsaWVudFdlYlByb2plY3ROYW1lID0gcHJvamVjdE5hbWUgKyBERUZBVUxUX0NMSUVOVF9XRUJfUFJPSkVDVF9FWFQ7Ci0JCUlQYXRoICAgIHByb2plY3RQYXRoOwotCQlJUHJvamVjdCBwcm9qZWN0OwotCQlib29sZWFuICBmb3VuZFdlYlByb2plY3QgICAgID0gZmFsc2U7Ci0JCWludCAgICAgIGkgICAgICAgICAgICAgICAgICAgPSAxOwotCQkKLQkJaWYoIGlzU2tlbGV0b25FSkJUeXBlKCB0eXBlSWQgKSApCi0JCXsKLQkJICAvLyBGb3IgdGhlIHNrZWxldG9uIEVKQiBzY2VuYXJpbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNsaWdodGx5IGRpZmZlcmVudAotCQkgIC8vIGJhc2UgbmFtZS4gIFdoZW4gdGhlIEVKQiBwcm9qZWN0IGlzIGNyZWF0ZWQgYW5vdGhlciBwcm9qZWN0Ci0JCSAgLy8gaXMgY3JlYXRlZCB3aXRoICJDbGllbnQiIHRhY2tlZCBvbnRvIHRoZSBlbmQuICBXZSB3aWxsCi0JCSAgLy8gYWRkICJXUyIgdG8gb3VyIGNsaWVudCBzbyB3ZSBkb24ndCBjb2xsaWRlIHdpdGggdGhlIG90aGVyCi0JCSAgLy8gY2xpZW50IHByb2plY3QuCi0JCSAgYmFzZUNsaWVudFdlYlByb2plY3ROYW1lID0gcHJvamVjdE5hbWUgKyAiV1MiICsgREVGQVVMVF9DTElFTlRfV0VCX1BST0pFQ1RfRVhUOyAgICAKLQkJfQotCQkKLQkJU3RyaW5nICBjbGllbnRXZWJQcm9qZWN0TmFtZSA9IGJhc2VDbGllbnRXZWJQcm9qZWN0TmFtZTsKLQkJCi0JCXdoaWxlICghZm91bmRXZWJQcm9qZWN0KSAKLQkJewotCQkgIHByb2plY3RQYXRoID0gbmV3IFBhdGgoY2xpZW50V2ViUHJvamVjdE5hbWUpLm1ha2VBYnNvbHV0ZSgpOwotCQkgIHByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihwcm9qZWN0UGF0aCk7Ci0JCSAgCi0JCSAgaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgIVJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3QpKSAKLQkJICB7Ci0JCQljbGllbnRXZWJQcm9qZWN0TmFtZSA9IGJhc2VDbGllbnRXZWJQcm9qZWN0TmFtZSArIGk7Ci0JCQlpKys7Ci0JCSAgfQotCQkgIGVsc2UgCi0JCSAgewotCQkJZm91bmRXZWJQcm9qZWN0ID0gdHJ1ZTsKLQkJICB9Ci0JCX0KLQkJCi0JCXJldHVybiBjbGllbnRXZWJQcm9qZWN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2VsZXRvbkVKQlR5cGUoIFN0cmluZyB0eXBlSUQgKQotCXsKLQkgIHJldHVybiB0eXBlSUQuZXF1YWxzKCAib3JnLmVjbGlwc2UuanN0LndzLnR5cGUud3NkbC5lamIiICk7ICAgIAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RUpCUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0VKQl9QUk9KRUNUX05BTUU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFdlYlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUJfUFJPSkVDVF9OQU1FOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJvdXRlclByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlyZXR1cm4gcHJvamVjdE5hbWUgKyBERUZBVUxUX1JPVVRFUl9QUk9KRUNUX0VYVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2VydmljZUVBUlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9TRVJWSUNFX0VBUl9QUk9KRUNUX05BTUU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdENsaWVudEVBUlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9DTElFTlRfRUFSX1BST0pFQ1RfTkFNRTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU2VsZWN0aW9uVG9SZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU2VsZWN0aW9uVG9SZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU5ZjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1NlbGVjdGlvblRvUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uVG9SZXNvdXJjZSBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyI3RyYW5zZm9ybShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZhbHVlOwotICAgIElSZXNvdXJjZSAgICAgICAgICAgIHJlc291cmNlICA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHNlbGVjdGlvbiAhPSBudWxsICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgCi0gICAgICBpZiggb2JqZWN0ICE9IG51bGwgKQotICAgICAgewotICAgICAgICBpZiggb2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb3VyY2UgPSAoSVJlc291cmNlKW9iamVjdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBvYmplY3QgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0ICkKLSAgICAgICAgewotICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcFVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdClvYmplY3Q7Ci0gICAgICAgICAgCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzb3VyY2UgPSBjb21wVW5pdC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goIEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBvYmplY3QgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbiApIAotICAgICAgICB7Ci0gICAgICAgICAgRW50ZXJwcmlzZUJlYW4gZWpiQmVhbiAgICA9IChFbnRlcnByaXNlQmVhbilvYmplY3Q7Ci0gICAgICAgICAgSVByb2plY3QgICAgICAgZWpiUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCggZWpiQmVhbiApOwotICAgICAgICAgIAotICAgICAgICAgIGlmKCBlamJQcm9qZWN0ICE9IG51bGwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc291cmNlID0gZWpiUHJvamVjdDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzb3VyY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1NlcnZlclV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TZXJ2ZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ3NmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1NlcnZlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LklTZXJ2ZXJUYXJnZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LlNlcnZlclRhcmdldEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklQcm9qZWN0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklSdW5uaW5nQWN0aW9uU2VydmVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgdXNlZnVsIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBTZXJ2ZXIgcGx1Z2luIGZ1bmN0aW9ucwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VydmVyVXRpbHMgewotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsJCQotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2ZXJJZFRvTGFiZWxfOwotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2ZXJMYWJlbFRvSWRfOwotICBwcml2YXRlIHN0YXRpYyBTZXJ2ZXJVdGlscyBpbnN0YW5jZV87Ci0KLSAgcHVibGljIHN0YXRpYyBTZXJ2ZXJVdGlscyBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBTZXJ2ZXJVdGlscygpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotCi0gIH0KLQotICBwdWJsaWMgU2VydmVyVXRpbHMoKXsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsgIAkKLSAgfSAgCi0gIAotICAvLyBHZXRzIHRoZSBTZXJ2ZXIgbGFiZWxzIGdpdmVuIHRoZSBzZXJ2ZXIgZmFjdG9yeSBpZAotICBwdWJsaWMgdm9pZCBnZXRTZXJ2ZXJMYWJlbHNBbmRJZHMoKSB7Ci0gICAgc2VydmVySWRUb0xhYmVsXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBzZXJ2ZXJMYWJlbFRvSWRfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIElTZXJ2ZXJUeXBlW10gc2VydmVyVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgc2VydmVyVHlwZXMubGVuZ3RoOyBpZHgrKykgewotCi0gICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBzZXJ2ZXJUeXBlc1tpZHhdOwotCi0gICAgICBTdHJpbmcgaWQgPSBzZXJ2ZXJUeXBlLmdldElkKCk7Ci0gICAgICBTdHJpbmcgc2VydmVyTGFiZWwgPSBzZXJ2ZXJUeXBlLmdldE5hbWUoKTsKLSAgICAgIGlmICghKGlkID09IG51bGwpICYmICEoc2VydmVyTGFiZWwgPT0gbnVsbCkpIHsKLSAgICAgICAgc2VydmVySWRUb0xhYmVsXy5wdXQoaWQsIHNlcnZlckxhYmVsKTsKLSAgICAgICAgc2VydmVyTGFiZWxUb0lkXy5wdXQoc2VydmVyTGFiZWwsIGlkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckxhYmVsRm9ySWQoU3RyaW5nIGZhY3RvcnlJZCkgewotICAgIGlmIChzZXJ2ZXJJZFRvTGFiZWxfID09IG51bGwpCi0gICAgICB0aGlzLmdldFNlcnZlckxhYmVsc0FuZElkcygpOwotICAgIHJldHVybiAoU3RyaW5nKSBzZXJ2ZXJJZFRvTGFiZWxfLmdldChmYWN0b3J5SWQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJZEZvckxhYmVsKFN0cmluZyBmYWN0b3J5TGFiZWwpIHsKLSAgICBpZiAoc2VydmVyTGFiZWxUb0lkXyA9PSBudWxsKQotICAgICAgdGhpcy5nZXRTZXJ2ZXJMYWJlbHNBbmRJZHMoKTsKLSAgICByZXR1cm4gKFN0cmluZykgc2VydmVyTGFiZWxUb0lkXy5nZXQoZmFjdG9yeUxhYmVsKTsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBtb2RpZnlNb2R1bGVzKEVudmlyb25tZW50IGVudiwgSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlLCBib29sZWFuIGFkZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLSAgCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgdHJ5IHsKLQotICAgICAgaWYgKG1vZHVsZT09bnVsbCB8fCAhbW9kdWxlLmdldFByb2plY3QoKS5leGlzdHMoKSkgewotICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgfQotCi0KLSAgICAgIC8vIGNoZWNrIGlmIG1vZHVsZSBpcyBhIHRydWUgSmF2YSBwcm9qZWN0Ci0gIAkgIGlmIChtb2R1bGUgaW5zdGFuY2VvZiBJTW9kdWxlKXsKLSAgCSAgCUlNb2R1bGUgcG0gPSAoSU1vZHVsZSltb2R1bGU7Ci0gIAkgIAlpZiAocG0hPW51bGwpewotICAJICAJCUlQcm9qZWN0IHByb2plY3QgPSBwbS5nZXRQcm9qZWN0KCk7Ci0gIAkgIAkJaWYgKHByb2plY3Q9PW51bGwgfHwgUmVzb3VyY2VVdGlscy5pc1RydWVKYXZhUHJvamVjdChwcm9qZWN0KSkgewotICAJCQkJcmV0dXJuIHN0YXR1czsKLSAgCSAgCQl9Ci0gIAkgIAl9Ci0gIAkgIH0KLSAgICAgICAKLSAgICAgIHdjID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7ICAgICAKLSAgICAgIGlmICh3YyE9bnVsbCl7Ci0gICAgICAJT2JqZWN0IHggPSBzZXJ2ZXIuZ2V0QWRhcHRlcihJUnVubmluZ0FjdGlvblNlcnZlci5jbGFzcyk7Ci0gICAgICAgIGlmICh4IT1udWxsICYmIHggaW5zdGFuY2VvZiBJUnVubmluZ0FjdGlvblNlcnZlcikgewotICAgICAgICAgaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0gICAgICAgICBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotICAgICAgICAgICBTdHJpbmcgbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotICAgICAgICAgICBzZXJ2ZXIuc3luY2hyb25vdXNTdGFydChtb2RlLCBtb25pdG9yKTsKLSAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAKLSAgICAgIExpc3QgbGlzdCA9IEFycmF5cy5hc0xpc3Qoc2VydmVyLmdldE1vZHVsZXMoKSk7Ci0gICAgICBpZiAoYWRkKSB7Ci0gICAgICAgIGlmICghbGlzdC5jb250YWlucyhtb2R1bGUpKSB7Ci0gICAgICAgICAgU2VydmVyVXRpbC5tb2RpZnlNb2R1bGVzKHdjLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlfSwgbmV3IElNb2R1bGVbMF0sIG1vbml0b3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsgLy8gcmVtb3ZlcyBtb2R1bGUKLSAgICAgICAgaWYgKGxpc3QuY29udGFpbnMobW9kdWxlKSkgewotICAgICAgICAgIFNlcnZlclV0aWwubW9kaWZ5TW9kdWxlcyh3YywgbmV3IElNb2R1bGVbMF0sIG5ldyBJTW9kdWxlW10geyBtb2R1bGV9LCBtb25pdG9yKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAJLy8gaGFuZGxlIGNhc2Ugb2YgTnVsbCBXQzsgbm9uLWlzc3VlIGZvciBub3cKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SLCBjZSk7Ci0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgZmluYWxseSB7Ci0gICAgICAgIGlmICh3YyAhPSBudWxsKSB7Ci0gICAgICAgICAgLy8gQWx3YXlzIHNhdmVBbGwgYW5kIHJlbGVhc2UgdGhlIHNlcnZlcldvcmtpbmdDb3B5Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAJd2Muc2F2ZUFsbCh0cnVlLCBtb25pdG9yKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZXgpewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SLCBjZXgpOwotICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9ICAKLQotICBwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZ2V0U2VydmVyRm9yTW9kdWxlKElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgc2VydmVyVHlwZUlkLCBJU2VydmVyIHNlcnZlciwgYm9vbGVhbiBjcmVhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiBzZXJ2ZXI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGdldFNlcnZlckZvck1vZHVsZShtb2R1bGUsIHNlcnZlclR5cGVJZCwgY3JlYXRlLCBtb25pdG9yKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXRTZXJ2ZXJGb3JNb2R1bGUoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBzZXJ2ZXJUeXBlSWQsIGJvb2xlYW4gY3JlYXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICB0cnkgewotCi0gICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKG1vZHVsZSwgbW9uaXRvcik7Ci0KLSAgICAgIGlmIChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgIGlmIChzZXJ2ZXJUeXBlSWQgPT0gbnVsbCB8fCBzZXJ2ZXJUeXBlSWQubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICByZXR1cm4gc2VydmVyc1swXTsgLy8gV1NBRCB2NCBiZWhhdmlvcgotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIGlmIChzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmVyVHlwZUlkKSkKLSAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJzW2ldOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBjcmVhdGVTZXJ2ZXIobW9kdWxlLCBzZXJ2ZXJUeXBlSWQsIG1vbml0b3IpOwotCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGdldFNlcnZlckZvck1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotICAgIHRyeSB7Ci0gICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKG1vZHVsZSwgbnVsbCk7Ci0gICAgICByZXR1cm4gKChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGggPiAwKSA/IHNlcnZlcnNbMF0gOiBudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSVNlcnZlciBjcmVhdGVTZXJ2ZXIoRW52aXJvbm1lbnQgZW52LCBJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLSAgCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXJXQyA9IG51bGw7Ci0gIAlJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0gIAl0cnkgewotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLSAgICAgIHNlcnZlcldDID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZUlkLCBudWxsLCBtb25pdG9yKTsKLSAgICAgIHRyeXsKLSAgICAgICAgaWYgKHNlcnZlcldDIT1udWxsKXsKLSAgICAgICAgICBzZXJ2ZXIgPSBzZXJ2ZXJXQy5zYXZlQWxsKHRydWUsIG1vbml0b3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaChDb3JlRXhjZXB0aW9uIGNlKXsKLSAgICAgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IsIGNlKTsKLSAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKLSAgICAgICAgCi0gICAgICAJT2JqZWN0IHggPSBzZXJ2ZXIuZ2V0QWRhcHRlcihJUnVubmluZ0FjdGlvblNlcnZlci5jbGFzcyk7Ci0gICAgICAgIGlmICh4IT1udWxsICYmIHggaW5zdGFuY2VvZiBJUnVubmluZ0FjdGlvblNlcnZlcikgewotICAgICAgICAgaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0gICAgICAgICBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotICAgICAgICAgICBTdHJpbmcgbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotICAgICAgICAgICBzZXJ2ZXIuc3luY2hyb25vdXNTdGFydChtb2RlLCBtb25pdG9yKTsKLSAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICAKLSAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsICYmIG1vZHVsZS5nZXRQcm9qZWN0KCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICBJTW9kdWxlW10gcGFyZW50TW9kdWxlcyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotICAgICAgICAgIGlmIChwYXJlbnRNb2R1bGVzIT1udWxsICYmIHBhcmVudE1vZHVsZXMubGVuZ3RoIT0wKSB7Ci0gICAgICAgICAgCW1vZHVsZSA9IChJTW9kdWxlKXBhcmVudE1vZHVsZXNbMF07Ci0gICAgICAgICAgfQotICAgICAgICAgIHNlcnZlcldDLm1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZX0sIG5ldyBJTW9kdWxlWzBdLCBtb25pdG9yKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICBmaW5hbGx5ewotICAgIAl0cnl7Ci0gICAgCQlpZiAoc2VydmVyV0MhPW51bGwpewotICAgIAkJCXNlcnZlcldDLnNhdmVBbGwodHJ1ZSwgbW9uaXRvcik7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSl7Ci0gICAgICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SLCBjZSk7Ci0gICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7ICAgIAkJCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIH0KLSAgfSAgCi0gIAotICAvKgotICAgKiBjcmVhdGVTZXJ2ZXIgVGhpcyBjcmVhdGVzIGEgc2VydmVyIGJ1dCBkb2VzIG5vdCByZXBvcnQgZXJyb3JzLiAKLSAgICogQHBhcmFtIG1vZHVsZSAKLSAgICogQHBhcmFtIHNlcnZlclR5cGVJZAotICAgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yCi0gICAqIEByZXR1cm4gSVNlcnZlciByZXR1cm5zIG51bGwgaWYgdW5zdWNjZXNzZnVsCi0gICAqIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGNyZWF0ZVNlcnZlcihJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gIAlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyV0MgPSBudWxsOwotICAJSVNlcnZlciBzZXJ2ZXI9IG51bGw7Ci0gIAl0cnkgewotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLSAgICAgIHNlcnZlcldDID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZUlkLCBudWxsLCBtb25pdG9yKTsKLSAgICAgIAotICAgICAgdHJ5ewotICAgICAgICBpZiAoc2VydmVyV0MhPW51bGwpewotICAgICAgICAgIHNlcnZlciA9IHNlcnZlcldDLnNhdmVBbGwodHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKENvcmVFeGNlcHRpb24gY2UpewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0gICAgICAgIAotICAgICAgCU9iamVjdCB4ID0gc2VydmVyLmdldEFkYXB0ZXIoSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIuY2xhc3MpOwotICAgICAgICBpZiAoeCE9bnVsbCAmJiB4IGluc3RhbmNlb2YgSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIpIHsKLSAgICAgICAgIGludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotICAgICAgICAgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pIHsKLSAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKLSAgICAgICAgICAgc2VydmVyLnN5bmNocm9ub3VzU3RhcnQobW9kZSwgbW9uaXRvcik7Ci0gICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgICBpZiAobW9kdWxlICE9IG51bGwpIHsKLSAgICAgICAgICBJTW9kdWxlW10gcGFyZW50TW9kdWxlcyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotICAgICAgICAgIGlmIChwYXJlbnRNb2R1bGVzIT1udWxsICYmIHBhcmVudE1vZHVsZXMubGVuZ3RoIT0wKSB7Ci0gICAgICAgICAgCW1vZHVsZSA9IChJTW9kdWxlKXBhcmVudE1vZHVsZXNbMF07Ci0gICAgICAgICAgfQotICAgICAgICAgIHNlcnZlcldDLm1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZX0sIG5ldyBJTW9kdWxlWzBdLCBtb25pdG9yKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZmluYWxseXsKLSAgICAJdHJ5ewotICAgIAkJaWYgKHNlcnZlcldDIT1udWxsKXsKLSAgICAJCQlzZXJ2ZXJXQy5zYXZlQWxsKHRydWUsIG1vbml0b3IpOwotICAgIAkJfQotICAgIAl9Ci0gICAgCWNhdGNoKENvcmVFeGNlcHRpb24gY2UpewotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCQkvL2hhbmRsZXIgY29yZSBleGNlcHRpb24KLSAgICAJfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyVHlwZUlkc0J5TW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICBWZWN0b3Igc2VydmVySWRzID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgc2VydmVySWRzLmFkZChzZXJ2ZXJzW2ldLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10pIHNlcnZlcklkcy50b0FycmF5KG5ldyBTdHJpbmdbc2VydmVySWRzLnNpemUoKV0pOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGdldERlZmF1bHRFeGlzdGluZ1NlcnZlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJOYW1lOwotCi0gICAgLy9JU2VydmVyUHJlZmVyZW5jZXMgc2VydmVyUHJlZmVyZW5jZXMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclByZWZlcmVuY2VzKCk7Ci0gICAgSVByb2plY3RQcm9wZXJ0aWVzIHByb3BzID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KTsKLSAgICBJU2VydmVyIHByZWZlcnJlZFNlcnZlciA9IHByb3BzLmdldERlZmF1bHRTZXJ2ZXIoKTsKLSAgICAvL0lTZXJ2ZXIgcHJlZmVycmVkU2VydmVyID0gc2VydmVyUHJlZmVyZW5jZXMuZ2V0RGVwbG95YWJsZVNlcnZlclByZWZlcmVuY2UoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCkpOwotICAgIGlmIChwcmVmZXJyZWRTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiBwcmVmZXJyZWRTZXJ2ZXI7Ci0KLSAgICBJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgaWYgKGNvbmZpZ3VyZWRTZXJ2ZXJzICE9IG51bGwgJiYgY29uZmlndXJlZFNlcnZlcnMubGVuZ3RoID4gMCkgeyByZXR1cm4gY29uZmlndXJlZFNlcnZlcnNbMF07IH0KLQotICAgIElTZXJ2ZXJbXSBub25Db25maWd1cmVkU2VydmVycyA9IFNlcnZlclV0aWwuZ2V0QXZhaWxhYmxlU2VydmVyc0Zvck1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgZmFsc2UsIG51bGwpOwotICAgIGlmIChub25Db25maWd1cmVkU2VydmVycyAhPSBudWxsICYmIG5vbkNvbmZpZ3VyZWRTZXJ2ZXJzLmxlbmd0aCA+IDApIHsgcmV0dXJuIG5vbkNvbmZpZ3VyZWRTZXJ2ZXJzWzBdOyB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIAotICAvKgotICAgKiBAcGFyYW0gbW9kdWxlVHlwZSAtIGFkIGRlZmluZWQgaW4gSVNlcnZlclRhcmdldENvbnN0YW50cyAoaS5lLiBFQVJfVFlQRSwgV0VCX1RZUEUsIGV0Yy4pCi0gICAqIEBwYXJhbSBqMmVlVmVyc2lvbiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludCB2YWx1ZXMgaW4gSjJFRVZlcnNpb25Db25zdGFudHMKLSAgICogaS5lLiAiMTIiIG9yICIxMyIgb3IgIjE0IgotICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgaWQgb2YgdGhlIHNlcnZlciB0YXJnZXQgLSB0byBiZSB1c2VkIGluIHByb2plY3QgY3JlYXRpb24gb3BlcmF0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlclRhcmdldElkRnJvbUZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBTdHJpbmcgbW9kdWxlVHlwZSwgU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLSAgICBpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgU3RyaW5nIHNlcnZlclJ1bnRpbWVUeXBlSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAKLSAgICBTdHJpbmcgc3RKMkVFVmVyc2lvbiA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgICBMaXN0IHJ1bnRpbWVzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFNlcnZlclRhcmdldHMobW9kdWxlVHlwZSwgc3RKMkVFVmVyc2lvbik7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHJ1bnRpbWVzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpcnVudGltZXMuZ2V0KGkpOwotICAgICAgU3RyaW5nIHRoaXNSdW50aW1lVHlwZUlkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICBpZiAodGhpc1J1bnRpbWVUeXBlSWQuZXF1YWxzKHNlcnZlclJ1bnRpbWVUeXBlSWQpKQotICAgICAgewotICAgICAgICByZXR1cm4gcnVudGltZS5nZXRJZCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIC8qCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgdGhlIHNlcnZlcidzIGZhY3RvcnkgaWQKLSAgICogQHJldHVybnMgdGhlIHJ1bnRpbWUgdHlwZSBpZCBnaXZlbiB0aGUgc2VydmVyJ3MgZmFjdG9yeSBpZC4gUmV0dXJucyBhIGJsYW5rIFN0cmluZyBpZiB0aGUgbm8gU2VydmVyVHlwZSBleGlzdHMgZm9yIHRoZSBnaXZlbiBmYWN0b3J5IGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLSAgICBpZiAoc2VydmVyVHlwZSE9bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICByZXR1cm4gc2VydmVyUnVudGltZUlkOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgdGhlIHNlcnZlcidzIGZhY3RvcnkgaWQKLSAgICogQHJldHVybnMgdGhlIHNlcnZlciB0eXBlIGlkIGdpdmVuIHRoZSBzZXJ2ZXIncyBmYWN0b3J5IGlkLiBSZXR1cm5zIGEgYmxhbmsgU3RyaW5nIGlmIHRoZSBubyBTZXJ2ZXJUeXBlIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGZhY3RvcnkgaWQuCi0gICAqLyAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlclR5cGVJZEZyb21GYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLSAgCWlmIChzZXJ2ZXJUeXBlIT1udWxsKQotICAJewotICAJICBTdHJpbmcgc2VydmVyVHlwZUlkID0gc2VydmVyVHlwZS5nZXRJZCgpOwotICAJICByZXR1cm4gc2VydmVyVHlwZUlkOwotICAJfQotICAJZWxzZQotICAJICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKgotICAgKiBAcGFyYW0gajJlZVZlcnNpb24gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnQgdmFsdWVzIGluIEoyRUVWZXJzaW9uQ29uc3RhbnRzCi0gICAqIGkuZS4gIjEyIiBvciAiMTMiIG9yICIxNCIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RhcmdldFZhbGlkRm9yRUFSKFN0cmluZyBydW50aW1lVGFyZ2V0SWQsIFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAJaWYgKHJ1bnRpbWVUYXJnZXRJZCA9PSBudWxsKQotICAJCXJldHVybiBmYWxzZTsKLSAgCQotICAJU3RyaW5nIGVhck1vZHVsZVR5cGUgPSBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkVBUl9UWVBFOwotCVN0cmluZyBzdEoyRUVWZXJzaW9uID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVGFyZ2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotICAJTGlzdCBydW50aW1lcyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRTZXJ2ZXJUYXJnZXRzKGVhck1vZHVsZVR5cGUsIHN0SjJFRVZlcnNpb24pOwotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lcy5zaXplKCk7IGkrKyApCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSlydW50aW1lcy5nZXQoaSk7Ci0gICAgICBTdHJpbmcgdGhpc0lkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICBpZiAodGhpc0lkLmVxdWFscyhydW50aW1lVGFyZ2V0SWQpKQotICAgICAgCXJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyoKLSAgICogQHBhcmFtIGoyZWVWZXJzaW9uIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW50IHZhbHVlcyBpbiBKMkVFVmVyc2lvbkNvbnN0YW50cwotICAgKiBpLmUuICIxMiIgb3IgIjEzIiBvciAiMTQiCi0gICAqIEBwYXJhbSB0aGUgcHJvamVjdCB0eXBlIGZyb20gSVNlcnZlclRhcmdldENvbnN0YW50cwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGFyZ2V0VmFsaWRGb3JQcm9qZWN0VHlwZShTdHJpbmcgcnVudGltZVRhcmdldElkLCBTdHJpbmcgajJlZVZlcnNpb24sIFN0cmluZyBwcm9qZWN0VHlwZSkKLSAgewotICAJaWYgKHJ1bnRpbWVUYXJnZXRJZCA9PSBudWxsKQotICAJCXJldHVybiBmYWxzZTsKLSAgCQotICAJaWYgKHByb2plY3RUeXBlPT1udWxsIHx8IHByb2plY3RUeXBlLmxlbmd0aCgpPT0wKQotICAJICByZXR1cm4gZmFsc2U7Ci0gIAkKLSAgCVN0cmluZyBzdEoyRUVWZXJzaW9uID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVGFyZ2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotICAJTGlzdCBydW50aW1lcyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRTZXJ2ZXJUYXJnZXRzKHByb2plY3RUeXBlLCBzdEoyRUVWZXJzaW9uKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZXMuc2l6ZSgpOyBpKysgKQotICAgIHsKLSAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpcnVudGltZXMuZ2V0KGkpOwotICAgICAgU3RyaW5nIHRoaXNJZCA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgaWYgKHRoaXNJZC5lcXVhbHMocnVudGltZVRhcmdldElkKSkKLSAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJUYXJnZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgICBTdHJpbmcgc3RKMkVFVmVyc2lvbiA9IG51bGw7Ci0gICAgaWYgKGoyZWVWZXJzaW9uPT1udWxsIHx8IGoyZWVWZXJzaW9uLmxlbmd0aCgpPT0wKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgaW50IGoyZWVWZXJzaW9uSW50ID0gSW50ZWdlci5wYXJzZUludChqMmVlVmVyc2lvbik7Ci0gICAgc3dpdGNoIChqMmVlVmVyc2lvbkludCkKLSAgICB7Ci0gICAgICBjYXNlIChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk6Ci0gICAgICAgIHJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTI7Ci0gICAgICBjYXNlIChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk6Ci0gICAgICAgIHJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTM7Ci0gICAgICBjYXNlIChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk6Ci0gICAgICAgIHJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTQ7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0YXR1c09iamVjdEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0YXR1c09iamVjdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmMGZlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdGF0dXNPYmplY3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFN0YXR1c09iamVjdEhhbmRsZXIKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfREVUQUlMUyA9IDE2OwotCi0gIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBnZW5lcmF0ZVRyZWVTdGF0dXMgKElTdGF0dXMgc3RhdHVzKSAKLSAgCXsKLSAgICAvLwotICAgIC8vIFRoZXJlIGNvdWxkIGJlIGxvdHMgb2YgVGhyb3dhYmxlcywgQ29yZUV4Y2VwdGlvbnMsCi0gICAgLy8gV3JhcHBlZEV4Y2VwdGlvbnMgYW5kIElTdGF0dXMgb2JqZWN0cyBiZW5lYXRoIHRoZQotICAgIC8vIGdpdmVuIHN0YXR1cy4gRmluZCB0aGVtLgotICAgIC8vCi0gICAgTGlua2VkTGlzdCBzdGF0dXNMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICBhcHBlbmRTdGF0dXMoTUFYX0RFVEFJTFMsIHN0YXR1c0xpc3QsIHN0YXR1cywgc3RhdHVzLmdldFNldmVyaXR5KCkpOwotICAgIGlmIChzdGF0dXNMaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgSVN0YXR1cyBuZXdTdGF0dXMgPSAoSVN0YXR1cylzdGF0dXNMaXN0LnJlbW92ZUZpcnN0KCk7Ci0gICAgICBpZiAoc3RhdHVzTGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBJU3RhdHVzW10gc2Vjb25kYXJ5U3RhdHVzQXJyYXkgPSBuZXcgSVN0YXR1c1tzdGF0dXNMaXN0LnNpemUoKV07Ci0gICAgICAgIGludCBuID0gMDsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHN0YXR1c0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgc2Vjb25kYXJ5U3RhdHVzQXJyYXlbbisrXSA9IChJU3RhdHVzKWkubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIG5ld1N0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhzdGF0dXMuZ2V0UGx1Z2luKCksc3RhdHVzLmdldENvZGUoKSxzZWNvbmRhcnlTdGF0dXNBcnJheSxzdGF0dXMuZ2V0TWVzc2FnZSgpLHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3U3RhdHVzOwotICAgIH0KLSAgICBlbHNlIAotICAgIAlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8vCi0gIC8vIEFwcGVuZHMgemVybyBvciBtb3JlIElTdGF0dXMgb2JqZWN0cyB0byB0aGUgbGlzdCBvZiBJU3RhdHVzIG9iamVjdHMKLSAgLy8gYmFzZWQgdXBvbiBhbiBJU3RhdHVzLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBpbnQgYXBwZW5kU3RhdHVzICggaW50IG1heCwgTGlzdCBzdGF0dXNMaXN0LCBJU3RhdHVzIHN0YXR1cywgaW50IHNldmVyaXR5ICkKLSAgewotICAgIGlmIChtYXggPiAwICYmIHN0YXR1cyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgYW4gSVN0YXR1cyBvYmplY3QgZm9yIHRoZSBnaXZlbiBzdGF0dXMnIG1lc3NhZ2UuCi0gICAgICAvLwotICAgICAgaWYgKHN0YXR1cy5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWF4ID0gYXBwZW5kKHN0YXR1c0xpc3QsbWF4LHNldmVyaXR5LHN0YXR1cy5nZXRQbHVnaW4oKSxzdGF0dXMuZ2V0Q29kZSgpLHN0YXR1cy5nZXRNZXNzYWdlKCksc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgdGhlIElTdGF0dXMnIFRocm93YWJsZSwgaWYgYW55LgotICAgICAgLy8KLSAgICAgIG1heCA9IGFwcGVuZFRocm93YWJsZShtYXgsc3RhdHVzTGlzdCxzdGF0dXMuZ2V0RXhjZXB0aW9uKCksc2V2ZXJpdHkpOwotICAgICAgLy8KLSAgICAgIC8vIElmIHRoZSBJU3RhdHVzIGlzIGEgbXVsdGkgc3RhdHVzLCBhcHBlbmQgdGhlIGNoaWxkcmVuLgotICAgICAgLy8KLSAgICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aCAmJiBtYXg+MDsgaSsrKQotICAgICAgewotICAgICAgICBtYXggPSBhcHBlbmRTdGF0dXMobWF4LHN0YXR1c0xpc3QsY2hpbGRyZW5baV0sc2V2ZXJpdHkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF4OwotICB9Ci0KLSAgLy8KLSAgLy8gQXBwZW5kcyB6ZXJvIG9yIG1vcmUgSVN0YXR1cyBvYmplY3RzIHRvIHRoZSBsaXN0IG9mIElTdGF0dXMgb2JqZWN0cwotICAvLyBiYXNlZCB1cG9uIGEgVGhyb3dhYmxlLiBXcmFwcGVkRXhjZXB0aW9ucyBhbmQgQ29yZUV4Y2VwdGlvbnMgYXJlCi0gIC8vIGdpdmVuIHNwZWNpYWwgdHJlYXRtZW50LgotICAvLwotICBwcml2YXRlIHN0YXRpYyBpbnQgYXBwZW5kVGhyb3dhYmxlICggaW50IG1heCwgTGlzdCBzdGF0dXNMaXN0LCBUaHJvd2FibGUgdGhyb3dhYmxlLCBpbnQgc2V2ZXJpdHkgKQotICB7Ci0gICAgaWYgKG1heCA+IDAgJiYgdGhyb3dhYmxlICE9IG51bGwpCi0gICAgewotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCBhbiBJU3RhdHVzIG9iamVjdCBmb3IgdGhlIGV4Y2VwdGlvbidzIG1lc3NhZ2UuCi0gICAgICAvLwotICAgICAgaWYgKHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWF4ID0gYXBwZW5kKHN0YXR1c0xpc3QsbWF4LHNldmVyaXR5LFdlYlNlcnZpY2VQbHVnaW4uSUQsMCx0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLHRocm93YWJsZSk7Ci0gICAgICB9Ci0gICAgICAvLwotICAgICAgLy8gSWYgdGhlIGV4Y2VwdGlvbiBpcyBhIFdyYXBwZWRFeGNlcHRpb24sIGFwcGVuZCB0aGUgd3JhcHBlZCBFeGNlcHRpb24uCi0gICAgICAvLwotICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIFdyYXBwZWRFeGNlcHRpb24gd2V4YyA9IChXcmFwcGVkRXhjZXB0aW9uKXRocm93YWJsZTsKLSAgICAgICAgbWF4ID0gYXBwZW5kVGhyb3dhYmxlKG1heCxzdGF0dXNMaXN0LHdleGMuZXhjZXB0aW9uKCksc2V2ZXJpdHkpOwotICAgICAgfQotICAgICAgLy8KLSAgICAgIC8vIElmIHRoZSBleGNlcHRpb24gaXMgYSBDb3JlRXhjZXB0aW9uLCBhcHBlbmQgdGhlIGVuY2xvc2VkIElTdGF0dXMuCi0gICAgICAvLwotICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIENvcmVFeGNlcHRpb24gY2V4YyA9IChDb3JlRXhjZXB0aW9uKXRocm93YWJsZTsKLSAgICAgICAgbWF4ID0gYXBwZW5kU3RhdHVzKG1heCxzdGF0dXNMaXN0LGNleGMuZ2V0U3RhdHVzKCksc2V2ZXJpdHkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF4OwotICB9Ci0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhbmQgYXBwZW5kcyBhbiBJU3RhdHVzIHRvIHRoZSBsaXN0IG9mIElTdGF0dXMgb2JqZWN0cy4KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGFwcGVuZCAoIExpc3Qgc3RhdHVzTGlzdCwgaW50IG1heCwgaW50IHNldmVyaXR5LCBTdHJpbmcgaWQsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gIHsKLSAgICBpZiAobWF4ID4gMCkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksaWQsY29kZSxtZXNzYWdlLHRocm93YWJsZSk7Ci0gICAgICBzdGF0dXNMaXN0LmFkZChzdGF0dXMpOwotICAgICAgbWF4LS07Ci0gICAgfQotICAgIHJldHVybiBtYXg7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MzNlMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotLyoqCi0gKiBUcmFuc2Zyb21zIGEgamF2YS5sYW5nLlN0cmluZyB0byBhbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2plY3QKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyI3RyYW5zZm9ybShqYXZhLmxhbmcuT2JqZWN0KQotICAgKiBAcGFyYW0gT2JqZWN0IFRoaXMgbXVzdCBiZSBhIGphdmEubGFuZy5TdHJpbmcKLSAgICogQHJldHVybiBPYmplY3QgUmV0dXJucyBhbiBJUHJvamVjdAotICAgKi8KLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0gICAgU3RyaW5nIHZhbHVlU3RyaW5nID0gKFN0cmluZyl2YWx1ZTsKLSAgICBpZiAodmFsdWVTdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgICAgcHJvamVjdCA9IEZpbGVSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KChTdHJpbmcpdmFsdWUpOwotICAgIAotICAgIHJldHVybiBwcm9qZWN0OyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWZkOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLQotLyoqCi0gICogVGhpcyBjbGFzcyBjb250YWlucyBzb21lIHVzZWZ1bCBzdHJpbmcgdXRpbGl0aWVzIHRoYXQgYXJlIG5vdCBwcm92aWRlZCBieQotICAqIGVpdGhlciBTdHJpbmcgb3IgU3RyaW5nQnVmZmVyLgotICAqCi0gICogQGF1dGhvciBQZXRlciBNb29nawotICAqIEBkYXRlICAgSnVseSAxMywgMjAwMAotKiovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nVXRpbHMKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgbGluZSBzZXBhcmF0b3IuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0xJTkUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLSAgcHJpdmF0ZSBTdHJpbmdVdGlscygpe307Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCBzcGxpdHMgYSBzaW5nbGUgbGluZSBvZiB0ZXh0IGludG8gbXVsdGlwbGUgbGluZXMKLSAgICAqIGJhc2VkIG9uIGEgbWF4aW11bSBsaW5lIGxlbmd0aC4gIFRoZSBtZXRob2Qgd2lsbCB0cnkgdG8gZml0IGFzCi0gICAgKiBtYW55IHdvcmRzIGFzIHBvc3NpYmxlIG9udG8gYSBsaW5lIHdpdGhvdXQgZXhjZWVkaW5nIHRoZSBtYXhpbXVtCi0gICAgKiBsaW5lIGxlbmd0aC4gIE5vdGU6IHRoZSBvbmx5IGNhc2Ugd2hlcmUgYSBsaW5lIG1pZ2h0IGV4Y2VlZCB0aGUKLSAgICAqIG1heGltdW0gaXMgaWYgYSBzaW5nbGUgd29yZCBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bS4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3BsaXR0ZXIoIFN0cmluZyB0ZXh0LCBpbnQgbWF4X2xlbmd0aCApCi0gIHsKLSAgICBWZWN0b3IgICAgICAgICAgcmV0dXJuX3RleHQgPSBuZXcgVmVjdG9yKDIwKTsKLSAgICBTdHJpbmdbXSAgICAgICAgcmV0dXJuX3N0cjsKLSAgICBpbnQgICAgICAgICAgICAgaW5kZXggPSAwOwotCi0gICAgd2hpbGUoIGluZGV4IDwgdGV4dC5sZW5ndGgoKSApCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHRleHQuc3Vic3RyaW5nKCBpbmRleCwgTWF0aC5taW4oIG1heF9sZW5ndGggKyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Lmxlbmd0aCgpICkgKTsKLSAgICAgIGludCBzcGFjZV9pbmRleCA9IHN0ci5sYXN0SW5kZXhPZiggIiAiICk7Ci0KLSAgICAgIGlmKCBpbmRleCArIHN0ci5sZW5ndGgoKSA8IHRleHQubGVuZ3RoKCkgJiYKLSAgICAgICAgICB0ZXh0LmNoYXJBdCggaW5kZXggKyBzdHIubGVuZ3RoKCkgLSAxICkgIT0gJyAnICYmCi0gICAgICAgICAgdGV4dC5jaGFyQXQoIGluZGV4ICsgc3RyLmxlbmd0aCgpICkgIT0gJyAnICYmCi0gICAgICAgICAgc3BhY2VfaW5kZXggIT0gLTEgKQotICAgICAgewotICAgICAgICByZXR1cm5fdGV4dC5hZGRFbGVtZW50KCBzdHIuc3Vic3RyaW5nKCAwLCBzcGFjZV9pbmRleCApICk7Ci0gICAgICAgIGluZGV4ICs9IHNwYWNlX2luZGV4ICsgMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuX3RleHQuYWRkRWxlbWVudCggc3RyLnRyaW0oKSApOwotICAgICAgICBpbmRleCArPSBzdHIubGVuZ3RoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuX3N0ciA9IG5ldyBTdHJpbmdbcmV0dXJuX3RleHQuc2l6ZSgpXTsKLQotICAgIGZvciggaW5kZXggPSAwOyBpbmRleCA8IHJldHVybl90ZXh0LnNpemUoKTsgaW5kZXgrKyApCi0gICAgewotICAgICAgcmV0dXJuX3N0cltpbmRleF0gPSAoU3RyaW5nKShyZXR1cm5fdGV4dC5lbGVtZW50QXQoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dXJuX3N0cjsKLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0cmluZyB3aXRoIGEgcmVwZWF0ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCi0gICoqLwotICBzdGF0aWMgcHVibGljIFN0cmluZyByZXBlYXQoIGNoYXIgdGhlX2NoYXIsIGludCBjb3VudCApCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlciggY291bnQgKTsKLQotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKyApCi0gICAgewotICAgICAgYnVmLmFwcGVuZCggdGhlX2NoYXIgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIGZsYXR0ZW5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBhIHN0cmluZy4KLSAgICAqIFRoZSBtZXRob2QgcmVzcGVjdHMgZW1iZWRkZWQgd2hpdGVzcGFjZSBhbmQgcXVvdGVzLgotICAgICogPHVsPgotICAgICogPGxpPkFueSBhcmd1bWVudCB3aXRoIGVtYmVkZGVkIHdoaXRlc3BhY2Ugd2lsbCBiZSBmbGF0dGVuZWQgb3V0Ci0gICAgKiB3aXRoIGVuY2xvc2luZyBxdW90ZXMuIEZvciBleGFtcGxlLCB0aGUgc2luZ2xlIGFyZ3VtZW50Ci0gICAgKiA8dT5IZWxsbyBXb3JsZDwvdT4KLSAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMKLSAgICAqIDx1PiJIZWxsbyBXb3JsZCI8L3U+LgotICAgICogPGxpPkFueSBhcmd1bWVudCB3aXRoIHF1b3RlcyB3aWxsIGJlIGZsYXR0ZW5lZCBvdXQgd2l0aCB0aGUKLSAgICAqIHF1b3RlcyBlc2NhcGVkLiBGb3IgZXhhbXBsZSwgdGhlIHNpbmdsZSBhcmd1bWVudAotICAgICogPHU+IkhhcHB5IGRheXMiPC91PgotICAgICogd2lsbCBiZSByZXR1cm5lZCBhcwotICAgICogPHU+XCJIYXBweSBkYXlzXCI8L3U+LgotICAgICogPC91bD4KLSAgICAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGFycmF5IG9mIHN0cmluZ3MgdG8gZmxhdHRlbi4KLSAgICAqIEByZXR1cm4gdGhlIGZsYXR0ZW5lZCBzdHJpbmcuCi0gICovCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGZsYXR0ZW5Bcmd1bWVudHMgKCBTdHJpbmdbXSBhcmd1bWVudHMgKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIGZvciAoaW50IGk9MDsgaTxhcmd1bWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCBhIHNlcGFyYXRvciAoZXhjZXB0IHRoZSBmaXJzdCB0aW1lKS4KLSAgICAgIC8vCi0gICAgICBpZiAoaSA+IDApIGJ1Zi5hcHBlbmQoJyAnKTsKLQotICAgICAgLy8KLSAgICAgIC8vIExvb2sgZm9yIHdoaXRlc3BhY2UuCi0gICAgICAvLwotICAgICAgYm9vbGVhbiB3aGl0ZXNwYWNlID0gZmFsc2U7Ci0gICAgICBjaGFyW10gY2hhcnMgPSBhcmd1bWVudHNbaV0udG9DaGFyQXJyYXkoKTsKLSAgICAgIGZvciAoaW50IGo9MDsgIXdoaXRlc3BhY2UgJiYgajxjaGFycy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhcnNbal0pKQotICAgICAgICB7Ci0gICAgICAgICAgd2hpdGVzcGFjZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCB0aGUgYXJndW1lbnQsIHF1b3RlZCBhcyBuZWNlc3NhcnkuCi0gICAgICAvLwotICAgICAgaWYgKHdoaXRlc3BhY2UpIGJ1Zi5hcHBlbmQoJyInKTsKLSAgICAgIGZvciAoaW50IGo9MDsgajxjaGFycy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoYXJzW2pdID09ICciJykgYnVmLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgYnVmLmFwcGVuZChjaGFyc1tqXSk7Ci0gICAgICB9Ci0gICAgICBpZiAod2hpdGVzcGFjZSkgYnVmLmFwcGVuZCgnIicpOwotICAgIH0KLQotICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2QgcGFyc2VzIHdoaXRlc3BhY2UtZGVsaW1pdHRlZCBmaWxlbmFtZXMgZnJvbQotICAgICogdGhlIGdpdmVuIDxjb2RlPmlucHV0PC9jb2RlPiBzdHJlYW0uIDxiPkxpbWl0YXRpb246PC9iPgotICAgICogUXVvdGVkIGZpbGVuYW1lcyBvciBmaWxlbmFtZXMgd2l0aCBlbWJlZGRlZCB3aGl0ZXNwYWNlCi0gICAgKiBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCi0gICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IHN0cmVhbS4KLSAgICAqIEByZXR1cm4gQW4gZW51bWVyYXRpb24gb2YgZmlsZW5hbWVzIGZyb20gdGhlIHN0cmVhbS4KLSAgKi8KLSAgc3RhdGljIHB1YmxpYyBFbnVtZXJhdGlvbiBwYXJzZUZpbGVuYW1lc0Zyb21TdHJlYW0gKCBJbnB1dFN0cmVhbSBpbnB1dCApCi0gIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgVmVjdG9yIGZpbGVuYW1lcyA9IG5ldyBWZWN0b3IoNjQsNjQpOwotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotICAgIGJ5dGUgc3RhdGUgPSBTVEFURV9XUzsKLSAgICBpbnQgaWMgPSBpbnB1dC5yZWFkKCk7Ci0gICAgd2hpbGUgKGljID49IDApCi0gICAgewotICAgICAgY2hhciBjID0gKGNoYXIpaWM7Ci0gICAgICBzd2l0Y2ggKHN0YXRlKQotICAgICAgewotICAgICAgICBjYXNlIFNUQVRFX1dTOgotICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGMpOwotICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9OV1M7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX05XUzoKLSAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCi0gICAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICAgICAgZmlsZW5hbWVzLmFkZChmaWxlbmFtZSk7Ci0gICAgICAgICAgICBidWZmZXIgPSBudWxsOwotICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9XUzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpYyA9IGlucHV0LnJlYWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGVuYW1lcy5lbGVtZW50cygpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTVEFURV9XUyA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU1RBVEVfTldTID0gMTsKLQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpcyB0aGUgdHlwZSBwYXNzZWQgaW4gaXMgYSBwcmltdGl2ZSBqYXZhIHR5cGUKLSAgKiBAcGFyYW0gY2xhc3MgbmFtZSBTdHJpbmcKLSAgKiBAcmV0dXJuIHRydWUgaXMgcHJpbWl0aXZlIHR5cGUKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZU5hbWUpIAotICB7Ci0KLSAgICBpZiAodHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYm9vbGVhbiIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJieXRlIikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImRvdWJsZSIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJmbG9hdCIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpbnQiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgibG9uZyIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzaG9ydCIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJjaGFyIikpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgfQotCi0gIC8qKgotICAqIFRoZSBtZXRob2QgcmVwbGFjZSB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGxvd2VkIGluIFVSSXMKLSAgKiBhbmQgbm90IGFsbG93ZWQgaW4gSmF2YSBjbGFzcyBuYW1lcyB0byBhbiB1bmRlcnNjb3JlICgnXycpCi0gICogQHBhcmFtIFVSSSBTdHJpbmcKLSAgKiBAcmV0dXJuIHZhbGlkIEphdmEgY2xhc3MgbmFtZSBTdHJpbmcKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJMkNsYXNzTmFtZSggU3RyaW5nIHVyaSApIHsKLSAgICBTdHJpbmcgY2xhc3NOYW1lID0gdXJpOwotICAgIGZvciAoIGludCBpID0gMDsgaSA8IFVSSV9TWU1CT0xTLmxlbmd0aDsgaSsrICkgewotICAgIAljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSAoIFVSSV9TWU1CT0xTW2ldLCBVTkRFUlNDT1JFICk7Ci0gICAgfQotICAgIHJldHVybiBjbGFzc05hbWU7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gVVJJX1NZTUJPTFMgPSB7Jy0nLCAnficsICcjJywgJy8nLCAnLid9OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFVOREVSU0NPUkUgPSAnXyc7Ci0KLQotICAvKioKLSAgICogVGhpcyByZXR1cm5zIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIGJhc2VkIG9uIHRoZSBnaXZlbiBuYW1lLiAKLSAgICogKGZvbGxvd3MgSkFYLVJQQyAxLjAgUHVibGljIFJldmlldyBEcmFmdCAyIHJlY29tbWVuZGF0aW9ucykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGphdmFJZGVudGlmaWVyRm9yKFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGJvb2xlYW4gc2tpcHBlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBsb2NhbE5hbWUubGVuZ3RoKCk7IGkgPCBsZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBjaGFyIGNoYXJhY3RlciA9IGxvY2FsTmFtZS5jaGFyQXQoaSk7Ci0gICAgICBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGNoYXJhY3RlcikgJiYgIWlzRGVsaW1pdGVyKGNoYXJhY3RlcikpCi0gICAgICB7Ci0gICAgICAgIGlmIChza2lwcGVkICYmIHJlc3VsdC5sZW5ndGgoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhcmFjdGVyID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoYXJhY3Rlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZChjaGFyYWN0ZXIpOwotICAgICAgICBza2lwcGVkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNraXBwZWQgPXRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFKYXZhQ29udmVudGlvbnMudmFsaWRhdGVJZGVudGlmaWVyKHJlc3VsdC50b1N0cmluZygpKS5pc09LKCkpCi0gICAgewotICAgICAgcmVzdWx0Lmluc2VydCgwLCAiXyIpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEZWxpbWl0ZXIoY2hhciBjaGFyYWN0ZXIpCi0gIHsKLSAgICByZXR1cm4gIlx1MDAyRFx1MDAyRVx1MDAzQVx1MDA1Rlx1MDBCN1x1MDM4N1x1MDZERFx1MDZERSIuaW5kZXhPZihjaGFyYWN0ZXIpICE9IC0xOwotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTY2NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0IGltcGxlbWVudHMgUHJvamVjdFRvcG9sb2d5Q29udGV4dAotewotCi1wdWJsaWMgUGVyc2lzdGVudFByb2plY3RUb3BvbG9neUNvbnRleHQgKCkgCi17Ci0Jc3VwZXIoIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci19Ci0gcHVibGljIHZvaWQgbG9hZCgpIHsKLSAgICBTdHJpbmdbXSBpZHMgPSBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5nZXRDbGllbnRUeXBlcygpOwotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSAhPSAwKQotICAgICAgICBzYi5hcHBlbmQoIiAiKTsKLSAgICAgIHNiLmFwcGVuZChpZHNbaV0pOwotICAgIH0KLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ0xJRU5UX1RZUEVTLCBzYi50b1N0cmluZygpKTsKLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVVNFX1RXT19FQVJTLCBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5pc1VzZVR3b0VBUnMoKSk7Ci0gfQotCi0gcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZXMoU3RyaW5nW10gaWRzKQotIHsKLSAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKQotICAgewotICAgICBpZiAoaSAhPSAwKQotICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICBzYi5hcHBlbmQoaWRzW2ldKTsKLSAgIH0KLSAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ0xJRU5UX1RZUEVTLCBzYi50b1N0cmluZygpKTsKLSB9Ci0KLSBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xpZW50VHlwZXMoKQotIHsKLSAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0NMSUVOVF9UWVBFUykpOwotICAgU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0gICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspCi0gICAgIHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgIHJldHVybiBzOwotIH0KLQotIHB1YmxpYyB2b2lkIHNldFVzZVR3b0VBUnMoYm9vbGVhbiB1c2UpCi0gewotICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9VU0VfVFdPX0VBUlMsIHVzZSk7Ci0gfQotIHB1YmxpYyBib29sZWFuIGlzVXNlVHdvRUFScygpCi0gewotICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVVNFX1RXT19FQVJTKTsKLSB9Ci0KLSBwdWJsaWMgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb3B5KCkgewotIAlUcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpOwotCWNvbnRleHQuc2V0Q2xpZW50VHlwZXMoZ2V0Q2xpZW50VHlwZXMoKSk7Ci0JY29udGV4dC5zZXRVc2VUd29FQVJzKGlzVXNlVHdvRUFScygpKTsKLQlyZXR1cm4gY29udGV4dDsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50U2NlbmFyaW9Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudFNjZW5hcmlvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFmMDQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50U2NlbmFyaW9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIFNjZW5hcmlvQ29udGV4dAotewotICBwdWJsaWMgUGVyc2lzdGVudFNjZW5hcmlvQ29udGV4dCgpCi0gIHsKLSAgICBzdXBlcihXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkpOyAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvYWQoKQotICB7Ci0gICAgU2NlbmFyaW9EZWZhdWx0cyBkZWZhdWx0cyA9IG5ldyBTY2VuYXJpb0RlZmF1bHRzKCk7Ci0gICAgU3RyaW5nW10gaWRzID0gZGVmYXVsdHMuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSAhPSAwKSBzYi5hcHBlbmQoIiwiKTsKLSAgICAgIHNiLmFwcGVuZChpZHNbaV0pOwotICAgIH0KLSAgICBTdHJpbmcgbm9uSmF2YVRlc3RTZXJ2aWNlID0gZGVmYXVsdHMuZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlRGVmYXVsdCgpOwotICAgIHNldERlZmF1bHRTdHJpbmdJZk5vRGVmYXVsdChQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVEVTVF9UWVBFUywgc2IudG9TdHJpbmcoKSk7Ci0gICAgc2V0RGVmYXVsdFN0cmluZ0lmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfTk9OX0pBVkFfVEVTVF9TRVJWSUNFLCBub25KYXZhVGVzdFNlcnZpY2UpOwotICAgIAotICAgIHNldERlZmF1bHRTdHJpbmdJZk5vRGVmYXVsdChQUkVGRVJFTkNFX0NMSUVOVF9XRUJTRVJWSUNFX1RZUEUsIGRlZmF1bHRzLndlYnNlcnZpY2VDbGllbnRUeXBlRGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdFN0cmluZ0lmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9UWVBFLCBkZWZhdWx0cy53ZWJzZXJ2aWNlVHlwZUlkRGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX0dFTkVSQVRFX1BST1hZLCBkZWZhdWx0cy5nZW5lcmF0ZVByb3h5RGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX0xBVU5DSF9XRUJTRVJWSUNFX0VYUExPUkVSLCBkZWZhdWx0cy5sYXVuY2hXZWJzZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCkgKTsKLSAgICBzZXREZWZhdWx0Qm9vbGVhbklmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfU1RBUlRfV0VCU0VSVklDRSwgZGVmYXVsdHMuc3RhcnRXZWJzZXJ2aWNlRGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX1RFU1RfV0VCU0VSVklDRSwgZGVmYXVsdHMudGVzdFdlYnNlcnZpY2VEZWZhdWx0KCkgKTsKLSAgICBzZXREZWZhdWx0Qm9vbGVhbklmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfTU9OSVRPUl9XRUJTRVJWSUNFLCBkZWZhdWx0cy5nZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKSk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX0xBVU5DSF9TQU1QTEUsIGRlZmF1bHRzLmxhdW5jaFNhbXBsZSgpICk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5vbkphdmFUZXN0U2VydmljZSgpCi0gIHsKLSAgICBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZ1tdIHRlc3RUeXBlcyA9IGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RUeXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiB3c2UgPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pIHJlZ2lzdHJ5Ci0gICAgICAgICAgLmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKHRlc3RUeXBlc1tpXSk7Ci0gICAgICBpZiAoIXdzZS5pc0phdmEoKSkgcmV0dXJuIHRlc3RUeXBlc1tpXTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKFN0cmluZ1tdIGlkcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSAhPSAwKSBzYi5hcHBlbmQoIiwiKTsKLSAgICAgIHNiLmFwcGVuZChpZHNbaV0pOwotICAgIH0KLSAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVEVTVF9UWVBFUywgc2IudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKAotICAgICAgICBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9URVNUX1RZUEVTKSwgIiwiKTsKLSAgICBTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspCi0gICAgICBzW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICBwdWJsaWMgU2NlbmFyaW9Db250ZXh0IGNvcHkoKQotICB7Ci0gICAgVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0KCk7Ci0gICAgY29udGV4dC5zZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKSk7Ci0gICAgY29udGV4dC5zZXROb25KYXZhVGVzdFNlcnZpY2UoZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKCkpOwotICAgIAotICAgIGNvbnRleHQuc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoIGdldENsaWVudFdlYlNlcnZpY2VUeXBlKCkgKTsKLSAgICBjb250ZXh0LnNldFdlYlNlcnZpY2VUeXBlKCBnZXRXZWJTZXJ2aWNlVHlwZSgpICk7Ci0gICAgY29udGV4dC5zZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoIGdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpICk7Ci0gICAgY29udGV4dC5zZXRTdGFydFdlYlNlcnZpY2UoIGdldFN0YXJ0V2ViU2VydmljZSgpICk7Ci0gICAgY29udGV4dC5zZXRHZW5lcmF0ZVByb3h5KCBnZXRHZW5lcmF0ZVByb3h5KCkgKTsKLSAgICBjb250ZXh0LnNldFRlc3RXZWJTZXJ2aWNlKCBnZXRUZXN0V2ViU2VydmljZSgpICk7Ci0gICAgY29udGV4dC5zZXRNb25pdG9yV2ViU2VydmljZShnZXRNb25pdG9yV2ViU2VydmljZSgpKTsKLSAgICBjb250ZXh0LnNldExhdW5jaFNhbXBsZUVuYWJsZWQoIGlzTGF1bmNoU2FtcGxlRW5hYmxlZCgpICk7Ci0gICAgCi0gICAgcmV0dXJuIGNvbnRleHQ7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0NMSUVOVF9XRUJTRVJWSUNFX1RZUEUpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX0NMSUVOVF9XRUJTRVJWSUNFX1RZUEUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldEdlbmVyYXRlUHJveHkoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9HRU5FUkFURV9QUk9YWSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHlEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBnZXREZWZhdWx0Qm9vbGVhbihQUkVGRVJFTkNFX0dFTkVSQVRFX1BST1hZKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0xBVU5DSF9XRUJTRVJWSUNFX0VYUExPUkVSKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRkVSRU5DRV9MQVVOQ0hfV0VCU0VSVklDRV9FWFBMT1JFUik7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0U3RhcnRXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0V2ViU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9TVEFSVF9XRUJTRVJWSUNFKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRXZWJTZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRkVSRU5DRV9TVEFSVF9XRUJTRVJWSUNFKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRUZXN0V2ViU2VydmljZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0V2ViU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9URVNUX1dFQlNFUlZJQ0UpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0V2ViU2VydmljZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRCb29sZWFuKFBSRUZFUkVOQ0VfVEVTVF9XRUJTRVJWSUNFKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRXZWJTZXJ2aWNlVHlwZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9UWVBFKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RZUEUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldENsaWVudFdlYlNlcnZpY2VUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRXZWJTZXJ2aWNlVHlwZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9DTElFTlRfV0VCU0VSVklDRV9UWVBFLCB2YWx1ZSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0R2VuZXJhdGVQcm94eShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfR0VORVJBVEVfUFJPWFksIHZhbHVlKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3Jlcihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfTEFVTkNIX1dFQlNFUlZJQ0VfRVhQTE9SRVIsIHZhbHVlKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRTdGFydFdlYlNlcnZpY2UoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0V2ViU2VydmljZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfU1RBUlRfV0VCU0VSVklDRSwgdmFsdWUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFRlc3RXZWJTZXJ2aWNlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXN0V2ViU2VydmljZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfVEVTVF9XRUJTRVJWSUNFLCB2YWx1ZSk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRXZWJTZXJ2aWNlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVR5cGUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9UWVBFLCB2YWx1ZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldE1vbml0b3JXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JXZWJTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX01PTklUT1JfV0VCU0VSVklDRSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JXZWJTZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRkVSRU5DRV9NT05JVE9SX1dFQlNFUlZJQ0UpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRNb25pdG9yV2ViU2VydmljZShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvcldlYlNlcnZpY2UoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfTU9OSVRPUl9XRUJTRVJWSUNFLCB2YWx1ZSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TGF1bmNoU2FtcGxlRW5hYmxlZERlZmF1bHQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoU2FtcGxlRW5hYmxlZERlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRCb29sZWFuKFBSRUZFUkVOQ0VfTEFVTkNIX1NBTVBMRSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjaXNMYXVuY2hTYW1wbGVFbmFibGVkKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGF1bmNoU2FtcGxlRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9MQVVOQ0hfU0FNUExFKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRMYXVuY2hTYW1wbGVFbmFibGVkKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hTYW1wbGVFbmFibGVkKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9MQVVOQ0hfU0FNUExFLCB2YWx1ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRiMmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBVRERJUHJlZmVyZW5jZUNvbnRleHQKLXsKLSAgcHVibGljIFBlcnNpc3RlbnRVRERJUHJlZmVyZW5jZUNvbnRleHQoKQotICB7Ci0gICAgc3VwZXIoV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvYWQoKQotICB7Ci0gICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1VERElfQ0FUX0RBVEFfQ09MVU1OX0RFTElNSVRFUiwgVURESVByZWZlcmVuY2VEZWZhdWx0cy5nZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcigpKTsKLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9TVFJJTkdfREVMSU1JVEVSLCBVRERJUHJlZmVyZW5jZURlZmF1bHRzLmdldFVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VWRkaUNhdERhdGFDb2x1bW5EZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikKLSAgewotICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9DT0xVTU5fREVMSU1JVEVSLCBkZWxpbWl0ZXIpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1VERElfQ0FUX0RBVEFfQ09MVU1OX0RFTElNSVRFUik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKQotICB7Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX1NUUklOR19ERUxJTUlURVIsIGRlbGltaXRlcik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9TVFJJTkdfREVMSU1JVEVSKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUHJvamVjdFRvcG9sb2d5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTZkMzM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFRvcG9sb2d5Q29udGV4dCAKLXsKLSAgLyoqCi0gICAgKiBUaGlzIGNvbnN0YW50IFN0cmluZyBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgcHJlZmVycmVkIG9yZGVyIG9mIHRoZSBkaWZmZXJlbnQgY2xpZW50IHR5cGVzCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NMSUVOVF9UWVBFUyA9ICJjbGllbnRUeXBlcyI7Ci0gIAotICAvKioKLSAgICAqIFRoaXMgY29uc3RhbnQgU3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSB0d28gRUFSIG9wdGlvbgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9VU0VfVFdPX0VBUlMgPSAidXNlVHdvRUFScyI7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlcyhTdHJpbmdbXSBpZHMpOwotICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xpZW50VHlwZXMoKTsKLQotICBwdWJsaWMgdm9pZCBzZXRVc2VUd29FQVJzKGJvb2xlYW4gdXNlKTsKLSAgcHVibGljIGJvb2xlYW4gaXNVc2VUd29FQVJzKCk7Ci0KLSAgcHVibGljIFByb2plY3RUb3BvbG9neUNvbnRleHQgY29weSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1Byb2plY3RUb3BvbG9neURlZmF1bHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwYzYwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGdldENsaWVudFR5cGVzKCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0Zvcigib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwgImNsaWVudFByb2plY3RUeXBlIik7Ci0gICAgU3RyaW5nW10gdHlwZXMgPSBuZXcgU3RyaW5nW2VsZW1lbnRzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIHR5cGVzW2ldID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIHJldHVybiB0eXBlczsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1VzZVR3b0VBUnMoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9TY2VuYXJpb0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9TY2VuYXJpb0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjYmQyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvU2NlbmFyaW9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFNjZW5hcmlvQ29udGV4dCAKLXsKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVEVTVF9UWVBFUyA9ICJ3ZWJTZXJ2aWNlVGVzdFR5cGVzIjsKLSAgICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PTl9KQVZBX1RFU1RfU0VSVklDRT0gIm5vbkphdmFUZXN0U2VydmljZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9UWVBFID0gIndlYlNlcnZpY2VUeXBlIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9TVEFSVF9XRUJTRVJWSUNFID0gInN0YXJ0V2ViU2VydmljZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTEFVTkNIX1dFQlNFUlZJQ0VfRVhQTE9SRVIgPSAibGF1bmNoV2ViU2VydmljZUV4cGxvcmVyIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9HRU5FUkFURV9QUk9YWSA9ICJnZW5lcmF0ZVByb3h5IjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DTElFTlRfV0VCU0VSVklDRV9UWVBFID0gImNsaWVudFdlYlNlcnZpY2VUeXBlIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9URVNUX1dFQlNFUlZJQ0UgPSAidGVzdFdlYlNlcnZpY2UiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX01PTklUT1JfV0VCU0VSVklDRSA9ICJtb25pdG9yV2ViU2VydmljZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTEFVTkNIX1NBTVBMRSA9ICJsYXVuY2hTYW1wbGUiOwotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVRlc3RUeXBlcyhTdHJpbmdbXSB0ZXN0VHlwZXMpOwotICAKLSAgcHVibGljIFN0cmluZyBnZXROb25KYXZhVGVzdFNlcnZpY2UoKTsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVR5cGUoKTsKLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgICBzZXRXZWJTZXJ2aWNlVHlwZSggU3RyaW5nIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGFydFdlYlNlcnZpY2UoKTsKLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRXZWJTZXJ2aWNlRGVmYXVsdCgpOwotICBwdWJsaWMgdm9pZCAgICBzZXRTdGFydFdlYlNlcnZpY2UoIGJvb2xlYW4gdmFsdWUgKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpOwotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgIHNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlciggYm9vbGVhbiB2YWx1ZSApOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpOwotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5RGVmYXVsdCgpOwotICBwdWJsaWMgdm9pZCAgICBzZXRHZW5lcmF0ZVByb3h5KCBib29sZWFuIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFdlYlNlcnZpY2VUeXBlKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50V2ViU2VydmljZVR5cGVEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoIFN0cmluZyB2YWx1ZSApOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdFdlYlNlcnZpY2UoKTsKLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdFdlYlNlcnZpY2VEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgIHNldFRlc3RXZWJTZXJ2aWNlKCBib29sZWFuIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRNb25pdG9yV2ViU2VydmljZSgpOwotICBwdWJsaWMgYm9vbGVhbiBnZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvcldlYlNlcnZpY2UoYm9vbGVhbiB2YWx1ZSk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0xhdW5jaFNhbXBsZUVuYWJsZWQoKTsKLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoU2FtcGxlRW5hYmxlZERlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgICAgc2V0TGF1bmNoU2FtcGxlRW5hYmxlZCggYm9vbGVhbiB2YWx1ZSApOwotICAKLSAgcHVibGljIFNjZW5hcmlvQ29udGV4dCBjb3B5KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvRGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9TY2VuYXJpb0RlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZWE4MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvRGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLkxhYmVsc0FuZElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLQotCi0KLXB1YmxpYyBjbGFzcyBTY2VuYXJpb0RlZmF1bHRzCi17ICAKLSAgCi0JCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCkKLSAgewotICAJLy93ZSB3aWxsIHNldCB0aGUgaG9tZSBncm93biBzYW1wbGUgYXMgdGhlIGZpcnN0IGNob2ljZQotICAJV2ViU2VydmljZVRlc3RSZWdpc3RyeSB0ZXN0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gIAkKLSAgCUxhYmVsc0FuZElkcyBsYWJlbHNhbmRpZHMgPSB0ZXN0UmVnaXN0cnkuZ2V0TGFiZWxzQW5kSURzKCk7Ci0gIAlTdHJpbmdbXSBsYWJlbHMgPSBsYWJlbHNhbmRpZHMuZ2V0TGFiZWxzXygpOwotICAJU3RyaW5nW10gaWRzID0gbGFiZWxzYW5kaWRzLmdldElkc18oKTsKLSAgCQotICAJU3RyaW5nW10gbmV3TmFtZXMgPSBuZXcgU3RyaW5nW2xhYmVscy5sZW5ndGhdOwotICAJaW50IGluZGV4ID0gLTE7Ci0gIAlmb3IoaW50IGkgPSAwO2k8aWRzLmxlbmd0aDtpKyspewotICAJICBpZihpZHNbaV0uZXF1YWxzKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LldlYlNlcnZpY2VTYW1wbGVUZXN0IikpICAJCi0gIAkgICAgaW5kZXggPSBpOyAgIAotICAJfQotICAJaWYoaW5kZXggIT0gLTEpewotICAJICBuZXdOYW1lc1swXSA9IGxhYmVsc1tpbmRleF07Ci0gIAkgIGludCBqID0gMTsKLSAgCSAgZm9yKGludCBpID0gMDtpPGxhYmVscy5sZW5ndGg7aSsrKXsKLSAgCSAgICBpZihpICE9IGluZGV4KXsKLSAgCSAgCSAgbmV3TmFtZXNbal0gPSBsYWJlbHNbaV07IAotICAJICAgICAgaisrOwotICAJICAgIH0KLSAgCSAgfQotICAJfQotICAJZWxzZSByZXR1cm4gbGFiZWxzOwotICAJCi0gIAlyZXR1cm4gbmV3TmFtZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gIldlYiBTZXJ2aWNlcyBFeHBsb3JlciI7CQotICB9IAotICAKLSAgcHVibGljIFN0cmluZyB3ZWJzZXJ2aWNlVHlwZUlkRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC53cy50eXBlLmphdmEiOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBzdGFydFdlYnNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBsYXVuY2hXZWJzZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVQcm94eURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIHdlYnNlcnZpY2VDbGllbnRUeXBlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIjsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gdGVzdFdlYnNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JXZWJTZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGxhdW5jaFNhbXBsZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1RyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9UcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTI4OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1RyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCBpbXBsZW1lbnRzIFByb2plY3RUb3BvbG9neUNvbnRleHQKLXsKLSBwcml2YXRlIFN0cmluZ1tdIGNsaWVudFR5cGVzOwotIHByaXZhdGUgYm9vbGVhbiB0d29FQVJzOwotIAotIHB1YmxpYyBUcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0ICgpIHt9Ci0KLSBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlcyhTdHJpbmdbXSBjbGllbnRUeXBlcykKLSB7Ci0gICB0aGlzLmNsaWVudFR5cGVzID0gY2xpZW50VHlwZXM7Ci0gfQotIHB1YmxpYyBTdHJpbmdbXSBnZXRDbGllbnRUeXBlcygpCi0gewotICAgcmV0dXJuIGNsaWVudFR5cGVzOwotIH0KLQotIHB1YmxpYyB2b2lkIHNldFVzZVR3b0VBUnMoYm9vbGVhbiB1c2UpCi0gewotICAgdGhpcy50d29FQVJzID0gdXNlOwotIH0KLSBwdWJsaWMgYm9vbGVhbiBpc1VzZVR3b0VBUnMoKQotIHsKLSAgIHJldHVybiB0d29FQVJzOwotIH0KLQotIHB1YmxpYyBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGNvcHkoKSB7Ci0gCVRyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQgY29udGV4dCA9IG5ldyBUcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCk7Ci0JY29udGV4dC5zZXRDbGllbnRUeXBlcyhnZXRDbGllbnRUeXBlcygpKTsKLQljb250ZXh0LnNldFVzZVR3b0VBUnMoaXNVc2VUd29FQVJzKCkpOwotCXJldHVybiBjb250ZXh0OwotIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9UcmFuc2llbnRTY2VuYXJpb0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9UcmFuc2llbnRTY2VuYXJpb0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczMDYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0IGltcGxlbWVudHMgU2NlbmFyaW9Db250ZXh0Ci17Ci0gIHByaXZhdGUgU3RyaW5nW10gd2ViU2VydmljZVRlc3RUeXBlczsKLSAgcHJpdmF0ZSBTdHJpbmcgICBub25KYXZhVGVzdFNlcnZpY2U7Ci0gIHByaXZhdGUgU3RyaW5nICAgd2ViU2VydmljZVR5cGVfOwotICBwcml2YXRlIGJvb2xlYW4gIHN0YXJ0V2ViU2VydmljZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgbGF1bmNoV2ViU2VydmljZUV4cGxvcmVyXzsKLSAgcHJpdmF0ZSBib29sZWFuICBnZW5lcmF0ZVByb3h5XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICBjbGllbnRXZWJTZXJ2aWNlVHlwZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgdGVzdFdlYlNlcnZpY2VfOwotICBwcml2YXRlIGJvb2xlYW4gIG1vbml0b3JXZWJTZXJ2aWNlOwotICBwcml2YXRlIGJvb2xlYW4gIGxhdW5jaFNhbXBsZV87Ci0gIAotICBwcml2YXRlIFNjZW5hcmlvRGVmYXVsdHMgZGVmYXVsdHMgPSBuZXcgU2NlbmFyaW9EZWZhdWx0cygpOwotIAotICBwdWJsaWMgVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0ICgpIHt9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROb25KYXZhVGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5vbkphdmFUZXN0U2VydmljZTsKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXROb25KYXZhVGVzdFNlcnZpY2UoU3RyaW5nIG5vbkphdmFUZXN0U2VydmljZSkKLSAgewotICAgIHRoaXMubm9uSmF2YVRlc3RTZXJ2aWNlID0gbm9uSmF2YVRlc3RTZXJ2aWNlOwkKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKFN0cmluZ1tdIHdlYlNlcnZpY2VUZXN0VHlwZXMpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VUZXN0VHlwZXMgPSB3ZWJTZXJ2aWNlVGVzdFR5cGVzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gd2ViU2VydmljZVRlc3RUeXBlczsJCi0gIH0KLSAKLSAgcHVibGljIFNjZW5hcmlvQ29udGV4dCBjb3B5KCkgewotICAJVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0KCk7Ci0JY29udGV4dC5zZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKSk7Ci0JY29udGV4dC5zZXROb25KYXZhVGVzdFNlcnZpY2UoZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKCkpOwotCQotCWNvbnRleHQuc2V0V2ViU2VydmljZVR5cGUoIGdldFdlYlNlcnZpY2VUeXBlKCkgKTsKLQljb250ZXh0LnNldENsaWVudFdlYlNlcnZpY2VUeXBlKCBnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpICk7Ci0JY29udGV4dC5zZXRHZW5lcmF0ZVByb3h5KCBnZXRHZW5lcmF0ZVByb3h5KCkgKTsKLQljb250ZXh0LnNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlciggZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkgKTsKLQljb250ZXh0LnNldFN0YXJ0V2ViU2VydmljZSggZ2V0U3RhcnRXZWJTZXJ2aWNlKCkgKTsKLQljb250ZXh0LnNldFRlc3RXZWJTZXJ2aWNlKCBnZXRUZXN0V2ViU2VydmljZSgpICk7Ci0JY29udGV4dC5zZXRNb25pdG9yV2ViU2VydmljZShnZXRNb25pdG9yV2ViU2VydmljZSgpKTsKLQljb250ZXh0LnNldExhdW5jaFNhbXBsZUVuYWJsZWQoIGlzTGF1bmNoU2FtcGxlRW5hYmxlZCgpICk7Ci0JcmV0dXJuIGNvbnRleHQ7Ci0gIH0KLSAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFdlYlNlcnZpY2VUeXBlKCkKLSAgewotICAgIHJldHVybiBjbGllbnRXZWJTZXJ2aWNlVHlwZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50V2ViU2VydmljZVR5cGVEZWZhdWx0KCl7IHJldHVybiBkZWZhdWx0cy53ZWJzZXJ2aWNlQ2xpZW50VHlwZURlZmF1bHQoKTsgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRHZW5lcmF0ZVByb3h5KCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlUHJveHlfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5RGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMuZ2VuZXJhdGVQcm94eURlZmF1bHQoKTsgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkKLSAgewotICAgIHJldHVybiBsYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXJfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCl7IHJldHVybiBkZWZhdWx0cy5sYXVuY2hXZWJzZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0U3RhcnRXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0V2ViU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc3RhcnRXZWJTZXJ2aWNlXzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRXZWJTZXJ2aWNlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMuc3RhcnRXZWJzZXJ2aWNlRGVmYXVsdCgpOyB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldFRlc3RXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RXZWJTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiB0ZXN0V2ViU2VydmljZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RXZWJTZXJ2aWNlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMudGVzdFdlYnNlcnZpY2VEZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0V2ViU2VydmljZVR5cGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gd2ViU2VydmljZVR5cGVfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMud2Vic2VydmljZVR5cGVJZERlZmF1bHQoKTsgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRDbGllbnRXZWJTZXJ2aWNlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgY2xpZW50V2ViU2VydmljZVR5cGVfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0R2VuZXJhdGVQcm94eShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgZ2VuZXJhdGVQcm94eV8gPSB2YWx1ZTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3Jlcihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgbGF1bmNoV2ViU2VydmljZUV4cGxvcmVyXyA9IHZhbHVlOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFN0YXJ0V2ViU2VydmljZShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhcnRXZWJTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzdGFydFdlYlNlcnZpY2VfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0VGVzdFdlYlNlcnZpY2UoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RXZWJTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICB0ZXN0V2ViU2VydmljZV8gPSB2YWx1ZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFdlYlNlcnZpY2VUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVHlwZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB3ZWJTZXJ2aWNlVHlwZV8gPSB2YWx1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TW9uaXRvcldlYlNlcnZpY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TW9uaXRvcldlYlNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG1vbml0b3JXZWJTZXJ2aWNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGRlZmF1bHRzLmdldE1vbml0b3JXZWJTZXJ2aWNlRGVmYXVsdCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRNb25pdG9yV2ViU2VydmljZShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvcldlYlNlcnZpY2UoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIG1vbml0b3JXZWJTZXJ2aWNlID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TGF1bmNoU2FtcGxlRW5hYmxlZERlZmF1bHQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoU2FtcGxlRW5hYmxlZERlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGRlZmF1bHRzLmxhdW5jaFNhbXBsZSgpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2lzTGF1bmNoU2FtcGxlRW5hYmxlZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xhdW5jaFNhbXBsZUVuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIGxhdW5jaFNhbXBsZV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0TGF1bmNoU2FtcGxlRW5hYmxlZChib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoU2FtcGxlRW5hYmxlZChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgbGF1bmNoU2FtcGxlXyA9IHZhbHVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVURESVByZWZlcmVuY2VDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVURESVByZWZlcmVuY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGFkZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1VERElQcmVmZXJlbmNlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotcHVibGljIGludGVyZmFjZSBVRERJUHJlZmVyZW5jZUNvbnRleHQgCi17Ci0gIC8qCi0gICAqIFRoaXMgY29uc3RhbnQgU3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBjb2x1bW4gZGVsaW1pdGVyIGZvciB1c2VyLWRlZmluZWQgVURESQotICAgKiBDYXRlZ29yeSBkYXRhLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX0NPTFVNTl9ERUxJTUlURVIgPSAidWRkaUNhdERhdGFDb2x1bW5EZWxpbWl0ZXIiOwotICAKLSAgLyoKLSAgICogVGhpcyBjb25zdGFudCBTdHJpbmcgaXMgdXNlZCB0byBsb29rdXAgdGhlIHN0cmluZyBkZWxpbWl0ZXIgZm9yIHVzZXItZGVmaW5lZCBVRERJCi0gICAqIENhdGVnb3J5IGRhdGEuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1VERElfQ0FUX0RBVEFfU1RSSU5HX0RFTElNSVRFUiA9ICJ1ZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlciI7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKTsKLSAgcHVibGljIFN0cmluZyBnZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcigpOwotICBwdWJsaWMgdm9pZCBzZXRVZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKTsKLSAgcHVibGljIFN0cmluZyBnZXRVZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9VRERJUHJlZmVyZW5jZURlZmF1bHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVURESVByZWZlcmVuY2VEZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWViYTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9VRERJUHJlZmVyZW5jZURlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgVURESVByZWZlcmVuY2VEZWZhdWx0cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcigpCi0gIHsKLSAgICByZXR1cm4gIiMiOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlcigpCi0gIHsKLSAgICByZXR1cm4gIlwiIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kYXRhL0xhYmVsc0FuZElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kYXRhL0xhYmVsc0FuZElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQwZjY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZGF0YS9MYWJlbHNBbmRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhOwotCi1wdWJsaWMgY2xhc3MgTGFiZWxzQW5kSWRzCi17Ci0gIHByaXZhdGUgU3RyaW5nW10gbGFiZWxzXzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBpZHNfOwotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWRzXy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRJZHNfKCkKLSAgewotICAgIHJldHVybiBpZHNfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gaWRzXyBUaGUgaWRzXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJZHNfKFN0cmluZ1tdIGlkc18pCi0gIHsKLSAgICB0aGlzLmlkc18gPSBpZHNfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxhYmVsc18uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0TGFiZWxzXygpCi0gIHsKLSAgICByZXR1cm4gbGFiZWxzXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGxhYmVsc18gVGhlIGxhYmVsc18gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGFiZWxzXyhTdHJpbmdbXSBsYWJlbHNfKQotICB7Ci0gICAgdGhpcy5sYWJlbHNfID0gbGFiZWxzXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kYXRhL1R5cGVSdW50aW1lU2VydmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RhdGEvVHlwZVJ1bnRpbWVTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjMzQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RhdGEvVHlwZVJ1bnRpbWVTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhOwotCi1wdWJsaWMgY2xhc3MgVHlwZVJ1bnRpbWVTZXJ2ZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZUlkXyAgICAgPSAiIjsKLSAgcHJpdmF0ZSBTdHJpbmcgcnVudGltZUlkXyAgPSAiIjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVySWRfICAgPSAiIjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVySW5zdGFuY2VJZF87Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBydW50aW1lSWRfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lSWQoKQotICB7Ci0gICAgcmV0dXJuIHJ1bnRpbWVJZF87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBydW50aW1lSWRfIFRoZSBydW50aW1lSWRfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWVJZChTdHJpbmcgcnVudGltZUlkXykKLSAgewotICAgIHRoaXMucnVudGltZUlkXyA9IHJ1bnRpbWVJZF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVySWRfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJZCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmVySWRfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gc2VydmVySWRfIFRoZSBzZXJ2ZXJJZF8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmVySWQoU3RyaW5nIHNlcnZlcklkXykKLSAgewotICAgIHRoaXMuc2VydmVySWRfID0gc2VydmVySWRfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlckluc3RhbmNlSWRfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJbnN0YW5jZUlkKCkKLSAgewotICAgIHJldHVybiBzZXJ2ZXJJbnN0YW5jZUlkXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHNlcnZlckluc3RhbmNlSWRfIFRoZSBzZXJ2ZXJJbnN0YW5jZUlkXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkXykKLSAgewotICAgIHRoaXMuc2VydmVySW5zdGFuY2VJZF8gPSBzZXJ2ZXJJbnN0YW5jZUlkXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlSWRfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlSWQoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVJZF87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlSWRfIFRoZSB0eXBlSWRfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVJZChTdHJpbmcgdHlwZUlkXykKLSAgewotICAgIHRoaXMudHlwZUlkXyA9IHR5cGVJZF87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJ0eXBlKCIgKyB0eXBlSWRfICsgIikgcnVudGltZSgiICsgcnVudGltZUlkXyArICIpIGZhY3RvcnkoIiArIHNlcnZlcklkXyArICIpIHNlcnZJbnN0SWQoIiArIHNlcnZlckluc3RhbmNlSWRfICsgIikiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RpYWxvZy9JU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RpYWxvZy9JU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4N2JmZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kaWFsb2cvSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci0KLS8qKgotKiBDb25zdGFudHMgZm9yIHN0YXR1cyBkaWFsb2dzCi0qLwotcHVibGljIGludGVyZmFjZSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzIHsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRVNfSUQgPSAyOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMgdG8gYWxsIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVTX1RPX0FMTF9JRCA9IDQ7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIkNhbmNlbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9JRCA9IDE7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIk9LIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfSUQgPSAwOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJEZXRhaWxzIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMU19JRCA9IDEzOwotCi0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIlllcyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFU19MQUJFTCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfWUVTX0xBQkVMIik7Ci0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIlllcyB0byBhbGwiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRVNfVE9fQUxMX0xBQkVMID0gV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlU1RBVFVTX0RJQUxPR19ZRVNfVE9fQUxMX0xBQkVMIik7Ci0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIkNhbmNlbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTkNFTF9MQUJFTCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfQ0FOQ0VMX0xBQkVMIik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXhlY3V0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4ZWN1dGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczMjZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXhlY3V0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQ7Ci0KLS8qKgotKiBBbGwgRXh0ZW5zaW9ucyB3aXRoIGV4ZWN0dXRhYmxlIGV4dGVuc2lvbnMgc2hvdWxkIGltcGxlbWVudCB0aGlzIAotKiB0byBmaXQgb3VyIGZyYW1ld29yawotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUV4ZWN1dGFibGUKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIC8qKgotICAqUmV0dXJucyBhIHdpemFyZCBmcmFnbWVudCBmb3IgdGhpcyBleGVudGlvbiB0eXBlIAotICAqCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRmluaXNoQ29tbWFuZCBnZXRGaW5pc2hDb21tYW5kKCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJjNDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotCi0vKioKLSogVGhpcyByZXByZXNlbnRzIGFuIGV4dGVuc2lvbiBpbiB0aGUgcGx1Z2luIHJlZ2lzdHJ5IAotKiBJdCBqb2IgaXMgdG8gYWN0IGFzIGEgcHJveHkgdG8gdGhlIGljb25maWdlbGVtZW50Ci0qLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlRXh0ZW5zaW9uCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIElmIHRoZSBleHRlbnNpb24gaGFzIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBleGVjdXRlZCBvciBhIGZyYWdtZW50IGFkZGVkCi0gICogQHJldHVybiBXZWJTZXJ2aWNlRXhlY3V0YWJsZSB0aGlzIGludGVyZmFjZSBob2xkcyBleGVjdXRhYmxlIGNvZGUgYW5kIGEgCi0gICogZnJhZ21lbnQKLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VFeGVjdXRhYmxlIGdldFdlYlNlcnZpY2VFeGVjdXRhYmxlRXh0ZW5zaW9uKCk7Ci0KLSAgLyoqCi0gICogVGhpcyBpcyB0aGUgY29uZmlnIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZW5zaW9uIGluZm8KLSAgKiBAcGFyYW0gSUNvbmZpZ3VyYXRpb25FbGVtZW50IEV4dGVuc2lvbiBlbGVtZW50Ci0gICovCi0gIHB1YmxpYyB2b2lkIHNldENvbmZpZ0VsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpOwotIAotICAvKioKLSAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBjb2RlIHRoYXQgCi0gICogQHJldHVybiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgRXh0ZW5zaW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWdFbGVtZW50KCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OWU5MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotCi0KLQotCi0KLS8qKgotKiBUaGlzIHJlcHJlc2VudHMgYW4gZXh0ZW5zaW9uIGluIHRoZSBwbHVnaW4gcmVnaXN0cnkgCi0qIEl0IGpvYiBpcyB0byBhY3QgYXMgYSBwcm94eSB0byB0aGUgaWNvbmZpZ2VsZW1lbnQKLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUV4dGVuc2lvbkltcGwgaW1wbGVtZW50cyBXZWJTZXJ2aWNlRXh0ZW5zaW9uCi17Ci0KLQlwcml2YXRlIExvZwlsb2dfOwotCQotICAvKgotICAqIFRoZSBDb25maWdFbGVtZW50IHRoYXQgaG9sZHMgZXh0ZW5zaW9uIGluZm8KLSAgKi8KLSAgcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50XzsKLQotICAvKgotICAqIFRoZSBleHRlbnNpb24gZXhlY3V0YWJsZSAKLSAgKi8KLSAgcHJvdGVjdGVkIFdlYlNlcnZpY2VFeGVjdXRhYmxlIHdlYlNlcnZpY2VFeGVjdXRhYmxlXzsKLSAgCi0KLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb25JbXBsKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotICB7Ci0gICAgY29uZmlnRWxlbWVudF8gPSBjb25maWdFbGVtZW50OwotICAgIGxvZ18gPSBuZXcgRWNsaXBzZUxvZygpOwotICB9Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogSWYgdGhlIGV4dGVuc2lvbiBoYXMgY29kZSB0aGF0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkIG9yIGEgZnJhZ21lbnQgYWRkZWQKLSAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeGVjdXRhYmxlIHRoaXMgaW50ZXJmYWNlIGhvbGRzIGV4ZWN1dGFibGUgY29kZSBhbmQgYSAKLSAgKiBmcmFnbWVudAotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUV4ZWN1dGFibGUgZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24oKQotICB7Ci0gICAgaWYod2ViU2VydmljZUV4ZWN1dGFibGVfICE9IG51bGwpIHJldHVybiB3ZWJTZXJ2aWNlRXhlY3V0YWJsZV87Ci0KLSAgICB0cnl7Ci0gICAgICBPYmplY3Qgd2ViU2VydmljZUV4ZWN1dGFibGUgPSBjb25maWdFbGVtZW50Xy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgCi0gICAgICBpZiggd2ViU2VydmljZUV4ZWN1dGFibGUgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhlY3V0YWJsZSkKLSAgICAgICAgcmV0dXJuIChXZWJTZXJ2aWNlRXhlY3V0YWJsZSl3ZWJTZXJ2aWNlRXhlY3V0YWJsZTsgCi0gICAgICBlbHNlCi0gICAgICAJbG9nXy5sb2coTG9nLkVSUk9SLCA1MDI4LCB0aGlzLCAiZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24iLCAiSW5jb3JyZWN0IFdlYlNlcnZpY2VUZXN0OiIgKyB3ZWJTZXJ2aWNlRXhlY3V0YWJsZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7ICAgICAgCi0gICAgfWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotICAgICAgbG9nXy5sb2coTG9nLkVSUk9SLCA1MDI5LCB0aGlzLCAiZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24iLGUpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBpcyB0aGUgY29uZmlnIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZW5zaW9uIGluZm8KLSAgKiBAcGFyYW0gSUNvbmZpZ3VyYXRpb25FbGVtZW50IEV4dGVuc2lvbiBlbGVtZW50Ci0gICovCi0gIHB1YmxpYyB2b2lkIHNldENvbmZpZ0VsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpCi0gIHsKLSAgICBjb25maWdFbGVtZW50XyA9IGNvbmZpZ0VsZW1lbnQ7Ci0gIH0JCi0KLSAgLyoqCi0gICogVGhpcyBpcyB0aGUgY29uZmlnIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZW5zaW9uIGluZm8KLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uRWxlbWVudCBFeHRlbnNpb24gZWxlbWVudAotICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGNvbmZpZ0VsZW1lbnRfOwotICB9Ci0gIAotICAvKioKLSAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGJlaW5nIHVzZWQKLSAgKiBAcmV0dXJuIFN0cmluZyBuYW1lIG9mIHRoaXMgZXh0ZW5zaW9uCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggIm5hbWUiICk7Ci0gIH0KLQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjMWQwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0OwotCi0KLS8qKgotKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZXh0ZW5zaW9ucyBmb3IgYSBnaXZlbiBleHRlbnNpb24tcG9pbnQgCi0qIGFsc28gcmV0dXJucyB0aGUgZXh0ZW5zaW9uIG9iamVjdHMgCi0qCi0qLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkKLXsKLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIGV4dGVuc2lvbnMKLSAgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbk5hbWVzICgpOwotICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgZXh0ZW5zaW9uIG9iamVjdCBvZiB0aGUgZ2l2ZW4gbmFtZQotICAqQHJldHVybiBXZWJTZXJ2aWNlRXh0ZW5zaW9uIG9iamVjdAotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUV4dGVuc2lvbiBnZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZSggU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIFJldHVybnMgQWxsIGV4dGVudGlvbiBvYmplY3RzIGluIHRoaXMgcmVnaXN0cnkKLSAgKkByZXR1cm4gV2ViU2VydmljZUV4dGVuc2lvbiBvYmplY3RzCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbnMoKTsKLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjVjZWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuTGFiZWxzQW5kSWRzOwotCi0KLS8qKgotKiBUaGlzIGlzIGEgZ2VuZXJpYyByZWdpc3RyeSB3aGljaCBzZXRzIHVwIGdlbmVyYWwgY29kZSBpbiBoYW5kbGluZyAgIAotKiBJQ29uZmlnRWxlbWVudHMgZm9yIGFuIGV4dGVuc2lvbgotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICAKLSAgcHJpdmF0ZSBIYXNodGFibGUgbmFtZUV4dGVuc2lvblRhYmxlXzsKLSAgcHJpdmF0ZSBWZWN0b3IgaWRfOwotICBwcml2YXRlIFZlY3RvciBsYWJlbF87Ci0gIHByaXZhdGUgTGFiZWxzQW5kSWRzIGxhYmVsc2FuZGlkc187Ci0gICAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsKCkKLSAgewotICAgIG5hbWVFeHRlbnNpb25UYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgbGFiZWxfID0gbmV3IFZlY3RvcigpOwotICAgIGlkXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBsb2FkRXh0ZW5zaW9ucygpOwotICB9Ci0gIAotICAvKioKLSAgKiBDaGlsZHJlbiByZWdpc3RyaWVzIHdpbGwgaGF2ZSBkaWZmZXJlbnQgZXh0ZW5zaW9uIHR5cGVzIAotICAqIEByZXR1cm4gV2Vic2VydmljZUV4dGVuc2lvbiBob2xkcyBhIGNvbmZpZyBlbGVtCi0gICogZm9yIHRoYXQgZXh0ZW5zaW9uIGNhcGFibGUgb2YgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCi0gICovCi0gIHB1YmxpYyBhYnN0cmFjdCBXZWJTZXJ2aWNlRXh0ZW5zaW9uIGNyZWF0ZVdlYlNlcnZpY2VFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpOwotCi0gIC8qKgotICAqIENoaWxkcmVuIG11c3QgaW1wbGVtZW50IGhvdyB0aGV5IGdldCB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gCi0gICogQHJldHVybiBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBhbiBhcnJheSBvZiBlbGVtZW50cyBwYXJ0aWN1bGFyIHRvIHRoYXQKLSAgKiBleHRlbnNpb24KLSAgKi8KLSAgcHVibGljIGFic3RyYWN0IElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbmZpZ0VsZW1lbnRzKCk7Ci0KLSAgLyoKLSAgKiBMb2FkcyBXZWJTZXJ2aWNlRXh0ZW5zaW9ucyBmb3IgV2ViU2VydmljZUNsaWVudFRlc3QgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAqIFRoaXMgaXMgZG9uZSBieSBxdWVyeWluZyB0aGUgcGx1Z2luIHJlZ2lzdHJ5IGZvciBhbGwgZXh0ZW5zaW9ucwotICAqIHRoYXQgZXh0ZW5kIHdlYlNlcnZpY2VDbGllbnRUZXN0ICAKLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvYWRFeHRlbnNpb25zICgpCi0gIHsgICAgCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gZ2V0Q29uZmlnRWxlbWVudHMoKTsKLQotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBjb25maWdbaWR4XTsKLSAgICAgIFN0cmluZyBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoICJuYW1lIiApOwotICAgICAgU3RyaW5nIGlkID0gICBlbGVtLmdldEF0dHJpYnV0ZSggImlkIiApOyAgICAgIAotICAgICAgV2ViU2VydmljZUV4dGVuc2lvbiB3ZWJTZXJ2aWNlRXh0ZW5zaW9uID0gY3JlYXRlV2ViU2VydmljZUV4dGVuc2lvbihlbGVtKTsJCi0gICAgICBuYW1lRXh0ZW5zaW9uVGFibGVfLnB1dChuYW1lLHdlYlNlcnZpY2VFeHRlbnNpb24pOwotICAgICAgbGFiZWxfLmFkZChuYW1lKTsKLSAgICAgIGlkXy5hZGQoaWQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIGV4dGVuc2lvbnMKLSAgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbk5hbWVzICgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKW5hbWVFeHRlbnNpb25UYWJsZV8ua2V5U2V0KCkudG9BcnJheSggbmV3IFN0cmluZ1swXSApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbmFtZXMgYW5kIElkcyAKLSAgICovCi0gIHB1YmxpYyBMYWJlbHNBbmRJZHMgZ2V0TGFiZWxzQW5kSURzKCkKLSAgewotICAJbGFiZWxzYW5kaWRzXyA9IG5ldyBMYWJlbHNBbmRJZHMoKTsKLSAgCWxhYmVsc2FuZGlkc18uc2V0TGFiZWxzXygoU3RyaW5nW10pbGFiZWxfLnRvQXJyYXkoIG5ldyBTdHJpbmdbMF0gKSk7Ci0gIAlsYWJlbHNhbmRpZHNfLnNldElkc18oKFN0cmluZ1tdKWlkXy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICkpOwotICAJcmV0dXJuIGxhYmVsc2FuZGlkc187Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3Qgb2YgdGhlIGdpdmVuIG5hbWUKLSAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeHRlbnNpb24gb2JqZWN0Ci0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uIGdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAoV2ViU2VydmljZUV4dGVuc2lvbiluYW1lRXh0ZW5zaW9uVGFibGVfLmdldChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgQWxsIGV4dGVudGlvbiBvYmplY3RzIGluIHRoaXMgcmVnaXN0cnkKLSAgKkByZXR1cm4gV2ViU2VydmljZUV4dGVuc2lvbiBvYmplY3RzCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbnMoKQotICB7Ci0gICAgcmV0dXJuIChXZWJTZXJ2aWNlRXh0ZW5zaW9uW10pbmFtZUV4dGVuc2lvblRhYmxlXy52YWx1ZXMoKS50b0FycmF5KCBuZXcgV2ViU2VydmljZUV4dGVuc2lvblswXSApOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUZpbmlzaENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VGaW5pc2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTI5YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUZpbmlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKgotKiA8Y29weXJpZ2h0PgotKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSoKLSogPC9jb3B5cmlnaHQ+Ci0qLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VGaW5pc2hDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9KYXZhUHJveHlUZXN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9KYXZhUHJveHlUZXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTAzOTcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvSmF2YVByb3h5VGVzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKgotKiA8Y29weXJpZ2h0PgotKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSoKLSogPC9jb3B5cmlnaHQ+Ci0qLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQcm94eVRlc3RDb21tYW5kIGV4dGVuZHMgV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kCi17Ci0KLSAvKioKLSAgKiBUaGlzIGhvbGRzIGFuIGluZm8gY2xhc3MgdGhhdCBjb21lcyBmcm9tIHVzZXIgaW5wdXQgb3Igc29tZSBjYWxjaWxhdGlvbnMgdGhhdCBuZWVkcyB0byBiZQotICAqIHVzZWQgZm9yIHRoZSBmaW5pc2gKLSAgKi8KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlcihTdHJpbmcganNwRm9sZGVyKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bkNsaWVudFRlc3QoYm9vbGVhbiBydW5DbGllbnRUZXN0KTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIHNhbXBsZVByb2plY3QpOwotICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlCZWFuKFN0cmluZyBwcm94eUJlYW4pOwotICAKLSAgcHVibGljIHZvaWQgc2V0U2V0RW5kcG9pbnRNZXRob2QoU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpOwotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcyk7Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV1NETFRlc3RGaW5pc2hDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC90ZXN0L1dTRExUZXN0RmluaXNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTIzZGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV1NETFRlc3RGaW5pc2hDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioKLSogPGNvcHlyaWdodD4KLSoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qCi0qIDwvY29weXJpZ2h0PgotKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFRlc3RGaW5pc2hDb21tYW5kIGV4dGVuZHMgV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kCi17Ci0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KFN0cmluZyBzZXJ2ZXJQcm9qZWN0KTsKLSAgcHVibGljIHZvaWQgc2V0V3NkbFNlcnZpY2VVUkwoU3RyaW5nIHdzZGxVUkkpOwotICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEJyb3dzZXIoYm9vbGVhbiBleHRlcm5hbCk7IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFhYjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VFeHRlbnNpb25JbXBsOwotCi0KLQotLyoqCi0qIFRoaXMgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gaW4gdGhlIHBsdWdpbiByZWdpc3RyeSAKLSogSXQgam9iIGlzIHRvIGFjdCBhcyBhIHByb3h5IHRvIHRoZSBpY29uZmlnZWxlbWVudAotKiBJbiBwYXJ0aWN1bGFyIGl0IGhvbGRzIGEgY2xpZW50IHRlc3QgZXh0ZW5zaW9uIGVsZW1lbnQgCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIGV4dGVuZHMgV2ViU2VydmljZUV4dGVuc2lvbkltcGwKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotICB7Ci0gICAgc3VwZXIoY29uZmlnRWxlbWVudCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFdpbGwgdGhpcyB0ZXN0Q2xpZW50IGdlbmVyYXRlIGNvZGUKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjb2RlZ2VuIG5lZWRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NvZGVHZW5OZWVkZWQoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAiY29kZWdlbiIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFVzZSB0aGUgZGVmYXVsdCBGb2xkZXIgUHJvdmlkZWQgYnkgdXMKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBubyBzcGVjaWFsIGZvbGRlciByZXF1aXJlcwotICAqLwotICBwdWJsaWMgYm9vbGVhbiB1c2VEZWZhdWx0Q29kZUdlbkZvbGRlcigpCi0gIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJkZWZhdWx0Y29kZWdlbmZvbGRlciIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBVc2UgU3BlY2lhbCBGb2xkZXIgZm9yIGdlbmVyYXRlZCBjb2RlCi0gICogQHJldHVybiBTdHJpbmcgc3BlY2lhbCBmb2xkZXIgbmFtZQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvZGVHZW5Gb2xkZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJjb2RlZ2VuZm9sZGVyIiApOwotICB9Ci0KLSAgLyoqCi0gICogRG8gd2UgbmVlZCB0byBsYXVuY2ggc29tZXRoaW5nCi0gICogQHJldHVybiBCb29sZWFuIGlmIHRydWUgbGF1bmNoIGNvZGVnZW4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMYXVuY2hSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJsYXVuY2hSZXF1aXJlZCIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBEbyB3ZSBuZWVkIHRoZSBtZXRob2RzIGZvciB0aGUgcHJveHkKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBwcm94eSBtZXRob2RzIG5lZWRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcmVNZXRob2RzTmVlZGVkKCkKLSAgewotICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggIm1ldGhvZHNuZWVkZWQiICkpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICogRG9lcyB0aGlzIHRlc3QgbWFjaGluZSBuZWVkIGEgc2VydmVyCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYSBzZXJ2ZXIgaXMgcmVxdWlyZWQKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJOZWVkZWQoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAic2VydmVybmVlZGVkIiApKS5ib29sZWFuVmFsdWUoKTsKLSAgfQotCi0gIC8qKgotICAqIFVzZSB0aGUgRGVmYXVsdCBTZXJ2ZXIgY2hvc2VuIGJ5IHRoZSB3aXphcmQKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZGVmYXVsdCBzZXJ2ZXIgaXMgd2FudGVkCi0gICovCi0gIHB1YmxpYyBib29sZWFuIHVzZURlZmF1bHRTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAiZGVmYXVsdHNlcnZlciIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBVc2UgdGhlIERlZmF1bHQgU2VydmVyIGNob3NlbiBieSB0aGUgd2l6YXJkCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIGRlZmF1bHQgc2VydmVyIGlzIHdhbnRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIHVzZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggInVzZXNlcnZlciIgKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzSmF2YSgpCi0gIHsKLSAgCXJldHVybiBCb29sZWFuLnZhbHVlT2YoZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggImphdmEiICkpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0gIAkKLSAgCi19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlODdmZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotKiA8Y29weXJpZ2h0PgotKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSoKLSogPC9jb3B5cmlnaHQ+Ci0qLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRmluaXNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQgZXh0ZW5kcyBXZWJTZXJ2aWNlRmluaXNoQ29tbWFuZAotewotCi0gIC8qKgotICAgKiBJZiB0aGUgY29tbWFuZCBuZWVkcyBhIHNlcnZlciB0aGlzIGlzIHRoZSBjaG9zZW4gCi0gICAqIGNsaWVudCBzZXJ2ZXJJRAotICAgKiBAcGFyYW0gc2FtcGxlU2VydmVyVHlwZUlECi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQpOwotICAKLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIElTZXJ2ZXIgaWYgcmVxdWlyZWQKLSAgICogQHBhcmFtIHNhbXBsZUV4aXN0aW5nU2VydmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcik7Ci0gIAotICAvKioKLSAgICogVGhpcyBpcyB0aGUgZW5kcG9pbnRzIGlmIG1vbml0b3Igc2VydmljZSBpcyBlbmFibGVkCi0gICAqIEBwYXJhbSBlbmRwb2ludHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KExpc3QgZW5kcG9pbnRzKTsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC90ZXN0L1dlYlNlcnZpY2VUZXN0UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDA2NDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQuV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgZXh0ZW5kcyBXZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICAvKgotICAgKiBUaGlzIGlzIGEgc2luZ2xldG9uIGJlY2FzdWUgaXQgd2FzIGRlY2lkZWQgdGhhdCB0aGUgbWVtb3J5IGZvb3QgcHJpbnQgCi0gICAqIGlzIG5vdCBhcyBleHBlbnNpdmUgYXMgdGhlIHRpbWUgdGFrZW4gcmV0cmlldmluZyB0aGUgZGF0YQotICAgKiAKLSAgICovCi0gIAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVRlc3RSZWdpc3RyeSB3c3RyOwotICAKLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAJaWYod3N0ciA9PSBudWxsKSB3c3RyID0gbmV3IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkoKTsKLSAgICByZXR1cm4gd3N0cjsKLSAgfQotICAKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIENoaWxkcmVuIHJlZ2lzdHJpZXMgd2lsbCBoYXZlIGRpZmZlcmVudCBleHRlbnNpb24gdHlwZXMgCi0gICogQHJldHVybiBXZWJzZXJ2aWNlRXh0ZW5zaW9uIGhvbGRzIGEgY29uZmlnIGVsZW0KLSAgKiBmb3IgdGhhdCBleHRlbnNpb24gY2FwYWJsZSBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb24gY3JlYXRlV2ViU2VydmljZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkKLSAgewotICAgIHJldHVybiBuZXcgV2ViU2VydmljZVRlc3RFeHRlbnNpb24oY29uZmlnRWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgKiBDaGlsZHJlbiBtdXN0IGltcGxlbWVudCBob3cgdGhleSBnZXQgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIAotICAqIEByZXR1cm4gSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYW4gYXJyYXkgb2YgZWxlbWVudHMgcGFydGljdWxhciB0byB0aGF0Ci0gICogZXh0ZW5zaW9uCi0gICovCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWdFbGVtZW50cygpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJTZXJ2aWNlVGVzdCIpOwotICAgIHJldHVybiBjb25maWc7ICAgIAotICB9Ci0KLQotICAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNiNjNmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3BsdWdpbi9XZWJTZXJ2aWNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5VRERJUHJlZmVyZW5jZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudFJlc291cmNlQ29udGV4dDsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIHBsdWdpbi4KLSogPHA+Ci0qIFRoaXMgcGx1Z2luIGNvbnRhaW5zIHRoZSBidWxrIG9mIHRoZSBXZWIgU2VydmljZXMgcnVudGltZS4KLSogT25seSB0aGUgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIHBvcnRpb24gb2YgdGhlIHJ1bnRpbWUgaXMKLSogZm91bmQgZWxzZXdoZXJlIC0gaW4gdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aSBwbHVnaW4uCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VQbHVnaW4gaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHRfOwotICBwcml2YXRlIFBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQgc2NlbmFyaW9Db250ZXh0XzsKLSAgcHJpdmF0ZSBQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCBwcm9qZWN0VG9wb2xvZ3lDb250ZXh0XzsKLSAgcHJpdmF0ZSBQZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0IHVkZGlQcmVmZXJlbmNlQ29udGV4dDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUGx1Z2luKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgaW5zdGFuY2VfID0gdGhpczsgCi0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlUGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUGx1Z2luIGdldEluc3RhbmNlICgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIAotICB7Ci0gIAkJKChQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCkgZ2V0UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpKS5sb2FkKCk7Ci0gIAkJKChQZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0KSBnZXRVRERJUHJlZmVyZW5jZUNvbnRleHQoKSkubG9hZCgpOwotICB9Ci0KLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gIAkJaWYgKHJlc291cmNlQ29udGV4dF8gPT0gbnVsbCkgCi0gIAkJCXJlc291cmNlQ29udGV4dF8gPSBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiByZXNvdXJjZUNvbnRleHRfOwotICB9Ci0KLSAgcHVibGljIFNjZW5hcmlvQ29udGV4dCBnZXRTY2VuYXJpb0NvbnRleHQoKQotICB7Ci0gIAkJaWYgKHNjZW5hcmlvQ29udGV4dF8gPT0gbnVsbCkKLSAgCQl7Ci0gIAkJICBzY2VuYXJpb0NvbnRleHRfID0gbmV3IFBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQoKTsKLSAgCQkgIHNjZW5hcmlvQ29udGV4dF8ubG9hZCgpOwotICAJCX0KLQotCQlyZXR1cm4gc2NlbmFyaW9Db250ZXh0XzsKLSAgfQotCi0gIHB1YmxpYyBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKQotICB7Ci0gICAgaWYgKHByb2plY3RUb3BvbG9neUNvbnRleHRfID09IG51bGwpCi0gICAgICBwcm9qZWN0VG9wb2xvZ3lDb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpOwotICAgIHJldHVybiBwcm9qZWN0VG9wb2xvZ3lDb250ZXh0XzsKLSAgfQotCi0gIAotICBwdWJsaWMgVURESVByZWZlcmVuY2VDb250ZXh0IGdldFVERElQcmVmZXJlbmNlQ29udGV4dCgpCi0gIHsKLSAgICBpZiAodWRkaVByZWZlcmVuY2VDb250ZXh0ID09IG51bGwpCi0gICAgICB1ZGRpUHJlZmVyZW5jZUNvbnRleHQgPSBuZXcgUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dCgpOwotICAgIHJldHVybiB1ZGRpUHJlZmVyZW5jZUNvbnRleHQ7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4KLSAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXkgKQotICB7Ci0gICAgcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGluc3RhbmNlXy5nZXRCdW5kbGUoKSxrZXkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4gU3Vic3RpdHV0aW9uIHNlcXVlbmNlcyBpbiB0aGUgbWVzc2FnZSBzdHJpbmcKLSAgKiBhcmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbiBvYmplY3RzICh3aGljaAotICAqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSB0aGUgSkRLJ3MKLSAgKiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXR9Ci0gICogY2xhc3MgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHJldHVybiBUaGUgU3RyaW5nIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzICkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksYXJncyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWJkYWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi0KLU1TR19FUlJPUl9TRVJWRVI9SVdBQjAyMTNFIEVycm9yIGluIHN0YXJ0aW5nIHNlcnZlci4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTkwYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotcnVudGltZQotdGVtcC5mb2xkZXIKLWVudmNvcmUuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyN2RlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODgzYmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgZW52Y29yZS5qYXIKLXNyYy5pbmNsdWRlcyA9IC5jbGFzc3BhdGgsXAotICAgICAgICAgICAgICAgLnByb2plY3QsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8KLXNvdXJjZS5lbnZjb3JlLmphciA9IHNyYy8KLW91dHB1dC5lbnZjb3JlLmphciA9IGJpbi8KLWphcnMuY29tcGlsZS5vcmRlciA9IGVudmNvcmUuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDU4ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZCI+Ci0gICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj4KLSAgIDwvY29tcG9uZW50LWRlcGVuZHM+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MTcwOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPUVudmlyb25tZW50IENvbW1hbmQgRnJhbWV3b3JrIChjb3JlKQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDdmYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiCi0gICB2ZXJzaW9uID0gIjEuMC4wIgotICAgbmFtZSA9ICIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lID0gIiVQTFVHSU5fUFJPVklERVIiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImVudmNvcmUuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiZGEzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLS8qKgotICogQ29tbWFuZHMgYXJlIGV4ZWN1dGFibGUsIHVuZG9hYmxlLCByZWRvYWJsZSBvYmplY3RzLgotICogRXZlcnkgQ29tbWFuZCBoYXMgYSBuYW1lIGFuZCBhIGRlc2NyaXB0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmQKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIENvbW1hbmQsIGEgc2hvcnQgdHJhbnNsYXRhYmxlIHN0cmluZwotICAgKiBpbmRpY2F0aW5nIHdoYXQgdGhlIENvbW1hbmQgZG9lcy4gQ2FuIGJlIG51bGwuCi0gICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIENvbW1hbmQuIENhbiBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQ29tbWFuZC4gQ2FuIGJlIG51bGwuCi0gICAqIEByZXR1cm4gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBDb21tYW5kLiBDYW4gYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCk7Ci0gIAotICAvKioKLSAgICogRXhlY3V0ZXMgdGhlIENvbW1hbmQuCi0gICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgZW52aXJvbm1lbnQuCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUKLSAgICogdG8gd2hpY2ggdGhlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG1ldGhvZCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICogQSB2YWx1ZCBvZiA8Y29kZT5udWxsPC9jb2RlPiwgb3IgYSBTdGF0dXMgd2l0aCBhIHNldmVyaXR5Ci0gICAqIG9mIGxlc3MgdGhhbiA8Y29kZT5TdGF0dXMuRVJST1I8L2NvZGU+IHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKTsKLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiwgYW5kIG9ubHkgaWYsIHRoZSBDb21tYW5kJ3MKLSAgICogPGNvZGU+dW5kbzwvY29kZT4gbWV0aG9kIGlzIHN1cHBvcnRlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBDb21tYW5kIHN1cHBvcnRzIGJlaW5nIHVuZG9uZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUgKCk7Ci0KLSAgLyoqCi0gICAqIFVuZG9lcyB0aGUgQ29tbWFuZC4KLSAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBlbnZpcm9ubWVudC4KLSAgICogTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiBBIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0IGluZGljYXRpbmcgdGhlIGRlZ3JlZQotICAgKiB0byB3aGljaCB0aGUgPGNvZGU+dW5kbzwvY29kZT4gbWV0aG9kIHdhcyBzdWNjZXNzZnVsLgotICAgKiBBIHZhbHVkIG9mIDxjb2RlPm51bGw8L2NvZGU+LCBvciBhIFN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkKLSAgICogb2YgbGVzcyB0aGFuIDxjb2RlPlN0YXR1cy5FUlJPUjwvY29kZT4gc2lnbmlmaWVzIHN1Y2Nlc3MuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHVuZG8gKCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmLCBhbmQgb25seSBpZiwgdGhlIENvbW1hbmQncwotICAgKiA8Y29kZT5yZWRvPC9jb2RlPiBtZXRob2QgaXMgc3VwcG9ydGVkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIENvbW1hbmQgc3VwcG9ydHMgYmVpbmcgcmVkb25lLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWRvYWJsZSAoKTsKLQotICAvKioKLSAgICogUmUtZXhlY3V0ZXMgdGhlIENvbW1hbmQuCi0gICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgZW52aXJvbm1lbnQuCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUKLSAgICogdG8gd2hpY2ggdGhlIDxjb2RlPnJlZG88L2NvZGU+IG1ldGhvZCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICogQSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiwgb3IgYSBTdGF0dXMgd2l0aCBhIHNldmVyaXR5Ci0gICAqIG9mIGxlc3MgdGhlbiA8Y29kZT5TdGF0dXMuRVJST1I8L2NvZGU+IHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyByZWRvICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL0NvbW1hbmRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9Db21tYW5kRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhkZjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL0NvbW1hbmRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gY3JlYXRlIENvbW1hbmQgb2JqZWN0cy4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEZhY3RvcnkgCi17Ci0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgY3JlYXRlZCBDb21tYW5kIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBDb21tYW5kIGNyZWF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvQ29tbWFuZE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL0NvbW1hbmRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTY1NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvQ29tbWFuZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7Ci0KLS8qKgotICogQ29tbWFuZE1hbmFnZXJzIGhlbHAgbWFuYWdlIHRoZSBsaWZlY3ljbGUgb2YgQ29tbWFuZHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZE1hbmFnZXIKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIENvbW1hbmRNYW5hZ2VyIGlzIGNhcGFibGUgb2YgdW5kb2luZwotICAgKiBDb21tYW5kcy4gU29tZSBDb21tYW5kTWFuYWdlcnMgYW5kIEVudmlyb25tZW50cyBtYXkgYmUgb2YKLSAgICogYSBzb3J0IHRoYXQgd2lsbCBuZXZlciB1bmRvKCkgQ29tbWFuZHMuIENvbW1hbmQuZXhlY3V0ZSgpCi0gICAqIG1ldGhvZHMgc2hvdWxkIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIHRvIG9wdGltaXplCi0gICAqIG91dCBhbnkgY2FjaGluZyBsb2dpYyB3aGVuZXZlciB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvRW5hYmxlZCAoKTsKLQotICAvLyBUaGVyZSdzIHByb2JhYmx5IG1vcmUsIGxpa2UgZmFjdG9yeSBtZXRob2RzIGZvciBjcmVhdGluZwotICAvLyBVbmRvL1JlZG8gc3RhY2tzIGFuZCBzdHVmZiBsaWtlIHRoYXQuCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9NdWx0aUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL011bHRpQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGFiNWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL011bHRpQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBncm91cCBtdWx0aXBsZSBDb21tYW5kcyB0b2dldGhlcgotICogaW50byBhIHNpbmdsZSBzZXF1ZW5jZSBsaXN0IG9mIGNvbW1hbmRzIHRvIGV4ZWN1dGUuCi0gKgotICoKLSAqLwotcHVibGljIGNsYXNzIE11bHRpQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLQkgIAotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgICAgICAgID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBMaXN0ICAgICAgICAgICAgY29tbWFuZHNfICAgICAgPSBuZXcgTGlua2VkTGlzdCgpOwotICBwcml2YXRlIENvbW1hbmRbXSAgICAgICBjb21tYW5kc0FycmF5XyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBNdWx0aUNvbW1hbmQgd2l0aCBubyBuYW1lLCBkZXNjcmlwdGlvbiwgb3IgbGlzdCBvZiBjb21tYW5kcy4KLSAgICoKLSAgICovCi0gIHB1YmxpYyBNdWx0aUNvbW1hbmQgKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBNdXRpbENvbW1hbmRzIHdpdGggYW4gZW1wdHkgbGlzdCBvZiBjb21tYW5kcy4KLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLgotICAgKi8KLSAgcHVibGljIE11bHRpQ29tbWFuZCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24gKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIE11bHRpQ29tbWFuZAotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZC4KLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQuCi0gICAqIEBwYXJhbSBjb21tYW5kcyBhbiBpbml0aWFsIGxpc3Qgb2YgdGhlIGNvbW1hbmRzIHRvIGV4ZWN1dGUuCi0gICAqLwotICBwdWJsaWMgTXVsdGlDb21tYW5kICggU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgQ29tbWFuZFtdIGNvbW1hbmRzICkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIGNvbW1hbmRzXy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21tYW5kcykpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBjb21tYW5kIHRvIHRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIGV4ZWN1dGUuCi0gICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIGFkZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZCAoIENvbW1hbmQgY29tbWFuZCApCi0gIHsKLSAgICBjb21tYW5kc0FycmF5XyA9IG51bGw7Ci0gICAgY29tbWFuZHNfLmFkZChjb21tYW5kKTsKLSAgfQotCi0gIC8qKgotICAgKiAgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNnZXROYW1lKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUgOiAoY29tbWFuZHNfLnNpemUoKSA+IDAgPyAoKENvbW1hbmQpY29tbWFuZHNfLmdldCgwKSkuZ2V0TmFtZSgpIDogbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNnZXREZXNjcmlwdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRpb24gIT0gbnVsbCA/IGRlc2NyaXB0aW9uIDogKGNvbW1hbmRzXy5zaXplKCkgPiAwID8gKChDb21tYW5kKWNvbW1hbmRzXy5nZXQoMCkpLmdldERlc2NyaXB0aW9uKCkgOiBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlcyB0aGUgbGlzdCBvZiBjb21tYW5kcyBpbiB0aGUgTXVsdGlDb21tYW5kLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgQ29tbWFuZFtdIGNvbW1hbmRzID0gY29tbWFuZHNBcnJheSgpOwotICAgIGZvciAoaW50IGk9MDsgaTxjb21tYW5kcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBjb21tYW5kc1tpXS5leGVjdXRlKGVudmlyb25tZW50KTsKLSAgICAgIAotICAgICAgaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5tYXRjaGVzKFN0YXR1cy5FUlJPUikpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaS0tOyBpPj0wOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kc1tpXS51bmRvKGVudmlyb25tZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbW1hbmQgaXMgdW5kb2FibGUuICBJZiBvbmUgb2YgdGhlIGNvbW1hbmRzCi0gICAqIGluIHRoZSBsaXN0IGlzIHVuZG9hYmxlIHRoZSBlbnRpcmUgbGlzdCBpcyBjb25zaWRlcmVkIHRvIGJlIAotICAgKiB1bmRvYWJsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUgKCkKLSAgewotICAgIExpc3RJdGVyYXRvciBpID0gY29tbWFuZHNfLmxpc3RJdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc1ByZXZpb3VzKCkpCi0gICAgewotICAgICAgaWYgKCEoKENvbW1hbmQpaS5wcmV2aW91cygpKS5pc1VuZG9hYmxlKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogVW5kb3MgdGhpcyBjb21tYW5kIGlmIGl0IGNhbi4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyAoIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBudWxsOwotICAgIExpc3RJdGVyYXRvciBpID0gY29tbWFuZHNfLmxpc3RJdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc1ByZXZpb3VzKCkpCi0gICAgewotICAgICAgc3RhdHVzID0gKChDb21tYW5kKWkucHJldmlvdXMoKSkudW5kbyhlbnZpcm9ubWVudCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29tbWFuZCBpcyByZWRvYWJsZSBvciBub3QuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlZG9hYmxlICgpCi0gIHsKLSAgICBMaXN0SXRlcmF0b3IgaSA9IGNvbW1hbmRzXy5saXN0SXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgaWYgKCEoKENvbW1hbmQpaS5uZXh0KCkpLmlzUmVkb2FibGUoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWV4ZWN1dGVzIHRoaXMgY29tbWFuZC4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgcmVkbyAoIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBudWxsOwotICAgIENvbW1hbmRbXSBjb21tYW5kcyA9IGNvbW1hbmRzQXJyYXkoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y29tbWFuZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgc3RhdHVzID0gY29tbWFuZHNbaV0ucmVkbyhlbnZpcm9ubWVudCk7Ci0gICAgICBpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLm1hdGNoZXMoU3RhdHVzLkVSUk9SKSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpLS07IGk+PTA7IGktLSkKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmRzW2ldLnVuZG8oZW52aXJvbm1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgQ29tbWFuZFtdIGNvbW1hbmRzQXJyYXkgKCkKLSAgewotICAgIGlmIChjb21tYW5kc0FycmF5XyA9PSBudWxsKQotICAgIHsKLSAgICAgIGNvbW1hbmRzQXJyYXlfID0gKENvbW1hbmRbXSljb21tYW5kc18udG9BcnJheShuZXcgQ29tbWFuZFswXSk7Ci0gICAgfQotICAgIHJldHVybiBjb21tYW5kc0FycmF5XzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvU2ltcGxlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvU2ltcGxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjMwY2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL1NpbXBsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21tYW5kIGludGVyZmFjZSB0aGF0IHN1YmNsYXNzCi0gKiBjYW4gZXh0ZW5kLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVfOwotICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbl87Ci0gIAotICBwdWJsaWMgU2ltcGxlQ29tbWFuZCggU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiApCi0gIHsKLSAgICBuYW1lXyAgICAgICAgPSBuYW1lOwotICAgIGRlc2NyaXB0aW9uXyA9IGRlc2NyaXB0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgU2ltcGxlQ29tbWFuZCgpCi0gIHsgIAotICAgIG5hbWVfICAgICAgICA9ICIiOwotICAgIGRlc2NyaXB0aW9uXyA9ICIiOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoIFN0cmluZyBuYW1lICkKLSAgewotICAgIG5hbWVfID0gbmFtZTsgIAotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQuCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbiggU3RyaW5nIGRlc2NyaXB0aW9uICkKLSAgewotICAgIGRlc2NyaXB0aW9uXyA9IGRlc2NyaXB0aW9uOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5FbnZpcm9ubWVudCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbWFuZC5Db21tYW5kI2dldERlc2NyaXB0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uXzsKLSAgfQotCi0gIC8qKikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbWFuZC5Db21tYW5kI2dldE5hbWUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotICAKLSAgLyoqKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tYW5kLkNvbW1hbmQjaXNSZWRvYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlZG9hYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tYW5kLkNvbW1hbmQjaXNVbmRvYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9hYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tYW5kLkNvbW1hbmQjcmVkbyhvcmcuZWNsaXBzZS5lbnYuY29tbW9uLkVudmlyb25tZW50KQotICAgKi8KLSAgcHVibGljIFN0YXR1cyByZWRvKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbWFuZC5Db21tYW5kI3VuZG8ob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5FbnZpcm9ubWVudCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vQ2hvaWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vQ2hvaWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzY2M5YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0Nob2ljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLXB1YmxpYyBjbGFzcyBDaG9pY2UgewotCi0gIAlwcm90ZWN0ZWQgY2hhciBzaG9ydGN1dCA9ICcgJzsgCi0JcHJvdGVjdGVkIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0gIAlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLSAgCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi0JICovCi0JcHVibGljIENob2ljZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2hvaWNlLgotCSAqIEBwYXJhbSBzaG9ydGN1dAotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBDaG9pY2UoY2hhciBzaG9ydGN1dCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMuc2hvcnRjdXQgPSBzaG9ydGN1dDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2hvaWNlLgotCSAqIEBwYXJhbSBzaG9ydGN1dAotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBDaG9pY2UoY2hhciBzaG9ydGN1dCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5zaG9ydGN1dCA9IHNob3J0Y3V0OwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwuCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlc2NyaXB0aW9uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvcnRjdXQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgY2hhcgotCSAqLwotCXB1YmxpYyBjaGFyIGdldFNob3J0Y3V0KCkgewotCQlyZXR1cm4gc2hvcnRjdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvcnRjdXQuCi0JICogQHBhcmFtIHNob3J0Y3V0IFRoZSBzaG9ydGN1dCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydGN1dChjaGFyIHNob3J0Y3V0KSB7Ci0JCXRoaXMuc2hvcnRjdXQgPSBzaG9ydGN1dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9Db25kaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9Db25kaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyZmVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vQ29uZGl0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgYm9vbGVhbiBjb25kaXRpb24gdGhhdCBjYW4gYmUgZXZhbHVhdGVkIGZvciBhbnkgb2JqZWN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmRpdGlvbgotewotICAvKioKLSAgICogVGhpcyByZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBwYXNzZXMgdGhpcyBjb25kaXRpb24uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0Vudmlyb25tZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNDIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBBbiBFbnZpcm9ubWVudCBwcm92aWRlcyB0aGUgbWVhbnMgZm9yIGEgCi0gKiA8b2w+Ci0gKiA8bGk+QSBsb2cgZm9yIHdyaXRpbmcgbWVzc2FnZXMgdG8gYSBsb2dnaW5nIGZhY2lsaXR5LDwvbGk+Ci0gKiA8bGk+QSBwcm9ncmVzcyBtb25pdG9yIGZvciByZWNlaXZpbmcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24sPC9saT4KLSAqIDxsaT5BIHN0YXR1cyBoYW5kbGVyIGZvciByZWNlaXZpbmcgYW5kIHByb2Nlc3Npbmcgc3RhdHVzIHJlcG9ydHMsPC9saT4KLSAqIDxsaT5BIGZhY3RvcnkgZm9yIHRoZSBoYW5kbGluZyBvZiBVUklzIChyZXNvdXJjZXMpLjwvbGk+Ci0gKiA8L29sPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudmlyb25tZW50Ci17Ci0gIC8qKgotICAgKiBSZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS4KLSAgICovCi0gIHB1YmxpYyBMb2cgZ2V0TG9nICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICovCi0gIHB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc3RhdHVzIGhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzSGFuZGxlciBnZXRTdGF0dXNIYW5kbGVyICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgVVJJIGZhY3RvcnkuCi0gICAqIEhpbnQ6IEltcGxlbWVudGVycyBzaG91bGQgaW5zdXJlIHRoYXQgdGhlIEZhY3RvcnkgdGhleSByZXR1cm4KLSAgICogaGFzIGEgcmVmZXJlbmNlIHRvIHRoaXMgRW52aXJvbm1lbnQgc28gdGhhdCBVUkkgb2JqZWN0cyBjYW4KLSAgICogcmVwb3J0IHByb2dyZXNzIGFuZCBhbm5vdW5jZSBzdGF0dXMuCi0gICAqLwotICBwdWJsaWMgVVJJRmFjdG9yeSBnZXRVUklGYWN0b3J5ICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgY29tcGlsZXIgYXBwcm9wcmlhdGUgdG8gdGhlIGVudmlyb25tZW50LgotICAgKi8KLSAgcHVibGljIEphdmFDb21waWxlciBnZXRKYXZhQ29tcGlsZXIgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgaGVscHMgbWFuYWdlIGV4ZWN1dGlvbi91bmRvaW5nIG9mIENvbW1hbmRzLgotICAgKi8KLSAgcHVibGljIENvbW1hbmRNYW5hZ2VyIGdldENvbW1hbmRNYW5hZ2VyICgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0Vudmlyb25tZW50RXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vRW52aXJvbm1lbnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxNWI2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vRW52aXJvbm1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgY29uZGl0aW9ucyByYWlzZWQgYnkgdGhlIEVudmlyb25tZW50LgotICovCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgLyoqCi0gICAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTc4OTgzMjc1ODk5NDAyMDM2TDsKLSAgCi0gIHByb3RlY3RlZCBTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IEVudmlyb25tZW50RXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIEVudmlyb25tZW50RXhjZXB0aW9uICgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgRW52aXJvbm1lbnRFeGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgRW52aXJvbm1lbnRFeGNlcHRpb24gKCBTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIHN1cGVyKHN0YXR1cyA9PSBudWxsID8gbnVsbCA6IHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFN0YXR1cyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vRXZhbHVhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9FdmFsdWF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzg1OTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9FdmFsdWF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICAqIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHdoZW4gYSBjb25kaXRpb25hbCBvYmplY3QgbmVlZHMgdG8gYmUgcmV0dXJuZWQuCi0qKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXZhbHVhdGUKLXsKLSAgLyoqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgYW4gb2JqZWN0IGJhc2VkIG9uIHNvbWUgZXZhbHVhdGVkIGNvbmRpdGlvbi4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9KYXZhQ29tcGlsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9KYXZhQ29tcGlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxMGQ2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vSmF2YUNvbXBpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUkk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhbiBvYmplY3QgdGhhdCBkb2VzIEphdmEgY29tcGlsYXRpb24KLSAqIG9mIGEgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNvbXBpbGVyCi17Ci0gIC8qKgotICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gSmF2YSBmaWxlIHRvIHRoZSBnaXZlbiBjbGFzcyBmaWxlLAotICAgKiB1c2luZyBjb250ZXh0IGluZm9ybWF0aW9uIG9uIGNsYXNzcGF0aHMsIG9wdGlvbnMsIGV0Yy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbXBpbGUgKCBVUkkgamF2YVVyaSwgVVJJIGNsYXNzVXJpLCBKYXZhQ29tcGlsZXJDb250ZXh0IGNvbnRleHQgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9KYXZhQ29tcGlsZXJDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vSmF2YUNvbXBpbGVyQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmM5NzU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9KYXZhQ29tcGlsZXJDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRhdGEKLSAqIHJlcXVpcmVkIGJ5IEphdmFDb21waWxlci5jb21waWxlKCkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNvbXBpbGVyQ29udGV4dAotewotICAvLyBUQkQuLi4KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9Mb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9Mb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxOGM4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICogTG9nIG9iamVjdHMgcHJvdmlkZSBhIG1lYW5zIGZvciBsb2dnaW5nIGluZm9ybWF0aW9uIGZvciBGRkRDIGV0Yy4KLSAqLwotcHVibGljIGludGVyZmFjZSBMb2cKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gNDsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZC4KLSAgICogVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgYXR0ZW1wdGluZwotICAgKiBhIGNhbGwgdG8gb25lIG9mIHRoZSA8Y29kZT5sb2c8L2NvZGU+IG1ldGhvZHMsIGFzIHRoZXkgd2lsbAotICAgKiBxdWlldGx5IGRvIG5vdGhpbmcgaWYgbG9nZ2luZyBpcyBkaXNhYmxlZC4gVGhpcyBtZXRob2QgY2FuIGJlCi0gICAqIHVzZWZ1bCwgaG93ZXZlciwgYW55d2hlcmUgdGhlIGNvc3Qgb2YgYnVpbGRpbmcgdXAgdGhlIHBhcmFtZXRlcnMKLSAgICogdG8gYSBsb2cgbWV0aG9kIG1pZ2h0IGJlIGhpZ2ggYW5kIGJlc3QgYXZvaWRlZCBleGNlcHQgd2hlbiBsb2dnaW5nCi0gICAqIGlzIGVuYWJsZWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBsb2dnaW5nIGlzIGVuYWJsZWQsIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQgKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0aGUgZGVidWcgb3B0aW9uIGlzIHNldCB0byB0cnVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkIChTdHJpbmcgb3B0aW9uKTsKLQotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgVGhyb3dhYmxlIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUgKTsKLSAgCi0gIC8qKgotICAgKiBMb2dzIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIGRlYnVnIG9wdGlvbgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgVGhyb3dhYmxlIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUgKTsKLQotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgU3RhdHVzIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFN0YXR1cyBzdGF0dXMgKTsKLSAgCi0gIC8qKgotICAgKiBMb2dzIGEgPGNvZGU+U3RhdHVzPC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIGRlYnVnIG9wdGlvbgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIFN0YXR1cyB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBTdGF0dXMgc3RhdHVzICk7Ci0KLSAgLyoqCi0gICAqIExvZ3MgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIG1lc3NhZ2VOdW0gIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBPYmplY3QgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCApOwotICAKLSAgLyoqCi0gICAqIExvZ3MgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIGRlYnVnIG9wdGlvbgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIE9iamVjdCB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0ICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vTWVzc2FnZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vTWVzc2FnZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNmU2MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL01lc3NhZ2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjb252aWVuZW50IHdheSB0byBhY2Nlc3MgcmVzb3VyY2UgYnVuZGxlcyBhbmQKLSAqIHJldGlldmUgdHJhbnNsYXRlZCBzdHJpbmdzLgotICoKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlVXRpbHMKLXsKLSAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZV87Ci0gIAotICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgYnVuZGxlc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBidW5kbGVJZCB0aGUgcmVzb3VyY2UgYnVuZGxlIElELgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBjbGFzcyBsb2FkZXIgZm9yIHRoaXMgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byByZXRyaWV2ZQotICAgKiAgICAgICAgICAgICAgIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVV0aWxzKCBTdHJpbmcgYnVuZGxlSWQsIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgdGhpcyggYnVuZGxlSWQsIG9iamVjdC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gYnVuZGxlSWQgdGhlIHJlc291cmNlIGJ1bmRsZSBJRC4KLSAgICogQHBhcmFtIGxvYWRlciB0aGUgY2xhc3MgbG9hZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJldHJpZXZlCi0gICAqICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVXRpbHMoIFN0cmluZyBidW5kbGVJZCwgQ2xhc3NMb2FkZXIgbG9hZGVyICkKLSAgewotICAgIHJlc291cmNlXyA9IChSZXNvdXJjZUJ1bmRsZSlidW5kbGVzXy5nZXQoIGJ1bmRsZUlkICk7Ci0gICAgCi0gICAgaWYoIHJlc291cmNlXyA9PSBudWxsICkKLSAgICB7Ci0gICAgICByZXNvdXJjZV8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIGJ1bmRsZUlkLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLCBsb2FkZXIgKTsKLSAgICAgIGJ1bmRsZXNfLnB1dCggYnVuZGxlSWQsIHJlc291cmNlXyApOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgZm9yIHRoZSBzdHJpbmcgdG8gcmV0cmlldmUuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgdHJhbnNsYXRlZCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLSAgewotICAgIFN0cmluZyB2YWx1ZSA9IGtleTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHJlc291cmNlXy5nZXRTdHJpbmcoIGtleSApOyAKLSAgICB9Ci0gICAgY2F0Y2goIFRocm93YWJsZSBleGMgKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBmb3IgdGhlIHN0cmluZyB0byByZXRyaWV2ZS4KLSAgICogQHBhcmFtIGFyZ3MgVGhlc2UgYXJndW1lbnRzIHdpbGwgYmUgc3Vic3RpdHV0ZWQgaW50byB0aGUgdHJhbnNsYXRlZCBzdHJpbmcuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgdHJhbnNsYXRlZCBzdHJpbmcgd2l0aCBhbnkgc3Vic3RpdHV0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBnZXRNZXNzYWdlKGtleSksYXJncyApOwotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL051bGxQcm9ncmVzc01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9OdWxsUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWQzYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL051bGxQcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uOwotCi0vKioKLSAqICBBIFByb2dyZXNzTW9uaXRvciB0aGF0IGRvZXMgbm90aGluZy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsUHJvZ3Jlc3NNb25pdG9yIGltcGxlbWVudHMgUHJvZ3Jlc3NNb25pdG9yCi17Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yI2dldENoaWxkUHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgUHJvZ3Jlc3NNb25pdG9yIGdldENoaWxkUHJvZ3Jlc3NNb25pdG9yKCkgCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvciNpc0NhbmNlbFJlcXVlc3RlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxSZXF1ZXN0ZWQoKSAKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvciNyZXBvcnQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoU3RyaW5nIHByb2dyZXNzKSAKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL051bGxTdGF0dXNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vTnVsbFN0YXR1c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyNGM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vTnVsbFN0YXR1c0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uOwotCi1wdWJsaWMgY2xhc3MgTnVsbFN0YXR1c0hhbmRsZXIgaW1wbGVtZW50cyBTdGF0dXNIYW5kbGVyCi17Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzLCBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLkNob2ljZVtdKQotICAgKi8KLSAgcHVibGljIENob2ljZSByZXBvcnQoU3RhdHVzIHN0YXR1cywgQ2hvaWNlW10gY2hvaWNlcykgCi0gIHsKLSAgCUNob2ljZSByZXN1bHQgPSBudWxsOwotICAJCi0gIAkvLyBBbHdheXMgdGFrZSB0aGUgZmlyc3QgY2hvaWNlIGlmIGF2YWlsYWJsZS4KLSAgICBpZiggY2hvaWNlcyAhPSBudWxsICYmIGNob2ljZXMubGVuZ3RoID4gMCApCi0gICAgewotICAgIAlyZXN1bHQgPSBjaG9pY2VzWzBdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydChTdGF0dXMgc3RhdHVzKSB0aHJvd3MgU3RhdHVzRXhjZXB0aW9uCi0gIHsKLSAgfQotICAKLSAgLyoKLSAgICogUmVwb3J0IGEgd2FybmluZy4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiByZXBvcnRXYXJuaW5nKFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICAqIFJlcG9ydCBhbmQgZXJyb3IuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0RXJyb3JTdGF0dXMoU3RhdHVzIHN0YXR1cykKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICByZXBvcnRFcnJvclN0YXR1cyggc3RhdHVzICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8ob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oU3RhdHVzIHN0YXR1cykKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzE1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1Byb2dyZXNzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvZ3Jlc3NNb25pdG9yCi17Ci0gIC8qKgotICAgKiBSZXBvcnRzIHByb2dyZXNzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0ICggU3RyaW5nIHByb2dyZXNzICk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgcHJvZ3Jlc3MgbW9uaXRvciB0aGF0IHdpbGwgcmVjb3JkIHByb2dyZXNzCi0gICAqIG1lc3NhZ2VzIGFzICJjaGlsZHJlbiIgb2YgdGhlIG1lc3NhZ2UgbW9zdCByZWNlbnRseSByZXBvcnRlZAotICAgKiB0aHJ1IHRoZSBwYXJlbnQgbW9uaXRvci4KLSAgICovCi0gIHB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0Q2hpbGRQcm9ncmVzc01vbml0b3IgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaGFzIHJlcXVlc3RlZCBjYW5jZWxsYXRpb24KLSAgICogb2YgdGhlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4gSXQgaXMgZW50aXJlbHkgdXAgdG8gYSBDb21tYW5kCi0gICAqIHRvIGRlY2lkZSBpZiwgYW5kIHdoZW4sIHRvIGNvbnN1bHQgdGhpcyBtZXRob2QuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbFJlcXVlc3RlZCAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9SYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMGI0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUkk7Ci0KLS8qKgotICogQ2FycmllcyBwb3NpdGlvbiBpbmZvcm1hdGlvbiB3aXRoaW4gYSByZXNvdXJjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBSYW5nZQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gLTE7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlIHRoZSByYW5nZSBhcHBsaWVzIHRvLgotICAgKi8KLSAgcHVibGljIFVSSSBnZXRVUkkgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluZGV4LCB6ZXJvLWluZGV4ZWQsIG9mIHRoZSBmaXJzdCBsaW5lCi0gICAqIG9mIHRoZSByYW5nZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U3RhcnRpbmdMaW5lTnVtYmVyICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmRleCwgemVyby1pbmRleGVkLCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAqIG9mIHRoZSByYW5nZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgotICAgKi8KLSAgcHVibGljIGludCBnZXRTdGFydGluZ0NoYXJOdW1iZXJJbkxpbmUgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluZGV4LCB6ZXJvLWluZGV4ZWQsIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICogb2YgdGhlIHJhbmdlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0YXJ0aW5nQ2hhck51bWJlckluVVJJICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmRleCwgemVyby1pbmRleGVkLCBvZiB0aGUgbGFzdCBsaW5lCi0gICAqIG9mIHRoZSByYW5nZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RW5kaW5nTGluZU51bWJlciAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgb2Zmc2V0LCB6ZXJvLWluZGV4ZWQsIG9mIHRoZSBsYXN0IGNoYXJhY3RlcgotICAgKiBvZiB0aGUgcmFuZ2UgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RW5kaW5nQ2hhck51bWJlckluTGluZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5kZXgsIHplcm8taW5kZXhlZCwgb2YgdGhlIGxhc3QgY2hhcmFjdGVyCi0gICAqIG9mIHRoZSByYW5nZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRFbmRpbmdDaGFyTnVtYmVySW5VUkkgKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vUmFuZ2VWZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9SYW5nZVZlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjA4Njg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9SYW5nZVZlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFRoaXMgVmVjdG9yIG1ha2VzIHRoZSBwcm90ZWN0ZWQgbWV0aG9kIHJlbW92ZVJhbmdlIHB1YmxpYy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSYW5nZVZlY3RvciBleHRlbmRzIFZlY3RvcgotewotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQwNDg3OTM0NzY2NTkyMzA3NzNMOwotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVJhbmdlKCBpbnQgc3RhcnQsIGludCBlbmQgKQotICB7Ci0gICAgc3VwZXIucmVtb3ZlUmFuZ2UoIHN0YXJ0LCBlbmQgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1NpbXBsZVN0YXR1cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1NpbXBsZVN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWIzNjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9TaW1wbGVTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBBIHVzdWFsbHkgc3VmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBTdGF0dXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdGF0dXMgaW1wbGVtZW50cyBTdGF0dXMKLXsKLSAgCi0gIHByaXZhdGUgTGlzdCBjaGlsZHJlbl8gPSBuZXcgTGlua2VkTGlzdCgpOwotICBwcml2YXRlIFN0cmluZyBpZF87Ci0gIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VfOwotICBwcml2YXRlIGludCBzZXZlcml0eV87Ci0gIHByaXZhdGUgVGhyb3dhYmxlIHRocm93YWJsZV87Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBTaW1wbGVTdGF0dXMuCi0gICAqIEBwYXJhbSBpZAotICAgKi8KLSAgcHVibGljIFNpbXBsZVN0YXR1cyAoIFN0cmluZyBpZCApCi0gIHsKLSAgICB0aGlzKGlkLCIiLE9LLG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBTaW1wbGVTdGF0dXMuCi0gICAqIEBwYXJhbSBpZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiBAcGFyYW0gc2V2ZXJpdHkKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVTdGF0dXMgKCBTdHJpbmcgaWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHkgKQotICB7Ci0gICAgdGhpcyhpZCxtZXNzYWdlLHNldmVyaXR5LG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBTaW1wbGVTdGF0dXMuCi0gICAqIEBwYXJhbSBpZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiBAcGFyYW0gY2hpbGRyZW4KLSAgICovCi0gIHB1YmxpYyBTaW1wbGVTdGF0dXMgKCBTdHJpbmcgaWQsIFN0cmluZyBtZXNzYWdlLCBTdGF0dXNbXSBjaGlsZHJlbiApCi0gIHsKLSAgICB0aGlzKGlkLG1lc3NhZ2UsT0ssbnVsbCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGNoaWxkcmVuXy5hZGQoY2hpbGRyZW5baV0pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgU2ltcGxlU3RhdHVzLgotICAgKiBAcGFyYW0gaWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogQHBhcmFtIHNldmVyaXR5Ci0gICAqIEBwYXJhbSB0aHJvd2FibGUKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVTdGF0dXMgKCBTdHJpbmcgaWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFRocm93YWJsZSB0aHJvd2FibGUgKQotICB7Ci0gICAgaWRfID0gaWQ7Ci0gICAgbWVzc2FnZV8gPSBtZXNzYWdlOwotICAgIHNldmVyaXR5XyA9IHNldmVyaXR5OwotICAgIHRocm93YWJsZV8gPSB0aHJvd2FibGU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBTdGF0dXMjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKQotICB7Ci0gICAgcmV0dXJuIGlkXzsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIFN0YXR1cyNnZXRNZXNzYWdlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgU3RhdHVzI2dldFNldmVyaXR5KCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkgKCkKLSAgewotICAgIGludCBzZXZlcml0eSA9IHNldmVyaXR5XzsKLSAgICBpZiAoY2hpbGRyZW5fLnNpemUoKSA+IDApCi0gICAgewotICAgICAgSXRlcmF0b3IgaSA9IGNoaWxkcmVuXy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdGF0dXMgc3RhdHVzID0gKFN0YXR1cylpLm5leHQoKTsKLSAgICAgICAgaW50IGNoaWxkU2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLSAgICAgICAgaWYgKGNoaWxkU2V2ZXJpdHkgPiBzZXZlcml0eSkKLSAgICAgICAgewotICAgICAgICAgIHNldmVyaXR5ID0gY2hpbGRTZXZlcml0eTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBTdGF0dXMjZ2V0VGhyb3dhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBUaHJvd2FibGUgZ2V0VGhyb3dhYmxlICgpCi0gIHsKLSAgICByZXR1cm4gdGhyb3dhYmxlXzsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIFN0YXR1cyNoYXNDaGlsZHJlbigpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbiAoKQotICB7Ci0gICAgcmV0dXJuIGNoaWxkcmVuXy5zaXplKCkgPiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgU3RhdHVzI2dldENoaWxkcmVuKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXNbXSBnZXRDaGlsZHJlbiAoKQotICB7Ci0gICAgcmV0dXJuIChTdGF0dXNbXSljaGlsZHJlbl8udG9BcnJheShuZXcgU3RhdHVzWzBdKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIFN0YXR1cyNtYXRjaGVzKGludCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIG1hdGNoZXMgKCBpbnQgbWFzayApCi0gIHsKLSAgICByZXR1cm4gKGdldFNldmVyaXR5KCkgfCBtYXNrKSAhPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBhZGRDaGlsZC4KLSAgICogQHBhcmFtIHN0YXR1cwotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ2hpbGQgKCBTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIGNoaWxkcmVuXy5hZGQoc3RhdHVzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1N0YXR1cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1N0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGU4YWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uOwotCi0vKioKLSAqIENhcnJpZXMgc3RhdHVzIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1cwotewotICAvKioKLSAgICogU3RhdHVzOiBFdmVyeXRoaW5nIGlzIGZpbmUsIGFuZCB0aGVyZSBhcmUgbm8gbWVzc2FnZXMgb3IgZGV0YWlscy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gMDsKLQotICAvKioKLSAgICogU3RhdHVzOiBFdmVyeXRoaW5nIGlzIGZpbmUsIGJ1dCB0aGVyZSBpcyBpbmZvcm1hdGlvbiB0byByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gMTsKLQotICAvKioKLSAgICogU3RhdHVzOiBUaGluZ3MgYXJlIHdvcmtpbmcsIGJ1dCBwb3NzaWJseSBub3QgYXMgZXhwZWN0ZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMjsKLQotICAvKioKLSAgICogU3RhdHVzOiBCbGFtbW8uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDQ7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBub24tdHJhbnNsYXRlZCBhcHBsaWNhdGlvbiBzcGVjaWZpYyBpZGVudGlmaWVyLgotICAgKiBNYXkgcmV0dXJuIG51bGwuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgdHJhbnNsYXRlZCAobG9jYWxlLXNlbnNpdGl2ZSkgbWVzc2FnZS4KLSAgICogTWF5IHJldHVybiBudWxsLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZXZlcml0eS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gZXhjZXB0aW9uICh0aHJvd2FibGUpIGJlaGluZCB0aGUgc3RhdHVzLCBpZiBhbnkuCi0gICAqIE1heSByZXR1cm4gbnVsbC4KLSAgICovCi0gIHB1YmxpYyBUaHJvd2FibGUgZ2V0VGhyb3dhYmxlICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdGF0dXMgb2JqZWN0IGhhcyBjaGlsZCBzdGF0dXMgb2JqZWN0cy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbW1lZGlhdGUgY2hpbGQgU3RhdHVzIG9iamVjdHMgb2YgdGhpcyBvYmplY3QuCi0gICAqIE5ldmVyIHJldHVybnMgbnVsbCwgYnV0IG1heSByZXR1cm4gYSB6ZXJvLWxlbmd0aCBhcnJheS4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXNbXSBnZXRDaGlsZHJlbiAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RhdHVzJyBzZXZlcml0eSBtYXRjaGVzIHRoZSBzZXZlcml0eQotICAgKiBtYXNrIHBhc3NlZCBpbi4gU3RyaWN0bHkgc3BlYWtpbmc6Ci0gICAqIHRoaXMubWF0Y2hlcyh0aGF0KSA9PSAodGhpcy5nZXRTZXZlcml0eSgpIHwgdGhhdCAhPSAwKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyAoIGludCBtYXNrICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vU3RhdHVzRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vU3RhdHVzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNWJjNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1N0YXR1c0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIHVzZWQgYnkgU3RhdHVzSGFuZGxlcnMgdG8gdGVsbCB0aGVpcgotICogY2FsbGVycyB0aGF0IHByb2Nlc3Npbmcgc2hvdWxkIHN0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0dXNFeGNlcHRpb24gZXh0ZW5kcyBFbnZpcm9ubWVudEV4Y2VwdGlvbgotewotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICogKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzYxODE0MTE2MDMyMjExOTk5Mkw7Ci0KLSAgLyoqCi0gICAqIFRoZSBDaG9pY2UgdGhhdCBsZWFkIHRvIHRoZSBleGNlcHRpb24gYmVpbmcgdGhyb3duLAotICAgKiBpZiBhbnkgKGllLiBtYXkgYmUgbnVsbCkuCi0gICAqLwotICBwcm90ZWN0ZWQgQ2hvaWNlIGNob2ljZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gU3RhdHVzLgotICAgKi8KLSAgcHVibGljIFN0YXR1c0V4Y2VwdGlvbiggU3RhdHVzIHN0YXR1cyApCi0gIHsKLSAgICBzdXBlciggc3RhdHVzICk7ICAKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIENob2ljZS4KLSAgICogVGhlIENob2ljZSBtYXkgYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXNFeGNlcHRpb24gKCBDaG9pY2UgY2hvaWNlICkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5jaG9pY2UgPSBjaG9pY2U7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlCi0gICAqIGFuZCBzdGF0dXMgb2JqZWN0LiBUaGUgQ2hvaWNlIG1heSBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIFN0YXR1c0V4Y2VwdGlvbiAoIFN0YXR1cyBzdGF0dXMsIENob2ljZSBjaG9pY2UgKQotICB7Ci0gICAgc3VwZXIoc3RhdHVzKTsKLSAgICB0aGlzLmNob2ljZSA9IGNob2ljZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBDaG9pY2Ugb2JqZWN0IGluc2lkZSB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgZ2V0Q2hvaWNlICgpCi0gIHsKLSAgICByZXR1cm4gY2hvaWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vU3RhdHVzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1N0YXR1c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0YjMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICogUHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSAqIGluZGljYXRpb24gb2YgY2hvaWNlcyBtYWRlIGJ5IHRoZSByZWNpcGllbnQgb2YgdGhlIHN0YXR1cyBhbmQKLSAqIG1heSByYWlzZSBhbiBleGNlcHRpb24gYWdhaW5zdCB0aGUgY2FsbGVyIHRvIGhhdmUgdGhlbSBhYm9ydAotICogcHJvY2VzaW5nLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1c0hhbmRsZXIKLXsKLSAgLyoqCi0gICAqIFJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy4KLSAgICogUmV0dXJucyB0aGUgY2hvaWNlIG1hZGUgYnkgdGhlIGhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgQ2hvaWNlIHJlcG9ydCAoIFN0YXR1cyBzdGF0dXMsIENob2ljZVtdIGNob2ljZXMgKTsKLSAgCi0gIC8qKgotICAgKiBSZXBvcnRzIHRoZSBnaXZlbiBTdGF0dXMgd2l0aCBpbXBsaWVkIG9wdGlvbnMgdG8gZWl0aGVyCi0gICAqIGNvbnRpbnVlIG9yIGFib3J0LgotICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBoYW5kbGVyIGRlY2lkZXMgdGhlIGNhbGxlcgotICAgKiBzaG91bGQgc3RvcCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0ICggU3RhdHVzIHN0YXR1cyApIHRocm93cyBTdGF0dXNFeGNlcHRpb247Ci0gIAotICAvKioKLSAgICogUmVwb3J0IHRoZSBnaXZlbiBFcnJvciBTdGF0dXMuICBObyB1c2VyIGZlZWRiYWNrIGlzIHByb3ZpZGVkLgotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvciggU3RhdHVzIHN0YXR1cyApOwotICAKLSAgLyoqCi0gICAqIFJlcG9ydCB0aGUgZ2l2ZW4gSW5mbyBTdGF0dXMuICBObyB1c2VyIGZlZWRiYWNrIGlzIHByb3ZpZGVkLgotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRJbmZvKCBTdGF0dXMgc3RhdHVzICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb250ZXh0L0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbnRleHQvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjFjOWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbnRleHQvQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgd2F5IHRvIGdldCBhbmQgc2V0IHByZWZlcmVuY2UgaW5mb3JtYXRpb24uCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgCi17Ci0gLyoqCi0gICogTG9hZHMgdGhlIHByZWZlcmVuY2UgZGF0YSBpbnRvIHRoaXMgQ29udGV4dCBvYmplY3QuCi0gICoKLSAgKi8KLSBwdWJsaWMgdm9pZCBsb2FkKCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBkZWZhdWx0IGZvciBhIGJvb2xlYW4gcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0IChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSk7IAotIAotIC8qKgotICAqIFNldHMgdGhlIGRlZmF1bHQgZm9yIGEgc3RyaW5nIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0RGVmYXVsdCAoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgZGVmYXVsdCBmb3IgYSBpbnQgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0IChTdHJpbmcgbmFtZSwgaW50IHZhbHVlKTsgCi0KLSAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBzdHJpbmcgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRWYWx1ZSAoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgYm9vbGVhbiBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldFZhbHVlIChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSk7Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgaW50IHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0VmFsdWUgKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOyAgIAotCi0gLyoqCi0gICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgc3RyaW5nIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZyAoIFN0cmluZyBuYW1lKTsKLSAKLSAvKioKLSAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBib29sZWFuIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyBib29sZWFuIGdldFZhbHVlQXNCb29sZWFuICggU3RyaW5nIG5hbWUpOwotIAotIC8qKgotICAqIEdldHMgdGhlIHZhbHVlIGZvciBhIGludCBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgaW50IGdldFZhbHVlQXNJbnQgKCBTdHJpbmcgbmFtZSk7ICAJCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9SZXNvdXJjZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbnRleHQvUmVzb3VyY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMGQ3YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9SZXNvdXJjZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dDsKLQotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUNvbnRleHQgCi17Ci0gLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgc3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBvdmVyd3JpdGUgZmlsZXMgZ2VuZXJhbCBwcmVmZXJlbmNlIGZyb20KLSAgICogdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gKiovCi0gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9PVkVSV1JJVEUgPSAiZmlsZXNPdmVyd3JpdGUiOwotCi0gLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgc3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBjcmVhdGUgZm9sZGVycyBnZW5lcmFsIHByZWZlcmVuY2UgZnJvbQotICAgKiB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAqKi8KLSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NSRUFURV9GT0xERVJTID0gImNyZWF0ZUZvbGRlcnMiOwotIAotIC8qKgotICAgKiBUaGlzIGNvbnN0YW50IHN0cmluZyBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgY2hlY2tvdXQgZmlsZXMgZ2VuZXJhbCBwcmVmZXJlbmNlIGZyb20KLSAgICogdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gKiovCi0gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DSEVDS09VVCA9ICJmaWxlc0NoZWNrb3V0IjsKLQotIC8qKgotICAqIAotICAqIEBwYXJhbSBlbmFibGUgc2V0IHdoZXRoZXIgb3ZlcndyaXRpbmcgb2YgZmlsZXMgaXMgZW5hYmxlZC4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQgKCBib29sZWFuIGVuYWJsZSk7Ci0gCi0gLyoqCi0gICogCi0gICogQHJldHVybiByZXR1cm5zIHdoZXRoZXIgb3ZlcndyaXRpbmcgb2YgZmlsZXMgaXMgZW5hYmxlZC4KLSAgKi8KLSBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpOwotIAotIC8qKgotICAqIAotICAqIEBwYXJhbSBlbmFibGUgc2V0IHdoZXRoZXIgY3JlYXRpb24gb2YgZm9sZGVycyBpcyBlbmFibGVkLgotICAqLwotIHB1YmxpYyB2b2lkIHNldENyZWF0ZUZvbGRlcnNFbmFibGVkKCBib29sZWFuIGVuYWJsZSk7Ci0gCi0gLyoqCi0gICogCi0gICogQHJldHVybiByZXR1cm5zIHdoZXRoZXIgY3JlYXRpb24gb2YgZm9sZGVycyBpcyBlbmFibGVkLgotICAqLwotIHB1YmxpYyBib29sZWFuIGlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKTsgCi0gCi0gLyoqCi0gICogCi0gICogQHBhcmFtIGVuYWJsZSBzZXRzIHdoZXRoZXIgYXV0b21hdGljIGNoZWNrb3V0IG9mIGZpbGVzIGlzIGVuYWJsZWQuCi0gICovCi0gcHVibGljIHZvaWQgc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoIGJvb2xlYW4gZW5hYmxlKTsKLSAKLSAvKioKLSAgKiAKLSAgKiBAcmV0dXJuIHJldHVybnMgd2hldGhlciBhdXRvbWF0aWMgY2hlY2tvdXQgb2YgZmlsZXMgaXMgZW5hYmxlZC4KLSAgKi8KLSBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrb3V0RmlsZXNFbmFibGVkKCk7Ci0gCi0gLyoqCi0gICogCi0gICogQHJldHVybiByZXR1cm5zIGEgY29weSBvZiB0aGlzIFJlc291cmNlQ29udGV4dC4KLSAgKi8KLSBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGNvcHkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbnRleHQvUmVzb3VyY2VEZWZhdWx0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9SZXNvdXJjZURlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYzg0YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9SZXNvdXJjZURlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZURlZmF1bHRzCi17Ci0gcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJFTkNFX09WRVJXUklURV9ERUZBVUxUID0gZmFsc2U7Ci0gcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJFTkNFX0NSRUFURV9GT0xERVJTX0RFRkFVTFQgPSB0cnVlOwotIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJFRkVSRU5DRV9DSEVDS09VVF9ERUZBVUxUID0gZmFsc2U7Ci0KLSAvKioKLSAgKiAKLSAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3Igb3ZlcndyaXRpbmcgZmlsZXMuCi0gICovCi0gcHVibGljIHN0YXRpYyBib29sZWFuIGdldE92ZXJ3cml0ZUZpbGVzRGVmYXVsdCAoKQotIHsKLSAJcmV0dXJuIFBSRUZFUkVOQ0VfT1ZFUldSSVRFX0RFRkFVTFQ7Ci0gfQotIAotIC8qKgotICAqIAotICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIG9mciBjcmVhdGluZyBmb2xkZXJzLgotICAqLwotIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDcmVhdGVGb2xkZXJzRGVmYXVsdCAoKQotIHsgCi0JcmV0dXJuIFBSRUZFUkVOQ0VfQ1JFQVRFX0ZPTERFUlNfREVGQVVMVDsKLSB9Ci0KLSAvKioKLSAgKiAKLSAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgY2hlY2tpbmcgb3V0IGZpbGVzLgotICAqLwotIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDaGVja291dEZpbGVzRGVmYXVsdCgpCi0gewotCXJldHVybiBQUkVGRVJFTkNFX0NIRUNLT1VUX0RFRkFVTFQ7Ci0gfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbnRleHQvVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDViNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBSZXNvdXJjZUNvbnRleHQgaW50ZXJmYWNlIHdoZXJlIHRoZSBzdGF0ZQotICogb2YgdGhlIGNvbnRleHQgZGF0YSBpcyB0cmFuc2llbnQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0IGltcGxlbWVudHMgUmVzb3VyY2VDb250ZXh0IAotewotICBwcml2YXRlIGJvb2xlYW4gb3ZlcldyaXRlRmlsZXM7Ci0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVGb2xkZXJzOwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tPdXRGaWxlczsKLQotICBwdWJsaWMgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0KCkgewotICAgIHNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZChSZXNvdXJjZURlZmF1bHRzLmdldE92ZXJ3cml0ZUZpbGVzRGVmYXVsdCgpKTsKLSAgICBzZXRDcmVhdGVGb2xkZXJzRW5hYmxlZChSZXNvdXJjZURlZmF1bHRzLmdldENyZWF0ZUZvbGRlcnNEZWZhdWx0KCkpOwotICAgIHNldENoZWNrb3V0RmlsZXNFbmFibGVkKFJlc291cmNlRGVmYXVsdHMuZ2V0Q2hlY2tvdXRGaWxlc0RlZmF1bHQoKSk7Ci0gIH0KLQotICAvKiogIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0I3NldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZChib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgb3ZlcldyaXRlRmlsZXMgPSBlbmFibGU7Ci0gIH0KLSAgCi0gIC8qKiAgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQjaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIG92ZXJXcml0ZUZpbGVzOwotICB9Ci0KLSAgLyoqICAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dCNzZXRDcmVhdGVGb2xkZXJzRW5hYmxlZChib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICBjcmVhdGVGb2xkZXJzID0gZW5hYmxlOwotICB9Ci0gIAotICAvKiogIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0I2lzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpIHsKLSAgICByZXR1cm4gY3JlYXRlRm9sZGVyczsKLSAgfQotCi0gIC8qKiAgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQjc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENoZWNrb3V0RmlsZXNFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgY2hlY2tPdXRGaWxlcyA9IGVuYWJsZTsKLSAgfQotICAKLSAgLyoqICAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dCNpc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIGNoZWNrT3V0RmlsZXM7Ci0gIH0KLSAgCi0gIC8qKiAgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQjY29weSgpCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGNvcHkoKSB7Ci0gICAgUmVzb3VyY2VDb250ZXh0IGNjID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgIGNjLnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZChpc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKTsKLSAgICBjYy5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZChpc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCkpOwotICAgIGNjLnNldENoZWNrb3V0RmlsZXNFbmFibGVkKGlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSk7Ci0gICAgcmV0dXJuIGNjOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9kYXRhL0RhdGFNYXBwaW5nUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2RhdGEvRGF0YU1hcHBpbmdSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y0MmNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2RhdGEvRGF0YU1hcHBpbmdSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhOwotCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFNYXBwaW5nUmVnaXN0cnkKLXsKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBkYXRhIG1hcHBpbmcgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQKLSAgICogb2JqZWN0LiAgV2hlbiB0aGUgc291cmNlT2JqZWN0IGlzIGVuY291bnRlcmVkIGJ5IHRoZSBmcmFtZXdvcmsgdGhlCi0gICAqIHNvdXJjZVByb3BlcnR5IHdpbGwgYmUgY2FsbGVkIGFuZCB0aGUgZGF0YSB3aWxsIGJlIHBhc3NlZCB0byB0aGUKLSAgICogdGFyZ2V0UHJvcGVydHkgaW4gdGhlIHRhcmdldE9iamVjdC4gIElmIGEgdHJhbnNmb3JtZXIgb2JqZWN0IGlzCi0gICAqIHNwZWNpZmllZCB0aGUgc291cmNlT2JqZWN0IGlzIHRyYW5zZm9ybWVkIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8KLSAgICogdGhlIHRhcmdldCBvYmplY3QuCi0gICAqIAotICAgKiBAcGFyYW0gc291cmNlVHlwZSAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0LgotICAgKiBAcGFyYW0gc291cmNlUHJvcGVydHkgIFRoZSBzb3VyY2UgcHJvcGVydHkuCi0gICAqIEBwYXJhbSB0YXJnZXRUeXBlICAgICAgVGhlIHRhcmdldCBvYmplY3QuCi0gICAqIEBwYXJhbSB0YXJnZXRQcm9wZXJ0eSAgVGhlIHRhcmdldCBwcm9wZXJ0eS4KLSAgICogQHBhcmFtIHRyYW5zZm9ybWVyICAgICBUaGUgdHJhbnNmb3JtZXIgb2JqZWN0IHRoYXQgdHJhbnNmb3JtcyB0aGUKLSAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoIENsYXNzICAgICAgIHNvdXJjZVR5cGUsCi0JCQkJCQkgIFN0cmluZyAgICAgIHNvdXJjZVByb3BlcnR5LAotCQkJCQkJICBDbGFzcyAgICAgICB0YXJnZXRUeXBlLAotCQkJCQkJICBTdHJpbmcgICAgICB0YXJnZXRQcm9wZXJ0eSwKLQkJCQkJCSAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgKTsKLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIHRoZSBhYm92ZSB3aXRoIHRhcmdldFByb3BlcnR5IHRoZSBzYW1lCi0gICAqIGFzIHRoZSBzb3VyY2VQcm9wZXJ0eSBhbmQgd2l0aCB0aGUgdHJhbnNmb3JtZXIgc2V0IHRvIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gc291cmNlVHlwZSAgICAgVGhlIHNvdXJjZSBvYmplY3QuCi0gICAqIEBwYXJhbSBzb3VyY2VQcm9wZXJ0eSBUaGUgc291cmNlIHByb3BlcnR5LgotICAgKiBAcGFyYW0gdGFyZ2V0VHlwZSAgICAgVGhlIHRhcmdldCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKCBDbGFzcyAgICAgICBzb3VyY2VUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICBzb3VyY2VQcm9wZXJ0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgdGFyZ2V0VHlwZSApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZGF0YS9UcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZGF0YS9UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTgwZjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2RhdGEvVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIHRyYW5zZm9ybSBhbiBvYmplY3QgZnJvbSBvbmUgY2xhc3MgdG8gYW5vdGhlci4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNmb3JtZXIKLXsKLSAgLyoKLSAgICogQHJldHVybiByZXR1cm5zIGEgdHJhbnNmb3JtZWQgb2JqZWN0IGJhc2VkIG9uIHRoZSBpbnB1dCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKCBPYmplY3QgdmFsdWUgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2Vudmlyb25tZW50LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ3NzY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2Vudmlyb25tZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGZvciBTaW1wbGVVUklGYWN0b3J5Ci0jCi1NU0dfTlVMTF9BUkdfU1BFQ0lGSUVEPU51bGwgc3BlY2lmaWVkIGFzIGFyZ3VtZW50IHRvIHswfS4KLU1TR19TQ0hFTUVfTk9UX0ZPVU5EPVNjaGVtZSBub3QgZm91bmQgZm9yIFVSSSB7MH0uCi1NU0dfQUJTT0xVVEVfUEFUSF9XSVRIT1VUX1NDSEVNRT1BYnNvbHV0ZSBwYXRoIHNwZWNpZmllZCB3aXRob3V0IGEgc2NoZW1lIGZvciBVUkkgezB9LgotCi0jCi0jIENvbW1vbiBNZXNzYWdlcwotIwotTVNHX1VSSV9OT1RfUkVMQVRJVkU9VVJMOiB7MH0gaXMgbm90IHJlbGF0aXZlLgotTVNHX0VSUk9SX1VORVhQRUNURURfRVJST1I9SVdBQjAwMTRFIFVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VyZWQuCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0Fic3RyYWN0Q29tbWFuZEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9BYnN0cmFjdENvbW1hbmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTNlNDJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0Fic3RyYWN0Q29tbWFuZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotCi0vKioKLSAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIG90aGVyIHN0YW5kYXJkIGZyYWdtZW50IGNsYXNzZXMuCi0gICogCi0qKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudCBpbXBsZW1lbnRzIENvbW1hbmRGcmFnbWVudAotewotICBwcml2YXRlIENvbW1hbmRGYWN0b3J5IGNvbW1hbmRGYWN0b3J5XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICBpZF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgZG9Ob3RSdW5JblRyYW5zYWN0aW9uXyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDb3B5IGNvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gZnJhZ21lbnQKLSAgICovCi0gIHByb3RlY3RlZCBBYnN0cmFjdENvbW1hbmRGcmFnbWVudCggQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgY29tbWFuZEZhY3RvcnlfID0gZnJhZ21lbnQuY29tbWFuZEZhY3RvcnlfOwotICAgIGlkXyAgICAgICAgICAgICA9IGZyYWdtZW50LmlkXzsKLSAgfQotICAKLSAgLyoqCi0gICAgKiBDcmVhdGVzIGEgbmV3IEFic3RyYWN0Q29tbWFuZEZyYWdtZW50LgotICAgICoKLSAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSBleGVjdXRhYmxlIGNvbW1hbmQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICoqLwotICBwdWJsaWMgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQoIENvbW1hbmRGYWN0b3J5IGNvbW1hbmRGYWN0b3J5LCBTdHJpbmcgaWQgKQotICB7Ci0gICAgY29tbWFuZEZhY3RvcnlfID0gY29tbWFuZEZhY3Rvcnk7ICAKLSAgICBpZF8gICAgICA9IGlkOwotICB9IAotICAKLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gaWRfOwotICB9Ci0gICAKLSAgcHVibGljIHZvaWQgc2V0SWQoIFN0cmluZyBpZCApCi0gIHsKLSAgICBpZF8gPSBpZDsgCi0gIH0KLSAgCi0gIC8qKiAKLSAgICAqIEdldHMgZXhlY3V0YWJsZSBjb21tYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZhY3RvcnkgZ2V0Q29tbWFuZEZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIGNvbW1hbmRGYWN0b3J5XzsKLSAgfQotICAKLSAgLyoqCi0gICAqICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcmV0cmlldmUgdGhlIGRhdGEgbWFwcGluZ3MgZm9yIHRoaXMgY29tbWFuZCBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIC8vIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyBub3QgdG8gYWRkIGFueSBlbnRyaWVzIHRvIHRoZSByZWdpc3RyeS4KLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIElmIHRoZSBjb21tYW5kcyBmb3IgdGhpcyBmcmFnbWVudCBzaG91bGQgbm90IGJlIHJ1biB3aXRoaW4gYSB0cmFuc2FjdGlvbiB0aGVuCi0gICAqIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdHJ1ZS4gIElmIHRoZSBmcmFnbWVudCBkb2VzIG5vdCBjYXJlIGlmIGl0IGlzIHJ1biBpbiBhIHRyYW5zYWN0aW9uCi0gICAqIG9yIG5vdCBpdCBzaG91bGQgcmV0dXJuIGZhbHNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZG9Ob3RSdW5JblRyYW5zYWN0aW9uKCkKLSAgewotICAgIHJldHVybiBkb05vdFJ1bkluVHJhbnNhY3Rpb25fOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgcnVuIGluIHRyYW5zYWN0aW9uIHByb3BlcnR5LgotICAgKiBAcGFyYW0gZG9Ob3RSdW5JblRyYW5zYWN0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb05vdFJ1bkluVHJhbnNhY3Rpb24oIGJvb2xlYW4gZG9Ob3RSdW5JblRyYW5zYWN0aW9uICkKLSAgewotICAgIGRvTm90UnVuSW5UcmFuc2FjdGlvbl8gPSBkb05vdFJ1bkluVHJhbnNhY3Rpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgICogQWxsIGZyYWdtZW50cyBuZWVkIHRvIGJlIGNsb25lYWJsZS4KLSAgKiovCi0gIGFic3RyYWN0IHB1YmxpYyBPYmplY3QgY2xvbmUoKTsgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0Jvb2xlYW5GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQm9vbGVhbkZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYmRhODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQm9vbGVhbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci0KLQotLyoqCi0gICogVGhpcyBjbGFzcyByZXR1cm5zIGVpdGhlciB0aGUgdHJ1ZSBmcmFnbWVudCBvciB0aGUgZmFsc2UgZnJhZ21lbnQKLSAgKiBiYXNlZCBvbiB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgY29uZGl0aW9uIG9iamVjdC4KLSoqLwotcHVibGljIGNsYXNzIEJvb2xlYW5GcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50Ci17Ci0gIHByaXZhdGUgQ29tbWFuZEZyYWdtZW50IHRydWVGcmFnbWVudF87Ci0gIHByaXZhdGUgQ29tbWFuZEZyYWdtZW50IGZhbHNlRnJhZ21lbnRfOwotICBwcml2YXRlIENvbmRpdGlvbiAgICAgICBjb25kaXRpb25fOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBCb29sZWFuRnJhZ21lbnQgd2l0aCBkZWZhdWx0IHZhbHVlcy4KLSAgICoKLSAgICovCi0gIHB1YmxpYyBCb29sZWFuRnJhZ21lbnQoKQotICB7Ci0gICAgdGhpcyggbnVsbCwgbnVsbCwgbmV3IENvbmRpdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9LCAKLSAgICAgICAgICAgICAgICAgICAgICBudWxsLCAiIiApOyAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIHRydWVGcmFnbWVudCAgVGhlIGZyYWdtZW50IGNob3NlbiBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCi0gICAqIEBwYXJhbSBmYWxzZUZyYWdtZW50IFRoZSBmcmFnbWVudCBjaG9zZW4gaWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4KLSAgICogQHBhcmFtIGNvbmRpdGlvbiAgICAgVGhlIGNvbmRpdGlvbi4KLSAgICovCi0gIHB1YmxpYyBCb29sZWFuRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCB0cnVlRnJhZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRGcmFnbWVudCBmYWxzZUZyYWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgY29uZGl0aW9uICkKLSAgewotICAgIHRoaXMoIHRydWVGcmFnbWVudCwgZmFsc2VGcmFnbWVudCwgY29uZGl0aW9uLCBudWxsLCAiIiApOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAvKioKLSAgICAqIENyZWF0ZXMgYSBuZXcgQm9vbGVhbkZyYWdtZW50LgotICAgICoKLSAgICAqIEBwYXJhbSB0cnVlRnJhZ21lbnQgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIHRydWUuCi0gICAgKiBAcGFyYW0gZmFsc2VGcmFnbWVudCByZXR1cm5lZCBpZiBjb25kaXRpb24gaXMgZmFsc2UuCi0gICAgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBjb25kaXRpb24gZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKiBAcGFyYW0gc3RhdGUgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgY29uZGl0aW9uLgotICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGV4ZWN0YWJsZSBjb21tYW5kIGZvciB0aGlzIGZyYWdtZW50LgotICAqKi8KLSAgcHVibGljIEJvb2xlYW5GcmFnbWVudCggQ29tbWFuZEZyYWdtZW50ICB0cnVlRnJhZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kRnJhZ21lbnQgZmFsc2VGcmFnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICBjb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kRmFjdG9yeSAgY29tbWFuZEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgaWQgKQotICB7Ci0gICAgc3VwZXIoIGNvbW1hbmRGYWN0b3J5LCBpZCApOwotCi0gICAgdHJ1ZUZyYWdtZW50XyAgICAgICA9IHRydWVGcmFnbWVudDsKLSAgICBmYWxzZUZyYWdtZW50XyAgICAgID0gZmFsc2VGcmFnbWVudDsKLSAgICBjb25kaXRpb25fICAgICAgICAgID0gY29uZGl0aW9uOyAKLSAgfQotCi0gIC8qKgotICAgKiBDb3B5IGNvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gZnJhZwotICAgKi8KLSAgcHJvdGVjdGVkIEJvb2xlYW5GcmFnbWVudCggQm9vbGVhbkZyYWdtZW50IGZyYWcgKQotICB7Ci0gICAgdGhpcyggbnVsbCwKLSAgICAJICBudWxsLAotICAgIAkgIGZyYWcuY29uZGl0aW9uXywKLSAgICAJICBmcmFnLmdldENvbW1hbmRGYWN0b3J5KCksCi0gICAgCSAgZnJhZy5nZXRJZCgpICk7Ci0KLSAgICAvLyBOb3cgd2UgaGF2ZSB0byBjbG9uZSBpbiB0aGUgdHJ1ZSBhbmQgZmFsc2UKLSAgICAvLyBmcmFnbWVudHMuCi0gICAgdHJ1ZUZyYWdtZW50XyAgPSAoQ29tbWFuZEZyYWdtZW50KXRydWVGcmFnbWVudF8uY2xvbmUoKTsKLSAgICBmYWxzZUZyYWdtZW50XyA9IChDb21tYW5kRnJhZ21lbnQpZmFsc2VGcmFnbWVudF8uY2xvbmUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAgKiBNYWtlcyBhIGNvcHkgb2YgdGhlIENvbW1hbmRGcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgZnJhZ21lbnQuCi0gICoqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbkZyYWdtZW50KCB0aGlzICk7Ci0gIH0KLQotICAvKiogCi0gICAgKiBHZXRzIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucwotICAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCkKLSAgeyAgICAKLSAgICByZXR1cm4gY29uZGl0aW9uXy5ldmFsdWF0ZSgpID8gdHJ1ZUZyYWdtZW50XyA6IGZhbHNlRnJhZ21lbnRfOwotICB9Ci0gIAotICAvKioKLSAgICAqIEdldHMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucyBudWxsCi0gICAgKiB3aGVuIHRoZXJlIGlzIG5vIG5leHQgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldE5leHRTdWJGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgY29uZGl0aW9uLgotICAgKiBAcGFyYW0gY29uZGl0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oIENvbmRpdGlvbiBjb25kaXRpb24gKQotICB7Ci0gICAgY29uZGl0aW9uXyA9IGNvbmRpdGlvbjsgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSB0cnVlIGZyYWdtZW50LgotICAgKiBAcGFyYW0gZnJhZ21lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRydWVGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHRydWVGcmFnbWVudF8gPSBmcmFnbWVudDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIGZhbHNlIGZyYWdtZW50LgotICAgKiBAcGFyYW0gZnJhZ21lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhbHNlRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICBmYWxzZUZyYWdtZW50XyA9IGZyYWdtZW50OwotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQ2hvaWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0Nob2ljZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZjgwZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQ2hvaWNlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRXZhbHVhdGU7Ci0KLQotLyoqCi0gICogVGhpcyBjbGFzcyByZXR1cm5zIGEgZnJhZ21lbnQgZnJvbSBhIGxpc3Qgb2YgZnJhZ21lbnRzIGJhc2VkCi0gICogb24gdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBFdmFsdWF0ZSBvYmplY3QuCi0qKi8KLXB1YmxpYyBjbGFzcyBDaG9pY2VGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50IAotewotICBwcml2YXRlIEhhc2h0YWJsZSAgICAgIGZyYWdtZW50VGFibGVfOwotICBwcml2YXRlIEV2YWx1YXRlICAgICAgIGV2YWx1YXRlXzsKLQotICAvKioKLSAgICAqIENyZWF0ZSBhIGNsb25lIHdpdGggbmV3IGEgbmV3IGhhc2h0YWJsZS4KLSAgKiovCi0gIHByb3RlY3RlZCBDaG9pY2VGcmFnbWVudCggQ2hvaWNlRnJhZ21lbnQgZnJhZyApCi0gIHsKLSAgICBzdXBlciggZnJhZy5nZXRDb21tYW5kRmFjdG9yeSgpLCBmcmFnLmdldElkKCkgKTsKLSAgICAKLSAgICBldmFsdWF0ZV8gICAgICA9IGZyYWcuZXZhbHVhdGVfOwotICAgIGZyYWdtZW50VGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgCi0gICAgRW51bWVyYXRpb24ga2V5cyA9IGZyYWcuZnJhZ21lbnRUYWJsZV8ua2V5cygpOwotCi0gICAgLy8gQ2xvbmUgdGhlIGZyYWdtZW50cyBpbiB0aGUgdGFibGUuCi0gICAgd2hpbGUoIGtleXMuaGFzTW9yZUVsZW1lbnRzKCkgKQotICAgIHsKLSAgICAgIE9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICBmcmFnbWVudFRhYmxlXy5wdXQoIGtleSwgKChDb21tYW5kRnJhZ21lbnQpZnJhZy5mcmFnbWVudFRhYmxlXy5nZXQoa2V5KSkuY2xvbmUoKSApOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIENob2ljZUZyYWdtZW50KCBPYmplY3RbXSAgICAgICAgICBrZXlzLAotICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRGcmFnbWVudFtdIGZyYWdtZW50cyApCi0gIHsKLSAgCXRoaXMoIGtleXMsIGZyYWdtZW50cywgbnVsbCwgbnVsbCwgIiIgKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBDaG9pY2VGcmFnbWVudCggT2JqZWN0W10gICAgICAgICAga2V5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kRnJhZ21lbnRbXSBmcmFnbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRXZhbHVhdGUgICAgICAgICAgZXZhbHVhdGUgKQotICB7Ci0gIAl0aGlzKCBrZXlzLCBmcmFnbWVudHMsIGV2YWx1YXRlLCBudWxsLCAiIiApOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAKLSAgcHVibGljIHZvaWQgc2V0RXZhbHVhdGUoIEV2YWx1YXRlIGV2YWx1YXRlICkKLSAgewotICAgIGV2YWx1YXRlXyA9IGV2YWx1YXRlOyAgCi0gIH0KLSAgCi0gIC8qKgotICAgICogQ29uc3RydWN0cyBhIGNob2ljZSBmcmFnbWVudC4gIFRoZSBrZXkgYXQgaW5kZXggWCBpcyBtYXBwZWQgdG8gCi0gICAgKiB0byB0aGUgZnJhZ21lbnQgYXQgaW5kZXggWC4KLSAgICAqCi0gICAgKiBAcGFyYW0ga2V5cyB0aGVzZSBrZXlzIG11c3QgYmUgdW5pcXVlIGFzIGRldGVybWluZWQgYnkgdGhlIGVxdWFscyBtZXRob2QuCi0gICAgKiBUaGV5IGFyZSB1c2VkIHRvIGlkZW50aWZ5IHdoaWNoIGZyYWdtZW50IHRvIHJldHVybi4KLSAgICAqIEBwYXJhbSBmcmFnbWVudHMgdGhlc2UgYXJlIHRoZSBmcmFnbWVudHMgdG8gYmUgcmV0dXJuZWQuICBOdWxsIGlzIG5vdCBhbGxvd2VkCi0gICAgKiBhcyBhbiBlbnRyeSBpbiB0aGUgYXJyYXkuCi0gICAgKiBAcGFyYW0gZXZhbHVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGV2YWx1YXRlIG9iamVjdCBpcyB1c2VkCi0gICAgKiBhcyB0aGUga2V5IHRvIGxvY2F0ZSBhIGZyYWdtZW50LgotICAgICogQHBhcmFtIHN0YXRlIHRoZSBzdGF0ZSBwYXNzZWQgdG8gZXZhbHVhdGUuCi0gICoqLwotICBwdWJsaWMgQ2hvaWNlRnJhZ21lbnQoIE9iamVjdFtdICAgICAgICAgIGtleXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZEZyYWdtZW50W10gZnJhZ21lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWx1YXRlICAgICAgICAgIGV2YWx1YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRGYWN0b3J5ICAgIGNvbW1hbmRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgICAgIGlkICkKLSAgewotICAgIHN1cGVyKCBjb21tYW5kRmFjdG9yeSwgaWQgKTsKLQotICAgIGV2YWx1YXRlXyAgICAgID0gZXZhbHVhdGU7Ci0gICAgZnJhZ21lbnRUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBpZigga2V5cyA9PSBudWxsIHx8IGZyYWdtZW50cyA9PSBudWxsIHx8IGtleXMubGVuZ3RoICE9IGZyYWdtZW50cy5sZW5ndGggKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJCYWQga2V5cyBvciBmcmFnbWVudHMuIiApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gQ3JlYXRlIHRoZSBmcmFnbWVudCB0YWJsZS4KLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBrZXlzLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIGZyYWdtZW50VGFibGVfLnB1dCgga2V5c1tpbmRleF0sIGZyYWdtZW50c1tpbmRleF0gKTsKLSAgICAgIH0gICAgIAotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAgKiBNYWtlcyBhIGNvcHkgb2YgdGhlIENvbW1hbmRGcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgZnJhZ21lbnQuCi0gICoqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAgIHJldHVybiBuZXcgQ2hvaWNlRnJhZ21lbnQoIHRoaXMgKTsKLSAgfQotICAKLSAgLyoqIAotICAgICogR2V0cyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0Rmlyc3RTdWJGcmFnbWVudCgpCi0gIHsgICAgCi0gICAgT2JqZWN0IGtleSAgICAgICAgICAgICAgPSBldmFsdWF0ZV8uZXZhbHVhdGUoKTsKLSAgICBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgPSAoQ29tbWFuZEZyYWdtZW50KWZyYWdtZW50VGFibGVfLmdldChrZXkpOwotCi0gICAgaWYoIGZyYWdtZW50ID09IG51bGwgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJLZXkgbm90IGZvdW5kIGluIHRhYmxlLiBLZXk9IiArIGtleSApOwotICAgIH0KLQotICAgIHJldHVybiBmcmFnbWVudDsKLSAgfQotICAKLSAgLyoqCi0gICAgKiBHZXRzIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMgbnVsbAotICAgICogd2hlbiB0aGVyZSBpcyBubyBuZXh0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXROZXh0U3ViRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmZTA2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLQotLyoqCi0gICogVGhpcyBpbnRlcmZhY2UgZGVzY3JpYmVzIGEgbGlzdCBvZiBpbnRlcnJ1cHRhYmxlIGNvbW1hbmRzLiAgVGhlCi0gICogb3JkZXIgb2YgdGhpcyBsaXN0IG9mIGNvbW1hbmRzIGlzIGRlZmluZWQgYnkgdGhlIGdldEZpcnN0U3ViRnJhZ21lbnQgYW5kCi0gICogZ2V0TmV4dFN1YkZyYWdtZW50IG1ldGhvZHMuCi0qKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEZyYWdtZW50IGV4dGVuZHMgQ2xvbmVhYmxlCi17IAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpOwotICAKLSAgLyoqIAotICAgICogR2V0cyBleGVjdXRhYmxlIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRmFjdG9yeSBnZXRDb21tYW5kRmFjdG9yeSgpOwotCi0gIC8qKiAKLSAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKTsKLQotICAvKioKLSAgICAqIEdldHMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucyBudWxsCi0gICAgKiB3aGVuIHRoZXJlIGlzIG5vIG5leHQgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldE5leHRTdWJGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICk7Ci0gIAotICAvKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcmV0cmlldmUgdGhlIGRhdGEgbWFwcGluZ3MgZm9yIHRoaXMgY29tbWFuZCBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5ICk7Ci0KLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIElmIHRoZSBjb21tYW5kcyBmb3IgdGhpcyBmcmFnbWVudCBzaG91bGQgbm90IGJlIHJ1biB3aXRoaW4gYSB0cmFuc2FjdGlvbiB0aGVuCi0gICAqIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdHJ1ZS4gIElmIHRoZSBmcmFnbWVudCBkb2VzIG5vdCBjYXJlIGlmIGl0IGlzIHJ1biBpbiBhIHRyYW5zYWN0aW9uCi0gICAqIG9yIG5vdCBpdCBzaG91bGQgcmV0dXJuIGZhbHNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZG9Ob3RSdW5JblRyYW5zYWN0aW9uKCk7Ci0gIAotICAvKioKLSAgICAqIEFsbCB3aXphcmQgZnJhZ21lbnRzIG5lZWQgdG8gYmUgY2xvbmVhYmxlLgotICAqKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpOyAgCi19ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudEVuZ2luZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50RW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGJlMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50RW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhRmxvd01hbmFnZXI7Ci0KLQotCi0vKioKLSAqIFRoZSBDb21tYW5kRnJhZ21lbnRFbmdpbmUgcHJvdmlkZXMgYSBjb252aWVuZW50IHdheSB0byB0cmF2ZXJzZSBDb21tYW5kRnJhZ21lbnRzCi0gKiBhbmQgcG9zc2libGl0eSBleGVjdXRlIGl0cyBhc3NvY2lhdGUgQ29tbWFuZC4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRGcmFnbWVudEVuZ2luZSBpbXBsZW1lbnRzIENvbW1hbmRNYW5hZ2VyCi17Ci0gIHByaXZhdGUgU3RhY2sgICAgICAgICAgICBjb21tYW5kU3RhY2tfOwotICBwcml2YXRlIEZyYWdtZW50TGlzdGVuZXIgdW5kb0ZyYWdtZW50TGlzdGVuZXJfOwotICBwcml2YXRlIEZyYWdtZW50TGlzdGVuZXIgbmV4dEZyYWdtZW50TGlzdGVuZXJfOwotICBwcml2YXRlIEZyYWdtZW50TGlzdGVuZXIgcGVla0ZyYWdtZW50TGlzdGVuZXJfOwotICBwcml2YXRlIERhdGFGbG93TWFuYWdlciAgZGF0YU1hbmFnZXJfOwotICBwcml2YXRlIEVudmlyb25tZW50ICAgICAgZW52aXJvbm1lbnRfOwotICBwcml2YXRlIFN0YXR1cyAgICAgICAgICAgbGFzdFN0YXR1c187Ci0gIAotICAvKioKLSAgICogQ3JlYXRlcyBhIENvbW1hbmRGcmFnbWVudEVuZ2luZS4KLSAgICogCi0gICAqIEBwYXJhbSBzdGFydEZyYWdtZW50IHRoZSByb290IGZyYWdtZW50IHdoZXJlIHRyYXZlcnNhbCB3aWxsIGJlZ2luLgotICAgKiBAcGFyYW0gZGF0YU1hbmFnZXIgdGhlIGRhdGEgbWFuYWdlciBjb250YWluaW5nIGFsbCBvZiB0aGUgZGF0YSBtYXBwaW5ncy4KLSAgICogQHBhcmFtIGVudmlyb25tZW50IHRoZSBlbnZpcm9ubWVudC4KLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRFbmdpbmUoIENvbW1hbmRGcmFnbWVudCBzdGFydEZyYWdtZW50LCBEYXRhRmxvd01hbmFnZXIgZGF0YU1hbmFnZXIsIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAJU2VxdWVuY2VGcmFnbWVudCByb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgCXJvb3QuYWRkKCBzdGFydEZyYWdtZW50ICk7Ci0gIAkgIAkKLSAgCWNvbW1hbmRTdGFja18gPSBuZXcgU3RhY2soKTsKLSAgCQotICAJYWRkVG9TdGFjayggcm9vdCwgLTEgKTsKLSAgCWFkZFRvU3RhY2soIHN0YXJ0RnJhZ21lbnQsIDAgKTsKLSAgCQotICAJZGF0YU1hbmFnZXJfID0gZGF0YU1hbmFnZXI7Ci0gIAllbnZpcm9ubWVudF8gPSBlbnZpcm9ubWVudDsKLSAgfSAKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiB0aGUgU3RhdHVzIGZyb20gdGhlIGxhc3QgQ29tbWFuZCBleGVjdXRlZC4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZ2V0TGFzdFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gbGFzdFN0YXR1c187Ci0gIH0KLSAgCi0gIC8qKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIG5leHQgZnJhZ21lbnQgbGlzdGVuZXIgZm9yIHRoaXMgZW5naW5lLiAgVGhpcyBsaXN0ZW5lciB3aWxsIGJlCi0gICAqIGNhbGxlZCBmb3IgZWFjaCBmcmFnbWVudCB0aGF0IGlzIHRyYXZlcnNlZCBpbiBtb3ZlRm9yd2FyZFRvTmV4dFN0b3Agb3BlcmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBmcmFnbWVudCBsaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5leHRGcmFnbWVudExpc3RlbmVyKCBGcmFnbWVudExpc3RlbmVyIGxpc3RlbmVyICkKLSAgewotICAgIG5leHRGcmFnbWVudExpc3RlbmVyXyA9IGxpc3RlbmVyOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgbmV4dCBmcmFnbWVudCBsaXN0ZW5lciBmb3IgdGhpcyBlbmdpbmUuICBUaGlzIGxpc3RlbmVyIHdpbGwgYmUKLSAgICogY2FsbGVkIGZvciBlYWNoIGZyYWdtZW50IHRoYXQgaXMgdHJhdmVyc2VkIGluIHBlZWtGb3J3YXJkVG9OZXh0U3RvcCBvcGVyYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGZyYWdtZW50IGxpc3RlbmVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UGVla0ZyYWdtZW50TGlzdGVuZXIoIEZyYWdtZW50TGlzdGVuZXIgbGlzdGVuZXIgKQotICB7Ci0gICAgcGVla0ZyYWdtZW50TGlzdGVuZXJfID0gbGlzdGVuZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBwZWVrIGZyYWdtZW50IGxpc3RlbmVyIGZvciB0aGlzIGVuZ2luZS4gIFRoaXMgbGlzdGVuZXIgd2lsbCBiZQotICAgKiBjYWxsZWQgZm9yIGVhY2ggZnJhZ21lbnQgdGhhdCBpcyB0cmF2ZXJzZWQgaW4gdW5kb1RvTGFzdFN0b3Agb3BlcmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBmcmFnbWVudCBsaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZG9GcmFnbWVudExpc3RlbmVyKCBGcmFnbWVudExpc3RlbmVyIGxpc3RlbmVyICkKLSAgewotICAgIHVuZG9GcmFnbWVudExpc3RlbmVyXyA9IGxpc3RlbmVyOwotICB9Ci0gIAotICAvKioKLSAgICogVHJhdmVyc2UgdGhlIENvbW1hbmRGcmFnbWVudHMgc3RhcnRpbmcgd2l0aCB0aGUgQ29tbWFuZEZyYWdtZW50IG9uIHRoZQotICAgKiB0b3Agb2YgdGhlIGNvbW1hbmQgZnJhZ21lbnQgc3RhY2suICBUaGUgb3BlcmF0aW9uIGRvZXMgTk9UIGNoYW5nZSB0aGUKLSAgICogY29tbWFuZCBmcmFnbWVudCBzdGFjayBhbmQgZG9lcyBub3QgZXhlY3V0ZSBhbnkgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGgKLSAgICogYSBDb21tYW5kRnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwZWVrRm9yd2FyZFRvTmV4dFN0b3AoKQotICB7Ci0gIAlDb21tYW5kTGlzdEVudHJ5IHRvcEVudHJ5ICAgICAgPSAoQ29tbWFuZExpc3RFbnRyeSljb21tYW5kU3RhY2tfLmxhc3RFbGVtZW50KCk7ICAJCi0gIAlpbnQgICAgICAgICAgICAgIHBhcmVudEluZGV4ICAgPSB0b3BFbnRyeS5wYXJlbnRJbmRleF87Ci0gIAlDb21tYW5kRnJhZ21lbnQgIGNoaWxkRnJhZ21lbnQgPSB0b3BFbnRyeS5mcmFnbWVudF87IAotICAJYm9vbGVhbiAgICAgICAgICBjb250aW51ZUxvb3AgID0gbmF2aWdhdGVDaGlsZEZyYWdtZW50cyggY2hpbGRGcmFnbWVudCwgZmFsc2UgKTsKLSAgCSAgCQotICAJd2hpbGUoIHBhcmVudEluZGV4ICE9IC0xICYmIGNvbnRpbnVlTG9vcCApCi0gIAl7ICAJCi0gIAkgIENvbW1hbmRMaXN0RW50cnkgcGFyZW50RW50cnkgICAgPSAoQ29tbWFuZExpc3RFbnRyeSljb21tYW5kU3RhY2tfLmVsZW1lbnRBdCggcGFyZW50SW5kZXggKTsKLSAgCSAgQ29tbWFuZEZyYWdtZW50ICBwYXJlbnRGcmFnbWVudCA9IHBhcmVudEVudHJ5LmZyYWdtZW50XzsKLSAgCSAgQ29tbWFuZEZyYWdtZW50ICBuZXh0RnJhZ21lbnQgICA9IHBhcmVudEZyYWdtZW50LmdldE5leHRTdWJGcmFnbWVudCggY2hpbGRGcmFnbWVudCApOwotICAJICAKLSAgCSAgaWYoIG5leHRGcmFnbWVudCA9PSBudWxsICkKLSAgCSAgewotICAJICAJLy8gVGhlcmUgYXJlIG5vIG1vcmUgc2libGluZyBmcmFnbWVudHMgdG8gbmF2aWdhdGUgc28gd2Ugd2lsbCBwb3AgdXAgdG8gdGhlIHBhcmVudAotICAJICAJLy8gYW4gY29udGludWUgbmF2aWdhdGlvbiB0aGVyZS4KLSAgCSAgCXBhcmVudEluZGV4ICAgPSBwYXJlbnRFbnRyeS5wYXJlbnRJbmRleF87Ci0gIAkgIAljaGlsZEZyYWdtZW50ID0gcGFyZW50RnJhZ21lbnQ7IAotICAJICB9Ci0gIAkgIGVsc2UKLSAgCSAgeyAgCSAgCQotICAJICAJaWYoIG5hdmlnYXRlQ2hpbGRGcmFnbWVudHMoIG5leHRGcmFnbWVudCwgdHJ1ZSApICkgCi0gIAkgIAl7Ci0gIAkgIAkgIC8vIFdlIGFyZSBjb250aW51aW5nIHRvIG5hdmlnYXRlLiAgVGhpcyB0aW1lIHdlIHdhbnQgdG8gdHJhdmVyc2UgdGhlIHNpYmxpbmcKLSAgCSAgCSAgLy8gb2YgbmV4dEZyYWdtZW50LiAKLSAgCSAgCSAgY2hpbGRGcmFnbWVudCA9IG5leHRGcmFnbWVudDsKLSAgCSAgCX0KLSAgCSAgCWVsc2UKLSAgCSAgCXsKLSAgCSAgCSAgLy8gV2UgYXJlIHN0b3BwaW5nIG91ciBuYXZpZ2F0aW9uLgotICAJICAJICBjb250aW51ZUxvb3AgPSBmYWxzZTsKLSAgCSAgCX0KLSAgCSAgfQotICAJfQotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIFRyYXZlcnNlIHRoZSBDb21tYW5kRnJhZ21lbnRzIHN0YXJ0aW5nIHdpdGggdGhlIENvbW1hbmRGcmFnbWVudCBvbiB0aGUKLSAgICogdG9wIG9mIHRoZSBjb21tYW5kIGZyYWdtZW50IHN0YWNrLiAgVGhpcyBvcGVyYXRpb24gZG9lcyBjaGFuZ2UgdGhlCi0gICAqIGNvbW1hbmQgZnJhZ21lbnQgc3RhY2sgYW5kIGRvZXMgZXhlY3V0ZSBhbnkgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGgKLSAgICogYSBDb21tYW5kRnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBtb3ZlRm9yd2FyZFRvTmV4dFN0b3AoKQotICB7Ci0gIAlDb21tYW5kTGlzdEVudHJ5IHRvcEVudHJ5ICAgICAgICA9IChDb21tYW5kTGlzdEVudHJ5KWNvbW1hbmRTdGFja18ubGFzdEVsZW1lbnQoKTsgIAkKLSAgCWludCAgICAgICAgICAgICAgcGFyZW50SW5kZXggICAgID0gdG9wRW50cnkucGFyZW50SW5kZXhfOwotICAJQ29tbWFuZEZyYWdtZW50ICBjdXJyZW50RnJhZ21lbnQgPSB0b3BFbnRyeS5mcmFnbWVudF87ICAKLSAgCWJvb2xlYW4gICAgICAgICAgY29udGludWVFeGVjdXRlID0gdmlzaXRUb3AoKTsKLSAgCUNvbW1hbmRGcmFnbWVudCAgY2hpbGRGcmFnbWVudCAgICA9IGN1cnJlbnRGcmFnbWVudC5nZXRGaXJzdFN1YkZyYWdtZW50KCk7Ci0gIAkKLSAgCS8vIElmIHRoZSBjdXJyZW50IGZyYWdtZW50IGhhcyBjaGlsZCBmcmFnbWVudHMgd2UgbmVlZCB0byB0cmF2ZXJzZSB0aGVzZSBjaGlsZHJlbi4KLSAgCXdoaWxlKCBjaGlsZEZyYWdtZW50ICE9IG51bGwgJiYgY29udGludWVFeGVjdXRlICkKLSAgCXsKLSAgCSAgcGFyZW50SW5kZXggPSBjb21tYW5kU3RhY2tfLnNpemUoKSAtIDE7Ci0gIAkgIGFkZFRvU3RhY2soIGNoaWxkRnJhZ21lbnQsIHBhcmVudEluZGV4ICk7Ci0gIAkgIGNvbnRpbnVlRXhlY3V0ZSA9IHZpc2l0VG9wKCk7Ci0gIAkgIGN1cnJlbnRGcmFnbWVudCA9IGNoaWxkRnJhZ21lbnQ7Ci0gIAkgIGNoaWxkRnJhZ21lbnQgICA9IGN1cnJlbnRGcmFnbWVudC5nZXRGaXJzdFN1YkZyYWdtZW50KCk7Ci0gIAl9Ci0gIAkKLSAgCS8vIFRoZSBwcmV2aW91cyB3aGlsZSBsb29wIGhhcyBndWFyYW50ZWVkIHRoYXQgY3VycmVudEZyYWdtZW50IGhhcyBubwotICAJLy8gY2hpbGQgZnJhZ21lbnRzLiBUaGlzIHdoaWxlIGxvb3AgYXNzdW1lcyB0aGlzIHRvIGJlIHRoZSBjYXNlLgotICAJd2hpbGUoIHBhcmVudEluZGV4ICE9IC0xICYmIGNvbnRpbnVlRXhlY3V0ZSApCi0gIAl7ICAJICAgCQotICAJICBDb21tYW5kTGlzdEVudHJ5IHBhcmVudEVudHJ5ICAgID0gKENvbW1hbmRMaXN0RW50cnkpY29tbWFuZFN0YWNrXy5lbGVtZW50QXQoIHBhcmVudEluZGV4ICk7Ci0gIAkgIENvbW1hbmRGcmFnbWVudCAgcGFyZW50RnJhZ21lbnQgPSBwYXJlbnRFbnRyeS5mcmFnbWVudF87Ci0gIAkgIENvbW1hbmRGcmFnbWVudCAgbmV4dEZyYWdtZW50ICAgPSBudWxsOwotICAJICAKLSAgCSAgaWYoIGN1cnJlbnRGcmFnbWVudCA9PSBudWxsICkKLSAgCSAgewotICAJICAgIG5leHRGcmFnbWVudCA9IHBhcmVudEZyYWdtZW50LmdldEZpcnN0U3ViRnJhZ21lbnQoKTsKLSAgCSAgfQotICAJICBlbHNlCi0gIAkgIHsJCi0gIAkgICAgbmV4dEZyYWdtZW50ID0gcGFyZW50RnJhZ21lbnQuZ2V0TmV4dFN1YkZyYWdtZW50KCBjdXJyZW50RnJhZ21lbnQgKTsKLSAgCSAgfQotICAJICAKLSAgCSAgaWYoIG5leHRGcmFnbWVudCA9PSBudWxsICkKLSAgCSAgewotICAJICAJLy8gVGhlcmUgYXJlIG5vIG1vcmUgc2libGluZyBmcmFnbWVudHMgdG8gbmF2aWdhdGUgc28gd2Ugd2lsbCBwb3AgdXAgdG8gdGhlIHBhcmVudAotICAJICAJLy8gYW5kIGNvbnRpbnVlIG5hdmlnYXRpb24gdGhlcmUuCi0gIAkgIAlwYXJlbnRJbmRleCAgICAgPSBwYXJlbnRFbnRyeS5wYXJlbnRJbmRleF87Ci0gIAkgIAljdXJyZW50RnJhZ21lbnQgPSBwYXJlbnRGcmFnbWVudDsgCi0gIAkgIH0KLSAgCSAgZWxzZQotICAJICB7ICAJCi0gIAkgIAkvLyBXZSBoYXZlIGEgbmV3IGZyYWdtZW50IHRoYXQgd2UgbmVlZCB0byBhZGQgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0gIAkgIAlhZGRUb1N0YWNrKCBuZXh0RnJhZ21lbnQsIHBhcmVudEluZGV4ICk7ICAJICAJCi0gIAkgICAgcGFyZW50SW5kZXggICAgID0gY29tbWFuZFN0YWNrXy5zaXplKCkgLSAxOyAgCQotICAJICAgIGNvbnRpbnVlRXhlY3V0ZSA9IHZpc2l0VG9wKCk7Ci0gIAkgICAgY3VycmVudEZyYWdtZW50ID0gbnVsbDsgIAkgIAkKLSAgCSAgfQotICAJfQotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSB0aGVyZSBpcyBub3QgbG9uZ2VyIGFueSBlbGVtZW50cyBvbiB0aGUgc3RhY2suICBOb3RlOgotICAgKiAgICAgICAgICAgICAgICAgdGhhdCBsYXN0IHR3byBlbnRyaWVzIGFyZSBhbHdheXMgbGVmdCBvbiB0aGUgc3RhY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB1bmRvVG9MYXN0U3RvcCgpCi0gIHsgICAgCi0gIAlDb21tYW5kTGlzdEVudHJ5IHRvcEVudHJ5ID0gKENvbW1hbmRMaXN0RW50cnkpY29tbWFuZFN0YWNrXy5sYXN0RWxlbWVudCgpOwkKLSAgCQotCS8vIEFsd2F5cyB1bmRvIHRoZSB0b3AgZWxlbWVudC4KLSAgCXBlcmZvcm1VbmRvKCB0b3BFbnRyeSApOwotICAJCQotICAgIHdoaWxlKCB0b3BFbnRyeS5wYXJlbnRJbmRleF8gIT0gMCApCi0gIAl7Ci0gICAgICBjb21tYW5kU3RhY2tfLnBvcCgpOwotICAJICB0b3BFbnRyeSA9IChDb21tYW5kTGlzdEVudHJ5KWNvbW1hbmRTdGFja18ubGFzdEVsZW1lbnQoKTsJICAKLSAgICAgIAotICAJICBwZXJmb3JtVW5kbyggdG9wRW50cnkgKTsKLSAgCSAgCi0gIAkgIGlmKCB0b3BFbnRyeS5mcmFnbWVudFN0b3BwZWRfICkKLSAgCSAgewotICAJICAgIGJyZWFrOwotICAJICB9Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiB0b3BFbnRyeS5wYXJlbnRJbmRleF8gPT0gMDsKLSAgfQotICAgCi0gIHByaXZhdGUgdm9pZCBwZXJmb3JtVW5kbyggQ29tbWFuZExpc3RFbnRyeSBlbnRyeSApCi0gIHsKLSAgICBpZiggZW50cnkucGFyZW50SW5kZXhfID09IDAgKSByZXR1cm47Ci0gICAgCi0JQ29tbWFuZCBjbWQgPSBlbnRyeS5jb21tYW5kXzsKLSAgCSAgCi0gIAlpZiggY21kICE9IG51bGwgJiYgY21kLmlzVW5kb2FibGUoKSApIGNtZC51bmRvKCBlbnZpcm9ubWVudF8gKTsgCi0gIAkgIAotICAJdW5kb0ZyYWdtZW50TGlzdGVuZXJfLm5vdGlmeSggZW50cnkuZnJhZ21lbnRfICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBuYXZpZ2F0ZUNoaWxkRnJhZ21lbnRzKCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQsIGJvb2xlYW4gdmlzaXRDdXJyZW50ICkKLSAgewotICAJYm9vbGVhbiAgICAgICAgIGNvbnRpbnVlTmF2aWdhdGUgPSB0cnVlOwotICAJQ29tbWFuZEZyYWdtZW50IGNoaWxkRnJhZyAgICAgICAgPSBudWxsOyAKLSAgCSAgCi0gIAlpZiggdmlzaXRDdXJyZW50ICkKLSAgCXsKLSAgCSAgY29udGludWVOYXZpZ2F0ZSA9IHBlZWtGcmFnbWVudExpc3RlbmVyXy5ub3RpZnkoIGZyYWdtZW50ICk7Ci0gICAgICBkYXRhTWFuYWdlcl8ucHJvY2VzcyggZnJhZ21lbnQgKTsKLSAgCX0KLSAgCQotICAJY2hpbGRGcmFnID0gZnJhZ21lbnQuZ2V0Rmlyc3RTdWJGcmFnbWVudCgpOwotICAgCQotICAJd2hpbGUoIGNoaWxkRnJhZyAhPSBudWxsICYmIGNvbnRpbnVlTmF2aWdhdGUgKQotICAJewotICAJICBjb250aW51ZU5hdmlnYXRlID0gbmF2aWdhdGVDaGlsZEZyYWdtZW50cyggY2hpbGRGcmFnLCB0cnVlICk7Ci0gIAkgIGNoaWxkRnJhZyAgICAgICAgPSBmcmFnbWVudC5nZXROZXh0U3ViRnJhZ21lbnQoIGNoaWxkRnJhZyApOwotICAJfQotICAJCi0gIAlyZXR1cm4gY29udGludWVOYXZpZ2F0ZTsKLSAgfQotICAgIAotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRUb3AoKQotICB7ICAKLSAgCUNvbW1hbmRMaXN0RW50cnkgZW50cnkgICAgICAgICAgID0gKENvbW1hbmRMaXN0RW50cnkpY29tbWFuZFN0YWNrXy5sYXN0RWxlbWVudCgpOwotICAJYm9vbGVhbiAgICAgICAgIGNvbnRpbnVlTmF2aWdhdGUgPSBuZXh0RnJhZ21lbnRMaXN0ZW5lcl8ubm90aWZ5KCBlbnRyeS5mcmFnbWVudF8gKTsKLSAgCSAgCi0gIAlpZiggY29udGludWVOYXZpZ2F0ZSApCi0gIAl7Ci0gIAkgIC8vIENhbGwgdGhlIHNldHRlcnMgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgICBkYXRhTWFuYWdlcl8ucHJvY2VzcyggZW50cnkuZnJhZ21lbnRfICk7Ci0gICAgICAKLSAgICAgIC8vIEFkZCBhbnkgcnVsZXMgdG8gdGhlIG1hcHBpbmcgcmVnaXN0cnkgYmVmb3JlIHdlIGV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0gICAgICBlbnRyeS5mcmFnbWVudF8ucmVnaXN0ZXJEYXRhTWFwcGluZ3MoIGRhdGFNYW5hZ2VyXy5nZXRNYXBwaW5nUmVnaXN0cnkoKSApOwotICAgCi0gIAkgIGxhc3RTdGF0dXNfID0gcnVuQ29tbWFuZCggZW50cnkgKTsKLSAgCSAgCi0gIAkgIGlmKCBsYXN0U3RhdHVzXy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApIGNvbnRpbnVlTmF2aWdhdGUgPSBmYWxzZTsKLSAgCX0KLSAgCQotICAgCWlmKCAhY29udGludWVOYXZpZ2F0ZSApIGVudHJ5LmZyYWdtZW50U3RvcHBlZF8gPSB0cnVlOwotICAgCQotICAJcmV0dXJuIGNvbnRpbnVlTmF2aWdhdGU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBhZGRUb1N0YWNrKCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQsIGludCBwYXJlbnRJbmRleCApCi0gIHsKLSAgICBDb21tYW5kTGlzdEVudHJ5IGVudHJ5ID0gbmV3IENvbW1hbmRMaXN0RW50cnkoIGZyYWdtZW50LCBwYXJlbnRJbmRleCApOwotICAgIGNvbW1hbmRTdGFja18ucHVzaCggZW50cnkgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdGF0dXMgcnVuQ29tbWFuZCggQ29tbWFuZExpc3RFbnRyeSBlbnRyeSApCi0gIHsKLQlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ICA9IGVudHJ5LmZyYWdtZW50Xy5nZXRDb21tYW5kRmFjdG9yeSgpOwotICAJU3RhdHVzICAgICAgICAgc3RhdHVzICAgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAJCi0gIAlpZiggZmFjdG9yeSAhPSBudWxsICkKLSAgCXsKLSAgCSAgQ29tbWFuZCBjbWQgICAgPSBmYWN0b3J5LmNyZWF0ZSgpOwotICAJICBlbnRyeS5jb21tYW5kXyA9IGNtZDsKLSAgCSAgICAKLSAgCSAgaWYoIGNtZCAhPSBudWxsICkKLSAgCSAgewotICAJICAgIGRhdGFNYW5hZ2VyXy5wcm9jZXNzKCBjbWQgKTsKLSAgCSAgCSAgCi0gIAkgICAgdHJ5Ci0gIAkgICAgewotICAJICAgICAgZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTywgImNvbW1hbmQiLCA1MDAxLCB0aGlzLCAicnVuQ29tbWFuZCIsICJFeGVjdXRpbmc6ICIgKyBjbWQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAJICAJICAgIAotIAkgICAgICBzdGF0dXMgPSBjbWQuZXhlY3V0ZSggZW52aXJvbm1lbnRfICk7IAkgICAgICAKLSAgCSAgICB9Ci0gIAkgICAgY2F0Y2goIFRocm93YWJsZSBleGMgKQotICAJICAgIHsKLSAgCSAgICAgIE1lc3NhZ2VVdGlscyB1dGlscyAgICAgICAgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZW52aXJvbm1lbnQiLCB0aGlzICk7Ci0gIAkgICAgICBTaW1wbGVTdGF0dXMgdW5leHBlY3RlZEVycm9yID0gbmV3IFNpbXBsZVN0YXR1cygiaWQiLCBleGMuZ2V0TWVzc2FnZSgpLCBTdGF0dXMuRVJST1IsIGV4YyApOwotICAJICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIHV0aWxzLmdldE1lc3NhZ2UoICJNU0dfRVJST1JfVU5FWFBFQ1RFRF9FUlJPUiIgKSwgbmV3IFN0YXR1c1tde3VuZXhwZWN0ZWRFcnJvcn0gKTsKLSAgCSAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoIHN0YXR1cyApOwotICAJICAgIH0KLSAgCSAgICBmaW5hbGx5Ci0gIAkgICAgewotICAJICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiT2siOwotICAJICAgICAgCi0gIAkgICAgICBpZiggc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgCSAgICAgIHsKLSAgCSAgICAgICAgbWVzc2FnZSA9ICJFcnJvcjogIiArIHN0YXR1cy5nZXRNZXNzYWdlKCk7IAotICAJICAgICAgfQotICAJICAgICAgCi0JICAgICAgZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTywgImNvbW1hbmQiLCA1MDAxLCB0aGlzLCAicnVuQ29tbWFuZCIsICJFeGVjdXRpb24gc3RhdHVzOiAiICsgbWVzc2FnZSApOwotICAJICAgIH0KLSAgCSAgfQotICAJfQotICAJCi0gIAlyZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIENvbW1hbmRMaXN0RW50cnkKLSAgewotICAJcHVibGljIENvbW1hbmRMaXN0RW50cnkoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCwgaW50IHBhcmVudEluZGV4ICkKLSAgCXsKLSAgCSAgZnJhZ21lbnRfICAgICAgICA9IGZyYWdtZW50OwotICAJICBwYXJlbnRJbmRleF8gICAgID0gcGFyZW50SW5kZXg7Ci0gIAkgIGZyYWdtZW50U3RvcHBlZF8gPSBmYWxzZTsKLSAgCX0KLSAgCSAgCQotICAJcHVibGljIENvbW1hbmQgICAgICAgICBjb21tYW5kXzsKLSAgCXB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnRfOwotICAJcHVibGljIGludCAgICAgICAgICAgICBwYXJlbnRJbmRleF87Ci0gIAlwdWJsaWMgYm9vbGVhbiAgICAgICAgIGZyYWdtZW50U3RvcHBlZF87Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjY2M0N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBhIHdheSB0byBjcmVhdGUgQ29tbWFuZEZyYWdtZW50cy4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEZyYWdtZW50RmFjdG9yeQotewotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIGNyZWF0ZWQgQ29tbWFuZEZyYWdtZW50IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwNzZhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotcHVibGljIGludGVyZmFjZSBDb21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSAKLXsKLSAgLyoqCi0gICAqIFRoZSBmcmFtZXdvcmsgY2FsbHMgdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSBDb21tYW5kRnJhZ21lbnRGYWN0b3J5Ci0gICAqIGZvciBhIHBhcnRpY3VsYXIgZXh0ZW5zaW9uLgotICAgKiAKLSAgICogQHJldHVybiBDcmVhdGVzIGEgQ29tbWFuZEZyYWdtZW50RmFjdG9yeS4KLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9FeHRlbnNpb25GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvRXh0ZW5zaW9uRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkZTNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9FeHRlbnNpb25GcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUucmVnaXN0cnkuQ29tbWFuZFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25GcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50IAotewotICBwcml2YXRlIFN0cmluZ1tdICAgICAgICBpZHNfOzsKLSAgcHJpdmF0ZSBDb21tYW5kUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnlfOwotICBwcml2YXRlIEhhc2h0YWJsZSAgICAgICBmcmFnbWVudHNfOwotICAKLSAgLyoqCi0gICAqICBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgKgotICAgKi8KLSAgcHVibGljIEV4dGVuc2lvbkZyYWdtZW50KCkKLSAgewotICAgIHN1cGVyKCBudWxsLCAiIiApOyAgCi0gICAgZnJhZ21lbnRzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotICAgIAotICAvKioKLSAgICogQ29weSBjb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIEZyYWdtZW50IHRoZSBmcmFnbWVudCB0byBjb3B5Ci0gICAqLwotICBwcm90ZWN0ZWQgRXh0ZW5zaW9uRnJhZ21lbnQoIEV4dGVuc2lvbkZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHN1cGVyKCBmcmFnbWVudCApOwotICAgIAotICAgIGlkc18gICAgICAgICAgICAgICA9IGZyYWdtZW50Lmlkc187Ci0gICAgZXh0ZW5zaW9uUmVnaXN0cnlfID0gZnJhZ21lbnQuZXh0ZW5zaW9uUmVnaXN0cnlfOwotICAgIGZyYWdtZW50c18gICAgICAgICA9IGZyYWdtZW50LmZyYWdtZW50c187Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGlkcyBTZXRzIHRoZSBJRHMgZm9yIHRoaXMgZXh0ZW5zaW9uIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uSWRzKCBTdHJpbmdbXSBpZHMgKQotICB7Ci0gICAgaWRzXyA9IGlkczsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gcmVnaXN0cnkgU2V0cyB0aGUgcmVnaXN0cnkgZm9yIHRoaXMgZXh0ZW5zaW9uIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uUmVnaXN0cnkoIENvbW1hbmRSZWdpc3RyeSByZWdpc3RyeSApCi0gIHsKLSAgICBleHRlbnNpb25SZWdpc3RyeV8gPSByZWdpc3RyeTsgCi0gIH0KLSAgICAgIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjZ2V0Rmlyc3RTdWJGcmFnbWVudCgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKSAKLSAgewotICAgIENvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5IGZhY3RvcnkgID0gZXh0ZW5zaW9uUmVnaXN0cnlfLmdldEZhY3RvcnlGYWN0b3J5KCBpZHNfICk7Ci0gICAgCi0gICAgaWYoIGZhY3RvcnkgPT0gbnVsbCApIHJldHVybiBudWxsOwotICAgIAotICAgIENvbW1hbmRGcmFnbWVudCAgICAgICAgICAgICAgIGZyYWdtZW50ID0gKENvbW1hbmRGcmFnbWVudClmcmFnbWVudHNfLmdldCggZmFjdG9yeSApOwotICAgIAotICAgIGlmKCBmcmFnbWVudCA9PSBudWxsICkKLSAgICB7Ci0gICAgICBmcmFnbWVudCA9IGZhY3RvcnkuY3JlYXRlKCkuY3JlYXRlKCk7Ci0gICAgICBmcmFnbWVudHNfLnB1dCggZmFjdG9yeSwgZnJhZ21lbnQgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuICBmcmFnbWVudDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50I2dldE5leHRTdWJGcmFnbWVudChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldE5leHRTdWJGcmFnbWVudChDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQpIAotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjY2xvbmUoKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBFeHRlbnNpb25GcmFnbWVudCggdGhpcyApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9GcmFnbWVudExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9GcmFnbWVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjJjNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvRnJhZ21lbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50IGZvciBjb2RlIHRoYXQgbmVlZHMgdG8gbGlzdGVuIHRvIGZyYWdtZW50cwotICogdGhhdCBhcmUgYmVpbmcgdHJhdmVyc2UgYnkgdGhlIENvbW1hbmRGcmFnbWVudEVuZ2luZS4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRnJhZ21lbnRMaXN0ZW5lciAKLXsKLSAgLyoKLSAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgY29tbWFuZEZyYWdtZW50IGlzIGJlaW5nIHZpc2l0ZWQgZHVyaW5nCi0gICAqIGEgdHJhdmVyc2FsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gbm90aWZ5KCBDb21tYW5kRnJhZ21lbnQgY29tbWFuZEZyYWdtZW50ICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Mb29wQ29uZGl0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Mb29wQ29uZGl0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNzgwYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvTG9vcENvbmRpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotLyoqCi0gICogVGhpcyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgd2hlbiBhIGNvbmRpdGlvbmFsIG9iamVjdCBuZWVkcyB0byBiZSByZXR1cm5lZC4KLSoqLwotcHVibGljIGludGVyZmFjZSBMb29wQ29uZGl0aW9uCi17Ci0gIC8qKgotICAgICogRXZhbHVhdGVzIGEgbG9vcCBjb25kaXRpb24uCi0gICAgKgotICAgICogQHBhcmFtIGxvb3AgdGhlIGxvb3AgZnJhZ21lbnQgdGhhdCBpcyBiZWluZyBldmFsdWF0ZWQuCi0gICAgKiBAcGFyYW0gZnJhZ21lbnQgdGhlIGNoaWxkIGZyYWdtZW50IG9mIHRoZSBsb29wIAotICAgICogICAgICAgIHVuZGVyIGV2YWx1YXRpb24uICBOb3RlOiBmcmFnbWVudCBjYW4gYmUgbnVsbC4KLSAgICAqIEByZXR1cm4gcmV0dXJucyBhbiBvYmplY3QgYmFzZWQgb24gc29tZSBldmFsdWF0ZWQgY29uZGl0aW9uLgotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoIExvb3BGcmFnbWVudCBsb29wLCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0xvb3BGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvTG9vcEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTgzNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvTG9vcEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5SYW5nZVZlY3RvcjsKLQotCi0vKioKLSAgKiBUaGlzIGNsYXNzIHJldHVybnMgYSBkeW5hbWljYWxseSBkZXRlcm1pbmVkIG51bWJlciBvZgotICAqIGZyYWdtZW50cy4gIFRoaXMgbG9vcCB3aWxsIHJldHVybiB0aGUgZnJhZ21lbnQgcGFyYW1ldGVyCi0gICogYXMgbG9uZyBhcyB0aGUgc3RvcENvbmRpdGlvbiBldmFsdWF0ZXMgdG8gZmFsc2UuICBPdGhlcndpc2UsCi0gICogbnVsbCBpcyByZXR1cm5lZC4KLSoqLwotcHVibGljIGNsYXNzIExvb3BGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50Ci17Ci0gIHByaXZhdGUgTG9vcENvbmRpdGlvbiAgIHN0b3BDb25kaXRpb25fOwotICBwcml2YXRlIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudF87Ci0gIHByaXZhdGUgUmFuZ2VWZWN0b3IgICAgIGZyYWdtZW50SGlzdG9yeV87Ci0KLSAgLyoqCi0gICAgKiBDb3B5IGNvbnRydWN0b3IgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICoqLwotICBwcm90ZWN0ZWQgTG9vcEZyYWdtZW50KCBMb29wRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgdGhpcyggZnJhZ21lbnQuZnJhZ21lbnRfLAotICAgIAkgIGZyYWdtZW50LnN0b3BDb25kaXRpb25fLAotICAgIAkgIGZyYWdtZW50LmdldENvbW1hbmRGYWN0b3J5KCksCi0gICAgCSAgZnJhZ21lbnQuZ2V0SWQoKSApOwotICB9Ci0gIAotICBwdWJsaWMgTG9vcEZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBMb29wQ29uZGl0aW9uICAgc3RvcENvbmRpdGlvbiApCi0gIHsKLSAgICB0aGlzKCBmcmFnbWVudCwgc3RvcENvbmRpdGlvbiwgbnVsbCwgIiIgKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotICAvKioKLSAgICAqIEBwYXJhbSBmcmFnbWVudCB0aGUgZnJhZ21lbnQgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBsb29wLgotICAgICogQHBhcmFtIHN0b3BDb25kaXRpb24gd2hlbiBmYWxzZSB0aGUgZnJhZ21lbnQgd2lsbCBiZSByZXR1cm5lZCwgCi0gICAgKiBvdGhlcndpc2UgbnVsbCBpcyByZXR1cm5lZC4KLSAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSBjb25kaXRpb24uCi0gICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgZXhlY3V0YWJsZSBjb21tYW5kIGZvciB0aGlzIGZyYWdtZW50LgotICAqKi8KLSAgcHVibGljIExvb3BGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICBMb29wQ29uZGl0aW9uICAgc3RvcENvbmRpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZEZhY3RvcnkgIGNvbW1hbmRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgaWQgICApCi0gIHsKLSAgICBzdXBlciggY29tbWFuZEZhY3RvcnksIGlkICk7Ci0KLSAgICBmcmFnbWVudF8gICAgICAgID0gZnJhZ21lbnQ7Ci0gICAgc3RvcENvbmRpdGlvbl8gICA9IHN0b3BDb25kaXRpb247Ci0gICAgZnJhZ21lbnRIaXN0b3J5XyA9IG5ldyBSYW5nZVZlY3RvcigpOwotICB9Ci0gIAotICAvKioKLSAgICAqIE1ha2VzIGEgY29weSBvZiB0aGUgQ29tbWFuZEZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBmcmFnbWVudC4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBMb29wRnJhZ21lbnQoIHRoaXMgKTsKLSAgfQotCi0gIC8qKgotICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZyYWdtZW50Ci0gICAgKgotICAgICogQHBhcmFtIGZyYWdtZW50IHRoZSBmcmFnbWVudCB0byBzZWFyY2guCi0gICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGlzIGZyYWdtZW50LgotICAqKi8KLSAgcHVibGljIGludCBpbmRleE9mKCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgcmV0dXJuIGZyYWdtZW50SGlzdG9yeV8uaW5kZXhPZiggZnJhZ21lbnQgKTsKLSAgfQotCi0KLSAgLyoqIAotICAgICogR2V0cyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0Rmlyc3RTdWJGcmFnbWVudCgpCi0gIHsgICAgCi0gICAgcmV0dXJuIGdldE5leHRTdWJGcmFnbWVudCggbnVsbCApOwotICB9Ci0KLSAgLyoqCi0gICAgKiBHZXRzIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMgbnVsbAotICAgICogd2hlbiB0aGVyZSBpcyBubyBuZXh0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXROZXh0U3ViRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnICkKLSAgewotICAgIENvbW1hbmRGcmFnbWVudCBuZXh0RnJhZyAgPSBudWxsOwotICAgIAotICAgIGlmKCBzdG9wQ29uZGl0aW9uXy5ldmFsdWF0ZSggdGhpcywgZnJhZyApICkKLSAgICB7Ci0gICAgICAvLyBUaGUgc3RvcCBjb25kaXRpb24gaGFzIGJlZW4gbWV0LgotICAgICAgLy8gRG8gbm90aGluZy4KLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAgICAKLSAgICAgIGludCBmcmFnSW5kZXggPSBpbmRleE9mKCBmcmFnICk7Ci0KLSAgICAgIC8vIE5vdGU6IHdoZW4gZnJhZ21lbnQgPT0gbnVsbCB0aGUgZnJhZ0luZGV4Ci0gICAgICAvLyAgICAgICBzaG91bGQgYmUgLTEuICBUaGVyZWZvcmUsIGlmIHRoZXJlCi0gICAgICAvLyAgICAgICBpcyBhbHJlYWR5IGEgZmlyc3QgZnJhZ21lbnQgaW4KLSAgICAgIC8vICAgICAgIGZyYWdtZW50SGlzdG9yeSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICBpZiggZnJhZ0luZGV4ICsgMSA8IGZyYWdtZW50SGlzdG9yeV8uc2l6ZSgpICkKLSAgICAgIHsKLSAgICAgICAgLy8gV2UgaGF2ZSBhIGNvcHkgb2YgdGhlIGZyYWdtZW50IGFscmVhZHkuCi0gICAgICAgIG5leHRGcmFnID0gKENvbW1hbmRGcmFnbWVudCkoZnJhZ21lbnRIaXN0b3J5Xy5lbGVtZW50QXQoIGZyYWdJbmRleCArIDEgKSk7IAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBuZXh0RnJhZyA9IChDb21tYW5kRnJhZ21lbnQpKGZyYWdtZW50Xy5jbG9uZSgpKTsKLSAgICAgICAgZnJhZ21lbnRIaXN0b3J5Xy5hZGQoIG5leHRGcmFnICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5leHRGcmFnOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9TZXF1ZW5jZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9TZXF1ZW5jZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGNmZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvU2VxdWVuY2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kRmFjdG9yeTsKLQotCi0vKioKLSAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzZXF1ZW5jZSBvZiBDb21tYW5kRnJhZ21lbnRzLgotKiovCi1wdWJsaWMgY2xhc3MgU2VxdWVuY2VGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50Ci17Ci0gIHByaXZhdGUgTGlzdCBmcmFnbWVudExpc3RfOwotCi0gIHByb3RlY3RlZCBTZXF1ZW5jZUZyYWdtZW50KCBTZXF1ZW5jZUZyYWdtZW50IGZyYWcgKQotICB7Ci0gIAlzdXBlciggZnJhZy5nZXRDb21tYW5kRmFjdG9yeSgpLCBmcmFnLmdldElkKCkgKTsKLSAgCQotICAgIGZyYWdtZW50TGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGZyYWcuZnJhZ21lbnRMaXN0Xy5zaXplKCk7IGluZGV4KysgKQotICAgIHsKLSAgICAgIE9iamVjdCBuZXdGcmFnID0gKChDb21tYW5kRnJhZ21lbnQpZnJhZy5mcmFnbWVudExpc3RfLmdldChpbmRleCkpLmNsb25lKCk7Ci0gICAgICBmcmFnbWVudExpc3RfLmFkZCggbmV3RnJhZyApOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFNlcXVlbmNlRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudFtdIGZyYWdtZW50cywgCi0JCQkJCQkgICBDb21tYW5kRmFjdG9yeSAgICBjb21tYW5kRmFjdG9yeSwgCi0JCQkJCSAgICAgICBTdHJpbmcgICAgICAgICAgICBpZCAgKQotICB7Ci0gIAlzdXBlciggY29tbWFuZEZhY3RvcnksIGlkICk7Ci0gIAkKLSAgICBpZiggZnJhZ21lbnRzICE9IG51bGwgKQotICAgIHsKLSAgICAgIGZyYWdtZW50TGlzdF8gPSBBcnJheXMuYXNMaXN0KCBmcmFnbWVudHMgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZyYWdtZW50TGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU2VxdWVuY2VGcmFnbWVudCgpCi0gIHsKLSAgCXN1cGVyKCBudWxsLCAiIiApOwotICAJCi0gIAlmcmFnbWVudExpc3RfID0gbmV3IFZlY3RvcigpOwotICB9Ci0KLSAgLyoqCi0gICAgKiBBcHBlbmRzIGEgZnJhZ21lbnQgdG8gdGhlIHNlcXVlbmNlLiAKLSAgKiovCi0gIHB1YmxpYyB2b2lkIGFkZCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIGZyYWdtZW50TGlzdF8uYWRkKCBmcmFnbWVudCApOwotICB9Ci0gIAotICAvKioKLSAgICAqIE1ha2VzIGEgY29weSBvZiB0aGUgQ29tbWFuZEZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBmcmFnbWVudC4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTZXF1ZW5jZUZyYWdtZW50KCB0aGlzICk7Ci0gIH0KLQotICAvKiogCi0gICAgKiBHZXRzIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucwotICAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCkKLSAgewotICAgIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCA9IG51bGw7Ci0KLSAgICBpZiggZnJhZ21lbnRMaXN0XyA9PSBudWxsIHx8IGZyYWdtZW50TGlzdF8uc2l6ZSgpID09IDAgKQotICAgIHsKLSAgICAgIGZyYWdtZW50ID0gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAgICAKLSAgICAgIGZyYWdtZW50ID0gKENvbW1hbmRGcmFnbWVudCkoIGZyYWdtZW50TGlzdF8uZ2V0KDApICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZyYWdtZW50OyAgICAKLSAgfQotCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgaW50IGluZGV4ID0gZnJhZ21lbnRMaXN0Xy5pbmRleE9mKCBmcmFnbWVudCApOwotCi0gICAgaWYoIGluZGV4ID09IC0xICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRnJhZ21lbnQgbm90IGZvdW5kIGluIHNlcXVlbmNlLiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW5kZXgrKzsKLQotICAgICAgaWYoIGluZGV4ID49IGZyYWdtZW50TGlzdF8uc2l6ZSgpICkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlcmUgaXMgbm90aGluZyBmb2xsb3dpbmcgdGhpcyBmcmFnbWVudCBzbyByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFJldHVybiB0aGUgbmV4dCBmcmFnbWVudC4KLSAgICAgICAgcmV0dXJuIChDb21tYW5kRnJhZ21lbnQpKGZyYWdtZW50TGlzdF8uZ2V0KCBpbmRleCApKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0JCi19ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L1NpbXBsZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9TaW1wbGVGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjM1OTAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L1NpbXBsZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuKjsKLQotLyoqCi0gICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGFuIGVtcHR5IG9mIFdpemFyZEZyYWdtZW50LgotKiovCi1wdWJsaWMgY2xhc3MgU2ltcGxlRnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudAotewotICBwdWJsaWMgU2ltcGxlRnJhZ21lbnQoKQotICB7Ci0gICAgdGhpcyggKENvbW1hbmRGYWN0b3J5KW51bGwsICIiICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTaW1wbGVGcmFnbWVudCggU3RyaW5nIGlkICkKLSAgewotICAgIHRoaXMoIChDb21tYW5kRmFjdG9yeSludWxsLCBpZCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTaW1wbGVGcmFnbWVudCggZmluYWwgQ29tbWFuZCBjb21tYW5kLCBTdHJpbmcgaWQgKQotICB7Ci0gICAgc3VwZXIoIG5ldyBDb21tYW5kRmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfSwgaWQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgU2ltcGxlRnJhZ21lbnQoIENvbW1hbmRGYWN0b3J5IGNvbW1hbmRGYWN0b3J5LCBTdHJpbmcgaWQgKQotICB7Ci0gIAlzdXBlciggY29tbWFuZEZhY3RvcnksIGlkICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgICogQ29weSBjb25zdHJ1Y3RvciBmb3IgZnJhZ21lbnQuCi0gICoqLwotICBwcm90ZWN0ZWQgU2ltcGxlRnJhZ21lbnQoIFNpbXBsZUZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHN1cGVyKCBmcmFnbWVudC5nZXRDb21tYW5kRmFjdG9yeSgpLCBmcmFnbWVudC5nZXRJZCgpICk7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAgKiBBbGwgd2l6YXJkIGZyYWdtZW50cyBuZWVkIHRvIGJlIGNsb25lYWJsZS4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVGcmFnbWVudCggdGhpcyApOwotICB9Ci0KLQotICAvKiogCi0gICAgKiBHZXRzIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucwotICAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCl7IHJldHVybiBudWxsOyB9Ci0KLSAgLyoqCi0gICAgKiBHZXRzIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICogU2luY2UgdGhpcyBpcyBhIHNpbXBsZSBmcmFnbWVudCwgdGhlcmUgaXMgbm8gbmV4dCBmcmFnbWVudAotICAgICogc28gd2Ugd2lsbCBhbHdheXMgcmV0dXJuIG51bGwuIAotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMgbnVsbAotICAgICogd2hlbiB0aGVyZSBpcyBubyBuZXh0IGNoaWxkLgotICAqKi8gIAotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldE5leHRTdWJGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICl7IHJldHVybiBudWxsOyB9Ci19ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3JlZ2lzdHJ5L0NvbW1hbmRSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvcmVnaXN0cnkvQ29tbWFuZFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNGE5YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvcmVnaXN0cnkvQ29tbWFuZFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB3YXkgdG8gY3JlYXRlIGEgQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkKLSAqIGZyb20gYW4gYXJyYXkgb2YgaWRzLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kUmVnaXN0cnkgCi17ICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBDb21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSBmcm9tIGFuIGFycmF5IG9mIGlkcy4KLSAgICogCi0gICAqIEBwYXJhbSBpZHMgdGhlIGlkcy4KLSAgICogQHJldHVybiB0aGUgQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3Rvcnkgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5IGdldEZhY3RvcnlGYWN0b3J5KCBTdHJpbmdbXSBpZHMgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3NlbGVjdGlvbi9Cb29sZWFuU2VsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9zZWxlY3Rpb24vQm9vbGVhblNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY3ZWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3NlbGVjdGlvbi9Cb29sZWFuU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIFRoaXMgY2xhc3MgY29tYmluZXMgYSBzdHJpbmcgd2l0aCBhIGJvb2xlYW4gdmFsdWUuICBUaGlzIGlzCi0gKiB1c2VmdWwgZm9yIHN0b3JpbmcgdGhlIHN0YXRlIGRhdGEgZm9yIGEgYm9vbGVhbiBzZWxlY3Rpb24gbGlzdC4KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuU2VsZWN0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nICB2YWx1ZV87Ci0gIHByaXZhdGUgYm9vbGVhbiBzZWxlY3RlZF87Ci0gIAotICBwdWJsaWMgQm9vbGVhblNlbGVjdGlvbiggU3RyaW5nIHZhbHVlLCBib29sZWFuIHNlbGVjdGVkICkKLSAgewotICAgIHZhbHVlXyAgICA9IHZhbHVlOwotICAgIHNlbGVjdGVkXyA9IHNlbGVjdGVkOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gR2V0IHRoZSBzdHJpbmcgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiBHZXQgdGhlIGJvb2xlYW4gdmFsdWUgZm9yIHRoaXMgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWRfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9zZWxlY3Rpb24vQ2hvaWNlc1RvU3RyaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9zZWxlY3Rpb24vQ2hvaWNlc1RvU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2VhYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL0Nob2ljZXNUb1N0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIFRoaXMgdHJhbnNmb3JtZXIgY2xhc3Mgc2VsZWN0cyBhIHN0cmluZyBhdCBhIHBhcnRpY3VsYXIgbGV2ZWwKLSAqIGluIGEgU2VsZWN0aW9uTGlzdENob2ljZXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaG9pY2VzVG9TdHJpbmcgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotICBwcml2YXRlIGludCBsZXZlbF87Ci0gIAotICBwdWJsaWMgQ2hvaWNlc1RvU3RyaW5nKCBpbnQgbGV2ZWwgKQotICB7Ci0gICAgbGV2ZWxfID0gbGV2ZWw7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyI3RyYW5zZm9ybShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oIE9iamVjdCB2YWx1ZSApCi0gIHsKLSAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjaG9pY2VzID0gKFNlbGVjdGlvbkxpc3RDaG9pY2VzKXZhbHVlOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZXZlbF87IGluZGV4KysgKQotICAgIHsKLSAgICAgIGNob2ljZXMgPSBjaG9pY2VzLmdldENob2ljZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY2hvaWNlcy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgU2VsZWN0aW9uTGlzdCB0cmFuc2Zvcm0oIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNob2ljZXMgKQotICB7Ci0gICAgcmV0dXJuIChTZWxlY3Rpb25MaXN0KXRyYW5zZm9ybSggKE9iamVjdCljaG9pY2VzICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3NlbGVjdGlvbi9EeW5hbWljTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL0R5bmFtaWNMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjkwNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL0R5bmFtaWNMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBhIER5bmFtaWMgdmVyc2lvbiBvZiB0aGUgU2VsZWN0aW9uTGlzdENob2ljZXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljTGlzdCAKLXsKLSAgcHJpdmF0ZSBWZWN0b3Igc3RyaW5nTGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgVmVjdG9yIGR5bmFtaWNMaXN0VmVjdG9yTGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gIAotICAvKioKLSAgICogQWRkcyBhbiBlbnRyeSBpbnRvIHRoZSBkeW5hbWljIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsdWVzIHRoZSBzdHJpbmcgdmFsdWVzIHRoYXQgbGVhZCB0byB0aGUgdGFyZ2V0LgotICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGQoIFN0cmluZ1tdIHZhbHVlcywgT2JqZWN0IHRhcmdldCApCi0gIHsKLSAgICBEeW5hbWljTGlzdCBjdXJyZW50TGlzdCA9IHRoaXM7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHZhbHVlcy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWx1ZSAgICAgID0gdmFsdWVzW2luZGV4XTsKLSAgICAgIGludCAgICBsZW5ndGggICAgID0gY3VycmVudExpc3Quc3RyaW5nTGlzdF8uc2l6ZSgpOwotICAgICAgaW50ICAgIGZvdW5kSW5kZXggPSAtMTsKLSAgICAgIAotICAgICAgLy8gRmluZCB0aGUgc3RyaW5nIGluIHRoZSBjdXJyZW50IGxpc3QuCi0gICAgICBmb3IoIGludCBzZWFyY2hJbmRleCA9IDA7IHNlYXJjaEluZGV4IDwgbGVuZ3RoOyBzZWFyY2hJbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpY3VycmVudExpc3Quc3RyaW5nTGlzdF8uZWxlbWVudEF0KCBzZWFyY2hJbmRleCApOyAKLSAgICAgICAgCi0gICAgICAgIGlmKCBzdHJpbmcuZXF1YWxzKCB2YWx1ZSApICkgCi0gICAgICAgIHsKLSAgICAgICAgICBmb3VuZEluZGV4ID0gc2VhcmNoSW5kZXg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYoIGZvdW5kSW5kZXggPT0gLTEgKQotICAgICAgewotICAgICAgICAvLyBXZSBoYXZlIGEgbmV3IHN0cmluZyBzbyBhZGQgaXQgdG8gdGhlIGxpc3QuCi0gICAgICAgIGN1cnJlbnRMaXN0LnN0cmluZ0xpc3RfLmFkZCggdmFsdWUgKTsKLSAgICAgICAgY3VycmVudExpc3QuZHluYW1pY0xpc3RWZWN0b3JMaXN0Xy5hZGQoIG5ldyBEeW5hbWljTGlzdCgpICk7Ci0gICAgICAgIGZvdW5kSW5kZXggPSBsZW5ndGg7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGN1cnJlbnRMaXN0ID0gKER5bmFtaWNMaXN0KWN1cnJlbnRMaXN0LmR5bmFtaWNMaXN0VmVjdG9yTGlzdF8uZWxlbWVudEF0KCBmb3VuZEluZGV4ICk7ICAgICAgIAotICAgIH0KLSAgICAKLSAgICBjdXJyZW50TGlzdC5keW5hbWljTGlzdFZlY3Rvckxpc3RfLmFkZCggdGFyZ2V0ICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgU2VsZWN0aW9uTGlzdENob2ljZXMgb2JqZWN0IGZyb20gdGhpcyBEeW5hbWljTGlzdAotICAgKiBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgdG9MaXN0Q2hvaWNlcygpCi0gIHsKLSAgICBTZWxlY3Rpb25MaXN0IGxpc3QgICA9IG5ldyBTZWxlY3Rpb25MaXN0KCAoU3RyaW5nW10pc3RyaW5nTGlzdF8udG9BcnJheSggbmV3IFN0cmluZ1swXSApLCAwKTsKLSAgICBpbnQgICAgICAgICAgIGxlbmd0aCA9IGR5bmFtaWNMaXN0VmVjdG9yTGlzdF8uc2l6ZSgpOwotICAgIFZlY3RvciAgICAgICAgdmVjdG9yID0gbmV3IFZlY3RvcigpOyAKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gZHluYW1pY0xpc3RWZWN0b3JMaXN0Xy5lbGVtZW50QXQoaW5kZXgpOwotICAgICAgCi0gICAgICBpZiggb2JqIGluc3RhbmNlb2YgRHluYW1pY0xpc3QgKQotICAgICAgewotICAgICAgICB2ZWN0b3IuYWRkKCAoKER5bmFtaWNMaXN0KW9iaikudG9MaXN0Q2hvaWNlcygpICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZlY3Rvci5hZGQoIG9iaiApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKCBsaXN0LCB2ZWN0b3IgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL1NlbGVjdGlvbkxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3NlbGVjdGlvbi9TZWxlY3Rpb25MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZGFkMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL1NlbGVjdGlvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIGEgbGlzdCBzdHJpbmdzIGFsb25nIHdpdGggYSBzZWxlY3Rpb25JbmRleCB3aGljaAotICogc3RvcmVzIHRoZSBjdXJyZW50IHN0cmluZyB0aGF0IHNlbGVjdGVkLiAgVGhlcmUgaXMgYWxzbyBhIHNlbGVjdGlvbgotICogdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIG9uZSBvZiB0aGUgc3RyaW5ncyBpbiB0aGUgdGhlIHN0cmluZyBsaXN0Ci0gKiB0aGVuIHNlbGVjdGlvbkluZGV4IHdpbGwgY29udGFpbiB0aGUgaW5kZXggb2YgdGhpcyBzdHJpbmcuICBJZiBpdAotICogaXMgbm90IGluIHRoZSBsaXN0IHRoZW4gdGhlIHNlbGVjdGlvblZhbHVlIHN0cmluZyB3aWxsIGNvbnRhaW4gdGhpcwotICogdmFsdWUgYW5kIHNlbGVjdGlvbkluZGV4IHdpbGwgYmUgc2V0IHRvIC0xLiAgVGhpcyBjbGFzcyBjYW4gYmUKLSAqIHVzZWQgdG8gc3RvcmUgdGhlIHN0YXRlIGRhdGEgZm9yIGEgQ29tYm8gYm94LgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uTGlzdAotewotICBwcml2YXRlIGludCAgICAgIHNlbGVjdGlvbkluZGV4XzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBsaXN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICBzZWxlY3Rpb25WYWx1ZV87Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdCggU3RyaW5nW10gbGlzdCwgaW50IHNlbGVjdGlvbkluZGV4ICkKLSAgewotICAgIGxpc3RfICAgICAgICAgICA9IGxpc3Q7Ci0gICAgc2VsZWN0aW9uSW5kZXhfID0gc2VsZWN0aW9uSW5kZXg7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzZWxlY3Rpb24gdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgotICAgKiAKLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblZhbHVlKCBTdHJpbmcgdmFsdWUgKQotICB7Ci0gICAgc2VsZWN0aW9uVmFsdWVfID0gdmFsdWU7ICAKLSAgICBzZWxlY3Rpb25JbmRleF8gPSAtMTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdF8ubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBpZiggdmFsdWUuZXF1YWxzKCBsaXN0X1tpbmRleF0gKSApCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbkluZGV4XyA9IGluZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0gCi0gIAotICAvKgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHN0cmluZyBsaXN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldExpc3QoKQotICB7Ci0gICAgcmV0dXJuIGxpc3RfOwotICB9Ci0gIAotICAvKgotICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3RyaW5nIGluIHRoZSBsaXN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5kZXgoIGludCBpbmRleCApCi0gIHsKLSAgICBzZWxlY3Rpb25JbmRleF8gPSBpbmRleDsKLSAgICBzZWxlY3Rpb25WYWx1ZV8gPSBudWxsOwotICB9Ci0gCi0gIC8qCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3RyaW5nLiAgVGhlIHZhbHVlCi0gICAqIHdpbGwgYmUgLTEgaWYgdGhlIHNlbGVjdGlvbiB2YWx1ZSBpcyBub3QgaW4gdGhlIHN0cmluZyBsaXN0LgotICAgKi8KLSAgcHVibGljIGludCBnZXRJbmRleCgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uSW5kZXhfOyAgCi0gIH0KLSAgCi0gIC8qCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgY3VycmVudCBzdHJpbmcgc2VsZWN0aW9uIGZvciB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIGlmKCBzZWxlY3Rpb25WYWx1ZV8gIT0gbnVsbCApIHJldHVybiBzZWxlY3Rpb25WYWx1ZV87Ci0gICAgCi0gICAgaWYoIHNlbGVjdGlvbkluZGV4XyA9PSAtMSB8fCBzZWxlY3Rpb25JbmRleF8gPiBsaXN0Xy5sZW5ndGgtMSApCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGxpc3RfWyBzZWxlY3Rpb25JbmRleF8gXTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3NlbGVjdGlvbi9TZWxlY3Rpb25MaXN0Q2hvaWNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL1NlbGVjdGlvbkxpc3RDaG9pY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDYyNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL1NlbGVjdGlvbkxpc3RDaG9pY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBzdG9yZSBhIGhpZXJhcmNoeSBvZiBTZWxlY3Rpb25MaXN0Ci0gKiBvYmplY3RzLgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uTGlzdENob2ljZXMKLXsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IHNlbGVjdGlvbkxpc3RfOwotICBwcml2YXRlIFZlY3RvciAgICAgICAgY2hvaWNlc187Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdCBuZXdWYWx1ZVNlbGVjdGlvbkxpc3RfOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gbGlzdCAgICAgVGhlIHNlbGVjdGlvbiBsaXN0LgotICAgKiBAcGFyYW0gY2hvaWNlcyAgVGhpcyBpcyBhIHZlY3RvciBvZiBTZWxlY3Rpb25MaXN0Q2hvaWVzIGFuZCBjYW4gYmUKLSAgICogICAgICAgICAgICAgICAgIG51bGwgaWYgdGhlcmUgYXJlIG5vIGNob2ljZXMuICBUaGlzIGluZGV4IG9mIGxpc3QKLSAgICogICAgICAgICAgICAgICAgIGlzIHVzZWQgdG8gaW5kZXggaW50byBjaG9pY2VzLiAgSWYgaW5kZXggaXMgLTEgdGhlbgotICAgKiAgICAgICAgICAgICAgICAgdGhlIG5ld1ZhbHVlU2VsZWN0aW9uTGlzdCBpcyB1c2VkLgotICAgKi8KLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzKCBTZWxlY3Rpb25MaXN0IGxpc3QsIFZlY3RvciBjaG9pY2VzICkKLSAgewotICAgIHNlbGVjdGlvbkxpc3RfID0gbGlzdDsKLSAgICBjaG9pY2VzXyAgICAgICA9IGNob2ljZXM7Ci0gICAgCi0gICAgbmV3VmFsdWVTZWxlY3Rpb25MaXN0XyA9IG5ldyBTZWxlY3Rpb25MaXN0KCBuZXcgU3RyaW5nWzBdLCAtMSApOwotICB9Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMoIFNlbGVjdGlvbkxpc3QgbGlzdCwgVmVjdG9yIGNob2ljZXMsIFNlbGVjdGlvbkxpc3QgbmV3TGlzdCApCi0gIHsKLSAgICB0aGlzKCBsaXN0LCBjaG9pY2VzICk7Ci0gICAgbmV3VmFsdWVTZWxlY3Rpb25MaXN0XyA9IG5ld0xpc3Q7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGN1cnJlbnQgU2VsZWN0aW9uIGxpc3QuCi0gICAqLwotICBwdWJsaWMgU2VsZWN0aW9uTGlzdCBnZXRMaXN0KCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25MaXN0XzsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGNob2ljZXMgZm9yIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRDaG9pY2VzKCkKLSAgewotICAgIHJldHVybiBjaG9pY2VzXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gbGV2ZWwgdGhlIGxldmVsIGluIHRoZSBoaWVyYXJjaHkgd2hlcmUgd2Ugd2FudCB0byBnZXQgdGhlIGNob2ljZXMuCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIHZlY3RvciBvZiBTZWxlY3Rpb25MaXN0Q2hvaWNlcy4KLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0Q2hvaWNlc0F0TGV2ZWwoIGludCBsZXZlbCApCi0gIHsKLSAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjaG9pY2VzID0gdGhpczsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGV2ZWw7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGNob2ljZXMgPSBjaG9pY2VzLmdldENob2ljZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY2hvaWNlcy5nZXRDaG9pY2VzKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBjdXJyZW50IFNlbGVjdGlvbkxpc3RDaG9pY2UKLSAgICovCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRDaG9pY2UoKQotICB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSW5kZXggPSBzZWxlY3Rpb25MaXN0Xy5nZXRJbmRleCgpOwotICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJlc3VsdCAgICAgICAgID0gbnVsbDsKLSAgICAKLSAgICBpZiggc2VsZWN0aW9uSW5kZXggPT0gLTEgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyggbmV3VmFsdWVTZWxlY3Rpb25MaXN0XywgbnVsbCApOwotICAgIH0KLSAgICBlbHNlIGlmKCBjaG9pY2VzXyAhPSBudWxsICYmIGNob2ljZXNfLnNpemUoKSAhPSAwICkgCi0gICAgewotICAgICAgcmVzdWx0ID0gKFNlbGVjdGlvbkxpc3RDaG9pY2VzKWNob2ljZXNfLmVsZW1lbnRBdCggc2VsZWN0aW9uSW5kZXggKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaG9pY2Ugd2Ugd2FudC4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBTZWxlY3Rpb25MaXN0Q2hvaWNlIGF0IHRoZSBpbmRleCBzcGVjaWZpZWQuCi0gICAqLwotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0Q2hvaWNlKGludCBpbmRleCkKLSAgewotICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBnZXRMaXN0KCkuZ2V0TGlzdCgpLmxlbmd0aCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMoIG5ld1ZhbHVlU2VsZWN0aW9uTGlzdF8sIG51bGwgKTsgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChTZWxlY3Rpb25MaXN0Q2hvaWNlcyljaG9pY2VzXy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgfQotICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL05hdGl2ZUZpbGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvTmF0aXZlRmlsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhOGI3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvTmF0aXZlRmlsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmF0aXZlRmlsZUNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0gIHByb3RlY3RlZCBVUklbXSB1cmlzVG9SZWFkOwotCi0gIHByb3RlY3RlZCBVUklbXSB1cmlzVG9Xcml0ZTsKLQotICBwcm90ZWN0ZWQgTmF0aXZlRmlsZUNvbW1hbmQgKCkKLSAgewotICAgIHRoaXMobnVsbCxudWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBOYXRpdmVGaWxlQ29tbWFuZCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24gKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VVJJc1RvUmVhZCAoIFVSSVtdIHVyaXNUb1JlYWQgKQotICB7Ci0gICAgdGhpcy51cmlzVG9SZWFkID0gdXJpc1RvUmVhZDsKLSAgfQotCi0gIHB1YmxpYyBVUklbXSBnZXRVUklzVG9SZWFkICgpCi0gIHsKLSAgICByZXR1cm4gdXJpc1RvUmVhZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVSSXNUb1dyaXRlICggVVJJW10gdXJpc1RvV3JpdGUgKQotICB7Ci0gICAgdGhpcy51cmlzVG9Xcml0ZSA9IHVyaXNUb1dyaXRlOwotICB9Ci0KLSAgcHVibGljIFVSSVtdIGdldFVSSXNUb1dyaXRlICgpCi0gIHsKLSAgICByZXR1cm4gdXJpc1RvV3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUgKCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICBGaWxlW10gZmlsZXNUb1JlYWQgPSBnZXRGaWxlcyh1cmlzVG9SZWFkKTsKLSAgICBGaWxlW10gZmlsZXNUb1dyaXRlID0gZ2V0RmlsZXModXJpc1RvV3JpdGUpOwotICAgIHByZVByb2Nlc3MoZmlsZXNUb1JlYWQsZmlsZXNUb1dyaXRlKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gZXhlY3V0ZShlbnZpcm9ubWVudCxmaWxlc1RvUmVhZCxmaWxlc1RvV3JpdGUpOwotICAgIHBvc3RQcm9jZXNzKGZpbGVzVG9SZWFkLGZpbGVzVG9Xcml0ZSk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBTdGF0dXMgZXhlY3V0ZSAoIEVudmlyb25tZW50IGVudmlyb25tZW50LCBGaWxlW10gZmlsZXNUb1JlYWQsIEZpbGVbXSBmaWxlc1RvV3JpdGUgKTsKLQotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9hYmxlICgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHVuZG8gKCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVkb2FibGUgKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgcmVkbyAoIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByZVByb2Nlc3MgKCBGaWxlW10gZmlsZXNUb1JlYWQsIEZpbGVbXSBmaWxlc1RvV3JpdGUgKQotICB7Ci0gICAgLy8gVEJELgotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBvc3RQcm9jZXNzICggRmlsZVtdIGZpbGVzVG9SZWFkLCBGaWxlW10gZmlsZXNUb1dyaXRlICkKLSAgewotICAgIC8vIFRCRC4KLSAgfQotCi0gIHByaXZhdGUgRmlsZVtdIGdldEZpbGVzICggVVJJW10gdXJpcyApCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgIGlmICh1cmlzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPHVyaXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmICh1cmlzW2ldLmlzQXZhaWxhYmxlQXNGaWxlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZCh1cmlzW2ldLmFzRmlsZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFVSSUV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChGaWxlW10pbGlzdC50b0FycmF5KG5ldyBGaWxlWzBdKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1JlbGF0aXZlU2NoZW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvUmVsYXRpdmVTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3Zjk1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvUmVsYXRpdmVTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVNjaGVtZSBpbXBsZW1lbnRzIFVSSVNjaGVtZQotewotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNpc0hpZXJhcmNoaWNhbCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNpc1ZhbGlkKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChVUkkgdXJpKQotICB7Ci0gICAgcmV0dXJuICF1cmkudG9TdHJpbmcoKS5zdGFydHNXaXRoKCAiLyIgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFN0cmluZyB1cmkpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkoVVJJIHVyaSkgCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlbGF0aXZlVVJJKCB1cmkudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI25ld1VSSShqYXZhLm5ldC5VUkwpCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSShVUkwgdXJsKSAKLSAgewotICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVybC50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjdmFsaWRhdGUob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlKFVSSSB1cmkpCi0gIHsKLSAgICBTdGF0dXMgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBpZiggaXNWYWxpZCggdXJpICkgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCAiIiwgU3RhdHVzLk9LICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgIiIsIFN0YXR1cy5FUlJPUiApOyAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvUmVsYXRpdmVVUkkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9SZWxhdGl2ZVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE3N2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9SZWxhdGl2ZVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVVSSSBpbXBsZW1lbnRzIFVSSQotewotICBwcm90ZWN0ZWQgU3RyaW5nIHVyaV87Ci0gIAotICBwdWJsaWMgUmVsYXRpdmVVUkkoIFN0cmluZyB1cmkgKQotICB7Ci0gICAgdXJpXyA9IHVyaTsgICAKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FwcGVuZChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kKFVSSSByZWxhdGl2ZVVSSSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgaWYoICFyZWxhdGl2ZVVSSS5pc1JlbGF0aXZlKCkpIAotICAgICB7Ci0gICAgICBNZXNzYWdlVXRpbHMgbXNnID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmVudmlyb25tZW50IiwgbmV3IER1bW15KCkgKTsKLSAgICAgIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIlJlbGF0aXZlVVJJIiwgCi0gICAgICAgICAgICAgIG1zZy5nZXRNZXNzYWdlKCAiTVNHX1VSSV9OT1RfUkVMQVRJVkUiLCBuZXcgT2JqZWN0W117IHJlbGF0aXZlVVJJLnRvU3RyaW5nKCkgfSksCi0gICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIG5ld1VSSSA9IHVyaV8gKyAiLyIgKyByZWxhdGl2ZVVSSS50b1N0cmluZygpOwotICAgIAotICAgIHJldHVybiBnZXRVUklTY2hlbWUoKS5uZXdVUkkoIG5ld1VSSSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FzRmlsZSgpCi0gICAqLwotICBwdWJsaWMgRmlsZSBhc0ZpbGUoKSAKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FzU3RyaW5nKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIHVyaV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b1N0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNVUkwoKQotICAgKi8KLSAgcHVibGljIFVSTCBhc1VSTCgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFVSTCB1cmwgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHVybCA9IG5ldyBVUkwoIHVyaV8gKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiUmVsYXRpdmVVUkkiLCBleGMuZ2V0TWVzc2FnZSgpLCBTdGF0dXMuRVJST1IgKSwKLSAgICAgICAgICAgIHRoaXMgKTsgCi0gICAgfQotICAgIAotICAgIHJldHVybiB1cmw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZXJhc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXJhc2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRJbnB1dFN0cmVhbSgpCi0gICAqLwotICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRVUklTY2hlbWUoKQotICAgKi8KLSAgcHVibGljIFVSSVNjaGVtZSBnZXRVUklTY2hlbWUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVNjaGVtZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzQXZhaWxhYmxlQXNGaWxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNGaWxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzVVJMKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNIaWVyYXJjaGljYWwoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNMZWFmKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGVhZigpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNQcmVzZW50KCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNSZWFkYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1JlbGF0aXZlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNXcml0YWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KCkKLSAgICovCi0gIHB1YmxpYyBVUklbXSBsaXN0KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBVUklbMF07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjbGlzdChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSUZpbHRlcikKLSAgICovCi0gIHB1YmxpYyBVUklbXSBsaXN0KFVSSUZpbHRlciB1cmlGaWx0ZXIpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXcgVVJJWzBdOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3BhcmVudCgpCi0gICAqLwotICBwdWJsaWMgVVJJIHBhcmVudCgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGludCBsYXN0U2xhc2ggID0gdXJpXy5sYXN0SW5kZXhPZiggJy8nICk7Ci0gICAgaW50IGZpcnN0U2xhc2ggPSB1cmlfLmluZGV4T2YoICcvJyApOwotICAgIAotICAgIC8vIElmIHRoZXJlIGlzIGEgcGFyZW50LCB0aGVuIGl0IG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoCi0gICAgLy8gYW5kIGVuZCB3aXRoIGEgc2xhc2guCi0gICAgaWYoIGxhc3RTbGFzaCA9PSAtMSB8fCBmaXJzdFNsYXNoID09IC0xICkgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotICAgIHJldHVybiBnZXRVUklTY2hlbWUoKS5uZXdVUkkoIHVyaV8uc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCApICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjcmVuYW1lKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lKFVSSSBuZXdVUkkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHVyaV8gPSBuZXdVUkkudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaEZvbGRlcigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaEZvbGRlcigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoTGVhZigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaExlYWYoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN2aXNpdChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVZpc2l0b3IsIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJRmlsdGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoVVJJVmlzaXRvciB1cmlWaXNpdG9yLCBVUklGaWx0ZXIgdXJpRmlsdGVyKQotICAgIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gY29udGludWVWaXNpdCA9IHRydWU7Ci0gICAgCi0gICAgLy8gSWYgdGhlIGZpbHRlciBhY2NlcHRzIHRoaXMgd2Ugd2lsbCB2aXNpdCBpdC4KLSAgICBpZiggdXJpRmlsdGVyLmFjY2VwdHMoIHRoaXMgKSApCi0gICAgewotICAgICAgY29udGludWVWaXNpdCA9IHVyaVZpc2l0b3IudmlzaXQoIHRoaXMgKTsgIAotICAgIH0KLSAgICAgICAKLSAgICBVUklbXSBjaGlsZHJlbiAgPSBsaXN0KCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aCAmJiBjb250aW51ZVZpc2l0OyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBjaGlsZHJlbltpbmRleF0udmlzaXQoIHVyaVZpc2l0b3IsIHVyaUZpbHRlciApOwotICAgIH0gIAotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3Zpc2l0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJVmlzaXRvcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFVSSVZpc2l0b3IgdXJpVmlzaXRvcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBjb250aW51ZVZpc2l0ID0gdXJpVmlzaXRvci52aXNpdCggdGhpcyApOyAgCi0gICAgCi0gICAgVVJJW10gY2hpbGRyZW4gID0gbGlzdCgpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGggJiYgY29udGludWVWaXNpdDsgaW5kZXgrKyApCi0gICAgIHsKLSAgICAgIGNoaWxkcmVuW2luZGV4XS52aXNpdCggdXJpVmlzaXRvciApOwotICAgIH0gIAotICB9Ci0gICAgCi0gIHByaXZhdGUgY2xhc3MgRHVtbXkgCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1NpbXBsZVVSSUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9TaW1wbGVVUklGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYWFmMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1NpbXBsZVVSSUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVVJJRmFjdG9yeSBpbXBsZW1lbnRzIFVSSUZhY3RvcnkKLXsKLSAgcHJpdmF0ZSBIYXNodGFibGUgICAgc2NoZW1lc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ18gICAgID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmVudmlyb25tZW50IiwgdGhpcyApOwotICAKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFVSSVNjaGVtZSBzY2hlbWUgPSBuZXdVUklTY2hlbWUoIHVyaSApOwotICAgIAotICAgIHJldHVybiBzY2hlbWUubmV3VVJJKCB1cmkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFVSTCB1cmwpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFVSSVNjaGVtZSBzY2hlbWUgPSBuZXdVUklTY2hlbWUoIHVybC50b1N0cmluZygpICk7Ci0gICAgCi0gICAgcmV0dXJuIHNjaGVtZS5uZXdVUkkoIHVybCApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKi8KLSAgcHVibGljIFVSSVNjaGVtZSBuZXdVUklTY2hlbWUoU3RyaW5nIHNjaGVtZU9yVVJJKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBVUklTY2hlbWUgbmV3U2NoZW1lID0gbnVsbDsKLSAgICAKLSAgICBpZiggc2NoZW1lT3JVUkkgPT0gbnVsbCApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJTaW1wbGVVUklGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX05VTExfQVJHX1NQRUNJRklFRCIsIG5ldyBPYmplY3RbXXsibmV3VVJJU2NoZW1lIn0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuRVJST1IgKSApOwotICAgIH0KLSAgICAKLSAgICBpbnQgY29sb24gICAgPSBzY2hlbWVPclVSSS5pbmRleE9mKCc6Jyk7Ci0gICAgaW50IHNsYXNoICAgID0gc2NoZW1lT3JVUkkuaW5kZXhPZignLycpOwotICAgIAotICAgIC8vIEEgcHJvdG9jb2wgd2FzIHNwZWNpZmllZC4gIE5vdGU6IGEgY29sb24gYXBwZWFyaW5nIGFmdGVyIGEgcGF0aCBpcyBub3QKLSAgICAvLyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHByb3RvY29sIGZvciB0aGlzIFVSSS4KLSAgICBpZiggKGNvbG9uICE9IC0xICYmIHNsYXNoID09IC0xKSB8fCAoIGNvbG9uICE9IC0xICYmIGNvbG9uIDwgc2xhc2ggKSApCi0gICAgewotICAgICAgU3RyaW5nIHByb3RvY29sID0gc2NoZW1lT3JVUkkuc3Vic3RyaW5nKDAsIGNvbG9uICk7Ci0gICAgICBuZXdTY2hlbWUgICAgICAgPSAoVVJJU2NoZW1lKXNjaGVtZXNfLmdldCggcHJvdG9jb2wgKTsKLSAgICAgIAotICAgICAgaWYoIG5ld1NjaGVtZSA9PSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiU2ltcGxlVVJJRmFjdG9yeSIsCi0gICAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX1NDSEVNRV9OT1RfRk9VTkQiLCBuZXcgT2JqZWN0W117IHNjaGVtZU9yVVJJIH0pLAotICAgICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApICk7ICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBzY2hlbWVPclVSSS5zdGFydHNXaXRoKCAiLyIpICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiU2ltcGxlVVJJRmFjdG9yeSIsCi0gICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSggIk1TR19BQlNPTFVURV9QQVRIX1dJVEhPVVRfU0NIRU1FIiwgbmV3IE9iamVjdFtdeyBzY2hlbWVPclVSSSB9KSwKLSAgICAgICAgICAgICAgU3RhdHVzLkVSUk9SICkgKTsKLSAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbmV3U2NoZW1lID0gbmV3IFJlbGF0aXZlU2NoZW1lKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuZXdTY2hlbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyU2NoZW1lKCBTdHJpbmcgcHJvdG9jb2wsIFVSSVNjaGVtZSBzY2hlbWUgKQotICB7Ci0gICAgc2NoZW1lc18ucHV0KCBwcm90b2NvbCwgc2NoZW1lICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUkkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmMTI3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSBVUkkgcmVwcmVzZW50cyBhIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZlci4KLSAqLwotcHVibGljIGludGVyZmFjZSBVUkkKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyBmb3JtIG9mIHRoZSBVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSVNjaGVtZSBmb3IgdGhlIHNjaGVtZSBvZiB0aGlzIFVSSS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKi8KLSAgcHVibGljIFVSSVNjaGVtZSBnZXRVUklTY2hlbWUgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBVUkkgZXhpc3RzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50ICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgVVJJIGV4aXN0cwotICAgKiBhbmQgaXMgYSBsZWFmLiBSZXR1cm5zIHRydWUgYWx3YXlzIGZvciBub24taGllcmFyY2hpY2FsIHNjaGVtZXMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xlYWYgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBVUkkgZXhpc3RzCi0gICAqIGFuZCBpcyByZWFkYWJsZS4gQSByZWFkYWJsZSBsZWFmIHJlc291cmNlIGluZGljYXRlcyB0aGF0IGFuCi0gICAqIGlucHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIG9uIHRoZSByZXNvdXJjZS4gQSByZWFkYWJsZSBmb2xkZXIKLSAgICogcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBmb2xkZXIsIGlmIGFueSwKLSAgICogY2FuIGJlIGRldGVybWluZWQgdmlhIHRoZSBsaXN0KCkgb3IgdmlzaXQoKSBtZXRob2RzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmZiB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIFVSSSBleGlzdHMKLSAgICogYW5kIGlzIHdyaXRhYmxlLiBBIHdyaXRhYmxlIGxlYWYgcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgYW4KLSAgICogb3V0cHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIG9uIHRoZSByZXNvdXJjZS4gQSB3cml0YWJsZSBmb2xkZXIKLSAgICogcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgbmV3IHJlc291cmNlcyBjYW4gYmUgY3JlYXRlZCBpbiB0aGUgZm9sZGVyLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcml0YWJsZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmZiB0aGlzIFVSSSBiZWxvbmdzIHRvIGEgaGllcmFyY2hpY2FsIHNjaGVtZS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKiB0aGlzLmlzSGllcmFyY2hpY2FsKCkgPT0gdGhpcy5nZXRVUklTY2hlbWUoKS5pc0hpZXJhcmNoaWNhbCgpLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBVUkkgaXMgYSByZWxhdGl2ZSBVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBvZiB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhpcyBVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBVUkkgcGFyZW50ICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcsIG5vcm1hbGl6ZWQgVVJJIGZvcm1lZCBieSBhcHBlbmRpbmcgdGhlIGdpdmVuCi0gICAqIHJlbGF0aXZlIFVSSSB0byB0aGlzIFVSSS4gQm90aCBVUklzIG11c3QgYmUgaGllcmFyY2hpY2FsLgotICAgKiBUaGUgcmVzdWx0aW5nIFVSSSB3aWxsIGFsd2F5cyBiZSBoaWVyYXJjaGljYWwuIFRoZSBnaXZlbgotICAgKiBVUkkgbXVzdCBiZSByZWxhdGl2ZS4gVGhpcyBVUkkgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLgotICAgKiB0aGUgcmVzdWx0aW5nIFVSSSB3aWxsIGJlIGVxdWl2YWxlbnRseSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kICggVVJJIHJlbGF0aXZlVVJJICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogR2V0cyBhbiBJbnB1dFN0cmVhbSBmb3IgcmVhZGluZyBmcm9tIHRoZSByZXNvdXJjZQotICAgKiBpZGVudGlmaWVkIGJ5IHRoaXMgbGVhZiBvciBub24taGllcmFyY2hpY2FsIFVSSS4KLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBHZXRzIGFuIE91dHB1dFN0cmVhbSBmb3Igd3JpdGluZyB0byB0aGUgcmVzb3VyY2UKLSAgICogaWRlbnRpZmllZCBieSB0aGlzIGxlYWYgb3Igbm9uLWhpZXJhcmNoaWNhbCBVUkkuCi0gICAqLwotICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotICAgKiB0aGUgVVJJLiBPbiBjb21wbGV0aW9uLCB0aGlzLmlzTGVhZigpID09IHRydWUuIElmIGEgbGVhZgotICAgKiByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLiBJZiBhCi0gICAqIG5vbi1sZWFmIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIHVuZGVyIHRoaXMgVVJJLCBjcmVhdGlvbgotICAgKiB3aWxsIGZhaWwgYW5kIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoTGVhZiAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGZvbGRlciByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotICAgKiB0aGUgVVJJLiBUaGUgc2NoZW1lIG9mIHRoZSBVUkkgbXVzdCBiZSBoaWVyYXJjaGljYWwuCi0gICAqIE9uIGNvbXBsZXRpb24sIHRoaXMuaXNMZWFmKCkgPT0gZmFsc2UuIElmIGEgZm9sZGVyIHJlc291cmNlCi0gICAqIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIElmIGEgbGVhZiByZXNvdXJjZQotICAgKiBhbHJlYWR5IGV4aXN0cyB1bmRlciB0aGlzIFVSSSwgY3JlYXRpb24gd2lsbCBmYWlsIGFuZCBhbgotICAgKiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaEZvbGRlciAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBFcmFzZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBVUkkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZW5hbWVzIG9yIG1vdmVzIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgVVJJCi0gICAqIHRvIHRoZSBuZXcgVVJJLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lICggVVJJIG5ld1VSSSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFZpc2l0cyB0aGlzIHJlc291cmNlIGFuZCBpdHMgZGVjZW5kYW50cyBpbiBwcmUtb3JkZXIgZmFzaGlvbi4KLSAgICogRm9yIGVhY2ggcmVzb3VyY2UsIHdoZXRoZXIgYSBmb2xkZXIgb3IgYSBsZWFmLCB0aGUgZ2l2ZW4KLSAgICogVVJJVmlzaXRvcidzIHZpc2l0KCkgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBVUkkgb2YgdGhlCi0gICAqIHJlc291cmNlLiBJZiBVUklWaXNpdG9yLnZpc2l0KCkgcmV0dXJucyBmYWxzZSwgdGhlIHZpc2l0aW5nCi0gICAqIGFsZ29yaXRobSB3aWxsICJwcnVuZSIgdGhlIGRlY2VuZGFudHMgb2YgdGhlIHJlc291cmNlIGFuZAotICAgKiBjYXJyeSBvbiB2aXNpdGluZyB0aGUgcmVzdCBvZiB0aGUgdHJlZS4gSWYgVVJJVmlzaXRvci52aXNpdCgpCi0gICAqIHJldHVybnMgdHJ1ZSwgdGhlIHZpc2l0aW5nIGFsZ29yaXRobSB3aWxsIGNvbnRpbnVlIGl0cyB3YWxrCi0gICAqIGRvd24gdGhlIHJlc291cmNlJ3MgZGVzY2VuZGFudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCAoIFVSSVZpc2l0b3IgdXJpVmlzaXRvciApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEFzIGZvciB2aXNpdChVUklWaXNpdG9yKSwgZXhjZXB0IG9ubHkgcmVzb3VyY2UgVVJJcyB0aGF0IGFyZQotICAgKiBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVyIGFyZSB2aXNpdGVkLiBJZiBhIGZvbGRlciByZXNvdXJjZQotICAgKiBmYWlscyB0byBiZSBhY2NlcHRlZCBieSB0aGUgZmlsdGVyLCB0aGlzIHdpbGwgbm90IHByZXZlbnQgdGhlCi0gICAqIHZpc2l0aW5nIGFsZ29yaXRobSBmcm9tIHdhbGtpbmcgdGhlIHJlc291cmNlJ3MgZGVzY2VuZGFudHMuCi0gICAqIEl0IHJlbWFpbnMgdGhlIGpvYiBvZiB0aGUgdmlzaXRvciB0byBjaG9vc2Ugd2hldGhlciBvciBub3QgdG8KLSAgICogcHJ1bmUgYSBicmFuY2ggYnkgcmV0dXJuaW5nIGZhbHNlIG9yIHRydWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCAoIFVSSVZpc2l0b3IgdXJpVmlzaXRvciwgVVJJRmlsdGVyIHVyaUZpbHRlciApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIFVSSXMgZm9yIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gICAqIGhpZXJhcmNoaWNhbCwgbm9uLWxlYWYgVVJJLiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsCi0gICAqIHRob3VnaCBpdCBtYXkgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkuCi0gICAqLwotICBwdWJsaWMgVVJJW10gbGlzdCAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBBcyBmb3IgbGlzdCgpLCBleGNlcHQgb25seSBVUklzIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBnaXZlbgotICAgKiBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLAotICAgKiB0aG91Z2ggaXQgbWF5IHJldHVybiBhIHplcm8gbGVuZ3RoIGFycmF5LgotICAgKi8KLSAgcHVibGljIFVSSVtdIGxpc3QgKCBVUklGaWx0ZXIgdXJpRmlsdGVyICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhc1VSTCgpIG1ldGhvZCBpcyBmYWlyIGdhbWUsCi0gICAqIGluIG90aGVyIHdvcmRzLCBpZiB0aGlzIFVSSSBjYW4gYmUgY29udmVydGVkIGludG8gYSBVUkwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzVVJMICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgVVJMIG9iamVjdCBmb3IgdGhlIHJlc291cmNlIHVuZGVyIHRoaXMgVVJJLgotICAgKiBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotICAgKiB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotICAgKiBpbiBjYXNlcyB3aGVyZSBVUklzIGFyZSBrbm93biB0byBiZSByZXByZXNlbnRhYmxlIGFzIFVSTHMuCi0gICAqLwotICBwdWJsaWMgVVJMIGFzVVJMICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXNGaWxlKCkgbWV0aG9kIGlzIGZhaXIgZ2FtZSwKLSAgICogaW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgVVJJIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIEZpbGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzRmlsZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIEZpbGUgb2JqZWN0IGZvciB0aGUgcmVzb3VyY2UgdW5kZXIgdGhpcyBVUkkuCi0gICAqIFRoZXJlIGFyZSBtYW55IFVSSXMgYW5kIFVSSVNjaGVtZXMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kCi0gICAqIHdpbGwgZmFpbCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5Ci0gICAqIGluIGNhc2VzIHdoZXJlIFVSSXMgYXJlIGtub3duIHRvIGJlIGJhY2tlZCBieSBwaHlzaWNhbCBmaWxlcy4KLSAgICovCi0gIHB1YmxpYyBGaWxlIGFzRmlsZSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgYXMgYSBzdHJpbmcuCi0gICAqIEVxdWl2YWxlbnQgdG8gdG9TdHJpbmcoKS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcgKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMjYyMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgZXhjZXB0aW9ucyB0aHJvd24gYnkgVVJJIGNsYXNzZXMuCi0gKiBFdmVyeSBVUklFeGNlcHRpb24gY2FycmllcyBhIFVSSSBhbmQgYSBTdGF0dXMsIGVhY2ggb2Ygd2hpY2ggbWF5Ci0gKiBiZSBudWxsLiBUaGUgZ2V0TWVzc2FnZSgpIG1ldGhvZCBhcyBpbmhlcml0ZWQgZnJvbSBFeGNlcHRpb24gd2lsbAotICogcmV0dXJuIHRoZSBtZXNzYWdlIGZyb20gdGhlIFVSSUV4Y2VwdGluJ3MgU3RhdHVzIG9iamVjdCwgaWYgYW55LgotICovCi1wdWJsaWMgY2xhc3MgVVJJRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gIC8qKgotICAgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODEzMDI3MTQyNDc1NjAxOEw7Ci0KLSAgLyoqCi0gICAqIEEgU3RhdHVzIG9iamVjdCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGV4Y2VwdGlvbiwKLSAgICogaWYgYXBwbGljYWJsZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdGF0dXMgc3RhdHVzOwotCi0gIC8qKgotICAgKiBUaGUgVVJJIGZvciB3aGljaCB0aGUgZXhjZXB0aW9uIG9jY3VyZWQsCi0gICAqIGlmIGFwcGxpY2FibGUuCi0gICAqLwotICBwcm90ZWN0ZWQgVVJJIHVyaTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBVUklFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gU3RhdHVzLgotICAgKiBUaGUgc3RhdHVzIG1heSBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIFVSSUV4Y2VwdGlvbiAoIFN0YXR1cyBzdGF0dXMgKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIFN0YXR1cyBhbmQgVVJJLAotICAgKiBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIFVSSUV4Y2VwdGlvbiAoIFN0YXR1cyBzdGF0dXMsIFVSSSB1cmkgKQotICB7Ci0gICAgc3VwZXIoc3RhdHVzICE9IG51bGwgPyBzdGF0dXMuZ2V0TWVzc2FnZSgpIDogbnVsbCk7Ci0gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgdGhpcy51cmkgPSB1cmk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgU3RhdHVzIG9iamVjdCBpbnNpZGUgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cyAoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgaW5zaWRlIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFVSSSBnZXRVUkkgKCkKLSAgewotICAgIHJldHVybiB1cmk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDdiOGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IFVSSSBhbmQgVVJJU2NoZW1lIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVVJJRmFjdG9yeQotewotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSSAoIFN0cmluZyB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IFVSSSBmb3IgdGhlIGdpdmVuIFVSTC4KLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJICggVVJMIHVybCApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLSAgICogSWYgdGhlIHN0cmluZyBjb250YWlucyBubyBjb2xvbnMsIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGludGVycHJldHRlZAotICAgKiBhcyB0aGUgbmFtZSBvZiB0aGUgc2NoZW1lLiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgY29sb24sIHRoZW4gdGhlCi0gICAqIHN1YnN0cmluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBmaXJzdCBjb2xvbiBpcyBpbnRlcnByZXR0ZWQgYXMgdGhlCi0gICAqIG5hbWUgb2YgdGhlIHNjaGVtZSwgbWVhbmluZyB0aGUgY2FsbGVyIGNhbiBwYXNzIGluIGFueSBVUkkgc3RyaW5nIGluCi0gICAqIG9yZGVyIHRvIGdldCBhIFVSSVNjaGVtZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgVVJJU2NoZW1lIG5ld1VSSVNjaGVtZSAoIFN0cmluZyBzY2hlbWVPclVSSSApIHRocm93cyBVUklFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZWFiOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHZpc2l0IG9yIGxpc3QgVVJJcy4KLSAqIFJlZmVyIHRvIHtAbGluayBVUkkjZ2V0Q2hpbGRyZW59LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVSSUZpbHRlcgotewotICAvKioKLSAgICogRmlsdGVycyB0aGUgZ2l2ZW4gVVJJLgotICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSB0byBmaWx0ZXIuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVzb3VyY2UgbWF0Y2hlcyB0aGUgZmlsdGVyLAotICAgKiBmYWxzZSBpZiBpdCBkb2VzIG5vdC4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gSWYgdGhlIGZpbHRlciBmYWlscyB0byBhbmFseXplIHRoZSByZXNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFjY2VwdHMgKCBVUkkgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklTY2hlbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3N2UwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLS8qKgotICogQSBVUklTY2hlbWUgcmVwcmVzZW50cyBhIHNpbmdsZSBzY2hlbWUgZm9yIHNvbWUgYSBmYW1pbHkgb2YKLSAqIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZpZXJzLiBFeGFtcGxlcyBpbmNsdWRlICJmaWxlIiwgImh0dHAiCi0gKiBhbmQgInBsYXRmb3JtIiAoRWNsaXBzZSkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVVJJU2NoZW1lCi17Ci0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IFVSSS4KLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJICggU3RyaW5nIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgVVJJLgotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkgKCBVUkwgdXJsICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBVUkkuCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSSAoIFVSSSB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwcm9wZXIgbmFtZSBvZiB0aGUgc2NoZW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgc2NoZW1lLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gVVJJIHNhdGlzZmllcyB0aGUKLSAgICogZ3JhbW1hdGljYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBzY2hlbWUuIEFic29sdXRlIFVSSXMgbXVzdAotICAgKiBiZWdpbiB3aXRoICI8c2NoZW1lPjoiLiBSZWxhdGl2ZSBVUklzIG11c3QgZWl0aGVyIG5vdCBjb250YWluCi0gICAqIGEgY29sb24sICI6Iiwgb3IgaXQgbXVzdCBiZWdpbiB3aXRoICIuLyIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkICggVVJJIHVyaSApOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgU3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbgotICAgKiBVUkkgaXMgdmFsaWQuIFRoZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBvZiB0aGUgU3RhdHVzIG9iamVjdAotICAgKiB3aWxsIGRlc2NyaWJlIHRoaXMuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlICggVVJJIHVyaSApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5YjMxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgc2V2ZXJhbCBzdGF0aWMgdXRpbGl0eSBtZXRob2RzIGZvcgotICogd29ya2luZyB3aXRoIFVSSXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklVdGlscwotewotICAvKioKLSAgICogQ29waWVzIGFsbCBieXRlcyBmcm9tIHRoZSBvbGQgVVJJIHRvIHRoZSBuZXcgVVJJLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHkgKCBVUkkgb2xkVXJpLCBVUkkgbmV3VXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKioKLSAgICogTW92ZXMgb25lIFVSSSB0byBhbm90aGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1vdmUgKCBVUkkgb2xkVXJpLCBVUkkgbmV3VXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldywgdGVtcG9yYXJ5IGxlYWYgVVJJLgotICAgKiBUaGUgc2NoZW1lIG9mIHRoZSBVUkkgbWF5IGJlLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUsICJmaWxlOiIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBnZXRUZW1wb3JhcnlMZWFmVVJJICgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcsIHRlbXBvcmFyeSBmb2xkZXIgVVJJLgotICAgKiBUaGUgc2NoZW1lIG9mIHRoZSBVUkkgbWF5IGJlLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUsICJmaWxlOiIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBnZXRUZW1wb3JhcnlGb2xkZXJVUkkgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTE1YmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgVVJJcy4KLSAqIFJlZmVyIHRvIHtAbGluayBVUkkjdmlzaXR9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVSSVZpc2l0b3IKLXsKLSAgLyoqCi0gICAqIFZpc2l0cyB0aGUgZ2l2ZW4gVVJJLgotICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSB0byB2aXNpdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZXNvdXJjZSdzIGRlc2NlbmRhbnRzIHNob3VsZCBiZSB2aXNpdGVkLAotICAgKiBvciBmYWxzZSBpZiB0aGV5IHNob3VsZCBub3QgYmUgdmlzaXRlZC4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gSWYgdGhlIHZpc2l0IG1ldGhvZCBmYWlscy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHZpc2l0ICggVVJJIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvZmlsZS9GaWxlU2NoZW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvZmlsZS9GaWxlU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTcyZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL2ZpbGUvRmlsZVNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuZmlsZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5SZWxhdGl2ZVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuUmVsYXRpdmVVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZVNjaGVtZSBleHRlbmRzIFJlbGF0aXZlU2NoZW1lIAotewotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjaXNWYWxpZChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoVVJJIHVyaSkKLSAgewotICAgIHJldHVybiB1cmkudG9TdHJpbmcoKS5zdGFydHNXaXRoKCAiZmlsZToiICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSShTdHJpbmcgdXJpKSAKLSAgewotICAgIFN0cmluZyBuZXdVUkkgPSBudWxsOwotICAgIAotICAgIGlmKCB1cmkuc3RhcnRzV2l0aCggImZpbGU6IikgKQotICAgIHsKLSAgICAgIC8vIFRoZSBmaWxlIHByb3RvY29sIGhhcyBiZWVuIHNwZWNpZmllZCBzbyBrZWVwIGl0IGFzIGlzLgotICAgICAgbmV3VVJJID0gdXJpOwotICAgIH0KLSAgICBlbHNlIGlmKCB1cmkuc3RhcnRzV2l0aCggIi8iKSApCi0gICAgewotICAgICAgLy8gVGhlIGZpbGUgc2NoZW1lIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgc28gd2Ugd2lsbCBhZGQgaXQuCi0gICAgICBuZXdVUkkgPSAiZmlsZToiICsgdXJpOwotICAgIH0KLSAgICAKLSAgICBpZiggbmV3VVJJID09IG51bGwgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVyaSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBGaWxlVVJJKCBuZXdVUkkgKTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkoVVJJIHVyaSkgCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVVUkkoIHVyaS50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubmV0LlVSTCkKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFVSTCB1cmwpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlVVJJKCB1cmwudG9TdHJpbmcoKSApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvZmlsZS9GaWxlVVJJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvZmlsZS9GaWxlVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OTE2NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL2ZpbGUvRmlsZVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLmZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5SZWxhdGl2ZVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJU2NoZW1lOwotCi0KLXB1YmxpYyBjbGFzcyBGaWxlVVJJIGV4dGVuZHMgUmVsYXRpdmVVUkkgCi17Ci0gIHByaXZhdGUgRmlsZSBmaWxlXyA9IG51bGw7Ci0gIAotICBwdWJsaWMgRmlsZVVSSSggU3RyaW5nIHVyaSApCi0gIHsKLSAgICBzdXBlciggdXJpICk7Ci0gICAgCi0gICAgaWYoIGdldFVSSVNjaGVtZSgpLmlzVmFsaWQoIHRoaXMgKSApCi0gICAgewotICAgICAgZmlsZV8gPSBuZXcgRmlsZSggdXJpLnN1YnN0cmluZyggNSwgdXJpLmxlbmd0aCgpICkgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIEZpbGUgYXNGaWxlKCkgCi0gIHsKLSAgICByZXR1cm4gZmlsZV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNlcmFzZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGRlbGV0ZUZpbGUoIGZpbGVfICk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZGVsZXRlRmlsZSggRmlsZSBmaWxlICkKLSAgewotICAgIGlmKCBmaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGZpbGUubGlzdEZpbGVzKCk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBGaWxlIGNoaWxkID0gY2hpbGRyZW5baW5kZXhdOwotICAgICAgICAKLSAgICAgICAgaWYoIGNoaWxkLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsZXRlRmlsZSggY2hpbGQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZC5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmaWxlLmRlbGV0ZSgpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0SW5wdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlXy5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAKLSAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZpbGVfICk7ICAKLSAgICB9Ci0gICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBleGMuZ2V0TWVzc2FnZSgpLCBTdGF0dXMuRVJST1IsIGV4YyApOwotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggc3RhdHVzLCB0aGlzICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdHJlYW07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgcGFyZW50ID0gZmlsZV8uZ2V0UGFyZW50RmlsZSgpOwotICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgCi0gICAgICBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZmlsZV8gKTsgIAotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIGV4Yy5nZXRNZXNzYWdlKCksIFN0YXR1cy5FUlJPUiwgZXhjICk7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBzdGF0dXMsIHRoaXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRVUklTY2hlbWUoKQotICAgKi8KLSAgcHVibGljIFVSSVNjaGVtZSBnZXRVUklTY2hlbWUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlU2NoZW1lKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc0ZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfICE9IG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc1VSTCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzVVJMKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzTGVhZigpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfLmlzRmlsZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUHJlc2VudCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfLmV4aXN0cygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUmVhZGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8uY2FuUmVhZCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzV3JpdGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcml0YWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8uY2FuV3JpdGUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KCkKLSAgICovCi0gIHB1YmxpYyBVUklbXSBsaXN0KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVtdIGNoaWxkcmVuID0gZmlsZV8ubGlzdEZpbGVzKCk7Ci0gICAgVVJJW10gIFVSSXMgICAgID0gbmV3IFVSSVswXTsKLSAgICAKLSAgICBpZiggY2hpbGRyZW4gIT0gbnVsbCApCi0gICAgewotICAgICAgaW50ICAgbGVuZ3RoICAgPSBjaGlsZHJlbi5sZW5ndGg7Ci0gICAgICAKLSAgICAgIFVSSXMgPSBuZXcgVVJJW2xlbmd0aF07Ci0gICAgCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgVVJJc1tpbmRleF0gPSBuZXcgRmlsZVVSSSggImZpbGU6IiArIGNoaWxkcmVuW2luZGV4XS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gVVJJczsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJRmlsdGVyKQotICAgKi8KLSAgcHVibGljIFVSSVtdIGxpc3QoVVJJRmlsdGVyIHVyaUZpbHRlcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVtdICAgY2hpbGRyZW4gPSBmaWxlXy5saXN0RmlsZXMoKTsKLSAgICBpbnQgICAgICBsZW5ndGggICA9IGNoaWxkcmVuID09IG51bGwgPyAwIDogY2hpbGRyZW4ubGVuZ3RoOwotICAgIFZlY3RvciAgIFVSSXMgICAgID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIFVSSSBuZXdVUkkgPSBuZXcgRmlsZVVSSSggImZpbGU6IiArIGNoaWxkcmVuW2luZGV4XS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgCi0gICAgICBpZiggdXJpRmlsdGVyLmFjY2VwdHMoIG5ld1VSSSkgKQotICAgICAgewotICAgICAgICBVUklzLmFkZCggbmV3VVJJICk7Ci0gICAgICB9IAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFVSSVtdKVVSSXMudG9BcnJheSggbmV3IFVSSVswXSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3JlbmFtZShvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbmFtZShVUkkgbmV3VVJJKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB1cmlfID0gbmV3VVJJLnRvU3RyaW5nKCk7Ci0gICAgZmlsZV8ucmVuYW1lVG8oIG5ldyBGaWxlKCB1cmlfICkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaEZvbGRlcigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaEZvbGRlcigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGZpbGVfLm1rZGlycygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoTGVhZigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaExlYWYoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGZvbGRlcnMgYXJlIGNyZWF0ZWQuCi0gICAgICBGaWxlIHBhcmVudCA9IGZpbGVfLmdldFBhcmVudEZpbGUoKTsKLSAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICAgIAotICAgICAgZmlsZV8uY3JlYXRlTmV3RmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIGV4Yy5nZXRNZXNzYWdlKCksIFN0YXR1cy5FUlJPUiwgZXhjICk7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBzdGF0dXMsIHRoaXMgKTsgICAgICAKLSAgICB9Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSBjbGFzcyBEdW1teSAKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9kYXRhL0NsYXNzRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvQ2xhc3NFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDA4ZDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvQ2xhc3NFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NFbnRyeQotewotICBwdWJsaWMgT2JqZWN0IGxhc3RPYmplY3RfOwotICBwdWJsaWMgVmVjdG9yIGdldHRlckxpc3RfOwotICBwdWJsaWMgVmVjdG9yIHNldHRlckxpc3RfOwotICBwdWJsaWMgaW50ICAgIG9yZGVyXzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvRGF0YUZsb3dNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9kYXRhL0RhdGFGbG93TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFjOTE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvRGF0YUZsb3dNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotcHVibGljIGNsYXNzIERhdGFGbG93TWFuYWdlciAKLXsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbCByZWdpc3RyeV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlICAgICAgICAgICAgICAgY2xhc3NUYWJsZV87Ci0gIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICAgb3JkZXJfOwotICBwcml2YXRlIEVudmlyb25tZW50CQkJCWVudmlyb25tZW50XzsKLSAgCi0gIHB1YmxpYyBEYXRhRmxvd01hbmFnZXIoIERhdGFNYXBwaW5nUmVnaXN0cnlJbXBsIHJlZ2lzdHJ5LCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICByZWdpc3RyeV8gICA9IHJlZ2lzdHJ5OwotICAgIGNsYXNzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIG9yZGVyXyAgICAgID0gMDsKLSAgICBlbnZpcm9ubWVudF8gPSBlbnZpcm9ubWVudDsKLSAgfQotICAKLSAgcHVibGljIERhdGFNYXBwaW5nUmVnaXN0cnkgZ2V0TWFwcGluZ1JlZ2lzdHJ5KCkKLSAgewotICAgIHJldHVybiByZWdpc3RyeV87IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9jZXNzKCBPYmplY3Qgb2JqZWN0ICkKLSAgewotICAgIC8vIEFkZCB0aGlzIG9iamVjdCB0byB0aGUgY2xhc3NUYWJsZV8gaWYgcmVxdWlyZWQuCi0gICAgU3RyaW5nICAgICBvYmplY3RUeXBlID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgIENsYXNzRW50cnkgY2xhc3NFbnRyeSA9IChDbGFzc0VudHJ5KWNsYXNzVGFibGVfLmdldCggb2JqZWN0VHlwZSApOwotCQotICAgIGVudmlyb25tZW50Xy5nZXRMb2coKS5sb2coTG9nLklORk8sICJkYXRhIiwgNTAwNCwgdGhpcywgInByb2Nlc3MiLCAiUHJvY2Vzc2luZzogIiArIG9iamVjdFR5cGUgKTsKLSAgICAKLSAgICBpZiggY2xhc3NFbnRyeSA9PSBudWxsICkKLSAgICB7Ci0gICAgICBjbGFzc0VudHJ5ID0gbmV3IENsYXNzRW50cnkoKTsKLSAgICAgIGNsYXNzVGFibGVfLnB1dCggb2JqZWN0VHlwZSwgY2xhc3NFbnRyeSApOwotICAgIH0KLSAgICAKLSAgICBjbGFzc0VudHJ5Lmxhc3RPYmplY3RfID0gb2JqZWN0OwotICAgIGNsYXNzRW50cnkub3JkZXJfICAgICAgPSBvcmRlcl8rKzsKLSAgICAKLSAgICAvLyBOb3cgcHJvY2VzcyB0aGUgc2V0dGVycyBmb3IgdGhpcyBvYmplY3QKLSAgICBWZWN0b3IgcnVsZUVudHJpZXMgID0gcmVnaXN0cnlfLmdldFJ1bGVFbnRyaWVzKCBvYmplY3RUeXBlICk7Ci0gICAgCi0gICAgaWYoIHJ1bGVFbnRyaWVzICE9IG51bGwgKQotICAgIHsKLSAgICAgIGlmKCBjbGFzc0VudHJ5LnNldHRlckxpc3RfID09IG51bGwgKQotICAgICAgewotICAgICAgICBjbGFzc0VudHJ5LnNldHRlckxpc3RfID0gZ2V0U2V0dGVyTGlzdCggb2JqZWN0ICk7ICAKLSAgICAgIH0gICAgCi0gICAgICAKLSAgICAgIC8vIEZvciBlYWNoIHNldHRlciBpbiB0aGlzIG9iamVjdCB0cnkgdG8gZmluZCBhIHJ1bGUuCi0gICAgICBmb3IoIGludCBzZXR0ZXJJbmRleCA9IDA7IHNldHRlckluZGV4IDwgY2xhc3NFbnRyeS5zZXR0ZXJMaXN0Xy5zaXplKCk7IHNldHRlckluZGV4KysgKQotICAgICAgewotICAgICAgICBPYmplY3RNZXRob2QgY3VycmVudE9iamVjdE1ldGhvZCA9IG5ldyBPYmplY3RNZXRob2QoKTsKLSAgICAgICAgTWV0aG9kICAgICAgIHNldHRlck1ldGhvZCAgICAgICAgPSAoTWV0aG9kKWNsYXNzRW50cnkuc2V0dGVyTGlzdF8uZWxlbWVudEF0KCBzZXR0ZXJJbmRleCApOwotICAgICAgICBSdWxlRW50cnkgICAgY3VycmVudFJ1bGVFbnRyeSAgICA9IG51bGw7Ci0KLSAgICAgICAgY3VycmVudE9iamVjdE1ldGhvZC5vcmRlciA9IC0xOwotICAgICAgICAKLSAgICAgICAgLy8gRmluZCBydWxlcyB0aGF0IG1hdGNoIHRoaXMgc2V0dGVyLiAgTm90ZTogdGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgcnVsZQotICAgICAgICAvLyB0aGF0IG1hdGNoZXMgdGhpcyBzZXR0ZXIuICBJbiB0aGlzIGNhc2Ugd2UgdXNlIHRoZSBtb3N0IHJlY2VudCwgd2hpY2ggaXMgCi0gICAgICAgIC8vIGRlZmluZWQgYnkgdGhlIG9yZGVyIGZpZWxkLgotICAgICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgcnVsZUVudHJpZXMuc2l6ZSgpOyBpbmRleCsrICkKLSAgICAgICAgewotICAgICAgICAgIFJ1bGVFbnRyeSBydWxlRW50cnkgPSAoUnVsZUVudHJ5KXJ1bGVFbnRyaWVzLmVsZW1lbnRBdCggaW5kZXggKTsgICAgICAgCi0gICAgICAgICAgCi0gICAgICAgICAgaWYoIHNldHRlck1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCAic2V0IiArIHJ1bGVFbnRyeS50YXJnZXRQcm9wZXJ0eV8gKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBzZXR0ZXIgZm9yIHRoaXMgcnVsZS4gIE5vdyBmaW5kIHRoZSBnZXR0ZXIgbWV0aG9kLgotICAgICAgICAgICAgLy8gTm90ZTogZ2V0R2V0dGVyTWV0aG9kIGFsd2F5cyByZXR1cm5zIGEgdmFsdWUsIGJ1dCBpZiB0aGVyZSBpcyBubwotICAgICAgICAgICAgLy8gICAgICAgZ2V0dGVycyBhdmFpbGFibGUgaXQgd2lsbCBzZXQgdGhlIG9yZGVyIHRvIC0xLgotICAgICAgICAgICAgT2JqZWN0TWV0aG9kIGdldHRlciA9IGdldEdldHRlck1ldGhvZCggcnVsZUVudHJ5LnNvdXJjZVR5cGVfLCBydWxlRW50cnkuc291cmNlUHJvcGVydHlfICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBnZXR0ZXIub3JkZXIgPT0gLTEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCWVudmlyb25tZW50Xy5nZXRMb2coKS5sb2coTG9nLklORk8gLCAiZGF0YSIsIDUwMDUsIHRoaXMsICJwcm9jZXNzIiwgIiAgPj5ObyBnZXR0ZXIgZm91bmQgZm9yIHByb3BlcnR5OiAiICsgc2V0dGVyTWV0aG9kLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjdXJyZW50T2JqZWN0TWV0aG9kLm9yZGVyIDwgZ2V0dGVyLm9yZGVyICkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbW9yZSByZWNlbnQgZ2V0dGVyLgotICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0TWV0aG9kID0gZ2V0dGVyOwotICAgICAgICAgICAgICBjdXJyZW50UnVsZUVudHJ5ID0gcnVsZUVudHJ5OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIGlmKCBjdXJyZW50T2JqZWN0TWV0aG9kLm9yZGVyICE9IC0xICkKLSAgICAgICAgewotICAgICAgICAgIGludm9rZU1ldGhvZCggY3VycmVudE9iamVjdE1ldGhvZC5vYmplY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdE1ldGhvZC5tZXRob2QsIAotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlck1ldGhvZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UnVsZUVudHJ5LnRyYW5zZm9ybWVyXyApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTywgImRhdGEiLCA1MDA2LCB0aGlzLCAicHJvY2VzcyIsICIgID4+Tm8gcnVsZSBmb3VuZCBmb3Igc2V0dGVyOiAiICsgc2V0dGVyTWV0aG9kLmdldE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgIAotICB9Ci0gIAotICAvKioKLSAgICogRmluZCBhbGwgdGhlIHNldHRlcnMgZm9yIHRoaXMgb2JqZWN0IGFuZCByZXR1cm4gYSB2ZWN0b3Igb2YgdGhlbS4KLSAgICogCi0gICAqIEBwYXJhbSBvYmplY3QKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJpdmF0ZSBWZWN0b3IgZ2V0U2V0dGVyTGlzdCggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICBWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1ldGhvZHMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBNZXRob2QgIG1ldGhvZCAgICAgPSBtZXRob2RzW2luZGV4XTsKLSAgICAgIGJvb2xlYW4gaXNQdWJsaWMgICA9IE1vZGlmaWVyLmlzUHVibGljKCBtZXRob2QuZ2V0TW9kaWZpZXJzKCkgKTsKLSAgICAgIENsYXNzICAgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgCi0gICAgICBpZiggaXNQdWJsaWMgJiYgCi0gICAgICAgICAgcmV0dXJuVHlwZSA9PSBWb2lkLlRZUEUgJiYgCi0gICAgICAgICAgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEgJiYKLSAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoICJzZXQiICkpCi0gICAgICB7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKCB0cnVlICk7Ci0gICAgICAgIHJlc3VsdC5hZGQoIG1ldGhvZCApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcml2YXRlIE9iamVjdE1ldGhvZCBnZXRHZXR0ZXJNZXRob2QoIFN0cmluZyBzb3VyY2VUeXBlLCBTdHJpbmcgc291cmNlUHJvcGVydHkgKQotICB7Ci0gICAgQ2xhc3NFbnRyeSAgIGNsYXNzRW50cnkgPSAoQ2xhc3NFbnRyeSljbGFzc1RhYmxlXy5nZXQoIHNvdXJjZVR5cGUgKTsKLSAgICBPYmplY3RNZXRob2QgZ2V0dGVyRm91bmQgPSBuZXcgT2JqZWN0TWV0aG9kKCk7Ci0gICAgCi0gICAgLy8gSW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyBnZXR0ZXIgeWV0LgotICAgIGdldHRlckZvdW5kLm9yZGVyID0gLTE7Ci0gICAgCi0gICAgaWYoIGNsYXNzRW50cnkgIT0gbnVsbCApCi0gICAgewotICAgICAgaWYoIGNsYXNzRW50cnkuZ2V0dGVyTGlzdF8gPT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIC8vIEJ1aWxkIHRoZSBnZXR0ZXIgbGlzdC4KLSAgICAgICAgY2xhc3NFbnRyeS5nZXR0ZXJMaXN0XyA9IGdldEdldHRlckxpc3QoIGNsYXNzRW50cnkubGFzdE9iamVjdF8gKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNsYXNzRW50cnkuZ2V0dGVyTGlzdF8uc2l6ZSgpOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgTWV0aG9kIGdldHRlciA9IChNZXRob2QpY2xhc3NFbnRyeS5nZXR0ZXJMaXN0Xy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZ2V0dGVyLmdldE5hbWUoKS5lcXVhbHMoICJnZXQiICsgc291cmNlUHJvcGVydHkgKSkKLSAgICAgICAgewotICAgICAgICAgIGdldHRlckZvdW5kLm9yZGVyICA9IGNsYXNzRW50cnkub3JkZXJfOwotICAgICAgICAgIGdldHRlckZvdW5kLm1ldGhvZCA9IGdldHRlcjsKLSAgICAgICAgICBnZXR0ZXJGb3VuZC5vYmplY3QgPSBjbGFzc0VudHJ5Lmxhc3RPYmplY3RfOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBnZXR0ZXJGb3VuZDsKLSAgfQotICAKLSAgcHJpdmF0ZSBWZWN0b3IgZ2V0R2V0dGVyTGlzdCggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICBWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1ldGhvZHMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBNZXRob2QgIG1ldGhvZCAgICAgPSBtZXRob2RzW2luZGV4XTsKLSAgICAgIGJvb2xlYW4gaXNQdWJsaWMgICA9IE1vZGlmaWVyLmlzUHVibGljKCBtZXRob2QuZ2V0TW9kaWZpZXJzKCkgKTsKLSAgICAgIENsYXNzICAgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgCi0gICAgICBpZiggaXNQdWJsaWMgJiYgCi0gICAgICAgICAgcmV0dXJuVHlwZSAhPSBWb2lkLlRZUEUgJiYgCi0gICAgICAgICAgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDAgJiYKLSAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoICJnZXQiICkpCi0gICAgICB7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKCB0cnVlICk7Ci0gICAgICAgIHJlc3VsdC5hZGQoIG1ldGhvZCApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgCi0gIHByaXZhdGUgdm9pZCBpbnZva2VNZXRob2QoIE9iamVjdCAgICAgIHNvdXJjZU9iamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCAgICAgIHNvdXJjZU1ldGhvZCAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgICAgICBjbGllbnRPYmplY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgICAgICBjbGllbnRNZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKQotICB7ICAJCi0gIAlPYmplY3QgZGF0YSA9IG51bGw7Ci0gIAkgIAkgIAkKLSAgCXRyeQotICAJewotICAJICBkYXRhID0gc291cmNlTWV0aG9kLmludm9rZSggc291cmNlT2JqZWN0LCBuZXcgT2JqZWN0WzBdICk7Ci0gIAl9Ci0gIAljYXRjaCggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMgKQotICAJewotICAJICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAvLyBwZ20gTmVlZCB0byBleHRlcm5hbGl6ZSB0aGlzIHN0cmluZy4KLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJQcm92aWRlciBcIiIgKyBzb3VyY2VPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIHRocmV3IGFuIGV4Y2VwdGlvbi4iICk7Ci0gIAl9Ci0gIAljYXRjaCggSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleGMgKQotICAJewotICAJICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAvLyBwZ20gTmVlZCB0byBleHRlcm5hbGl6ZSB0aGlzIHN0cmluZy4KLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJQcm92aWRlciBcIiIgKyBzb3VyY2VPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiB0aHJldyBhbiBleGNlcHRpb24uIiApOwotICAJfQotICAJCi0gIAllbnZpcm9ubWVudF8uZ2V0TG9nKCkubG9nKExvZy5JTkZPLCAiZGF0YSIsIDUwMDcsIHRoaXMsICJpbnZva2VNZXRob2QgIiwiICBTZXR0aW5nIHByb3A6ICIgKyBjbGllbnRNZXRob2QuZ2V0TmFtZSgpICsgIiBkYXRhPSIgKyBkYXRhICsgIiBmcm9tOiAiICsgc291cmNlT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpICk7Ci0gIAkKLSAgCQotICAJaWYoIHRyYW5zZm9ybWVyICE9IG51bGwgKQotICAJewotICAJICBkYXRhID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtKCBkYXRhICk7ICAJICAgIAotICAJfQotICAJCi0gIAl0cnkKLSAgCXsgIAkgIAotICAJICBjbGllbnRNZXRob2QuaW52b2tlKCBjbGllbnRPYmplY3QsIG5ldyBPYmplY3RbXXsgZGF0YSB9ICk7Ci0gIAl9Ci0gIAljYXRjaCggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMgKQotICAJewotICAJICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAvLyBwZ20gTmVlZCB0byBleHRlcm5hbGl6ZSB0aGlzIHN0cmluZy4KLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJDbGllbnQgXCIiICsgY2xpZW50T2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiB0aHJldyBhbiBleGNlcHRpb24uIiApOwotICAJfQotICAJY2F0Y2goIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXhjICkKLSAgCXsKLSAgCSAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgLy8gcGdtIE5lZWQgdG8gZXh0ZXJuYWxpemUgdGhpcyBzdHJpbmcuCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQ2xpZW50IFwiIiArIGNsaWVudE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgdGhyZXcgYW4gZXhjZXB0aW9uLiIgKTsKLSAgCX0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBPYmplY3RNZXRob2QKLSAgewotICAgIHB1YmxpYyBPYmplY3Qgb2JqZWN0OwotICAgIHB1YmxpYyBNZXRob2QgbWV0aG9kOwotICAgIHB1YmxpYyBpbnQgICAgb3JkZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMyYTA5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9kYXRhL0RhdGFNYXBwaW5nUmVnaXN0cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotcHVibGljIGNsYXNzIERhdGFNYXBwaW5nUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgRGF0YU1hcHBpbmdSZWdpc3RyeQoteyAgCi0gIHByaXZhdGUgSGFzaHRhYmxlIHJ1bGVzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIHB1YmxpYyBWZWN0b3IgZ2V0UnVsZUVudHJpZXMoIFN0cmluZyB0YXJnZXRUeXBlICkKLSAgewotICAgIHJldHVybiAoVmVjdG9yKXJ1bGVzVGFibGVfLmdldCggdGFyZ2V0VHlwZSApOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5I2FkZE1hcHBpbmcoamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKCBDbGFzcyBzb3VyY2VUeXBlLCBTdHJpbmcgc291cmNlUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHRhcmdldFR5cGUsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSAKLSAgewotICAgIFZlY3RvciAgICBydWxlRW50cmllcyA9IChWZWN0b3IpcnVsZXNUYWJsZV8uZ2V0KCB0YXJnZXRUeXBlLmdldE5hbWUoKSApOwotICAgIFJ1bGVFbnRyeSBydWxlRW50cnkgICA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHJ1bGVFbnRyaWVzID09IG51bGwgKQotICAgIHsKLSAgICAgIHJ1bGVFbnRyaWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgcnVsZXNUYWJsZV8ucHV0KCB0YXJnZXRUeXBlLmdldE5hbWUoKSwgcnVsZUVudHJpZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gRmluZCB0aGUgcnVsZSBlbnRyeQotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBydWxlRW50cmllcy5zaXplKCk7IGluZGV4KysgKQotICAgIHsKLSAgICAgIFJ1bGVFbnRyeSBuZXdFbnRyeSA9IChSdWxlRW50cnkpcnVsZUVudHJpZXMuZWxlbWVudEF0KCBpbmRleCApOwotICAgIAotICAgICAgaWYoIHNvdXJjZVByb3BlcnR5LmVxdWFscyggbmV3RW50cnkuc291cmNlUHJvcGVydHlfICkgJiYKLSAgICAgICAgICBzb3VyY2VUeXBlLmVxdWFscyggbmV3RW50cnkuc291cmNlVHlwZV8gKSAmJgotICAgICAgICAgIHRhcmdldFByb3BlcnR5LmVxdWFscyggbmV3RW50cnkudGFyZ2V0UHJvcGVydHlfICkgKQotICAgICAgewotICAgICAgICAvLyBUaGUgZW50cnkgYWxyZWFkeSBleGlzdHMKLSAgICAgICAgcnVsZUVudHJ5ID0gbmV3RW50cnk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiggcnVsZUVudHJ5ID09IG51bGwgKQotICAgIHsKLSAgICAgIC8vIFRoZSBydWxlIGRpZG4ndCBleGlzdCBhbHJlYWR5IHNvIHdlIHdpbGwgY3JlYXRlIGEgbmV3IG9uZS4KLSAgICAgIHJ1bGVFbnRyeSA9IG5ldyBSdWxlRW50cnkoc291cmNlVHlwZS5nZXROYW1lKCksIHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSwgdHJhbnNmb3JtZXIgKTsKLSAgICAgIHJ1bGVFbnRyaWVzLmFkZCggcnVsZUVudHJ5ICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBKdXN0IHVwZGF0ZSB0aGUgdHJhbnNmb3JtZXIuCi0gICAgICBydWxlRW50cnkudHJhbnNmb3JtZXJfID0gdHJhbnNmb3JtZXI7ICAKLSAgICB9Ci0gIH0KLSAgICAKLSAgICAvL3J1bGVFbnRyaWVzXy4KLS8vICAgIFN0cmluZyAgICBzb3VyY2VDbGFzcyA9IHNvdXJjZVR5cGUuZ2V0TmFtZSgpOwotLy8gICAgU3RyaW5nICAgIHRhcmdldENsYXNzID0gdGFyZ2V0VHlwZS5nZXROYW1lKCk7Ci0vLyAgICBWZWN0b3IgICAgZW50cmllcyAgICAgPSAoVmVjdG9yKXJ1bGVFbnRyaWVzXy5nZXQoIHNvdXJjZUNsYXNzICk7IAotLy8gICAgUnVsZUVudHJ5IHJ1bGVFbnRyeSAgID0gbnVsbDsKLS8vICAgIAotLy8gICAgaWYoIGVudHJpZXMgIT0gbnVsbCApCi0vLyAgICB7Ci0vLyAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMuCi0vLyAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBlbnRyaWVzLnNpemUoKTsgaW5kZXgrKyApCi0vLyAgICAgIHsKLS8vICAgICAgICBSdWxlRW50cnkgZm91bmRFbnRyeSA9IChSdWxlRW50cnkpZW50cmllcy5lbGVtZW50QXQoIGluZGV4ICk7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgaWYoIHNvdXJjZVByb3BlcnR5LmVxdWFscyggZm91bmRFbnRyeS5zb3VyY2VQcm9wZXJ0eV8gKSAmJgotLy8gICAgICAgICAgICB0YXJnZXRUeXBlLmVxdWFscyggZm91bmRFbnRyeS50YXJnZXRUeXBlXyApICYmCi0vLyAgICAgICAgICAgIHRhcmdldFByb3BlcnR5LmVxdWFscyggZm91bmRFbnRyeS50YXJnZXRQcm9wZXJ0eV8gKSApCi0vLyAgICAgICAgewotLy8gICAgICAgICAgcnVsZUVudHJ5ID0gZm91bmRFbnRyeTsKLS8vICAgICAgICAgIHJ1bGVFbnRyeS50cmFuc2Zvcm1lcl8gPSB0cmFuc2Zvcm1lcjsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgCi0vLyAgICAgIC8vIFRoZXJlIGlzIGFuIGV4aXN0aW5nIHZlY3RvciBmb3IgdGhpcyBzb3VyY2VDbGFzcywgYnV0IGl0IGRpZG4ndAotLy8gICAgICAvLyBjb250YWluIHRoaXMgbmV3IHJ1bGUgc28gd2Ugd2lsbCBhZGQgaXQgaW4uCi0vLyAgICAgIGlmKCBydWxlRW50cnkgPT0gbnVsbCApCi0vLyAgICAgIHsKLS8vICAgICAgICBydWxlRW50cnkgPSBuZXcgUnVsZUVudHJ5KCBzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0Q2xhc3MsIHRhcmdldFByb3BlcnR5LCB0cmFuc2Zvcm1lciApOwotLy8gICAgICAgIGVudHJpZXMuYWRkKCBydWxlRW50cnkgKTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICAvLyBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyB2ZWN0b3IgZm9yIHRoaXMgc291cmNlQ2xhc3MuCi0vLyAgICAgIGVudHJpZXMgPSBuZXcgVmVjdG9yKCk7Ci0vLyAgICAgIHJ1bGVFbnRyeSA9IG5ldyBSdWxlRW50cnkoIHNvdXJjZVByb3BlcnR5LCB0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHksIHRyYW5zZm9ybWVyICk7Ci0vLyAgICAgIGVudHJpZXMuYWRkKCBydWxlRW50cnkgKTsKLS8vICAgICAgcnVsZUVudHJpZXNfLnB1dCggc291cmNlQ2xhc3MsIGVudHJpZXMgKTsgIAotLy8gICAgfSAgICAKLS8vICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5I2FkZE1hcHBpbmcoamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuQ2xhc3MpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKENsYXNzIHNvdXJjZVR5cGUsIFN0cmluZyBzb3VyY2VQcm9wZXJ0eSwgQ2xhc3MgdGFyZ2V0VHlwZSkgCi0gIHsKLSAgICBhZGRNYXBwaW5nKCBzb3VyY2VUeXBlLCBzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0VHlwZSwgc291cmNlUHJvcGVydHksIG51bGwgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9SdWxlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvUnVsZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzk3MzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9SdWxlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLXB1YmxpYyBjbGFzcyBSdWxlRW50cnkgCi17Ci0gIHB1YmxpYyBTdHJpbmcgICAgICBzb3VyY2VUeXBlXzsKLSAgcHVibGljIFN0cmluZyAgICAgIHNvdXJjZVByb3BlcnR5XzsKLSAgcHVibGljIFN0cmluZyAgICAgIHRhcmdldFByb3BlcnR5XzsKLSAgcHVibGljIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyXzsKLSAgCi0gCi0gIHB1YmxpYyBSdWxlRW50cnkoIFN0cmluZyBzb3VyY2VUeXBlLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSwgCi0gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyICkKLSAgewotICAgIHNvdXJjZVR5cGVfICAgICA9IHNvdXJjZVR5cGU7Ci0gICAgc291cmNlUHJvcGVydHlfID0gc291cmNlUHJvcGVydHk7Ci0gICAgdGFyZ2V0UHJvcGVydHlfID0gdGFyZ2V0UHJvcGVydHk7ICAgIAotICAgIHRyYW5zZm9ybWVyXyAgICA9IHRyYW5zZm9ybWVyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MmNhYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1lbnZ1aS5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjBiMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNTY0MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgZW52dWkuamFyCi1zcmMuaW5jbHVkZXMgPSAuY2xhc3NwYXRoLFwKLSAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBlbnZ1aS5qYXIKLXNvdXJjZS5lbnZ1aS5qYXIgPSBzcmMvCi1vdXRwdXQuZW52dWkuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWFiYTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL3VpL3dpZGdldHMvSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIAotewotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgV2lkZ2V0Q29udHJpYnV0b3IgZm9yIHRoaXMgTmFtZWQgd2lkZ2V0LgotICAgKi8KLSAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGdldFdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgZGVzY3JpcHRpb24gdGhhdCBtaWdodCBiZSBkaXNwbGF5ZWQgb24KLSAgICogYSB3aXphcmQgcGFnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aXRsZSB0aGF0IG1heSBiZSBkaXNwbGF5ZWQgb24gCi0gICAqIGEgd2l6YXJkIHBhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCk7Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBleHRlbmlvbnMgdG8gcmVnaXN0ZXIgdGhlIGRhdGEgbWFwcGluZ3MKLSAgICogdGhhdCB0aGVpciB3aWRnZXRzIHVzZS4KLSAgICogCi0gICAqIEBwYXJhbSBkYXRhUmVnaXN0cnkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL3VpL3dpZGdldHMvSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxY2NiYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC51aS53aWRnZXRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSAKLXsKLSAgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpOwotICAKLSAgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KCBJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvciApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhNmVlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPUVudmlyb25tZW50IENvbW1hbmQgRnJhbWV3b3JrIChHVUkpCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzE2ZjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpIgotICAgbmFtZT0iJVBMVUdJTl9OQU1FIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5wbHVnaW4uRW52VUlQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImVudnVpLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLm9zZ2kiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS9lY2xpcHNlL0VjbGlwc2VFbnZpcm9ubWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS9lY2xpcHNlL0VjbGlwc2VFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWYxNGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvZWNsaXBzZS9FY2xpcHNlRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkphdmFDb21waWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlNpbXBsZVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLmZpbGUuRmlsZVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5CYXNlRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmVjbGlwc2UuRWNsaXBzZVNjaGVtZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbiBFbnZpcm9ubWVudCBjbGFzcyBmb3IgdGhlIEVjbGlwc2UgRW52aXJvbm1lbnQuCi0gKiBUaGlzIEVudmlyb25tZW50IGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgInBsYXRmb3JtIiBwcm90b2NvbCBhbmQgdGhlICJmaWxlIgotICogcHJvdG9jb2wuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUVudmlyb25tZW50IGltcGxlbWVudHMgQmFzZUVjbGlwc2VFbnZpcm9ubWVudAotewotICBwcml2YXRlIENvbW1hbmRNYW5hZ2VyICAgY29tbWFuZE1hbmFnZXJfICA9IG51bGw7Ci0gIHByaXZhdGUgU2ltcGxlVVJJRmFjdG9yeSB1cmlGYWN0b3J5XyAgICAgID0gbnVsbDsKLSAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgIHJlc291cmNlQ29udGV4dF8gPSBudWxsOwotICBwcml2YXRlIFByb2dyZXNzTW9uaXRvciAgbW9uaXRvcl8gICAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgU3RhdHVzSGFuZGxlciAgICBzdGF0dXNIYW5kbGVyXyAgID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlRW52aXJvbm1lbnQoIENvbW1hbmRNYW5hZ2VyICBjb21tYW5kTWFuYWdlciwgCi0JCSAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JCQkJCSAgICAgICAgIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCQkJICAgICBTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0gIHsKLSAgICBjb21tYW5kTWFuYWdlcl8gID0gY29tbWFuZE1hbmFnZXI7Ci0gICAgcmVzb3VyY2VDb250ZXh0XyA9IHJlc291cmNlQ29udGV4dDsKLSAgICB1cmlGYWN0b3J5XyAgICAgID0gbmV3IFNpbXBsZVVSSUZhY3RvcnkoKTsKLSAgICBtb25pdG9yXyAgICAgICAgID0gbW9uaXRvcjsKLSAgICBzdGF0dXNIYW5kbGVyXyAgID0gc3RhdHVzSGFuZGxlcjsKLSAgICAKLSAgICB1cmlGYWN0b3J5Xy5yZWdpc3RlclNjaGVtZSggInBsYXRmb3JtIiwgbmV3IEVjbGlwc2VTY2hlbWUoIHRoaXMgKSApOwotICAgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAiZmlsZSIsIG5ldyBGaWxlU2NoZW1lKCkgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldENvbW1hbmRNYW5hZ2VyKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kTWFuYWdlciBnZXRDb21tYW5kTWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gY29tbWFuZE1hbmFnZXJfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldEphdmFDb21waWxlcigpCi0gICAqLwotICBwdWJsaWMgSmF2YUNvbXBpbGVyIGdldEphdmFDb21waWxlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRMb2coKQotICAgKi8KLSAgcHVibGljIExvZyBnZXRMb2coKQotICB7Ci0gICAgcmV0dXJuIG5ldyBFY2xpcHNlTG9nKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLSAgICovCi0gIHB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLSAgewotICAgIHJldHVybiBtb25pdG9yXzsKLSAgfQotCi0gCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRTdGF0dXNIYW5kbGVyKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1c0hhbmRsZXJfOwotICB9Ci0KLSAgLyoqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0VVJJRmFjdG9yeSgpCi0gICAqLwotICBwdWJsaWMgVVJJRmFjdG9yeSBnZXRVUklGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiB1cmlGYWN0b3J5XzsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIHJldHVybnMgYSBSZXNvdXJjZUNvbnRleHQgZm9yIHRoaXMgRW52aXJvbm1lbnQuCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VDb250ZXh0XzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS9lY2xpcHNlL0VjbGlwc2VQcm9ncmVzc01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvZWNsaXBzZS9FY2xpcHNlUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWI2YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS9lY2xpcHNlL0VjbGlwc2VQcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VQcm9ncmVzc01vbml0b3IgaW1wbGVtZW50cyBQcm9ncmVzc01vbml0b3IKLXsKLSAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yXzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKCkKLSAgewotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyBhbiBlY2xpcHNlIElQcm9ncmVzc01vbml0b3IgdG8gdGhpcyBtb25pdG9yLiAKLSAgICogQHBhcmFtIG1vbml0b3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3IoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gIHsKLSAgICBtb25pdG9yXyA9IG1vbml0b3I7ICAKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIEVjbGlwc2UgSVByb2dyZXNzTW9uaXRvciBmb3IgdGhpcyBtb25pdG9yLgotICAgKi8KLSAgcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvcigpCi0gIHsKLSAgCXJldHVybiBtb25pdG9yXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5Qcm9ncmVzc01vbml0b3IjZ2V0Q2hpbGRQcm9ncmVzc01vbml0b3IoKQotICAgKi8KLSAgcHVibGljIFByb2dyZXNzTW9uaXRvciBnZXRDaGlsZFByb2dyZXNzTW9uaXRvcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsUmVxdWVzdGVkKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsUmVxdWVzdGVkKCkKLSAgewotICAgIHJldHVybiBtb25pdG9yXyA9PSBudWxsID8gZmFsc2UgOiBtb25pdG9yXy5pc0NhbmNlbGVkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlByb2dyZXNzTW9uaXRvciNyZXBvcnQoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydChTdHJpbmcgcHJvZ3Jlc3MpCi0gIHsKLSAgICBpZiggbW9uaXRvcl8gIT0gbnVsbCApIAotICAgIHsKLSAgICAgIERpc3BsYXkgY3VycmVudFRocmVhZERpc3BsYXkgPSBEaXNwbGF5LmZpbmREaXNwbGF5KCBUaHJlYWQuY3VycmVudFRocmVhZCgpICk7Ci0gICAgICAKLSAgICAgIGlmKCBjdXJyZW50VGhyZWFkRGlzcGxheSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgbW9uaXRvcl8uYmVnaW5UYXNrKCBwcm9ncmVzcywgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOICk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL2VjbGlwc2UvRWNsaXBzZVN0YXR1c0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvZWNsaXBzZS9FY2xpcHNlU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTE0YmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvZWNsaXBzZS9FY2xpcHNlU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2cuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZGlhbG9nLlN0YXR1c0RpYWxvZ0NvbnN0YW50czsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIEVjbGlwc2UgVUkgdmVyc2lvbiBvZiB0aGUgU3RhdHVzSGFuZGxlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVN0YXR1c0hhbmRsZXIgaW1wbGVtZW50cyBTdGF0dXNIYW5kbGVyCi17Ci0gIHByaXZhdGUgU2hlbGwgICAgICAgIHNoZWxsXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnXzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpCi0gIHsKLSAgICB0aGlzKCBuZXcgU2hlbGwoKSApOwotICB9Ci0KLSAgcHVibGljIEVjbGlwc2VTdGF0dXNIYW5kbGVyKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgbXNnXyAgID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uZW52aXJvbm1lbnQiLCB0aGlzICk7Ci0gICAgc2hlbGxfID0gc2hlbGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXMsIG9yZy5lY2xpcHNlLmVudi5jb21tb24uQ2hvaWNlW10pCi0gICAqLwotICBwdWJsaWMgQ2hvaWNlIHJlcG9ydChTdGF0dXMgc3RhdHVzLCBDaG9pY2VbXSBjaG9pY2VzKSAKLSAgewotICAgIGludCByZXN1bHQgPQotICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICAgIHNoZWxsXywKLSAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCJUSVRMRV9XQVJOSU5HIiksCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMsCi0JCQkJY2hvaWNlcyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKQotICAgICB7Ci0gICAgICBpZiAoY2hvaWNlc1tpXS5nZXRTaG9ydGN1dCgpID09IHJlc3VsdCkKLSAgICAgICAgcmV0dXJuIGNob2ljZXNbaV07Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydChTdGF0dXMgc3RhdHVzKSB0aHJvd3MgU3RhdHVzRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIHVzZXJPayA9IGZhbHNlOwotICAgIAotICAgIHN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpCi0gICAgewotICAgICAgLy8gYW4gZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgYW5kIHdlIG5lZWQgdG8gc3RvcCBleGVjdXRpbmcgdGhlIGNvbW1pbmcKLSAgICAgIC8vIGNvbW1hbmRzCi0gICAgICBjYXNlIFN0YXR1cy5FUlJPUiA6Ci0gICAgICB7Ci0gICAgICAgIHVzZXJPayA9IHJlcG9ydEVycm9yU3RhdHVzKHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTdGF0dXMuV0FSTklORyA6Ci0gICAgICB7Ci0gICAgICAgIHVzZXJPayA9IHJlcG9ydFdhcm5pbmcoc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgICAKLSAgICAgIGNhc2UgU3RhdHVzLklORk8gOgotICAgICAgewotICAgICAgICB1c2VyT2sgPSB0cnVlOwotICAgICAgICByZXBvcnRJbmZvKHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiggIXVzZXJPayApIHRocm93IG5ldyBTdGF0dXNFeGNlcHRpb24oIHN0YXR1cyApOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0V2FybmluZyhTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgaW50IHVzZXJSZXNwb25zZSA9Ci0gICAgICBNZXNzYWdlRGlhbG9nLm9wZW5NZXNzYWdlKAotICAgICAgICBzaGVsbF8sCi0gICAgICAgIG1zZ18uZ2V0TWVzc2FnZSgiVElUTEVfV0FSTklORyIpLAotICAgICAgICBudWxsLAotICAgICAgICBzdGF0dXMpOwotICAgIHJldHVybiAodXNlclJlc3BvbnNlID09IFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0RXJyb3JTdGF0dXMoU3RhdHVzIHN0YXR1cykKLSAgewotICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICBzaGVsbF8sCi0gICAgICBtc2dfLmdldE1lc3NhZ2UoIlRJVExFX0VSUk9SIiksCi0gICAgICBudWxsLAotICAgICAgc3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydEVycm9yKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgcmVwb3J0RXJyb3JTdGF0dXMoIHN0YXR1cyApOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlciNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRJbmZvKFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICBNZXNzYWdlRGlhbG9nLm9wZW5NZXNzYWdlKAotICAgICAgICBzaGVsbF8sCi0gICAgICAgIG1zZ18uZ2V0TWVzc2FnZSgiVElUTEVfSU5GTyIpLAotICAgICAgICBudWxsLAotICAgICAgICBzdGF0dXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL2Vudmlyb25tZW50dWkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvZW52aXJvbm1lbnR1aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzFmNDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvZW52aXJvbm1lbnR1aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQlVUVE9OX1NIT1dfQUxMX0RJQUxPR1M9U2hvdyBBbGwKLUJVVFRPTl9ISURFX0FMTF9ESUFMT0dTPUhpZGUgQWxsCi1DSEVDS0JPWF9ET19OT1RfU0hPV19ESUFMT0dfQUdBSU49RG8gbm90IHNob3cgbWUgdGhpcyBkaWFsb2cgYm94IGFnYWluLgotCi1UT09MVElQX1BQQURfUEFHRT1Db250cm9sIHRvIHNob3cvaGlkZSB0aGUgZGlhbG9ncyB0aGF0IGFwcGVhciB3aGVuIGEgcG9wLXVwIGFjdGlvbiBpcyBleGVjdXRlZC4KLVRPT0xUSVBfRE9fTk9UX1NIT1dfRElBTE9HX0FHQUlOPVRvIGFsbG93IHRoaXMgZGlhbG9nIHRvIHNob3cgYWdhaW4sIGVuYWJsZSBmcm9tIHByZWZlcmVuY2UgLSBkaWFsb2dzLgotVE9PTFRJUF9QUEFEX0JVVFRPTl9TSE9XX0FMTD1TaG93IGFsbCBkaWFsb2dzLgotVE9PTFRJUF9QUEFEX0JVVFRPTl9ISURFX0FMTD1IaWRlIGFsbCBkaWFsb2dzIGFuZCBleGVjdXRlIHBvcC11cCBhY3Rpb25zLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL0NhbkZpbmlzaFJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvQ2FuRmluaXNoUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzZjZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvQ2FuRmluaXNoUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gaW50ZXJmYWNlIGZvciBhbiBhYnN0cmFjdCBjYW4gZmluaXNoIHJlZ2lzdHJ5LgotICogVGhpcyByZWdpc3RyeSBpcyB1c3VhbGx5IGFzc29jaWF0ZSB3aXRoIGFuIEVjbGlwc2Ugd2l6YXJkLiAgVGhpcwotICogcmVnaXN0cnkgYWxsb3cgY29uZGl0aW9uIG9iamVjdCB0byBiZSBhZGRlZCB0byBpdCBpbiBvcmRlciB0bwotICogZGV0ZXJtaW5lIGlmIHRoZSB3aXphcmQgY2FuIGZpbmlzaCBvciBub3QuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhbkZpbmlzaFJlZ2lzdHJ5Ci17Ci0gIC8qKgotICAgKiBBZGQgYSBjb25kaXRpb24gb2JqZWN0IHRvIHRoZSByZWdpc3RyeS4KLSAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29uZGl0aW9uKCBDb25kaXRpb24gY29uZGl0aW9uICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvQ29tbWFuZFdpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9Db21tYW5kV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzA1Y2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9Db21tYW5kV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRXaWRnZXRCaW5kaW5nIGV4dGVuZHMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkKLXsKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgZXh0ZW5zaW9ucyB0byByZWdpc3RlciB0aGVpciB3aWRnZXRzIHdpdGgKLSAgICogQ29tbWFuZEZyYWdtZW50cwotICAgKiAKLSAgICogQHBhcmFtIHdpZGdldFJlZ2lzdHJ5Ci0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKCBXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSApOwotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgZXh0ZW5pb25zIHRvIHJlZ2lzdGVyIHRoZSBkYXRhIG1hcHBpbmdzCi0gICAqIHRoYXQgdGhlaXIgd2lkZ2V0cyB1c2UuCi0gICAqIAotICAgKiBAcGFyYW0gZGF0YVJlZ2lzdHJ5Ci0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyggRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkgKTsKLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGV4dGVuc2lvbnMgdG8gcmVnaXN0ZXIgY29uZGl0aW9uIG9iamVjdHMKLSAgICogdGhhdCBjb250cm9sIGlmIHRoZSB3aXphcmQgY2FuIGZpbmlzaCBvciBub3QuCi0gICAqIAotICAgKiBAcGFyYW0gY2FuRmluaXNoUmVnaXN0cnkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKCBDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL0N1cnJlbnRQYWdlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL0N1cnJlbnRQYWdlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjRkMjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9DdXJyZW50UGFnZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpemFyZFBhZ2VNYW5hZ2VyOwotCi0KLS8qKgotICogVGhpcyBDb21tYW5kIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBwYWdlLgotICogVXNlIG9mIHRoaXMgY2xhc3MgaXMgbm90IHJlY29tbWVuZGVkLgotICoKLSAqLwotcHVibGljIGNsYXNzIEN1cnJlbnRQYWdlQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBXaXphcmRQYWdlTWFuYWdlciBwYWdlTWFuYWdlcl87Ci0gIAotICBwdWJsaWMgQ3VycmVudFBhZ2VDb21tYW5kKCBXaXphcmRQYWdlTWFuYWdlciBwYWdlTWFuYWdlciApCi0gIHsKLSAgICBwYWdlTWFuYWdlcl8gPSBwYWdlTWFuYWdlcjsKLSAgfQotICAKLSAgcHVibGljIElXaXphcmRQYWdlIGdldEN1cnJlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiBwYWdlTWFuYWdlcl8uZ2V0Q3VycmVudFBhZ2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL0R5bmFtaWNXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9EeW5hbWljV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYzQyODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL0R5bmFtaWNXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5lY2xpcHNlLkVjbGlwc2VTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhRmxvd01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVDYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVQYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaXphcmRQYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaXphcmRQYWdlTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGFkZCBkeW5hbWljIHdpemFyZHMgaW50byBFY2xpcHNlLiAgV2hlbiBhZGRpbmcKLSAqIGEgZHluYW1pYyB3aXphcmQgaW50byBlY2xpcHNlIHR3byBlbnRyaWVzIG5lZWQgdG8gYmUgbWFkZSBpbiB0aGUgcGx1Z2luLnhtbAotICogZmlsZS4gIFRoaXMgZmlyc3QgZW50cnkgdGVsbHMgRWNsaXBzZSB0aGF0IGEgbmV3IHdpemFyZCBzaG91bGQgYmUgYWRkZWQKLSAqIGFuZCBpdCByZWZlcmVuY2VzIHRoaXMgY2xhc3MuICBUaGUgc2Vjb25kIGVudHJ5IHNwZWNpZmllcyBkZXRhaWxlZCBpbmZvcm1hdGlvbgotICogdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgd2l6YXJkIHRvIGJlIGFkZGVkLiAgVGhlc2UgdHdvIHBsdWdpbi54bWwgZW50cmllcwotICogYXJlIGxpbmtlZCB0b2dldGhlciB2aWEgdGhlaXIgaWQgYXR0cmlidXRlcy4gIEZvciBleGFtcGxlIGhlcmUgaXMgYW4KLSAqIGVudHJ5IHRoYXQgcmVnaXN0ZXJzIGEgbmV3IHdpemFyZCB3aXRoIGVjbGlwc2UuICBOb3RlIHRoZSBjbGFzcyBhdHRyaWJ1dGUKLSAqIHJlZmVyZW5jZXMgdGhpcyBjbGFzcy4KLSAqIDxwcmU+Ci0gKiAgICZsdDtleHRlbnNpb24KLSAqICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyImZ3Q7Ci0gKiAgICAgJmx0O3dpemFyZAotICogICAgICAgICAgIG5hbWU9IiVQTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX0NMSUVOVCIKLSAqICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZiIKLSAqICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLSAqICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZCIKLSAqICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIiZndDsKLSAqICAgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gKiAgICAgICAgICAgJVBMVUdJTl9ORVdfV0laQVJEX0RFU0NfV1NfQ0xJRU5UCi0gKiAgICAgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAqICAgICAgICAmbHQ7c2VsZWN0aW9uCi0gKiAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSImZ3Q7Ci0gKiAgICAgICAgJmx0Oy9zZWxlY3Rpb24mZ3Q7Ci0gKiAgICAgJmx0Oy93aXphcmQmZ3Q7Ci0gKiAgICZsdDsvZXh0ZW5zaW9uJmd0OwotICoKLSAqIDwvcHJlPgotICogSGVyZSBpcyB0aGUgZHluYW1pY1dpemFyZCBlbnRyeSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHdpemFyZC4gIFRoaXMgaWQgYXR0cmlidXRlcwotICogbGluayB0aGVzZSB0d28gZW50cmllcyB0b2dldGhlci4gIFRoZSBjbGFzcyBhdHRyaWJ1dGUgbXVzdCBzcGVjaWZ5IGEgY2xhc3MgdGhhdAotICogaW1wbGVtZW50cyB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcgaW50ZXJmYWNlLiAgVGhpcwotICogaW50ZXJmYWNlIHNwZWNpZmllcyB3aGF0IHRoZSBVSSBzaG91bGQgbG9vayBsaWtlIGFuZCB0aGUgY29tbWFuZHMgdGhlIHNob3VsZAotICogYmUgZXhlY3V0ZWQgaW4gdGhlIHdpemFyZC4KLSAqIAotICogPHByZT4KLSAqICAgJmx0O2V4dGVuc2lvbgotICogICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCImZ3Q7Ci0gKiAgICAgJmx0O2R5bmFtaWNXaXphcmQKLSAqICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc2NsaWVudF93aXouZ2lmIgotICogICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkNsaWVudFdpZGdldEJpbmRpbmciCi0gKiAgICAgICAgICAgdGl0bGU9IiVXSVpBUkRfVElUTEVfV1NDIgotICogICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiJmd0OwotICogICAgICZsdDsvZHluYW1pY1dpemFyZCZndDsKLSAqICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gKiA8L3ByZT4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCwgSUV4ZWN1dGFibGVFeHRlbnNpb24KLXsKLSAgcHJpdmF0ZSAgIFN0cmluZyAgICAgICAgICAgICAgICAgIGljb25CYW5uZXJOYW1lXzsKLSAgcHJpdmF0ZSAgIEJ1bmRsZSAgICAgICAgICAgICAgICAgIGJ1bmRsZV87Ci0gIHByaXZhdGUgICBTaW1wbGVDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeV87IAotICBwcml2YXRlICAgV2l6YXJkUGFnZU1hbmFnZXIgICAgICAgcGFnZU1hbmFnZXJfOwotICBwcml2YXRlICAgU3RyaW5nICAgICAgICAgICAgICAgICAgd2l6YXJkVGl0bGVfOwotICBwcml2YXRlICAgSVdpemFyZFBhZ2UgICAgICAgICAgICAgc3RhcnRQYWdlXyA9IG51bGw7Ci0gIAotICBwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50ICAgd2l6YXJkRWxlbWVudF87Ci0gIHByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgICBvcmlnaW5hbEVsZW1lbnRfOwotICBwcm90ZWN0ZWQgQ29tbWFuZFdpZGdldEJpbmRpbmcgICAgY29tbWFuZFdpZGdldEJpbmRpbmdfOwotICAKLSAgcHVibGljIER5bmFtaWNXaXphcmQoKQotICB7Ci0Jc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgRHluYW1pYyB3aXphcmQgaXMgY3JlYXRlZCBieSBlY2xpcHNlLgotICAgKiBXZSBuZWVkIHRvIGZpbmQgYSBkeW5hbWljV2l6YXJkIGV4dGVuc2lvbiBwb2ludCB0aGF0IG1hdGNoZXMgdGhlIGlkCi0gICAqIGZvciB0aGlzIHdpemFyZC4gIE9uY2UgdGhlIGV4dGVuc2lvbiBwb2ludCBpcyBmb3VuZCBpdCB3aWxsIGNvbnRhaW4KLSAgICogYSByZWZlcmVuY2UgdG8gYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcyB3aGljaCBkZWZpbmVzIHRoZSB3aWRnZXRzIAotICAgKiBhbmQgY29tbWFuZHMgZm9yIHRoaXMgd2l6YXJkLgotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgICAgICAgICAgICAgICAgZGF0YSApCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB3aXphcmRJZCAgID0gY29uZmlnLmdldEF0dHJpYnV0ZSggImlkIiApOwotICAgIAotICAgIHNldEluaXRpYWxEYXRhKCB3aXphcmRJZCApOwotICAgIG9yaWdpbmFsRWxlbWVudF8gPSBjb25maWc7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIER5bmFtaWMgV2l6YXJkIGlzIGJlaW5nCi0gICAqIGxhdW5jaGVkIHRocm91Z2ggc29tZSBvdGhlciBtZWNoYW5pc2Ugb3RoZXIgdGhhbiB0aGUgRWNsaXBzZSBOZXcgV2l6YXJkCi0gICAqIG1lY2hhbmlzbS4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nICAgICAgICB0aGUgY29tbWFuZCB3aWRnZXQgYmluZGluZyBmb3IgdGhpcyB3aXphcmQuCi0gICAqIEBwYXJhbSBkZXNjcmlwdG9yICAgICB0aGUgcGx1Z2luIGRlc2NyaXB0b3Igd2hlcmUgdGhlIGljb24gYmFubmVyIGlzCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGVkLgotICAgKiBAcGFyYW0gaWNvbkJhbm5lclBhdGggdGhlIGljb24gYmFubmVyIHBhdGggZm9yIHRoaXMgd2l6YXJkLiAgVGhlIHBhdGgKLSAgICogICAgICAgICAgICAgICAgICAgICAgIGlzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gc3BlY2lmaWVkIGJ5IHRoZSAKLSAgICogICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgcGFyYW1ldGVyLgotICAgKiBAcGFyYW0gd2l6YXJkVGl0bGUgICAgdGhlIHdpemFyZCB0aXRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbERhdGEoIENvbW1hbmRXaWRnZXRCaW5kaW5nIGJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgICAgICAgICAgICAgICBidW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICAgICBpY29uQmFubmVyUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgICAgICAgIHdpemFyZFRpdGxlICkKLSAgewotICAgIGNvbW1hbmRXaWRnZXRCaW5kaW5nXyA9IGJpbmRpbmc7Ci0gICAgYnVuZGxlXyAgICAgICAgICAgICAgID0gYnVuZGxlOwotICAgIGljb25CYW5uZXJOYW1lXyAgICAgICA9IGljb25CYW5uZXJQYXRoOwotICAgIHdpemFyZFRpdGxlXyAgICAgICAgICA9IHdpemFyZFRpdGxlOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgaW5pdGlhbCBkYXRhIGJhc2VkIG9uIHRoZSBkeW5hbWljIHdpemFyZCBpZC4KLSAgICogCi0gICAqIEBwYXJhbSB3aXphcmRJZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbERhdGEoIFN0cmluZyB3aXphcmRJZCApIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgICAgcmVnaXN0cnkgICAgICA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50ICAgICAgIHBvaW50ICAgICAgICAgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiKTsKLSAgICBJRXh0ZW5zaW9uW10gICAgICAgICAgZXh0ZW5zaW9ucyAgICA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgd2l6YXJkSW5kZXggICA9IC0xOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBleHRlbnNpb25zLmxlbmd0aDsgaW5kZXgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25zW2luZGV4XS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIAotICAgICAgaWYoIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmIGVsZW1lbnRzWzBdLmdldE5hbWUoKS5lcXVhbHMoICJkeW5hbWljV2l6YXJkIikgKSAKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGlkID0gZWxlbWVudHNbMF0uZ2V0QXR0cmlidXRlKCAiaWQiICk7Ci0gICAgICAgIAotICAgICAgICBpZiggaWQgIT0gbnVsbCAmJiBpZC5lcXVhbHMoIHdpemFyZElkICkgKQotICAgICAgICB7Ci0gICAgICAgICAgd2l6YXJkRWxlbWVudF8gPSBlbGVtZW50c1swXTsKLSAgICAgICAgICB3aXphcmRJbmRleCAgID0gaW5kZXg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYoIHdpemFyZEVsZW1lbnRfICE9IG51bGwgKQotICAgIHsKLSAgICAgIGNvbW1hbmRXaWRnZXRCaW5kaW5nXyA9IChDb21tYW5kV2lkZ2V0QmluZGluZyl3aXphcmRFbGVtZW50Xy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCAiY2xhc3MiICk7Ci0gICAgICBidW5kbGVfICAgICAgICAgICAgICAgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZXh0ZW5zaW9uc1t3aXphcmRJbmRleF0uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgaWNvbkJhbm5lck5hbWVfICAgICAgID0gd2l6YXJkRWxlbWVudF8uZ2V0QXR0cmlidXRlKCAiaWNvbmJhbm5lciIgKTsKLSAgICAgIHdpemFyZFRpdGxlXyAgICAgICAgICA9IHdpemFyZEVsZW1lbnRfLmdldEF0dHJpYnV0ZSggInRpdGxlIiApOwotICAgIH0KLSAgICAKLSAgICBpZiggY29tbWFuZFdpZGdldEJpbmRpbmdfID09IG51bGwgKQotICAgIHsKLSAgICAgIE1lc3NhZ2VVdGlscyBtc2cgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuZW52aXJvbm1lbnQiLCB0aGlzICk7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyggU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBtc2cuZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9XSVpBUkRfSURfTk9UX0ZPVU5EIiwgbmV3IFN0cmluZ1tdeyB3aXphcmRJZH0pICwgbnVsbCApOwotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIHN0YXR1cyApOwotICAgIH0KLSAgfQotICAgIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBlY2xpcHNlIGZyYW1ld29yayB0byBpbml0aWFsaXplIHRoZQotICAgKiB3aXphcmQuIAotICAgKiAKLSAgICogQHBhcmFtIHdvcmtiZW5jaCB0aGUgZWNsaXBzZSB3b3JrYmVuY2gKLSAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gdGhhdCB0aGUgdXNlciBoYXMgbWFkZSB3aXRoaW4KLSAgICogICAgICAgICAgICAgICAgICBlY2xpcHNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdCAoIElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7ICAgIAotICAgIFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQgY29udGV4dCAgICAgICAgPSBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0gICAgRWNsaXBzZVN0YXR1c0hhbmRsZXIgICAgICBoYW5kbGVyICAgICAgICA9IG5ldyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpOwotICAgIEVjbGlwc2VQcm9ncmVzc01vbml0b3IgICAgbW9uaXRvciAgICAgICAgPSBuZXcgRWNsaXBzZVByb2dyZXNzTW9uaXRvcigpOwotICAgIEVjbGlwc2VFbnZpcm9ubWVudCAgICAgICAgZW52aXJvbm1lbnQgICAgPSBuZXcgRWNsaXBzZUVudmlyb25tZW50KCBudWxsLCBjb250ZXh0LCBtb25pdG9yLCBoYW5kbGVyICk7Ci0gICAgCi0gICAgRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwgZGF0YVJlZ2lzdHJ5XyAgID0gbmV3IERhdGFNYXBwaW5nUmVnaXN0cnlJbXBsKCk7Ci0gICAgU2ltcGxlV2lkZ2V0UmVnaXN0cnkgICAgd2lkZ2V0UmVnaXN0cnlfID0gbmV3IFNpbXBsZVdpZGdldFJlZ2lzdHJ5KCk7Ci0gICAgCi0gICAgRGF0YUZsb3dNYW5hZ2VyICAgIGRhdGFNYW5hZ2VyICAgID0gbmV3IERhdGFGbG93TWFuYWdlciggZGF0YVJlZ2lzdHJ5XywgZW52aXJvbm1lbnQgKTsKLSAgICAKLSAgICBzdGFydFBhZ2VfICAgICAgICAgPSBudWxsOwotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IG5ldyBTaW1wbGVDYW5GaW5pc2hSZWdpc3RyeSgpOyAKLSAgICBwYWdlTWFuYWdlcl8gICAgICAgPSBuZXcgV2l6YXJkUGFnZU1hbmFnZXIoIHdpZGdldFJlZ2lzdHJ5XywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXaXphcmRQYWdlRmFjdG9yeSgpLCAKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTWFuYWdlciwKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50ICk7ICAKLSAgICAKLSAgICBwYWdlTWFuYWdlcl8uc2V0Um9vdEZyYWdtZW50KCBnZXRSb290RnJhZ21lbnQoIHNlbGVjdGlvbiwgcGFnZU1hbmFnZXJfICkgKTsKLSAgICAKLSAgICBjb21tYW5kV2lkZ2V0QmluZGluZ18ucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgY29tbWFuZFdpZGdldEJpbmRpbmdfLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBkYXRhUmVnaXN0cnlfICk7Ci0gICAgY29tbWFuZFdpZGdldEJpbmRpbmdfLnJlZ2lzdGVyQ2FuRmluaXNoKCBjYW5GaW5pc2hSZWdpc3RyeV8gKTsKLSAgICAgICAgCi0gICAgLy8gSWYgYSBwYWdlIGlzIG5vdCBjb21wbGV0ZSBlbnN1cmUgdGhhdCBjYW5GaW5pc2ggaXMgZmFsc2UuCi0gICAgQ29uZGl0aW9uIGNhbkZpbmlzaCA9IG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXaXphcmRQYWdlIGN1cnJlbnRQYWdlID0gcGFnZU1hbmFnZXJfLmdldEN1cnJlbnRQYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50UGFnZSAhPSBudWxsID8gY3VycmVudFBhZ2UuaXNQYWdlQ29tcGxldGUoKSA6IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAKLSAgICAKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8uYWRkKCBjYW5GaW5pc2ggKTsKLSAgICAKLSAgICAvLyBTZXQgdGhhdCB3ZSBuZWVkIGEgcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvciggdHJ1ZSApOwotICAgIAotICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBuZXh0L2JhY2sgYnV0dG9ucyBhcmUgZW5hYmxlZC4KLQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoIHRydWUgKTsKLSAgICAKLSAgICAvLyBTZXQgdGhlIGljb24gYmFubmVyIGlmIHNwZWNpZmllZC4KLSAgICBpZiggaWNvbkJhbm5lck5hbWVfICE9IG51bGwgJiYgaWNvbkJhbm5lck5hbWVfLmxlbmd0aCgpID4gMCApCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFVSTCBpbnN0YWxsVVJMICAgICAgICA9IGJ1bmRsZV8uZ2V0RW50cnkoIi8iKTsKLSAgICAgICAgVVJMIGltYWdlVVJMICAgICAgICAgID0gbmV3IFVSTChpbnN0YWxsVVJMLCBpY29uQmFubmVyTmFtZV8gKTsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotICAgICAgICAKLSAgICAgICAgaWYoIGltYWdlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoIGltYWdlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYoIHdpemFyZFRpdGxlXyAhPSBudWxsICYmIHdpemFyZFRpdGxlXy5sZW5ndGgoKSA+IDAgKQotICAgIHsKLSAgICAgIHNldFdpbmRvd1RpdGxlKCB3aXphcmRUaXRsZV8gKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMuCi0gIHByb3RlY3RlZCBXaXphcmRQYWdlRmFjdG9yeSBnZXRXaXphcmRQYWdlRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVBhZ2VGYWN0b3J5KCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgcGFnZXMgYXJlIGNvbXBsZXRlLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbGwgcGFnZXMgYXJlIGNvbXBsZXRlLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2ggKCkKLSAgewotICAJaW50ICAgICBsZW5ndGggPSBjYW5GaW5pc2hSZWdpc3RyeV8uc2l6ZSgpOwotICAJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAJCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgQ29uZGl0aW9uIGNvbmRpdGlvbiA9IChDb25kaXRpb24pY2FuRmluaXNoUmVnaXN0cnlfLmVsZW1lbnRBdCggaW5kZXggKTsKLSAgICAKLSAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi5ldmFsdWF0ZSgpOwotICAgICAgCi0gICAgICBpZiggIXJlc3VsdCApIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBwYWdlIGZvciB0aGlzIHdpemFyZC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBwYWdlIGZvciB0aGlzIHdpemFyZC4KLSAgKiovCi0gIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTdGFydGluZ1BhZ2UoKQotICB7Ci0gIAlpZiggc3RhcnRQYWdlXyA9PSBudWxsICkKLSAgCXsKLSAgCQlzdGFydFBhZ2VfID0gcGFnZU1hbmFnZXJfLmdldE5leHRQYWdlKCk7Ci0gIAl9Ci0gIAkKLSAgICByZXR1cm4gc3RhcnRQYWdlXzsKLSAgfQotCi0gIC8qKgotICAgICogUmV0dXJucyB0aGUgbmV4dCBwYWdlIGFmdGVyIHBhZ2UgYW5kCi0gICAgKiBydW5zIHRoZSBhcHByb3ByaWF0ZSB0YXNrcy4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHRoZSBuZXh0IHBhZ2UgYWZ0ZXIgcGFnZS4KLSAgKiovCi0gIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSggSVdpemFyZFBhZ2UgcGFnZSApCi0gIHsgICAKLSAgICByZXR1cm4gcGFnZU1hbmFnZXJfLmdldE5leHRQYWdlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoICgpCi0gIHsgCi0gIAlyZXR1cm4gcGFnZU1hbmFnZXJfLnBlcmZvcm1GaW5pc2goKTsKLSAgfQotCi0gIC8qKgotICAgKiBVbmRvIGZyYWdtZW50cwotICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsICgpCi0gIHsKLSAgCXJldHVybiBwYWdlTWFuYWdlcl8ucGVyZm9ybUNhbmNlbCgpOwotICB9ICAKLSAgICAgIAotICBwcm90ZWN0ZWQgQ29tbWFuZEZyYWdtZW50IGdldFJvb3RGcmFnbWVudCggSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBXaXphcmRQYWdlTWFuYWdlciBwYWdlTWFuYWdlciApCi0gIHsKLSAgICBTZXF1ZW5jZUZyYWdtZW50IHJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgIAotICAgIHJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZWxlY3Rpb25Db21tYW5kKCBzZWxlY3Rpb24gKSwgIiIgKSApOwotICAgIHJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDdXJyZW50UGFnZUNvbW1hbmQoIHBhZ2VNYW5hZ2VyICksICIiICkgKTsKLSAgICByb290LmFkZCggY29tbWFuZFdpZGdldEJpbmRpbmdfLmNyZWF0ZSgpLmNyZWF0ZSgpICk7Ci0gICAgCi0gICAgcmV0dXJuIHJvb3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gd2l6YXJkRWxlbWVudF87Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvUGFnZVdpemFyZERhdGFFdmVudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9QYWdlV2l6YXJkRGF0YUV2ZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFlYjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9QYWdlV2l6YXJkRGF0YUV2ZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBEeW5hbWljIHdpemFyZCBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3YW50IHRvIGNyZWF0ZSBkaWZmZXJlbnQKLSAqIGtpbmRzIG9mIHdpemFyZCBwYWdlcyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIFRoZSBXaXphcmRQYWdlRmFjdG9yeSByZXR1cm5zIGEgY2xhc3Mgb2YgdGhpcyB0eXBlLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBQYWdlV2l6YXJkRGF0YUV2ZW50cyBleHRlbmRzIElXaXphcmRQYWdlCi17Ci0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBXaWRnZXREYXRhRXZlbnRzIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBhZGRDb250cm9scwotICAgKiBtZXRob2Qgb2YgYSBXaWRnZXRDb250cmlidXRvci4KLSAgICovCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGdldERhdGFFdmVudHMoKTsKLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGlzIHdpemFyZCBwYWdlIGlzIGNvbXBsZXRlLiAKLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlUGFnZVRvU3RhdHVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvU2VsZWN0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL1NlbGVjdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2ZjJlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvU2VsZWN0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotCi0KLS8qKgotICogVGhpcyBTZWxlY3Rpb25Db21tYW5kIGlzIGV4ZWN1dGUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZQotICogZHluYW1pYyB3aXphcmQuICBDb21tYW5kcyBleGVjdXRlZCBpbiB0aGUgd2l6YXJkIHRoYXQgbmVlZAotICogdGhlIGluaXRpYWwgc2VsZWN0aW9uIGNhbiBnZXQgaXQgdGhyb3VnaCBhIGRhdGEgbWFwcGluZyBmcm9tIAotICogdGhpcyBjb21tYW5kIHRvIHRoZSBjb21tYW5kIHRoYXQgbmVlZHMgaXQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25fOwotICAKLSAgcHVibGljIFNlbGVjdGlvbkNvbW1hbmQoIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsKLSAgICBzZWxlY3Rpb25fID0gc2VsZWN0aW9uOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRJbml0aWFsU2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25fOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWFkMjI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuRnJhZ21lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YUZsb3dNYW5hZ2VyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBleGVjdXRpb24gb2YgQ29tbWFuZHMgaW4gYSBmbG93IG9mIENvbW1hbmRGcmFnbWVudHMuCi0gKiBUaGUgYnVsayBvZiB0aGlzIHdvcmsgaXMgZG9uZSBieSB0aGUgQ29tbWFuZEZyYWdtZW50RW5naW5lLiAgVGhlIG1haW4gam9iIG9mCi0gKiB0aGlzIGNsYXNzIGlzIHJ1biB0aGUgZnJhZ21lbnRzIGluIGEgcGFydGljdWxhciB0cmFuc2FjdGlvbmFsIGVudmlyb25tZW50LgotICogQSBmcmFnbWVudCBoYXMgYSBtZXRob2QgY2FsbGVkIGRvTm90UnVuSW5UcmFuc2FjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRldGVybWluZQotICogaWYgaXRzIGNvbW1hbmRzIHNob3VsZCBiZSBydW4gaW4gYSB0cmFuc2FjdGlvbiBvciBub3QuICBJZiB0aGlzIG1ldGhvZCByZXR1cm5zCi0gKiB0cnVlKGllLiBub3QgaW4gYSB0cmFuc2FjdGlvbikgdGhlIENvbW1hbmRzIGFyZSB3cmFwcGVkIGluIGEgSVJ1bm5hYmxlV2l0aFByb2dyZXNzLgotICogSWYgZmFsc2UoIGllLiBpbiBhIHRyYW5zYWN0aW9uICkgdGhlIENvbW1hbmRzIGFyZSB3cmFwcGVkIGluIGEgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uLiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlcgotewotICBwcm90ZWN0ZWQgQ29tbWFuZEZyYWdtZW50RW5naW5lIGVuZ2luZV87Ci0gIHByb3RlY3RlZCBEYXRhRmxvd01hbmFnZXIgICAgICAgZGF0YU1hbmFnZXJfOwotICBwcml2YXRlICAgRW52aXJvbm1lbnQgICAgICAgICAgIGVudmlyb25tZW50XzsKLSAgCi0gIHByaXZhdGUgICBib29sZWFuICAgICAgICAgICAgICAgZm91bmRTdG9wXzsKLSAgcHJpdmF0ZSAgIGJvb2xlYW4gICAgICAgICAgICAgICBkb05vdFJ1bkluVHJhbnNhY3Rpb25fOwotICAKLSAgcHVibGljIFNpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyKCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgRGF0YUZsb3dNYW5hZ2VyIGRhdGFNYW5hZ2VyICkKLSAgewotICAgIGVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotICAgIGRhdGFNYW5hZ2VyXyA9IGRhdGFNYW5hZ2VyOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgcm9vdCBmcmFnbWVudC4gIFRoZSBleGVjdXRpb24gZW5naW5lIHdpbGwgc3RhcnQgZXhlY3V0aW5nIGNvbW1hbmRzCi0gICAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyByb290IGZyYWdtZW50LgotICAgKiAKLSAgICogQHBhcmFtIHJvb3QgdGhlIHJvb3QgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSb290RnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCByb290ICkKLSAgewotICAJZW5naW5lXyA9IG5ldyBDb21tYW5kRnJhZ21lbnRFbmdpbmUoIHJvb3QsIGRhdGFNYW5hZ2VyXywgZW52aXJvbm1lbnRfICk7ICAJICAKLSAgCQotICAgIGVuZ2luZV8uc2V0UGVla0ZyYWdtZW50TGlzdGVuZXIoIAotICAgICAgbmV3IEZyYWdtZW50TGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgIGJvb2xlYW4gbm90aWZ5KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHBlZWtGcmFnbWVudCggZnJhZ21lbnQgKTsKLSAgICAgICAgfQotICAgICAgfSApOyAgCi0gICAgICAgICAgICAgICAgICAKLSAgICBlbmdpbmVfLnNldE5leHRGcmFnbWVudExpc3RlbmVyKCAKLSAgICAgIG5ldyBGcmFnbWVudExpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljICBib29sZWFuIG5vdGlmeSggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXh0RnJhZ21lbnQoIGZyYWdtZW50ICk7Ci0gICAgICAgIH0KLSAgICAgIH0gKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCWVuZ2luZV8uc2V0VW5kb0ZyYWdtZW50TGlzdGVuZXIoCi0gICAgICBuZXcgRnJhZ21lbnRMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG5vdGlmeSggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB1bmRvRnJhZ21lbnQoIGZyYWdtZW50ICk7Ci0gICAgICAgIH0KLSAgICAgIH0gKTsgICAgICAgICAgICAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoZSBDb21tYW5kRnJhZ21lbnRFbmdpbmUgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiBpdCBpcyBwZWVraW5nIGZvcndhcmQKLSAgICogaW4gdGhlIGZyYWdtZW50cy4gIFdoZW4gcGVla2luZyBmb3J3YXJkIHRoZSBjb21tYW5kIHN0YWNrIHN0YXRlIGluIHRoZQotICAgKiBlbmdpbmUgaXMgbm90IGNoYW5nZXMuCi0gICAqIAotICAgKiAKLSAgICogQHBhcmFtIGZyYWdtZW50IHRoZSBmcmFnbWVudCB0aGF0IGl0IGlzIHBlZWtpbmcgYXQuCi0gICAqIEByZXR1cm4gSW5kaWNhdGVzIHdoZXRoZXIgcGVla2luZyBzaG91bGQgc3RvcCBvciBub3QuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwZWVrRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsgICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogVGhlIENvbW1hbmRGcmFnbWVudEVuZ2luZSBjYWxscyB0aGlzIG1ldGhvZCB3aGVuIGl0IGlzIG1vdmluZyBmb3J3YXJkCi0gICAqIGluIHRoZSBmcmFnbWVudHMuICAgV2hlbiBtb3ZpbmcgZm9yd2FyZCB0aGUgY29tbWFuZCBzdGFjayBzdGF0ZSBpcyBzYXZlZAotICAgKiBhdCBlYWNoIGZyYWdtZW50IGlzIHRyYXZlcnNlZC4KLSAgICogCi0gICAqIEBwYXJhbSBmcmFnbWVudCB0aGUgZnJhZ21lbnQgdGhhdCBpcyBiZWluZyB0cmF2ZXJzZWQuCi0gICAqIEByZXR1cm4gaW5kaWNhdGVzIGlmIHRoZSBmb3J3YXJkIHRyYXZlcnNhbCBzaG91bGQgY29udGludWUuICAKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIG5leHRGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgeyAgICAgCi0gICAgaWYoIGZyYWdtZW50LmRvTm90UnVuSW5UcmFuc2FjdGlvbigpICE9IGRvTm90UnVuSW5UcmFuc2FjdGlvbl8gKQotICAgIHsKLSAgICAgIC8vIFRoZSBmcmFnbWVudCBpcyByZXF1ZXN0aW5nIGEgZGlmZmVyZW50IHRyYW5zYWN0aW9uIGVudmlyb25tZW50IHRoYW4KLSAgICAgIC8vIHRoZSBvbmUgdGhhdCB3ZSBhcmUgaW4gc28gd2UgbXVzdCBzdG9wIGFuZCBjaGFuZ2UgZW52aXJvbm1lbnRzLgotICAgICAgZG9Ob3RSdW5JblRyYW5zYWN0aW9uXyA9IGZyYWdtZW50LmRvTm90UnVuSW5UcmFuc2FjdGlvbigpOwotICAgICAgZm91bmRTdG9wXyAgICAgICAgICAgICA9IGZhbHNlOyAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZm91bmRTdG9wXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgZWFjaCBmcmFnbWVudCB3aGVuIHRoZSBjb21tYW5kIGVuZ2luZSBpcyB1bndpbmRpbmcKLSAgICogaXRzIHN0YWNrIGR1cmluZyBhbiB1bmRvIG9wZXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmcmFnbWVudCAgdGhlIGZyYWdtZW50IGJlaW5nIHVuZG9uZS4KLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIHVuZG8gcHJvY2VzcyBzaG91bGQgY29udGludWUuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRvRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsgIAkgIAkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAgIAotICAvKioKLSAgICogVGhlIG1ldGhvZCBleGVjdXRlcyB0aGUgQ29tbWFuZEZyYWdtZW50IGNvbW1hbmRzIGluIHRoZSBjb250ZXh0IHByb3ZpZGVkLgotICAgKiAKLSAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBzdGF0dXMgb2YgZXhlY3V0aW5nIHRoZSBjb21tYW5kcy4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgcnVuRm9yd2FyZFRvTmV4dFN0b3AoIElSdW5uYWJsZUNvbnRleHQgY29udGV4dCApCi0gIHsKLSAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uID0gbnVsbDsKLSAgICAKLSAgCWRvTm90UnVuSW5UcmFuc2FjdGlvbl8gPSBmYWxzZTsKLSAgCQotICAJZG8KLSAgCXsKLSAgCSAgLy8gV2Ugd2lsbCBzdG9wIHVubGVzcyB3ZSBhcmUgY2hhbmdpbmcgdHJhbnNhY3Rpb24gbW9kZXMuCi0gICAgICBmb3VuZFN0b3BfID0gdHJ1ZTsKLSAgICAgIAotICAJICBpZiggZG9Ob3RSdW5JblRyYW5zYWN0aW9uXyApCi0gIAkgIHsKLSAgCSAgICBvcGVyYXRpb24gPSBnZXROb1RyYW5zYWN0aW9uT3BlcmF0aW9uKCk7Ci0gIAkgIH0KLSAgCSAgZWxzZQotICAJICB7Ci0gIAkgICAgb3BlcmF0aW9uID0gZ2V0VHJhbnNhY3Rpb25PcGVyYXRpb24oKTsKLSAgCSAgfQotICAJICAKLSAgIAkgIHRyeQotICAJICB7ICAJICAgCi0gIAkgICAgaWYoIGNvbnRleHQgPT0gbnVsbCApCi0gIAkgICAgewotICAJICAgCSAgLy8gV2UgZG9uJ3QgaGF2ZSBhIGNvbnRhaW5lciB5ZXQgc28ganVzdCBydW4gdGhlIG9wZXJhdGlvbi4KLSAgCSAgIAkgIG9wZXJhdGlvbi5ydW4oIG51bGwgKTsKLSAgCSAgICB9Ci0gIAkgICAgZWxzZQotICAJICAgIHsKLSAgCSAgIAkgIC8vIFdlIGhhdmUgYSBjb250YWluZXIgd2hlcmUgdGhpcyBvcGVyYXRpb24gY2FuIHJ1biBhbmQgaGF2ZQotICAJICAgCSAgLy8gaXRzIHByb2dyZXNzIGRpc3BsYXllZC4KLSAgCSAgICAgIGNvbnRleHQucnVuKCBmYWxzZSwgZmFsc2UsIG9wZXJhdGlvbiApOwotICAJICAgIH0KLSAgCSAgfQotICAJICBjYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZXhjICkKLSAgCSAgewotICAJICAgIC8vVE9ETyBzaG91bGQgbG9nIHRoZXNlIGV4Y2VwdGlvbnMuCi0gIAkgICAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotICAJICB9Ci0gIAkgIGNhdGNoKCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YyApCi0gIAkgIHsKLSAgCSAgICAvL1RPRE8gc2hvdWxkIGxvZyB0aGVzZSBleGNlcHRpb25zLgotICAJICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgCSAgfQotICAJfSAgCi0gIAl3aGlsZSggIWZvdW5kU3RvcF8gKTsgCi0gIAkKLSAgCXJldHVybiBlbmdpbmVfLmdldExhc3RTdGF0dXMoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0VHJhbnNhY3Rpb25PcGVyYXRpb24oKQotICB7Ci0gICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1biggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAvL1dvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkKLSAgICAvL3sKLSAgICAvLyAgcHVibGljIHZvaWQgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAgIHsKLSAgICAgICAgRWNsaXBzZVByb2dyZXNzTW9uaXRvciBlY2xpcHNlTW9uaXRvciA9IChFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKWVudmlyb25tZW50Xy5nZXRQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgZWNsaXBzZU1vbml0b3Iuc2V0TW9uaXRvciggbW9uaXRvciApOwotICAgICAgICBlbnZpcm9ubWVudF8uZ2V0TG9nKCkubG9nKExvZy5JTkZPLCAiY29tbWFuZCIsIDUwMDIsIHRoaXMsICJnZXRUcmFuc2FjdGlvbk9wZXJhdGlvbiIsICJTdGFydCBvZiB0cmFuc2FjdGlvbiIpOwotICAgICAgICBlbmdpbmVfLm1vdmVGb3J3YXJkVG9OZXh0U3RvcCgpOwotICAgICAgICBlbnZpcm9ubWVudF8uZ2V0TG9nKCkubG9nKExvZy5JTkZPLCAiY29tbWFuZCIsIDUwMDMsIHRoaXMsICJnZXRUcmFuc2FjdGlvbk9wZXJhdGlvbiIsICJFbmQgb2YgdHJhbnNhY3Rpb24iKTsKLSAgICAgIH0KLSAgICB9OwotICAgIAotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldE5vVHJhbnNhY3Rpb25PcGVyYXRpb24oKQotICB7Ci0gICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1biggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgICAgIHsKLSAgICAgICAgRWNsaXBzZVByb2dyZXNzTW9uaXRvciBlY2xpcHNlTW9uaXRvciA9IChFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKWVudmlyb25tZW50Xy5nZXRQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgZWNsaXBzZU1vbml0b3Iuc2V0TW9uaXRvciggbW9uaXRvciApOwotICAgICAgICBlbnZpcm9ubWVudF8uZ2V0TG9nKCkubG9nKExvZy5JTkZPLCAiY29tbWFuZCIsIDUwODUsIHRoaXMsICJnZXROb1RyYW5zYWN0aW9uT3BlcmF0aW9uIiwgIlN0YXJ0IG9mIE5PTiB0cmFuc2FjdGlvbiIpOwotICAgICAgICBlbmdpbmVfLm1vdmVGb3J3YXJkVG9OZXh0U3RvcCgpOwotICAgICAgICBlbnZpcm9ubWVudF8uZ2V0TG9nKCkubG9nKExvZy5JTkZPLCAiY29tbWFuZCIsIDUwODYsIHRoaXMsICJnZXROb1RyYW5zYWN0aW9uT3BlcmF0aW9uIiwgIkVuZCBvZiBOT04gdHJhbnNhY3Rpb24iKTsKLSAgICAgIH0KLSAgICB9OyAKLSAgICAKLSAgICByZXR1cm4gb3BlcmF0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYzdkZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL1NpbXBsZVdpZGdldERhdGFDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHNpbXBsZSBXaWRnZXREYXRhQ29udHJpYnV0b3IgY2xhc3MgdGhhdCBjb25jcmV0ZSAKLSAqIFdpZGdldERhdGFDb250cmlidXRvcnMgY2FuIHN1YmNsYXNzLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciBpbXBsZW1lbnRzIFdpZGdldERhdGFDb250cmlidXRvcgoteyAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2FkZENvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHMjZXh0ZXJuYWxpemUoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXh0ZXJuYWxpemUoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzI2ludGVybmFsaXplKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvV2lkZ2V0Q29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXRDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQzMzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXRDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB3YXkgZm9yIGRldmVsb3BlcnMgdG8gY3JlYXRlIHZhbGlkYXRhYmxlIHdpZGdldHMKLSAqIHRoYXQgY2FuIGJlIHVzZWQgaW4gbWFueSBkaWZmZXJlbnQgRWNsaXBzZSBVSSBjb250ZXh0cy4gKGllLiBpbiBhIFdpbmRvd3MsIERpYWdsb2dzLAotICogd2l6YXJkIHBhZ2VzLCBldGMpCi0gKgotICogVGhlIG1haW4gZnVuY3Rpb25hbGl0eSB0aGlzIGludGVyZmFjZSBoYXMgb3ZlciBqdXN0IGEgcmVndWxhciBFY2xpcHNlIENvbXBvc2l0ZQotICogaXMgdGhhdCBpdCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgdmFsaWRhdGluZyB0aGUgV2lkZ2V0LiAgV2hlbiB2YWxpZGF0aW5nCi0gKiB0aGVyZSBhcmUgdHdvIGFzcGVjdHMgdG8ga2VlcCBpbiBtaW5kLiAgVGhlIGZpcnN0IGFzcGVjdCBkZWFscyB3aXRoIFdIRU4gdmFsaWRhdGlvbgotICogb2NjdXJzIGFuZCB0aGUgc2Vjb25kIGFzcGVjdCBkZWFscyB3aXRoIFdIQVQgdG8gZG8gZm9yIGEgdmFsaWRhdGlvbiBldmVudC4KLSAqIAotICogVGhlIGZpcnN0IGFzcGVjdCBvZiB0cmlnZ2VyaW5nIHZhbGlkYXRpb24gZXZlbnRzIGlzIGhhbmRsZWQgYnkgdGhlIHN0YXR1c0xpc3RlbmVyCi0gKiBwYXJhbWV0ZXIgb2YgdGhlIGFkZENvbnRyb2xzIG1ldGhvZC4gIElmIGEgcGFydGljdWxhciBjb250cm9sIHRoYXQgaXMgY29udHJpYnV0ZWQgY2FuCi0gKiBhZmZlY3QgdGhlIHZhbGlkaXR5IG9mIHRoaXMgV2lkZ2V0Q29udHJpYnV0b3IgdGhlbiB0aGUgc3RhdHVzTGlzdGVuZXIgb2JqZWN0Ci0gKiBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGxpc3RlbmVyIGxpc3Qgb2YgdGhhdCBjb250cm9sLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSB0ZXh0IGluCi0gKiBhIFRleHQgd2lkZ2V0IGNhbiBhZmZlY3QgdGhlIHZhbGlkaXR5IG9mIHRoaXMgV2lkZ2V0Q29udHJpYnV0b3IgdGhlbiB5b3Ugd291bGQKLSAqIGFkZCB0aGUgc3RhdHVzTGlzdGVuZXIgdG8gdGhlIFRleHQgd2lkZ2V0cyBNb2RpZnkgbGlzdGVuZXIgbGlzdDoKLSAqIAotICogCi0gKiAgIFRleHQgc29tZVRleHQgPSBuZXcgVGV4dCggcGFyZW50LCBTV1QuTk9ORSApOwotICogICBzb21lVGV4dC5hZGRMaXN0ZW5lciggU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXIgKTsKLSAqIAotICogTm90ZTogaWYgeW91IHdhbnQgdG8gZm9yY2UgdmFsaWRhdGlvbiBvZiB0aGlzIHdpZGdldCB5b3UgY2FuIGNhbGwKLSAqICAgICAgIHRoZSBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKSBtZXRob2QgZGlyZWN0bHkuICBUaGlzCi0gKiAgICAgICBpcyBub3QgdGhlIHByZWZlcmVkIG1heSB0byB0cmlnZ2VyIHZhbGlkYXRpb24sIGhvd2V2ZXIuCi0gKiAgICAgICAKLSAqIFRoZSBzZWNvbmQgYXNwZWN0IG9mIHZhbGlhdGlvbiBpcyB3aGF0IHRvIGRvIHdoZW4gdGhlIHZhbGlkYXRpb24gZXZlbnQgb2NjdXJzLgotICogVGhpcyBpcyBoYW5kbGVkIGJ5IGdldFN0YXR1cyBtZXRob2QuICBBbnkgY29kZSB0aGF0IGVuc3VyZXMgdGhhdCB0aGlzIHdpZGdldCBpcwotICogdmFsaWQgc2hvdWxkIGJlIHB1dCBpbiB0aGUgZ2V0U3RhdHVzIGltcGxlbWVudGF0aW9uLiAKLSAqIAotICogCi0qLwotcHVibGljIGludGVyZmFjZSBXaWRnZXRDb250cmlidXRvciAKLXsKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgVUkgY29udHJpYnV0aW9ucyBmb3IgdGhpcyB3aWRnZXQuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50IFRoZSBjb21wb3NpdGUgcGFyZW50IHRoYXQgc3ViIHdpZGdldHMgc2hvdWxkIHVzZS4KLSAgICogQHBhcmFtIHN0YXR1c0xpc3RlbmVyIFRoaXMgbGlzdGVuZXIgc2hvdWxkIGJlIGFkZGVkIHRvIGFueSB3aWRnZXQgdGhhdCBjYW4KLSAgICogICAgICAgICAgICAgICAgICAgICAgIGFmZmVjdCB0aGUgdmFsaWRpdHkgb2YgdGhpcyBXaWRnZXRDb250cmlidXRvci4KLSAgICogQHJldHVybiByZXR1cm5zIGEgV2lkZ2V0RGF0YUV2ZW50cyBvYmplY3QuICBUaGlzIG9iamVjdCBpcyB1c2VkIGJ5IHRoZQotICAgKiAgICAgICAgIGZyYW1ld29yayB0byBpbnRlcm5hbGl6ZSBhbmQgZXh0ZXJuYWxpemUgZGF0YSBmb3IgdGhpcyB3aWRnZXQuCi0gICAqLwotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKTsKLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgaW1wbGVtZW50IHZhbGlkYXRpb24gY29kZSBmb3IgdGhpcyBXaWRnZXRDb250cmlidXRvci4KLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB0aGUgdmFsaWRpdHkgb2YgdGhpcyB3aWRnZXQuCi0gICAqICAgICAgICAgSWYgdGhlIHN0YXR1cyBzZXZlcml0eSBpcyBFUlJPUiB0aGVuIHRoaXMgd2lkZ2V0IGlzIGNvbnNpZGVyZWQgdG8KLSAgICogICAgICAgICBiZSBpbnZhbGlkLiAgRm9yIGFueSBvdGhlciBzdGF0dXMgc2V2ZXJpdHkgb3IgaWYgdGhlIHN0YXR1cyByZXR1cm5lZAotICAgKiAgICAgICAgIGlzIG51bGwgdGhpcyB3aWRnZXQgaXMgY29uc2lkZXJlZCB0byBiZSB2YWxpZC4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNmIxYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL1dpZGdldENvbnRyaWJ1dG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0czsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlIGEgd2F5IGZvciBjcmVhdGluZyBXaWRnZXRDb250cmlidXRvcnMKLSAqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSAKLXsKLSAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL1dpZGdldERhdGFDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL1dpZGdldERhdGFDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ3NjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXREYXRhQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgV2lkZ2V0Q29udHJpYnV0b3IgaW50ZXJmYWNlIGFuZAotICogdGhlIFdpZGdldERhdGFFdmVudHMgaW50ZXJmYWNlLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBXaWRnZXREYXRhQ29udHJpYnV0b3IgZXh0ZW5kcyBXaWRnZXRDb250cmlidXRvciwgV2lkZ2V0RGF0YUV2ZW50cyAKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXREYXRhRXZlbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvV2lkZ2V0RGF0YUV2ZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ2YWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXREYXRhRXZlbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgd2F5IGZvciBpbnRlcm5hbGl6aW5nIGFuZCBleHRlcm5hbGl6aW5nIHN0YXRlCi0gKiBkYXRhIGluIGEgV2lkZ2V0Q29udHJpYnV0b3IuICBUaGUgaW50ZXJuYWxpemUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCi0gKiBiZWZvcmUgdGhlIHdpZGdldCBpcyBkaXNwbGF5ZWQgc28gdGhhdCBpdCBjYW4gc2V0IHRoZSBkZWZhdWx0IGRhdGEKLSAqIGZvciB0aGF0IHdpZGdldC4gIFRoZSBleHRlcm5hbGl6ZSBtZXRob2QgcHJvdmlkZXMgYSB3YXkgb2YgZ2V0dGluZyBkYXRhCi0gKiBmcm9tIHRoZSB3aWRnZXQgYWZ0ZXIgaXQgaXMgZGlzcGxheWVkLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBXaWRnZXREYXRhRXZlbnRzIAotewotICAvKioKLSAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBzZXQgd2lkZ2V0IHN0YXRlIGRhdGEgaGVyZS4KLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCk7Ci0gIAotICAvKioKLSAgICogSW1wbGVtZW5hdGlvbnMgc2hvdWxkIGdldCB3aWRnZXQgc3RhdGUgZGF0YSBoZXJlLgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgZXh0ZXJuYWxpemUoKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL1dpZGdldFJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvV2lkZ2V0UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxNDk0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvV2lkZ2V0UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBob3cgV2lkZ2V0Q29udHJpYnV0b3JzIGFyZSBtYWRlIGtub3duIHRvIHRoZQotICogZHluYW1pYyB3aXphcmQgZnJhbWV3b3JrLiAgVGhpcyB3aWRnZXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgYSB3aXphcmQgcGFnZQotICogd2l0aCB0aGUgbmFtZSBhbmQgdGl0bGUgc3BlY2lmaWVkIGluIHRoZSBhZGQgbWV0aG9kLiAgVGhlIGZyYWdtZW50SWQgaXMgCi0gKiB1c2VkIHRvIGFzc29jaWF0ZSB0aGlzIHdpZGdldCB3aXRoIGEgcGFydGljdWxhciBDb21tYW5kRnJhZ21lbnQuICBXaGVuCi0gKiBhIENvbW1hbmRGcmFnbWVudCB3aXRoIHRoaXMgZnJhZ21lbnRJZCBpcyB0cmF2ZXJzZWQgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIFdpZGdldENvbnRyaWJ1dG9yIHdpbGwgYmUgZGlzcGxheWVkLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBXaWRnZXRSZWdpc3RyeQotewotICAvKioKLSAgICogQWRkcyBhIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB0byB0aGUgZnJhbWV3b3JrLiAgVGhpcyBmYWN0b3J5Ci0gICAqIGlzIHVzZWQgdG8gZ2V0IHRoZSBXaWRnZXRDb250cmlidXRvci4gIFRoaXMgV2lkZ2V0Q29udHJpYnV0b3IKLSAgICogd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgd2l6YXJkIHBhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gZnJhZ21lbnRJZCB0aGUgQ29tbWFuZEZyYWdtZW50IGlkIHRoYXQgdGhpcyBXaWRnZXRDb250cmlidXRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAqIEBwYXJhbSBwYWdlTmFtZSB0aGUgbmFtZSBvZiB0aGlzIHdpemFyZCBwYWdlLgotICAgKiBAcGFyYW0gcGFnZVRpdGxlIHRoZSB0aXRsZSBvZiB0aGlzIHdpemFyZCBwYWdlLgotICAgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSB0aGUgZmFjdG9yeSB3aGljaCB3aWxsIGNyZWF0ZSB0aGUgV2lkZ2V0Q29udHJpYnV0b3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGQoIFN0cmluZyBmcmFnbWVudElkLAotCQkJCSAgIFN0cmluZyBwYWdlTmFtZSwKLQkJCQkgICBTdHJpbmcgcGFnZVRpdGxlLAotCQkJCSAgIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB3aWRnZXRGYWN0b3J5ICk7Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL2Vudmlyb25tZW50LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvZW52aXJvbm1lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5OGUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL3dpZGdldHMvZW52aXJvbm1lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLU1TR19FUlJPUl9XSVpBUkRfSURfTk9UX0ZPVU5EPUlXQUIwMDEzRSBDb3VsZCBub3QgZmluZCB3aXphcmQgaWQ6IHswfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9FcnJvckRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvRXJyb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxNzM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9FcnJvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvckRpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cKLXsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICogPHA+Ci0gICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZSBvZgotICAgKiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgKiBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbAotICAgKiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLSAgICogPC9wPgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgRXJyb3JEaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIFN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgaWYgKHN0YXR1cy5oYXNDaGlsZHJlbigpIHx8IHN0YXR1cy5nZXRUaHJvd2FibGUoKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUik7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvSW5mb0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvSW5mb0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmMzNWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL0luZm9EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmRpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgSW5mb0RpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cKLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIEluZm9EaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIFN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgaWYgKHN0YXR1cy5oYXNDaGlsZHJlbigpKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9NZXNzYWdlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9NZXNzYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2Nzg4YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvTWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmRpYWxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURpYWxvZyBleHRlbmRzIERpYWxvZwotewotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotICAvKioKLSAgICogUmVzZXJ2ZSByb29tIGZvciB0aGlzIG1hbnkgbGlzdCBpdGVtcy4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExJU1RfSVRFTV9DT1VOVCA9IDc7Ci0KLSAgLyoqCi0gICAqIFRoZSBEZXRhaWxzIGJ1dHRvbi4KLSAgICovCi0gIHByb3RlY3RlZCBCdXR0b24gZGV0YWlsc0J1dHRvbjsKLQotICAvKioKLSAgICogVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0gIC8qKgotICAgKiBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOwotCi0gIC8qKgotICAgKiBUaGUgU1dUIGxpc3QgY29udHJvbCB0aGF0IGRpc3BsYXlzIHRoZSBlcnJvciBkZXRhaWxzLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgbGlzdDsKLSAgcHJvdGVjdGVkIFRleHQgZGV0YWlsczsKLQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVycm9yIGRldGFpbHMgdmlld2VyIGlzIGN1cnJlbnRseSBjcmVhdGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gbGlzdENyZWF0ZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGV0YWlsc0NyZWF0ZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogRmlsdGVyIG1hc2sgZm9yIGRldGVybWluaW5nIHdoaWNoIHN0YXR1cyBpdGVtcyB0byBkaXNwbGF5LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBkaXNwbGF5TWFzayA9IDB4RkZGRjsKLQotICAvKioKLSAgICogVGhlIG1haW4gc3RhdHVzIG9iamVjdC4KLSAgICovCi0gIHByb3RlY3RlZCBTdGF0dXMgc3RhdHVzOwotICAKLSAgcHJpdmF0ZSBQb2ludCBzYXZlZFNpemUgPSBudWxsOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIHRoZSBtYWluIGVycm9yIG9iamVjdCdzIGRldGFpbGVkIGVycm9ycyAoZWxlbWVudCB0eXBlOiA8Y29kZT5TdGF0dXM8L2NvZGU+KS4KLSAgICovCi0gIHByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBzdGF0dXNMaXN0OwotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICogPHA+Ci0gICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZSBvZgotICAgKiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgKiBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbAotICAgKiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLSAgICogPC9wPgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgTWVzc2FnZURpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgICB0aGlzLnRpdGxlID0gZGlhbG9nVGl0bGUgPT0gbnVsbCA/IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiUHJvYmxlbV9PY2N1cnJlZCIpIDogLy8kTk9OLU5MUy0xJAotICBkaWFsb2dUaXRsZTsKLSAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlID09IG51bGwgPyBzdGF0dXMuZ2V0TWVzc2FnZSgpIDogSkZhY2VSZXNvdXJjZXMuZm9ybWF0KCJSZWFzb24iLCBuZXcgT2JqZWN0W10geyBtZXNzYWdlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpfSk7IC8vJE5PTi1OTFMtMSQKLSAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgICBzdGF0dXNMaXN0ID0gQXJyYXlzLmFzTGlzdChzdGF0dXMuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgdGhpcy5kaXNwbGF5TWFzayA9IGRpc3BsYXlNYXNrOwotICAgIHNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLiBIYW5kbGVzIHRoZSBwcmVzc2luZyBvZiB0aGUgT2sgb3IKLSAgICogRGV0YWlscyBidXR0b24gaW4gdGhpcyBkaWFsb2cuIElmIHRoZSBPayBidXR0b24gd2FzIHByZXNzZWQgdGhlbiBjbG9zZQotICAgKiB0aGlzIGRpYWxvZy4gSWYgdGhlIERldGFpbHMgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gdG9nZ2xlIHRoZSBkaXNwbGF5aW5nCi0gICAqIG9mIHRoZSBlcnJvciBkZXRhaWxzIGFyZWEuIE5vdGUgdGhhdCB0aGUgRGV0YWlscyBidXR0b24gd2lsbCBvbmx5IGJlCi0gICAqIHZpc2libGUgaWYgdGhlIGVycm9yIGJlaW5nIGRpc3BsYXllZCBzcGVjaWZpZXMgY2hpbGQgZGV0YWlscy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKQotICB7Ci0gICAgaWYgKGlkID09IFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lEKQotICAgIHsgLy8gd2FzIHRoZSBkZXRhaWxzIGJ1dHRvbiBwcmVzc2VkPwotICAgICAgdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotICAgIH0KLSAgfQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBXaW5kb3cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICBzaGVsbC5zZXRUZXh0KHRpdGxlKTsKLSAgfQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBPSyBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGlmIChzdGF0dXMuaGFzQ2hpbGRyZW4oKSB8fCBzdGF0dXMuZ2V0VGhyb3dhYmxlKCkgIT0gbnVsbCApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwYXJlbnQuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSk7Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4gQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMKLSAgICogb2YgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0KLSAgICAvLyBjcmVhdGUgY29tcG9zaXRlCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBDb21wb3NpdGUgaW1hZ2VBbmRMYWJlbCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgaW1hZ2VBbmRMYWJlbC5zZXRMYXlvdXQoZ2wpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApKTsKLSAgICAKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICBJbWFnZSBpbWFnZSA9IGdldERpYWxvZ0ltYWdlKCk7Ci0gICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgewotICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaW1hZ2VBbmRMYWJlbCwgMCk7Ci0gICAgICBpbWFnZS5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICBsYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0gICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKAotICAgICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIKLSAgICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0gICAgfQotCi0gICAgLy8gY3JlYXRlIG1lc3NhZ2UKLSAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KGltYWdlQW5kTGFiZWwsIFNXVC5SRUFEX09OTFl8U1dULldSQVApOwotICAgICAgdGV4dC5zZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgR3JpZERhdGEgZGF0YSA9Ci0gICAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTAotICAgICAgICAgICAgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLSAgICAgIGRhdGEud2lkdGhIaW50ID0KLSAgICAgICAgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSCk7Ci0gICAgIAotICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgdGV4dC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgIH0KLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBjcmVhdGVEcm9wRG93bkxpc3QoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSB0aGUgbGlzdAotICAgIGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCi0gICAgLy8gZmlsbCB0aGUgbGlzdAotICAgIHBvcHVsYXRlTGlzdChsaXN0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPQotICAgICAgbmV3IEdyaWREYXRhKAotICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZGF0YS5oZWlnaHRIaW50ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCkgKiBMSVNUX0lURU1fQ09VTlQ7Ci0gICAgbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGxpc3RDcmVhdGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICBwcm90ZWN0ZWQgVGV4dCBjcmVhdGVEcm9wRG93bkRldGFpbHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGRldGFpbHMgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAvL2RldGFpbHMuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIENvbG9yIGNvbG9yID0gbmV3IENvbG9yKHBhcmVudC5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgMjU1LCAyNTUsIDI1NSk7Ci0gICAgZGV0YWlscy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLSAgICBwb3B1bGF0ZURldGFpbHMoZGV0YWlscywgc3RhdHVzLCAwKTsKLSAgICBHcmlkRGF0YSBkYXRhID0KLSAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGRldGFpbHMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBkZXRhaWxzLnNldFNlbGVjdGlvbigwKTsKLSAgICBkZXRhaWxzQ3JlYXRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIGRldGFpbHM7Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgKi8KLSAgLyoqCi0gICAqIEV4dGVuZHMgPGNvZGU+V2luZG93Lm9wZW4oKTwvY29kZT4uIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5Ci0gICAqIHRoZSBlcnJvci4gSWYgeW91IHNwZWNpZmllZCBhIG1hc2sgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0gICAqIGNoaWxkcmVuLCB0aGUgZXJyb3IgZGlhbG9nIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0gICAqIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLSAgICovCi0gIHB1YmxpYyBpbnQgb3BlbigpCi0gIHsKLSAgICBpZiAoc2hvdWxkRGlzcGxheShzdGF0dXMsIGRpc3BsYXlNYXNrKSkKLSAgICB7Ci0gICAgICByZXR1cm4gc3VwZXIub3BlbigpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotICAvKioKLSAgICogVGhpcyBlc3NlbnRpYWxseSBkb2VzIHRoZSB3b3JrIG9mIGEgZmFjdG9yeSBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8KLSAgICogZGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IuIFVzZSB0aGlzIG1ldGhvZCBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nCi0gICAqIGRpc3BsYXllZCBkb2VzIG5vdCBjb250YWluIGNoaWxkIGl0ZW1zLCBvciBpZiB5b3Ugd2lzaCB0byBkaXNwbGF5IGFsbCBzdWNoCi0gICAqIGl0ZW1zIHdpdGhvdXQgZmlsdGVyaW5nLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudAotICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHJldHVybiB0aGUgY29kZSBvZiB0aGUgYnV0dG9uIHRoYXQgd2FzIHByZXNzZWQgdGhhdCByZXN1bHRlZCBpbiB0aGlzCi0gICAqICAgICAgICAgZGlhbG9nIGNsb3NpbmcuIFRoaXMgd2lsbCBiZSA8Y29kZT5EaWFsb2cuT0s8L2NvZGU+IGlmIHRoZSBPSwotICAgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotICAgKiAgICAgICAgIGRpYWxvZydzIGNsb3NlIHdpbmRvdyBkZWNvcmF0aW9uIG9yIHRoZSBFU0Mga2V5IHdhcyB1c2VkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgb3Blbk1lc3NhZ2UoCi0gICAgU2hlbGwgcGFyZW50LAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBTdGF0dXMgc3RhdHVzKQotICB7Ci0KLSAgICBzd2l0Y2ggKHN0YXR1cy5nZXRTZXZlcml0eSgpKQotICAgIHsKLSAgICAgIGNhc2UgU3RhdHVzLklORk8gOgotICAgICAgICByZXR1cm4gb3BlbkluZm8oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgc3RhdHVzLAotICAgICAgICAgIFN0YXR1cy5PSyB8IFN0YXR1cy5JTkZPIHwgU3RhdHVzLldBUk5JTkcgfCBTdGF0dXMuRVJST1IpOwotICAgICAgY2FzZSBTdGF0dXMuV0FSTklORyA6Ci0gICAgICAgIHJldHVybiBvcGVuV2FybmluZygKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgU3RhdHVzLk9LIHwgU3RhdHVzLklORk8gfCBTdGF0dXMuV0FSTklORyB8IFN0YXR1cy5FUlJPUik7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgcmV0dXJuIG9wZW5FcnJvcigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgU3RhdHVzLk9LIHwgU3RhdHVzLklORk8gfCBTdGF0dXMuV0FSTklORyB8IFN0YXR1cy5FUlJPUik7Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBvcGVuTWVzc2FnZSgKLSAgICBTaGVsbCBwYXJlbnQsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIFN0YXR1cyBzdGF0dXMsCi0gICAgQ2hvaWNlW10gb3B0aW9ucykKLSAgewotCi0gICAgcmV0dXJuIG9wZW5PcHRpb25zKAotICAgICAgcGFyZW50LAotICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICBtZXNzYWdlLAotICAgICAgc3RhdHVzLAotICAgICAgU3RhdHVzLk9LIHwgU3RhdHVzLklORk8gfCBTdGF0dXMuV0FSTklORyB8IFN0YXR1cy5FUlJPUiwKLSAgICAgIG9wdGlvbnMpOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZQotICAgKiBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3Ugd2lzaAotICAgKiB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0gICAqIGNoaWxkcmVuLiBUaGUgZXJyb3IgZGlhbG9nIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0gICAqIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqIEByZXR1cm4gdGhlIGNvZGUgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwotICAgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLSAgICogICAgICAgICBidXR0b24gd2FzIHByZXNzZWQsIG9yIDxjb2RlPkRpYWxvZy5DQU5DRUw8L2NvZGU+IGlmIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cncyBjbG9zZSB3aW5kb3cgZGVjb3JhdGlvbiBvciB0aGUgRVNDIGtleSB3YXMgdXNlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5FcnJvcigKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBFcnJvckRpYWxvZyBkaWFsb2cgPQotICAgICAgbmV3IEVycm9yRGlhbG9nKHBhcmVudFNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBvcGVuSW5mbygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBJbmZvRGlhbG9nIGRpYWxvZyA9Ci0gICAgICBuZXcgSW5mb0RpYWxvZyhwYXJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3Blbldhcm5pbmcoCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIFN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgV2FybmluZ0RpYWxvZyBkaWFsb2cgPQotICAgICAgbmV3IFdhcm5pbmdEaWFsb2cocGFyZW50U2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgICByZXR1cm4gZGlhbG9nLm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5PcHRpb25zKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyB0aXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaywKLSAgICBDaG9pY2VbXSBvcHRpb25zKQotICB7Ci0gICAgT3B0aW9uc0RpYWxvZyBkaWFsb2cgPQotICAgICAgbmV3IE9wdGlvbnNEaWFsb2coCi0gICAgICAgIHBhcmVudFNoZWxsLAotICAgICAgICB0aXRsZSwKLSAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgc3RhdHVzLAotICAgICAgICBkaXNwbGF5TWFzaywKLSAgICAgICAgb3B0aW9ucyk7Ci0gICAgZGlhbG9nLm9wZW4oKTsKLSAgICByZXR1cm4gZGlhbG9nLmdldFJldHVybkNvZGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZXMgdGhlIGxpc3QgdXNpbmcgdGhpcyBlcnJvciBkaWFsb2cncyBzdGF0dXMgb2JqZWN0LiBUaGlzIHdhbGtzIHRoZQotICAgKiBjaGlsZCBzdGF0aSBvZiB0aGUgc3RhdHVzIG9iamVjdCBhbmQgZGlzcGxheXMgdGhlbSBpbiBhIGxpc3QuIFRoZSBmb3JtYXQKLSAgICogZm9yIGVhY2ggZW50cnkgaXMgc3RhdHVzX3BhdGggOiBzdGF0dXNfbWVzc2FnZSBJZiB0aGUgc3RhdHVzJ3MgcGF0aCB3YXMKLSAgICogbnVsbCB0aGVuIGl0IChhbmQgdGhlIGNvbG9uKSBhcmUgb21pdHRlZC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpc3QoTGlzdCBsaXN0KQotICB7Ci0gICAgSXRlcmF0b3IgZW51bWVyYXRpb24gPSBzdGF0dXNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdGF0dXMgY2hpbGRTdGF0dXMgPSAoU3RhdHVzKSBlbnVtZXJhdGlvbi5uZXh0KCk7Ci0gICAgICBwb3B1bGF0ZUxpc3QobGlzdCwgY2hpbGRTdGF0dXMsIDApOwotICAgIH0KLSAgfQotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdCwgU3RhdHVzIHN0YXR1cywgaW50IG5lc3RpbmcpCi0gIHsKLSAgICBpZiAoIXN0YXR1cy5tYXRjaGVzKGRpc3BsYXlNYXNrKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3Rpbmc7IGkrKykKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQoIiAgIik7Ci0gICAgfQotICAgIHNiLmFwcGVuZChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICBsaXN0LmFkZChzYi50b1N0cmluZygpKTsKLSAgICBTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcG9wdWxhdGVMaXN0KGxpc3QsIGNoaWxkcmVuW2ldLCBuZXN0aW5nICsgMSk7Ci0gICAgfQotICB9Ci0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZURldGFpbHMoVGV4dCB0ZXh0LCBTdGF0dXMgc3RhdHVzLCBpbnQgbmVzdGluZykKLSAgewotICAgIGlmICghc3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgIAotICAgIFN0cmluZyAgICB0YWJDaGFycyAgICA9IFN0cmluZ1V0aWxzLnJlcGVhdCggJyAnLCBuZXN0aW5nICogMiApOwotICAgIFN0cmluZyAgICBtZXNzYWdlTGluZSA9IHRhYkNoYXJzICsgc3RhdHVzLmdldE1lc3NhZ2UoKSArIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICBUaHJvd2FibGUgZXhjZXB0ICAgICAgPSBzdGF0dXMuZ2V0VGhyb3dhYmxlKCk7Ci0gICAgCi0gICAgdGV4dC5hcHBlbmQoIG1lc3NhZ2VMaW5lICk7Ci0gICAgCi0gICAgaWYoIGV4Y2VwdCAhPSBudWxsICkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSB0cmFjZSA9IFN0cmluZ1V0aWxzLmdldFN0YWNrVHJhY2UoIGV4Y2VwdCApOwotICAgICAgCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2UubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgdGV4dC5hcHBlbmQoIHRhYkNoYXJzICsgIiAgICAiICsgdHJhY2VbaW5kZXhdICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpICk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIFN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBwb3B1bGF0ZURldGFpbHModGV4dCwgY2hpbGRyZW5baV0sIG5lc3RpbmcgKyAxKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gc3RhdHVzIG9iamVjdCBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIGEgc3RhdHVzIG9iamVjdAotICAgKiBAcGFyYW0gbWFzawotICAgKiAgICAgICAgICAgIGEgbWFzayBhcyBwZXIgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHN0YXR1cyBzaG91bGQgYmUgZGlzcGxheWVkLCBhbmQKLSAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkRGlzcGxheShTdGF0dXMgc3RhdHVzLCBpbnQgbWFzaykKLSAgewotICAgIFN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09IDApCi0gICAgewotICAgICAgcmV0dXJuIHN0YXR1cy5tYXRjaGVzKG1hc2spOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChjaGlsZHJlbltpXS5tYXRjaGVzKG1hc2spKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIKLSAgICogcHJlc3NpbmcgdGhlIGRldGFpbHMgYnV0dG9uLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkKLSAgewotICAgIFBvaW50IHdpbmRvd1NpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLSAgICBpbnQgICBuZXdIZWlnaHQgID0gLTE7Ci0gICAgCi0gICAgaWYgKGRldGFpbHNDcmVhdGVkKQotICAgIHsKLSAgICAgIGRldGFpbHMuZGlzcG9zZSgpOwotICAgICAgZGV0YWlsc0NyZWF0ZWQgPSBmYWxzZTsKLSAgICAgIGRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0gICAgICAKLSAgICAgIC8vIFdpdGhvdXQgdGhlIGZvbGxvd2luZyBjb21wdXRlU2l6ZSBjYWxsIHRoZSBzZXRTaXplIGNhbGwgYmVsb3cgdGhyb3dzIGFuIGFycmF5IG91dCBvZiBib3VuZHMgZXhjZXB0aW9uLgotICAgICAgLy8gVmVyeSB3ZWlyZC4KLSAgICAgIGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgIAotICAgICAgbmV3SGVpZ2h0ID0gc2F2ZWRTaXplLnk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiggc2F2ZWRTaXplID09IG51bGwgKSBzYXZlZFNpemUgPSB3aW5kb3dTaXplOwotICAgICAgICAKLSAgICAgIGRldGFpbHMgPSBjcmVhdGVEcm9wRG93bkRldGFpbHMoKENvbXBvc2l0ZSkgZ2V0Q29udGVudHMoKSk7Ci0gICAgICBkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotICAgICAgbmV3SGVpZ2h0ID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7Ci0gICAgfQotCi0KLSAgICBuZXdIZWlnaHQgPSBuZXdIZWlnaHQgPiA0MDAgPyA0MDAgOiBuZXdIZWlnaHQ7Ci0gICAgCi0gICAgZ2V0U2hlbGwoKS5zZXRTaXplKCBuZXcgUG9pbnQod2luZG93U2l6ZS54LCBuZXdIZWlnaHQpICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL09wdGlvbnNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL09wdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2NzhhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9PcHRpb25zRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbnNEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0gIHByaXZhdGUgQ2hvaWNlW10gY2hvaWNlczsKLSAgcHJpdmF0ZSBpbnQgcmV0dXJuQ29kZV87Ci0KLSAgcHVibGljIE9wdGlvbnNEaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIFN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrLAotICAgIENob2ljZVtdIGNob2ljZXMpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHRoaXMuY2hvaWNlcyA9IGNob2ljZXM7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBhIGJ1dHRvbiBmb3IgZWFjaCBvcHRpb25zCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIGNob2ljZXNbaV0uZ2V0U2hvcnRjdXQoKSwgY2hvaWNlc1tpXS5nZXRMYWJlbCgpLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cy5oYXNDaGlsZHJlbigpKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkKLSAgewotICAgIGlmIChpZCA9PSBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkKLSAgICAgIC8vIHdhcyB0aGUgRGV0YWlscyBidXR0b24gcHJlc3NlZD8KLSAgICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRSZXR1cm5Db2RlKGlkKTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0UmV0dXJuQ29kZShpbnQgaWQpCi0gIHsKLSAgICByZXR1cm5Db2RlXyA9IGlkOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRSZXR1cm5Db2RlKCkKLSAgewotICAgIHJldHVybiByZXR1cm5Db2RlXzsKLSAgfQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICBjYXNlIFN0YXR1cy5JTkZPIDoKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgICAgIGNhc2UgU3RhdHVzLldBUk5JTkcgOgotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9TdGF0dXNEaWFsb2dDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1Njc4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9TdGF0dXNEaWFsb2dDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmRpYWxvZzsKLQotLyoqCi0qIENvbnN0YW50cyBmb3Igc3RhdHVzIGRpYWxvZ3MKLSovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1c0RpYWxvZ0NvbnN0YW50cyB7Ci0KLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiWWVzIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVTX0lEID0gMjsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiWWVzIHRvIGFsbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFU19UT19BTExfSUQgPSA0OwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJDYW5jZWwiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5DRUxfSUQgPSAxOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJPSyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0lEID0gMDsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiRGV0YWlscyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVEFJTFNfSUQgPSAxMzsKLQotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJZZXMiIGJ1dHRvbgotICAqLwotIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFU19MQUJFTCA9IEVudmlyb25tZW50UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfWUVTX0xBQkVMIik7Ci0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIlllcyB0byBhbGwiIGJ1dHRvbgotICAqLwotIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFU19UT19BTExfTEFCRUwgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lc3NhZ2UoIiVTVEFUVVNfRElBTE9HX1lFU19UT19BTExfTEFCRUwiKTsKLSAgLyoKLSAgKiBCdXR0b24gbGFiZWwgZm9yIHRoZSAiQ2FuY2VsIiBidXR0b24KLSAgKi8KLSAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5DRUxfTEFCRUwgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lc3NhZ2UoIiVTVEFUVVNfRElBTE9HX0NBTkNFTF9MQUJFTCIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvV2FybmluZ0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvV2FybmluZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWUzOGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL1dhcm5pbmdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFdhcm5pbmdEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBXYXJuaW5nRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBPSywgQ2FuY2VsIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLAotICAgICAgZmFsc2UpOwotICAgIGlmIChzdGF0dXMuaGFzQ2hpbGRyZW4oKSkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3BsdWdpbi9FbnZVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9wbHVnaW4vRW52VUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmMmJkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3BsdWdpbi9FbnZVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEVudlVJUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFbnZVSVBsdWdpbiBpbnN0YW5jZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRW52VUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnZVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQ0ZmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dC5QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnByZWZlcmVuY2VzLkFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBwb3B1cCBhY3Rpb25zIHByZWZlcmVuY2UgcGFnZSBmb3IgYSAKLSAqIHBhcnRpY3VsYXIgY2F0ZWdvcnkuICBGb3IgZXhhbXBsZToKLSAqCi0gKiA8cHJlPgotICogICZsdDtleHRlbnNpb24KLSAqICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIiZndDsKLSAqICAgICAmbHQ7cGFnZQotICogICAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX0RJQUxPR1MiCi0gKiAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy51aS5wcmVmZXJlbmNlcy5uYW1lIgotICogICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYucHJlZmVyZW5jZXMuQWN0aW9uRGlhbG9nc1ByZWZlcmVuY2VQYWdlIgotICogICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3NzLnBvcHVwLmNhdGVnb3J5IiZndDsKLSAqICAgICAmbHQ7L3BhZ2UmZ3Q7Ci0gKiAqIDwvcHJlPgotICogVGhpcyBlbnRyeSBzcGVjaWZpZXMgdGhhdCBhbGwgcG9wdXAgYWN0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0gKiBvcmcuZWNsaXBzZS5qc3Qud3NzLnBvcHVwLmNhdGVnb3J5IHdpbGwgYmUgZGlzcGxheWVkIG9uIHRoaXMKLSAqIHByZWZlcmVuY2UgcGFnZS4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBMaXN0ZW5lciwgSUV4ZWN1dGFibGVFeHRlbnNpb24KLXsKLSAgLypDT05URVhUX0lEIFBQQUQwMDAxIGZvciB0aGUgQWN0aW9uIERpYWxvZ3MgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUEFEX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLlBQQUQwMDAxIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gc2hvd0FsbDsKLSAgLypDT05URVhUX0lEIFBQQUQwMDAyIGZvciB0aGUgIHNob3cgYWxsIGNoZWNrIGJveCBvbiB0aGUgQWN0aW9uIERpYWxvZ3MgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUEFEX0JVVFRPTl9TSE9XX0FMTCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuUFBBRDAwMDIiOwotICAvLwotICBwcml2YXRlIEJ1dHRvbiBoaWRlQWxsOwotICAvKkNPTlRFWFRfSUQgUFBBRDAwMDMgZm9yIHRoZSAgaGlkZSBhbGwgY2hlY2sgYm94IG9uIHRoZSBBY3Rpb24gRGlhbG9ncyBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BQQURfQlVUVE9OX0hJREVfQUxMID0gIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5QUEFEMDAwMyI7Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgY2hlY2tCb3hlc187Ci0gIHByaXZhdGUgU3RyaW5nICAgIGNhdGVnb3J5SWRfOwotICAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgIGRhdGEgKQotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBjYXRlZ29yeUlkXyAgID0gY29uZmlnLmdldEF0dHJpYnV0ZSggImlkIiApOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIG9uIGRlbWFuZC4KLSAgICogICBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IGZvciB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgc3VwZXJwYXJlbnQpCi0gIHsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVudmlyb25tZW50dWkiLCB0aGlzICk7Ci0gICAgCi0gICAgY2hlY2tCb3hlc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgYWRkT3B0aW9uYWxEaWFsb2dzQ2hlY2tCb3hlcyAoc3VwZXJwYXJlbnQpOwotCW5ldyBMYWJlbChzdXBlcnBhcmVudCwgU1dULkhPUklaT05UQUwpOwotCQotICAgIENvbXBvc2l0ZSAgIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoIHN1cGVycGFyZW50LCBTV1QuTk9ORSApOwkKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIHBhcmVudC5zZXRMYXlvdXQoIGxheW91dCApOwotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BQQURfUEFHRSIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSU5GT1BPUF9QUEFEX1BBR0UgKTsKLQkKLSAgICBzaG93QWxsID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBzaG93QWxsLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiQlVUVE9OX1NIT1dfQUxMX0RJQUxPR1MiKSk7Ci0gICAgc2hvd0FsbC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICBzaG93QWxsLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFBBRF9CVVRUT05fU0hPV19BTEwiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzaG93QWxsLCBJTkZPUE9QX1BQQURfQlVUVE9OX1NIT1dfQUxMICk7Ci0gICAKLSAgICBoaWRlQWxsID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBoaWRlQWxsLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiQlVUVE9OX0hJREVfQUxMX0RJQUxPR1MiKSk7Ci0gICAgaGlkZUFsbC5hZGRMaXN0ZW5lciAoIFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIGhpZGVBbGwuc2V0VG9vbFRpcFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiVE9PTFRJUF9QUEFEX0JVVFRPTl9ISURFX0FMTCIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGhpZGVBbGwsIElORk9QT1BfUFBBRF9CVVRUT05fSElERV9BTEwgKTsKLQotICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJwYXJlbnQpOwotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgCi0gewotICAgIGlmIChzaG93QWxsID09IGV2ZW50LndpZGdldCkKLQkJaGFuZGxlU2hvd0FsbEV2ZW50KCk7Ci0gICAgCi0gICAgZWxzZSBpZiAoIGhpZGVBbGwgPT0gZXZlbnQud2lkZ2V0KQotICAgIAloYW5kbGVIaWRlQWxsRXZlbnQoKTsKLSB9Ci0KLSBwcml2YXRlIHZvaWQgaGFuZGxlU2hvd0FsbEV2ZW50ICgpCi0gewotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5lbGVtZW50cygpOwotIAlmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICAJewotICAgIAkJQnV0dG9uIGRpYWxvZyA9IChCdXR0b24pIGUubmV4dEVsZW1lbnQoKTsKLSAgICAJCWRpYWxvZy5zZXRTZWxlY3Rpb24oIGZhbHNlICk7Ci0gICAgCX0gICAgICAgICAgICAgICAgICAgICAgCi0gfQotCi0gcHJpdmF0ZSB2b2lkIGhhbmRsZUhpZGVBbGxFdmVudCAoKQotIHsKLSAJRW51bWVyYXRpb24gZSA9IGNoZWNrQm94ZXNfLmVsZW1lbnRzKCk7Ci0gCWZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIAl7Ci0gICAgCQlCdXR0b24gZGlhbG9nID0gKEJ1dHRvbikgZS5uZXh0RWxlbWVudCgpOwotICAgIAkJZGlhbG9nLnNldFNlbGVjdGlvbiggdHJ1ZSApOwotICAgIAl9Ci0gfQotIAotIHByaXZhdGUgdm9pZCBhZGRPcHRpb25hbERpYWxvZ3NDaGVja0JveGVzICggQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBjb250ZXh0ID0gUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0gICAgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSBkaWFsb2dzID0gY29udGV4dC5nZXREaWFsb2dzKCk7Ci0gICAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKSAKLSAgICB7Ci0gICAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBkaWFsb2cgICA9IGRpYWxvZ3NbaV07Ci0gICAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IGRpYWxvZy5nZXRDYXRlZ29yeSgpOwotICAgICAgCi0gICAgICBpZiggZGlhbG9nLmdldFNob3dDaGVja2JveCgpICYmICBjYXRlZ29yeSAhPSBudWxsICYmIGNhdGVnb3J5LmVxdWFscyggY2F0ZWdvcnlJZF8pICkKLSAgICAgIHsKLSAgICAJQnV0dG9uIGNoZWNrQm94ID0gY3JlYXRlQ2hlY2tCb3gocGFyZW50LCBkaWFsb2cuZ2V0TmFtZSgpKTsKLSAgICAJY2hlY2tCb3guc2V0VG9vbFRpcFRleHQoIGRpYWxvZy5nZXRUb29sdGlwKCkgKTsKLSAgICAJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjaGVja0JveCwgZGlhbG9nLmdldEluZm9wb3AoKSApOwotICAgIAljaGVja0JveGVzXy5wdXQoZGlhbG9nLmdldElkKCksIGNoZWNrQm94KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCApCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuQ0hFQ0sgKTsKLSAgICBidXR0b24uc2V0VGV4dCggdGV4dCApOwotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICAvKioKLSAgICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICBpbml0aWFsaXplRGVmYXVsdHMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotICB7Ci0gICAgc3RvcmVWYWx1ZXMoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpCi0gIHsKLSAgICBwZXJmb3JtT2soKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgIHsgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzCi0gICAqIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gY2hlY2tCb3hlc18uZWxlbWVudHMoKTsKLSAgICBmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICB7Ci0gICAgICBCdXR0b24gZGlhbG9nID0gKEJ1dHRvbikgZS5uZXh0RWxlbWVudCgpOwotICAgICAgZGlhbG9nLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlcy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkKLSAgewotICAgIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBjb250ZXh0ID0gUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IGNoZWNrQm94ZXNfLmtleXMoKTsKLSAgICBmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgaWQgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgY2hlY2tCb3hlc18uZ2V0KGlkKTsKLSAgICAgIGJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0FjdGlvbkRpYWxvZ0VuYWJsZWQoaWQpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGNvbnRleHQgPSBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLQotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5rZXlzKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgY29udGV4dC5zZXRBY3Rpb25EaWFsb2dFbmFibGVkKGlkLCAoKEJ1dHRvbiljaGVja0JveGVzXy5nZXQoaWQpKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9Db21tYW5kV2lkZ2V0QmluZGluZ0xpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9Db21tYW5kV2lkZ2V0QmluZGluZ0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUxZTViYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvQ29tbWFuZFdpZGdldEJpbmRpbmdMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZFdpZGdldEJpbmRpbmdMaXN0IGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcKLXsKLSAgcHJpdmF0ZSBWZWN0b3IgICAgICAgICAgICAgICAgIGJpbmRpbmdzXzsKLSAgcHJpdmF0ZSBWZWN0b3IgICAgICAgICAgICAgICAgIGZyYWdtZW50c187Ci0gIHByaXZhdGUgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBmYWN0b3J5XzsKLSAgCi0gIC8qKgotICAgKiBUaGlzIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNvbWJpbmVzIGEgbGlzdCBvZiBDb21tYW5kV2lkZ2V0QmluZGluZ3MuCi0gICAqIFRoZXJlIHNob3VsZCBiZSB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcyBpbiBib3RoIHRoZSBiaW5kaW5ncwotICAgKiBwYXJhbWV0ZXIgYW5kIHRoZSBmcmFnbWVudHMgcGFyYW1ldGVyLiAgRW50cmllcyBpbiBlaXRoZXIgb2YgdGhlCi0gICAqIGJpbmRpbmdzIGZvciBmcmFnbWVudHMgdmVjdG9ycyBhcmUgYWxsb3dlZCB0byBiZSBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdzICAgdGhlIGJpbmRpbmdzIHRvIGNvbWJpbmUuCi0gICAqIEBwYXJhbSBmcmFnbWVudHMgIFRoZXNlIGZyYWdtZW50cyB3aWxsIGJlIGludGVyc3BlcnNlZCB3aXRoIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYmluZGluZy4gIFRoZSBmaXJzdAotICAgKiAgICAgICAgICAgICAgICAgICBmcmFnbWVudCB3aWxsIGJlIHB1dCBiZWZvcmUgdGhlIGZyYWdtZW50IGZyb20gdGhlCi0gICAqICAgICAgICAgICAgICAgICAgIGZpcnN0IGJpbmRpbmcuICBGb2xsb3dpbmcgdGhpcyB3aWxsIGJlIHRoZSBzZWNvbmQKLSAgICogICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgZnJvbSB0aGUgZnJhZ21lbnRzIHZlY3RvciBhbmQgdGhlbiB0aGUKLSAgICogICAgICAgICAgICAgICAgICAgc2Vjb25kIGZyYWdtZW50IGZyb20gdGhlIGJpbmRpbmdzIHZlY3RvciwgZXRjLgotICAgKi8KLSAgcHVibGljIENvbW1hbmRXaWRnZXRCaW5kaW5nTGlzdCggVmVjdG9yIGJpbmRpbmdzLCBWZWN0b3IgZnJhZ21lbnRzICkKLSAgewotICAgIGJpbmRpbmdzXyAgPSBiaW5kaW5nczsgCi0gICAgZnJhZ21lbnRzXyA9IGZyYWdtZW50czsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIAotICB7Ci0gICAgaW50IGxlbmd0aCA9IGJpbmRpbmdzXy5zaXplKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgQ29tbWFuZFdpZGdldEJpbmRpbmcgYmluZGluZyA9IChDb21tYW5kV2lkZ2V0QmluZGluZyliaW5kaW5nc18uZWxlbWVudEF0KCBpbmRleCApOwotICAgICAgCi0gICAgICBpZiggYmluZGluZyAhPSBudWxsICkgYmluZGluZy5yZWdpc3RlckNhbkZpbmlzaCggY2FuRmluaXNoUmVnaXN0cnkgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgCi0gIHsKLSAgICBpbnQgbGVuZ3RoID0gYmluZGluZ3NfLnNpemUoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBDb21tYW5kV2lkZ2V0QmluZGluZyBiaW5kaW5nID0gKENvbW1hbmRXaWRnZXRCaW5kaW5nKWJpbmRpbmdzXy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgICBpZiggYmluZGluZyAhPSBudWxsICkgYmluZGluZy5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YVJlZ2lzdHJ5ICk7Ci0gICAgfQotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpIAotICB7Ci0gICAgaW50IGxlbmd0aCA9IGJpbmRpbmdzXy5zaXplKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgQ29tbWFuZFdpZGdldEJpbmRpbmcgYmluZGluZyA9IChDb21tYW5kV2lkZ2V0QmluZGluZyliaW5kaW5nc18uZWxlbWVudEF0KCBpbmRleCApOwotICAgICAgaWYoIGJpbmRpbmcgIT0gbnVsbCApIGJpbmRpbmcucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyggd2lkZ2V0UmVnaXN0cnkgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgCi0gIHsKLSAgICBpZiggZmFjdG9yeV8gPT0gbnVsbCApCi0gICAgewotICAgICAgZmFjdG9yeV8gPSBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgewotICAgICAgICAgICAgU2VxdWVuY2VGcmFnbWVudCBmcmFnbWVudExpc3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBsZW5ndGggICAgICAgPSBiaW5kaW5nc18uc2l6ZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ID0gKENvbW1hbmRGcmFnbWVudClmcmFnbWVudHNfLmVsZW1lbnRBdCggaW5kZXggKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGlmKCBmcmFnbWVudCAhPSBudWxsICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyYWdtZW50TGlzdC5hZGQoIGZyYWdtZW50ICk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIENvbW1hbmRXaWRnZXRCaW5kaW5nIGJpbmRpbmcgPSAoQ29tbWFuZFdpZGdldEJpbmRpbmcpYmluZGluZ3NfLmVsZW1lbnRBdCggaW5kZXggKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGlmKCBiaW5kaW5nICE9IG51bGwgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJhZ21lbnRMaXN0LmFkZCggYmluZGluZy5jcmVhdGUoKS5jcmVhdGUoKSApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmcmFnbWVudExpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICB9OyAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhY3RvcnlfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvUGFnZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9QYWdlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmZmMGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9QYWdlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgUGFnZUluZm8gCi17Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgIHBhZ2VOYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlXzsKLSAgcHJpdmF0ZSBXaWRnZXRDb250cmlidXRvckZhY3Rvcnkgd2lkZ2V0RmFjdG9yeV87Ci0gIAotICBwdWJsaWMgUGFnZUluZm8oIFN0cmluZyAgICAgICAgICAgICAgICAgICBwYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlLAotICAgICAgICAgICAgICAgICAgIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB3aWRnZXRGYWN0b3J5ICkKLSAgewotICAgIHBhZ2VOYW1lXyAgICAgICA9IHBhZ2VOYW1lOwotICAgIHBhZ2VUaXRsZV8gICAgICA9IHBhZ2VUaXRsZTsKLSAgICB3aWRnZXRGYWN0b3J5XyAgPSB3aWRnZXRGYWN0b3J5OwotICB9ICAgCi0gIAotICBwdWJsaWMgU3RyaW5nIGdldFBhZ2VOYW1lKCkKLSAgewotICAgIHJldHVybiBwYWdlTmFtZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRpdGxlKCkKLSAgewotICAgIHJldHVybiBwYWdlVGl0bGVfOwotICB9Ci0gIAotICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIHdpZGdldEZhY3RvcnlfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlQ2FuRmluaXNoUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVDYW5GaW5pc2hSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODc3YjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVDYW5GaW5pc2hSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotCi0KLQotcHVibGljIGNsYXNzIFNpbXBsZUNhbkZpbmlzaFJlZ2lzdHJ5IGV4dGVuZHMgVmVjdG9yIGltcGxlbWVudHMgQ2FuRmluaXNoUmVnaXN0cnkKLXsKLQotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTcyODU4Mzc4NzA3NDEzMDVMOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSNhZGRDb25kaXRpb24ob3JnLmVjbGlwc2UuZW52LmNvbW1hbmQuZnJhZ21lbnQuQ29uZGl0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29uZGl0aW9uKENvbmRpdGlvbiBjb25kaXRpb24pCi0gIHsKLSAgICBhZGQoIGNvbmRpdGlvbiApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUGFnZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODRhM2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlBhZ2VXaXphcmREYXRhRXZlbnRzOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUGFnZUZhY3RvcnkgaW1wbGVtZW50cyBXaXphcmRQYWdlRmFjdG9yeQoteyAgIAotICBwdWJsaWMgUGFnZVdpemFyZERhdGFFdmVudHMgZ2V0UGFnZSggUGFnZUluZm8gcGFnZUluZm8sIFdpemFyZFBhZ2VNYW5hZ2VyIG1hbmFnZXIgKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVXaXphcmRQYWdlKCBwYWdlSW5mbywgbWFuYWdlciApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUG9wdXBQYWdlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVBvcHVwUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlZmE1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUG9wdXBQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlBhZ2VXaXphcmREYXRhRXZlbnRzOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUG9wdXBQYWdlRmFjdG9yeSBpbXBsZW1lbnRzIFdpemFyZFBhZ2VGYWN0b3J5Ci17ICAgCi0gIHByaXZhdGUgU3RyaW5nIGlkXzsKLSAgCi0gIHB1YmxpYyBTaW1wbGVQb3B1cFBhZ2VGYWN0b3J5KCBTdHJpbmcgaWQgKQotICB7Ci0gICAgaWRfID0gaWQ7ICAKLSAgfQotICAKLSAgcHVibGljIFBhZ2VXaXphcmREYXRhRXZlbnRzIGdldFBhZ2UoIFBhZ2VJbmZvIHBhZ2VJbmZvLCBXaXphcmRQYWdlTWFuYWdlciBtYW5hZ2VyICkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlUG9wdXBXaXphcmRQYWdlKCBwYWdlSW5mbywgbWFuYWdlciwgaWRfICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVQb3B1cFdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVQb3B1cFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxMmFiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUG9wdXBXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dC5QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUG9wdXBXaXphcmRQYWdlIGV4dGVuZHMgU2ltcGxlV2l6YXJkUGFnZQoteyAgCi0gIHByaXZhdGUgU3RyaW5nIGlkXzsKLSAgCi0gIHB1YmxpYyBTaW1wbGVQb3B1cFdpemFyZFBhZ2UoIFBhZ2VJbmZvIHBhZ2VJbmZvLCBXaXphcmRQYWdlTWFuYWdlciBwYWdlTWFuYWdlciwgU3RyaW5nIGlkICkKLSAgewotICAJc3VwZXIoIHBhZ2VJbmZvLCBwYWdlTWFuYWdlciApOwotICAJCi0gIAlpZF8gPSBpZDsKLSAgfSAJICAKLSAgCQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKCBDb21wb3NpdGUgcGFyZW50ICkgCi0gIHsKLSAgCSAgICAgIENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gIAkgICAgICBNZXNzYWdlVXRpbHMgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMgID0gbmV3IE1lc3NhZ2VVdGlscygib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVudmlyb25tZW50dWkiLCB0aGlzICk7Ci0gIAlmaW5hbCBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgY29udGV4dCAgID0gUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0gIAkKLSAgICBHcmlkTGF5b3V0IGdyaWRsYXlvdXQgICA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdyaWRsYXlvdXQubWFyZ2luV2lkdGggID0gMDsKLSAgICAKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBncmlkbGF5b3V0ICk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIICk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoIGdyaWRkYXRhICk7Ci0gICAgICAJCi0gIAlzdXBlci5jcmVhdGVDb250cm9sKCBjb21wb3NpdGUgKTsKLSAgCQotICAJLy8gSWYgdGhlIGN1cnJlbnQgcGFnZSBpcyBudWxsIHRoZW4gdGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBwYWdlLgotICAJaWYoIHBhZ2VNYW5hZ2VyXy5nZXRDdXJyZW50UGFnZSgpID09IG51bGwgJiYgY29udGV4dC5zaG93Q2hlY2tib3goaWRfKSApCi0gIAl7Ci0gICAgICBmaW5hbCAgQnV0dG9uIGJ1dHRvbiAgPSBuZXcgQnV0dG9uKCBjb21wb3NpdGUsIFNXVC5DSEVDSyApOwotICAgICAgU3RyaW5nIGxhYmVsICAgPSBtc2dVdGlscy5nZXRNZXNzYWdlKCAiQ0hFQ0tCT1hfRE9fTk9UX1NIT1dfRElBTE9HX0FHQUlOIiApOwotICAgICAgCi0gICAgICAvKkNPTlRFWFRfSUQgVFdQMDAwMSBmb3IgdGhlIHNob3cvaGlkZSBjaGVjayBib3gqLwotICAgICAgU3RyaW5nIGluZm9wb3AgPQkib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLlRXUDAwMDEiOwotICAgICAgU3RyaW5nIHRvb2x0aXAgPSBtc2dVdGlscy5nZXRNZXNzYWdlKCAiVE9PTFRJUF9ET19OT1RfU0hPV19ESUFMT0dfQUdBSU4iICk7Ci0gICAgICAKLSAgICAgIGJ1dHRvbi5zZXRUZXh0KCBsYWJlbCApOwotICAgICAgYnV0dG9uLnNldFRvb2xUaXBUZXh0KCB0b29sdGlwICk7Ci0gICAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QWN0aW9uRGlhbG9nRW5hYmxlZCggaWRfLCBidXR0b24uZ2V0U2VsZWN0aW9uKCkgKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICBidXR0b24uc2V0U2VsZWN0aW9uKCBmYWxzZSApOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBidXR0b24sIGluZm9wb3AgKTsgIAkKLSAgCX0KLSAgCQotICAJc2V0Q29udHJvbCggY29tcG9zaXRlICk7Ci0gIH0gIAotfSAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaWRnZXRSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q5MzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaWRnZXRSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZVdpZGdldFJlZ2lzdHJ5IGltcGxlbWVudHMgV2lkZ2V0UmVnaXN0cnkKLXsKLSAgcHJpdmF0ZSBIYXNodGFibGUgdGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgcHVibGljIHZvaWQgYWRkKCBTdHJpbmcgZnJhZ21lbnRJZCwKLSAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhZ2VUaXRsZSwKLSAgICAgICAgICAgICAgICAgICBXaWRnZXRDb250cmlidXRvckZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSApCi0gIHsKLSAgCVBhZ2VJbmZvIGVudHJ5ID0gbmV3IFBhZ2VJbmZvKCBwYWdlTmFtZSwgcGFnZVRpdGxlLCB3aWRnZXRGYWN0b3J5ICk7Ci0gIAl0YWJsZV8ucHV0KCBmcmFnbWVudElkLCBlbnRyeSApOwotICB9ICAgICAgICAgICAgICAgICAgIAotICAKLSAgcHVibGljIFBhZ2VJbmZvIGdldFBhZ2VJbmZvKCBTdHJpbmcgZnJhZ21lbnRJZCApCi0gIHsKLSAgICByZXR1cm4gKFBhZ2VJbmZvKXRhYmxlXy5nZXQoIGZyYWdtZW50SWQgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDYyZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuUGFnZVdpemFyZERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIFBhZ2VXaXphcmREYXRhRXZlbnRzCi17Ci0gIHByaXZhdGUgICBXaWRnZXRDb250cmlidXRvciB3aWRnZXRfOwotICBwcml2YXRlICAgV2lkZ2V0RGF0YUV2ZW50cyAgZGF0YUV2ZW50c187Ci0gIHByaXZhdGUgICBMaXN0ZW5lciAgICAgICAgICBzdGF0dXNMaXN0ZW5lcl87Ci0gIHByb3RlY3RlZCBXaXphcmRQYWdlTWFuYWdlciBwYWdlTWFuYWdlcl87Ci0gIAkKLSAgcHVibGljIFNpbXBsZVdpemFyZFBhZ2UoIFBhZ2VJbmZvIHBhZ2VJbmZvLCBXaXphcmRQYWdlTWFuYWdlciBwYWdlTWFuYWdlciApCi0gIHsKLSAgCXN1cGVyKCAiIiApOwotICAJCi0gIAlzZXRUaXRsZSggcGFnZUluZm8uZ2V0UGFnZU5hbWUoKSApOwotICAJc2V0RGVzY3JpcHRpb24oIHBhZ2VJbmZvLmdldFBhZ2VUaXRsZSgpKTsKLSAgCSAgCi0gIAl3aWRnZXRfICAgICAgICAgPSBwYWdlSW5mby5nZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlKCk7Ci0gIAlzdGF0dXNMaXN0ZW5lcl8gPSBuZXcgU3RhdHVzTGlzdGVuZXIoKTsKLSAgCXBhZ2VNYW5hZ2VyXyAgICA9IHBhZ2VNYW5hZ2VyOwotICB9IAkgIAotICAJCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woIENvbXBvc2l0ZSBwYXJlbnQgKSAKLSAgewotICAJQ29tcG9zaXRlIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gIAljb250cm9sLnNldExheW91dCggbmV3IEdyaWRMYXlvdXQoKSApOwotICAJY29udHJvbC5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfQk9USCApKTsKLSAgCQotCWRhdGFFdmVudHNfID0gd2lkZ2V0Xy5hZGRDb250cm9scyggY29udHJvbCwgc3RhdHVzTGlzdGVuZXJfICk7Ci0JICAKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29udHJvbCk7Ci0gICAgc2V0Q29udHJvbCggY29udHJvbCApOwotICB9Ci0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBnZXREYXRhRXZlbnRzKCkKLSAgewotICAgIHJldHVybiBkYXRhRXZlbnRzXzsKLSAgfQotICAJICAKLSAgcHVibGljIHZvaWQgdmFsaWRhdGVQYWdlVG9TdGF0dXMoKQotICB7Ci0gICAgU3RhdHVzIHN0YXR1cyAgPSB3aWRnZXRfLmdldFN0YXR1cygpOwotICAgIAotICAgIGlmKCBzdGF0dXMgIT0gbnVsbCApCi0gICAgewotICAgICAgaWYoIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICBpZiggbWVzc2FnZS5sZW5ndGgoKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIHNldEVycm9yTWVzc2FnZSggbnVsbCApOwotICAgICAgICAgIHNldE1lc3NhZ2UoIGdldERlc2NyaXB0aW9uKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIG1lc3NhZ2UgKTsKLSAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICBzZXRQYWdlQ29tcGxldGUoIGZhbHNlICk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuV0FSTklORyApCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZSggbnVsbCApOwotICAgICAgICBzZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElTdGF0dXMuV0FSTklORyApOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoIHRydWUgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5JTkZPICkKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCBudWxsICk7Ci0gICAgICAgIHNldE1lc3NhZ2UoIHN0YXR1cy5nZXRNZXNzYWdlKCksIElTdGF0dXMuSU5GTyApOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoIHRydWUgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCBudWxsICk7Ci0gICAgICAgIHNldE1lc3NhZ2UoIGdldERlc2NyaXB0aW9uKCkgKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKCB0cnVlICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoIG51bGwgKTsKLSAgICAgIHNldE1lc3NhZ2UoIGdldERlc2NyaXB0aW9uKCkgKTsKLSAgICAgIHNldFBhZ2VDb21wbGV0ZSggdHJ1ZSApOwotICAgIH0KLSAgICAKLSAgICBnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0gIH0KLSAgICAKLSAgcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSAKLSAgewotCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpICYmIHBhZ2VNYW5hZ2VyXy5oYXNOZXh0UGFnZSgpOwotICB9Ci0KLSAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgCi0gIHsKLQlyZXR1cm4gcGFnZU1hbmFnZXJfLmdldE5leHRQYWdlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2YWx1ZSkgCi0gIHsKLSAgCXBhZ2VNYW5hZ2VyXy5oYW5kbGVQYWdlVmlzaWJsZSggdGhpcywgdmFsdWUgKTsKLSAgCQotICAgIHN1cGVyLnNldFZpc2libGUodmFsdWUpOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIFN0YXR1c0xpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgewotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBFdmVudCBldnQgKSAKLQl7Ci0gICAgICB2YWxpZGF0ZVBhZ2VUb1N0YXR1cygpOwotCX0KLSAgfQotfSAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaXphcmRQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDkwYWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaXphcmRQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlBhZ2VXaXphcmREYXRhRXZlbnRzOwotCi0vKioKLSAqIAotICoKLSAqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdpemFyZFBhZ2VGYWN0b3J5IAotewotICBwdWJsaWMgUGFnZVdpemFyZERhdGFFdmVudHMgZ2V0UGFnZSggUGFnZUluZm8gcGFnZUluZm8sIFdpemFyZFBhZ2VNYW5hZ2VyIG1hbmFnZXIgKTsgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2l6YXJkUGFnZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaXphcmRQYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDVlZDY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaXphcmRQYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5QYWdlV2l6YXJkRGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YUZsb3dNYW5hZ2VyOwotCi0KLQotcHVibGljIGNsYXNzIFdpemFyZFBhZ2VNYW5hZ2VyIGV4dGVuZHMgU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIKLXsKLSAgcHJpdmF0ZSAgIFdpemFyZFBhZ2VGYWN0b3J5ICAgICAgcGFnZUZhY3RvcnlfOwotICBwcml2YXRlICAgSGFzaHRhYmxlICAgICAgICAgICAgICBwYWdlVGFibGVfOwotICBwcml2YXRlICAgSVdpemFyZCAgICAgICAgICAgICAgICB3aXphcmRfOwotICBwcm90ZWN0ZWQgU2ltcGxlV2lkZ2V0UmVnaXN0cnkgICByZWdpc3RyeV87Ci0gIAotICAvLyBUaGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgYW5kIHNldCBieSBvdXIgbWV0aG9kcyB3aGljaCBpcwotICAvLyB3aHkgdGhleSBhcmUgbm90IGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgcHJpdmF0ZSBQYWdlV2l6YXJkRGF0YUV2ZW50cyBjdXJyZW50UGFnZV87Ci0gIHByaXZhdGUgUGFnZVdpemFyZERhdGFFdmVudHMgbmV4dFBhZ2VfOwotICBwcml2YXRlIFBhZ2VXaXphcmREYXRhRXZlbnRzIGZpcnN0UGFnZV87Ci0gIHByaXZhdGUgQ29tbWFuZEZyYWdtZW50ICAgICAgbGFzdFVuZG9GcmFnbWVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgZmlyc3RGcmFnbWVudF87Ci0gICAgCi0gIHB1YmxpYyBXaXphcmRQYWdlTWFuYWdlciggU2ltcGxlV2lkZ2V0UmVnaXN0cnkgIHJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpemFyZFBhZ2VGYWN0b3J5ICAgICBwYWdlRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV2l6YXJkICAgICAgICAgICAgICAgd2l6YXJkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFGbG93TWFuYWdlciAgICAgICBkYXRhTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudCAgICAgICAgICAgZW52aXJvbm1lbnQgKQotICB7IAotICAgIHN1cGVyKCBlbnZpcm9ubWVudCwgZGF0YU1hbmFnZXIgKTsgIAotICAgIAotICAJcGFnZUZhY3RvcnlfID0gcGFnZUZhY3Rvcnk7Ci0gIAlwYWdlVGFibGVfICAgPSBuZXcgSGFzaHRhYmxlKCk7ICAKLSAgCXJlZ2lzdHJ5XyAgICA9IHJlZ2lzdHJ5OwotICAJd2l6YXJkXyAgICAgID0gd2l6YXJkOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHJ1bkZvcndhcmRUb05leHRTdG9wKCkKLSAgeyAgICAKLSAgCWZpcnN0RnJhZ21lbnRfICA9IHRydWU7Ci0gIAluZXh0UGFnZV8gICAgICAgPSBudWxsOwotIAotICAJSVdpemFyZENvbnRhaW5lciBjb250YWluZXIgPSB3aXphcmRfLmdldENvbnRhaW5lcigpOwotICAJCi0gIAlpZiggY29udGFpbmVyID09IG51bGwgfHwgY29udGFpbmVyLmdldEN1cnJlbnRQYWdlKCkgPT0gbnVsbCApCi0gIAl7Ci0gIAkgIGNvbnRhaW5lciA9IG51bGw7Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBzdXBlci5ydW5Gb3J3YXJkVG9OZXh0U3RvcCggY29udGFpbmVyICk7Ci0gIH0KLSAgICAKLSAgcHVibGljIElXaXphcmRQYWdlIGdldEN1cnJlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiBjdXJyZW50UGFnZV87Ci0gIH0KLSAgICAKLSAgcHVibGljIGJvb2xlYW4gaGFzTmV4dFBhZ2UoKQotICB7Ci0gIAluZXh0UGFnZV8gPSBudWxsOwotICAJZW5naW5lXy5wZWVrRm9yd2FyZFRvTmV4dFN0b3AoKTsKLSAgCQotICAgIHJldHVybiBuZXh0UGFnZV8gIT0gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkKLSAgeyAgCSAgCQotICAJLy8gTmVlZCB0byBleHRlcm5hbGl6ZSB0aGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcGFnZSBzbyB0aGF0Ci0gIAkvLyB3aGVuIHdlIG1vdmUgZm9yd2FyZCBiZWxvdyB0aGUgZGF0YSBpcyBhdmFpbGFibGUuCi0gIAlpZiggY3VycmVudFBhZ2VfICE9IG51bGwgKSBjdXJyZW50UGFnZV8uZ2V0RGF0YUV2ZW50cygpLmV4dGVybmFsaXplKCk7Ci0gIAkKLSAgCVN0YXR1cyBzdGF0dXMgPSBydW5Gb3J3YXJkVG9OZXh0U3RvcCgpOwotICAJCi0gIAlpZiggc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgCXsKLSAgCSAgLy8gQW4gZXJyb3IgaGFzIG9jY3VyZWQgc28gd2UgbmVlZCB1bmRvIHRvIHRoZSBwcmV2aW91cyBzdG9wIHBvaW50LgotICAJICB1bmRvVG9MYXN0UGFnZSgpOwotICAJfQotICAJCi0gIAlpZiggbmV4dFBhZ2VfICE9IG51bGwgKSBuZXh0UGFnZV8uc2V0V2l6YXJkKCB3aXphcmRfICk7Ci0gIAkgIAkKLSAgCXJldHVybiBuZXh0UGFnZV87Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgaGFuZGxlUGFnZVZpc2libGUoIFBhZ2VXaXphcmREYXRhRXZlbnRzIHBhZ2UsIGJvb2xlYW4gaXNQYWdlVmlzaWJsZSApCi0gIHsKLSAgICBpZiggIWlzUGFnZVZpc2libGUgJiYgcGFnZSA9PSBmaXJzdFBhZ2VfICYmIHBhZ2UgPT0gY3VycmVudFBhZ2VfICkKLSAgICB7Ci0gICAgICAvLyBXZSBhcmUgbW92aW5nIGJhY2sgb25lIHBhZ2UgZnJvbSB0aGUgZmlyc3QgcGFnZS4gIFRoaXMgY2FuJ3QgaGFwcGVuIHdpdGggcG9wdXAgd2l6YXJkcwotICAgICAgLy8gc2luY2UgdGhlIHByZXZpb3VzIGJ1dHRvbiB3b3VsZCBiZSBncmV5ZWQgb3V0LiAgQnV0IHdoZW4gdGhlIG5ldyB3aXphcmQgbGF1bmNoZXMgdGhpcyB3aXphcmQKLSAgICAgIC8vIHRoZSBwcmV2aW91cyBidXR0b24gaXMgbm90IGdyZXllZCBvdXQgYW5kIGJyaW5ncyB0aGUgdXNlciBiYWNrIHRvIHRoZSBsaXN0IHdpemFyZHMgdG8gc2VsZWN0LgotICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBtdXN0IHVud2luZCB0aGUgY29tbWFuZCBlbmdpbmUgYW5kIGdldCByZWFkeSBmb3IgdGhlIHVzZXIgdG8gaW52b2tlIHRoaXMgd2l6YXJkIAotICAgICAgLy8gYWdhaW4uCi0gIAkgIHVuZG9Ub0xhc3RQYWdlKCk7CSAgCi0gICAgICBjdXJyZW50UGFnZV8gPSBudWxsOwotICAgICAgZmlyc3RQYWdlXyAgID0gbnVsbDsKLSAgICB9Ci0gIAlpZiggY3VycmVudFBhZ2VfICE9IG51bGwgJiYgcGFnZSA9PSBjdXJyZW50UGFnZV8uZ2V0UHJldmlvdXNQYWdlKCkgJiYgaXNQYWdlVmlzaWJsZSApCi0gIAl7Ci0gIAkgIC8vIFdlIGFyZSBtb3ZpbmcgYmFjayBvbmUgcGFnZS4KLSAgCSAgLy8gTm90ZTogd2UgZG9uJ3QgaW50ZXJuYWxpemUgdGhlIHByZXZpb3VzIHBhZ2UgYW5kIHdlIGRvIG5vdCBleHRlcm5hbGl6ZSB0aGUgY3VycmVudCBwYWdlLgotICAJICAvLyAgICAgICB3ZSBhcmUgYmFzaWNhbGx5IGp1c3QgbGVhdmluZyB0aGUgY3VycmVudCBwYWdlIHdpdGhvdXQgcmV0cmlldmluZyBpdHMgc3RhdGUgYW5kCi0gIAkgIC8vICAgICAgIG1vdmluZyB0byB0aGUgcHJldmlvdXMgcGFnZSB3aGljaCBhbHJlYWR5IGhhcyBpdHMgc3RhdGUgc2V0LgotICAJICB1bmRvVG9MYXN0UGFnZSgpOwkgIAotICAJICBjdXJyZW50UGFnZV8gPSBwYWdlOwotICAJfQkKLSAgCWVsc2UgaWYoIGlzUGFnZVZpc2libGUgKQotICAJewotICAJICAvLyBXZSBhcmUgbW92aW5nIGZvcndhcmQgb25lIHBhZ2UuCi0gIAkgIFdpZGdldERhdGFFdmVudHMgZGF0YUV2ZW50cyA9IHBhZ2UuZ2V0RGF0YUV2ZW50cygpOwotICAJICAKLSAgCSAgZGF0YU1hbmFnZXJfLnByb2Nlc3MoIGRhdGFFdmVudHMgKTsgIC8vIFB1c2ggbW9kZWwgZGF0YSBpbnRvIHRoZSBuZXcgcGFnZS4KLSAgCSAgZGF0YUV2ZW50cy5pbnRlcm5hbGl6ZSgpOwotICAJICAKLSAgCSAgcGFnZS52YWxpZGF0ZVBhZ2VUb1N0YXR1cygpOwotICAJICAKLSAgCSAgaWYoIGN1cnJlbnRQYWdlXyAhPSBudWxsICkgcGFnZS5zZXRQcmV2aW91c1BhZ2UoIGN1cnJlbnRQYWdlXyApOwotICAJICAKLSAgCSAgaWYoIGZpcnN0UGFnZV8gPT0gbnVsbCApIGZpcnN0UGFnZV8gPSBwYWdlOwotICAJICAKLSAgCSAgY3VycmVudFBhZ2VfID0gcGFnZTsKLSAgCX0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsgCQotICAJLy8gV2UgbmVlZCB0byBzaW11bGF0ZSB0aGUgbmV4dCBidXR0b24gYmVpbmcgcHJlc3NlZCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBwYWdlcy4KLSAgCS8vIElmIGFuIGVycm9yIG9jY3VycyB3ZSB3aWxsIHJldHVybiBmYWxzZSBhbmQgcmVzZXQgdGhlIGNvbW1hbmQgc3RhY2sgYmFjayBvdXIgb3JpZ2luYWwgc3RhdGUuCi0gIAlib29sZWFuICAgIGRvbmVPayAgICA9IHRydWU7Ci0gIAlQYWdlV2l6YXJkRGF0YUV2ZW50cyBzdGFydFBhZ2UgPSBjdXJyZW50UGFnZV87Ci0gIAkKLSAgCS8vIEV4dGVybmFsaXplIHRoZSBjdXJyZW50IHBhZ2UuCi0gIAljdXJyZW50UGFnZV8uZ2V0RGF0YUV2ZW50cygpLmV4dGVybmFsaXplKCk7Ci0gIAkKLSAgCS8vIExvb3AgdGhyb3VnaCBzdWJzZXF1ZW50IHBhZ2VzLgotICAJZG8KLSAgCXsgIAkgIAotICAJICBTdGF0dXMgc3RhdHVzID0gcnVuRm9yd2FyZFRvTmV4dFN0b3AoKTsJICAKLSAgCSAgCi0gIAkgIGlmKCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAJICB7Ci0gIAkgIAkvLyBBbiBlcnJvciBvY2N1cmVkIGluIG9uZSBvZiB0aGUgY29tbWFuZHMuCi0gIAkgIAlkb25lT2sgPSBmYWxzZTsKLSAgCSAgfQotICAJICBlbHNlCi0gIAkgIHsKLSAgCSAgCWN1cnJlbnRQYWdlXyA9IG5leHRQYWdlXzsKLSAgCSAgfQotICAJfQotICAJd2hpbGUoIG5leHRQYWdlXyAhPSBudWxsICYmIGRvbmVPayk7Ci0gIAkKLSAgCWlmKCAhZG9uZU9rICkKLSAgCXsKLSAgCSAgLy8gQW4gZXJyb3Igb2NjdXJlZCwgc28gd2UgbmVlZCB0byByZXR1cm4gdGhlIGNvbW1hbmQgc3RhY2sgdG8gaXQncwotICAJICAvLyBvcmdpbmFsIHN0YXRlLgotICAJICBQYWdlV2l6YXJkRGF0YUV2ZW50cyBwYWdlID0gbnVsbDsKLSAgCSAgYm9vbGVhbiAgICAgICAgICAgICAgZG9uZSA9IGZhbHNlOwotICAJICAKLSAgCSAgZG8KLSAgCSAgewotICAJICAgIGRvbmUgPSBlbmdpbmVfLnVuZG9Ub0xhc3RTdG9wKCk7Ci0gIAkgICAgcGFnZSA9IGdldFBhZ2UoIGxhc3RVbmRvRnJhZ21lbnRfICk7Ci0gIAkgIH0KLSAgCSAgd2hpbGUoIHBhZ2UgIT0gc3RhcnRQYWdlICYmICFkb25lICk7IAkgIAotICAJICAKLSAgCSAgY3VycmVudFBhZ2VfID0gcGFnZTsKLSAgCX0KLSAgCQotICAJcmV0dXJuIGRvbmVPazsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpCi0gIHsKLSAgCXdoaWxlKCAhZW5naW5lXy51bmRvVG9MYXN0U3RvcCgpICl7fQotICAJCi0gIAlyZXR1cm4gdHJ1ZTsKLSAgfQotICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwZWVrRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsgICAgICAgICAgCSAgICAKLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmcmFnbWVudCBpcyBpbiBvdXIgcGFnZSB0YWJsZS4KLSAgICBuZXh0UGFnZV8gPSBnZXRQYWdlKCBmcmFnbWVudCApOwotICAgICAgICAgIAkKLSAgICByZXR1cm4gbmV4dFBhZ2VfID09IG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIG5leHRGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIC8vIElmIHRoZSBzdXBlciBjbGFzcyBuZXh0RnJhZ21lbnQgd2FudCB1cyB0byBzdG9wIHRoZW4gd2Ugd2lsbCBzdG9wIHJpZ2h0IGF3YXkuCi0gICAgaWYoICFzdXBlci5uZXh0RnJhZ21lbnQoIGZyYWdtZW50ICkgKSByZXR1cm4gZmFsc2U7Ci0gICAgCi0gIAkvLyBUaGUgZmlyc3QgZnJhZ21lbnQgaXMgZWl0aGVyIGF0IHRoZSBzdGFydCBvZiB0aGUgd2l6YXJkCi0gIAkvLyBvciBpdCBpcyBvbiBhIHdpemFyZCBwYWdlLiAgSW4gZWl0aGVyIGNhc2Ugd2UgZG8gbm90IHdhbnQgCi0gIAkvLyB0byBzdG9wIGlmIGEgcGFnZSBpcyBmb3VuZC4KLSAgCWlmKCBmaXJzdEZyYWdtZW50XyApCi0gIAl7Ci0gIAkgIGZpcnN0RnJhZ21lbnRfID0gZmFsc2U7Ci0gIAl9Ci0gIAllbHNlCi0gIAl7Ci0gIAkgIG5leHRQYWdlXyA9IGdldFBhZ2UoIGZyYWdtZW50ICk7Ci0gIAl9ICAJICAJCi0gIAkKLSAgICByZXR1cm4gbmV4dFBhZ2VfID09IG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHVuZG9GcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAJbGFzdFVuZG9GcmFnbWVudF8gPSBmcmFnbWVudDsKLSAgCQotICAJcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB1bmRvVG9MYXN0UGFnZSgpCi0gIHsKLSAgICBib29sZWFuIHN0YWNrRW1wdHkgPSBmYWxzZTsKLSAgICAKLSAgICBkbwotICAgIHsKLSAgICAgIHN0YWNrRW1wdHkgPSBlbmdpbmVfLnVuZG9Ub0xhc3RTdG9wKCk7Ci0gICAgfXdoaWxlKCBnZXRQYWdlKCBsYXN0VW5kb0ZyYWdtZW50XyApID09IG51bGwgJiYgIXN0YWNrRW1wdHkgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBQYWdlV2l6YXJkRGF0YUV2ZW50cyBnZXRQYWdlKCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgZnJhZ21lbnQgaXMgaW4gb3VyIHBhZ2UgdGFibGUuCi0gIAlQYWdlV2l6YXJkRGF0YUV2ZW50cyBwYWdlID0gKFBhZ2VXaXphcmREYXRhRXZlbnRzKXBhZ2VUYWJsZV8uZ2V0KCBmcmFnbWVudCApOyAKLSAgCVN0cmluZyAgICAgIGlkICAgPSBmcmFnbWVudC5nZXRJZCgpOyAgICAgIAkKLSAgICAgICAgICAJCi0gICAgaWYoIHBhZ2UgPT0gbnVsbCAmJiBpZCAhPSBudWxsICkKLSAgICB7Ci0gICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmcmFnbWVudCBpZCBpcyBpbiB0aGUgcmVnaXN0cnkuCi0gICAgICBQYWdlSW5mbyBwYWdlSW5mbyA9IHJlZ2lzdHJ5Xy5nZXRQYWdlSW5mbyggaWQgKTsgICAgICAgICAgCSAgCi0gICAgICAgICAgICAgIAotICAgICAgaWYoIHBhZ2VJbmZvICE9IG51bGwgKQotICAgICAgewotICAgICAgICBwYWdlID0gcGFnZUZhY3RvcnlfLmdldFBhZ2UoIHBhZ2VJbmZvLCB0aGlzICk7Ci0gICAgICAgIHBhZ2VUYWJsZV8ucHV0KCBmcmFnbWVudCwgcGFnZSApOyAgICAgICAgICAgIAkKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcGFnZTsKLSAgfSAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9wb3B1cC9EeW5hbWljUG9wdXBXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9wb3B1cC9EeW5hbWljUG9wdXBXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNzM3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvcG9wdXAvRHluYW1pY1BvcHVwV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVjbGlwc2UuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5lY2xpcHNlLkVjbGlwc2VQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dC5QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFGbG93TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVBvcHVwUGFnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2l6YXJkUGFnZUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcG9wdXAgZHluYW1pYyB3aXphcmRzLiAgVGhlIHBvcHVwTWVudXMgZXh0ZW5zaW9uIGlzIHVzZWQKLSAqIHRoZSBjb250cmlidXRlIGEgcG9wdXAgdG8gRWNsaXBzZS4gIFRoZSBjbGFzcyBpbiB0aGUgYWN0aW9uIGVsZW1lbnQgc2hvdWxkIHJlZmVyZW5jZQotICogdGhpcyBEeW5hbWljUG9wdXBXaXphcmQgY2xhc3MuICBUaGlzIGlkIGF0dHJpYnV0ZSBpbiB0aGUgYWN0aW9uIGVsZW1lbnQgc2hvdWxkIGNvbnRhaW4KLSAqIGFuIGlkIHRoYXQgcmVmZXJlbmNlcyBhIGR5bmFtaWNXaXphcmQgZXh0ZW5zaW9uIHBvaW50LiAgVGhpcyBpcyBob3cgdGhlIER5bmFtaWNQb3B1cFdpemFyZAotICogY2xhc3Mga25vd3Mgd2hpY2ggd2l6YXJkIHRvIGRpc3BsYXkuCi0gKiAgIAotICogTm90ZTogdGhlIGlkIGF0dHJpYnV0ZSBpbiB0aGUgb2JqZWN0Q29udHJpYnV0aW9uIGVsZW1lbnQgcmVmZXJzIHRvIGFuCi0gKiAgICAgICBhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBleHRlbnNpb24gcG9pbnQuICBUaGUgaWRzIGluIG9iamVjdENvbnRyaWJ1dGlvbgotICogICAgICAgZWxlbWVudCBhbmQgdGhlIGFjdGlvbiBlbGVtZW50IG5lZWQgbm90IGJlIHRoZSBzYW1lIGFzIHRoZXkgYXJlIGluIHRoZQotICogICAgICAgZXhhbXBsZSBiZWxvdy4KLSAqCi0gKjxwcmU+Ci0gKiAgICZsdDtleHRlbnNpb24KLSAqICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiJmd0OwotICombHQ7IS0tIElGaWxlICoud3NkbCBwb3B1cCBtZW51IC0tJmd0OwotICogICAgICZsdDtvYmplY3RDb250cmlidXRpb24KLSAqICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gKiAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIgotICogICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiJmd0OwotICombHQ7IS0tIFdTREwgVG8gSmF2YSBCZWFuIFByb3h5IC0tJmd0OwotICogICAgICAgICZsdDthY3Rpb24KLSAqICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZIgotICogICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gKiAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICogICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiJmd0OwotICogICAgICAgICZsdDsvYWN0aW9uJmd0OwotICogICAgICZsdDsvb2JqZWN0Q29udHJpYnV0aW9uJmd0OwotICogICZsdDsvZXh0ZW5zaW9uJmd0OwotICoKLSAqICAgJmx0O2V4dGVuc2lvbgotICogICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCImZ3Q7Ci0gKiAgICAgJmx0O2R5bmFtaWNXaXphcmQKLSAqICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc2NsaWVudF93aXouZ2lmIgotICogICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkNsaWVudFdpZGdldEJpbmRpbmciCi0gKiAgICAgICAgICAgdGl0bGU9IiVXSVpBUkRfVElUTEVfV1NDIgotICogICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiJmd0OwotICogICAgICZsdDsvZHluYW1pY1dpemFyZCZndDsKLSAqICAmbHQ7L2V4dGVuc2lvbiZndDsKLSAqPC9wcmU+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRHluYW1pY1BvcHVwV2l6YXJkIGV4dGVuZHMgRHluYW1pY1dpemFyZCBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZQotewotICBwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uXzsKLSAgCi0gIHB1YmxpYyBEeW5hbWljUG9wdXBXaXphcmQoKQotICB7Ci0Jc3VwZXIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQjZ2V0V2l6YXJkUGFnZUZhY3RvcnkoKQotICAgKi8KLSAgcHJvdGVjdGVkIFdpemFyZFBhZ2VGYWN0b3J5IGdldFdpemFyZFBhZ2VGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlUG9wdXBQYWdlRmFjdG9yeSggZ2V0SWQoKSApOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpb3JpZ2luYWxFbGVtZW50Xy5nZXRQYXJlbnQoKSkuZ2V0QXR0cmlidXRlKCAiaWQiICk7ICAKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3J1bgotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSAKLSAgewotICAgIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBjb250ZXh0ID0gUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIGlkICAgICAgPSBnZXRJZCgpOwotICAgIAotCWlmKCBjb250ZXh0LnNob3dEaWFsb2coaWQpICkKLQl7Ci0JICAvLyBMYXVuY2ggdGhlIHdpemFyZC4KLQkgIGluaXQoIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIGdldFNlbGVjdGlvbigpICk7ICAKLQkgICAgCi0JICBXaXphcmREaWFsb2cgZGlhbG9nPSBuZXcgV2l6YXJkRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgdGhpcyk7Ci0JICBkaWFsb2cuc2V0UGFnZVNpemUoIDQwMCwgNTAwICk7Ci0JICBkaWFsb2cuY3JlYXRlKCk7Ci0JICBkaWFsb2cub3BlbigpOwotCX0KLQllbHNlCi0JewotCSAgZmluYWwgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIG1vbml0b3IgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JICAKLQkgIHRyeQotCSAgewotCSAgICBtb25pdG9yLnJ1biggZmFsc2UsIGZhbHNlLCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1biggSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgIHJ1bkhlYWRMZXNzKCBnZXRTZWxlY3Rpb24oKSwgbW9uaXRvciApOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotCSAgfQotCSAgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGV4YyApCi0JICB7IAotCSAgfQotCSAgY2F0Y2goIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjICkKLQkgIHsKLQkgIH0KLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSdW5zIG9ubHkgdGhlIENvbW1hbmRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHluYW1pYyB3aXphcmQuCi0gICAqIAotICAgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBpbml0aWFsIHNlbGVjdGlvbiBmcm9tIHRoZSB1c2VyLgotICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB0aGF0IHRoaXMgZXhlY3V0aW9uIHNob3VsZCB0YWtlIHBsYWNlIGluLiAgVGhpcwotICAgKiAgICAgICAgICAgICAgICBpcyB1c3VhbGx5IGEgcHJvZ3Jlc3MgY29udGV4dCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBnZXQgZmVlZGJhY2sKLSAgICogICAgICAgICAgICAgICAgb24gaG93IGV4ZWN1dGlvbiBpcyBwcm9ncmVzc2luZy4gIFRoZSBjb250ZXh0IG1heSBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuSGVhZExlc3MoIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ICkKLSAgewotCUNvbW1hbmRGcmFnbWVudCAgICAgICAgICAgIHJvb3RGcmFnbWVudCAgICA9IGdldFJvb3RGcmFnbWVudCggc2VsZWN0aW9uLCBudWxsICk7Ci0JUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCAgcmVzb3VyY2VDb250ZXh0ID0gUGVyc2lzdGVudFJlc291cmNlQ29udGV4dC5nZXRJbnN0YW5jZSgpOwotCUVjbGlwc2VTdGF0dXNIYW5kbGVyICAgICAgIGhhbmRsZXIgICAgICAgICA9IG5ldyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpOwotCUVjbGlwc2VQcm9ncmVzc01vbml0b3IgICAgIG1vbml0b3IgICAgICAgICA9IG5ldyBFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JRWNsaXBzZUVudmlyb25tZW50ICAgICAgICAgZW52aXJvbm1lbnQgICAgID0gbmV3IEVjbGlwc2VFbnZpcm9ubWVudCggbnVsbCwgcmVzb3VyY2VDb250ZXh0LCBtb25pdG9yLCBoYW5kbGVyICk7Ci0JICAgIAotCURhdGFNYXBwaW5nUmVnaXN0cnlJbXBsICAgIGRhdGFSZWdpc3RyeV8gICA9IG5ldyBEYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbCgpOwkgICAgCi0JRGF0YUZsb3dNYW5hZ2VyICAgICAgICAgICAgZGF0YU1hbmFnZXIgICAgID0gbmV3IERhdGFGbG93TWFuYWdlciggZGF0YVJlZ2lzdHJ5XywgZW52aXJvbm1lbnQgKTsKLQlTaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlciBtYW5hZ2VyICAgICAgICAgPSBuZXcgU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIoZW52aXJvbm1lbnQsIGRhdGFNYW5hZ2VyICk7Ci0JICAKLQljb21tYW5kV2lkZ2V0QmluZGluZ18ucmVnaXN0ZXJEYXRhTWFwcGluZ3MoIGRhdGFSZWdpc3RyeV8gKTsKLQltYW5hZ2VyLnNldFJvb3RGcmFnbWVudCggcm9vdEZyYWdtZW50ICk7Ci0JbWFuYWdlci5ydW5Gb3J3YXJkVG9OZXh0U3RvcCggY29udGV4dCApOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBJQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIAotICB7Ci0gICAgICBzZWxlY3Rpb25fID0gc2VsZWN0aW9uOwotICB9Ci0gIAotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIHsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiByZXN1bHQgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotICAgIAotCWlmKCBzZWxlY3Rpb25fICE9IG51bGwpIAotCXsJCi0JICBpZiggc2VsZWN0aW9uXyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICkgCi0JICB7Ci0JICAgIHJlc3VsdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb25fOwotCSAgfQotCX0KLQllbHNlIAotCXsKLQkgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkgIAotCSAgaWYoIHdpbmRvdyAhPSBudWxsICkgCi0JICB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCi0JCWlmKCBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiApIAotCQl7Ci0JCSAgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJfQotCSAgfQotCX0KLQkKLQlyZXR1cm4gcmVzdWx0OwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5MGZiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotcnVudGltZQotdGVtcC5mb2xkZXIKLWVudi5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMGI3MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2Uud3N0LmVudiBwbHVnaW4uCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgbWFzdGVyIHN3aXRjaCBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiBwbHVnaW4uCi1vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvZGVidWc9dHJ1ZQotCi0jIFR1cm4gb24gZGlmZmVyZW50IHRyYWNpbmcgbGV2ZWwKLW9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi90cmFjZS9pbmZvPXRydWUKLW9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi90cmFjZS93YXJuaW5nPXRydWUKLW9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi90cmFjZS9lcnJvcj10cnVlCi0KLSMgVHVybiBvbiBkYXRhIGZsb3cgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3RyYWNlL2RhdGE9dHJ1ZQotCi0jIFR1cm4gb24gY29tbWFuZCB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvdHJhY2UvY29tbWFuZD10cnVlCi0KLSMgVHVybiBvbiBlbWl0dGVyIHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi90cmFjZS9lbWl0dGVyPXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZGFkMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjA3NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZW52Lmphcgotc3JjLmluY2x1ZGVzID0gLmNsYXNzcGF0aCxcCi0gICAgICAgICAgICAgICAucHJvamVjdCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLmVudi5qYXIgPSBzcmMvCi1vdXRwdXQuZW52LmphciA9IGJpbi8KLWphcnMuY29tcGlsZS5vcmRlciA9IGVudi5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZGUwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1FbnZpcm9ubWVudCBDb21tYW5kIEZyYW1ld29yayAoaGVhZGxlc3MpCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotUExVR0lOX1hQX0RZTkFNSUNfV0laQVJEPUR5bmFtaWMgV2l6YXJkCi1QTFVHSU5fWFBfUE9QVVBfRElBTE9HUz1PcHRpb25hbCBQb3AtdXAgQWN0aW9uIERpYWxvZ3MgVHlwZXMKLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzYjg5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIKLSAgIG5hbWU9IiVQTFVHSU5fTkFNRSIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iJVBMVUdJTl9QUk9WSURFUiIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYucGx1Z2luLkVudlBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iZW52LmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5vc2dpIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0iZHluYW1pY1dpemFyZCIKLSAgICAgIG5hbWU9IiVQTFVHSU5fWFBfRFlOQU1JQ19XSVpBUkQiLz4KLSAgIAotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9ImFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIgotICAgICAgbmFtZT0iJVBMVUdJTl9YUF9QT1BVUF9ESUFMT0dTIi8+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vQ2xhc3NQYXRoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9DbGFzc1BhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExYTdkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9DbGFzc1BhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiAKLSAqIFRoZSBjbGFzcyBwcm92aWRlcyBhbmQgZWFzeSB3YXkgdG8gYnVpbGQgY2xhc3NwYXRocy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc1BhdGggCi17Ci0gIHByaXZhdGUgU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBuZXdQYXRoIGFwcGVuZHMgdGhpcyBuZXcgcGF0aCB0byB0aGUgZW5kIG9mIHRoZSBjbGFzc3BhdGguCi0gICAqLwotICBwdWJsaWMgdm9pZCBhcHBlbmRQYXRoKCBTdHJpbmcgbmV3UGF0aCApCi0gIHsKLSAgCS8vIE5vIHZhbHVlIHRvIHB1dCBvbiBwYXRoLCBzbyBqdXN0IHJldHVybgotICAJaWYoIG5ld1BhdGguZXF1YWxzKCAiIiApICkgcmV0dXJuOwotICAJCi0gIAkvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwYXRoIGluIHRoZSBzdHJpbmcgdGhlbiB3ZSBkb24ndCBuZWVkIGEgcGF0aAotICAJLy8gc2VwYXJhdG9yLgotICAJaWYoIHBhdGgubGVuZ3RoKCkgPT0gMCApCi0gIAl7Ci0gIAkgIHBhdGguYXBwZW5kKCBuZXdQYXRoICk7Ci0gIAl9Ci0gIAllbHNlCi0gIAl7Ci0gIAkgIHBhdGguYXBwZW5kKCBGaWxlLnBhdGhTZXBhcmF0b3JDaGFyICsgbmV3UGF0aCApOwotICAJfQotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgYXBwZW5kcyBhbGwgamFyIGFuZCB6aXAgZmlsZXMgaW4gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSB0bwotICAgKiB0aGUgY2xhc3NwYXRoLgotICAgKiAKLSAgICogQHBhcmFtIGRpcmVjdG9yeSBzcGVjaWZpZXMgYSBkaXJlY3RvcnkgY29udGFpbnMgamFyIGFuZCB6aXAgZmlsZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhcHBlbmREaXIoIFN0cmluZyBkaXJlY3RvcnkgKQotICB7Ci0gIAlGaWxlIGRpciA9IG5ldyBGaWxlKCBkaXJlY3RvcnkgKTsKLSAgCQotICAJaWYoICFkaXIuaXNEaXJlY3RvcnkoKSApIHJldHVybjsKLSAgCQotICAJRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotICAJCi0gIAlmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgZmlsZXMubGVuZ3RoOyBpbmRleCsrICkKLSAgCXsKLSAgCSAgRmlsZSAgIGZpbGUgPSBmaWxlc1tpbmRleF07Ci0gIAkgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0gIAkgIAotICAJICBpZiggZmlsZS5pc0ZpbGUoKSAmJgotICAJICAgICAgKCBuYW1lLmVuZHNXaXRoKCAiLmphciIgKSB8fAotICAJICAgICAgICBuYW1lLmVuZHNXaXRoKCAiLnppcCIgKSApICkKLSAgCSAgewotICAJICAJYXBwZW5kUGF0aCggZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAJICB9Ci0gIAkgICAgICAgIAotICAJfQotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBuZXdQYXRoIGFwcGVuZHMgYSBuZXcgY2xhc3NwYXRoIHRvIHRoZSBlbmQgb2YgdGhpcyBjbGFzc3BhdGguCi0gICAqLwotICBwdWJsaWMgdm9pZCBhcHBlbmRQYXRoKCBDbGFzc1BhdGggbmV3UGF0aCApCi0gIHsKLSAgCWFwcGVuZFBhdGgoIG5ld1BhdGgucGF0aC50b1N0cmluZygpICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZ1bGwgc3RyaW5nIGNsYXNzcGF0aCB3aXRoIHNlcGFyYXRvcnMuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vRW52aXJvbm1lbnRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vRW52aXJvbm1lbnRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTQzYjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgY2JyZWFsZXlAY2EuaWJtLmNvbQotICogCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGdlbmVyaWMKLSAqIEVudmlyb25tZW50IGNsYXNlcyBhbmQgRWNsaXBzZSBjbGFzc2VzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW52aXJvbm1lbnRVdGlscyB7Ci0JLyoqCi0JICogQ29udmVydHMgYW4gRWNsaXBzZSA8Y29kZT5JU3RhdHVzPC9jb2RlPiB0byBhbiBFbnZpcm9ubWVudAotCSAqIDxjb2RlPlN0YXR1czwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGlzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBFY2xpcHNlIHN0YXR1cyBvYmplY3QuCi0JICogQHJldHVybiBBbiBlcXVpdmFsZW50IEVudmlyb25tZW50IHN0YXR1cyBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdGF0dXMgY29udmVydElTdGF0dXNUb1N0YXR1cyhJU3RhdHVzIGlzdGF0dXMpIHsKLQkJU3RhdHVzIHN0YXR1czsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBpc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gaXN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlpbnQgbm9PZkNoaWxkcmVuID0gY2hpbGRyZW4ubGVuZ3RoOwotCQlpZiAobm9PZkNoaWxkcmVuID4gMCkgewotCQkJU3RhdHVzW10gc3RhdHVzQ2hpbGRyZW4gPSBuZXcgU3RhdHVzW25vT2ZDaGlsZHJlbl07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vT2ZDaGlsZHJlbjsgaSsrKSB7Ci0JCQkJc3RhdHVzQ2hpbGRyZW5baV0gPSBjb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGNoaWxkcmVuW2ldKTsKLQkJCX0KLQotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbWVzc2FnZSwgc3RhdHVzQ2hpbGRyZW4pOwotCQl9IGVsc2UgewotCQkJaW50IHNldmVyaXR5ID0gaXN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQkJaW50IHN0YXR1c1NldmVyaXR5ID0gU3RhdHVzLk9LOwotCQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJY2FzZSBJU3RhdHVzLkVSUk9SOgotCQkJCXN0YXR1c1NldmVyaXR5ID0gU3RhdHVzLkVSUk9SOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJU3RhdHVzLldBUk5JTkc6Ci0JCQkJc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5JTkZPOgotCQkJCXN0YXR1c1NldmVyaXR5ID0gU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuT0s6Ci0JCQkJc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuT0s7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJfQotCQkJVGhyb3dhYmxlIGUgPSBpc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbWVzc2FnZSwgc3RhdHVzU2V2ZXJpdHksIGUpOwotCQl9Ci0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhbiBFbnZpcm9ubWVudCA8Y29kZT5TdGF0dXM8L2NvZGU+IHRvIGFuIEVjbGlwc2UKLQkgKiA8Y29kZT5JU3RhdHVzPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaXN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIEVudmlyb25tZW50IHN0YXR1cyBvYmplY3QuCi0JICogQHJldHVybiBBbiBlcXVpdmFsZW50IEVjbGlwc2Ugc3RhdHVzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY29udmVydFN0YXR1c1RvSVN0YXR1cyhTdGF0dXMgc3RhdHVzLCBTdHJpbmcgcGx1Z2luSWQpIHsKLQkJSVN0YXR1cyBpc3RhdHVzOwotCQlTdHJpbmcgbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCVRocm93YWJsZSB0aHJvd2FibGUgPSBzdGF0dXMuZ2V0VGhyb3dhYmxlKCk7Ci0JCWlmIChzdGF0dXMuaGFzQ2hpbGRyZW4oKSkgewotCQkJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJCWludCBub09mQ2hpbGRyZW4gPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlJU3RhdHVzW10gaXN0YXR1c0NoaWxkcmVuID0gbmV3IElTdGF0dXNbbm9PZkNoaWxkcmVuXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9PZkNoaWxkcmVuOyBpKyspIHsKLQkJCQlpc3RhdHVzQ2hpbGRyZW5baV0gPSBjb252ZXJ0U3RhdHVzVG9JU3RhdHVzKGNoaWxkcmVuW2ldLAotCQkJCQkJcGx1Z2luSWQpOwotCQkJfQotCi0JCQlpc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLCAwLCBpc3RhdHVzQ2hpbGRyZW4sIG1lc3NhZ2UsCi0JCQkJCXRocm93YWJsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJCWludCBpc3RhdHVzU2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJY2FzZSBTdGF0dXMuRVJST1I6Ci0JCQkJaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgU3RhdHVzLldBUk5JTkc6Ci0JCQkJaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTdGF0dXMuSU5GTzoKLQkJCQlpc3RhdHVzU2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFN0YXR1cy5PSzoKLQkJCQlpc3RhdHVzU2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCX0KLQkJCWlzdGF0dXMgPSBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cyhpc3RhdHVzU2V2ZXJpdHksCi0JCQkJCXBsdWdpbklkLCAwLCBtZXNzYWdlLCB0aHJvd2FibGUpOwotCQl9Ci0KLQkJcmV0dXJuIGlzdGF0dXM7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9GaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1MTRkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9GaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLQotCi0KLS8qKgotKiBUaGlzIGNsYXNzIGRlZmluZXMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IHdyaXRlcyB0byBhbgotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9LgotKi8KLXB1YmxpYyBjbGFzcyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0KLXsKLQotICBJUGF0aCAgICAgICAgICAgICAgICAgZkZpbGVQYXRoOwotICBSZXNvdXJjZUNvbnRleHQgICAgICAgZlJlc291cmNlQ29udGV4dDsgCi0gIFByb2dyZXNzTW9uaXRvciAgICAgICBmTW9uaXRvcjsgICAKLSAgU3RhdHVzSGFuZGxlciAgICAgICAgIGZTdGF0dXNIYW5kbGVyOwotICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLSAgYm9vbGVhbiAgICAgICAgICAgICAgIGZPcGVuOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIHRvIHRoZQotICAqIGdpdmVuIDxjb2RlPmZpbGU8L2NvZGU+LiBUaGUgd29ya3NwYWNlIGlzIG5laXRoZXIgZXhhbWluZWQgbm9yCi0gICogYWx0ZXJlZCBkdXJpbmcgY29uc3RydWN0aW9uLiBBbGwgcmVzb3VyY2UgY3JlYXRpb24gaXMgZGVmZXJyZWQKLSAgKiB1bnRpbCBsYXRlciBpbiB0aGUgc3RyZWFtJ3MgbGlmZWN5Y2xlLCBzdWNoIGFzIGR1cmluZyB3cml0aW5nCi0gICogb3IgY2xvc3VyZS4KLSAgKiA8Yj5Ob3RlOjwvYj4gVGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIGNyZWF0aW5nIGEgc3RyZWFtIHRoYXQKLSAgKiB3cml0ZXMgdG8gYW4gSUZpbGUgaXMgdG8gY2FsbCB0aGUgc3RhdGljIGZhY3RvcnkgbWV0aG9kCi0gICoge0BsaW5rIEZpbGVSZXNvdXJjZVV0aWxzI25ld0ZpbGVPdXRwdXRTdHJlYW0gRmlsZVJlc291cmNlVXRpbHMubmV3RmlsZU91dHB1dFN0cmVhbSgpfQotICAqIGFuZCB3b3JrIHdpdGggdGhlIHJlc3VsdGluZyA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgotICAqIERpcmVjdCBjb25zdHJ1Y3Rpb24gb2YgYSBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0gaXMgbm90IHJlY29tbWVuZGVkLgotICAqIEBwYXJhbSBmaWxlIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlIHJlc291cmNlIHRvIGNyZWF0ZS4gVGhlIHByb2plY3QgaW1wbGllZCBieSB0aGUKLSAgKiBwYXRobmFtZSBvZiB0aGUgZmlsZSBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICovCi0gIHB1YmxpYyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0gKCAKLSAgCQkJUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwgCi0gIAkJCUlQYXRoICAgICAgICAgICBmaWxlUGF0aCwgCi0gIAkJCVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotICAJCQlTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlcgotICAJCQkpCi0gIHsKLSAgICBmRmlsZVBhdGggPSBmaWxlUGF0aDsKLSAgICBmUmVzb3VyY2VDb250ZXh0ID0gcmVzb3VyY2VDb250ZXh0OwotICAgIGZNb25pdG9yID0gbW9uaXRvcjsKLSAgICBmU3RhdHVzSGFuZGxlciA9IHN0YXR1c0hhbmRsZXI7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBmT3BlbiA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgKiBDbG9zZXMgdGhlIHN0cmVhbS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoZSBzdHJlYW0uCi0gICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZQotICAqIGFuZCBhIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiB3aWxsCi0gICogYmUgdGhyb3duIGVpdGhlciBub3cgb3IgZHVyaW5nIGFuIGVhcmxpZXIge0BsaW5rICN3cml0ZSB3cml0ZX0uCi0gICovCi0gIHB1YmxpYyB2b2lkIGNsb3NlICgpCi0gIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCFmT3BlbikgcmV0dXJuOwotICAgIGZPcGVuID0gZmFsc2U7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgIGJ5dGVbXSBidWZmZXIgPSBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCk7Ci0gICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gdGVtcElucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlcik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZVJlc291cmNlVXRpbHMuY3JlYXRlRmlsZShmUmVzb3VyY2VDb250ZXh0LCBmRmlsZVBhdGgsIHRlbXBJbnB1dFN0cmVhbSwgZk1vbml0b3IsIGZTdGF0dXNIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoUmVzb3VyY2VFeGNlcHRpb24gZSApCi0gICAgCXsKLSAgICAJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgCX0KLQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBGbHVzaGVzIHRoZSBzdHJlYW0uIFRoaXMgZG9lcyBub3QgaW1wbHkgdGhlIEZpbGUgcmVzb3VyY2UKLSAgKiB3aWxsIGJlIGNyZWF0ZWQgb3IgYmVjb21lIHZpc2libGUgd2l0aGluIHRoZSB3b3JrYmVuY2guCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgcHVibGljIHZvaWQgZmx1c2ggKCkKLSAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gIH0KLQotICAvKioKLSAgKiBXcml0ZXMgYWxsIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGFycmF5IHRvIHRoZSBzdHJlYW0uCi0gICogQHBhcmFtIGIgVGhlIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlLgotICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcwotICAqIHN0cmVhbSB3YXMgY29uc3RydWN0ZWQgd2l0aCBvdmVyd3JpdGVGaWxlID0gZmFsc2UgYW5kIGEgZmlsZSBvZiB0aGUKLSAgKiBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZW4gYW4gSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBhdAotICAqIHRoaXMgcG9pbnQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlICggYnl0ZVtdIGIgKQotICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0ud3JpdGUoYik7Ci0gIH0KLQotICAvKioKLSAgKiBXcml0ZXMgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgYmVnaW5uaW5nIGF0IHNvbWUgb2Zmc2V0Ci0gICogYW5kIGNvbnRpbnVpbmcgZm9yIHNvbWUgbnVtYmVyIG9mIGJ5dGVzIChsZW4pIHRvIHRoZSBzdHJlYW0uCi0gICogQHBhcmFtIGIgVGhlIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlLgotICAqIEBwYXJhbSBvZmYgVGhlIG9mZnNldCBpbnRvIHRoZSBhcnJheSB0byBiZWdpbiB3cml0aW5nLgotICAqIEBwYXJhbSBsZW4gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMKLSAgKiBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlIGFuZCBhIGZpbGUgb2YgdGhlCi0gICogc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLSAgKiB0aGlzIHBvaW50LgotICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZSAoIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuICkKLSAgewotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0ud3JpdGUoYixvZmYsbGVuKTsKLSAgfQotCi0gIC8qKgotICAqIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJlYW0uCi0gICogQHBhcmFtIGIgVGhlIGJ5dGUgdG8gd3JpdGUuCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUgKCBpbnQgYiApCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGIpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL0ZpbGVSZXNvdXJjZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9GaWxlUmVzb3VyY2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDkzNTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL0ZpbGVSZXNvdXJjZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotCi0vKioKLSogVGhpcyBjbGFzcyBjb250YWlucyB1c2VmdWwgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEVjbGlwc2UgcmVzb3VyY2VzLgotKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlUmVzb3VyY2VVdGlscwotewotICAvLwotICAvLyBLZWVwcyB0aGUgSVdvcmtzcGFjZSBoYW5naW5nIGFyb3VuZC4gU2VlIGdldFdvcmtzcGFjZSgpLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlIHdvcmtzcGFjZV8gPSBudWxsOwotICAvLwotICAvLyBLZWVwcyB0aGUgSVdvcmtzcGFjZVJvb3QgaGFuZ2luZyBhcm91bmQuIFNlZSBnZXRXb3Jrc3BhY2VSb290KCkuCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2VSb290IHJvb3RfID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgc3RhdGljIE1lc3NhZ2VVdGlscyBtc2dfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uZW52aXJvbm1lbnQiLCBuZXcgRmlsZVJlc291cmNlVXRpbHMoKSApOwotCi0KLSAvKioKLSAgKiBSZXR1cm5zIHRoZSBJV29ya3NwYWNlUm9vdCBvYmplY3QuCi0gICogQHJldHVybiBUaGUgSVdvcmtzcGFjZVJvb3Qgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QgKCkKLSAgewotICAgIGlmIChyb290XyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJvb3RfID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJvb3RfOwotICB9Ci0KLSAvKioKLSAgKiBSZXR1cm5zIHRoZSBJV29ya3NwYWNlIG9iamVjdC4KLSAgKiBAcmV0dXJuIFRoZSBJV29ya3NwYWNlIG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSAoKQotICB7Ci0gICAgaWYgKHdvcmtzcGFjZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocm9vdF8gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcm9vdF8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgfQotICAgICAgCi0gICAgICB3b3Jrc3BhY2VfID0gcm9vdF8uZ2V0V29ya3NwYWNlKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB3b3Jrc3BhY2VfOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhbiBhcnJheSBvZiB0aHJlZSBjb21tb24gY2hvaWNlcy4gKGllLiBZZXMsIHllcyBhbGwsIGFuZCBjYW5jZWwgKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDaG9pY2VbXSBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSAKLSAgewotICAgIFZlY3RvciBjaG9pY2VzID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIGNob2ljZXMuYWRkKG5ldyBDaG9pY2UoICdZJywgbXNnXy5nZXRNZXNzYWdlKCJMQUJFTF9ZRVMiKSkpOwotICAgIGNob2ljZXMuYWRkKG5ldyBDaG9pY2UoICdBJywgbXNnXy5nZXRNZXNzYWdlKCJMQUJFTF9ZRVNfVE9fQUxMIikpKTsKLSAgICBjaG9pY2VzLmFkZChuZXcgQ2hvaWNlKCAnQycsIG1zZ18uZ2V0TWVzc2FnZSgiTEFCRUxfQ0FOQ0VMIikpKTsKLSAgICAKLSAgICByZXR1cm4gKENob2ljZVtdKWNob2ljZXMudG9BcnJheShuZXcgQ2hvaWNlW2Nob2ljZXMuc2l6ZSgpXSk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgYW4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIElSZXNvdXJjZX0KLSAgKiBvZiB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aG5hbWUgb3IgbnVsbCBpZiBubyBzdWNoIHJlc291cmNlIGV4aXN0cy4KLSAgKiBAcGFyYW0gYWJzb2x1dGVQYXRobmFtZSBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UuCi0gICogQHJldHVybiBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZmluZFJlc291cmNlICggU3RyaW5nIGFic29sdXRlUGF0aG5hbWUgKQotICB7Ci0gICAgaWYgKGFic29sdXRlUGF0aG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZpbmRSZXNvdXJjZShuZXcgUGF0aChhYnNvbHV0ZVBhdGhuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBJUmVzb3VyY2V9Ci0gICogb2YgdGhlIGdpdmVuIGFic29sdXRlIHBhdGggb3IgbnVsbCBpZiBubyBzdWNoIHJlc291cmNlIGV4aXN0cy4KLSAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIFRoZSBhYnNvbHV0ZSA8Y29kZT5JUGF0aDwvY29kZT4gb2YgdGhlIHJlc291cmNlLgotICAqIEByZXR1cm4gVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZSAoIElQYXRoIGFic29sdXRlUGF0aCApCi0gIHsKLSAgICBpZiAoYWJzb2x1dGVQYXRoID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBGaWxlUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZmluZE1lbWJlcihhYnNvbHV0ZVBhdGgpOwotICB9Ci0gIAotICAvKioKLSAgICogQ29waWVzIGEgZmlsZSBmcm9tIGEgcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uCi0gICAqIHRvIGFuIEVjbGlwc2UgZm9sZGVyLgotICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4KLSAgICogTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHBhcmFtIHNvdXJjZVBhdGggVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+Ci0gICAqIGluc3RhbGwgbG9jYXRpb24sIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGNvcHkuCi0gICAqIElmIG51bGwsIHRoZW4gdGhlIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uIGlzIHRoZSBzb3VyY2UgcGF0aAotICAgKiAoaWUuIG51bGwgaXMgZXF1aXZhbGVudCB0byAiLiIpLgotICAgKiBAcGFyYW0gcGF0aG5hbWUgVGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGNvcHkuCi0gICAqIFRoZSBwYXRobmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgPGNvZGU+cGx1Z2luIHNvdXJjZVBhdGg8L2NvZGU+LgotICAgKiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUaGUgYWJzb2x1dGUgRWNsaXBzZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8KLSAgICogd2hpY2ggdGhlIGZpbGUgd2lsbCBiZSBjb3BpZWQuIFRoZSByZWxhdGl2ZSBwYXRobmFtZSBvZiB0aGUKLSAgICogZmlsZSBpcyBwcmVzZXJ2ZWQuCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSBjcmVhdGVGb2xkZXJzIFRoZSBpbnRlcm1lZGlhdGUgZm9sZGVyIGNyZWF0aW9uIHBvbGljeSwgb25lIG9mCi0gICAqIHtAbGluayAjQ1JFQVRFIENSRUFURX0gb3Ige0BsaW5rICNET05UX0NSRUFURSBET05UX0NSRUFURX0uCi0gICAqIDx1bD4KLSAgICogPGxpPjxjb2RlPkNSRUFURTwvY29kZT4gLQotICAgKiBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4gdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgICogZG8gbm90IGV4aXN0LCB0aGV5IHdpbGwgYmUgY3JlYXRlZC4KLSAgICogPGxpPjxjb2RlPkRPTlRfQ1JFQVRFPC9jb2RlPiAtCi0gICAqIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAgKiBkbyBub3QgZXhpc3QsIHRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LgotICAgKiA8L3VsPgotICAgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZSBUaGUgcG9saWN5IGZvciBleGlzdGluZyBmaWxlcywgb25lIG9mCi0gICAqIHtAbGluayAjT1ZFUldSSVRFIE9WRVJXUklURX0gb3Ige0BsaW5rICNET05UX09WRVJXUklURSBET05UX09WRVJXUklURX0uCi0gICAqIDx1bD4KLSAgICogPGxpPjxjb2RlPk9WRVJXUklURTwvY29kZT4gLQotICAgKiBJZiBhIHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuCi0gICAqIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeSBleGlzdHMgYW5kIGlzIGEgZmlsZSwKLSAgICogaXQgd2lsbCBiZSByZXBsYWNlZC4KLSAgICogSWYgdGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIGFuZCBpdCBpcyBub3QgYSBmaWxlLAotICAgKiB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZAotICAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAgKiA8bGk+PGNvZGU+RE9OVF9PVkVSV1JJVEU8L2NvZGU+IC0KLSAgICogSWYgYW55IHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuCi0gICAqIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeSBleGlzdHMsCi0gICAqIHRoZW4gbm8gZmlsZSB3aWxsIGJlIGNyZWF0ZWQgYW5kCi0gICAqIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0gICAqIDwvdWw+Ci0gICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotICAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c30KLSAgICogd2l0aCBhIHNldmVyaXR5IG9mIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+IGFuZCBhCi0gICAqIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0gICAqLwotICAgc3RhdGljIHB1YmxpYyB2b2lkIGNvcHlGaWxlKCBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW4gcGx1Z2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBzb3VyY2VQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggdGFyZ2V0UGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yICkKLSAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgIHsKLSAgICAgdHJ5Ci0gICAgIHsKLSAgICAgICBJUGF0aCB0YXJnZXQgPSB0YXJnZXRQYXRoLmFwcGVuZChwYXRobmFtZSk7Ci0gICAgICAgSVBhdGggc291cmNlID0gc291cmNlUGF0aCA9PSBudWxsID8gcGF0aG5hbWUgOiBzb3VyY2VQYXRoLmFwcGVuZChwYXRobmFtZSk7Ci0gICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBwbHVnaW4ub3BlblN0cmVhbShzb3VyY2UpOwotICAgICAgIGNyZWF0ZUZpbGUocmVzb3VyY2VDb250ZXh0LCB0YXJnZXQsIGlucHV0LCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c01vbml0b3IpOwotICAgICB9Ci0gICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICB7Ci0gICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lPIiksZSkpOwotICAgICB9Ci0gICB9Ci0gICAKLSAgLyoqCi0gICAqIERlbGV0ZXMgYSBmaWxlIHVuZGVyIGEgY29udGFpbmVyLgotICAgKiBUaGUgY29udGFpbmVyIG11c3QgYWxyZWFkeSBleGlzdC4KLSAgICogQHBhcmFtIGZpbGUgLSB0aGUgSUZpbGUgdG8gYmUgZGVsZXRlZAotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0gICAqIEBwYXJhbSBzdGF0dXNNb25pdG9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpZiBpdCBleGlzdHMgYW5kIGlzIHN1Y2Nlc3NmdWxseSBkZWxldGVkLiBGYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRmlsZSggUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNIYW5kbGVyIHN0YXR1c01vbml0b3IpCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIGlmIChmaWxlLmV4aXN0cygpKQotICAgIHsKLSAgICAgIGlmICghcmVzb3VyY2VDb250ZXh0LmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkpCi0gICAgICB7Ci0gICAgICAgIFNpbXBsZVN0YXR1cyBzdGF0dXMgCi0gICAgICAgICAgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dfLmdldE1lc3NhZ2UoICJNU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGZpbGUuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0TmFtZSgpfSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cy5XQVJOSU5HICk7Ci0gICAgICAgIAotICAgICAgICBDaG9pY2UgY2hvaWNlID0gc3RhdHVzTW9uaXRvci5yZXBvcnQoIHN0YXR1cywgZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBjaG9pY2UuZ2V0U2hvcnRjdXQoKSA9PSAnQycgKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZiggY2hvaWNlLmdldFNob3J0Y3V0KCkgPT0gJ0EnICkgcmVzb3VyY2VDb250ZXh0LnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCh0cnVlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9XZSBoYXZlIHBlcm1pc3Npb24gdG8gb3ZlcndyaXRlIHNvIGNoZWNrIGlmIGZpbGUgaXMgcmVhZC1vbmx5Ci0gICAgICBpZiAoZmlsZS5pc1JlYWRPbmx5KCkpCi0gICAgICB7Ci0gICAgICAgIGlmICghcmVzb3VyY2VDb250ZXh0LmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIFNpbXBsZVN0YXR1cyBzdGF0dXMgCi0gICAgICAgICAgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dfLmdldE1lc3NhZ2UoICJNU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXROYW1lKCl9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzLldBUk5JTkcgKTsKLSAgICAgICAgICAKLSAgICAgICAgICBDaG9pY2UgY2hvaWNlID0gc3RhdHVzTW9uaXRvci5yZXBvcnQoIHN0YXR1cywgZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkgKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiggY2hvaWNlLmdldFNob3J0Y3V0KCkgPT0gJ0MnICkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIAotICAgICAgICAgIGlmKCBjaG9pY2UuZ2V0U2hvcnRjdXQoKSA9PSAnQScgKSByZXNvdXJjZUNvbnRleHQuc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQodHJ1ZSk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotICAgICAgICBmaWxlc1swXSA9IGZpbGU7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SICkKLSAgICAgICAgewotICAgICAgICAgIFNpbXBsZVN0YXR1cyB2YWxpZGF0ZVN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBTaW1wbGVTdGF0dXMuRVJST1IgKTsKLSAgICAgICAgICBzdGF0dXNNb25pdG9yLnJlcG9ydEVycm9yKCB2YWxpZGF0ZVN0YXR1cyApOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBmaWxlLmRlbGV0ZSh0cnVlLCBudWxsKTsKLSAgICB9Ci0gICAgLy9BdCB0aGlzIHBvaW50LCBlaXRoZXIgdGhlIGZpbGUgZGlkIG5vdCBleGlzdCBvciB3ZSBzdWNjZXNzZnVsbHkgZGVsZXRlZAotICAgIC8vIGl0LiBSZXR1cm4gc3VjY2Vzcy4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWxldGVzIGEgZm9sZGVyIHVuZGVyIGEgY29udGFpbmVyLgotICAgKiBAcGFyYW0gZm9sZGVyIC0gdGhlIElGb2xkZXIgdG8gYmUgZGVsZXRlZAotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0gICAqIEBwYXJhbSBzdGF0dXNNb25pdG9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZm9sZGVyIGRvZXMgbm90IGV4aXN0IG9yIGlmIGl0IGV4aXN0cyBhbmQgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgYWxvbmcgd2l0aCBpdHMgbWVtYmVycy4gRmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVGb2xkZXIoIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIGZvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNIYW5kbGVyIHN0YXR1c01vbml0b3IgKQotICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgewotICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkgcmV0dXJuIHRydWU7Ci0KLSAgICAgYm9vbGVhbiAgICAgZGVsZXRlZCAgID0gdHJ1ZTsKLSAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gZm9sZGVyLm1lbWJlcnMoKTsKLSAgICAgCi0gICAgIGZvciAoaW50IGk9MDsgaTxyZXNvdXJjZXMubGVuZ3RoOyBpKyspCi0gICAgIHsKLSAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0gICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICAgewotICAgICAgICAgZGVsZXRlZCA9IGRlbGV0ZUZpbGUocmVzb3VyY2VDb250ZXh0LCAoSUZpbGUpcmVzb3VyY2UsIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0gICAgICAgfQotICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpCi0gICAgICAgewotICAgICAgICAgZGVsZXRlZCA9IGRlbGV0ZUZvbGRlciggcmVzb3VyY2VDb250ZXh0LCAoSUZvbGRlcilyZXNvdXJjZSwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLSAgICAgICB9Ci0KLSAgICAgICBpZiggIWRlbGV0ZWQgKSBicmVhazsKLSAgICAgfQotICAgICAKLSAgICAgaWYoIGRlbGV0ZWQgKQotICAgICB7Ci0gICAgICAgZm9sZGVyLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLSAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgfQotCi0gIC8qKgotICAqIENyZWF0ZXMgYSBmaWxlIG9mIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICogYW5kIHJldHVybnMgaXRzIGhhbmRsZSBhcyBhbiA8Y29kZT5JRmlsZTwvY29kZT4uCi0gICogSWYgdGhlIGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQsIGEKLSAgKiA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBjb250YWluaW5nIGFuCi0gICogPGNvZGU+SVN0YXR1czwvY29kZT4gb2JqZWN0IGlzIHRocm93bi4KLSAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4KLSAgKiBUaGUgcHJvamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRoIG11c3QgYWxyZWFkeSBleGlzdCwKLSAgKiB0aGF0IGlzLCB0aGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgcHJvamVjdHMuCi0gICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlLgotICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAqIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSUZpbGUgY3JlYXRlRmlsZSAoCi0gICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLSAgICBJUGF0aCAgICAgICAgICAgYWJzb2x1dGVQYXRoLAotICAgIElucHV0U3RyZWFtICAgICBpbnB1dFN0cmVhbSwKLSAgICBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotICAgIFN0YXR1c0hhbmRsZXIgICBzdGF0dXNIYW5kbGVyICkKLQotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICB7ICAgIAotICAgIGlmICghYWJzb2x1dGVQYXRoLmlzQWJzb2x1dGUoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJSZXNvdXJjZVV0aWxzIiwwLG1zZ18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BBVEhfTk9UX0FCU09MVVRFIixuZXcgT2JqZWN0W10ge2Fic29sdXRlUGF0aC50b1N0cmluZygpfSksbnVsbCkpOwotICAgIH0KLSAgICBpZiAoYWJzb2x1dGVQYXRoLnNlZ21lbnRDb3VudCgpIDwgMSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIlJlc291cmNlVXRpbHMiLDAsbXNnXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUEFUSF9FTVBUWSIsbmV3IE9iamVjdFtdIHthYnNvbHV0ZVBhdGgudG9TdHJpbmcoKX0pLG51bGwpKTsKLSAgICB9Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8IDIpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLG1zZ18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BBVEhfTk9UX0ZPTERFUiIsbmV3IE9iamVjdFtdIHthYnNvbHV0ZVBhdGgudG9TdHJpbmcoKX0pLG51bGwpKTsKLSAgICB9Ci0gICAgSUNvbnRhaW5lciBwYXJlbnQgICA9IG1ha2VGb2xkZXJQYXRoKHJlc291cmNlQ29udGV4dCwgYWJzb2x1dGVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNIYW5kbGVyKTsKLSAgICBTdHJpbmcgICAgIGZpbGVOYW1lID0gYWJzb2x1dGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgCi0gICAgcmV0dXJuIG1ha2VGaWxlKHJlc291cmNlQ29udGV4dCwgcGFyZW50LCBmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzSGFuZGxlcik7Ci0gIH0KLQotICAvKioKLSAgKiBDcmVhdGVzIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPgotICAqIGEgZmlsZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+cmVsYXRpdmVQYXRoPC9jb2RlPgotICAqIGFuZCByZXR1cm5zIGl0cyBoYW5kbGUgYXMgYW4gPGNvZGU+SUZpbGU8L2NvZGU+LgotICAqIElmIHRoZSBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLCBhCi0gICogPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gY29udGFpbmluZyBhbgotICAqIDxjb2RlPklTdGF0dXM8L2NvZGU+IG9iamVjdCBpcyB0aHJvd24uCi0gICogQHBhcmFtIGFic29sdXRlUGF0aCBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCi0gICogVGhlIHByb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aCBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBjcmVhdGVGb2xkZXJzIFRoZSBpbnRlcm1lZGlhdGUgZm9sZGVyIGNyZWF0aW9uIHBvbGljeSwgb25lIG9mCi0gICoge0BsaW5rICNDUkVBVEUgQ1JFQVRFfSBvciB7QGxpbmsgI0RPTlRfQ1JFQVRFIERPTlRfQ1JFQVRFfS4KLSAgKiA8dWw+Ci0gICogPGxpPjxjb2RlPkNSRUFURTwvY29kZT4gLQotICAqIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAqIGRvIG5vdCBleGlzdCwgdGhleSB3aWxsIGJlIGNyZWF0ZWQuCi0gICogPGxpPjxjb2RlPkRPTlRfQ1JFQVRFPC9jb2RlPiAtCi0gICogSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICogZG8gbm90IGV4aXN0LCB0aGUgbWV0aG9kIHdpbGwgdGhyb3cgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPi4KLSAgKiA8L3VsPgotICAqIEBwYXJhbSBvdmVyd3JpdGVGaWxlIFRoZSBwb2xpY3kgZm9yIGV4aXN0aW5nIGZpbGVzLCBvbmUgb2YKLSAgKiB7QGxpbmsgI09WRVJXUklURSBPVkVSV1JJVEV9IG9yIHtAbGluayAjRE9OVF9PVkVSV1JJVEUgRE9OVF9PVkVSV1JJVEV9LgotICAqIDx1bD4KLSAgKiA8bGk+PGNvZGU+T1ZFUldSSVRFPC9jb2RlPiAtCi0gICogSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAqIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeSBleGlzdHMgYW5kIGlzIGEgZmlsZSwKLSAgKiBpdCB3aWxsIGJlIHJlcGxhY2VkLgotICAqIElmIHRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXQgaXMgbm90IGEgZmlsZSwKLSAgKiB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZAotICAqIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0gICogPGxpPjxjb2RlPkRPTlRfT1ZFUldSSVRFPC9jb2RlPiAtCi0gICogSWYgYW55IHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuCi0gICogPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cywKLSAgKiB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZAotICAqIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0gICogPC91bD4KLSAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAqIEByZXR1cm4gVGhlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBJRmlsZX0KLSAgKiBoYW5kbGUgb2YgdGhlIGZpbGUuCi0gICogQHRocm93cyBDb3JlRXhjZXB0aW9uIEFuIGV4Y2VwdGlvbiBjb250YWluaW5nIGFuCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0gICogd2l0aCBhIHNldmVyaXR5IG9mIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+IGFuZCBhCi0gICogbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJRmlsZSBjcmVhdGVGaWxlICgKLSAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotICAgIElQcm9qZWN0ICAgICAgICBwcm9qZWN0LAotICAgIElQYXRoICAgICAgICAgICByZWxhdGl2ZVBhdGgsCi0gICAgSW5wdXRTdHJlYW0gICAgIGlucHV0U3RyZWFtLAotICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0gICAgU3RhdHVzSGFuZGxlciAgIHN0YXR1c01vbml0b3IgKQotIAotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICB7Ci0gICAgSVBhdGggYWJzb2x1dGVQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZChyZWxhdGl2ZVBhdGgpOwotICAgIHJldHVybiBjcmVhdGVGaWxlKHJlc291cmNlQ29udGV4dCwgYWJzb2x1dGVQYXRoLCBpbnB1dFN0cmVhbSwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLSAgfQotCi0gIC8qKgotICAqIENyZWF0ZXMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIHRvIHRoZQotICAqIGdpdmVuIDxjb2RlPmZpbGU8L2NvZGU+LiBBY3R1YWwgY2hhbmdlcyB0byB0aGUgd29ya3NwYWNlCi0gICogbWF5IG9jY3VyIGR1cmluZyBjcmVhdGlvbiBvZiB0aGUgc3RyZWFtLCB3aGlsZSB3cml0aW5nIHRvCi0gICogdGhlIHN0cmVhbSwgb3Igd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KLSAgKiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcKLSAgKiBhbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiB3aWxsIGJlIHRocm93bgotICAqIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3RyZWFtCi0gICogaWYgdGhlIGZpbGUgcmVzb3VyY2UgY2Fubm90IGJlIGNyZWF0ZWQuCi0gICogQHBhcmFtIGZpbGUgVGhlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBJRmlsZX0KLSAgKiBoYW5kbGUgb2YgdGhlIGZpbGUgcmVzb3VyY2UgdG8gY3JlYXRlLiBUaGUgcHJvamVjdCBpbXBsaWVkIGJ5IHRoZQotICAqIHBhdGhuYW1lIG9mIHRoZSBmaWxlIG11c3QgYWxyZWFkeSBleGlzdCwKLSAgKiB0aGF0IGlzLCB0aGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgcHJvamVjdHMuCi0gICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgKiBAcmV0dXJuIEFuIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4gdGllZCB0byB0aGUgZmlsZSByZXNvdXJjZS4KLSAgKiBBY3R1YWwgY2hlY2tzIG9mIG9yIGNoYW5nZXMgdG8gdGhlIHdvcmtzcGFjZSBtYXkgb2NjdXIgYXMgZWFybHkgZHVyaW5nCi0gICogc3RyZWFtIGNyZWF0aW9uLCBjbG9zdXJlLCBvciBhbnkgdGltZSBpbiBiZXR3ZWVuLgotICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAqIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0gICogUmVhc29ucyBpbmNsdWRlOgotICAqIDxvbD4KLSAgKiA8bGk+VGhlIHByb2plY3Qgb2YgdGhlIGdpdmVuIGZpbGUncyBwYXRoIGRvZXMgbm90IGV4aXN0LgotICAqIDxsaT5BIG5vbi1maWxlIHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUKLSAgKiBhbHJlYWR5IGV4aXN0cy4KLSAgKiA8bGk+QSBmaWxlIHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUKLSAgKiBhbHJlYWR5IGV4aXN0cywgYW5kIDxjb2RlPm92ZXJ3cml0ZUZpbGU8L2NvZGU+IGlzIGZhbHNlLgotICAqIDxsaT5PbmUgb3IgbW9yZSBpbnRlcm1lZGlhdGUgZm9sZGVycyB0byB0aGUgZ2l2ZW4gZmlsZQotICAqIGRvIG5vdCBleGlzdCwgYW5kIDxjb2RlPmNyZWF0ZUZvbGRlcnM8L2NvZGU+IGlzIGZhbHNlLgotICAqIDwvb2w+Ci0gICovCi0KLSAgcHVibGljIHN0YXRpYyBPdXRwdXRTdHJlYW0gbmV3RmlsZU91dHB1dFN0cmVhbSAoCi0gICAgICAgUmVzb3VyY2VDb250ZXh0IGNvbnRleHQsCi0gICAgICAgSVBhdGggICAgICAgICAgIGZpbGUsCi0gICAgICAgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLSAgICAgICBTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0gCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVSZXNvdXJjZU91dHB1dFN0cmVhbShjb250ZXh0LCBmaWxlLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c0hhbmRsZXIpOwotICB9Ci0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIE5hdWdodHkgYml0cy4uLgotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLwotICAvLyBDcmVhdGVzIGEgcGF0aCBvZiBmb2xkZXJzLgotICAvLyBEbyBub3QgY2FsbCB3aXRoIGFuIGFic29sdXRlUGF0aCBvZiBsZXNzIHRoYW4gb25lIHNlZ21lbnQuCi0gIC8vCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgcGF0aCBvZiBmb2xkZXJzLgotICAgKiBEbyBub3QgY2FsbCB3aXRoIGFuIGFic29sdXRlUGF0aCBvZiBsZXNzIHRoYW4gb25lIHNlZ21lbnQuCi0gICAqIEBwYXJhbSByZXNvdXJjZUNvbnRleHQgdGhlIHJlc291cmNlIGNvbnRleHQgZm9yIG1ha2luZyBmb2xkZXJzLgotICAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIHRoZSBwYXRoIG9mIGZvbGRlcnMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuCi0gICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZC4KLSAgICogQHBhcmFtIHN0YXR1c0hhbmRsZXIgdGhlIHN0YXR1cyBoYW5kbGVyLgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIElDb250YWluZXIgb2YgdGhlIGNyZWF0ZWQgZm9sZGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIG1ha2VGb2xkZXJQYXRoICgKLSAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotICAgIElQYXRoIGFic29sdXRlUGF0aCwKLSAgICBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotICAgIFN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciApCi0gIAotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoYWJzb2x1dGVQYXRoLnNlZ21lbnRDb3VudCgpIDw9IDEpCi0gICAgewotICAgICAgcmV0dXJuIGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGFic29sdXRlUGF0aC5zZWdtZW50KDApKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIElDb250YWluZXIgcGFyZW50ID0gbWFrZUZvbGRlclBhdGgocmVzb3VyY2VDb250ZXh0LCBhYnNvbHV0ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c0hhbmRsZXIgKTsKLSAgICAgIFN0cmluZyBmb2xkZXJOYW1lID0gYWJzb2x1dGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBtYWtlRm9sZGVyKHJlc291cmNlQ29udGV4dCwgcGFyZW50LGZvbGRlck5hbWUsIHByb2dyZXNzTW9uaXRvciAsIHN0YXR1c0hhbmRsZXIgKTsKLSAgICB9Ci0gIH0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhIGZvbGRlciB1bmRlciBhIGNvbnRhaW5lci4KLSAgLy8gVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0gIC8vCi0gcHJpdmF0ZSBzdGF0aWMgSUZvbGRlciBtYWtlRm9sZGVyICgKLSAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotICAgIElDb250YWluZXIgICAgICBwYXJlbnQsCi0gICAgU3RyaW5nICAgICAgICAgIGZvbGRlck5hbWUsCi0gICAgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLSAgICBTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0gIAotICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIGNoaWxkICA9IHBhcmVudC5maW5kTWVtYmVyKGZvbGRlck5hbWUpOwotICAgIENob2ljZSAgICByZXN1bHQgPSBudWxsOwotICAgIAotICAgIGlmKCBjaGlsZCA9PSBudWxsICkKLSAgICB7Ci0gICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCkpICAKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3RhdHVzSGFuZGxlci5yZXBvcnQoCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIlJlc291cmNlVXRpbHMiLAotICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0ZPTERFUl9DUkVBVElPTl9ESVNBQkxFRCIsCi0gICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBmb2xkZXJOYW1lfSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cy5XQVJOSU5HLCBudWxsICksIAotICAgICAgICAgICAgICAgIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggcmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmdldFNob3J0Y3V0KCkgPT0gJ0MnICkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHJlc3VsdC5nZXRTaG9ydGN1dCgpID09ICdBJyApCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgSUZvbGRlciBmb2xkZXIgPSBwYXJlbnQuZ2V0Rm9sZGVyKG5ldyBQYXRoKGZvbGRlck5hbWUpKTsKLSAgICAgIGZvbGRlci5jcmVhdGUodHJ1ZSx0cnVlLG51bGwpOwotICAgICAgcmV0dXJuIGZvbGRlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiggY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgKQotICAgIHsKLSAgICAgIHJldHVybiAoSUZvbGRlciljaGlsZDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAKLSAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlVXRpbHMiLAotICAgICAgICAgICAgICAgICAgICAwLCAKLQkJCQkJbXNnXy5nZXRNZXNzYWdlKCAiTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GT0xERVIiLAotCQkJCQkgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgcGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZvbGRlck5hbWUpLnRvU3RyaW5nKCkgfSksCi0JCQludWxsICkgKTsKLSAgICB9Ci0gIH0KLQotICAvLwotICAvLyBDcmVhdGVzIGEgZmlsZSB1bmRlciBhIGNvbnRhaW5lci4KLSAgLy8gVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0gIC8vCi0gcHJpdmF0ZSBzdGF0aWMgSUZpbGUgbWFrZUZpbGUgKAotICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0gICAgSUNvbnRhaW5lciAgICAgIHBhcmVudCwKLSAgICBTdHJpbmcgICAgICAgICAgZmlsZU5hbWUsCi0gICAgSW5wdXRTdHJlYW0gICAgIGlucHV0U3RyZWFtLAotICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0gICAgU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIgKQotIAotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgY2hpbGQgID0gcGFyZW50LmZpbmRNZW1iZXIoZmlsZU5hbWUpOwotICAgIENob2ljZSAgICByZXN1bHQgPSBudWxsOwotICAgIAotICAgIGlmKCBjaGlsZCAhPSBudWxsICkKLSAgICB7Ci0gICAgICBpZiggY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICkKLSAgICAgIHsKLSAgICAgICAgaWYoICFyZXNvdXJjZUNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSApICAgCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBzdGF0dXNIYW5kbGVyLnJlcG9ydCggCi0gICAgICAgICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIlJlc291cmNlVXRpbHMiLAotICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX0VSUk9SX0ZJTEVfT1ZFUldSSVRFX0RJU0FCTEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmaWxlTmFtZX0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cy5XQVJOSU5HICksCi0JCQkJCSAgCQkgICAgCi0gICAgICAgICAgICAgICAgZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkgKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiggcmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmdldFNob3J0Y3V0KCkgPT0gJ0MnICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiggcmVzdWx0LmdldFNob3J0Y3V0KCkgPT0gJ0EnICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQkKLSAgICAgICAgCi0gICAgICAgIC8vV2UgaGF2ZSBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSBzbyBjaGVjayBpZiBmaWxlIGlzIHJlYWQtb25seQotICAgICAgICBpZiggY2hpbGQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuaXNSZWFkT25seSgpICkKLSAgICAgICAgewotICAgICAgICAgIGlmKCAhcmVzb3VyY2VDb250ZXh0LmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSApIAotICAgICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIHJlc3VsdCA9IHN0YXR1c0hhbmRsZXIucmVwb3J0KCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiUmVzb3VyY2VVdGlscyIsCi0gICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX0VSUk9SX0ZJTEVfQ0hFQ0tPVVRfRElTQUJMRUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLGZpbGVOYW1lfSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cy5XQVJOSU5HICksIAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpICk7Ci0gICAgICAgICAgICAKLQkJICAgIGlmKCByZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQuZ2V0U2hvcnRjdXQoKSA9PSAnQycgKQotCQkgICAgewotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQkJICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHJlc3VsdC5nZXRTaG9ydGN1dCgpID09ICdBJyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc291cmNlQ29udGV4dC5zZXRDaGVja291dEZpbGVzRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotICAgICAgICAgIGZpbGVzWzBdID0gKElGaWxlKWNoaWxkOwotICAgICAgICAgIAotICAgICAgICAgIElTdGF0dXMgICAgICBzdGF0dXMgPSBnZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsbnVsbCk7Ci0gICAgICAgICAgU2ltcGxlU3RhdHVzIHNzICAgICA9IG5ldyBTaW1wbGVTdGF0dXMoIHN0YXR1cy5nZXRQbHVnaW4oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5nZXRTZXZlcml0eSgpLCAKLQkJCQkJCQkJCQkJCSAgc3RhdHVzLmdldEV4Y2VwdGlvbigpICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzSGFuZGxlci5yZXBvcnQoIHNzICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKCBTdGF0dXNFeGNlcHRpb24gZXhjICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL0NoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIGV4aXN0aW5nIGZpbGUuCi0gICAgICAgIElGaWxlIGZpbGUgPSBwYXJlbnQuZ2V0RmlsZSggbmV3IFBhdGgoZmlsZU5hbWUpICk7Ci0gICAgICAgIGZpbGUuc2V0Q29udGVudHMoIGlucHV0U3RyZWFtLCB0cnVlLCB0cnVlLCBudWxsICk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbiggCi0gICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VVdGlscyIsCi0gICAgICAgICAgICAgICAgICAgICAgMCwgCi0JCQkJICAgICAgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFIiwKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZpbGVOYW1lKX0pLAotCQkJCQkgIG51bGwgKSApOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9DcmVhdGUgYSBuZXcgZmlsZS4KLSAgICAgIElGaWxlIGZpbGUgPSBwYXJlbnQuZ2V0RmlsZSggbmV3IFBhdGgoZmlsZU5hbWUpICk7Ci0gICAgICBmaWxlLmNyZWF0ZSggaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOwotICAgICAgCi0gICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL1N0cmluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9TdHJpbmdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWZhYzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL1N0cmluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gICogVGhpcyBjbGFzcyBjb250YWlucyBzb21lIHVzZWZ1bCBzdHJpbmcgdXRpbGl0aWVzIHRoYXQgYXJlIG5vdCBwcm92aWRlZCBieQotICAqIGVpdGhlciBTdHJpbmcgb3IgU3RyaW5nQnVmZmVyLgotICAqCi0gICogQGF1dGhvciBQZXRlciBNb29nawotICAqIEBkYXRlICAgSnVseSAxMywgMjAwMAotKiovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nVXRpbHMKLXsKLSAgLyoqCi0gICogVGhlIHBsYXRmb3JtLXNwZWNpZmljIGxpbmUgc2VwYXJhdG9yLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0gIHByaXZhdGUgU3RyaW5nVXRpbHMoKXt9OwotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2Qgc3BsaXRzIGEgc2luZ2xlIGxpbmUgb2YgdGV4dCBpbnRvIG11bHRpcGxlIGxpbmVzCi0gICAgKiBiYXNlZCBvbiBhIG1heGltdW0gbGluZSBsZW5ndGguICBUaGUgbWV0aG9kIHdpbGwgdHJ5IHRvIGZpdCBhcwotICAgICogbWFueSB3b3JkcyBhcyBwb3NzaWJsZSBvbnRvIGEgbGluZSB3aXRob3V0IGV4Y2VlZGluZyB0aGUgbWF4aW11bQotICAgICogbGluZSBsZW5ndGguICBOb3RlOiB0aGUgb25seSBjYXNlIHdoZXJlIGEgbGluZSBtaWdodCBleGNlZWQgdGhlCi0gICAgKiBtYXhpbXVtIGlzIGlmIGEgc2luZ2xlIHdvcmQgaXMgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0uCi0gICAgKiBAcGFyYW0gdGV4dCBhIHNpbmdsZSBsaW5lIGEgdGV4dCB0aGF0IGlzIHRvIGJlIHNwbGl0LgotICAgICogQHBhcmFtIG1heF9sZW5ndGggdGhlIG1heGltdW0gbGVuZ3RoIG9mIGVhY2ggc3BsaXQgbGluZS4KLSAgICAqIEByZXR1cm4gYSBzdHJpbmcgYXJyYXkgb2YgdGhlIHNwbGl0IGxpbmVzLgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzcGxpdHRlciggU3RyaW5nIHRleHQsIGludCBtYXhfbGVuZ3RoICkKLSAgewotICAgIFZlY3RvciAgICAgICAgICByZXR1cm5fdGV4dCA9IG5ldyBWZWN0b3IoMjApOwotICAgIFN0cmluZ1tdICAgICAgICByZXR1cm5fc3RyOwotICAgIGludCAgICAgICAgICAgICBpbmRleCA9IDA7Ci0KLSAgICB3aGlsZSggaW5kZXggPCB0ZXh0Lmxlbmd0aCgpICkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gdGV4dC5zdWJzdHJpbmcoIGluZGV4LCBNYXRoLm1pbiggbWF4X2xlbmd0aCArIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQubGVuZ3RoKCkgKSApOwotICAgICAgaW50IHNwYWNlX2luZGV4ID0gc3RyLmxhc3RJbmRleE9mKCAiICIgKTsKLQotICAgICAgaWYoIGluZGV4ICsgc3RyLmxlbmd0aCgpIDwgdGV4dC5sZW5ndGgoKSAmJgotICAgICAgICAgIHRleHQuY2hhckF0KCBpbmRleCArIHN0ci5sZW5ndGgoKSAtIDEgKSAhPSAnICcgJiYKLSAgICAgICAgICB0ZXh0LmNoYXJBdCggaW5kZXggKyBzdHIubGVuZ3RoKCkgKSAhPSAnICcgJiYKLSAgICAgICAgICBzcGFjZV9pbmRleCAhPSAtMSApCi0gICAgICB7Ci0gICAgICAgIHJldHVybl90ZXh0LmFkZEVsZW1lbnQoIHN0ci5zdWJzdHJpbmcoIDAsIHNwYWNlX2luZGV4ICkgKTsKLSAgICAgICAgaW5kZXggKz0gc3BhY2VfaW5kZXggKyAxOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm5fdGV4dC5hZGRFbGVtZW50KCBzdHIudHJpbSgpICk7Ci0gICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm5fc3RyID0gbmV3IFN0cmluZ1tyZXR1cm5fdGV4dC5zaXplKCldOwotCi0gICAgZm9yKCBpbmRleCA9IDA7IGluZGV4IDwgcmV0dXJuX3RleHQuc2l6ZSgpOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICByZXR1cm5fc3RyW2luZGV4XSA9IChTdHJpbmcpKHJldHVybl90ZXh0LmVsZW1lbnRBdChpbmRleCkpOwotICAgIH0KLQotICAgIHJldHVybiByZXR1cm5fc3RyOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIHdpdGggYSByZXBlYXRlZCBudW1iZXIgb2YgY2hhcmFjdGVycy4KLSAgICAqIEBwYXJhbSB0aGVfY2hhciB0aGUgY2hhcmFjdGVyIHRvIGJlIHJlcGVhdGVkLgotICAgICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgdGltZSB0aGlzIGNoYXJhY3RlciBzaG91bGQgYmUgcmVwZWF0ZWQuCi0gICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9mIHJlcGVhdGVkIGNoYXJhY3RlcnMuCi0gICoqLwotICBzdGF0aWMgcHVibGljIFN0cmluZyByZXBlYXQoIGNoYXIgdGhlX2NoYXIsIGludCBjb3VudCApCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlciggY291bnQgKTsKLQotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKyApCi0gICAgewotICAgICAgYnVmLmFwcGVuZCggdGhlX2NoYXIgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIGZsYXR0ZW5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBhIHN0cmluZy4KLSAgICAqIFRoZSBtZXRob2QgcmVzcGVjdHMgZW1iZWRkZWQgd2hpdGVzcGFjZSBhbmQgcXVvdGVzLgotICAgICogPHVsPgotICAgICogPGxpPkFueSBhcmd1bWVudCB3aXRoIGVtYmVkZGVkIHdoaXRlc3BhY2Ugd2lsbCBiZSBmbGF0dGVuZWQgb3V0Ci0gICAgKiB3aXRoIGVuY2xvc2luZyBxdW90ZXMuIEZvciBleGFtcGxlLCB0aGUgc2luZ2xlIGFyZ3VtZW50Ci0gICAgKiA8dT5IZWxsbyBXb3JsZDwvdT4KLSAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMKLSAgICAqIDx1PiJIZWxsbyBXb3JsZCI8L3U+LgotICAgICogPGxpPkFueSBhcmd1bWVudCB3aXRoIHF1b3RlcyB3aWxsIGJlIGZsYXR0ZW5lZCBvdXQgd2l0aCB0aGUKLSAgICAqIHF1b3RlcyBlc2NhcGVkLiBGb3IgZXhhbXBsZSwgdGhlIHNpbmdsZSBhcmd1bWVudAotICAgICogPHU+IkhhcHB5IGRheXMiPC91PgotICAgICogd2lsbCBiZSByZXR1cm5lZCBhcwotICAgICogPHU+XCJIYXBweSBkYXlzXCI8L3U+LgotICAgICogPC91bD4KLSAgICAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGFycmF5IG9mIHN0cmluZ3MgdG8gZmxhdHRlbi4KLSAgICAqIEByZXR1cm4gdGhlIGZsYXR0ZW5lZCBzdHJpbmcuCi0gICovCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGZsYXR0ZW5Bcmd1bWVudHMgKCBTdHJpbmdbXSBhcmd1bWVudHMgKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIGZvciAoaW50IGk9MDsgaTxhcmd1bWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCBhIHNlcGFyYXRvciAoZXhjZXB0IHRoZSBmaXJzdCB0aW1lKS4KLSAgICAgIC8vCi0gICAgICBpZiAoaSA+IDApIGJ1Zi5hcHBlbmQoJyAnKTsKLQotICAgICAgLy8KLSAgICAgIC8vIExvb2sgZm9yIHdoaXRlc3BhY2UuCi0gICAgICAvLwotICAgICAgYm9vbGVhbiB3aGl0ZXNwYWNlID0gZmFsc2U7Ci0gICAgICBjaGFyW10gY2hhcnMgPSBhcmd1bWVudHNbaV0udG9DaGFyQXJyYXkoKTsKLSAgICAgIGZvciAoaW50IGo9MDsgIXdoaXRlc3BhY2UgJiYgajxjaGFycy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhcnNbal0pKQotICAgICAgICB7Ci0gICAgICAgICAgd2hpdGVzcGFjZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCB0aGUgYXJndW1lbnQsIHF1b3RlZCBhcyBuZWNlc3NhcnkuCi0gICAgICAvLwotICAgICAgaWYgKHdoaXRlc3BhY2UpIGJ1Zi5hcHBlbmQoJyInKTsKLSAgICAgIGZvciAoaW50IGo9MDsgajxjaGFycy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoYXJzW2pdID09ICciJykgYnVmLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgYnVmLmFwcGVuZChjaGFyc1tqXSk7Ci0gICAgICB9Ci0gICAgICBpZiAod2hpdGVzcGFjZSkgYnVmLmFwcGVuZCgnIicpOwotICAgIH0KLQotICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2QgcGFyc2VzIHdoaXRlc3BhY2UtZGVsaW1pdHRlZCBmaWxlbmFtZXMgZnJvbQotICAgICogdGhlIGdpdmVuIDxjb2RlPmlucHV0PC9jb2RlPiBzdHJlYW0uIDxiPkxpbWl0YXRpb246PC9iPgotICAgICogUXVvdGVkIGZpbGVuYW1lcyBvciBmaWxlbmFtZXMgd2l0aCBlbWJlZGRlZCB3aGl0ZXNwYWNlCi0gICAgKiBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCi0gICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IHN0cmVhbS4KLSAgICAqIEByZXR1cm4gQW4gZW51bWVyYXRpb24gb2YgZmlsZW5hbWVzIGZyb20gdGhlIHN0cmVhbS4KLSAgKi8KLSAgc3RhdGljIHB1YmxpYyBFbnVtZXJhdGlvbiBwYXJzZUZpbGVuYW1lc0Zyb21TdHJlYW0gKCBJbnB1dFN0cmVhbSBpbnB1dCApCi0gIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgVmVjdG9yIGZpbGVuYW1lcyA9IG5ldyBWZWN0b3IoNjQsNjQpOwotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotICAgIGJ5dGUgc3RhdGUgPSBTVEFURV9XUzsKLSAgICBpbnQgaWMgPSBpbnB1dC5yZWFkKCk7Ci0gICAgd2hpbGUgKGljID49IDApCi0gICAgewotICAgICAgY2hhciBjID0gKGNoYXIpaWM7Ci0gICAgICBzd2l0Y2ggKHN0YXRlKQotICAgICAgewotICAgICAgICBjYXNlIFNUQVRFX1dTOgotICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGMpOwotICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9OV1M7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX05XUzoKLSAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCi0gICAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICAgICAgZmlsZW5hbWVzLmFkZChmaWxlbmFtZSk7Ci0gICAgICAgICAgICBidWZmZXIgPSBudWxsOwotICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9XUzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpYyA9IGlucHV0LnJlYWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGVuYW1lcy5lbGVtZW50cygpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTVEFURV9XUyA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU1RBVEVfTldTID0gMTsKLQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpcyB0aGUgdHlwZSBwYXNzZWQgaW4gaXMgYSBwcmltdGl2ZSBqYXZhIHR5cGUKLSAgKiBAcGFyYW0gY2xhc3MgbmFtZSBTdHJpbmcKLSAgKiBAcmV0dXJuIHRydWUgaXMgcHJpbWl0aXZlIHR5cGUKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZU5hbWUpIAotICB7Ci0KLSAgICBpZiAodHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYm9vbGVhbiIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJieXRlIikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImRvdWJsZSIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJmbG9hdCIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpbnQiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgibG9uZyIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzaG9ydCIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJjaGFyIikpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgfQotCi0gIC8qKgotICAqIFRoZSBtZXRob2QgcmVwbGFjZSB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGxvd2VkIGluIFVSSXMKLSAgKiBhbmQgbm90IGFsbG93ZWQgaW4gSmF2YSBjbGFzcyBuYW1lcyB0byBhbiB1bmRlcnNjb3JlICgnXycpCi0gICogQHBhcmFtIFVSSSBTdHJpbmcKLSAgKiBAcmV0dXJuIHZhbGlkIEphdmEgY2xhc3MgbmFtZSBTdHJpbmcKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJMkNsYXNzTmFtZSggU3RyaW5nIHVyaSApIHsKLSAgICBTdHJpbmcgY2xhc3NOYW1lID0gdXJpOwotICAgIGZvciAoIGludCBpID0gMDsgaSA8IFVSSV9TWU1CT0xTLmxlbmd0aDsgaSsrICkgewotICAgIAljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSAoIFVSSV9TWU1CT0xTW2ldLCBVTkRFUlNDT1JFICk7Ci0gICAgfQotICAgIHJldHVybiBjbGFzc05hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgYXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdHJhY2ViYWNrIGluZm9ybWF0aW9uIG9mCi0gICAqIGEgVGhyb3dhYmxlLiAgVGhpcyBpcyB0aGUgc2FtZSB0cmFjZWJhY2sgZGF0YSB0aGF0IGlzIGRpc3BsYXllZCBieSBleGMucHJpbnRTdGFja1RyYWNlKCkuCi0gICAqIEBwYXJhbSBleGMgdGhlIGV4Y2VwdGlvbgotICAgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IG9mIHRoZSB0cmFjZWJhY2sgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFN0YWNrVHJhY2UoIFRocm93YWJsZSBleGMgKQotICB7Ci0gICAgVmVjdG9yICAgICAgIGxpbmVzICAgICAgICA9IG5ldyBWZWN0b3IoKTsKLSAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyICBwcmludFdyaXRlciAgPSBuZXcgUHJpbnRXcml0ZXIoIHN0cmluZ1dyaXRlciApOwotICAgIAotICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoIHByaW50V3JpdGVyICk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgcHJpbnRXcml0ZXIuY2xvc2UoKTsKLSAgICAgIHN0cmluZ1dyaXRlci5jbG9zZSgpOwotICAgIH0KLSAgICBjYXRjaCggRXhjZXB0aW9uIG5lc3RlZEV4YyApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgfQotICAgIAotICAgIFN0cmluZ1JlYWRlciBzdHJpbmdSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSApOwotICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciAgICAgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIHN0cmluZ1JlYWRlciApOwotICAgIFN0cmluZyAgICAgICAgIGxpbmUgICAgICAgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAKLSAgICAgIHdoaWxlKCBsaW5lICE9IG51bGwgKQotICAgICAgewotICAgICAgICBsaW5lcy5hZGQoIGxpbmUudHJpbSgpICk7Ci0gICAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIEV4Y2VwdGlvbiBuZXN0ZWRFeGMgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKWxpbmVzLnRvQXJyYXkoIG5ldyBTdHJpbmdbMF0gKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFVSSV9TWU1CT0xTID0geyctJywgJ34nLCAnIycsICcvJywgJy4nfTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBVTkRFUlNDT1JFID0gJ18nOwotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEZWxpbWl0ZXIoY2hhciBjaGFyYWN0ZXIpCi0gIHsKLSAgICByZXR1cm4gIlx1MDAyRFx1MDAyRVx1MDAzQVx1MDA1Rlx1MDBCN1x1MDM4N1x1MDZERFx1MDZERSIuaW5kZXhPZihjaGFyYWN0ZXIpICE9IC0xOwotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL1dhaXRGb3JBdXRvQnVpbGRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9XYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTMxZjFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL1dhaXRGb3JBdXRvQnVpbGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgV2FpdEZvckF1dG9CdWlsZENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgCi0gIHsKLSAgCVNpbXBsZVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAJCi0JdHJ5IAotCXsKLQkgIFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0JfSAKLQljYXRjaCggSW50ZXJydXB0ZWRFeGNlcHRpb24gZXhjICkgCi0JewotCSAgLy8gVUlTeW5jaHJvbml6ZXIuc3luY0V4ZWMgc2VlbXMgdG8gaW50ZXJydXB0IHRoZSBVSSB0cmVhZCB3aGVuIHRoZSBhdXRvYnVpbGRlciBpcyBkb25lLiAgTm90IHN1cmUsIHdoeS4KLQkgIC8vIEknbSBhc3N1bWluZyBoZXJlIHRoYXQgdGhlIGF1dG9idWlsZGVyIGhhcyBhY3R1YWxseSBjb21wbGV0ZWQgaXRzIHN0dWZmLgkKLQl9Ci0JCQotCXJldHVybiBzdGF0dXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL2Vudmlyb25tZW50LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzE2MGIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL2Vudmlyb25tZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGZvciBFY2xpcHNlU2NoZW1lCi0jCi1NU0dfSU5WQUxJRF9QTEFURk9STV9VUkw9SW52YWxpZCBVUkw6IHswfSBmb3IgYW4gRWNsaXBzZSBwbGF0Zm9ybS4KLQotIwotIyBNZXNzYWdlcyBmb3IgUmVzb3VjZVV0aWxzCi0jCi1NU0dfRVJST1JfUEFUSF9OT1RfQUJTT0xVVEU9SVdBQjAwMDNFIFBhdGggezB9IGlzIG5vdCBhYnNvbHV0ZSBmb3IgY3JlYXRpbmcgYSBmaWxlLgotTVNHX0VSUk9SX1BBVEhfRU1QVFk9SVdBQjAwMDRFIFBhdGggezB9IGlzIGVtcHR5IHdoaWxlIGNyZWF0aW5nIGEgZmlsZS4KLU1TR19FUlJPUl9QQVRIX05PVF9GT0xERVI9SVdBQjAwMDVFIFBhdGggezB9IGlzIG5vdCBhIGZvbGRlciBmb3IgY3JlYXRpbmcgYSBmaWxlLgotTVNHX0VSUk9SX0ZPTERFUl9DUkVBVElPTl9ESVNBQkxFRD1JV0FCMDAwN0UgRm9sZGVyIGNyZWF0aW9uIGhhcyBiZWVuIGRpc2FibGVkIGZvciBwYXJlbnQgZm9sZGVyIHswfSBhbmQgY2hpbGQgezF9LgotTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GT0xERVI9SVdBQjAwMDhFIFJlc291cmNlIHswfSBpcyBub3QgYSBmb2xkZXIuCi1NU0dfV0FSTl9GSUxFX09WRVJXUklURV9ESVNBQkxFRD1JV0FCMDAwOVcgQ2FuIG5vdCBvdmVyd3JpdGUgZmlsZSB7MX0gaW4gZm9sZGVyIHswfS4KLU1TR19FUlJPUl9GSUxFX0NIRUNLT1VUX0RJU0FCTEVEPUlXQUIwMDEwRSBDYW4gbm90IGNoZWNrb3V0IGZpbGUgezF9IGluIGZvbGRlciB7MH0uCi1NU0dfRVJST1JfUkVTT1VSQ0VfTk9UX0ZJTEU9SVdBQjAwMTFFIFRoZSBmb2xsb3dpbmcgcGF0aCBpcyBub3QgYSByZXNvdXJjZTogezB9LgotTVNHX0VSUk9SX0ZPTERFUl9IQVNfQ0hJTERSRU49SVdBQjAwMTJFIENhbiBub3QgY3JlYXRlIGZvbGRlcjogezB9IHRoYXQgYWxyZWFkeSBoYXMgY2hpbGRyZW4uCi1NU0dfRVJST1JfSU89SVdBQjAwMDZFIEFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZXNvdXJjZSAiezB9Ii4KLU1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRD1JV0FCMDE2NEUgQ2Fubm90IGNyZWF0ZSB0aGUgZmlsZSAiezF9IiByZWxhdGl2ZSB0byB0aGUgcGF0aCAiezB9IiBiZWNhdXNlIGF1dG9tYXRpYyBmaWxlIG92ZXJ3cml0aW5nIGhhcyBub3QgYmVlbiBlbmFibGVkLiBEbyB5b3Ugd2FudCB0byBlbmFibGUgaXQgZm9yIHRoaXMgZmlsZT8KLU1TR19FUlJPUl9GSUxFX0NIRUNLT1VUX0RJU0FCTEVEPUlXQUIwMDYxRSBDYW5ub3QgY3JlYXRlIHRoZSBmaWxlICJ7MX0iIHJlbGF0aXZlIHRvIHRoZSBwYXRoICJ7MH0iIGJlY2F1c2UgYXV0b21hdGljIGZpbGUgY2hlY2sgb3V0IGhhcyBub3QgYmVlbiBlbmFibGVkLiBEbyB5b3Ugd2FudCB0byBlbmFibGUgaXQgZm9yIHRoaXMgZmlsZT8KLQotTEFCRUxfWUVTPVllcwotTEFCRUxfWUVTX1RPX0FMTD1ZZXMgQWxsCi1MQUJFTF9DQU5DRUw9Q2FuY2VsCi0KLVRJVExFX1dBUk5JTkc9V2FybmluZzoKLVRJVExFX0VSUk9SPUVycm9yOgotVElUTEVfSU5GTz1JbmZvOgotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb250ZXh0L1BlcnNpc3RlbnRDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbnRleHQvUGVyc2lzdGVudENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkODEzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbnRleHQvUGVyc2lzdGVudENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5Db250ZXh0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgdHlwZXMgdGhhdCB3aGF0IHRvIHBlcnNpc3QgcHJlZmVyZW5jZQotICogZGF0YSBpbiB0aGUgcGx1Z2luIHByZWZlcmVuY2VzIGFyZWEuCi0gKgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbnRDb250ZXh0IGltcGxlbWVudHMgQ29udGV4dAotewotIHByb3RlY3RlZCBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlc187Ci0gcHJvdGVjdGVkIFBsdWdpbiBwbHVnaW5fOwotCi0gcHVibGljIFBlcnNpc3RlbnRDb250ZXh0ICggUGx1Z2luIHBsdWdpbikKLSAJewotIAkJcGx1Z2luXyA9IHBsdWdpbjsKLSAJICAJcHJlZmVyZW5jZXNfID0gcGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gCX0KLQotIC8qKgotICAqIFNldHMgdGhlIGRlZmF1bHQgZm9yIGEgYm9vbGVhbiBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldERlZmF1bHQgKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0gCXByZWZlcmVuY2VzXy5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLSAJfQotIAotIC8qKgotICAqIFNldHMgdGhlIGRlZmF1bHQgZm9yIGEgc3RyaW5nIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0RGVmYXVsdCAoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotIAlwcmVmZXJlbmNlc18uc2V0RGVmYXVsdChuYW1lLHZhbHVlKTsKLSAJfQotIAotIC8qKgotICAqIFNldHMgdGhlIGRlZmF1bHQgZm9yIGEgaW50IHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0RGVmYXVsdCAoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotIAlwcmVmZXJlbmNlc18uc2V0RGVmYXVsdChuYW1lLHZhbHVlKTsKLSAJfQotIAotIC8qKgotICAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHN0cmluZyBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldFZhbHVlIChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gCXByZWZlcmVuY2VzXy5zZXRWYWx1ZShuYW1lLHZhbHVlKTsKLSAJcGx1Z2luXy5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAJfQotIAotIC8qKgotICAqIFNldHMgdGhlIHZhbHVlIGZvciBhIGJvb2xlYW4gcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRWYWx1ZSAoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLSAJcHJlZmVyZW5jZXNfLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLSAJcGx1Z2luXy5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAJfQotIAotIC8qKgotICAqIFNldHMgdGhlIHZhbHVlIGZvciBhIGludCBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldFZhbHVlIChTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0gCXByZWZlcmVuY2VzXy5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gCXBsdWdpbl8uc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0gLyoqCi0gICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgc3RyaW5nIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZyAoIFN0cmluZyBuYW1lKSB7Ci0gCXJldHVybiBwcmVmZXJlbmNlc18uZ2V0U3RyaW5nKG5hbWUpOwotIAl9Ci0gCi0gLyoqCi0gICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgYm9vbGVhbiBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0VmFsdWVBc0Jvb2xlYW4gKCBTdHJpbmcgbmFtZSkgewotIAlyZXR1cm4gcHJlZmVyZW5jZXNfLmdldEJvb2xlYW4obmFtZSk7Ci0gCX0KLSAgCi0gIC8qKgotICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBpbnQgcHJlZmVyZW5jZS4KLSAgICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgICovCi0gcHVibGljIGludCBnZXRWYWx1ZUFzSW50KCBTdHJpbmcgbmFtZSkgewotIAkJcmV0dXJuIHByZWZlcmVuY2VzXy5nZXRJbnQobmFtZSk7Ci0gCX0KLSAKLSAvKioKLSAgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIHN0cmluZyBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHJldHVybiB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSkKLSB7Ci0gCXJldHVybiBwcmVmZXJlbmNlc18uZ2V0RGVmYXVsdFN0cmluZyhuYW1lKTsKLSB9Ci0gCi0gLyoqCi0gICogR2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBib29sZWFuIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEJvb2xlYW4oU3RyaW5nIG5hbWUpCi0gewotIAlyZXR1cm4gcHJlZmVyZW5jZXNfLmdldERlZmF1bHRCb29sZWFuKG5hbWUpOwotIH0KLSAKLSAvKioKLSAgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGludCBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHJldHVybiB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludChTdHJpbmcgbmFtZSkKLSB7Ci0gCXJldHVybiBwcmVmZXJlbmNlc18uZ2V0RGVmYXVsdEludChuYW1lKTsKLSB9Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBzdHJpbmcgcHJlZmVyZW5jZSBpZiBhIGRlZmF1bHQgdmFsdWUgaGFzCi0gICogbm90IGFscmVhZHkgYmVlbiBzZXQuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZQotICAqLwotIHB1YmxpYyB2b2lkIHNldERlZmF1bHRTdHJpbmdJZk5vRGVmYXVsdCggU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlICkKLSB7Ci0gICAvLyBJZiB0aGUga2V5IGFscmVhZHkgaGFzIGEgZGVmYXVsdCB2YWx1ZSB3ZSBkb24ndCB3YW50IHRvIG92ZXJyaWRlIGl0LgotICAgaWYoIHByZWZlcmVuY2VzXy5nZXREZWZhdWx0U3RyaW5nKCBrZXkgKS5lcXVhbHMoIiIpICkgCi0gICB7Ci0gICAgIHByZWZlcmVuY2VzXy5zZXREZWZhdWx0KCBrZXksIHZhbHVlICk7Ci0gICB9Ci0gfQotIAotIC8qKgotICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgYm9vbGVhbiBwcmVmZXJlbmNlIGlmIGEgZGVmYXVsdCB2YWx1ZSBoYXMKLSAgKiBub3QgYWxyZWFkeSBiZWVuIHNldC4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlCi0gICovCi0gcHVibGljIHZvaWQgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdCggU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSApCi0gewotICAgLy8gSWYgdGhlIGtleSBhbHJlYWR5IGhhcyBhIGRlZmF1bHQgdmFsdWUgd2UgZG9uJ3Qgd2FudCB0byBvdmVycmlkZSBpdC4KLSAgIGlmKCBwcmVmZXJlbmNlc18uZ2V0RGVmYXVsdFN0cmluZygga2V5ICkuZXF1YWxzKCIiKSApIAotICAgewotICAgICBwcmVmZXJlbmNlc18uc2V0RGVmYXVsdCgga2V5LCB2YWx1ZSApOwotICAgfQotIH0KLSAKLSAvKioKLSAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGludCBwcmVmZXJlbmNlIGlmIGEgZGVmYXVsdCB2YWx1ZSBoYXMKLSAgKiBub3QgYWxyZWFkeSBiZWVuIHNldC4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlCi0gICovCi0gcHVibGljIHZvaWQgc2V0RGVmYXVsdEludElmTm9EZWZhdWx0KCBTdHJpbmcga2V5LCBpbnQgdmFsdWUgKQotIHsKLSAgIC8vIElmIHRoZSBrZXkgYWxyZWFkeSBoYXMgYSBkZWZhdWx0IHZhbHVlIHdlIGRvbid0IHdhbnQgdG8gb3ZlcnJpZGUgaXQuCi0gICBpZiggcHJlZmVyZW5jZXNfLmdldERlZmF1bHRTdHJpbmcoIGtleSApLmVxdWFscygiIikgKSAKLSAgIHsKLSAgICAgcHJlZmVyZW5jZXNfLnNldERlZmF1bHQoIGtleSwgdmFsdWUgKTsKLSAgIH0KLSB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2VjbGlwc2UvQmFzZUVjbGlwc2VFbnZpcm9ubWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0Jhc2VFY2xpcHNlRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzYzA2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2VjbGlwc2UvQmFzZUVjbGlwc2VFbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFkZHMgcmVzb3VyY2VzIHRvIHRoZSBiYXNlIEVudmlyb25tZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VFY2xpcHNlRW52aXJvbm1lbnQgZXh0ZW5kcyBFbnZpcm9ubWVudCAKLXsKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYSBSZXNvdXJjZUNvbnRleHQgb2JqZWN0IGZvciB0aGlzIGVudmlyb25tZW50LgotICAgKi8JCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2VjbGlwc2UvQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjNzA4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2VjbGlwc2UvQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uSmF2YUNvbXBpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk51bGxTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlNpbXBsZVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLmZpbGUuRmlsZVNjaGVtZTsKLQotCi0vKioKLSAqICBUaGlzIGNsYXNzIGlzIGludGVuZGVkIGZvciB1c2UgaW4gYSBoZWFkbGVzcyBFY2xpcHNlIGVudmlyb25tZW50LiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zb2xlRWNsaXBzZUVudmlyb25tZW50IGltcGxlbWVudHMgQmFzZUVjbGlwc2VFbnZpcm9ubWVudAotewotCXByaXZhdGUgQ29tbWFuZE1hbmFnZXIgICBjb21tYW5kTWFuYWdlcl8gID0gbnVsbDsKLQlwcml2YXRlIFNpbXBsZVVSSUZhY3RvcnkgdXJpRmFjdG9yeV8gICAgICA9IG51bGw7Ci0JcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgIHJlc291cmNlQ29udGV4dF8gPSBudWxsOwotCXByaXZhdGUgUHJvZ3Jlc3NNb25pdG9yICBtb25pdG9yXyAgICAgICAgID0gbnVsbDsKLQlwcml2YXRlIFN0YXR1c0hhbmRsZXIgICAgc3RhdHVzSGFuZGxlcl8gICA9IG51bGw7Ci0JICAKLQlwdWJsaWMgQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudCggUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCApCi0JewotCSAgdGhpcyggbnVsbCwgcmVzb3VyY2VDb250ZXh0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBuZXcgTnVsbFN0YXR1c0hhbmRsZXIoKSApOwkKLQl9Ci0JCi0JcHVibGljIENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQoIENvbW1hbmRNYW5hZ2VyICBjb21tYW5kTWFuYWdlciwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JCQkgICAgCSAgICAgICAgICAgICAgICAgIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCQkgICAgICAgICAgICAgICAgICBTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0JewotCSAgY29tbWFuZE1hbmFnZXJfICA9IGNvbW1hbmRNYW5hZ2VyOwotCSAgcmVzb3VyY2VDb250ZXh0XyA9IHJlc291cmNlQ29udGV4dDsKLQkgIHVyaUZhY3RvcnlfICAgICAgPSBuZXcgU2ltcGxlVVJJRmFjdG9yeSgpOwotCSAgbW9uaXRvcl8gICAgICAgICA9IG1vbml0b3I7Ci0JICBzdGF0dXNIYW5kbGVyXyAgID0gc3RhdHVzSGFuZGxlcjsKLQkgICAgCi0JICB1cmlGYWN0b3J5Xy5yZWdpc3RlclNjaGVtZSggInBsYXRmb3JtIiwgbmV3IEVjbGlwc2VTY2hlbWUoIHRoaXMgKSApOwotCSAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJmaWxlIiwgbmV3IEZpbGVTY2hlbWUoKSApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlLkJhc2VFY2xpcHNlRW52aXJvbm1lbnQjZ2V0UmVzb3VyY2VDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpIAotCXsKLQkJcmV0dXJuIHJlc291cmNlQ29udGV4dF87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRDb21tYW5kTWFuYWdlcigpCi0JICovCi0JcHVibGljIENvbW1hbmRNYW5hZ2VyIGdldENvbW1hbmRNYW5hZ2VyKCkgCi0JewotCQlyZXR1cm4gY29tbWFuZE1hbmFnZXJfOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0SmF2YUNvbXBpbGVyKCkKLQkgKi8KLQlwdWJsaWMgSmF2YUNvbXBpbGVyIGdldEphdmFDb21waWxlcigpIAotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRMb2coKQotCSAqLwotCXB1YmxpYyBMb2cgZ2V0TG9nKCkgCi0JewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMb2coKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldFByb2dyZXNzTW9uaXRvcigpCi0JICovCi0JcHVibGljIFByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSAKLQl7Ci0JCXJldHVybiBtb25pdG9yXzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldFN0YXR1c0hhbmRsZXIoKQotCSAqLwotCXB1YmxpYyBTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIoKSAKLQl7Ci0JCXJldHVybiBzdGF0dXNIYW5kbGVyXzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldFVSSUZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBVUklGYWN0b3J5IGdldFVSSUZhY3RvcnkoKSAKLQl7Ci0JCXJldHVybiB1cmlGYWN0b3J5XzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2VjbGlwc2UvRWNsaXBzZUxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0VjbGlwc2VMb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhZmFiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2VjbGlwc2UvRWNsaXBzZUxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wbHVnaW4uRW52UGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxvZyBpbXBsZW1lbnRzIExvZyAKLXsKLS8vCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQlwdWJsaWMgRWNsaXBzZUxvZygpIHsKLQkJLyoKLQkJbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Iik7Ci0JCS8vIGxvZ2dlci5zZXRMb2dGaWxlTmFtZSgiZW52LmxvZyIpOwotCQlsb2dnZXIuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7IC8vIGxvZyBhbGwgbGV2ZWxzIGZvciBub3cKLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2lzRW5hYmxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gRW52UGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2lzRW5hYmxlZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChTdHJpbmcgb3B0aW9uKSB7Ci0JCXJldHVybiAidHJ1ZSIuZXF1YWxzKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvdHJhY2UvIgotCQkJCSsgb3B0aW9uKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZyNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsCi0JCQlTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCQotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCQljYXNlIExvZy5FUlJPUiA6Ci0JCQkJCWlmIChpc0VuYWJsZWQoImVycm9yIikpCi0vLwkJCQkJCWxvZ2dlcgotLy8JCQkJCQkJCS5sb2dFcnJvcihnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkUgIgotLy8JCQkJCQkJCQkJKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kICsgIjogb2JqZWN0PSIKLS8vCQkJCQkJCQkJCSsgb2JqZWN0KTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkUgIgotCQkJCQkJCSsgY2FsbGVyICsgIjo6IiArIG1ldGhvZCArICI6IG9iamVjdD0iCi0JCQkJCQkJKyBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExvZy5XQVJOSU5HIDoKLQkJCQkJaWYgKGlzRW5hYmxlZCgid2FybmluZyIpKQotLy8JCQkJCQlsb2dnZXIKLS8vCQkJCQkJCQkubG9nV2FybmluZyhnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pCi0vLwkJCQkJCQkJCQkrICJXICIgKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kCi0vLwkJCQkJCQkJCQkrICI6IG9iamVjdD0iICsgb2JqZWN0KTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pCi0JCQkJCQkJCSsgIlcgIiArIGNhbGxlciArICI6OiIgKyBtZXRob2QKLQkJCQkJCQkJKyAiOiBvYmplY3Q9IiArIG9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTG9nLklORk8gOgotCQkJCQlpZiAoaXNFbmFibGVkKCJpbmZvIikpCi0vLwkJCQkJCWxvZ2dlcgotLy8JCQkJCQkJCS5sb2dJbmZvKGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiCi0vLwkJCQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IgotLy8JCQkJCQkJCQkJKyBvYmplY3QpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiCi0JCQkJCQkJCSsgY2FsbGVyICsgIjo6IiArIG1ldGhvZCArICI6IG9iamVjdD0iCi0JCQkJCQkJCSsgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZyNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXMpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsCi0JCQlTdHJpbmcgbWV0aG9kLCBTdGF0dXMgc3RhdHVzKSB7Ci0JCWxvZyhzZXZlcml0eSwgbWVzc2FnZU51bSwgY2FsbGVyLCBtZXRob2QsIChPYmplY3Qpc3RhdHVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKCBzZXZlcml0eSwgbWVzc2FnZU51bSwgY2FsbGVyLCBtZXRob2QsIChPYmplY3QpbnVsbCApOwotCQl0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCS8qCi0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJCWNhc2UgTG9nLkVSUk9SIDoKLQkJCQkJaWYgKGlzRW5hYmxlZCgiZXJyb3IiKSkKLQkJCQkJCWxvZ2dlci5sb2dFcnJvcihnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkUgIgotCQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QpOwotCQkJCQlsb2dnZXIubG9nRXJyb3IodGhyb3dhYmxlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMb2cuV0FSTklORyA6Ci0JCQkJCWlmIChpc0VuYWJsZWQoIndhcm5pbmciKSkKLQkJCQkJCWxvZ2dlci5sb2dXYXJuaW5nKGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiVyAiCi0JCQkJCQkJCSsgY2FsbGVyICsgIjo6IiArIG1ldGhvZCk7Ci0JCQkJCWxvZ2dlci5sb2dXYXJuaW5nKHRocm93YWJsZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTG9nLklORk8gOgotCQkJCQlpZiAoaXNFbmFibGVkKCJpbmZvIikpCi0JCQkJCQlsb2dnZXIubG9nSW5mbyhnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIgotCQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QpOwotCQkJCQlsb2dnZXIubG9nSW5mbyh0aHJvd2FibGUpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkqLwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLAotCQkJT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCkgewotCQkvKgotCQlpZiAoaXNFbmFibGVkKG9wdGlvbikpCi0JCQlsb2dnZXIubG9nSW5mbyhnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIiArIGNhbGxlcgotCQkJCQkrICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IiArIG9iamVjdCk7Ci0JCSovCi0JCWlmIChpc0VuYWJsZWQob3B0aW9uKSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIiArIGNhbGxlcgotCQkJCQkrICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IiArIG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZyNsb2coaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sCi0JCQlPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCS8qCi0JCWlmIChpc0VuYWJsZWQob3B0aW9uKSkgewotCQkJbG9nZ2VyLmxvZ0luZm8oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIgKyBjYWxsZXIKLQkJCQkJKyAiOjoiICsgbWV0aG9kKTsKLQkJCWxvZ2dlci5sb2dJbmZvKHRocm93YWJsZSk7Ci0JCX0KLQkJKi8KLQkJaWYgKGlzRW5hYmxlZChvcHRpb24pKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIgKyBjYWxsZXIKLQkJCQkJKyAiOjoiICsgbWV0aG9kKTsKLQkJCXRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLAotCQkJT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgU3RhdHVzIHN0YXR1cykgewotCQlsb2coc2V2ZXJpdHksIG9wdGlvbiwgbWVzc2FnZU51bSwgY2FsbGVyLCBtZXRob2QsIChPYmplY3Qpc3RhdHVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZU51bVN0cmluZyhpbnQgbWVzc2FnZU51bSkgewotCQlTdHJpbmcgbWVzc2FnZU51bVN0cmluZyA9ICJJV0FCIjsKLQkJaWYgKG1lc3NhZ2VOdW0gPiA5OTk5IHx8IG1lc3NhZ2VOdW0gPCAwKQotCQkJbWVzc2FnZU51bSA9IDk5OTk7IC8vZGVmYXVsdCBtZXNzYWdlIG51bWJlcgotCQltZXNzYWdlTnVtU3RyaW5nICs9IChuZXcgSW50ZWdlcihtZXNzYWdlTnVtKSkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIG1lc3NhZ2VOdW1TdHJpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0VjbGlwc2VTY2hlbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvZWNsaXBzZS9FY2xpcHNlU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OTk3MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0VjbGlwc2VTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuUmVsYXRpdmVVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUklTY2hlbWU7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VTY2hlbWUgaW1wbGVtZW50cyBVUklTY2hlbWUKLXsKLSAgcHJpdmF0ZSBCYXNlRWNsaXBzZUVudmlyb25tZW50ICBlbnZpcm9ubWVudF87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzICAgICAgICAgICAgbXNnXzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlU2NoZW1lKCBCYXNlRWNsaXBzZUVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIGVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotICAgIG1zZ18gICAgICAgICA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLmVudmlyb25tZW50IiwgdGhpcyApOwotICB9Ci0gIAotICAvKioKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFVSSSB1cmkpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgCi0gICAgaWYoIHVyaSA9PSBudWxsICkgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaS50b1N0cmluZygpICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG5ld1VSSSA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHVyaS5zdGFydHNXaXRoKCAicGxhdGZvcm06L3Jlc291cmNlIikgKQotICAgIHsKLSAgICAgIC8vIFRoZSBwbGF0Zm9ybSBoYXMgYmVlbiBzcGVjaWZpZWQgc28ga2VlcCBpdCBhcyBpcy4KLSAgICAgIG5ld1VSSSA9IHVyaTsKLSAgICB9Ci0gICAgZWxzZSBpZiggdXJpLmluZGV4T2YoICI6IikgIT0gLTEgKQotICAgIHsKLSAgICAgIC8vIFRoZSBwbGF0Zm9ybSB1cmkgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiBzb21lIG90aGVyIHByb3RvY29sLiAKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oCi0gICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIkVjbGlwc2VTY2hlbWUiLAotICAgICAgICAgICAgICBtc2dfLmdldE1lc3NhZ2UoIk1TR19JTlZBTElEX1BMQVRGT1JNX1VSTCIsIG5ldyBPYmplY3RbXXt1cml9KSwKLSAgICAgICAgICAgICAgU3RhdHVzLkVSUk9SICkgKTsKLSAgICAgfQotICAgIGVsc2UgaWYoIHVyaS5zdGFydHNXaXRoKCAiLyIpICkKLSAgICB7Ci0gICAgICAvLyBUaGUgcGxhdGZvcm0gc2NoZW1lIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgc28gd2Ugd2lsbCBhZGQgaXQuCi0gICAgICBuZXdVUkkgPSAicGxhdGZvcm06L3Jlc291cmNlIiArIHVyaTsKLSAgICB9Ci0gICAgCi0gICAgaWYoIG5ld1VSSSA9PSBudWxsICkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFJlbGF0aXZlVVJJKCB1cmkgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRWNsaXBzZVVSSSggbmV3VVJJLCBlbnZpcm9ubWVudF8gKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFVSSSB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXdVUkkoIHVyaS50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKioKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFVSTCB1cmwpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXdVUkkoIHVybC50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKioKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgdmFsaWRhdGUoVVJJIHVyaSkKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaS50b1N0cmluZygpICk7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgc3RhdHVzID0gZXhjLmdldFN0YXR1cygpOyAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldHMgdGhlICJwbGF0Zm9ybTovcmVzb3VyY2UiIElQYXRoIGdpdmVuIGEgdXJsCi0gICAqIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXRoRnJvbVBsYXRmb3JtVVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24gCi0gIHsKLSAgICBTdHJpbmcgcmVzb3VyY2VGaWxlID0gbnVsbDsKLSAgICBVUkwgICAgdXJsICAgICAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKCB1cmkgKTsgCi0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7IAotICAgIH0KLSAgICAKLSAgICBpZiggdXJsID09IG51bGwgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oCi0gICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIkVjbGlwc2VTY2hlbWUiLAotICAgICAgICAgICAgICBtc2dfLmdldE1lc3NhZ2UoIk1TR19JTlZBTElEX1BMQVRGT1JNX1VSTCIsIG5ldyBPYmplY3RbXXt1cml9KSwKLSAgICAgICAgICAgICAgU3RhdHVzLkVSUk9SICkgKTsKLSAgICB9Ci0gICAgaWYoIHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygicGxhdGZvcm0iKSApIAotICAgIHsKLSAgICAgIFN0cmluZyByZXNvdXJjZVVSTCA9IHVybC5nZXRGaWxlKCk7Ci0gICAgICAKLSAgICAgIGlmIChyZXNvdXJjZVVSTC5zdGFydHNXaXRoKCIvcmVzb3VyY2UiKSkgCi0gICAgICB7Ci0gICAgICAgIHJlc291cmNlRmlsZSA9IHJlc291cmNlVVJMLnN1YnN0cmluZygxMCk7ICAgLy8gb21pdCB0aGUgIi9yZXNvdXJjZSIgcG9ydGlvbgotICAgICAgfQotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oCi0gICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIkVjbGlwc2VTY2hlbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSgiTVNHX0lOVkFMSURfUExBVEZPUk1fVVJMIiwgbmV3IE9iamVjdFtde3VybC5nZXRGaWxlKCl9KSwKLQkJCQkJCQlTdGF0dXMuRVJST1IgKSApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzb3VyY2VGaWxlOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggYW4gYWJzb2x1dGUgSVBhdGgKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBwbGF0Zm9ybSBVUkkgZm9yIHRoaXMgcGF0aC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJMRnJvbVBhdGgoIElQYXRoIGFic29sdXRlUGF0aCApCi0gIHsKLSAgICByZXR1cm4gInBsYXRmb3JtOi9yZXNvdXJjZSIgKyBhYnNvbHV0ZVBhdGg7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvZWNsaXBzZS9FY2xpcHNlVVJJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2VjbGlwc2UvRWNsaXBzZVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTlmZTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvZWNsaXBzZS9FY2xpcHNlVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuUmVsYXRpdmVVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSVNjaGVtZTsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVVSSSBleHRlbmRzIFJlbGF0aXZlVVJJCi17Ci0gIHByaXZhdGUgQmFzZUVjbGlwc2VFbnZpcm9ubWVudCBlbnZpcm9ubWVudF87Ci0gIHByaXZhdGUgRWNsaXBzZVNjaGVtZSAgICAgICAgICBzY2hlbWVfOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyAgICAgICAgICAgbXNnXzsKLSAgcHJpdmF0ZSBGaWxlICAgICAgICAgICAgICAgICAgIGZpbGVfOwotICAKLSAgcHVibGljIEVjbGlwc2VVUkkoIFN0cmluZyB1cmksIEJhc2VFY2xpcHNlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gICAgc3VwZXIoIHVyaSApOwotICAgIAotICAgIGVudmlyb25tZW50XyAgPSBlbnZpcm9ubWVudDsKLSAgICBzY2hlbWVfICAgICAgID0gbmV3IEVjbGlwc2VTY2hlbWUoIGVudmlyb25tZW50ICk7Ci0gICAgbXNnXyAgICAgICAgICA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLmVudmlyb25tZW50IiwgdGhpcyApOwotICAgIGZpbGVfICAgICAgICAgPSBnZXRGaWxlKCk7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZXJhc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXJhc2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkgCi0gICAgewotICAgICAgSVJlc291cmNlIGZpbGUgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgKSAKLSAgICAgIHsKLSAgICAgICAgaWYoIGZpbGUgaW5zdGFuY2VvZiBJRmlsZSApCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlUmVzb3VyY2VVdGlscy5kZWxldGVGaWxlKCBlbnZpcm9ubWVudF8uZ2V0UmVzb3VyY2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElGaWxlKWZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFByb2dyZXNzTW9uaXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBmaWxlIGluc3RhbmNlb2YgSUZvbGRlciApCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlUmVzb3VyY2VVdGlscy5kZWxldGVGb2xkZXIoIGVudmlyb25tZW50Xy5nZXRSZXNvdXJjZUNvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRm9sZGVyKWZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0UHJvZ3Jlc3NNb25pdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpICk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIEV4Y2VwdGlvbiBleGMgKSAKLSAgICB7ICAgICAgCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlVVJJIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMuZ2V0TWVzc2FnZSgpLAotCQkgICAgICAgICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiwKLQkJCSAgICAgICAgICAgICAgICBleGMgKSwgCi0gICAgICAgICAgdGhpcyApOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldElucHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHRyeSAKLSAgICB7Ci0gICAgICAvLyBJZiBhIGNsYXNzIGNhc3QgZXhjZXB0aW9uIGlzIHRocm93IGl0IHdpbGwgYmUgcHJvcG9nYXRlZCBhcwotICAgICAgLy8gYSBVUklFeGNlcHRpb24uCi0gICAgICBJRmlsZSBmaWxlID0gKElGaWxlKWdldFJlc291cmNlKCk7Ci0KLSAgICAgIC8vY2FsbCBnZXRDb250ZW50cyBvbiB0aGUgZWNsaXBzZSBGaWxlIG9iamVjdAotICAgICAgaWYoIGZpbGUgIT0gbnVsbCApIAotICAgICAgewotICAgICAgICByZXR1cm4gZmlsZS5nZXRDb250ZW50cygpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVGhyb3dhYmxlIGV4YyApIAotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oCi0gICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIkVjbGlwc2VVUkkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy5nZXRNZXNzYWdlKCksCi0JCQkJCQkJU3RhdHVzLkVSUk9SLAotCQkJCQkJCWV4YyApLAotICAgICAgICAgIHRoaXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGZvbGRlciBleGlzdHMuCi0gICAgVVJJIHBhcmVudCA9IHBhcmVudCgpOwotICAgIAotICAgIGlmKCAhcGFyZW50LmlzUHJlc2VudCgpICkKLSAgICB7Ci0gICAgICBwYXJlbnQoKS50b3VjaEZvbGRlcigpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZ2V0T3V0U3RyZWFtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRVUklTY2hlbWUoKQotICAgKi8KLSAgcHVibGljIFVSSVNjaGVtZSBnZXRVUklTY2hlbWUoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtZV87Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0xlYWYoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMZWFmKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gIAotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIAotICAgICAgICAgIHJlc291cmNlLmV4aXN0cygpICYmIAotICAgICAgICAgIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSApCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUHJlc2VudCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSApCi0gICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICAvLyBUaGlzIFVSSSBkb2VzIG5vdCBleGlzdC4KLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNSZWFkYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgKQotICAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgLy8gVGhpcyBVUkkgZG9lcyBub3QgZXhpc3QuCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1JlbGF0aXZlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUoKQotICB7IAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzV3JpdGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcml0YWJsZSgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIAotICAgICAgICAgIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICYmIAotICAgICAgICAgICFyZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkgKQotICAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgLy8gVGhpcyBVUkkgZG9lcyBub3QgZXhpc3QuCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3QoKQotICAgKi8KLSAgcHVibGljIFVSSVtdIGxpc3QoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgICAgPSBnZXRSZXNvdXJjZSgpOwotICAgIFVSSVtdICAgICB1cmlDaGlsZHJlbiA9IG5ldyBVUklbMF07Ci0gICAgCi0gICAgaWYoIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICB7Ci0gICAgICBJRm9sZGVyICAgICBmb2xkZXIgICA9IChJRm9sZGVyKXJlc291cmNlOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlW10gY2hpbGRyZW4gICAgPSBmb2xkZXIubWVtYmVycygpOyAgCi0gIAotICAgICAgICB1cmlDaGlsZHJlbiA9IG5ldyBVUklbY2hpbGRyZW4ubGVuZ3RoXTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgSVBhdGggcGF0aCA9IGNoaWxkcmVuW2luZGV4XS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgIHVyaUNoaWxkcmVuW2luZGV4XSA9IG5ldyBFY2xpcHNlVVJJKCBzY2hlbWVfLmdldFVSTEZyb21QYXRoKHBhdGgpLCBlbnZpcm9ubWVudF8gKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHVyaUNoaWxkcmVuOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjbGlzdChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSUZpbHRlcikKLSAgICovCi0gIHB1YmxpYyBVUklbXSBsaXN0KFVSSUZpbHRlciB1cmlGaWx0ZXIpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgVVJJW10gICAgIHJlc3VsdCAgID0gbmV3IFVSSVswXTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgKQotICAgICB7Ci0gICAgICBJRm9sZGVyICAgICBmb2xkZXIgICA9IChJRm9sZGVyKXJlc291cmNlOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlW10gY2hpbGRyZW4gICAgPSBmb2xkZXIubWVtYmVycygpOyAgICAgICAKLSAgICAgICAgVmVjdG9yICAgICAgdXJpQ2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgICAgIHsKLSAgICAgICAgICBJUGF0aCBwYXRoID0gY2hpbGRyZW5baW5kZXhdLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgICAgVVJJICAgdXJpICA9IG5ldyBFY2xpcHNlVVJJKCBzY2hlbWVfLmdldFVSTEZyb21QYXRoKHBhdGgpLCBlbnZpcm9ubWVudF8gKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiggdXJpRmlsdGVyLmFjY2VwdHMoIHVyaSApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cmlDaGlsZHJlbi5hZGQoIHVyaSApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gKFVSSVtdKXVyaUNoaWxkcmVuLnRvQXJyYXkoIG5ldyBVUklbMF0gKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNyZW5hbWUob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW5hbWUoVVJJIG5ld1VSSSApCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoRm9sZGVyKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoRm9sZGVyKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgeyAKLSAgICAgIGlmKCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiApCi0gICAgICB7Ci0gICAgICAgIElGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpcmVzb3VyY2U7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlmKCBmb2xkZXIubWVtYmVycygpLmxlbmd0aCA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlVVJJIiwKLSAgICAgICAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX0VSUk9SX0ZPTERFUl9IQVNfQ0hJTERSRU4iLCBuZXcgT2JqZWN0W117IGZvbGRlci50b1N0cmluZygpIH0gKSwKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzLkVSUk9SICksCi0gICAgICAgICAgICAgICAgdGhpcyApOwotCQkJCQkJCQkKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlVVJJIiwKLSAgICAgICAgICAgICAgICAgIGV4Yy5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICBTdGF0dXMuRVJST1IsCi0JCQkJICBleGMgKSwKLSAgICAgICAgICAgICAgdGhpcyApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAvLz8/PyBOb3Qgc3VyZSB3aGF0IHRvIGRvIGlmIHRvdWNoaW5nIGEgZm9sZGVyIGFuZCB0aGUgVVJJIGV4aXN0cyBhbmQgaXQgaXMgbm90IGEgZm9sZGVyLgotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSVBhdGggbmV3UGF0aCA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaV8gKSApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgRmlsZVJlc291cmNlVXRpbHMubWFrZUZvbGRlclBhdGgoIGVudmlyb25tZW50Xy5nZXRSZXNvdXJjZUNvbnRleHQoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRQcm9ncmVzc01vbml0b3IoKSwKLQkJCSAgCSAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlVVJJIiwKLSAgICAgICAgICAgICAgICBleGMuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJZXhjICksCi0gICAgICAgICAgICB0aGlzICk7Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoTGVhZigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaExlYWYoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgIAotICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAvLyBUaGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgc28gZG8gbm90aGluZy4KLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIHBhcmVudCBmb3IgdGhpcyBsZWFmIGFuZCBjcmVhdGUgaXQgaWYgcmVxdWlyZWQuCi0gICAgICBVUkkgcGFyZW50ID0gcGFyZW50KCk7Ci0gICAgICAKLSAgICAgIGlmKCAhcGFyZW50LmlzUHJlc2VudCgpICkKLSAgICAgIHsgIAotICAgICAgICBwYXJlbnQoKS50b3VjaEZvbGRlcigpOwotICAgICAgfQotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IGFuIG91dHB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZCBmaWxlIGFuZCBpbW1lZGlhdGVseSBjbG9zZSBpdC4KLSAgICAgICAgLy8gVGhpcyBzaG91bGQgY3JlYXRlIGEgMCBieXRlIGZpbGUuCi0gICAgICAgIGdldE91dFN0cmVhbSgpLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFNpbXBsZVN0YXR1cyggIkVjbGlwc2VVUkkiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLmdldE1lc3NhZ2UoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCQkJICAgICAgZXhjICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgKTsgCi0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgeyAgICAKLSAgICBJUGF0aCAgcGF0aCAgICAgICAgICAgICA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkodXJpXykgKTsKLSAgICBTdHJpbmcgYWJzb2x1dGVQYXRobmFtZSA9IHBhdGgubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKLSAgIAotICAgIHJldHVybiBGaWxlUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoYWJzb2x1dGVQYXRobmFtZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldE91dHB1dFN0cmVhbSgpCi0gICAqLwotICBwcml2YXRlIE91dHB1dFN0cmVhbSBnZXRPdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUGF0aCAgICAgICAgZmlsZSAgID0gbmV3IFBhdGgoIHNjaGVtZV8uZ2V0UGF0aEZyb21QbGF0Zm9ybVVSSSggdXJpXyApICkubWFrZUFic29sdXRlKCk7Ci0gICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgCi0gICAgc3RyZWFtID0gRmlsZVJlc291cmNlVXRpbHMubmV3RmlsZU91dHB1dFN0cmVhbSAoIGVudmlyb25tZW50Xy5nZXRSZXNvdXJjZUNvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRQcm9ncmVzc01vbml0b3IoKSwKLSAJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFN0YXR1c0hhbmRsZXIoKSApOyAgICAKLSAgICByZXR1cm4gc3RyZWFtOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhIEZpbGUgb2JqZWN0IGZvciB0aGUgcmVzb3VyY2UgdW5kZXIgdGhpcyBVUkkuCi0gICAqIFRoZXJlIGFyZSBtYW55IFVSSXMgYW5kIFVSSVNjaGVtZXMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kCi0gICAqIHdpbGwgZmFpbCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5Ci0gICAqIGluIGNhc2VzIHdoZXJlIFVSSXMgYXJlIGtub3duIHRvIGJlIGJhY2tlZCBieSBwaHlzaWNhbCBmaWxlcy4KLSAgICovCi0gIHB1YmxpYyBGaWxlIGFzRmlsZSAoKQotICB7Ci0gIAlyZXR1cm4gZmlsZV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJI2lzQXZhaWxhYmxlQXNGaWxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNGaWxlKCkgCi0gIHsKLSAgCXJldHVybiBmaWxlXyAhPSBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIEZpbGUgZ2V0RmlsZSgpCi0gIHsKLSAgICBTdHJpbmcgcGxhdGZvcm1SZXMgPSAicGxhdGZvcm06L3Jlc291cmNlIjsKLSAgICBGaWxlICAgcmVzdWx0ICAgICAgPSBudWxsOwotICAgIAotICAgIGlmICh1cmlfLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXMpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBGaWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZCh1cmlfLnN1YnN0cmluZyhwbGF0Zm9ybVJlcy5sZW5ndGgoKSwgdXJpXy5sZW5ndGgoKSkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL0NvbW1hbmRMaW5lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL0NvbW1hbmRMaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3N2JkMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tYW5kbGluZS9Db21tYW5kTGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1hbmRsaW5lOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5TdHJpbmdVdGlsczsKLQotCi0vKioKLSAgKiA8cD5UaGlzIGlzIGEgZ2VuZXJpYyBjb21tYW5kIGxpbmUgcGFyc2luZyBjbGFzcy4gIFRoZSBwcm9ncmFtbWVyIG5lZWQgb25seSBzcGVjaWZ5Ci0gICogdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGVpciBjb21tYW5kIGxpbmUoaWUuIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgZmxhZ3MsIGV0YykKLSAgKiBhbmQgdGhpcyBjbGFzcyB3aWxsIHBlcmZvcm0gdGhlIHJlc3Qgb2YgdGhlIHBhcnNpbmcgd29yay4gIEFzIGFuIGFkZGVkIGJvbnVzIHRoaXMKLSAgKiBjbGFzcyB3aWxsIGFsc28gY3JlYXRlIGZvcm1hdGVkIGhlbHAgdGV4dCB0aGF0IGRpc3BsYXlzIHRoZSBzeW50YXggb2YgdGhpcwotICAqIGNvbW1hbmQgbGluZS4KLSAgKgotICAqIDxwPlRoZSBtYWluIHBhcmFtZXRlciB0byB0aGUgQ29tbWFuZExpbmUgY29uc3RydWN0b3IgaXMgYSB0d28gZGltZW5zaW9uYWwgU3RyaW5nCi0gICogYXJyYXkuICBUaGVyZSBhcmUgNSBjb2x1bW5zIGluIHRoaXMgYXJyYXkgYW5kIGFzIG1hbnkgcm93cyBhcyBuZWVkZWQgZm9yIGVhY2gKLSAgKiBmbGFnIG9yIHBvc2l0aW9uYWwgcGFyYW1ldGVyLiAgVGhlIGZpdmUgY29sdW1ucyBhcmU6Ci0gICoKLSAgKiA8b2w+Ci0gICogPGxpPlRoZSBuYW1lIG9mIHRoZSBmbGFnKGVnLiAiaGVscCIgb3IgImEiLCBldGMpCi0gICogICAgIE5vdGU6IG5vIGRhc2ggc2hvdWxkIGJlIGluIHRoZSBuYW1lIGhlcmUuICBUaGUgdXNlciB3b3VsZCBzcGVjaWZ5ICItaGVscCIgb24gdGhlCi0gICogICAgICAgICAgIGNvbW1hbmQgbGluZSB0aG91Z2guCi0gICogPGxpPlRoZSBuYW1lIG9mIHRoZSBmbGFnIHBhcmFtZXRlcihpZiBhbnkpCi0gICogPGxpPkEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGZsYWcgY2FuIGFwcGVhciBtb3JlIHRoYW4gb25jZSBvbiB0aGUKLSAgKiAgICAgY29tbWFuZCBsaW5lLgotICAqIDxsaT5BIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBmbGFnIG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICogPGxpPkEgaGVscCB0ZXh0IHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhpcyBwYXJ0aWN1bGFyIGZsYWcgb3IgcG9zaXRpb25hbCBwYXJhbWV0ZXIuCi0gICogPC9vbD4KLSAgKgotICAqIDxwPkVhY2ggcm93IGluIHRoZSBzdHJpbmcgYXJyYXkgaXMgYXNzb2NpYXRlIHdpdGggZWl0aGVyIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIKLSAgKiBvciB3aXRoIGEgZmxhZy4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIGNvbW1hbmQgbGluZToKLSAgKiA8dWw+Ci0gICogPGxpPk15X3Byb2cgcmVxdWlyZWRfcGFybTEgLWFiIHBhcm1fZm9yX2FiIHJlcXVpcmVkX3Bhcm0yIC1oZWxwIG9wdGlvbmFsX3Bhcm1zCi0gICogPC91bD4KLSAgKgotICAqIDxwPkluIHRoaXMgZXhhbXBsZSBNeV9wcm9nIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtLiAgcmVxdWlyZWRfcGFybTEgYW5kCi0gICogcmVxdWlyZWRfcGFybTIgbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIE5vdGljZSB0aGF0IHRoZXkgZG8gbm90Ci0gICogaGF2ZSB0byBiZSBhZGphY2VudCB0byBlYWNoIG90aGVyIG9uIHRoZSBjb21tYW5kIGxpbmUuIG9wdGlvbmFsX3Bhcm1zIG1heSBvcHRpb25hbGx5Ci0gICogc3BlY2lmaWVkLiAgb3B0aW9uYWxfcGFybXMgY2FuIGJlIDAgb3IgbW9yZSBwYXJhbWV0ZXJzLiAgVGhleSBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gICogYWRqYWNlbnQgdG8gdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGJ1dCB0aGV5IGRvIG5lZWQgdG8gZm9sbG93IHRoZSByZXF1aXJlZAotICAqIHBhcmFtZXRlcnMuIFR3byBmbGFncyBhcmUgc3BlY2lmaWVkICItYWIiIGFuZCAiLWhlbHAiLiAgVGhlICItYWIiIGZsYWcgaGFzIGEKLSAgKiBwYXJhbWV0ZXIgInBhcm1fZm9yX2FiIiBhc3NvY2lhdGVkIHdpdGggaXQuICBOb3RlOiBhIGZsYWcgY2FuIG5vdCBoYXZlIGFuIG9wdGlvbmFsCi0gICogcGFyYW1ldGVyLiAoaWUuIGEgZmxhZyBlaXRoZXIgbmV2ZXIgaGF2ZSBhIHBhcmFtZXRlciBvciBpdCBhbHdheXMgaGFzIGEgcGFyYW1ldGVyKQotICAqIEluIHRoaXMgZXhhbXBsZSwgdGhlIGZpcnN0IHR3byByb3dzIGluIHRoZSBzdHJpbmcgYXJyYXkgd291bGQgZGVzY3JpYmUgcmVxdWlyZWRfcGFybTEKLSAgKiBhbmQgcmVxdWlyZWRfcGFybTIuICBUaGUgdGhpcmQgZW50cnkgd291bGQgZGVzY3JpYmUgb3B0aW9uYWxfcGFybXMuICBUaGUgZm91cnRoIGFuZAotICAqIGZpZnRoIHJvd3Mgd291bGQgZGVzY3JpYmUgIi1hYiIgYW5kICItaGVscCIuICBGb3IgdGhpcyBjb21tYW5kIGxpbmUgdGhlIHN0cmluZyBhcnJheQotICAqIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgotICAqCi0gICogPHVsPgotICAqIDxsaT57IHsgQ29tbWFuZExpbmUuUE9TSVRJT05BTCwgInBhcm0xIiwgQ29tbWFuZExpbmUuTk9fRFVQUywKLSAgKiAgICAgICBDb21tYW5kTGluZS5SRVFVSVJFRCwgInBhcm0xIGhlbHAgdGV4dCIgfSwKLSAgKiA8bGk+eyBDb21tYW5kTGluZS5QT1NJVElPTkFMLCAicGFybTIiLCBDb21tYW5kTGluZS5OT19EVVBTLAotICAqICAgICAgIENvbW1hbmRMaW5lLlJFUVVJUkVELCAicGFybTIgaGVscCB0ZXh0IiB9LAotICAqIDxsaT57IENvbW1hbmRMaW5lLlBPU0lUSU9OQUwsICJvcHRpb25hbF9wYXJtcyIsIENvbW1hbmRMaW5lLkRVUFNfT0ssCi0gICogICAgICAgQ29tbWFuZExpbmUuUkVRVUlSRUQsICJvcHRpb25hbCBoZWxwIHRleHQiIH0sCi0gICogPGxpPnsgImFiIiwgInBhcm1fZm9yX2FiIiwgQ29tbWFuZExpbmUuTk9fRFVQUywKLSAgKiAgICAgICBDb21tYW5kTGluZS5PUFRJT05BTCwgImFiIGhlbHAgdGV4dCIgfSwKLSAgKiA8bGk+eyAiaGVscCIsIENvbW1hbmRMaW5lLk5PX1BBUk0sIENvbW1hbmRMaW5lLk5PX0RVUFMsCi0gICogICAgICAgQ29tbWFuZExpbmUuT1BUSU9OQUwsICJkaXNwbGF5cyB0aGlzIGhlbHAgdGV4dCIgfSB9Ci0gICogPC91bD4KLSAgKgotICAqIDxwPlN0cmluZyBhcnJheSBydWxlczoKLSAgKgotICAqIDxvbD4KLSAgKiA8bGk+UG9zaXRpb25hbCByb3dzIG11c3QgYWx3YXlzIGNvbWUgZmlyc3QgaW4gdGhlIGFycmF5LiAgVGhlc2Ugcm93cyBtdXN0Ci0gICogICAgIGhhdmUgYSBuYW1lIHNwZWNpZmllZCBpbiBjb2x1bW4gMiwgZXhjZXB0IGZvciBvbmUgY2FzZS4gIElmIHlvdSB3YW50IHRvIGluZGljYXRlIHRoYXQKLSAgKiAgICAgdGhlcmUgYXJlIG5vIG9wdGlvbmFsIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB5b3Ugd291bGQgcHV0IENvbW1hbmRMaW5lLk5PX1BBUk0KLSAgKiAgICAgaW4gY29sdW1uIDIgb2YgdGhlIHBvc2l0aW9uYWwgcm93LiAgWW91IHdvdWxkIGFsc28gbmVlZCB0byBwdXQgQ29tbWFuZExpbmUuT1BUSU9OQUwKLSAgKiAgICAgaW4gY29sdW1uIDQgc2luY2UgdGhpcyByb3cgaXMgZm9yIG9wdGlvbmFsIHBhcmFtZXRlcnMob3IgdGhlIG5vbi1leGlzdGVuY2Ugb2YKLSAgKiAgICAgb3B0aW9uYWwgcGFyYW1ldGVycyBhcyB0aGUgY2FzZSBtYXkgYmUpCi0gICogPGxpPk9uY2UgYSBwb3NpdGlvbmFsIHJvdyBzcGVjaWZpZXMgdGhhdCBpdCBpcyBvcHRpb25hbCwgbm8gZnVydGhlciBwb3NpdGlvbmFsIHJvd3MKLSAgKiAgICAgbWF5IGJlIHNwZWNpZmllZC4KLSAgKiA8bGk+QXQgbGVhc3Qgb25lIHBvc2l0aW9uYWwgcm93IG11c3QgYmUgc3BlY2lmaWVkLCBldmVuIGlmIGl0IGlzIHRvIGp1c3QgdG8gc3BlY2lmeSB0aGF0Ci0gICogICAgIHRoZXJlIGFyZSBubyBvcHRpb25hbCBwYXJhbWV0ZXJzLgotICAqIDxsaT5GbGFnIG5hbWVzIG11c3QgYmUgaW4gbG93ZXIgY2FzZS4gIE5vdGU6IHRoZSB1c2VyIGNhbiBzcGVjaWZ5IHVwcGVyIG9yIGxvd2VyIGNhc2UKLSAgKiAgICAgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgKiA8bGk+SWYgYSBmbGFnIGhhcyBhIHBhcmFtZXRlciB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHNob3VsZCBiZSBwdXQgaW50byBjb2x1bW4gMi4KLSAgKiAgICAgb3RoZXJ3aXNlIENvbW1hbmRMaW5lLk5PX1BBUk0gc2hvdWxkIGJlIHB1dCBpbiBjb2x1bW4gMi4KLSAgKiA8bGk+SWYgYSBmbGFnIGlzIGFsbG93ZWQgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBjb21tYW5kIGxpbmUgdGhlbgotICAqICAgICBDb21tYW5kTGluZS5EVVBTX09LIHNob3VsZCBiZSBwdXQgaW50byBjb2x1bW4gMywgb3RoZXJ3aXNlIENvbW1hbmRMaW5lLk5PX0RVUFMKLSAgKiAgICAgc2hvdWxkIGJlIHB1dCBpbnRvIGNvbHVtbiAzLgotICAqIDxsaT5JZiBhIGZsYWcgbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSB0aGVuIENvbW1hbmRMaW5lLlJFUVVJUkVEIHNob3VsZAotICAqICAgICBiZSBzcGVjaWZpZWQgaW4gY29sdW1uIDQsIG90aGVyd2lzZSBDb21tYW5kTGluZS5PUFRJT05BTCBzaG91bGQgYmUgc3BlY2lmaWVkLgotICAqIDxsaT5BIGhlbHAgZmxhZyBtdXN0IGJlIHNwZWNpZmllZC4KLSAgKiA8bGk+VGhlIHN0cmluZ3Mgc3BlY2lmaWVkIGluIHRoZSBmbGFncyBjb2x1bW4sIHRoZSBwYXJhbWV0ZXIgbmFtZSBjb2x1bW4sIGFuZCB0aGUKLSAgKiAgICAgaGVscCBjb2x1bW4gYXJlIGFsd2F5cyB0cmFuc2xhdGVkIHVzaW5nIHRoZSByZXNvdXJjZSBidW5kbGUgc3BlY2lmaWVkLiAgT2YKLSAgKiAgICAgY291cnNlIHRoZSBzcGVjaWFsIHN0cmluZyB2YWx1ZXMgc3VjaCBhcyBQT1NJVElPTkFMIGFuZCBOT19QQVJNIGFyZSBub3QKLSAgKiAgICAgdHJhbnNsYXRlZC4KLSAgKiA8L29sPgotICAqCi0gICogPHA+IEZsYWcgbWF0Y2hpbmcgcnVsZXM6Ci0gICogPG9sPgotICAqIDxsaT5UaGUgcGFyc2VyIHdpbGwgYXR0ZW1wdCB0byBtYXRjaCBhIHVzZXIgc3BlY2lmaWVkIGZsYWcgd2l0aCB0aGUgbWluaW11bSBudW1iZXIKLSAgKiAgICAgb2YgcHJvZ3JhbW1lciBzcGVjaWZpZWQgZmxhZyBjaGFyYWN0ZXJzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9ncmFtbWVyIGhhcwotICAqICAgICBzcGVjaWZpZWQgdGhhdCB0aGUgZmxhZyBpcyAiaGVscCIgdGhlIHVzZXIgY291bGQgc3BlY2lmeSAiLWgiLCAiLWhlIiwgIi1oZWwiLCBvcgotICAqICAgICAiLWhlbHAiLiAgSWYgdGhlIHByb2dyYW1tZXIgaGFzIGFsc28gc3BlY2lmaWVkIGEgZmxhZyBjYWxsZWQgImhlbGxvIiwgdGhlCi0gICogICAgIHVzZXIgd291bGQgZ2V0IGFuIGVycm9yIG1lc3NhZ2UgZm9yIHNwZWNpZmluZyBlaXRoZXIgIi1oIiwgIi1oZSIgb3IgIi1oZWwiLCBzaW5jZQotICAqICAgICBpdCBpcyBhbWJpZ3VvdXMgd2hpY2ggZmxhZyBpcyBiZWluZyByZWZlcmVkIHRvLiAgQm90aCAiLWhlbGwiIGFuZCAiLWhlbGxvIgotICAqICAgICB3b3VsZCBiZSBvayBmb3IgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgaGVsbG8gZmxhZyBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAqIDxsaT5JZiBhIGZsYWcgaGFzIGEgcGFyYW1ldGVyLCB0aGUgcGFyYW1ldGVyIG1heSBiZSBpbW1lZGlhdGVseSBhZGphY2VudCB0byB0aGUgZmxhZy4KLSAgKiAgICAgRm9yIGV4YW1wbGUgaWYgImFiY2QiIGlzIHNwZWNpZmllZCBhcyBhIGZsYWcgd2l0aCBhIHBhcmFtZXRlciwgdGhlIHVzZXIgY291bGQKLSAgKiAgICAgc3BlY2lmeSB0aGUgZm9sbG93aW5nIGFzc3VtaW5nIHRoZXJlIGFyZSBubyBvdGhlciBhbWJpZ3VvdXMgZmxhZ3MuICItYWJjZHBhcm0iLAotICAqICAgICAiLWFiY3Bhcm0iLCAiLWFicGFybSIsIG9yICItYXBhcm0iIHdoZXJlIHBhcm0gaXMgdGhlIHBhcmFtZXRlciBmb3IgdGhlIGZsYWcuCi0gICogICAgIChPZiBjb3Vyc2UgdGhlIHVzZXIgY2FuIGFsd2F5cyBwdXQgYSB3aGl0ZSBzcGFjZSBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUKLSAgKiAgICAgcGFyYW1ldGVyLikKLSAgKiA8bGk+SWYgYSBmbGFnIGRvZXMgbm90IGhhdmUgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGlzIGFkamFjZW50IHRvIGl0IHRoZW4gdGhpcwotICAqICAgICBwYXJhbWV0ZXIgaXMgaW50ZXJwcmV0ZWQgYXMgYSBwb3NpdGlvbmFsIHBhcmFtZXRlci4gIEZvciBleGFtcGxlIGlmICJhYmNiIiBpcwotICAqICAgICBzcGVjaWZpZWQgYXMgYSBmbGFnIGFuZCB0aGUgdXNlciBzcGVjaWZpZXMgIi1hYmhlbGxvIiwgdGhlbiB0aGUgZmlyc3QgImFiIiB3aWxsIGJlCi0gICogICAgIGludGVycHJldGVkIGFzIHRoZSBmbGFnIGFuZCAiaGVsbG8iIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBwb3NpdGlvbmFsCi0gICogICAgIHBhcmFtZXRlci4KLSAgKiA8L29sPgotICAqCi0gICogQGF1dGhvciBQZXRlciBNb29nawotICAqIEBkYXRlICAgSnVseSAxMywgMjAwMAotKiovCi0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTGluZQotewotICAvLyBDb25zdGFudCBzdHJpbmdzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIHVzZSBpbiB0aGVpciBmbGFnc19pbmZvIGlucHV0IGFycmF5LgotICAvKioKLSAgICAqIFNwZWNpZmllcyB0aGF0IHRoaXMgZmxhZyBvciBwb3NpdGlvbmFsIHBhcmFtZXRlciBpcyByZXF1aXJlZC4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEICAgPSAicmVxdWlyZWQiOwotICAvKioKLSAgICAqIFNwZWNpZmllcyB0aGF0IHRoaXMgZmxhZyBvciBwb3NpdGlvbmFsIHBhcmFtZXRlciBpcyBvcHRpb25hbC4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMICAgPSAib3B0aW9uYWwiOwotICAvKioKLSAgICAqIFNwZWNpZmllcyB0aGF0IHRoaXMgZmxhZyBtYXkgYmUgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgKiBOb3RlOiBUaGlzIHN0cmluZyBoYXMgbm8gbWVhbmluZyBmb3IgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVQU19PSyAgICA9ICJkdXBzX29rIjsKLSAgLyoqCi0gICAgKiBTcGVjaWZpZXMgdGhhdCB0aGlzIGZsYWcgbWF5IG5vdCBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAqIE5vdGU6IFRoaXMgc3RyaW5nIGhhcyBubyBtZWFuaW5nIGZvciBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19EVVBTICAgID0gIm5vX2R1cHMiOwotICAvKioKLSAgICAqIFNwZWNpZmllcyB0aGF0IGEgcm93IGlzIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIgcm93LgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TSVRJT05BTCA9ICIiOwotICAvKioKLSAgICAqIFNwZWNpZmllcyB0aGF0IGEgZmxhZyBoYXMgbm8gcGFyYW1ldGVyLiAgRm9yIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB0aGlzCi0gICAgKiBzdHJpbmcgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIG9wdGlvbmFsIHBhcmFtZXRlcnMuCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19QQVJNICAgID0gIiI7Ci0gIAotICAvKioKLSAgICAqIEBwYXJhbSBmbGFnc19pbmZvIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZQotICAgICogICAgICAgICAgICAgICAgICAgY29tbWFuZCBsaW5lIHBhcnNlci4gIFNlZSB0aGUgY2xhc3MgZGVzY3JpcHRpb24gZm9yIGEKLSAgICAqICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24gb2Ygd2hhdCB0aGlzIHN0cmluZyBhcnJheSBzaG91bGQgbG9vayBsaWtlLgotICAgICogQHBhcmFtIGhlbHBfZmxhZyAgVGhpcyBzdHJpbmcgaW5kaWNhdGVzIHdoaWNoIGZsYWcgaW4gdGhlIGZsYWdzX2luZm8KLSAgICAqICAgICAgICAgICAgICAgICAgIGFycmF5IGlzIHRoZSBoZWxwIGZsYWcuCi0gICAgKiBAcGFyYW0gdG9vbF9uYW1lICBUaGlzIHN0cmluZyBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlIHRvb2wgdGhhdCB0aGlzCi0gICAgKiAgICAgICAgICAgICAgICAgICBjb21tYW5kIGxpbmUgcGFyc2VyIGlzIGJlaW5nIHVzZWQgZm9yLiAgVGhpcyBzdHJpbmcKLSAgICAqICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBoZWxwIHRleHQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZExpbmUoIFN0cmluZ1tdW10gICAgIGZsYWdzX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgIGhlbHBfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgdG9vbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSBmbGFnTWVzc2FnZXMgKQotICAgICAgICAgICAgICAgICAgIAotICAgIHRocm93cyBJbnRlcm5hbEVycm9yRXhjCi0gIHsKLSAgICB0aGlzLmZsYWdzX2luZm8gICA9IGZsYWdzX2luZm87Ci0gICAgdGhpcy5oZWxwX2ZsYWcgICAgPSBoZWxwX2ZsYWc7Ci0gICAgdGhpcy50b29sX25hbWUgICAgPSB0b29sX25hbWU7Ci0gICAgdGhpcy5mbGFnTWVzc2FnZXMgPSBmbGFnTWVzc2FnZXM7Ci0gICAgCi0gICAgbWVzc2FnZXMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbWFuZGxpbmUuY29tbWFuZGxpbmUiICk7Ci0gICAgdmVyaWZ5X2ZsYWdzX2luZm8oKTsKLSAgfQotCi0gIC8qKgotICAgICogQ2FsbCB0aGlzIG1ldGhvZCB0byBwYXJzZSBhIGNvbW1hbmQgbGluZS4KLSAgICAqIEBwYXJhbSBhcmdzIFRoaXMgaXMgdGhlIHN0cmluZyBhcnJheSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgKiBAdGhyb3dzIEZsYWdfZXJyb3IgSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGUgY29tbWFuZCBsaW5lIGluY29ycmVjdGx5Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgYSBGbGFnX2Vycm9yIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gIFVzZSBnZXRNZXNzYWdlCi0gICAgKiAgICAgICAgICAgICAgICAgICAgdG8gZ2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIHVzZXIgZXJyb3IuCi0gICAgKgotICAgICogQHRocm93cyBIZWxwX3NwZWNpZmllZCBJZiB0aGUgdXNlciBzcGVjaWZpZXMgdGhlIGhlbHAgZmxhZyB0aGlzIGV4Y2VwdGlvbgotICAgICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHRocm93bi4gIFVzZSBnZXRNZXNzYWdlIHRvIGdldCBhIGZ1bGx5Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCBzeW50YXggZGVzY3JpcHRpb24gb2YgdGhpcyBjb21tYW5kIGxpbmUuCi0gICoqLwotICBwdWJsaWMgdm9pZCBjaGVja19mbGFncyggU3RyaW5nW10gYXJncyApIHRocm93cyBGbGFnX2Vycm9yCi0gIHsKLSAgICBmbGFnc19zcGVjaWZpZWQgPSBuZXcgVmVjdG9yW2ZsYWdzX2luZm8ubGVuZ3RoXTsKLQotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBhcmdzLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgYm9vbGVhbiBwcm9jZXNzZWRfdGhlX25leHRfYXJnID0gcHJvY2Vzc19hcmcoIGFyZ3MsIGluZGV4ICk7Ci0gICAgICBpZiggcHJvY2Vzc2VkX3RoZV9uZXh0X2FyZyA9PSB0cnVlICkgaW5kZXgrKzsKLSAgICB9Ci0KLSAgICAvLyBJZiBoZWxwIHdhcyBzcGVjaWZpZWQgd2Ugd2lsbCBub3QgY2hlY2sgdGhlIHJlZ3VsYXIgcnVsZXMuCi0gICAgaWYoICFmbGFnX3NwZWNpZmllZCggaGVscF9mbGFnICkgKQotICAgIHsKLSAgICAgIC8vIENoZWNrIGZvciBmbGFncyBicmVha2luZyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIGZsYWdzX2luZm8uCi0gICAgICBjaGVja19ydWxlcygpOwotCi0gICAgICAvLyBDYWxsIHN1YmNsYXNzZWQgbWV0aG9kIHRvIHNlZSBpZiBtb3JlIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQuCi0gICAgICBtb3JlX3Byb2Nlc3NpbmcoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIGlzIGZvciBzdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXQKLSAgICAqIHRoZSB2ZXJ5IGVuZCBvZiBjaGVja19mbGFncyBtZXRob2QuICBJdCBpcyBpbnRlbmRlZCB0aGF0IHN1YmNsYXNzZXMgd291bGQKLSAgICAqIHBlcmZvcm0gYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgY2hlY2tpbmcgaGVyZS4KLSAgKiovCi0gIHByb3RlY3RlZCB2b2lkIG1vcmVfcHJvY2Vzc2luZygpIHRocm93cyBGbGFnX2Vycm9yLCBJbnRlcm5hbEVycm9yRXhjCi0gIHsKLSAgfQotCi0gIC8qKgotICAgICogT25jZSB0aGUgY29tbWFuZCBsaW5lIGhhcyBiZWVuIHBhcnNlZCBieSBjYWxsaW5nIGNoZWNrX2ZsYWdzIGEKLSAgICAqIGNhbGwgY2FuIGJlIG1hZGUgdG8gdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGZsYWcuCi0gICAgKiBJZiB0aGUgZmxhZyB3YXMgbm90IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAqIElmIHRoZSBmbGFnIHdhcyBzcGVjaWZpZWQsIGJ1dCBoYXMgbm8gcGFyYW1ldGVycyBhIHZhbGlkIHZlY3RvciB3aWxsIGJlCi0gICAgKiByZXR1cm5lZCBjb250YWluaW5nIGEgbnVsbC4KLSAgKiovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRfZmxhZ19wYXJtcyggU3RyaW5nIGZsYWcgKQotICB7Ci0gICAgaW50ICAgICByb3cgICAgICAgID0gMDsKLSAgICBib29sZWFuIGZsYWdfZm91bmQgPSBmYWxzZTsKLQotICAgIHdoaWxlKCBmbGFnX2ZvdW5kID09IGZhbHNlICYmIHJvdyA8IGZsYWdzX2luZm8ubGVuZ3RoICkKLSAgICB7Ci0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXS5lcXVhbHMoIGZsYWcgKSApCi0gICAgICB7Ci0gICAgICAgIGZsYWdfZm91bmQgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByb3crKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggZmxhZ19mb3VuZCA9PSB0cnVlICkgCi0gICAgewotICAgICAgVmVjdG9yIHBhcm1zID0gZmxhZ3Nfc3BlY2lmaWVkW3Jvd107Ci0gICAgICByZXR1cm4gcGFybXMgPT0gbnVsbCA/IG51bGwgOiAoU3RyaW5nW10pKHBhcm1zLnRvQXJyYXkoIG5ldyBTdHJpbmdbMF0gKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICAqIENhbGwgdGhpcyBtZXRob2QgdG8gZ2V0IGFsbCBvZiB0aGUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgotICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBib3RoIHRoZSByZXF1aXJlZCBwb3NpdGlvbmFscyBhbmQgdGhlCi0gICAgKiBvcHRpb25hbCBwb3NpdGlvbmFscyBpbiB0aGF0IG9yZGVyLiAgSWYgbm8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzCi0gICAgKiB3ZXJlIHNwZWNpZmllZCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0gICoqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0X3Bvc2l0aW9uYWxzKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nW10pZmxhZ3Nfc3BlY2lmaWVkW1BPU0lUSU9OQUxfUk9XXS50b0FycmF5KCBuZXcgU3RyaW5nWzBdICk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGZsYWcgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlcgotICAgICogb3RoZXJ3aXNlIGZhbHNlIGlzIHJldHVybmVkLgotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gZmxhZ19zcGVjaWZpZWQoIFN0cmluZyBmbGFnICkKLSAgewotICAgIHJldHVybiBnZXRfZmxhZ19wYXJtcyggZmxhZyApICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZnVsbHkgZm9ybWF0ZWQgaGVscCB0ZXh0IHN5bnRheCBmb3IgdGhpcwotICAgICogY29tbWFuZCBsaW5lLgotICAqKi8KLSAgcHVibGljIFN0cmluZyBnZXRfaGVscF90ZXh0KCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBoZWxwX3RleHQgID0gbmV3IFN0cmluZ0J1ZmZlcig0MDApOwotICAgIGludCAgICAgICAgICBoZWxwX3dpZHRoID0gSEVMUF9MSU5FX0xFTiAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gICAgICAgICAgICAgIC8vIGJsYW5rcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtICAgICAgICAgICAgICAvLyBkYXNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZmxhZ19zaXplIC0gIC8vIGZsYWcgZmllbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSAgICAgICAgICAgICAgLy8gYmxhbmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9uYW1lX3NpemUgLSAgLy8gbmFtZSBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsgICAgICAgICAgICAgICAvLyBibGFuawotCi0gICAgaGVscF90ZXh0LmFwcGVuZCggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0lORk9fU1lOVEFYICkgKwotICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyB0b29sX25hbWUgKyAiICIgKTsKLQotICAgIC8vIERpc3BsYXkgdGhlIHJlcXVpcmVkIHBvc2l0aW9uYWxzIGlmIGFueS4KLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgcmVxdWlyZWRfcG9zaXRpb25hbHM7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGhlbHBfdGV4dC5hcHBlbmQoIGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9baW5kZXhdW05BTUVfQ09MXSApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgIiApOwotICAgIH0KLQotICAgIGhlbHBfdGV4dC5hcHBlbmQoICJbIiArIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9GTEFHUyApICsKLSAgICAgICAgICAgICAgICAgICAgICAiXSAiICk7Ci0KLSAgICBpZiggb3B0aW9uYWxfcG9zaXRpb25hbHNfYWxsb3dlZCA9PSB0cnVlICkKLSAgICB7Ci0gICAgICBoZWxwX3RleHQuYXBwZW5kKCBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKCBmbGFnc19pbmZvW29wdGlvbmFsX2xpc3RfaW5kZXhdW05BTUVfQ09MXSApICk7Ci0gICAgfQotCi0gICAgaGVscF90ZXh0LmFwcGVuZCggIlxuICAiICsgbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0lORk9fV0hFUkUgKSArICJcbiIgKTsKLQotICAgIC8vIENyZWF0ZSBvbmUgbGluZSBvZiBkZXNjcmlwdGlvbiBmb3IgZWFjaCBwYXJhbWV0ZXIKLSAgICBmb3IoIGludCByb3cgPSAwOyByb3cgPCBmbGFnc19pbmZvLmxlbmd0aDsgcm93KysgKQotICAgIHsKLSAgICAgIFN0cmluZyBjb2x1bW5JZCAgID0gZmxhZ3NfaW5mb1tyb3ddW05BTUVfQ09MXTsKLSAgICAgIFN0cmluZyBjb2x1bW5OYW1lID0gY29sdW1uSWQgPT0gTk9fUEFSTSA/ICIiIDogZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggY29sdW1uSWQgKTsKLQotICAgICAgU3RyaW5nIGZsYWdJZCAgICAgPSBmbGFnc19pbmZvW3Jvd11bRkxBR19DT0xdOwotICAgICAgU3RyaW5nIGZsYWdOYW1lICAgPSBmbGFnSWQgPT0gUE9TSVRJT05BTCA/IFBPU0lUSU9OQUwgOiBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKGZsYWdJZCk7Ci0KLSAgICAgIGludCBmbGFnX3BhZGRpbmcgPSBtYXhfZmxhZ19zaXplIC0gZmxhZ05hbWUubGVuZ3RoKCk7Ci0gICAgICBpbnQgbmFtZV9wYWRkaW5nID0gbWF4X25hbWVfc2l6ZSAtIGNvbHVtbk5hbWUubGVuZ3RoKCk7Ci0KLSAgICAgIC8vIFNraXAgdGhpcyByb3cgaWYgdGhpcyBpcyBhIG1hcmtlciBmb3Igbm8gb3B0aW9uYWwgcG9zaXRpb25hbHMuCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSA9PSBQT1NJVElPTkFMICYmCi0gICAgICAgICAgZmxhZ3NfaW5mb1tyb3ddW05BTUVfQ09MXSA9PSBOT19QQVJNICkgY29udGludWU7Ci0KLSAgICAgIGlmKCBmbGFnTmFtZSA9PSBQT1NJVElPTkFMICkKLSAgICAgIHsKLSAgICAgICAgaGVscF90ZXh0LmFwcGVuZCggZ2V0QmxhbmtzKDMgKSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBoZWxwX3RleHQuYXBwZW5kKCAiICAtIiArIGZsYWdOYW1lICk7Ci0gICAgICB9Ci0KLSAgICAgIGhlbHBfdGV4dC5hcHBlbmQoIGdldEJsYW5rcyggZmxhZ19wYWRkaW5nICsgMSApICk7Ci0gICAgICBoZWxwX3RleHQuYXBwZW5kKCBjb2x1bW5OYW1lICk7Ci0gICAgICBoZWxwX3RleHQuYXBwZW5kKCBnZXRCbGFua3MoIG5hbWVfcGFkZGluZyArIDEgKSApOwotCi0gICAgICBTdHJpbmcgICBjb2x1bW5IZWxwID0gZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tyb3ddW0hFTFBfQ09MXSApOwotICAgICAgU3RyaW5nW10gc3BsaXRfaGVscF90ZXh0Ci0gICAgICAgID0gU3RyaW5nVXRpbHMuc3BsaXR0ZXIoIGNvbHVtbkhlbHAsIGhlbHBfd2lkdGggKTsKLQotICAgICAgaWYoIHNwbGl0X2hlbHBfdGV4dC5sZW5ndGggPiAwICkKLSAgICAgICAgaGVscF90ZXh0LmFwcGVuZCggc3BsaXRfaGVscF90ZXh0WzBdICsgIlxuIiApOwotICAgICAgZWxzZQotICAgICAgICBoZWxwX3RleHQuYXBwZW5kKCAiXG4iICk7Ci0KLSAgICAgIGZvciggaW50IGluZGV4ID0gMTsgaW5kZXggPCBzcGxpdF9oZWxwX3RleHQubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgaGVscF90ZXh0LmFwcGVuZCggZ2V0QmxhbmtzKCBIRUxQX0xJTkVfTEVOIC0gaGVscF93aWR0aCApICk7Ci0gICAgICAgIGhlbHBfdGV4dC5hcHBlbmQoIHNwbGl0X2hlbHBfdGV4dFtpbmRleF0gKyAiXG4iICk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGhlbHBfdGV4dC5hcHBlbmQoICJcbiIgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gIiIgKyBoZWxwX3RleHQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAgUmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYmxhbmtzLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmxhbmtzKCBpbnQgY291bnQgKQotICB7Ci0gIAljaGFyW10gYmxhbmtzID0gbmV3IGNoYXJbY291bnRdOwotICAJQXJyYXlzLmZpbGwoIGJsYW5rcywgMCwgY291bnQsICcgJyApOwotICAJCi0gIAlyZXR1cm4gbmV3IFN0cmluZyggYmxhbmtzICk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgZm9yIGFsbCBjb21tYW5kIGxpbmUgZXhjZXB0aW9uIGNsYXNzZXMuCi0gICoqLwotICBzdGF0aWMgcHVibGljIGNsYXNzIEVycm9yRXhjIGV4dGVuZHMgRXhjZXB0aW9uCi0gIHsKLSAgCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzU2NzMxNzI1OTc5MzcyMEw7Ci0KLQlwdWJsaWMgRXJyb3JFeGMoIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBhcmdzICkKLSAgCXsKLSAgCSAgc3VwZXIoIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBtZXNzYWdlLCBhcmdzICkgKTsKLSAgCX0KLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBjbGFzcyB3aWxsIGJlIHRocm93biB3aGVuIGFuIGludGVybmFsIGVycm9yIGlzIGRldGVjdGVkLgotICAgICogVGhpcyB1c3VhbGx5IGhhcHBlbnMgaWYgdGhlIGZsYWcgZGVzY3JpcHRpb24gaW5mb3JtYXRpb24gd2FzCi0gICAgKiBzcGVjaWZpZWQgaW5jb3JyZWN0bHkuCi0gICoqLwotICBzdGF0aWMgcHVibGljIGNsYXNzIEludGVybmFsRXJyb3JFeGMgZXh0ZW5kcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgeyAgCQotICAJLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4NDEwNjIxMTM2NjE0NDUwTDsKLQotCXB1YmxpYyBJbnRlcm5hbEVycm9yRXhjKCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gYXJncyApCi0gIAl7Ci0gIAkgIHN1cGVyKCBNZXNzYWdlRm9ybWF0LmZvcm1hdCggbWVzc2FnZSwgYXJncyApICk7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBJbnRlcm5hbEVycm9yRXhjKCBTdHJpbmcgbWVzc2FnZSApCi0gIAl7Ci0gIAkgIHRoaXMoIG1lc3NhZ2UsIChTdHJpbmdbXSludWxsICk7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBJbnRlcm5hbEVycm9yRXhjKCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGFyZyApCi0gIAl7Ci0gIAkgIHRoaXMoIG1lc3NhZ2UsIG5ldyBTdHJpbmdbXXsgYXJnIH0gKTsKLSAgCX0KLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBjbGFzcyB3aWxsIGJlIHRocm93biBpZiBhIHVzZXIgZXJyb3Igb2NjdXJzIHdoaWxlIHBhcnNpbmcgdGhlIGNvbW1hbmQgbGluZS4KLSAgKiovCi0gIHN0YXRpYyBwdWJsaWMgY2xhc3MgRmxhZ19lcnJvciBleHRlbmRzIEVycm9yRXhjCi0gIHsKLSAgICAvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM4MzI2MjE3NzY4Nzc2NjM1MzdMOwotCi0JcHVibGljIEZsYWdfZXJyb3IoIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICBzdXBlciggbWVzc2FnZSwgYXJncyApOwotICAgIH0KLQotICAgIHB1YmxpYyBGbGFnX2Vycm9yKCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGFyZyApCi0gICAgewotICAgICAgc3VwZXIoIG1lc3NhZ2UsIG5ldyBTdHJpbmdbXXsgYXJnIH0gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmxhZ19lcnJvciggU3RyaW5nIG1lc3NhZ2UgKQotICAgIHsKLSAgICAgIHN1cGVyKCBtZXNzYWdlLCBudWxsICk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAgKiBUcmllcyB0byBwcm9jZXNzIGEgc2luZ2xlIGZsYWcgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAqIEBwYXJhbSAgYXJncyAgICAgIEFsbCB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCi0gICAgKiBAcGFyYW0gIGFyZ19pbmRleCBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgYXJndW1lbnQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQuCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgd2UgYXJlIHByb2Nlc3NpbmcgaXMgYSBmbGFnIHRoYXQgaGFzIGEKLSAgICAqICAgICAgICAgcGFyYW1ldGVyIGFuZCB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgbmV4dCBhcmd1bWVudC4KLSAgKiovCi0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzX2FyZyggU3RyaW5nW10gYXJncywgaW50IGFyZ19pbmRleCApIHRocm93cyBGbGFnX2Vycm9yCi0gIHsKLSAgICBib29sZWFuIHByb2Nlc3NlZF9uZXh0X2FyZyA9IGZhbHNlOwotCi0gICAgaWYoIGFyZ3NbYXJnX2luZGV4XS5jaGFyQXQoMCkgPT0gJy0nICkKLSAgICB7Ci0gICAgICAvLyBUaGlzIGlzIHRoZSBzdGFydCBvZiBhIGZsYWcuCi0gICAgICBpbnQgZmxhZ19pbmRleCA9IDE7Ci0gICAgICBpbnQgaW5mb19pbmRleCA9IGdldF9pbmZvX2luZGV4KCBhcmdzW2FyZ19pbmRleF0sIGZsYWdfaW5kZXggKTsKLSAgICAgIGludCBtYXhfaW5kZXggID0gZ2V0X21heF9pbmRleCggYXJnc1thcmdfaW5kZXhdLCBmbGFnX2luZGV4LCBpbmZvX2luZGV4ICk7Ci0KLSAgICAgIGlmKCBmbGFnc19pbmZvW2luZm9faW5kZXhdW05BTUVfQ09MXSAhPSBOT19QQVJNICkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhpcyBmbGFnIHRha2VzIGEgcGFyYW1ldGVyIHNvIGNoZWNrIGlmIGl0IGlzIHN0dWNrIHRvIHRoaXMKLSAgICAgICAgLy8gYXJnLgotICAgICAgICBpZiggbWF4X2luZGV4IDwgYXJnc1thcmdfaW5kZXhdLmxlbmd0aCgpICkKLSAgICAgICAgewotICAgICAgICAgIGFkZF9mbGFnX3Bhcm0oIGluZm9faW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdfaW5kZXhdLnN1YnN0cmluZyggbWF4X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJnX2luZGV4XS5sZW5ndGgoKSApICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gVGhpcyBmbGFnIGhhcyBhIHBhcmFtZXRlciBhbmQgaXQgd2Fzbid0IHN0dWNrIHRvIHRoZSBmbGFnLAotICAgICAgICAgIC8vIHNvIHdlIHdpbGwgdHJ5IHRvIGdldCBpdCBmcm9tIHRoZSBuZXh0IGFyZy4KLSAgICAgICAgICBpZiggYXJnX2luZGV4KzEgPCBhcmdzLmxlbmd0aCAmJgotICAgICAgICAgICAgICBhcmdzW2FyZ19pbmRleCsxXS5jaGFyQXQoMCkgIT0gJy0nICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZSBmb3VuZCBhbiBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgc3RyaW5nIHNvIHdlIHdpbGwgdXNlIHRoaXMKLSAgICAgICAgICAgIC8vIG9uZSBhcyBhIHBhcmFtZXRlciBmb3IgdGhpcyBmbGFnLiAgTm90ZTogaWYgd2FzIG5vIHBhcmFtZXRlcgotICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIGZsYWcgYXQgYWxsLCB0aGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgaW4gdGhlCi0gICAgICAgICAgICAvLyBjaGVja19ydWxlcyBtZXRob2QuCi0gICAgICAgICAgICBhZGRfZmxhZ19wYXJtKCBpbmZvX2luZGV4LCBhcmdzW2FyZ19pbmRleCsxXSApOwotICAgICAgICAgICAgcHJvY2Vzc2VkX25leHRfYXJnID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEVycm9yIG1pc3NpbmcgcGFyYW1hdGVyLiBUaGlzIGVycm9yIGlzIGNhdWdodCBieSBjaGVja19ydWxlcy4KLSAgICAgICAgICAgIGFkZF9mbGFnX3Bhcm0oIGluZm9faW5kZXgsIG51bGwgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlIGZsYWcgZG9lcyBub3QgaGF2ZSBhIHBhcmFtZXRlciBzbyB3ZSB3aWxsIGFkZCBhIG51bGwuCi0gICAgICAgIGFkZF9mbGFnX3Bhcm0oIGluZm9faW5kZXgsIG51bGwgKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgYSBwb3NpdGlvbmFsIHBhcmFtZXRlciBpcyBzdHVjayB0byB0aGlzIGZsYWcuCi0gICAgICAgIGlmKCBtYXhfaW5kZXggPCBhcmdzW2FyZ19pbmRleF0ubGVuZ3RoKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgYWRkX3Bvc2l0aW9uYWwoIGFyZ3NbYXJnX2luZGV4XS5zdWJzdHJpbmcoIG1heF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdfaW5kZXhdLmxlbmd0aCgpICkgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gVGhpcyBpcyBhIHBvc2l0aW9uYWwgcGFyYW1ldGVyLgotICAgICAgYWRkX3Bvc2l0aW9uYWwoIGFyZ3NbYXJnX2luZGV4XSApOwotICAgIH0KLQotICAgIHJldHVybiBwcm9jZXNzZWRfbmV4dF9hcmc7Ci0gIH0KLQotICAvKioKLSAgICAqIEZpbmRzIHRoZSByb3cgZm9yIHRoZSBmbGFnIHRoYXQgdW5pcXVlbHkgbWF0Y2hlZCB0aGlzIGZsYWcgc3RyLgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmbGFnc19pbmZvIGluZGV4IG9mIHRoZSBtYXRjaGluZyBmbGFnLgotICAqKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0X2luZm9faW5kZXgoIFN0cmluZyBmbGFnX3N0ciwgaW50IHN0YXJ0X2luZGV4ICkKLSAgICB0aHJvd3MgRmxhZ19lcnJvcgotICB7Ci0gICAgLy9pbnQgaW5mb19zdGFydCAgPSAxOwotICAgIC8vaW50IGluZm9fZW5kICAgID0gZmxhZ3NfaW5mby5sZW5ndGg7Ci0gICAgaW50IGluZm9faW5kZXg7Ci0gICAgaW50IGZvdW5kX2NvdW50ID0gMDsKLSAgICBpbnQgaW5mb19jb2xfaW5kZXggPSAwOwotICAgIGludCBsYXN0X2luZm9faW5kZXggPSAwOwotCi0gICAgQml0U2V0IGZsYWdzX3JlamVjdGVkID0gbmV3IEJpdFNldCgpOwotCi0gICAgLy8gTG9vcCBvdmVyIGVhY2ggY2hhciBpbiBmbGFnX3N0ci4gIE5vdGU6IHdlIHdpbGwgcHJvYmFibHkgYmFpbCBlYXJseS4KLSAgICBmb3IoIGludCBmbGFnX2NvbF9pbmRleCA9IHN0YXJ0X2luZGV4OyBmbGFnX2NvbF9pbmRleCA8IGZsYWdfc3RyLmxlbmd0aCgpOyBmbGFnX2NvbF9pbmRleCsrICkKLSAgICB7Ci0gICAgICAvLyBMb29wIG92ZXIgZWFjaCBmbGFnIGluIGZsYWdfaW5mbwotICAgICAgZm9yKCBpbmZvX2luZGV4ID0gMDsgaW5mb19pbmRleCA8IGZsYWdzX2luZm8ubGVuZ3RoOyBpbmZvX2luZGV4KysgKQotICAgICAgewotICAgICAgICBTdHJpbmcgZmxhZ0lkICAgPSBmbGFnc19pbmZvW2luZm9faW5kZXhdW0ZMQUdfQ09MXTsKLSAgICAgICAgU3RyaW5nIGZsYWdOYW1lID0gZmxhZ0lkID09IFBPU0lUSU9OQUwgPyBQT1NJVElPTkFMIDogZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ0lkICk7Ci0KLSAgICAgICAgaWYoIGZsYWdzX3JlamVjdGVkLmdldCggaW5mb19pbmRleCApID09IGZhbHNlICYmCi0gICAgICAgICAgICBpbmZvX2NvbF9pbmRleCA8IGZsYWdOYW1lLmxlbmd0aCgpICYmCi0gICAgICAgICAgICAgIENoYXJhY3Rlci50b0xvd2VyQ2FzZShmbGFnX3N0ci5jaGFyQXQoZmxhZ19jb2xfaW5kZXgpKSA9PQotICAgICAgICAgICAgICBmbGFnTmFtZS5jaGFyQXQoaW5mb19jb2xfaW5kZXgpICkKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kX2NvdW50Kys7Ci0gICAgICAgICAgbGFzdF9pbmZvX2luZGV4ID0gaW5mb19pbmRleDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmbGFnc19yZWplY3RlZC5zZXQoIGluZm9faW5kZXggKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiggZm91bmRfY291bnQgPT0gMSApCi0gICAgICB7Ci0gICAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4KLSAgICAgICAgcmV0dXJuIGxhc3RfaW5mb19pbmRleDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoIGZvdW5kX2NvdW50ID09IDAgKQotICAgICAgewotICAgICAgICAvLyBGbGFnIG5vdCBmb3VuZCBhdCBhbGwuCi0gICAgICAgIHRocm93IG5ldyBGbGFnX2Vycm9yKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfRkxBR19OT1RfRk9VTkQgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfc3RyLnN1YnN0cmluZyggc3RhcnRfaW5kZXggKSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNb3JlIHRoYW4gb25lIGZsYWcgd2FzIGZvdW5kIHdpdGggdGhpcyBjaGFyIHNvIHdlIHdpbGwgZ28gdG8gdGhlCi0gICAgICAgIC8vIG5leHQgY2hhciB0byB1bmlxdWVseSBtYXRjaCBpdC4KLSAgICAgICAgaW5mb19jb2xfaW5kZXgrKzsKLSAgICAgICAgLy9pbmZvX3N0YXJ0ID0gbGFzdF9pbmZvX2luZGV4IC0gZm91bmRfY291bnQgKyAxOwotICAgICAgICAvL2luZm9fZW5kICAgPSBsYXN0X2luZm9faW5kZXggKyAxOwotICAgICAgICBmb3VuZF9jb3VudCA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIG9ubHkgd2F5IHRvIGdldCB0byB0aGlzIGNvZGUgaXMgaWYgdGhlIGxvb3AgZXhpdGVkIHdpdGgKLSAgICAvLyB0aGUgZm91bmRfY291bnQgZ3JlYXRlciB0aGFuIDEuICBUaGVyZWZvcmUsIHRoZSBmbGFnIHNwZWNpZmllZCBpcwotICAgIC8vIGFtYmlndW91cy4KLSAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0FNQklHVU9VU19GTEFHICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfc3RyLnN1YnN0cmluZyggc3RhcnRfaW5kZXgpICk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHRyaWVzIHRvIG1hdGNoIGFzIG1hbnkgY2hhcmFjdGVycyBhcyBwb3NzaWJsZSBvZiB0aGUgdXNlcgotICAgICogc3BlY2lmaWVkIGZsYWcgd2l0aCB0aGUgbWF0Y2hlZCBmbGFnIHN0cmluZy4KLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgbWF0Y2hpbmcgZmxhZyBjaGFyYXJhY3Rlci4KLSAgKiovCi0gIHByaXZhdGUgaW50IGdldF9tYXhfaW5kZXgoIFN0cmluZyBmbGFnX3N0ciwgaW50IGZsYWdfc3RhcnQsIGludCBpbmZvX2luZGV4ICkKLSAgewotICAgIGludCBmbGFnX2NvbF9pbmRleCA9IGZsYWdfc3RhcnQ7Ci0gICAgaW50IGluZm9fY29sX2luZGV4ID0gMDsKLQotICAgIFN0cmluZyBpbmZvX3N0ciA9IGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9baW5mb19pbmRleF1bRkxBR19DT0xdICk7Ci0KLSAgICB3aGlsZSggZmxhZ19jb2xfaW5kZXggPCBmbGFnX3N0ci5sZW5ndGgoKSAmJgotICAgICAgICAgICBpbmZvX2NvbF9pbmRleCA8IGluZm9fc3RyLmxlbmd0aCgpICkKLSAgICB7Ci0gICAgICBpZiggQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKCBmbGFnX3N0ci5jaGFyQXQoZmxhZ19jb2xfaW5kZXgpICkgIT0KLSAgICAgICAgICBpbmZvX3N0ci5jaGFyQXQoaW5mb19jb2xfaW5kZXgpICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGZsYWdfY29sX2luZGV4Kys7Ci0gICAgICBpbmZvX2NvbF9pbmRleCsrOwotICAgIH0KLQotICAgIHJldHVybiBmbGFnX2NvbF9pbmRleDsKLSAgfQotCi0gIC8qKgotICAgICogQWRkcyBhIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHRvIGZsYWdzX3NwZWNpZmllZC4KLSAgKiovCi0gIHByaXZhdGUgdm9pZCBhZGRfcG9zaXRpb25hbCggU3RyaW5nIHBvc2l0aW9uYWxfcGFybSApCi0gIHsKLSAgICBpZiggZmxhZ3Nfc3BlY2lmaWVkW1BPU0lUSU9OQUxfUk9XXSA9PSBudWxsICkKLSAgICAgIGZsYWdzX3NwZWNpZmllZFtQT1NJVElPTkFMX1JPV10gPSBuZXcgVmVjdG9yKDMpOwotCi0gICAgZmxhZ3Nfc3BlY2lmaWVkW1BPU0lUSU9OQUxfUk9XXS5hZGQoIHBvc2l0aW9uYWxfcGFybSApOwotICB9Ci0KLSAgLyoqCi0gICAgKiBBZGRzIGEgZmxhZyBhbmQgaXRzIHBhcmFtZXRlciB0byBmbGFnc19zcGVjaWZpZWQuICBJZiBvbmx5IHRoZQotICAgICogZmxhZyB3YXMgc3BlY2lmaWVkLCB0aGVuIGEgbnVsbCBzaG91bGQgYmUgcGFzc2VkIHRvIGZsYWdfcGFybS4KLSAgKiovCi0gIHByaXZhdGUgdm9pZCBhZGRfZmxhZ19wYXJtKCBpbnQgZmxhZ19pbmRleCwgU3RyaW5nIGZsYWdfcGFybSApCi0gICAgdGhyb3dzIEZsYWdfZXJyb3IKLSAgewotICAgIGlmKCBmbGFnc19pbmZvW2ZsYWdfaW5kZXhdW0RVUF9DT0xdID09IE5PX0RVUFMgJiYKLSAgICAgICAgZmxhZ3Nfc3BlY2lmaWVkW2ZsYWdfaW5kZXhdICE9IG51bGwgKQotICAgICAgdGhyb3cgbmV3IEZsYWdfZXJyb3IoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9EVVBMSUNBVEVfRkxBR1NfTk9UX0FMTE9XRUQgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tmbGFnX2luZGV4XVtGTEFHX0NPTF0gKSApOwotCi0gICAgaWYoIGZsYWdzX3NwZWNpZmllZFtmbGFnX2luZGV4XSA9PSBudWxsICkKLSAgICAgIGZsYWdzX3NwZWNpZmllZFtmbGFnX2luZGV4XSA9IG5ldyBWZWN0b3IoMyk7Ci0KLSAgICBmbGFnc19zcGVjaWZpZWRbZmxhZ19pbmRleF0uYWRkKCBmbGFnX3Bhcm0gKTsKLSAgfQotCi0gIC8qKgotICAgICogQ2hlY2tzIHRoYXQgdGhlIHVzZXIgaGFzbid0IGJyb2tlbiBhbnkgY29tbWFuZCBsaW5lIHJ1bGVzLgotICAqKi8KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrX3J1bGVzKCkgdGhyb3dzIEZsYWdfZXJyb3IKLSAgewotICAgIC8vIENoZWNrIHRoYXQgYWxsIG9mIHRoZSByZXF1aXJlZCBwb3NpdGlvbmFscyB3ZXJlIHNwZWNpZmllZC4KLSAgICBpbnQgcG9zaXRpb25hbF9jb3VudCA9IDA7Ci0KLSAgICBpZiggZmxhZ3Nfc3BlY2lmaWVkW1BPU0lUSU9OQUxfUk9XXSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBwb3NpdGlvbmFsX2NvdW50ID0gZmxhZ3Nfc3BlY2lmaWVkW1BPU0lUSU9OQUxfUk9XXS5zaXplKCk7Ci0gICAgfQotCi0gICAgaWYoIHJlcXVpcmVkX3Bvc2l0aW9uYWxzID4gcG9zaXRpb25hbF9jb3VudCApCi0gICAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX01JU1NJTkdfUE9TSVRJT05BTCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKCBmbGFnc19pbmZvW3JlcXVpcmVkX3Bvc2l0aW9uYWxzLTFdW05BTUVfQ09MXSApICk7Ci0KLSAgICBlbHNlIGlmKCByZXF1aXJlZF9wb3NpdGlvbmFscyA8IHBvc2l0aW9uYWxfY291bnQgJiYKLSAgICAgICAgICAgICBvcHRpb25hbF9wb3NpdGlvbmFsc19hbGxvd2VkID09IGZhbHNlICkKLSAgICAgIHRocm93IG5ldyBGbGFnX2Vycm9yKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfVE9PX01BTllfUE9TSVRJT05BTFMgKSApOwotCi0gICAgZm9yKCBpbnQgcm93ID0gMDsgcm93IDwgZmxhZ3NfaW5mby5sZW5ndGg7IHJvdysrICkKLSAgICB7Ci0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSA9PSBQT1NJVElPTkFMICkgY29udGludWU7Ci0KLSAgICAgIGlmKCBmbGFnc19zcGVjaWZpZWRbcm93XSA9PSBudWxsICYmCi0gICAgICAgICAgZmxhZ3NfaW5mb1tyb3ddW1JFUVVJUkVEX0NPTF0gPT0gUkVRVUlSRUQgKQotICAgICAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX01JU1NJTkdfUkVRVUlSRURfRkxBRyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0gKSApOwotCi0gICAgICBpbnQgcGFybV9jb3VudCA9IDA7Ci0KLSAgICAgIGlmKCBmbGFnc19zcGVjaWZpZWRbcm93XSAhPSBudWxsICkgcGFybV9jb3VudCA9IGZsYWdzX3NwZWNpZmllZFtyb3ddLnNpemUoKTsKLQotICAgICAgLy8gQ2hlY2sgZm9yIHRvbyBtYW55IGZsYWcgcGFyYW1ldGVycy4KLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bRFVQX0NPTF0gPT0gTk9fRFVQUyAmJiBwYXJtX2NvdW50ID4gMSApCi0gICAgICAgIHRocm93IG5ldyBGbGFnX2Vycm9yKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfRFVQTElDQVRFX0ZMQUdTX05PVF9BTExPV0VEICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSApICk7Ci0KLSAgICAgIC8vIENoZWNrIGZvciBtaXNzaW5nIGZsYWcgcGFyYW1ldGVyLgotICAgICAgaWYoIHBhcm1fY291bnQgPiAwICYmIGZsYWdzX2luZm9bcm93XVtOQU1FX0NPTF0gIT0gTk9fUEFSTSApCi0gICAgICB7Ci0gICAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBmbGFnc19zcGVjaWZpZWRbcm93XS5zaXplKCk7IGluZGV4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoIGZsYWdzX3NwZWNpZmllZFtyb3ddLmVsZW1lbnRBdChpbmRleCkgPT0gbnVsbCApCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX01JU1NJTkdfRkxBR19QQVJBTUVURVIgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKCBmbGFnc19pbmZvW3Jvd11bTkFNRV9DT0xdICkgfSApOwotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgYSBwcm9wZXIgZmxhZ3NfaW5mbyBzdHJpbmcgYXJyYXkgd2FzIHBhc3NlZAotICAgICogdG8gdXMgYnkgdGhlIHByb2dyYW1tZXIuCi0gICoqLwotICBwcml2YXRlIHZvaWQgdmVyaWZ5X2ZsYWdzX2luZm8oKSB0aHJvd3MgSW50ZXJuYWxFcnJvckV4YwotICB7Ci0gICAgYm9vbGVhbiBkb25lX3Bvc2l0aW9uYWxzID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBoZWxwX3NwZWNpZmllZCAgID0gZmFsc2U7Ci0KLSAgICByZXF1aXJlZF9wb3NpdGlvbmFscyA9IDA7Ci0gICAgb3B0aW9uYWxfcG9zaXRpb25hbHNfYWxsb3dlZCA9IGZhbHNlOwotICAgIG9wdGlvbmFsX2xpc3RfaW5kZXggPSAtMTsKLSAgICBtYXhfZmxhZ19zaXplID0gMDsKLSAgICBtYXhfbmFtZV9zaXplID0gMDsKLQotICAgIGlmKCBmbGFnc19pbmZvID09IG51bGwgfHwgZmxhZ3NfaW5mby5sZW5ndGggPT0gMCApCi0gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX05PX0ZMQUdTX0RBVEFfU1BFQ0lGSUVEICApICk7Ci0KLSAgICBpZiggZmxhZ3NfaW5mb1tQT1NJVElPTkFMX1JPV10gIT0gbnVsbCAmJgotICAgICAgICBmbGFnc19pbmZvW1BPU0lUSU9OQUxfUk9XXS5sZW5ndGggPiAwICYmCi0gICAgICAgIGZsYWdzX2luZm9bUE9TSVRJT05BTF9ST1ddW0ZMQUdfQ09MXSAhPSBQT1NJVElPTkFMICkKLSAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfRklSU1RfRkxBR19OT1RfUE9TSVRJT05BTCApICk7Ci0KLSAgICBmb3IoIGludCByb3cgPSAwOyByb3cgPCBmbGFnc19pbmZvLmxlbmd0aDsgcm93KysgKQotICAgIHsKLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd10gPT0gbnVsbCApCi0gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfTlVMTF9GTEFHX1JPVyApICk7Ci0KLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd10ubGVuZ3RoICE9IDUgKQotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9ST1dfU0laRSApICk7Ci0KLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bRkxBR19DT0xdID09IG51bGwgfHwKLSAgICAgICAgICBmbGFnc19pbmZvW3Jvd11bTkFNRV9DT0xdID09IG51bGwgfHwKLSAgICAgICAgICBmbGFnc19pbmZvW3Jvd11bSEVMUF9DT0xdID09IG51bGwgKQotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX05VTExfSU5fUk9XICkgKTsKLQotICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0uZXF1YWxzKCBoZWxwX2ZsYWcgKSApIGhlbHBfc3BlY2lmaWVkID0gdHJ1ZTsKLQotICAgICAgU3RyaW5nIGZsYWdJZCAgID0gZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXTsKLSAgICAgIFN0cmluZyBuYW1lSWQgICA9IGZsYWdzX2luZm9bcm93XVtOQU1FX0NPTF07Ci0KLSAgICAgIFN0cmluZyBmbGFnX2NvbCA9IGZsYWdJZCA9PSBQT1NJVElPTkFMID8gUE9TSVRJT05BTCA6IGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdJZCApOwotICAgICAgU3RyaW5nIG5hbWVfY29sID0gbmFtZUlkID09IE5PX1BBUk0gPyBOT19QQVJNIDogZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggbmFtZUlkICk7Ci0KLSAgICAgIGlmKCBmbGFnX2NvbC5sZW5ndGgoKSA+IG1heF9mbGFnX3NpemUgKQotICAgICAgICBtYXhfZmxhZ19zaXplID0gZmxhZ19jb2wubGVuZ3RoKCk7Ci0KLSAgICAgIGlmKCBuYW1lX2NvbCAhPSBOT19QQVJNICYmIG5hbWVfY29sLmxlbmd0aCgpID4gbWF4X25hbWVfc2l6ZSApCi0gICAgICAgIG1heF9uYW1lX3NpemUgPSBuYW1lX2NvbC5sZW5ndGgoKTsKLQotICAgICAgLy8gRW5zdXJlIHRoYXQgZmxhZ3MgYXJlIGFsbCBpbiBsb3dlcmNhc2UuCi0gICAgICBpZiggIWZsYWdfY29sLmVxdWFscyggZmxhZ19jb2wudG9Mb3dlckNhc2UoKSApICkKLSAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3JFeGMoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9GTEFHX05PVF9MT1dFUkNBU0UgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfY29sICk7Ci0KLSAgICAgIC8vIEVuc3VyZSB0aGF0IG9ubHkgdGhlIHByZWRlZmluZWQgZHVwIHN0cmluZ3MgYXJlIHVzZWQuCi0gICAgICAvLyBOb3RlOiBpdCdzIG9rIHRvIHVzZSAhPSB3aGVuIGNvbXBhcmluZyBjb25zdGFudCBzdHJpbmdzIGxpdGVyYWxzLgotICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtEVVBfQ09MXSA9PSBudWxsIHx8Ci0gICAgICAgICAgKCBmbGFnc19pbmZvW3Jvd11bRFVQX0NPTF0gIT0gTk9fRFVQUyAmJgotICAgICAgICAgICAgZmxhZ3NfaW5mb1tyb3ddW0RVUF9DT0xdICE9IERVUFNfT0sgKSApCi0gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfSU5DT1JSRUNUX0RVUF9TVFJJTkcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtEVVBfQ09MXSApOwotCi0gICAgICAvLyBFbnN1cmUgdGhhdCBvbmx5IHRoZSBwcmVkZWZpbmVkIHJlcXVpcmVkIHN0cmluZ3MgYXJlIHVzZWQuCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW1JFUVVJUkVEX0NPTF0gPT0gbnVsbCB8fAotICAgICAgICAgICggZmxhZ3NfaW5mb1tyb3ddW1JFUVVJUkVEX0NPTF0gIT0gUkVRVUlSRUQgJiYKLSAgICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdICE9IE9QVElPTkFMICkgKQotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9SRVFVSVJFRF9TVFJJTkcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdICk7Ci0KLSAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgcG9zaXRpb25hbHMuCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSA9PSBQT1NJVElPTkFMICkKLSAgICAgIHsKLSAgICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdID09IFJFUVVJUkVEICkKLSAgICAgICAgewotICAgICAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bTkFNRV9DT0xdID09IE5PX1BBUk0gKQotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3JFeGMoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9SRVFVSVJFRF9QT1NJVElPTkFMX05FRURTX05BTUUgKSApOwotCi0gICAgICAgICAgcmVxdWlyZWRfcG9zaXRpb25hbHMrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBmbGFnc19pbmZvW3Jvd11bTkFNRV9DT0xdICE9IE5PX1BBUk0gKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gV2UgdXNlIHRoZSBOQU1FX0NPTCBmaWVsZCBmb3IgYW4gb3B0aW9uYWwgcG9zaXRpb25hbCB0byBkZW5vdGUKLSAgICAgICAgICAvLyB3aGV0aGVyIGFkZGl0aW9uYWwgcG9zaXRpb25hbHMgYXJlIGFsbG93ZWQgb3Igbm90LgotICAgICAgICAgIG9wdGlvbmFsX3Bvc2l0aW9uYWxzX2FsbG93ZWQgPSB0cnVlOwotICAgICAgICAgIG9wdGlvbmFsX2xpc3RfaW5kZXggPSByb3c7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRW5zdXJlIHRoYXQgcG9zaXRpb25hbHMgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluZm8uCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSAhPSBQT1NJVElPTkFMIHx8Ci0gICAgICAgICAgKCBkb25lX3Bvc2l0aW9uYWxzID09IGZhbHNlICYmCi0gICAgICAgICAgICBmbGFnc19pbmZvW3Jvd11bRkxBR19DT0xdID09IFBPU0lUSU9OQUwgJiYKLSAgICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdID09IE9QVElPTkFMICkgKQotICAgICAgewotICAgICAgICBkb25lX3Bvc2l0aW9uYWxzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoIGRvbmVfcG9zaXRpb25hbHMgPT0gdHJ1ZSApCi0gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfUE9TSVRJT05BTF9OT1RfQVRfQkVHSU5OSU5HICkgKTsKLSAgICB9Ci0KLSAgICAvLyBFbnN1cmUgdGhhdCBhIGhlbHAgZmxhZyB3YXMgc3BlY2lmaWVkIGluIHRoZSBpbmZvIGxpc3QuCi0gICAgaWYoIGhlbHBfc3BlY2lmaWVkID09IGZhbHNlICkKLSAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfSEVMUF9GTEFHX05PVF9TUEVDSUZJRUQgKSApOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGR1bXAgaW50ZXJuYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJzZWQKLSAgICAqIGNvbW1hbmQgbGluZS4KLSAgKiovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0KLSAgICBmb3IoIGludCByb3cgPSAwOyByb3cgPCBmbGFnc19pbmZvLmxlbmd0aDsgcm93KysgKQotICAgIHsKLSAgICAgIGIuYXBwZW5kKCAiXG4iICk7Ci0KLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bRkxBR19DT0xdID09IFBPU0lUSU9OQUwgKQotICAgICAgICBiLmFwcGVuZCggIlBvc2l0aW9uYWw6IiApOwotICAgICAgZWxzZQotICAgICAgICBiLmFwcGVuZCggZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSApICsgIjoiICk7Ci0KLQotICAgICAgaWYoIGZsYWdzX3NwZWNpZmllZFtyb3ddID09IG51bGwgKQotICAgICAgICBiLmFwcGVuZCggIm5vIHBhcmFtZXRlcnMiICk7Ci0gICAgICBlbHNlCi0gICAgICAgIGZvciggaW50IHBhcm1faW5kZXggPSAwOyBwYXJtX2luZGV4IDwgZmxhZ3Nfc3BlY2lmaWVkW3Jvd10uc2l6ZSgpOyBwYXJtX2luZGV4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHBhcm0gPSAoU3RyaW5nKWZsYWdzX3NwZWNpZmllZFtyb3ddLmVsZW1lbnRBdChwYXJtX2luZGV4KTsKLSAgICAgICAgICBiLmFwcGVuZCggcGFybSArICI6IiApOwotICAgICAgICB9Ci0gICAgICBiLmFwcGVuZCggIlxuIiApOwotICAgIH0KLQotICAgIHJldHVybiAiIitiOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09MICAgICA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTCAgICAgPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFVQX0NPTCAgICAgID0gMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEX0NPTCA9IDM7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUxQX0NPTCAgICAgPSA0OwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NJVElPTkFMX1JPVyA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUxQX0xJTkVfTEVOICA9IDc1OwotCi0gIHByaXZhdGUgU3RyaW5nW11bXSBmbGFnc19pbmZvOwotICBwcml2YXRlIFN0cmluZyAgICAgaGVscF9mbGFnOwotICBwcml2YXRlIFN0cmluZyAgICAgdG9vbF9uYW1lOwotICBwcml2YXRlIFZlY3RvcltdICAgZmxhZ3Nfc3BlY2lmaWVkOwotICBwcml2YXRlIGludCAgICAgICAgcmVxdWlyZWRfcG9zaXRpb25hbHM7Ci0gIHByaXZhdGUgYm9vbGVhbiAgICBvcHRpb25hbF9wb3NpdGlvbmFsc19hbGxvd2VkOwotICBwcml2YXRlIGludCAgICAgICAgb3B0aW9uYWxfbGlzdF9pbmRleDsKLSAgcHJpdmF0ZSBpbnQgICAgICAgIG1heF9mbGFnX3NpemU7Ci0gIHByaXZhdGUgaW50ICAgICAgICBtYXhfbmFtZV9zaXplOwotCi0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBtZXNzYWdlczsKLSAgcHJpdmF0ZSAgIFJlc291cmNlQnVuZGxlIGZsYWdNZXNzYWdlczsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbWFuZGxpbmUvRmxhZ01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL0ZsYWdNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWExMjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbWFuZGxpbmUvRmxhZ01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tYW5kbGluZTsKLQotLyoqCi0gICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHN0b3JlIGNvbnN0YW50IHN0cmluZyBlcnJvciBtZXNzYWdlcwotICAqIGdlbmVyYXRlZCBieSBDb21tYW5kTGluZS5qYXZhCi0gICoKLSAgKgotICAqIEBhdXRob3IgUGV0ZXIgTW9vZ2sKLSAgKiBAZGF0ZSAgIEp1bHkgMTMsIDIwMDAKLSAgKiBAc2VlICAgIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tYW5kbGluZS5Db21tYW5kTGluZQotKiovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGbGFnTWVzc2FnZXMKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfRkxBR19OT1RfRk9VTkQgPSAiUEFSU0VSX0VSUk9SX0ZMQUdfTk9UX0ZPVU5EIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfQU1CSUdVT1VTX0ZMQUcgPSAiUEFSU0VSX0VSUk9SX0FNQklHVU9VU19GTEFHIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTUlTU0lOR19QT1NJVElPTkFMID0gIlBBUlNFUl9FUlJPUl9NSVNTSU5HX1BPU0lUSU9OQUwiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9UT09fTUFOWV9QT1NJVElPTkFMUyA9ICJQQVJTRVJfRVJST1JfVE9PX01BTllfUE9TSVRJT05BTFMiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9NSVNTSU5HX1JFUVVJUkVEX0ZMQUcgPSAiUEFSU0VSX0VSUk9SX01JU1NJTkdfUkVRVUlSRURfRkxBRyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0RVUExJQ0FURV9GTEFHU19OT1RfQUxMT1dFRCA9ICJQQVJTRVJfRVJST1JfRFVQTElDQVRFX0ZMQUdTX05PVF9BTExPV0VEIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTUlTU0lOR19GTEFHX1BBUkFNRVRFUiA9ICJQQVJTRVJfRVJST1JfTUlTU0lOR19GTEFHX1BBUkFNRVRFUiI7Ci0KLSAgLy8gRXJyb3IgaW50ZXJuYWwgZXJyb3IgbWVzc2FnZXMuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9NRVNTQUdFX01JU1NJTkdfQVJHID0gIlBBUlNFUl9FUlJPUl9NRVNTQUdFX01JU1NJTkdfQVJHIjsKLQotICAvLyBJbnRlcm5hbCBjb21tYW5kIGxpbmUgZXJyb3IgbWVzc2FnZXMuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9OT19GTEFHU19EQVRBX1NQRUNJRklFRCA9ICJQQVJTRVJfRVJST1JfTk9fRkxBR1NfREFUQV9TUEVDSUZJRUQiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9GSVJTVF9GTEFHX05PVF9QT1NJVElPTkFMID0gIlBBUlNFUl9FUlJPUl9GSVJTVF9GTEFHX05PVF9QT1NJVElPTkFMIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTlVMTF9GTEFHX1JPVyA9ICJQQVJTRVJfRVJST1JfTlVMTF9GTEFHX1JPVyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9ST1dfU0laRSA9ICJQQVJTRVJfRVJST1JfSU5DT1JSRUNUX1JPV19TSVpFIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTlVMTF9JTl9ST1cgPSAiUEFSU0VSX0VSUk9SX05VTExfSU5fUk9XIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfSU5DT1JSRUNUX0RVUF9TVFJJTkcgPSAiUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9EVVBfU1RSSU5HIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfSU5DT1JSRUNUX1JFUVVJUkVEX1NUUklORyA9ICJQQVJTRVJfRVJST1JfSU5DT1JSRUNUX1JFUVVJUkVEX1NUUklORyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX1BPU0lUSU9OQUxfTk9UX0FUX0JFR0lOTklORyA9ICJQQVJTRVJfRVJST1JfUE9TSVRJT05BTF9OT1RfQVRfQkVHSU5OSU5HIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfSEVMUF9GTEFHX05PVF9TUEVDSUZJRUQgPSAiUEFSU0VSX0VSUk9SX0hFTFBfRkxBR19OT1RfU1BFQ0lGSUVEIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfRkxBR1NfTk9UX09SREVSRUQgPSAiUEFSU0VSX0VSUk9SX0ZMQUdTX05PVF9PUkRFUkVEIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfRkxBR19OT1RfTE9XRVJDQVNFID0gIlBBUlNFUl9FUlJPUl9GTEFHX05PVF9MT1dFUkNBU0UiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9SRVFVSVJFRF9QT1NJVElPTkFMX05FRURTX05BTUUgPSAiUEFSU0VSX0VSUk9SX1JFUVVJUkVEX1BPU0lUSU9OQUxfTkVFRFNfTkFNRSI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0lORk9fU1lOVEFYID0gIlBBUlNFUl9TWU5UQVgiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9GTEFHUyA9ICJQQVJTRVJfRkxBR1MiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0lORk9fV0hFUkUgPSAiUEFSU0VSX1dIRVJFIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbWFuZGxpbmUvY29tbWFuZGxpbmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbWFuZGxpbmUvY29tbWFuZGxpbmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg1Mjk4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL2NvbW1hbmRsaW5lLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1QQVJTRVJfRVJST1JfRkxBR19OT1RfRk9VTkQ9SVdBQjAxMjNFIEZsYWcgLXswfSBpcyBub3QgdmFsaWQuCi1QQVJTRVJfRVJST1JfQU1CSUdVT1VTX0ZMQUc9SVdBQjAyODRFIEZsYWcgLXswfSBpcyBhbWJpZ3VvdXMuCi1QQVJTRVJfRVJST1JfTUlTU0lOR19QT1NJVElPTkFMPUlXQUIwMjg1RSBNaXNzaW5nIHswfSBwYXJhbWV0ZXIuCi1QQVJTRVJfRVJST1JfVE9PX01BTllfUE9TSVRJT05BTFM9SVdBQjAyODZFIFRvbyBtYW55IHBvc2l0aW9uYWwgcGFyYW1ldGVycyBzcGVjaWZpZWQuCi1QQVJTRVJfRVJST1JfTUlTU0lOR19SRVFVSVJFRF9GTEFHPUlXQUIwMjg4RSBGbGFnIC17MH0gaXMgbWlzc2luZy4KLVBBUlNFUl9FUlJPUl9EVVBMSUNBVEVfRkxBR1NfTk9UX0FMTE9XRUQ9SVdBQjAyOTNFIEZsYWcgLXswfSBoYXMgYmVlbiBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuCi1QQVJTRVJfRVJST1JfTUlTU0lOR19GTEFHX1BBUkFNRVRFUj1JV0FCMDI5NEUgRmxhZyAtezB9IGlzIG1pc3NpbmcgcGFyYW1ldGVyIHsxfS4KLVBBUlNFUl9FUlJPUl9NRVNTQUdFX01JU1NJTkdfQVJHPUlXQUIwMzE5RSBFcnJvciBtZXNzYWdlIHswfSBpcyBtaXNzaW5nIGFuIGFyZ3VtZW50LgotUEFSU0VSX0VSUk9SX05PX0ZMQUdTX0RBVEFfU1BFQ0lGSUVEPUlXQUIwMzQ1RSBTcGVjaWZ5IGZsYWcgaW5mb3JtYXRpb24uCi1QQVJTRVJfRVJST1JfRklSU1RfRkxBR19OT1RfUE9TSVRJT05BTD1JV0FCMDM0NkUgVGhlIGZpcnN0IGZsYWcgbXVzdCBiZSBwb3NpdGlvbmFsLgotUEFSU0VSX0VSUk9SX05VTExfRkxBR19ST1c9SVdBQjAzNDdFIE51bGwgZmxhZyByb3cuCi1QQVJTRVJfRVJST1JfSU5DT1JSRUNUX1JPV19TSVpFPUlXQUIwMzQ4RSBGbGFnIHJvdyBtdXN0IGhhdmUgNSBzdHJpbmdzLgotUEFSU0VSX0VSUk9SX05VTExfSU5fUk9XPUlXQUIwMzQ5RSBGbGFnIGluZm9ybWF0aW9uIGNvbnRhaW5zIGEgbnVsbCBzdHJpbmcuCi1QQVJTRVJfRVJST1JfSU5DT1JSRUNUX0RVUF9TVFJJTkc9SVdBQjAzNTBFIER1cGxpY2F0ZSBzdHJpbmcgezB9IGlzIG5vdCB2YWxpZC4KLVBBUlNFUl9FUlJPUl9JTkNPUlJFQ1RfUkVRVUlSRURfU1RSSU5HPUlXQUIwMzUxRSBSZXF1aXJlZCBzdHJpbmcgezB9IGlzIG5vdCB2YWxpZC4KLVBBUlNFUl9FUlJPUl9QT1NJVElPTkFMX05PVF9BVF9CRUdJTk5JTkc9SVdBQjAzNTJFIFBvc2l0aW9uYWwgZmxhZyBpcyBub3QgYXQgdGhlIGJlZ2lubmluZy4KLVBBUlNFUl9FUlJPUl9IRUxQX0ZMQUdfTk9UX1NQRUNJRklFRD1JV0FCMDM1M0UgSGVscCBmbGFnIGlzIG5vdCBzcGVjaWZpZWQgaW4gaW5mb3JtYXRpb24gYXJyYXkuCi1QQVJTRVJfRVJST1JfRkxBR1NfTk9UX09SREVSRUQ9SVdBQjAzNTRFIEZsYWdzIGFyZSBub3QgaW4gbGV4aWNhbCBvcmRlci4KLVBBUlNFUl9FUlJPUl9GTEFHX05PVF9MT1dFUkNBU0U9SVdBQjAzNTVFIEZsYWcgezB9IGlzIG5vdCBsb3dlcmNhc2UuCi1QQVJTRVJfRVJST1JfUkVRVUlSRURfUE9TSVRJT05BTF9ORUVEU19OQU1FPUlXQUIwMzU2RSBSZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGEgbmFtZSBzcGVjaWZpZWQuCi1QQVJTRVJfU1lOVEFYPVN5bnRheAotUEFSU0VSX0ZMQUdTPUZsYWdzCi1QQVJTRVJfV0hFUkU9V2hlcmUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWRhNGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnByZWZlcmVuY2VzLkFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgVmVjdG9yIHByZWZlcmVuY2VzXzsKLSAgCi0gIHByaXZhdGUgc3RhdGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkgcmVnaXN0cnlfOwotCi0gIHByaXZhdGUgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeSgpCi0gIHsKLSAgICBwcmVmZXJlbmNlc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgbG9hZERpYWxvZ3NQcmVmZXJlbmNlcygpOyAgCi0gIH0KLSAgCi0gIHN0YXRpYyBwdWJsaWMgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiggcmVnaXN0cnlfID09IG51bGwgKQotICAgIHsKLSAgICAgIHJlZ2lzdHJ5XyA9IG5ldyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZWdpc3RyeV87Ci0gIH0KLSAgCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkRGlhbG9nc1ByZWZlcmVuY2VzICgpCi0gIHsKLSAgCUlFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSIpOwotICAgIAotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50ICAgICAgZWxlbSAgID0gY29uZmlnW2lkeF07ICAgICAKLSAgICAgIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGRpYWxvZyA9IG5ldyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSgpOwotICAgICAgCi0gICAgICBkaWFsb2cuc2V0SWQoIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpICk7Ci0gICAgICBkaWFsb2cuc2V0TmFtZSggZWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSApOwotICAgICAgZGlhbG9nLnNldEluZm9wb3AoIGVsZW0uZ2V0QXR0cmlidXRlKCJpbmZvcG9wIikgKTsKLSAgICAgIGRpYWxvZy5zZXRUb29sdGlwKCBlbGVtLmdldEF0dHJpYnV0ZSgidG9vbHRpcCIpICk7Ci0gICAgICBkaWFsb2cuc2V0Q2F0ZWdvcnkoIGVsZW0uZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpICk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBzaG93Q2hlY2tib3ggPSBlbGVtLmdldEF0dHJpYnV0ZSggInNob3djaGVja2JveCIgKTsKLSAgICAgIFN0cmluZyBhbHdheXNIaWRlICAgPSBlbGVtLmdldEF0dHJpYnV0ZSggImFsd2F5c2hpZGUiICk7Ci0gICAgICAKLSAgICAgIGRpYWxvZy5zZXRTaG93Q2hlY2tib3goIHNob3dDaGVja2JveCA9PSBudWxsID8gdHJ1ZSA6IHNob3dDaGVja2JveC5lcXVhbHMoICJ0cnVlIiApICk7Ci0gICAgICBkaWFsb2cuc2V0QWx3YXlzSGlkZSggYWx3YXlzSGlkZSA9PSBudWxsID8gZmFsc2UgOiBhbHdheXNIaWRlLmVxdWFscyggInRydWUiICkgKTsKLSAgICAgIAotICAgICAgcHJlZmVyZW5jZXNfLmFkZChkaWFsb2cpOyAgICAgICAgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gb2JqZWN0cy4KLSAgKiBAcmV0dXJuIEFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VUeXBlPC9jb2RlPiBvYmplY3RzLgotICAqLwotICBwdWJsaWMgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSBnZXRBY3Rpb25EaWFsb2dzUHJlZnJlbmNlcyAoKQotICB7Ci0gICAgcmV0dXJuIChBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVtdKXByZWZlcmVuY2VzXy50b0FycmF5KCBuZXcgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbMF0pOwotICB9Ci0gIAotICBwdWJsaWMgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgZ2V0QWN0aW9uRGlhbG9nc1ByZWZyZW5jZSggU3RyaW5nIGlkICkKLSAgewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHByZWZlcmVuY2VzXy5zaXplKCk7Ci0gICAgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBwcmVmZXJlbmNlID0gKEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlKXByZWZlcmVuY2VzXy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgICAKLSAgICAgIGlmKCBwcmVmZXJlbmNlLmdldElkKCkuZXF1YWxzKCBpZCApICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcHJlZmVyZW5jZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyMmE0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnBsdWdpbi5FbnZQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnByZWZlcmVuY2VzLkFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dAotewotICBwcml2YXRlIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkgcmVnaXN0cnk7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgaW5zdGFuY2VfID0gbnVsbDsKLQotICBwcml2YXRlIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCgpCi0gIHsKLSAgICBzdXBlcihFbnZQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci0gIH0KLSAgCi0gIHN0YXRpYyBwdWJsaWMgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmKCBpbnN0YW5jZV8gPT0gbnVsbCApCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCgpOwotICAgICAgaW5zdGFuY2VfLmxvYWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvYWQoKQotICB7Ci0gICAgcmVnaXN0cnkgPSBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSBkaWFsb2dzID0gcmVnaXN0cnkuZ2V0QWN0aW9uRGlhbG9nc1ByZWZyZW5jZXMoKTsKLSAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHNldERlZmF1bHQoZGlhbG9nc1tpXS5nZXRJZCgpLCBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlW10gZ2V0RGlhbG9ncygpCi0gIHsKLSAgICByZXR1cm4gcmVnaXN0cnkuZ2V0QWN0aW9uRGlhbG9nc1ByZWZyZW5jZXMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGlvbkRpYWxvZ0VuYWJsZWQoU3RyaW5nIGlkLCBib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoaWQsIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uRGlhbG9nRW5hYmxlZChTdHJpbmcgaWQpCi0gIHsKLSAgICBpZiAoaWQgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKGlkKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZyggU3RyaW5nIGlkICkKLSAgewotICAgIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGRpYWxvZyA9IHJlZ2lzdHJ5LmdldEFjdGlvbkRpYWxvZ3NQcmVmcmVuY2UoIGlkICk7ICAgIAotICAgCi0gICAgcmV0dXJuIChkaWFsb2cuZ2V0U2hvd0NoZWNrYm94KCkgJiYgIWRpYWxvZy5nZXRBbHdheXNIaWRlKCkgJiYgIWlzQWN0aW9uRGlhbG9nRW5hYmxlZCggaWQgKSkgfHwKLSAgICAgICAgICAgICFkaWFsb2cuZ2V0U2hvd0NoZWNrYm94KCkgJiYgIWRpYWxvZy5nZXRBbHdheXNIaWRlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHNob3dDaGVja2JveCggU3RyaW5nIGlkICkKLSAgewotICAgIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGRpYWxvZyA9IHJlZ2lzdHJ5LmdldEFjdGlvbkRpYWxvZ3NQcmVmcmVuY2UoIGlkICk7ICAgIAotICAgIAotICAgIHJldHVybiBkaWFsb2cgPT0gbnVsbCA/IGZhbHNlIDogZGlhbG9nLmdldFNob3dDaGVja2JveCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvUGVyc2lzdGVudFJlc291cmNlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb250ZXh0L1BlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0OTRmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvUGVyc2lzdGVudFJlc291cmNlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VEZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlRyYW5zaWVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYucGx1Z2luLkVudlBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0IGltcGxlbWVudHMgUmVzb3VyY2VDb250ZXh0Ci17Ci0gIHByaXZhdGUgc3RhdGljIFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQgY29udGV4dF8gPSBudWxsOwotICAKLSAgcHVibGljIHN0YXRpYyBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmKCBjb250ZXh0XyA9PSBudWxsICkKLSAgICB7Ci0gICAgICBjb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgICBjb250ZXh0Xy5sb2FkKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjb250ZXh0XzsKLSAgfQotICAKLSAgcHJpdmF0ZSBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0KCkKLSAgewotICAgIHN1cGVyKEVudlBsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvYWQoKQotICB7Ci0gICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX09WRVJXUklURSwgUmVzb3VyY2VEZWZhdWx0cwotICAgICAgICAuZ2V0T3ZlcndyaXRlRmlsZXNEZWZhdWx0KCkpOwotICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9DUkVBVEVfRk9MREVSUywgUmVzb3VyY2VEZWZhdWx0cwotICAgICAgICAuZ2V0Q3JlYXRlRm9sZGVyc0RlZmF1bHQoKSk7Ci0gICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NIRUNLT1VULCBSZXNvdXJjZURlZmF1bHRzLmdldENoZWNrb3V0RmlsZXNEZWZhdWx0KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKGJvb2xlYW4gZW5hYmxlKQotICB7Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9PVkVSV1JJVEUsIGVuYWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9PVkVSV1JJVEUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpCi0gIHsKLSAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0NSRUFURV9GT0xERVJTLCBlbmFibGUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9DUkVBVEVfRk9MREVSUyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDaGVja291dEZpbGVzRW5hYmxlZChib29sZWFuIGVuYWJsZSkKLSAgewotICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ0hFQ0tPVVQsIGVuYWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0NIRUNLT1VUKTsKLSAgfQotCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgY29weSgpCi0gIHsKLSAgICBSZXNvdXJjZUNvbnRleHQgY2MgPSBuZXcgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgY2Muc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKGlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkpOwotICAgIGNjLnNldENyZWF0ZUZvbGRlcnNFbmFibGVkKGlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSk7Ci0gICAgY2Muc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoaXNDaGVja291dEZpbGVzRW5hYmxlZCgpKTsKLSAgICByZXR1cm4gY2M7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvcGx1Z2luL0VudlBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9wbHVnaW4vRW52UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGY0YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9wbHVnaW4vRW52UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgRW52UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFbnZQbHVnaW4gaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEVudlBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudlBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhNTUxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGRlZmluZSBwcmVmZXJlbmNlIGlkcy4gSXQgY29ycmVzcG9uZHMgdG8gaW5mb3JtYXRpb24KLSAqIHNwZWNpZmllZCBieSBhIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGV4dGVuc2lvbiBwb2ludC4KLSAqIEVhY2ggYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgZW50cnkgd2lsbCByZXN1bHQgaW4gYW4gZW50cnkgaW4gdGhlCi0gKiBhY3Rpb24gZGlhbG9ncyBwcmVmZXJlbmNlIHBhZ2UgaWYgdGhlIHNob3djaGVja2JveCBmaWVsZCBpcyB0cnVlLgotICogICAKLSAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogPHByZT4KLSAgKiAgICZsdDtleHRlbnNpb24KLSAqICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUiJmd0OwotICogICAgICZsdDthY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZQotICogICAgICAgICAgIHNob3djaGVja2JveD0idHJ1ZSIKLSAqICAgICAgICAgICBuYW1lPSIlQ0hFQ0tCT1hfU0hPV19HRU5FUkFURV9KQVZBX1BST1hZX0RJQUxPRyIKLSAqICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0Lndzcy5wb3B1cC5jYXRlZ29yeSIKLSAqICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1dTREwyUFJPWFkiCi0gKiAgICAgICAgICAgaW5mb3BvcD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLlBQQUQwMDA0IgotICogICAgICAgICAgIGFsd2F5c2hpZGU9ImZhbHNlIgotICogICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiJmd0OwotICogICAgICZsdDsvYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUmZ3Q7Ci0gKiA8L3ByZT4KLSAqCi0gKiBUaGlzIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGV4dGVuc2lvbiBwb2ludCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gT2JqZWN0Q29udHJpYnV0aW9uCi0gKiBleHRlbnNpb24gcG9pbnQuICBGb3IgZXhhbXBsZTogCi0gKiAKLSAqICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICogICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAqICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzZGwiCi0gKiAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gKiA8IS0tIFdTREwgVG8gSmF2YSBCZWFuIFByb3h5IC0tPgotICogICAgICAgIDxhY3Rpb24KLSAqICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZIgotICogICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gKiAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICogICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICogICAgICAgIDwvYWN0aW9uPgotICogICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICoKLSAqIFRoZSBPYmplY3RDb250cmlidXRpb24gZW50cnkgaXMgbGlua2VkIHdpdGggdGhlIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGVudHJ5Ci0gKiB2aWEgdGhlIGlkIGF0dHJpYnV0ZSBvZiB0aGUgT2JqZWN0Q29udGlyYnV0aW9uIGFuZCB0aGUgaWQgYXR0cmlidXRlIG9mIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlLgotICogTm90ZTogdGhlIGlkIGluIHRoZSBhY3Rpb24gZW50cnkgaXMgYWx3YXlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHluYW1pYyB3aXphcmQgdGhhdAotICogc2hvdWxkIGJlIHBvcHVwZWQgdXAuICBJbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgT2JqZWN0aW9uQ29udHJpYnV0aW9uIGlkIGFuZCB0aGUKLSAqIGFjdGlvbiBpZHMgYXJlIHRoZSBzYW1lLCBidXQgdGhpcyBuZWVkIG5vdCBiZSB0aGUgY2FzZS4gIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgIGlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgIG5hbWVfOwotICBwcml2YXRlIFN0cmluZyAgaW5mb3BvcF87Ci0gIHByaXZhdGUgU3RyaW5nICB0b29sdGlwXzsKLSAgcHJpdmF0ZSBib29sZWFuIHNob3dDaGVja2JveF87Ci0gIHByaXZhdGUgYm9vbGVhbiBhbHdheXNIaWRlXzsKLSAgcHJpdmF0ZSBTdHJpbmcgIGNhdGVnb3J5XzsKLQotICAvKioKLSAgICogU2V0cyB0aGUgaWQgZm9yIHRoaXMgcG9wdXAgYWN0aW9uLiAgVGhpcyBpZCBsaW5rIHRoZSBhY3Rpb25EaWFsb2dQcmVmZXJlbmNlCi0gICAqIHdpdGggYW4gT2JqZWN0Q29udHJpYnV0aW9uLgotICAgKiBAcGFyYW0gaWQgdGhlIGlkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgaWRfID0gaWQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgaWQgZm9yIHRoaXMgcG9wdXAgYWN0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBpZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuIGlkXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBuYW1lIGZvciB0aGlzIHBvcHVwIGFjdGlvbi4gIFRoaXMgbmFtZSBpcyBkaXNwbGF5ZWQgb24gdGhlCi0gICAqIGRpYWxvZyBwcmVmZXJlbmNlcyBwYWdlIGFuZCBtdXN0IGJlIHRyYW5zbGF0ZWQuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwb3B1cCBjaGVjayBib3guCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGRpc3BsYXkgdmFsdWUgZm9yIHRoaXMgcG9wdXAgY2hlY2sgYm94LgotICAgKiBOb3RlOiB0aGlzIHZhbHVlIG1heSBiZSBudWxsIGlmIHRoZSBnZXRTaG93Q2hlY2tCb3ggbWV0aG9kIHJldHVybnMgZmFsc2UuCi0gICAqIEByZXR1cm4gdGhlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGluZm8gcG9wIHZhbHVlIGZvciB0aGlzIHBvcHVwIGNoZWNrIGJveC4KLSAgICogQHBhcmFtIGluZm9wb3AKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluZm9wb3AoU3RyaW5nIGluZm9wb3ApCi0gIHsKLSAgICBpbmZvcG9wXyA9IGluZm9wb3A7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgaW5mbyBwb3AgdmFsdWUgZm9yIHRoaXMgcG9wdXAgY2hlY2sgYm94LgotICAgKiBOb3RlOiB0aGlzIHZhbHVlIG1heSBiZSBudWxsIGlmIHRoZSBnZXRTaG93Q2hlY2tCb3ggbWV0aG9kIHJldHVybnMgZmFsc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBpbmZvcG9wIHZhbHVlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcG9wKCkKLSAgewotICAgIHJldHVybiBpbmZvcG9wXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB0b29sdGlwIHZhbHVlIGZvciB0aGlzIHBvcHVwIGNoZWNrIGJveC4KLSAgICogQHBhcmFtIHRvb2x0aXAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRvb2x0aXAoU3RyaW5nIHRvb2x0aXApCi0gIHsKLSAgICB0b29sdGlwXyA9IHRvb2x0aXA7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdG9vbHRpcCB2YWx1ZSBmb3IgdGhpcyBwb3B1cCBjaGVjayBib3guCi0gICAqIE5vdGU6IHRoaXMgdmFsdWUgbWF5IGJlIG51bGwgaWYgdGhlIGdldFNob3dDaGVja0JveCBtZXRob2QgcmV0dXJucyBmYWxzZS4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHRvb2x0aXAgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRvb2x0aXAoKQotICB7Ci0gICAgcmV0dXJuIHRvb2x0aXBfOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgc2hvdyBjaGVjayBib3ggdmFsdWUgZm9yIHRoaXMgcG9wdXAuICBJZiB0aGUgdmFsdWUgaXMgdHJ1ZSB0aGVuCi0gICAqIHRoaXMgcG9wdXAgd2lsbCBhcHBlYXIgb24gYW4gYWN0aW9uIGRpYWxvZ3MgcHJlZmVyZW5jZSBwYWdlLiAgQWxzbyBpZiB0aGlzCi0gICAqIHZhbHVlIGlzIHRydWUgYW5kIHRoZSBhbHdheXMgaGlkZSB2YWx1ZSBpcyBmYWxzZSB0aGVuIGEgY2hlY2sgYm94IHdpbGwgYmUgZGlzcGxheWVkCi0gICAqIG9uIHRoZSBmaXJzdCBwYWdlIG9mIHRoaXMgcG9wdXAgd2hpY2ggYXNrcyB0aGUgdXNlciBpZiB0aGV5IHdhbnQgdGhlIHBvcHVwCi0gICAqIHRvIGJlIGRpc3BsYXllZCB0aGUgbmV4dCB0aW1lIGFyZSB0byBqdXN0IGV4ZWN1dGUgdGhlIHBvcHVwIGFjdGlvbi4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBzaG93IGNoZWNrIGJveCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dDaGVja2JveCggYm9vbGVhbiB2YWx1ZSApCi0gIHsKLSAgICBzaG93Q2hlY2tib3hfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzaG93IGNoZWNrIGJveCB2YWx1ZS4KLSAgICogQHJldHVybiB0aGUgc2hvdyBjaGVjayBib3ggdmFsdWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93Q2hlY2tib3goKQotICB7Ci0gICAgcmV0dXJuIHNob3dDaGVja2JveF87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBhbHdheXMgaGlkZSB2YWx1ZS4gIFRoaXMgdmFsdWUgc3BlY2lmaWVzIHRoYXQgdGhlIHBvcHVwIHNob3VsZCBhbHdheXMKLSAgICogYmUgZXhlY3V0ZWQgd2l0aG91dCBicmluZ2luZyB1cCB0aGUgcG9wdXAgd2l6YXJkLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIGFsd2F5cyBoaWRlIHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWx3YXlzSGlkZSggYm9vbGVhbiB2YWx1ZSApCi0gIHsKLSAgICBhbHdheXNIaWRlXyA9IHZhbHVlOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgYWx3YXlzIGhpZGUgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRBbHdheXNIaWRlKCkKLSAgewotICAgIHJldHVybiBhbHdheXNIaWRlXzsgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjYXRlZ29yeSBpZCBmb3IgcG9wdXAgYWN0aW9uLiAgQWxsIHBvcHVwIGFjdGlvbnMgd2l0aCB0aGUgc2FtZQotICAgKiBjYXRlZ29yeSBpZCB3aWxsIGJlIGdyb3VwZWQgdG9nZXRoZXIgb24gdGhlIHNhbWUgcG9wdXAgYWN0aW9uIHByZWZlcmVuY2UgcGFnZS4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBjYXRlZ29yeS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENhdGVnb3J5KCBTdHJpbmcgdmFsdWUgKQotICB7Ci0gICAgY2F0ZWdvcnlfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiB0aGUgY2F0ZWdvcnkgaWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkKLSAgewotICAgIHJldHVybiBjYXRlZ29yeV87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9JQ29tbWFuZEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9JQ29tbWFuZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmMTU4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSUNvbW1hbmRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kOwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJldHVybiBhIHNlcXVlbmNlIG9mIENvbW1hbmRzLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbWFuZEZhY3RvcnkgZXh0ZW5kcyBJdGVyYXRvciAKLXsKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgQ29tbWFuZCBpbiB0aGUgc2VxdWVuY2UuCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZCBnZXROZXh0Q29tbWFuZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzFlOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotLmNkdHByb2plY3QKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXBhcnNlci5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViNjY0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzY1OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGFyc2VyLmphcgotc291cmNlLnBhcnNlci5qYXIgPSBzcmMvCi1vdXRwdXQucGFyc2VyLmphciA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWFjNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBQYXJzZXIKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzZGYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuUGFyc2VyUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwYXJzZXIuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS53c2lsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLnVkZGk0aiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS5heGlzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvUGFyc2VyUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvUGFyc2VyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzcyMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL1BhcnNlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGFyc2VyUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUGFyc2VyUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgICA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5QYXJzZXJQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhcnNlclBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUGFyc2VyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjby9ESVNDT0NvbnRyYWN0UmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZGlzY28vRElTQ09Db250cmFjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTRiNzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjby9ESVNDT0NvbnRyYWN0UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY287Ci0KLXB1YmxpYyBjbGFzcyBESVNDT0NvbnRyYWN0UmVmZXJlbmNlIGV4dGVuZHMgRElTQ09SZWZlcmVuY2UKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgZG9jUmVmXzsKLSAgCi0gIHB1YmxpYyBESVNDT0NvbnRyYWN0UmVmZXJlbmNlKFN0cmluZyByZWYsU3RyaW5nIGRvY1JlZikKLSAgewotICAgIHN1cGVyKHJlZik7Ci0gICAgZG9jUmVmXyA9IGRvY1JlZjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXREb2NSZWYoKQotICB7Ci0gICAgcmV0dXJuIGRvY1JlZl87Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZGlzY28vRElTQ09QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjby9ESVNDT1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWYzY2IwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjby9ESVNDT1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjbzsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbXNkbm1hZy9pc3N1ZXMvMDIvMDIveG1sL2RlZmF1bHQuYXNweCBmb3IgbW9yZQotICogZGV0YWlscyBvbiBESVNDTy4KLSAqLwotcHVibGljIGNsYXNzIERJU0NPUGFyc2VyCi17Ci0gIHByaXZhdGUgRG9jdW1lbnRCdWlsZGVyIHBhcnNlcl87Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIE5TX0RJU0NPID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL2Rpc2NvLyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERJU0NPVkVSWSA9ICJkaXNjb3ZlcnkiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBESVNDT1ZFUllfUkVGID0gImRpc2NvdmVyeVJlZiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIE5TX0NPTlRSQUNUX1JFRiA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9kaXNjby9zY2wvIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09OVFJBQ1RfUkVGID0gImNvbnRyYWN0UmVmIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUkVGID0gInJlZiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERPQ19SRUYgPSAiZG9jUmVmIjsKLQotICBwdWJsaWMgRElTQ09QYXJzZXIoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2NCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIGRvY0J1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgcGFyc2VyXyA9IGRvY0J1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpCi0gICAgewotICAgICAgcGFyc2VyXyA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIERJU0NPUmVmZXJlbmNlW10gcGFyc2UoU3RyaW5nIGRpc2NvVVJJLCBJbnB1dFNvdXJjZSBzb3VyY2UpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGlmIChwYXJzZXJfICE9IG51bGwpCi0gICAgewotICAgICAgRG9jdW1lbnQgZG9jID0gcGFyc2VyXy5wYXJzZShzb3VyY2UpOwotICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIC8vIFJvb3QgZWxlbWVudCBtdXN0IGJ5IDxkaXNjbzpkaXNjb3ZlcnkKLSAgICAgIC8vIHhtbG5zOmRpc2NvPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9kaXNjby8iPgotICAgICAgaWYgKHJvb3RFbGVtZW50ICE9IG51bGwgJiYgcm9vdEVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKE5TX0RJU0NPKSAmJiByb290RWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoRElTQ09WRVJZKSkKLSAgICAgIHsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IHJvb3RFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgVmVjdG9yIGRpc2NvUmVmZXJlbmNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIGNoaWxkTm9kZSA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgICAgICBpZiAoY2hpbGROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCljaGlsZE5vZGU7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBuc1VSSSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobnNVUkkuZXF1YWxzKE5TX0RJU0NPKSAmJiBsb2NhbE5hbWUuZXF1YWxzKERJU0NPVkVSWV9SRUYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBESVNDTyBsaW5rLgotICAgICAgICAgICAgICBTdHJpbmcgcmVmID0gY29udmVydFRvQWJzb2x1dGVVUkkoZGlzY29VUkksIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFJFRikpOwotICAgICAgICAgICAgICBkaXNjb1JlZmVyZW5jZXMuYWRkRWxlbWVudChuZXcgRElTQ09SZWZlcmVuY2UocmVmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChuc1VSSS5lcXVhbHMoTlNfQ09OVFJBQ1RfUkVGKSAmJiBsb2NhbE5hbWUuZXF1YWxzKENPTlRSQUNUX1JFRikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFdTREwgbGluay4KLSAgICAgICAgICAgICAgU3RyaW5nIHJlZiA9IGNvbnZlcnRUb0Fic29sdXRlVVJJKGRpc2NvVVJJLCBlbGVtZW50LmdldEF0dHJpYnV0ZShSRUYpKTsKLSAgICAgICAgICAgICAgU3RyaW5nIGRvY1JlZiA9IGNvbnZlcnRUb0Fic29sdXRlVVJJKGRpc2NvVVJJLCBlbGVtZW50LmdldEF0dHJpYnV0ZShET0NfUkVGKSk7Ci0gICAgICAgICAgICAgIGRpc2NvUmVmZXJlbmNlcy5hZGRFbGVtZW50KG5ldyBESVNDT0NvbnRyYWN0UmVmZXJlbmNlKHJlZiwgZG9jUmVmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBudW1iZXJPZkRJU0NPUmVmZXJlbmNlcyA9IGRpc2NvUmVmZXJlbmNlcy5zaXplKCk7Ci0gICAgICAgIGlmIChudW1iZXJPZkRJU0NPUmVmZXJlbmNlcyA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBESVNDT1JlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgRElTQ09SZWZlcmVuY2VbbnVtYmVyT2ZESVNDT1JlZmVyZW5jZXNdOwotICAgICAgICAgIGRpc2NvUmVmZXJlbmNlcy5jb3B5SW50byhyZWZlcmVuY2VzKTsKLSAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlczsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBUaGUgZG9jdW1lbnQgaXMgbm90IGEgdmFsaWQgRElTQ08gZG9jdW1lbnQuCi0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBjb252ZXJ0VG9BYnNvbHV0ZVVSSShTdHJpbmcgZGlzY29VUkksIFN0cmluZyByZWZVUkkpCi0gIHsKLSAgICBpZiAocmVmVVJJICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHJlZlVSSS5pbmRleE9mKCI6Ly8iKSA+IC0xKQotICAgICAgewotICAgICAgICAvLyByZWZVUkkgaXMgYWxyZWFkeSBhYnNvbHV0ZS4KLSAgICAgICAgcmV0dXJuIHJlZlVSSTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGFic29sdXRlVVJJID0gbmV3IFN0cmluZ0J1ZmZlcihkaXNjb1VSSS5zdWJzdHJpbmcoMCwgTWF0aC5tYXgoZGlzY29VUkkubGFzdEluZGV4T2YoJ1xcJyksIGRpc2NvVVJJLmxhc3RJbmRleE9mKCcvJykgKyAxKSkpOwotICAgICAgICBhYnNvbHV0ZVVSSS5hcHBlbmQocmVmVVJJKTsKLSAgICAgICAgcmV0dXJuIGFic29sdXRlVVJJLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Rpc2NvL0RJU0NPUmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZGlzY28vRElTQ09SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxM2JiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZGlzY28vRElTQ09SZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjbzsKLQotcHVibGljIGNsYXNzIERJU0NPUmVmZXJlbmNlCi17Ci0gIHByaXZhdGUgU3RyaW5nIHJlZl87Ci0gIAotICBwdWJsaWMgRElTQ09SZWZlcmVuY2UoU3RyaW5nIHJlZikKLSAgewotICAgIHJlZl8gPSByZWY7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVmKCkKLSAgewotICAgIHJldHVybiByZWZfOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Rpc2NvdmVyeS9OZXRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Rpc2NvdmVyeS9OZXRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2JjNWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjb3ZlcnkvTmV0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjb3Zlcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgc3VuLm1pc2MuQkFTRTY0RW5jb2RlcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIE5ldFV0aWxzCi17Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiBnaXZlbiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTC4gVGhpcyBjbGFzcyBlbnN1cmVzCi0gICAqIHRoYXQgcHJveHkgc2V0dGluZ3MgaW4gV1NBRCBhcmUgcmVzcGVjdGVkLgotICAgKiBAcGFyYW0gdXJsU3RyaW5nIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTC4KLSAgICogQHJldHVybiBqYXZhLm5ldC5VUkxDRG9ubmVjdGlvbiBVUkxDb25uZWN0aW9uIHRvIHRoZSBVUkwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFVSTENvbm5lY3Rpb24gZ2V0VVJMQ29ubmVjdGlvbihTdHJpbmcgdXJsU3RyaW5nKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIHVybCA9IGNyZWF0ZVVSTCh1cmxTdHJpbmcpOwotICAgICAgVVJMQ29ubmVjdGlvbiB1YyA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgU3RyaW5nIHByb3h5VXNlck5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAucHJveHlVc2VyTmFtZSIpOwotICAgICAgU3RyaW5nIHByb3h5UGFzc3dvcmQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAucHJveHlQYXNzd29yZCIpOwotICAgICAgaWYgKHByb3h5VXNlck5hbWUgIT0gbnVsbCAmJiBwcm94eVBhc3N3b3JkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciB1c2VyTmFtZVBhc3N3b3JkID0gbmV3IFN0cmluZ0J1ZmZlcihwcm94eVVzZXJOYW1lKTsKLSAgICAgICAgdXNlck5hbWVQYXNzd29yZC5hcHBlbmQoJzonKS5hcHBlbmQocHJveHlQYXNzd29yZCk7Ci0gICAgICAgIEJBU0U2NEVuY29kZXIgZW5jb2RlciA9IG5ldyBCQVNFNjRFbmNvZGVyKCk7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZyA9IGVuY29kZXIuZW5jb2RlKHVzZXJOYW1lUGFzc3dvcmQudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLSAgICAgICAgdXNlck5hbWVQYXNzd29yZC5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIHVzZXJOYW1lUGFzc3dvcmQuYXBwZW5kKCJCYXNpYyAiKS5hcHBlbmQoZW5jb2RpbmcpOwotICAgICAgICB1Yy5zZXRSZXF1ZXN0UHJvcGVydHkoIlByb3h5LWF1dGhvcml6YXRpb24iLHVzZXJOYW1lUGFzc3dvcmQudG9TdHJpbmcoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdWM7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGphdmEuaW8uSW5wdXRTdHJlYW0gZm9yIGEgVVJMIGdpdmVuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMLiBUaGlzIGNsYXNzCi0gICAqIGVuc3VyZXMgdGhhdCBwcm94eSBzZXR0aW5ncyBpbiBXU0FEIGFyZSByZXNwZWN0ZWQuCi0gICAqIEBwYXJhbSB1cmxTdHJpbmcgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMLgotICAgKiBAcmV0dXJuIGphdmEuaW8uSW5wdXRTdHJlYW0gSW5wdXRTdHJlYW0gZm9yIHJlYWRpbmcgdGhlIFVSTCBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIElucHV0U3RyZWFtIGdldFVSTElucHV0U3RyZWFtKFN0cmluZyB1cmxTdHJpbmcpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkxDb25uZWN0aW9uIHVjID0gZ2V0VVJMQ29ubmVjdGlvbih1cmxTdHJpbmcpOwotICAgICAgaWYgKHVjICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gdWMuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgcmV0dXJuIGlzOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIFVSTCBmcm9tIGEgc3RyaW5nLgotICAgKiBAcGFyYW0gdXJsU3RyaW5nIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTC4KLSAgICogQHJldHVybiBVUkwgamF2YS5sYW5nLlVSTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJMLgotICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBVUkwgY3JlYXRlVVJMKFN0cmluZyB1cmxTdHJpbmcpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgewotICAJcmV0dXJuIG5ldyBVUkwodXJsU3RyaW5nKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjb3ZlcnkvV2ViU2VydmljZXNQYXJzZXJFeHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjb3ZlcnkvV2ViU2VydmljZXNQYXJzZXJFeHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhOTcyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZGlzY292ZXJ5L1dlYlNlcnZpY2VzUGFyc2VyRXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc1BhcnNlckV4dCBleHRlbmRzIFdlYlNlcnZpY2VzUGFyc2VyIHsKLQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXJFeHQoU3RyaW5nIHVyaSkgewotICAgICAgICBzdXBlcih1cmkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBVUkwgY3JlYXRlVVJMKFN0cmluZyB1cmwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gTmV0VXRpbHMuY3JlYXRlVVJMKHVybCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2I1YTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNDb25zdGFudHMKLXsKLSAgLy8gTmFtZXNwYWNlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9XU0RMID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VERElfVjEgPSAidXJuOnVkZGktb3JnOmFwaSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VRERJX1YyID0gInVybjp1ZGRpLW9yZzphcGlfdjIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVURESV9CSU5ESU5HID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDEvMTAvaW5zcGVjdGlvbi91ZGRpLyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9XU0lMX0lOU1BFQ1RJT04gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMS8xMC9pbnNwZWN0aW9uLyI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc0xpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjhmMTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkxpbms7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNMaW5rCi17Ci0gIHByb3RlY3RlZCBMaW5rIGxpbmtfOwotCi0gIHB1YmxpYyBGYXZvcml0ZXNMaW5rKCkKLSAgewotICAgIGxpbmtfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBMaW5rIGdldExpbmsoKQotICB7Ci0gICAgcmV0dXJuIGxpbmtfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGluayhMaW5rIGxpbmspCi0gIHsKLSAgICBsaW5rXyA9IGxpbms7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlQWJzdHJhY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlQWJzdHJhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5MjY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1JlZ2lzdHJ5VHlwZUFic3RyYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuQWJzdHJhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5JbnNwZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5TZXJ2aWNlTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5CdXNpbmVzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmltcGwuQWJzdHJhY3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5pbXBsLkRlc2NyaXB0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuaW1wbC5MaW5rSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuaW1wbC5TZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuaW1wbC5TZXJ2aWNlTmFtZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmltcGwuZXh0ZW5zaW9uLnVkZGkuQnVzaW5lc3NEZXNjcmlwdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmltcGwuZXh0ZW5zaW9uLnVkZGkuU2VydmljZURlc2NyaXB0aW9uSW1wbDsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQnVzaW5lc3NLZXk7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLlNlcnZpY2VLZXk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGYXZvcml0ZXNSZWdpc3RyeVR5cGVBYnN0cmFjdCBpbXBsZW1lbnRzIElGYXZvcml0ZXNSZWdpc3RyeVR5cGUKLXsKLSAgcHVibGljIEZhdm9yaXRlc1JlZ2lzdHJ5VHlwZUFic3RyYWN0KCkKLSAgewotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRSZWFkTG9jYXRpb24oKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRXcml0ZUxvY2F0aW9uKCk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBXU0lMRG9jdW1lbnQgZ2V0V1NJTERvY3VtZW50KCk7Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBXU0lMRG9jdW1lbnQgbG9hZFdTSUxEb2N1bWVudChTdHJpbmcgcGF0aCwgYm9vbGVhbiBmb3JjZSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gV1NJTERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0gICAgICB3c2lsRG9jLnJlYWQobmV3IEZpbGVSZWFkZXIobmV3IEZpbGUocGF0aCkpKTsKLSAgICAgIHJldHVybiB3c2lsRG9jOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgaWYgKGZvcmNlKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBXU0lMRG9jdW1lbnQubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQyKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGYXZvcml0ZXNWZXJzaW9uKCkKLSAgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSBpbnNwZWN0aW9uLmdldEFic3RyYWN0cygpOwotICAgIGlmIChhYnN0cmFjdHMubGVuZ3RoID4gMCkKLSAgICAgIHJldHVybiBhYnN0cmFjdHNbMF0uZ2V0VGV4dCgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RmF2b3JpdGVzVmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLSAgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgQWJzdHJhY3QgYWJzdCA9IG5ldyBBYnN0cmFjdEltcGwoKTsKLSAgICBhYnN0LnNldFRleHQodmVyc2lvbik7Ci0gICAgaW5zcGVjdGlvbi5yZW1vdmVBYnN0cmFjdHMoKTsKLSAgICBpbnNwZWN0aW9uLmFkZEFic3RyYWN0KGFic3QpOwotICB9Ci0KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNhdmUoKSB0aHJvd3MgV1NJTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgaWYgKHdzaWxEb2MgIT0gbnVsbCkKLSAgICAgIHdzaWxEb2Mud3JpdGUoZ2V0V3JpdGVMb2NhdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5W10gZ2V0RmF2b3JpdGVzVURESVJlZ2lzdHJpZXMoKQotICB7Ci0gICAgTGlua1tdIGxpbmtzID0gbG9hZFVERElSZWdpc3RyaWVzKCk7Ci0gICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5W10gcmVnaXN0cmllcyA9IG5ldyBGYXZvcml0ZXNVRERJUmVnaXN0cnlbbGlua3MubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHJlZ2lzdHJpZXNbaV0gPSBuZXcgRmF2b3JpdGVzVURESVJlZ2lzdHJ5KCk7Ci0gICAgICByZWdpc3RyaWVzW2ldLnNldExpbmsobGlua3NbaV0pOwotICAgIH0KLSAgICByZXR1cm4gcmVnaXN0cmllczsKLSAgfQotCi0gIHB1YmxpYyBJRmF2b3JpdGVzVURESUJ1c2luZXNzW10gZ2V0RmF2b3JpdGVzVURESUJ1c2luZXNzZXMoKQotICB7Ci0gICAgTGlua1tdIGxpbmtzID0gbG9hZFVERElCdXNpbmVzc2VzKCk7Ci0gICAgRmF2b3JpdGVzVURESUJ1c2luZXNzW10gYnVzaW5lc3NlcyA9IG5ldyBGYXZvcml0ZXNVRERJQnVzaW5lc3NbbGlua3MubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGJ1c2luZXNzZXNbaV0gPSBuZXcgRmF2b3JpdGVzVURESUJ1c2luZXNzKCk7Ci0gICAgICBidXNpbmVzc2VzW2ldLnNldExpbmsobGlua3NbaV0pOwotICAgIH0KLSAgICByZXR1cm4gYnVzaW5lc3NlczsKLSAgfQotCi0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVNlcnZpY2VbXSBnZXRGYXZvcml0ZXNVRERJU2VydmljZXMoKQotICB7Ci0gICAgU2VydmljZVtdIHNlcnZpY2VzID0gbG9hZFVERElTZXJ2aWNlcygpOwotICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlW10gdWRkaVNlcnZpY2VzID0gbmV3IEZhdm9yaXRlc1VERElTZXJ2aWNlW3NlcnZpY2VzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB1ZGRpU2VydmljZXNbaV0gPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2UoKTsKLSAgICAgIHVkZGlTZXJ2aWNlc1tpXS5zZXRTZXJ2aWNlKHNlcnZpY2VzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVkZGlTZXJ2aWNlczsKLSAgfQotCi0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VbXSBnZXRGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZXMoKQotICB7Ci0gICAgU2VydmljZVtdIHNlcnZpY2VzID0gbG9hZFVERElTZXJ2aWNlSW50ZXJmYWNlcygpOwotICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlW10gc2VySW50cyA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZVtzZXJ2aWNlcy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgc2VySW50c1tpXSA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZSgpOwotICAgICAgc2VySW50c1tpXS5zZXRTZXJ2aWNlKHNlcnZpY2VzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlckludHM7Ci0gIH0KLQotICBwdWJsaWMgSUZhdm9yaXRlc1dTRExbXSBnZXRGYXZvcml0ZXNXU0RMcygpCi0gIHsKLSAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBsb2FkV1NETFNlcnZpY2VzKCk7Ci0gICAgRmF2b3JpdGVzV1NETFtdIHdzZGxzID0gbmV3IEZhdm9yaXRlc1dTRExbc2VydmljZXMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHdzZGxzW2ldID0gbmV3IEZhdm9yaXRlc1dTREwoKTsKLSAgICAgIHdzZGxzW2ldLnNldFNlcnZpY2Uoc2VydmljZXNbaV0pOwotICAgIH0KLSAgICByZXR1cm4gd3NkbHM7Ci0gIH0KLQotICBwdWJsaWMgSUZhdm9yaXRlc1dTSUxbXSBnZXRGYXZvcml0ZXNXU0lMcygpCi0gIHsKLSAgICBMaW5rW10gbGlua3MgPSBsb2FkV1NJTHMoKTsKLSAgICBGYXZvcml0ZXNXU0lMW10gd3NpbHMgPSBuZXcgRmF2b3JpdGVzV1NJTFtsaW5rcy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgd3NpbHNbaV0gPSBuZXcgRmF2b3JpdGVzV1NJTCgpOwotICAgICAgd3NpbHNbaV0uc2V0TGluayhsaW5rc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiB3c2lsczsKLSAgfQotCi0gIHB1YmxpYyBMaW5rW10gbG9hZFVERElSZWdpc3RyaWVzKCkgewotICAgIHJldHVybiBsb2FkTGlua3NCeU5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjEpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBMaW5rW10gbG9hZFVERElCdXNpbmVzc2VzKCkgewotICAgIHJldHVybiBsb2FkTGlua3NCeU5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjIpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2VbXSBsb2FkVURESVNlcnZpY2VzKCkgewotICAgIHJldHVybiBsb2FkU2VydmljZXNCeU5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjIpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2VbXSBsb2FkVURESVNlcnZpY2VJbnRlcmZhY2VzKCkgewotICAgIHJldHVybiBsb2FkU2VydmljZXNCeU5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjEpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2VbXSBsb2FkV1NETFNlcnZpY2VzKCkgewotICAgIHJldHVybiBsb2FkU2VydmljZXNCeU5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1dTREwpOwotICB9Ci0KLSAgcHVibGljIExpbmtbXSBsb2FkV1NJTHMoKSB7Ci0gICAgcmV0dXJuIGxvYWRMaW5rc0J5TmFtZXNwYWNlKEZhdm9yaXRlc0NvbnN0YW50cy5OQU1FU1BBQ0VfV1NJTF9JTlNQRUNUSU9OKTsKLSAgfQotCi0gIHByaXZhdGUgU2VydmljZVtdIGxvYWRTZXJ2aWNlc0J5TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICBWZWN0b3Igc2VydmljZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIGlmICh3c2lsRG9jICE9IG51bGwpCi0gICAgewotICAgICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBpbnNwZWN0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICAgRGVzY3JpcHRpb25bXSBkZXNjID0gc2VydmljZXNbaV0uZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICBpZiAoZGVzY1swXS5nZXRSZWZlcmVuY2VkTmFtZXNwYWNlKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgIHNlcnZpY2VWZWN0b3IuYWRkKHNlcnZpY2VzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgU2VydmljZVtdIHNlcnZpY2VzID0gbmV3IFNlcnZpY2Vbc2VydmljZVZlY3Rvci5zaXplKCldOwotICAgIHNlcnZpY2VWZWN0b3IuY29weUludG8oc2VydmljZXMpOwotICAgIHJldHVybiBzZXJ2aWNlczsKLSAgfQotCi0gIHByaXZhdGUgTGlua1tdIGxvYWRMaW5rc0J5TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICBWZWN0b3IgbGlua1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIGlmICh3c2lsRG9jICE9IG51bGwpCi0gICAgewotICAgICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgICBMaW5rW10gbGlua3MgPSBpbnNwZWN0aW9uLmdldExpbmtzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAobGlua3NbaV0uZ2V0UmVmZXJlbmNlZE5hbWVzcGFjZSgpLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICAgIGxpbmtWZWN0b3IuYWRkKGxpbmtzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTGlua1tdIGxpbmtzID0gbmV3IExpbmtbbGlua1ZlY3Rvci5zaXplKCldOwotICAgIGxpbmtWZWN0b3IuY29weUludG8obGlua3MpOwotICAgIHJldHVybiBsaW5rczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1VERElSZWdpc3RyeShJRmF2b3JpdGVzVURESVJlZ2lzdHJ5IHJlZ2lzdHJ5KQotICB7Ci0gICAgYWRkVURESVJlZ2lzdHJ5KHJlZ2lzdHJ5LmdldE5hbWUoKSwgcmVnaXN0cnkuZ2V0SW5xdWlyeVVSTCgpLCByZWdpc3RyeS5nZXRQdWJsaXNoVVJMKCksIHJlZ2lzdHJ5LmdldFJlZ2lzdHJhdGlvblVSTCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1VERElCdXNpbmVzcyhJRmF2b3JpdGVzVURESUJ1c2luZXNzIGJ1c2luZXNzKQotICB7Ci0gICAgYWRkVURESUJ1c2luZXNzKGJ1c2luZXNzLmdldE5hbWUoKSwgYnVzaW5lc3MuZ2V0SW5xdWlyeVVSTCgpLCBidXNpbmVzcy5nZXRCdXNpbmVzc0tleSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1VERElTZXJ2aWNlKElGYXZvcml0ZXNVRERJU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgYWRkVURESVNlcnZpY2Uoc2VydmljZS5nZXROYW1lKCksIHNlcnZpY2UuZ2V0SW5xdWlyeVVSTCgpLCBzZXJ2aWNlLmdldFNlcnZpY2VLZXkoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZShJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2Ugc2VydmljZUludGVyZmFjZSkKLSAgewotICAgIGFkZFVERElTZXJ2aWNlSW50ZXJmYWNlKHNlcnZpY2VJbnRlcmZhY2UuZ2V0TmFtZSgpLCBzZXJ2aWNlSW50ZXJmYWNlLmdldElucXVpcnlVUkwoKSwgc2VydmljZUludGVyZmFjZS5nZXRTZXJ2aWNlSW50ZXJmYWNlS2V5KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzV1NETChJRmF2b3JpdGVzV1NETCB3c2RsKQotICB7Ci0gICAgYWRkV1NETFNlcnZpY2Uod3NkbC5nZXRXc2RsVXJsKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzV1NJTChJRmF2b3JpdGVzV1NJTCB3c2lsKQotICB7Ci0gICAgYWRkV1NJTExpbmsod3NpbC5nZXRXc2lsVXJsKCkpOwotICB9Ci0KLSAgcHVibGljIExpbmsgYWRkVURESVJlZ2lzdHJ5KFN0cmluZyByZWdpc3RyeU5hbWUsIFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgcHVibGlzaEFQSSwgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCkgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgTGluayBsaW5rID0gbmV3IExpbmtJbXBsKCk7Ci0gICAgLy8gcmVnaXN0cnkgbmFtZQotICAgIEFic3RyYWN0IGFic3QgPSBuZXcgQWJzdHJhY3RJbXBsKCk7Ci0gICAgYWJzdC5zZXRUZXh0KHJlZ2lzdHJ5TmFtZSk7Ci0gICAgbGluay5hZGRBYnN0cmFjdChhYnN0KTsKLSAgICAvLyBpbnF1aXJ5IFVSTAotICAgIEFic3RyYWN0IGFic3QyID0gbmV3IEFic3RyYWN0SW1wbCgpOwotICAgIGFic3QyLnNldFRleHQoaW5xdWlyeUFQSSk7Ci0gICAgbGluay5hZGRBYnN0cmFjdChhYnN0Mik7Ci0gICAgLy8gcHVibGlzaCBVUkwKLSAgICBBYnN0cmFjdCBhYnN0MyA9IG5ldyBBYnN0cmFjdEltcGwoKTsKLSAgICBpZiAocHVibGlzaEFQSSAhPSBudWxsKQotICAgICAgYWJzdDMuc2V0VGV4dChwdWJsaXNoQVBJKTsKLSAgICBlbHNlCi0gICAgICBhYnN0My5zZXRUZXh0KCIiKTsKLSAgICBsaW5rLmFkZEFic3RyYWN0KGFic3QzKTsKLSAgICAvLyByZWdpc3RyYXRpb24gVVJMCi0gICAgQWJzdHJhY3QgYWJzdDQgPSBuZXcgQWJzdHJhY3RJbXBsKCk7Ci0gICAgaWYgKHJlZ2lzdHJhdGlvblVSTCAhPSBudWxsKQotICAgICAgYWJzdDQuc2V0VGV4dChyZWdpc3RyYXRpb25VUkwpOwotICAgIGVsc2UKLSAgICAgIGFic3Q0LnNldFRleHQoIiIpOwotICAgIGxpbmsuYWRkQWJzdHJhY3QoYWJzdDQpOwotICAgIC8vIGFkZCBuYW1lc3BhY2UKLSAgICBsaW5rLnNldFJlZmVyZW5jZWROYW1lc3BhY2UoRmF2b3JpdGVzQ29uc3RhbnRzLk5BTUVTUEFDRV9VRERJX1YxKTsKLSAgICBpbnNwZWN0aW9uLmFkZExpbmsobGluayk7Ci0gICAgcmV0dXJuIGxpbms7Ci0gIH0KLQotICBwdWJsaWMgTGluayBhZGRVRERJQnVzaW5lc3MoU3RyaW5nIGJ1c2luZXNzTmFtZSwgU3RyaW5nIGlucXVpcnlBUEksIFN0cmluZyBidXNpbmVzc0tleSkgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgTGluayBsaW5rID0gbmV3IExpbmtJbXBsKCk7Ci0gICAgQWJzdHJhY3QgYWJzdCA9IG5ldyBBYnN0cmFjdEltcGwoKTsKLSAgICBhYnN0LnNldFRleHQoYnVzaW5lc3NOYW1lKTsKLSAgICBsaW5rLmFkZEFic3RyYWN0KGFic3QpOwotICAgIGxpbmsuc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjIpOwotICAgIEJ1c2luZXNzRGVzY3JpcHRpb24gYmQgPSBuZXcgQnVzaW5lc3NEZXNjcmlwdGlvbkltcGwoKTsKLSAgICBiZC5zZXRMb2NhdGlvbihpbnF1aXJ5QVBJKTsKLSAgICBCdXNpbmVzc0tleSBrZXkgPSBuZXcgQnVzaW5lc3NLZXkoYnVzaW5lc3NLZXkpOwotICAgIGJkLnNldEJ1c2luZXNzS2V5KGtleSk7Ci0gICAgbGluay5zZXRFeHRlbnNpb25FbGVtZW50KGJkKTsKLSAgICBpbnNwZWN0aW9uLmFkZExpbmsobGluayk7Ci0gICAgcmV0dXJuIGxpbms7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBhZGRVRERJU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgc2VydmljZUtleSkgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2VJbXBsKCk7Ci0gICAgU2VydmljZU5hbWUgbmFtZSA9IG5ldyBTZXJ2aWNlTmFtZUltcGwoKTsKLSAgICBuYW1lLnNldFRleHQoc2VydmljZU5hbWUpOwotICAgIHNlcnZpY2UuYWRkU2VydmljZU5hbWUobmFtZSk7Ci0gICAgRGVzY3JpcHRpb24gZGVzYyA9IG5ldyBEZXNjcmlwdGlvbkltcGwoKTsKLSAgICBkZXNjLnNldFJlZmVyZW5jZWROYW1lc3BhY2UoRmF2b3JpdGVzQ29uc3RhbnRzLk5BTUVTUEFDRV9VRERJX1YyKTsKLSAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbCgpOwotICAgIHNkLnNldExvY2F0aW9uKGlucXVpcnlBUEkpOwotICAgIFNlcnZpY2VLZXkga2V5ID0gbmV3IFNlcnZpY2VLZXkoc2VydmljZUtleSk7Ci0gICAgc2Quc2V0U2VydmljZUtleShrZXkpOwotICAgIGRlc2Muc2V0RXh0ZW5zaW9uRWxlbWVudChzZCk7Ci0gICAgc2VydmljZS5hZGREZXNjcmlwdGlvbihkZXNjKTsKLSAgICBpbnNwZWN0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBhZGRVRERJU2VydmljZUludGVyZmFjZShTdHJpbmcgc2VySW50TmFtZSwgU3RyaW5nIGlucXVpcnlBUEksIFN0cmluZyBzZXJJbnRLZXkpIHsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2MuZ2V0SW5zcGVjdGlvbigpOwotICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlSW1wbCgpOwotICAgIFNlcnZpY2VOYW1lIG5hbWUgPSBuZXcgU2VydmljZU5hbWVJbXBsKCk7Ci0gICAgbmFtZS5zZXRUZXh0KHNlckludE5hbWUpOwotICAgIHNlcnZpY2UuYWRkU2VydmljZU5hbWUobmFtZSk7Ci0gICAgRGVzY3JpcHRpb24gZGVzYyA9IG5ldyBEZXNjcmlwdGlvbkltcGwoKTsKLSAgICBkZXNjLnNldFJlZmVyZW5jZWROYW1lc3BhY2UoRmF2b3JpdGVzQ29uc3RhbnRzLk5BTUVTUEFDRV9VRERJX1YxKTsKLSAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbCgpOwotICAgIHNkLnNldExvY2F0aW9uKGlucXVpcnlBUEkpOwotICAgIFNlcnZpY2VLZXkga2V5ID0gbmV3IFNlcnZpY2VLZXkoc2VySW50S2V5KTsKLSAgICBzZC5zZXRTZXJ2aWNlS2V5KGtleSk7Ci0gICAgZGVzYy5zZXRFeHRlbnNpb25FbGVtZW50KHNkKTsKLSAgICBzZXJ2aWNlLmFkZERlc2NyaXB0aW9uKGRlc2MpOwotICAgIGluc3BlY3Rpb24uYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICByZXR1cm4gc2VydmljZTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlIGFkZFdTRExTZXJ2aWNlKFN0cmluZyB1cmwpIHsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2MuZ2V0SW5zcGVjdGlvbigpOwotICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlSW1wbCgpOwotICAgIERlc2NyaXB0aW9uIGRlc2MgPSBuZXcgRGVzY3JpcHRpb25JbXBsKCk7Ci0gICAgZGVzYy5zZXRMb2NhdGlvbih1cmwpOwotICAgIGRlc2Muc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1dTREwpOwotICAgIHNlcnZpY2UuYWRkRGVzY3JpcHRpb24oZGVzYyk7Ci0gICAgaW5zcGVjdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIExpbmsgYWRkV1NJTExpbmsoU3RyaW5nIHVybCkgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgTGluayBsaW5rID0gbmV3IExpbmtJbXBsKCk7Ci0gICAgbGluay5zZXRMb2NhdGlvbih1cmwpOwotICAgIGxpbmsuc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1dTSUxfSU5TUEVDVElPTik7Ci0gICAgaW5zcGVjdGlvbi5hZGRMaW5rKGxpbmspOwotICAgIHJldHVybiBsaW5rOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESVJlZ2lzdHJ5KElGYXZvcml0ZXNVRERJUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgICBpZiAocmVnaXN0cnkgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJUmVnaXN0cnkpCi0gICAgICByZW1vdmVMaW5rKCgoRmF2b3JpdGVzVURESVJlZ2lzdHJ5KXJlZ2lzdHJ5KS5nZXRMaW5rKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESUJ1c2luZXNzKElGYXZvcml0ZXNVRERJQnVzaW5lc3MgYnVzaW5lc3MpCi0gIHsKLSAgICBpZiAoYnVzaW5lc3MgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJQnVzaW5lc3MpCi0gICAgICByZW1vdmVMaW5rKCgoRmF2b3JpdGVzVURESUJ1c2luZXNzKWJ1c2luZXNzKS5nZXRMaW5rKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESVNlcnZpY2UoSUZhdm9yaXRlc1VERElTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElTZXJ2aWNlKQotICAgICAgcmVtb3ZlU2VydmljZSgoKEZhdm9yaXRlc1VERElTZXJ2aWNlKXNlcnZpY2UpLmdldFNlcnZpY2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZShJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2Ugc2VydmljZUludGVyZmFjZSkKLSAgewotICAgIGlmIChzZXJ2aWNlSW50ZXJmYWNlIGluc3RhbmNlb2YgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UpCi0gICAgICByZW1vdmVTZXJ2aWNlKCgoRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2Upc2VydmljZUludGVyZmFjZSkuZ2V0U2VydmljZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZhdm9yaXRlc1dTREwoSUZhdm9yaXRlc1dTREwgd3NkbCkKLSAgewotICAgIGlmICh3c2RsIGluc3RhbmNlb2YgRmF2b3JpdGVzV1NETCkKLSAgICAgIHJlbW92ZVNlcnZpY2UoKChGYXZvcml0ZXNXU0RMKXdzZGwpLmdldFNlcnZpY2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNXU0lMKElGYXZvcml0ZXNXU0lMIHdzaWwpCi0gIHsKLSAgICBpZiAod3NpbCBpbnN0YW5jZW9mIEZhdm9yaXRlc1dTSUwpCi0gICAgICByZW1vdmVMaW5rKCgoRmF2b3JpdGVzV1NJTCl3c2lsKS5nZXRMaW5rKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VydmljZShTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2MuZ2V0SW5zcGVjdGlvbigpOwotICAgIGluc3BlY3Rpb24ucmVtb3ZlU2VydmljZShzZXJ2aWNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpbmsoTGluayBsaW5rKQotICB7Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jLmdldEluc3BlY3Rpb24oKTsKLSAgICBpbnNwZWN0aW9uLnJlbW92ZUxpbmsobGluayk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTI0NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1NlcnZpY2UKLXsKLSAgcHJvdGVjdGVkIFNlcnZpY2Ugc2VydmljZV87Ci0KLSAgcHVibGljIEZhdm9yaXRlc1NlcnZpY2UoKQotICB7Ci0gICAgc2VydmljZV8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIHNlcnZpY2VfID0gc2VydmljZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJQnVzaW5lc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzVURESUJ1c2luZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjgxNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJQnVzaW5lc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5CdXNpbmVzc0Rlc2NyaXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESUJ1c2luZXNzIGV4dGVuZHMgRmF2b3JpdGVzTGluayBpbXBsZW1lbnRzIElGYXZvcml0ZXNVRERJQnVzaW5lc3MKLXsKLSAgcHVibGljIEZhdm9yaXRlc1VERElCdXNpbmVzcygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiAobGlua18uZ2V0QWJzdHJhY3RzKCkpWzBdLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpCi0gIHsKLSAgICByZXR1cm4gKChCdXNpbmVzc0Rlc2NyaXB0aW9uKWxpbmtfLmdldEV4dGVuc2lvbkVsZW1lbnQoKSkuZ2V0TG9jYXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QnVzaW5lc3NLZXkoKQotICB7Ci0gICAgcmV0dXJuICgoQnVzaW5lc3NEZXNjcmlwdGlvbilsaW5rXy5nZXRFeHRlbnNpb25FbGVtZW50KCkpLmdldEJ1c2luZXNzS2V5KCkuZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5xdWlyeVVSTChTdHJpbmcgaW5xdWlyeVVSTCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QnVzaW5lc3NLZXkoU3RyaW5nIGtleSkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5YTMzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkFic3RyYWN0OwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVJlZ2lzdHJ5IGV4dGVuZHMgRmF2b3JpdGVzTGluayBpbXBsZW1lbnRzIElGYXZvcml0ZXNVRERJUmVnaXN0cnkKLXsKLSAgcHVibGljIEZhdm9yaXRlc1VERElSZWdpc3RyeSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiAobGlua18uZ2V0QWJzdHJhY3RzKCkpWzBdLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpCi0gIHsKLSAgICByZXR1cm4gKGxpbmtfLmdldEFic3RyYWN0cygpKVsxXS5nZXRUZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKQotICB7Ci0gICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSBsaW5rXy5nZXRBYnN0cmFjdHMoKTsKLSAgICBpZiAoYWJzdHJhY3RzLmxlbmd0aCA+IDIpCi0gICAgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSBhYnN0cmFjdHNbMl0uZ2V0VGV4dCgpOwotICAgICAgaWYgKHB1Ymxpc2hVUkwgIT0gbnVsbCAmJiBwdWJsaXNoVVJMLmxlbmd0aCgpID4gMCkKLSAgICAgICAgcmV0dXJuIHB1Ymxpc2hVUkw7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RyYXRpb25VUkwoKQotICB7Ci0gICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSBsaW5rXy5nZXRBYnN0cmFjdHMoKTsKLSAgICBpZiAoYWJzdHJhY3RzLmxlbmd0aCA+IDMpCi0gICAgewotICAgICAgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCA9IGFic3RyYWN0c1szXS5nZXRUZXh0KCk7Ci0gICAgICBpZiAocmVnaXN0cmF0aW9uVVJMICE9IG51bGwgJiYgcmVnaXN0cmF0aW9uVVJMLmxlbmd0aCgpID4gMCkKLSAgICAgICAgcmV0dXJuIHJlZ2lzdHJhdGlvblVSTDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgKGxpbmtfLmdldEFic3RyYWN0cygpKVswXS5zZXRUZXh0KG5hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5xdWlyeVVSTChTdHJpbmcgaW5xdWlyeVVSTCkKLSAgewotICAgIChsaW5rXy5nZXRBYnN0cmFjdHMoKSlbMV0uc2V0VGV4dChpbnF1aXJ5VVJMKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hVUkwoU3RyaW5nIHB1Ymxpc2hVUkwpCi0gIHsKLSAgICBBYnN0cmFjdFtdIGFic3RyYWN0cyA9IGxpbmtfLmdldEFic3RyYWN0cygpOwotICAgIGlmIChhYnN0cmFjdHMubGVuZ3RoID4gMikKLSAgICAgIGFic3RyYWN0c1syXS5zZXRUZXh0KHB1Ymxpc2hVUkwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVnaXN0cmF0aW9uVVJMKFN0cmluZyByZWdpc3RyYXRpb25VUkwpCi0gIHsKLSAgICBBYnN0cmFjdFtdIGFic3RyYWN0cyA9IGxpbmtfLmdldEFic3RyYWN0cygpOwotICAgIGlmIChhYnN0cmFjdHMubGVuZ3RoID4gMykKLSAgICAgIGFic3RyYWN0c1szXS5zZXRUZXh0KHJlZ2lzdHJhdGlvblVSTCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzVURESVNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzVURESVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhZTI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLnVkZGkuU2VydmljZURlc2NyaXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVNlcnZpY2UgZXh0ZW5kcyBGYXZvcml0ZXNTZXJ2aWNlIGltcGxlbWVudHMgSUZhdm9yaXRlc1VERElTZXJ2aWNlCi17Ci0gIHB1YmxpYyBGYXZvcml0ZXNVRERJU2VydmljZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiAoc2VydmljZV8uZ2V0U2VydmljZU5hbWVzKCkpWzBdLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpCi0gIHsKLSAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSAoU2VydmljZURlc2NyaXB0aW9uKShzZXJ2aWNlXy5nZXREZXNjcmlwdGlvbnMoKSlbMF0uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpOwotICAgIHJldHVybiBzZC5nZXRMb2NhdGlvbigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlS2V5KCkKLSAgewotICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IChTZXJ2aWNlRGVzY3JpcHRpb24pKHNlcnZpY2VfLmdldERlc2NyaXB0aW9ucygpKVswXS5nZXRFeHRlbnNpb25FbGVtZW50KCk7Ci0gICAgcmV0dXJuIHNkLmdldFNlcnZpY2VLZXkoKS5nZXRUZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnF1aXJ5VVJMKFN0cmluZyBpbnF1aXJ5VVJMKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlS2V5KFN0cmluZyBrZXkpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzNjYzJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5TZXJ2aWNlRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZSBleHRlbmRzIEZhdm9yaXRlc1NlcnZpY2UgaW1wbGVtZW50cyBJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UKLXsKLSAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIChzZXJ2aWNlXy5nZXRTZXJ2aWNlTmFtZXMoKSlbMF0uZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkKLSAgewotICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IChTZXJ2aWNlRGVzY3JpcHRpb24pKHNlcnZpY2VfLmdldERlc2NyaXB0aW9ucygpKVswXS5nZXRFeHRlbnNpb25FbGVtZW50KCk7Ci0gICAgcmV0dXJuIHNkLmdldExvY2F0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbnRlcmZhY2VLZXkoKQotICB7Ci0gICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gKFNlcnZpY2VEZXNjcmlwdGlvbikoc2VydmljZV8uZ2V0RGVzY3JpcHRpb25zKCkpWzBdLmdldEV4dGVuc2lvbkVsZW1lbnQoKTsKLSAgICByZXR1cm4gc2QuZ2V0U2VydmljZUtleSgpLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnRlcmZhY2VLZXkoU3RyaW5nIGtleSkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1dTREwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzV1NETC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDZkNzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzV1NETCBleHRlbmRzIEZhdm9yaXRlc1NlcnZpY2UgaW1wbGVtZW50cyBJRmF2b3JpdGVzV1NETAotewotICBwdWJsaWMgRmF2b3JpdGVzV1NETCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBnZXRXc2RsVXJsKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxVcmwoKQotICB7Ci0gICAgcmV0dXJuIChzZXJ2aWNlXy5nZXREZXNjcmlwdGlvbnMoKSlbMF0uZ2V0TG9jYXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVcmwoU3RyaW5nIHdzZGxVUkwpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNXU0lMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1dTSUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2ZjMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1dTSUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1dTSUwgZXh0ZW5kcyBGYXZvcml0ZXNMaW5rIGltcGxlbWVudHMgSUZhdm9yaXRlc1dTSUwKLXsKLSAgcHVibGljIEZhdm9yaXRlc1dTSUwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0V3NpbFVybCgpOwotICB9Ci0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdzaWxVcmwoKQotICB7Ci0gICAgcmV0dXJuIGxpbmtfLmdldExvY2F0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXc2lsVXJsKFN0cmluZyB3c2lsVVJMKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1JlZ2lzdHJ5VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzUmVnaXN0cnlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTdlMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzUmVnaXN0cnlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhdm9yaXRlc1JlZ2lzdHJ5VHlwZQotewotICBwdWJsaWMgSUZhdm9yaXRlc1VERElSZWdpc3RyeVtdIGdldEZhdm9yaXRlc1VERElSZWdpc3RyaWVzKCk7Ci0gIHB1YmxpYyBJRmF2b3JpdGVzVURESUJ1c2luZXNzW10gZ2V0RmF2b3JpdGVzVURESUJ1c2luZXNzZXMoKTsKLSAgcHVibGljIElGYXZvcml0ZXNVRERJU2VydmljZVtdIGdldEZhdm9yaXRlc1VERElTZXJ2aWNlcygpOwotICBwdWJsaWMgSUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlW10gZ2V0RmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VzKCk7Ci0gIHB1YmxpYyBJRmF2b3JpdGVzV1NETFtdIGdldEZhdm9yaXRlc1dTRExzKCk7Ci0gIHB1YmxpYyBJRmF2b3JpdGVzV1NJTFtdIGdldEZhdm9yaXRlc1dTSUxzKCk7Ci0KLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzVURESVJlZ2lzdHJ5KElGYXZvcml0ZXNVRERJUmVnaXN0cnkgcmVnaXN0cnkpOwotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNVRERJQnVzaW5lc3MoSUZhdm9yaXRlc1VERElCdXNpbmVzcyBidXNpbmVzcyk7Ci0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1VERElTZXJ2aWNlKElGYXZvcml0ZXNVRERJU2VydmljZSBzZXJ2aWNlKTsKLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UoSUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpOwotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNXU0RMKElGYXZvcml0ZXNXU0RMIHdzZGwpOwotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNXU0lMKElGYXZvcml0ZXNXU0lMIHdzaWwpOwotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZhdm9yaXRlc1VERElSZWdpc3RyeShJRmF2b3JpdGVzVURESVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESUJ1c2luZXNzKElGYXZvcml0ZXNVRERJQnVzaW5lc3MgYnVzaW5lc3MpOwotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNVRERJU2VydmljZShJRmF2b3JpdGVzVURESVNlcnZpY2Ugc2VydmljZSk7Ci0gIHB1YmxpYyB2b2lkIHJlbW92ZUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlKElGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZSBzZXJ2aWNlSW50ZXJmYWNlKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzV1NETChJRmF2b3JpdGVzV1NETCB3c2RsKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzV1NJTChJRmF2b3JpdGVzV1NJTCB3c2lsKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzVURESUJ1c2luZXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNVRERJQnVzaW5lc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2M2QwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNVRERJQnVzaW5lc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotcHVibGljIGludGVyZmFjZSBJRmF2b3JpdGVzVURESUJ1c2luZXNzCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKTsKLSAgcHVibGljIFN0cmluZyBnZXRCdXNpbmVzc0tleSgpOwotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotICBwdWJsaWMgdm9pZCBzZXRJbnF1aXJ5VVJMKFN0cmluZyBpbnF1aXJ5VVJMKTsKLSAgcHVibGljIHZvaWQgc2V0QnVzaW5lc3NLZXkoU3RyaW5nIGtleSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNVRERJUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWNkNTE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYXZvcml0ZXNVRERJUmVnaXN0cnkKLXsKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpOwotICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKTsKLSAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RyYXRpb25VUkwoKTsKLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLSAgcHVibGljIHZvaWQgc2V0SW5xdWlyeVVSTChTdHJpbmcgaW5xdWlyeVVSTCk7Ci0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hVUkwoU3RyaW5nIHB1Ymxpc2hVUkwpOwotICBwdWJsaWMgdm9pZCBzZXRSZWdpc3RyYXRpb25VUkwoU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNVRERJU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzVURESVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2YTlmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNVRERJU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYXZvcml0ZXNVRERJU2VydmljZQotewotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUtleSgpOwotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotICBwdWJsaWMgdm9pZCBzZXRJbnF1aXJ5VVJMKFN0cmluZyBpbnF1aXJ5VVJMKTsKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUtleShTdHJpbmcga2V5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ3YzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKTsKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSW50ZXJmYWNlS2V5KCk7Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpOwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlS2V5KFN0cmluZyBrZXkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzV1NETC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzV1NETC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzJiY2YzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1dTREwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotcHVibGljIGludGVyZmFjZSBJRmF2b3JpdGVzV1NETAotewotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVXJsKCk7Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gIHB1YmxpYyB2b2lkIHNldFdzZGxVcmwoU3RyaW5nIHdzZGxVUkwpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzV1NJTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzV1NJTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVmMzk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1dTSUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotcHVibGljIGludGVyZmFjZSBJRmF2b3JpdGVzV1NJTAotewotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgcHVibGljIFN0cmluZyBnZXRXc2lsVXJsKCk7Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gIHB1YmxpYyB2b2lkIHNldFdzaWxVcmwoU3RyaW5nIHdzaWxVUkwpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvSFRNTEhlYWRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9IVE1MSGVhZEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlZjJiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9IVE1MSGVhZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEhUTUxIZWFkSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi17Ci0gIHByaXZhdGUgZmluYWwgY2hhciBTVEFSVF9UQUcgPSAnPCc7Ci0gIHByaXZhdGUgZmluYWwgY2hhciBFTkRfVEFHID0gJz4nOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIRUFEX1NUQVJUX1RBRyA9ICI8aGVhZD4iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIRUFEX0VORF9UQUcgPSAiPC9oZWFkPiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJPT1RfU1RBUlRfVEFHID0gIjxyb290PiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJPT1RfRU5EX1RBRyA9ICI8L3Jvb3Q+IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVVRGOCA9ICJVVEYtOCI7ICAKLSAgCi0gIC8vIFdTSUwgdGFnIGluZm9ybWF0aW9uLgotICBwcml2YXRlIGZpbmFsIFN0cmluZyBNRVRBID0gIm1ldGEiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBTRVJWSUNFX0lOU1BFQ1RJT04gPSAic2VydmljZUluc3BlY3Rpb24iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBDT05URU5UID0gImNvbnRlbnQiOwotICAKLSAgLy8gRElTQ08gdGFnIGluZm9ybWF0aW9uLgotICBwcml2YXRlIGZpbmFsIFN0cmluZyBMSU5LID0gImxpbmsiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBURVhUX1hNTCA9ICJ0ZXh0L3htbCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJFTCA9ICJyZWwiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBBTFRFUk5BVEUgPSAiYWx0ZXJuYXRlIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFJFRiA9ICJocmVmIjsKLSAgICAKLSAgcHJpdmF0ZSBTdHJpbmcgYmFzZVVSSV87Ci0gIHByaXZhdGUgVmVjdG9yIHdzaWxzXzsKLSAgcHJpdmF0ZSBWZWN0b3IgZGlzY29zXzsKLSAgCi0gIHB1YmxpYyBIVE1MSGVhZEhhbmRsZXIoU3RyaW5nIGJhc2VVUkkpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGJhc2VVUklfID0gYmFzZVVSSTsKLSAgICB3c2lsc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgZGlzY29zXyA9IG5ldyBWZWN0b3IoKTsKLSAgfQotIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0V3NpbHMoKQotICB7Ci0gICAgU3RyaW5nW10gd3NpbHMgPSBuZXcgU3RyaW5nW3dzaWxzXy5zaXplKCldOwotICAgIHdzaWxzXy5jb3B5SW50byh3c2lscyk7Ci0gICAgcmV0dXJuIHdzaWxzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0RGlzY29zKCkKLSAgewotICAgIFN0cmluZ1tdIGRpc2NvcyA9IG5ldyBTdHJpbmdbZGlzY29zXy5zaXplKCldOwotICAgIGRpc2Nvc18uY29weUludG8oZGlzY29zKTsKLSAgICByZXR1cm4gZGlzY29zOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBxTmFtZUxDID0gcU5hbWUudG9Mb3dlckNhc2UoKTsKLSAgICBpZiAocU5hbWVMQy5lcXVhbHMoTUVUQSkpCi0gICAgewotICAgICAgU3RyaW5nIG5hbWVWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoTkFNRSk7Ci0gICAgICBpZiAoU0VSVklDRV9JTlNQRUNUSU9OLmVxdWFscyhuYW1lVmFsdWUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgd3NpbFVSSSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQ09OVEVOVCk7Ci0gICAgICAgIGlmIChiYXNlVVJJXyAhPSBudWxsICYmIHdzaWxVUkkuaW5kZXhPZigiOi8iKSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBzYi5hcHBlbmQoYmFzZVVSSV8uc3Vic3RyaW5nKDAsIGJhc2VVUklfLmxhc3RJbmRleE9mKCIvIikrMSkpOwotICAgICAgICAgIHNiLmFwcGVuZCh3c2lsVVJJKTsKLSAgICAgICAgICB3c2lsVVJJID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXdzaWxzXy5jb250YWlucyh3c2lsVVJJKSkKLSAgICAgICAgICB3c2lsc18uYWRkKHdzaWxVUkkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChxTmFtZUxDLmVxdWFscyhMSU5LKSkKLSAgICB7Ci0gICAgICAvLyBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9tc2RubWFnL2lzc3Vlcy8wMi8wMi94bWwvZGVmYXVsdC5hc3B4IGZvciBtb3JlIGRldGFpbHMgb24gRElTQ08uCi0gICAgICBTdHJpbmcgdHlwZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoVFlQRSk7Ci0gICAgICBTdHJpbmcgcmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZShSRUwpOwotICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEhSRUYpOwotICAgICAgaWYgKFRFWFRfWE1MLmVxdWFscyh0eXBlKSAmJiBBTFRFUk5BVEUuZXF1YWxzKHJlbCkgJiYgaHJlZiAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgZGlzY29VUkkgPSBocmVmOwotICAgICAgICBpZiAoZGlzY29VUkkuaW5kZXhPZigiOi8iKSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICBzYi5hcHBlbmQoYmFzZVVSSV8uc3Vic3RyaW5nKDAsYmFzZVVSSV8ubGFzdEluZGV4T2YoIi8iKSsxKSk7Ci0gICAgICAgICAgc2IuYXBwZW5kKGRpc2NvVVJJKTsKLSAgICAgICAgICBkaXNjb1VSSSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFkaXNjb3NfLmNvbnRhaW5zKGRpc2NvVVJJKSkKLSAgICAgICAgICBkaXNjb3NfLmFkZChkaXNjb1VSSSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhcnZlc3RUYWdzKFN0cmluZ0J1ZmZlciB0YXJnZXQsU3RyaW5nIGRvY3VtZW50LFN0cmluZyB0YWcpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBkb2N1bWVudC5pbmRleE9mKFNUQVJUX1RBRyk7Ci0gICAgaW50IGRvY3VtZW50TGVuZ3RoID0gZG9jdW1lbnQubGVuZ3RoKCk7Ci0gICAgaW50IHRhZ0xlbmd0aCA9IHRhZy5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaW5kZXggIT0gLTEgJiYgKGluZGV4KzErdGFnTGVuZ3RoKTxkb2N1bWVudExlbmd0aCkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gZG9jdW1lbnQuc3Vic3RyaW5nKGluZGV4KzEsaW5kZXgrMSt0YWdMZW5ndGgpOwotICAgICAgaWYgKHN0ci50b0xvd2VyQ2FzZSgpLmVxdWFscyh0YWcpKQotICAgICAgewotICAgICAgICBzdHIgPSBkb2N1bWVudC5zdWJzdHJpbmcoaW5kZXgsZG9jdW1lbnQuaW5kZXhPZihFTkRfVEFHLGluZGV4KzEpKzEpOwotICAgICAgICB0YXJnZXQuYXBwZW5kKHN0cik7Ci0gICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGgoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIGluZGV4ID0gZG9jdW1lbnQuaW5kZXhPZihTVEFSVF9UQUcsaW5kZXgpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGJ5dGVbXSBoYXJ2ZXN0SGVhZFRhZ3MoYnl0ZVtdIGIpCi0gIHsKLSAgICBTdHJpbmcgczsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzID0gbmV3IFN0cmluZyhiLCBVVEY4KTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQotICAgIHsKLSAgICAgIHMgPSBuZXcgU3RyaW5nKGIpOwotICAgIH0KLSAgICBTdHJpbmcgaGVhZCA9IHMudG9Mb3dlckNhc2UoKTsKLSAgICBpbnQgaGVhZFN0YXJ0SW5kZXggPSBoZWFkLmluZGV4T2YoSEVBRF9TVEFSVF9UQUcpOwotICAgIGludCBoZWFkRW5kSW5kZXggPSBoZWFkLmluZGV4T2YoSEVBRF9FTkRfVEFHKTsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgc2IuYXBwZW5kKFJPT1RfU1RBUlRfVEFHKTsKLSAgICBpZiAoaGVhZFN0YXJ0SW5kZXggIT0gLTEgJiYgaGVhZEVuZEluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGhlYWQgPSBzLnN1YnN0cmluZyhoZWFkU3RhcnRJbmRleCwgaGVhZEVuZEluZGV4K0hFQURfRU5EX1RBRy5sZW5ndGgoKSk7Ci0gICAgICBoYXJ2ZXN0VGFncyhzYixoZWFkLE1FVEEpOwotICAgICAgaGFydmVzdFRhZ3Moc2IsaGVhZCxMSU5LKTsKLSAgICB9Ci0gICAgc2IuYXBwZW5kKFJPT1RfRU5EX1RBRyk7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL0lsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL0lsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzY2YwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9JbGxlZ2FsQXJndW1lbnRzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbDsKLQotcHVibGljIGNsYXNzIElsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI1MzM5ODExNzYyODU1NjEyMzRMOwotCi0gIHB1YmxpYyBJbGxlZ2FsQXJndW1lbnRzRXhjZXB0aW9uKFN0cmluZyBhcmcpCi0gIHsKLSAgICBzdXBlcihhcmcpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9VRERJVVJJSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9VRERJVVJJSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjIxZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvVURESVVSSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBVRERJVVJJSGVscGVyCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWVNFUlZJQ0VfVVJJX1RFTVBMQVRFID0gInVkZGlzZXJ2aWNlOnF1ZXJ5OnswfTpxdWVyeTp7MX0iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRUtFWV9VUklfVEVNUExBVEUgPSAidWRkaXNlcnZpY2U6c2VydmljZUtleTp7MH06c2VydmljZUtleTp7MX0iOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0UXVlcnlTZXJ2aWNlVVJJKFN0cmluZyBxdWVyeSxTdHJpbmcgaW5xdWlyeVVSTCkKLSAgewotICAgIFN0cmluZ1tdIHVyaVBhcmFtcyA9IHtxdWVyeSxpbnF1aXJ5VVJMfTsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUVVFUllTRVJWSUNFX1VSSV9URU1QTEFURSx1cmlQYXJhbXMpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRTZXJ2aWNlS2V5VVJJKFN0cmluZyBzZXJ2aWNlS2V5LFN0cmluZyBpbnF1aXJ5VVJMKQotICB7Ci0gICAgU3RyaW5nW10gdXJpUGFyYW1zID0ge3NlcnZpY2VLZXksaW5xdWlyeVVSTH07Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFNFUlZJQ0VLRVlfVVJJX1RFTVBMQVRFLHVyaVBhcmFtcyk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHBhcnNlVVJJKFN0cmluZyBwYXR0ZXJuLFN0cmluZyB1cmkpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQocGF0dGVybik7Ci0gICAgICBPYmplY3RbXSBwYXJzZWRSZXN1bHRzID0gbWYucGFyc2UodXJpKTsKLSAgICAgIGlmIChwYXJzZWRSZXN1bHRzICE9IG51bGwgJiYgcGFyc2VkUmVzdWx0cy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSByZXN1bHRzID0gbmV3IFN0cmluZ1twYXJzZWRSZXN1bHRzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPHBhcnNlZFJlc3VsdHMubGVuZ3RoO2krKykKLSAgICAgICAgICByZXN1bHRzW2ldID0gKFN0cmluZylwYXJzZWRSZXN1bHRzW2ldOwotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHBhcnNlU2VydmljZUtleVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIHBhcnNlVVJJKFNFUlZJQ0VLRVlfVVJJX1RFTVBMQVRFLHVyaSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gcGFyc2VRdWVyeVNlcnZpY2VVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiBwYXJzZVVSSShRVUVSWVNFUlZJQ0VfVVJJX1RFTVBMQVRFLHVyaSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzYTM2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ5MTgyMTEwMjE2MjAzMTYwNDlMOwotCi0gIHByaXZhdGUgSU9FeGNlcHRpb24gaW9lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgd3d3QXV0aE1zZ187Ci0gIHByaXZhdGUgU3RyaW5nIHVybF87Ci0KLSAgcHVibGljIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKElPRXhjZXB0aW9uIGlvZSwgU3RyaW5nIHd3d0F1dGhNc2csIFN0cmluZyB1cmwpCi0gIHsKLSAgICBzdXBlcihpb2UuZ2V0TWVzc2FnZSgpKTsKLSAgICBpb2VfID0gaW9lOwotICAgIHd3d0F1dGhNc2dfID0gd3d3QXV0aE1zZzsKLSAgICB1cmxfID0gdXJsOwotICB9Ci0KLSAgcHVibGljIElPRXhjZXB0aW9uIGdldElPRXhjZXB0aW9uKCkKLSAgewotICAgIHJldHVybiBpb2VfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXV1dBdXRoZW50aWNhdGlvbk1zZygpCi0gIHsKLSAgICByZXR1cm4gd3d3QXV0aE1zZ187Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVSTCgpCi0gIHsKLSAgICByZXR1cm4gdXJsXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvV1dXQXV0aGVudGljYXRpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XV1dBdXRoZW50aWNhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkZGM0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XV1dBdXRoZW50aWNhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcgotewotICBwdWJsaWMgdm9pZCBoYW5kbGVXV1dBdXRoZW50aWNhdGlvbihXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB3d3dhZSk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKTsKLSAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvV2ViU2VydmljZUVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvV2ViU2VydmljZUVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzZiZDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL1dlYlNlcnZpY2VFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRW50aXR5Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVU5LTk9XTiA9IC0xOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0hUTUwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1dTSUwgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1dTREwgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VERElfU0VSVklDRSA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRElTQ08gPSA0OwotCi0gIHByaXZhdGUgT2JqZWN0IHBhcmVudF87Ci0gIHByaXZhdGUgTGlzdCBjaGlsZHJlbl87Ci0gIHByaXZhdGUgaW50IHR5cGVfOwotICBwcml2YXRlIFN0cmluZyB1cmlfOwotICBwcml2YXRlIGJ5dGVbXSBieXRlc187Ci0gIHByaXZhdGUgU3RyaW5nIGh0dHBVc2VybmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIGh0dHBQYXNzd29yZF87Ci0gIHByaXZhdGUgU3RyaW5nIGRvY3VtZW50YXRpb25fOwotICBwcml2YXRlIE9iamVjdCBtb2RlbF87Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VFbnRpdHkoKQotICB7Ci0gICAgcGFyZW50XyA9IG51bGw7Ci0gICAgY2hpbGRyZW5fID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHR5cGVfID0gVFlQRV9VTktOT1dOOwotICAgIHVyaV8gPSBudWxsOwotICAgIGJ5dGVzXyA9IG51bGw7Ci0gICAgaHR0cFVzZXJuYW1lXyA9IG51bGw7Ci0gICAgaHR0cFBhc3N3b3JkXyA9IG51bGw7Ci0gICAgZG9jdW1lbnRhdGlvbl8gPSBudWxsOwotICAgIG1vZGVsXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpCi0gIHsKLSAgICByZXR1cm4gcGFyZW50XzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KQotICB7Ci0gICAgcGFyZW50XyA9IHBhcmVudDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiBjaGlsZHJlbl87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRDaGlsZChPYmplY3QgY2hpbGQpCi0gIHsKLSAgICBjaGlsZHJlbl8uYWRkKGNoaWxkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKE9iamVjdCBjaGlsZCkKLSAgewotICAgIGNoaWxkcmVuXy5yZW1vdmUoY2hpbGQpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpCi0gIHsKLSAgICB0eXBlXyA9IHR5cGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgdXJpXyA9IHVyaTsKLSAgfQotCi0gIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKQotICB7Ci0gICAgcmV0dXJuIGJ5dGVzXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEJ5dGVzKGJ5dGVbXSBieXRlcykKLSAgewotICAgIGJ5dGVzXyA9IGJ5dGVzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRIVFRQVXNlcm5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGh0dHBVc2VybmFtZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRIVFRQVXNlcm5hbWUoU3RyaW5nIGh0dHBVc2VybmFtZSkKLSAgewotICAgIGh0dHBVc2VybmFtZV8gPSBodHRwVXNlcm5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEhUVFBQYXNzd29yZCgpCi0gIHsKLSAgICByZXR1cm4gaHR0cFBhc3N3b3JkXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhUVFBQYXNzd29yZChTdHJpbmcgaHR0cFBhc3N3b3JkKQotICB7Ci0gICAgaHR0cFBhc3N3b3JkXyA9IGh0dHBQYXNzd29yZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudGF0aW9uKCkKLSAgewotICAgIHJldHVybiBkb2N1bWVudGF0aW9uXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRhdGlvbihTdHJpbmcgZG9jdW1lbnRhdGlvbikKLSAgewotICAgIGRvY3VtZW50YXRpb25fID0gZG9jdW1lbnRhdGlvbjsKLSAgfQotICAKLSAgcHVibGljIE9iamVjdCBnZXRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBtb2RlbF8gPSBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRW50aXR5UmVzb2x2ZWQoKQotICB7Ci0gICAgcmV0dXJuIChieXRlc18gIT0gbnVsbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XZWJTZXJ2aWNlc1BhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvV2ViU2VydmljZXNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwZjQ0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XZWJTZXJ2aWNlc1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5BYnN0cmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkluc3BlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLldTSUxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLldTSUxEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLkV4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLnVkZGkuVURESUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvLkRJU0NPQ29udHJhY3RSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjby5ESVNDT1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvLkRJU0NPUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgc3VuLm1pc2MuQkFTRTY0RW5jb2RlcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzUGFyc2VyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX05PTkUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJTRV9XU0lMID0gMTw8MDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfV1NETCA9IDE8PDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX0xJTktTID0gMTw8MjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfRElTQ08gPSAxPDwzOwotCi0gIHByaXZhdGUgU3RyaW5nIHVyaV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHVyaVRvRW50aXR5VGFibGVfOwotCi0gIHByaXZhdGUgU3RyaW5nIGh0dHBCYXNpY0F1dGhVc2VybmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIGh0dHBCYXNpY0F1dGhQYXNzd29yZF87Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAgIHRoaXMobnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIoU3RyaW5nIHVyaSkKLSAgewotICAgIHVyaV8gPSB1cmk7Ci0gICAgdXJpVG9FbnRpdHlUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgaHR0cEJhc2ljQXV0aFVzZXJuYW1lXyA9IG51bGw7Ci0gICAgaHR0cEJhc2ljQXV0aFBhc3N3b3JkXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgdXJpXyA9IHVyaTsKLSAgfQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRW50aXR5IGdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgICAgcmV0dXJuIChXZWJTZXJ2aWNlRW50aXR5KXVyaVRvRW50aXR5VGFibGVfLmdldCh1cmkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFdTSUxEb2N1bWVudCBnZXRXU0lMRG9jdW1lbnQoU3RyaW5nIHdzaWxVUkkpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0V1NJTERvY3VtZW50VmVyYm9zZSh3c2lsVVJJKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgV1NJTERvY3VtZW50IGdldFdTSUxEb2N1bWVudFZlcmJvc2UoU3RyaW5nIHdzaWxVUkkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiwgV1NJTEV4Y2VwdGlvbgotICB7Ci0gICAgV2ViU2VydmljZUVudGl0eSB3c0VudGl0eSA9IGdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3c2lsVVJJKTsKLSAgICBpZiAod3NFbnRpdHkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c0VudGl0eSA9IG5ldyBXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgICB3c0VudGl0eS5zZXRVUkkod3NpbFVSSSk7Ci0gICAgICB1cmlUb0VudGl0eVRhYmxlXy5wdXQod3NpbFVSSSwgd3NFbnRpdHkpOwotICAgIH0KLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvY3VtZW50ID0gKFdTSUxEb2N1bWVudCl3c0VudGl0eS5nZXRNb2RlbCgpOwotICAgIGlmICh3c2lsRG9jdW1lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBieXRlW10gYiA9IGdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkod3NpbFVSSSk7Ci0gICAgICB3c0VudGl0eS5zZXRCeXRlcyhiKTsKLSAgICAgIHNldEhUVFBTZXR0aW5ncyh3c0VudGl0eSk7Ci0gICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpKTsKLSAgICAgIHdzaWxEb2N1bWVudCA9IFdTSUxEb2N1bWVudC5uZXdJbnN0YW5jZSgpOwotICAgICAgd3NpbERvY3VtZW50LnJlYWQoaXNyKTsKLSAgICAgIHdzRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX1dTSUwpOwotICAgICAgd3NFbnRpdHkuc2V0TW9kZWwod3NpbERvY3VtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzaWxEb2N1bWVudDsKLSAgfQotCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldFdTRExEZWZpbml0aW9uKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIGdldFdTRExEZWZpbml0aW9uVmVyYm9zZSh3c2RsVVJJKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRXU0RMRGVmaW5pdGlvblZlcmJvc2UoU3RyaW5nIHdzZGxVUkkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgV2ViU2VydmljZUVudGl0eSB3c0VudGl0eSA9IGdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3c2RsVVJJKTsKLSAgICBpZiAod3NFbnRpdHkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c0VudGl0eSA9IG5ldyBXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgICB3c0VudGl0eS5zZXRVUkkod3NkbFVSSSk7Ci0gICAgICB1cmlUb0VudGl0eVRhYmxlXy5wdXQod3NkbFVSSSwgd3NFbnRpdHkpOwotICAgIH0KLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbil3c0VudGl0eS5nZXRNb2RlbCgpOwotICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpCi0gICAgewotICAgICAgYnl0ZVtdIGIgPSBnZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHdzZGxVUkkpOwotICAgICAgd3NFbnRpdHkuc2V0Qnl0ZXMoYik7Ci0gICAgICBzZXRIVFRQU2V0dGluZ3Mod3NFbnRpdHkpOwotICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiKTsKLSAgICAgIFdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMUGx1Z2luLklOU1RBTkNFLmNyZWF0ZVdTREw0SkZhY3RvcnkoKTsKLSAgICAgIFdTRExSZWFkZXIgd3NkbFJlYWRlciA9IGZhY3RvcnkubmV3V1NETFJlYWRlcigpOwotICAgICAgZGVmaW5pdGlvbiA9IHdzZGxSZWFkZXIucmVhZFdTREwod3NkbFVSSSwgbmV3IElucHV0U291cmNlKGJhaXMpKTsKLSAgICAgIHdzRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpOwotICAgICAgd3NFbnRpdHkuc2V0TW9kZWwoZGVmaW5pdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFyc2UoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgcGFyc2VVUkwoUEFSU0VfV1NJTCB8IFBBUlNFX1dTREwgfCBQQVJTRV9MSU5LUyB8IFBBUlNFX0RJU0NPKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhcnNlKGludCBwYXJzZU9wdGlvbikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAgIHBhcnNlVVJMKHBhcnNlT3B0aW9uKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwYXJzZVVSTChpbnQgcGFyc2VPcHRpb24pIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBXZWJTZXJ2aWNlRW50aXR5IHdzRW50aXR5ID0gbmV3IFdlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICB3c0VudGl0eS5zZXRVUkkodXJpXyk7Ci0gICAgYnl0ZVtdIGIgPSBnZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHVyaV8pOwotICAgIHdzRW50aXR5LnNldEJ5dGVzKGIpOwotICAgIHNldEhUVFBTZXR0aW5ncyh3c0VudGl0eSk7Ci0gICAgdXJpVG9FbnRpdHlUYWJsZV8ucHV0KHVyaV8sIHdzRW50aXR5KTsKLSAgICAvLyBwYXJzZSB1cmlfIGFzIGEgSFRNTCBkb2N1bWVudAotICAgIEhUTUxIZWFkSGFuZGxlciBoZWFkSGFuZGxlciA9IG5ldyBIVE1MSGVhZEhhbmRsZXIodXJpXyk7Ci0gICAgYnl0ZVtdIGhlYWQgPSBoZWFkSGFuZGxlci5oYXJ2ZXN0SGVhZFRhZ3MoYik7Ci0gICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUoZmFsc2UpOwotICAgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcGFyc2VyLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShoZWFkKSwgaGVhZEhhbmRsZXIpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgIH0KLSAgICBTdHJpbmdbXSB3c2lsVVJJcyA9IGhlYWRIYW5kbGVyLmdldFdzaWxzKCk7Ci0gICAgU3RyaW5nW10gZGlzY29VUklzID0gaGVhZEhhbmRsZXIuZ2V0RGlzY29zKCk7Ci0gICAgLy8gdHJ1ZSBpZiB1cmlfIGlzIGEgSFRNTCBkb2N1bWVudAotICAgIGlmICh3c2lsVVJJcy5sZW5ndGggPiAwIHx8IGRpc2NvVVJJcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIHdzRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX0hUTUwpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2lsVVJJcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGFic29sdXRlVVJJID0gY29udmVydFRvQWJzb2x1dGVVUkkodXJpXywgd3NpbFVSSXNbaV0pOwotICAgICAgICBXZWJTZXJ2aWNlRW50aXR5IHdzaWxFbnRpdHkgPSBuZXcgV2ViU2VydmljZUVudGl0eSgpOwotICAgICAgICB3c2lsRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX1dTSUwpOwotICAgICAgICB3c2lsRW50aXR5LnNldFVSSShhYnNvbHV0ZVVSSSk7Ci0gICAgICAgIGFzc29jaWF0ZSh3c0VudGl0eSwgd3NpbEVudGl0eSk7Ci0gICAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dChhYnNvbHV0ZVVSSSwgd3NpbEVudGl0eSk7Ci0gICAgICAgIGlmICgocGFyc2VPcHRpb24gfCBQQVJTRV9XU0lMKSA9PSBwYXJzZU9wdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcnNlV1NJTChhYnNvbHV0ZVVSSSwgcGFyc2VPcHRpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yIChpbnQgaT0wO2k8ZGlzY29VUklzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIFdlYlNlcnZpY2VFbnRpdHkgZGlzY29FbnRpdHkgPSBuZXcgV2ViU2VydmljZUVudGl0eSgpOwotICAgICAgICBkaXNjb0VudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9ESVNDTyk7Ci0gICAgICAgIGRpc2NvRW50aXR5LnNldFVSSShkaXNjb1VSSXNbaV0pOwotICAgICAgICBhc3NvY2lhdGUod3NFbnRpdHksZGlzY29FbnRpdHkpOwotICAgICAgICB1cmlUb0VudGl0eVRhYmxlXy5wdXQoZGlzY29VUklzW2ldLGRpc2NvRW50aXR5KTsKLSAgICAgICAgaWYgKChwYXJzZU9wdGlvbiB8IFBBUlNFX0RJU0NPKSA9PSBwYXJzZU9wdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcnNlRElTQ08oZGlzY29VUklzW2ldLHBhcnNlT3B0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gZmFsc2UgaWYgdXJpXyBpcyBub3QgYSBIVE1MIGRvY3VtZW50Ci0gICAgLy8gdGhlbiBwYXJzZSB1cmlfIGFzIGEgV1NJTCBkb2N1bWVudAotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcGFyc2VXU0lMKHVyaV8sIHBhcnNlT3B0aW9uKTsKLSAgICAgICAgLy8gbm8gZXhjZXB0aW9uIHRocm93biBpZiB1cmlfIGlzIGEgV1NJTCBkb2N1bWVudAotICAgICAgICB3c0VudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0lMKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgICAgLy8gZXhjZXB0aW9uIHRocm93biBpZiB1cmlfIGlzIG5vdCBhIFdTSUwgZG9jdW1lbnQKLSAgICAgICAgLy8gdGhlbiBwYXJzZSB1cmlfIGFzIGEgRElTQ08gZG9jdW1lbnQuCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcGFyc2VESVNDTyh1cmlfLCBwYXJzZU9wdGlvbik7Ci0gICAgICAgICAgLy8gbm8gZXhjZXB0aW9uIHRocm93biBpZiB1cmlfIGlzIGEgRElTQ08gZG9jdW1lbnQKLSAgICAgICAgICB3c0VudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9ESVNDTyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0MikKLSAgICAgICAgewotICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0aHJvd24gaWYgdXJpXyBpcyBub3QgYSBESVNDTyBkb2N1bWVudAotICAgICAgICAgIC8vIHRoZW4gcGFyc2UgdXJpXyBhcyBhIFdTREwgZG9jdW1lbnQKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJzZVdTREwodXJpXyk7Ci0gICAgICAgICAgICAvLyBubyBleGNlcHRpb24gdGhyb3duIGlmIHVyaV8gaXMgYSBXU0RMIGRvY3VtZW50Ci0gICAgICAgICAgICB3c0VudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0RMKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0MykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBleGNlcHRpb24gdGhyb3duIGlmIHVyaV8gaXMgbm90IGEgV1NETCBkb2N1bWVudAotICAgICAgICAgICAgLy8gdGhlbiBkbyBub3RoaW5nCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlV1NJTChTdHJpbmcgd3NpbFVSSSwgaW50IHBhcnNlT3B0aW9uKSB0aHJvd3MgV1NJTEV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NpbEVudGl0eSA9IGdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3c2lsVVJJKTsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IChXU0lMRG9jdW1lbnQpd3NpbEVudGl0eS5nZXRNb2RlbCgpOwotICAgIGlmICh3c2lsRG9jICE9IG51bGwpCi0gICAgewotICAgICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wcyBmcm9tIG9jY3VycmluZyB3aGVuIGEgV1NJTCBjeWNsZXMgb2NjdXIuCi0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnRWZXJib3NlKHdzaWxVUkkpOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2MuZ2V0SW5zcGVjdGlvbigpOwotICAgIFNlcnZpY2VbXSBzZXJ2aWNlcyA9IGluc3BlY3Rpb24uZ2V0U2VydmljZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIERlc2NyaXB0aW9uW10gZGVzY3MgPSBzZXJ2aWNlc1tpXS5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICAgIC8vIFNldCB0aGUgZG9jdW1lbnRhdGlvbiB0byB0aGUgPHNlcnZpY2U+IGVsZW1lbnQncyBmaXJzdCBhYnN0cmFjdC4KLSAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uID0gbnVsbDsKLSAgICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gc2VydmljZXNbaV0uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgICBpZiAoYWJzdHJhY3RzICE9IG51bGwgJiYgYWJzdHJhY3RzLmxlbmd0aCA+IDApCi0gICAgICAgIGRvY3VtZW50YXRpb24gPSBhYnN0cmFjdHNbMF0uZ2V0VGV4dCgpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgIAlTdHJpbmcgcmVmZXJlbmNlZE5TID0gZGVzY3Nbal0uZ2V0UmVmZXJlbmNlZE5hbWVzcGFjZSgpOwotICAgICAgCS8vIElmIGEgPGRlc2NyaXB0aW9uPiBlbGVtZW50IGNvbnRhaW5zIGFuIGFic3RyYWN0LCB1c2UgaXQgdG8gb3ZlcnJpZGUgdGhlIHNlcnZpY2UgZG9jdW1lbnRhdGlvbi4gICAgICAJCi0gICAgICAJYWJzdHJhY3RzID0gZGVzY3Nbal0uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgICAJaWYgKGFic3RyYWN0cyAhPSBudWxsICYmIGFic3RyYWN0cy5sZW5ndGggPiAwKQotICAgICAgCSAgZG9jdW1lbnRhdGlvbiA9IGFic3RyYWN0c1swXS5nZXRUZXh0KCk7Ci0gICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0RMLmVxdWFscyhyZWZlcmVuY2VkTlMpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gZGVzY3Nbal0uZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCAmJiBsb2NhdGlvbi5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGFic29sdXRlVVJJID0gY29udmVydFRvQWJzb2x1dGVVUkkod3NpbFVSSSwgbG9jYXRpb24pOwotICAgICAgICAgICAgV2ViU2VydmljZUVudGl0eSB3c2RsRW50aXR5ID0gbmV3IFdlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICAgICAgICAgIHdzZGxFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NETCk7Ci0gICAgICAgICAgICB3c2RsRW50aXR5LnNldFVSSShhYnNvbHV0ZVVSSSk7Ci0gICAgICAgICAgICB3c2RsRW50aXR5LnNldERvY3VtZW50YXRpb24oZG9jdW1lbnRhdGlvbik7Ci0gICAgICAgICAgICBhc3NvY2lhdGUod3NpbEVudGl0eSwgd3NkbEVudGl0eSk7Ci0gICAgICAgICAgICB1cmlUb0VudGl0eVRhYmxlXy5wdXQoYWJzb2x1dGVVUkksIHdzZGxFbnRpdHkpOwotICAgICAgICAgICAgaWYgKChwYXJzZU9wdGlvbiB8IFBBUlNFX1dTREwpID09IHBhcnNlT3B0aW9uKQotICAgICAgICAgICAgICBwYXJzZVdTREwoYWJzb2x1dGVVUkkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChVRERJQ29uc3RhbnRzLk5TX1VSSV9VRERJX1YyLmVxdWFscyhyZWZlcmVuY2VkTlMpKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaW9uRWxlbWVudCBlZSA9IGRlc2NzW2pdLmdldEV4dGVuc2lvbkVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAoZWUgaW5zdGFuY2VvZiBTZXJ2aWNlRGVzY3JpcHRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gKFNlcnZpY2VEZXNjcmlwdGlvbillZTsKLSAgICAgICAgICAgIFN0cmluZyBpbnF1aXJ5VVJMID0gc2QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlS2V5ID0gc2QuZ2V0U2VydmljZUtleSgpLmdldFRleHQoKTsKLSAgICAgICAgICAgIFdlYlNlcnZpY2VFbnRpdHkgdWRkaVNlcnZpY2VFbnRpdHkgPSBuZXcgV2ViU2VydmljZUVudGl0eSgpOwotICAgICAgICAgICAgdWRkaVNlcnZpY2VFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfVURESV9TRVJWSUNFKTsKLSAgICAgICAgICAgIFN0cmluZyB1ZGRpU2VydmljZUtleVVSSSA9IFVERElVUklIZWxwZXIuZ2V0U2VydmljZUtleVVSSShzZXJ2aWNlS2V5LGlucXVpcnlVUkwpOwotICAgICAgICAgICAgdWRkaVNlcnZpY2VFbnRpdHkuc2V0VVJJKHVkZGlTZXJ2aWNlS2V5VVJJKTsKLSAgICAgICAgICAgIHVkZGlTZXJ2aWNlRW50aXR5LnNldERvY3VtZW50YXRpb24oZG9jdW1lbnRhdGlvbik7Ci0gICAgICAgICAgICBhc3NvY2lhdGUod3NpbEVudGl0eSx1ZGRpU2VydmljZUVudGl0eSk7Ci0gICAgICAgICAgICB1cmlUb0VudGl0eVRhYmxlXy5wdXQodWRkaVNlcnZpY2VLZXlVUkksdWRkaVNlcnZpY2VFbnRpdHkpOwotICAgICAgICAgICAgLy8gVE9ETzogcGFyc2UgV1NETCBpZiBuZWNlc3NhcnkuLi4KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgTGlua1tdIGxpbmtzID0gaW5zcGVjdGlvbi5nZXRMaW5rcygpOyAgICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChXU0lMQ29uc3RhbnRzLk5TX1VSSV9XU0lMLmVxdWFscyhsaW5rc1tpXS5nZXRSZWZlcmVuY2VkTmFtZXNwYWNlKCkpKQotICAgICAgewotICAgICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbiA9IG51bGw7Ci0gICAgICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gbGlua3NbaV0uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgICAgIGlmIChhYnN0cmFjdHMgIT0gbnVsbCAmJiBhYnN0cmFjdHMubGVuZ3RoID4gMCkKLSAgICAgICAgICBkb2N1bWVudGF0aW9uID0gYWJzdHJhY3RzWzBdLmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIGxpbmtMb2NhdGlvbiA9IGxpbmtzW2ldLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhYnNvbHV0ZVVSSSA9IGNvbnZlcnRUb0Fic29sdXRlVVJJKHdzaWxVUkksIGxpbmtMb2NhdGlvbik7Ci0gICAgICAgIC8vIFByZXZlbnQgY3ljbGVzLgotICAgICAgICBXZWJTZXJ2aWNlRW50aXR5IHdzaWxMaW5rRW50aXR5ID0gZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKGFic29sdXRlVVJJKTsKLSAgICAgICAgaWYgKHdzaWxMaW5rRW50aXR5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2lsTGlua0VudGl0eSA9IG5ldyBXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgICAgICAgd3NpbExpbmtFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCk7Ci0gICAgICAgICAgd3NpbExpbmtFbnRpdHkuc2V0VVJJKGFic29sdXRlVVJJKTsKLSAgICAgICAgICB3c2lsTGlua0VudGl0eS5zZXREb2N1bWVudGF0aW9uKGRvY3VtZW50YXRpb24pOwotICAgICAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dChhYnNvbHV0ZVVSSSwgd3NpbExpbmtFbnRpdHkpOwotICAgICAgICAgIGlmICgocGFyc2VPcHRpb24gfCBQQVJTRV9MSU5LUykgPT0gcGFyc2VPcHRpb24pCi0gICAgICAgICAgICBwYXJzZVdTSUwoYWJzb2x1dGVVUkksIHBhcnNlT3B0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBhc3NvY2lhdGUod3NpbEVudGl0eSx3c2lsTGlua0VudGl0eSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcGFyc2VESVNDTyhTdHJpbmcgZGlzY29VUkksIGludCBwYXJzZU9wdGlvbikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24sIEV4Y2VwdGlvbgotICB7Ci0gICAgV2ViU2VydmljZUVudGl0eSBkaXNjb0VudGl0eSA9IGdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSShkaXNjb1VSSSk7Ci0gICAgYnl0ZVtdIGIgPSBnZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KGRpc2NvVVJJKTsKLSAgICBkaXNjb0VudGl0eS5zZXRCeXRlcyhiKTsKLSAgICBzZXRIVFRQU2V0dGluZ3MoZGlzY29FbnRpdHkpOwotICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYik7Ci0gICAgRElTQ09QYXJzZXIgcGFyc2VyID0gbmV3IERJU0NPUGFyc2VyKCk7Ci0gICAgRElTQ09SZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gcGFyc2VyLnBhcnNlKGRpc2NvVVJJLG5ldyBJbnB1dFNvdXJjZShiYWlzKSk7Ci0gICAgaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiByZWZlcmVuY2VzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wO2k8cmVmZXJlbmNlcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBpZiAocmVmZXJlbmNlc1tpXSBpbnN0YW5jZW9mIERJU0NPQ29udHJhY3RSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjb250cmFjdFJlZgotICAgICAgICAgIERJU0NPQ29udHJhY3RSZWZlcmVuY2UgcmVmZXJlbmNlID0gKERJU0NPQ29udHJhY3RSZWZlcmVuY2UpcmVmZXJlbmNlc1tpXTsKLSAgICAgICAgICBTdHJpbmcgcmVmID0gcmVmZXJlbmNlLmdldFJlZigpOwotICAgICAgICAgIFN0cmluZyBkb2NSZWYgPSByZWZlcmVuY2UuZ2V0RG9jUmVmKCk7Ci0gICAgICAgICAgV2ViU2VydmljZUVudGl0eSB3c2RsRW50aXR5ID0gbmV3IFdlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICAgICAgICB3c2RsRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpOwotICAgICAgICAgIHdzZGxFbnRpdHkuc2V0VVJJKHJlZik7Ci0gICAgICAgICAgd3NkbEVudGl0eS5zZXREb2N1bWVudGF0aW9uKGRvY1JlZik7Ci0gICAgICAgICAgYXNzb2NpYXRlKGRpc2NvRW50aXR5LHdzZGxFbnRpdHkpOwotICAgICAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dChyZWYsd3NkbEVudGl0eSk7Ci0gICAgICAgICAgaWYgKChwYXJzZU9wdGlvbiB8IFBBUlNFX1dTREwpID09IHBhcnNlT3B0aW9uKQotICAgICAgICAgICAgcGFyc2VXU0RMKHJlZik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gZGlzY292ZXJ5UmVmCi0gICAgICAgICAgU3RyaW5nIHJlZiA9IHJlZmVyZW5jZXNbaV0uZ2V0UmVmKCk7Ci0gICAgICAgICAgLy8gUHJldmVudCBjeWNsZXMuCi0gICAgICAgICAgV2ViU2VydmljZUVudGl0eSBkaXNjb0xpbmtFbnRpdHkgPSBnZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkocmVmKTsKLSAgICAgICAgICBpZiAoZGlzY29MaW5rRW50aXR5ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZGlzY29MaW5rRW50aXR5ID0gbmV3IFdlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICAgICAgICAgIGRpc2NvTGlua0VudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9ESVNDTyk7Ci0gICAgICAgICAgICBkaXNjb0xpbmtFbnRpdHkuc2V0VVJJKHJlZik7Ci0gICAgICAgICAgICB1cmlUb0VudGl0eVRhYmxlXy5wdXQocmVmLGRpc2NvTGlua0VudGl0eSk7Ci0gICAgICAgICAgICBpZiAoKHBhcnNlT3B0aW9uIHwgUEFSU0VfTElOS1MpID09IHBhcnNlT3B0aW9uKQotICAgICAgICAgICAgICBwYXJzZURJU0NPKHJlZixwYXJzZU9wdGlvbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGFzc29jaWF0ZShkaXNjb0VudGl0eSxkaXNjb0xpbmtFbnRpdHkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBEZWZpbml0aW9uIHBhcnNlV1NETChTdHJpbmcgd3NkbFVSSSkgdGhyb3dzIFdTRExFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gZ2V0V1NETERlZmluaXRpb25WZXJib3NlKHdzZGxVUkkpOwotICB9Ci0KLSAgcHJpdmF0ZSBieXRlW10gZ2V0SW5wdXRTdHJlYW1Bc0J5dGVBcnJheShTdHJpbmcgdXJpU3RyaW5nKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAgIC8vIFRyeSB0byBnZXQgYSBjYWNoZWQgY29weSBvZiB0aGUgYnl0ZVtdCi0gICAgV2ViU2VydmljZUVudGl0eSB3c0VudGl0eSA9IGdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh1cmlTdHJpbmcpOwotICAgIGlmICh3c0VudGl0eSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJ5dGVbXSBieXRlcyA9IHdzRW50aXR5LmdldEJ5dGVzKCk7Ci0gICAgICBpZiAoYnl0ZXMgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLSAgICAvLyBHZXQgdGhlIGJ5dGVbXSBieSBvcGVuaW5nIGEgc3RyZWFtIHRvIHRoZSBVUkkKLSAgICBVUkwgdXJsID0gY3JlYXRlVVJMKHVyaVN0cmluZyk7Ci0gICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgLy8gcHJveHkgc2VydmVyIHNldHRpbmcKLSAgICBTdHJpbmcgcHJveHlVc2VyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVVzZXJOYW1lIik7Ci0gICAgU3RyaW5nIHByb3h5UGFzc3dvcmQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAucHJveHlQYXNzd29yZCIpOwotICAgIGlmIChwcm94eVVzZXJOYW1lICE9IG51bGwgJiYgcHJveHlQYXNzd29yZCAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciB1c2VyTmFtZVBhc3N3b3JkID0gbmV3IFN0cmluZ0J1ZmZlcihwcm94eVVzZXJOYW1lKTsKLSAgICAgIHVzZXJOYW1lUGFzc3dvcmQuYXBwZW5kKCc6JykuYXBwZW5kKHByb3h5UGFzc3dvcmQpOwotICAgICAgQkFTRTY0RW5jb2RlciBlbmNvZGVyID0gbmV3IEJBU0U2NEVuY29kZXIoKTsKLSAgICAgIFN0cmluZyBlbmNvZGluZyA9IGVuY29kZXIuZW5jb2RlKHVzZXJOYW1lUGFzc3dvcmQudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLSAgICAgIHVzZXJOYW1lUGFzc3dvcmQuc2V0TGVuZ3RoKDApOwotICAgICAgdXNlck5hbWVQYXNzd29yZC5hcHBlbmQoIkJhc2ljICIpLmFwcGVuZChlbmNvZGluZyk7Ci0gICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiUHJveHktYXV0aG9yaXphdGlvbiIsIHVzZXJOYW1lUGFzc3dvcmQudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24gc2V0dGluZwotICAgIGlmIChodHRwQmFzaWNBdXRoVXNlcm5hbWVfICE9IG51bGwgJiYgaHR0cEJhc2ljQXV0aFBhc3N3b3JkXyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoaHR0cEJhc2ljQXV0aFVzZXJuYW1lXyk7Ci0gICAgICBzYi5hcHBlbmQoJzonKS5hcHBlbmQoaHR0cEJhc2ljQXV0aFBhc3N3b3JkXyk7Ci0gICAgICBCQVNFNjRFbmNvZGVyIGVuY29kZXIgPSBuZXcgQkFTRTY0RW5jb2RlcigpOwotICAgICAgU3RyaW5nIGVuY29kaW5nID0gZW5jb2Rlci5lbmNvZGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLSAgICAgIHNiLnNldExlbmd0aCgwKTsKLSAgICAgIHNiLmFwcGVuZCgiQmFzaWMgIikuYXBwZW5kKGVuY29kaW5nKTsKLSAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBdXRob3JpemF0aW9uIiwgc2IudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpcyA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgIFN0cmluZyB3d3dBdXRoTXNnID0gY29ubi5nZXRIZWFkZXJGaWVsZCgiV1dXLUF1dGhlbnRpY2F0ZSIpOwotICAgICAgaWYgKHd3d0F1dGhNc2cgIT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKG5ldyBJT0V4Y2VwdGlvbigpLCB3d3dBdXRoTXNnLCB1cmlTdHJpbmcpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIFN0cmluZyB3d3dBdXRoTXNnID0gY29ubi5nZXRIZWFkZXJGaWVsZCgiV1dXLUF1dGhlbnRpY2F0ZSIpOwotICAgICAgaWYgKHd3d0F1dGhNc2cgIT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKGlvZSwgd3d3QXV0aE1zZywgdXJpU3RyaW5nKTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgaW9lOwotICAgIH0KLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBieXRlW10gYiA9IG5ldyBieXRlWzEwMjRdOwotICAgIGludCBieXRlUmVhZCA9IGlzLnJlYWQoYik7Ci0gICAgd2hpbGUgKGJ5dGVSZWFkICE9IC0xKQotICAgIHsKLSAgICAgIGJhb3Mud3JpdGUoYiwgMCwgYnl0ZVJlYWQpOwotICAgICAgYnl0ZVJlYWQgPSBpcy5yZWFkKGIpOwotICAgIH0KLSAgICBpcy5jbG9zZSgpOwotICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgVVJMIGNyZWF0ZVVSTChTdHJpbmcgdXJsKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IFVSTCh1cmwpOwotICB9Ci0KLSAgcHJpdmF0ZSBieXRlW10gZ2V0Qnl0ZXMoV2ViU2VydmljZUVudGl0eSB3c0VudGl0eSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBieXRlW10gYiA9IHdzRW50aXR5LmdldEJ5dGVzKCk7Ci0gICAgaWYgKGIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBiID0gZ2V0SW5wdXRTdHJlYW1Bc0J5dGVBcnJheSh3c0VudGl0eS5nZXRVUkkoKSk7Ci0gICAgICB3c0VudGl0eS5zZXRCeXRlcyhiKTsKLSAgICAgIHNldEhUVFBTZXR0aW5ncyh3c0VudGl0eSk7Ci0gICAgfQotICAgIHJldHVybiBiOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc29jaWF0ZShXZWJTZXJ2aWNlRW50aXR5IHBhcmVudCwgV2ViU2VydmljZUVudGl0eSBjaGlsZCkKLSAgewotICAgIHBhcmVudC5hZGRDaGlsZChjaGlsZCk7Ci0gICAgY2hpbGQuc2V0UGFyZW50KHBhcmVudCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBjb252ZXJ0VG9BYnNvbHV0ZVVSSShTdHJpbmcgYmFzZVVSSSxTdHJpbmcgcmVmVVJJKQotICB7Ci0gICAgaWYgKHJlZlVSSSAhPSBudWxsICYmIHJlZlVSSS5pbmRleE9mKCI6IikgPCAwKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBhYnNvbHV0ZVVSSSA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzZVVSSS5zdWJzdHJpbmcoMCxNYXRoLm1heChiYXNlVVJJLmxhc3RJbmRleE9mKCdcXCcpLGJhc2VVUkkubGFzdEluZGV4T2YoJy8nKSsxKSkpOwotICAgICAgYWJzb2x1dGVVUkkuYXBwZW5kKHJlZlVSSSk7Ci0gICAgICByZXR1cm4gYWJzb2x1dGVVUkkudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZlVSSTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRIVFRQU2V0dGluZ3MoV2ViU2VydmljZUVudGl0eSBlbnRpdHkpCi0gIHsKLSAgICBpZiAoaHR0cEJhc2ljQXV0aFVzZXJuYW1lXyAhPSBudWxsICYmIGh0dHBCYXNpY0F1dGhQYXNzd29yZF8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbnRpdHkuc2V0SFRUUFVzZXJuYW1lKGh0dHBCYXNpY0F1dGhVc2VybmFtZV8pOwotICAgICAgZW50aXR5LnNldEhUVFBQYXNzd29yZChodHRwQmFzaWNBdXRoUGFzc3dvcmRfKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEhUVFBCYXNpY0F1dGhVc2VybmFtZSgpCi0gIHsKLSAgICByZXR1cm4gaHR0cEJhc2ljQXV0aFVzZXJuYW1lXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhUVFBCYXNpY0F1dGhVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpCi0gIHsKLSAgICBodHRwQmFzaWNBdXRoVXNlcm5hbWVfID0gdXNlcm5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEhUVFBCYXNpY0F1dGhQYXNzd29yZCgpCi0gIHsKLSAgICByZXR1cm4gaHR0cEJhc2ljQXV0aFBhc3N3b3JkXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhUVFBCYXNpY0F1dGhQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpCi0gIHsKLSAgICBodHRwQmFzaWNBdXRoUGFzc3dvcmRfID0gcGFzc3dvcmQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL3dzaWwucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL3dzaWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2MGMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC93c2lsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBmb3IgQWRkV1NETFRvV1NJTENvbW1hbmQKLSMKLU1TR19FUlJPUl9JTlZBTElEX0FSR1VNRU5UUz1JV0FCMDA1NUUgSW52YWxpZCBjb21tYW5kIGFyZ3VtZW50cy4KLU1TR19FUlJPUl9JTExFR0FMX0FSR1VNRU5UUz1JV0FCMDEwNUUgSWxsZWdhbCBhcmd1bWVudC4KLU1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJJPUlXQUIwMTg1RSBJbnZhbGlkIFdTREwgVVJJLgotTVNHX0VSUk9SX0lOVkFMSURfV1NJTF9VUkk9SVdBQjAyMDZFIEludmFsaWQgV1NJTCBVUkkuCi1NU0dfRVJST1JfVU5SRVNPTFZBQkxFX1dTREw9SVdBQjA0MDVFIFdTREwgaXMgdW5yZXNvbHZhYmxlLgotTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OPUlXQUIwNDUxRSBBbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBoYXMgb2NjdXJlZC4KLU1TR19FUlJPUl9NQUxGT1JNRURfV1NETD1JV0FCMDQ1MkUgV1NETCBpcyBtYWxmb3JtZWQsIGVycm9yIHBhcnNpbmcgV1NETC4KLU1TR19FUlJPUl9XUklURV9XU0lMPUlXQUIwNDUzRSBFcnJvciB3cml0aW5nIFdTSUwuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OTdkMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi13c3VpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0ODdkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53cy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRjZmUzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2Uud3N1aS5qYXIgPSBzcmMvCi1vdXRwdXQud3N1aS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHdzdWkuamFyCi1zcmMuaW5jbHVkZXMgPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwODNkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBVSQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUz1XZWIgU2VydmljZXMKLVBSRUZFUkVOQ0VfQ0FURUdPUllfV1NJPVdTLUkgQ29tcGxpYW5jZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzkzMjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy51aSIKLSAgIG5hbWU9IiVQTFVHSU5fTkFNRSIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iJVBMVUdJTl9QUk9WSURFUiIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzdWkuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQk8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1MiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLldlYlNlcnZpY2VzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLm5hbWUiPgotICAgICAgPC9wYWdlPgotICAgICAgCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfV1NJIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMuV1NJQ29tcGxpYW5jZVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMuV1NJQ29tcGxpYW5jZVByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX1dTSSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByb3BlcnRpZXMuV1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByb3BlcnRpZXMuV1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZSI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJuYXR1cmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIAotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9XU0kiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcm9wZXJ0aWVzLldTSUNvbXBsaWFuY2VQcm9wZXJ0eVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcm9wZXJ0aWVzLldTSUNvbXBsaWFuY2VQcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICA8L3BhZ2U+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3VpL3dzcnQvSU9iamVjdFNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3VpL3dzcnQvSU9iamVjdFNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YzZhN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC91aS93c3J0L0lPYmplY3RTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC51aS53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklTZWxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU9iamVjdFNlbGVjdG9yIHsKLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsKTsKLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKTsKLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3QoKTsKLQlwdWJsaWMgU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsKTsKLQlwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvcGx1Z2luL1dTVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvcGx1Z2luL1dTVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3MWJiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3BsdWdpbi9XU1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lBUENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBwbHVnaW4uCi0qIDxwPgotKiBUaGlzIHBsdWdpbiBjb250YWlucyB0aGUgZ3JhcGhpYyB1c2VyIGludGVyZmFjZSB0byB0aGUKLSogV2ViIFNlcnZpY2VzIHJ1bnRpbWUgZm91bmQgaW4gb3JnLmVjbGlwc2UuanN0LndzLgotKi8KLXB1YmxpYyBjbGFzcyBXU1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotCS8vIENvcHlyaWdodAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9Ci0JCSIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAvKioKLSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luIGluIHBsdWdpbi54bWwuCi0gKi8KLSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Qud3MudWkiOwotCi0gLyoqCi0gKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gKi8KLSBwcml2YXRlIHN0YXRpYyBXU1VJUGx1Z2luIGluc3RhbmNlXzsKLQotIHByaXZhdGUgUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0IHdzaVNTQlBDb250ZXh0XzsKLSBwcml2YXRlIFBlcnNpc3RlbnRXU0lBUENvbnRleHQgd3NpQVBDb250ZXh0XzsKLSBwcml2YXRlIExvZyBsb2dfOwotIAotIC8qKgotICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAqLwotIHB1YmxpYyBXU1VJUGx1Z2luKCkgewotCXN1cGVyKCk7Ci0JaW5zdGFuY2VfID0gdGhpczsKLSB9Ci0KLSAvKioKLSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4gRXF1aXZhbGVudCB0byBjYWxsaW5nCi0gKiAoV1NVSVBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLndzdC53cy51aSIpOwotICogQHJldHVybiBUaGUgV1NVSVBsdWdpbiBzaW5nbGV0b24uCi0gKi8KLSBzdGF0aWMgcHVibGljIFdTVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0gICByZXR1cm4gaW5zdGFuY2VfOwotIH0KLQotCS8qKgotCSAqIEdldCBXU0kgQ29udGV4dAotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRXU0lTU0JQQ29udGV4dCBvciBnZXRXU0lBUENvbnRleHQgaW5zdGVhZAotCSAqIAotCSAqLyAKLSBwdWJsaWMgUGVyc2lzdGVudFdTSUNvbnRleHQgZ2V0V1NJQ29udGV4dCgpIAotIAl7IC8vIGRlZmF1bHRpbmcgdG8gZ2V0IFdTSSBTaW1wbGUgU09BUCBCaW5kaW5nIFByb2ZpbGUgY29udGV4dAotIAkgIHJldHVybiBnZXRXU0lTU0JQQ29udGV4dCgpOwotIAl9Ci0gCi0gLyoqCi0JICogR2V0IFdTSSBTaW1wbGUgU09BUCBCaW5kaW5nIFByb2ZpbGUgQ29udGV4dAotCSAqIAotCSAqLyAKLSBwdWJsaWMgUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0IGdldFdTSVNTQlBDb250ZXh0KCkgCi0JewotCSAgaWYgKHdzaVNTQlBDb250ZXh0XyA9PSBudWxsKQotCSAgCXsKLQkgIAkJd3NpU1NCUENvbnRleHRfID0gbmV3IFBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dCgpOwotCSAgCQl3c2lTU0JQQ29udGV4dF8ubG9hZCgpOwotCSAgCX0KLQkgIHJldHVybiB3c2lTU0JQQ29udGV4dF87Ci0JfQotIAotIC8qKgotCSAqIEdldCBXU0kgQXR0YWNobWVudCBQcm9maWxlIENvbnRleHQKLQkgKiAKLQkgKi8gCi0gcHVibGljIFBlcnNpc3RlbnRXU0lBUENvbnRleHQgZ2V0V1NJQVBDb250ZXh0KCkgCi0JewotCSAgaWYgKHdzaUFQQ29udGV4dF8gPT0gbnVsbCkKLQkgIAl7Ci0JICAJCXdzaUFQQ29udGV4dF8gPSBuZXcgUGVyc2lzdGVudFdTSUFQQ29udGV4dCgpOwotCSAgCQl3c2lBUENvbnRleHRfLmxvYWQoKTsKLQkgIAl9Ci0JICByZXR1cm4gd3NpQVBDb250ZXh0XzsKLQl9Ci0KLSAvKioKLSAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAqIEBwYXJhbSBrZXkgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuCi0gKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotICogZm9ybTogIktFWSA9IHZhbHVlIi4KLSAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSAKLQl7Ci0JICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MudWkucGx1Z2luIiwgaW5zdGFuY2VfICk7Ci0JICAgIAotCSAgICBpZigga2V5LnN0YXJ0c1dpdGgoIiUiKSkKLQkgICAgewotCSAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoIDEsIGtleS5sZW5ndGgoKSApOwotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gbXNnVXRpbHMuZ2V0TWVzc2FnZShrZXkpOwotICAgfQotCi0gLyoqCi0gKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0gKiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICogYXJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2gKLSAqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBmb3IKLSAqIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotICogVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4gbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIKLSAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0gKiBAcGFyYW0gYXJncyBUaGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UKLSAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBtZXNzYWdlIGluIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZAotICogYnkgdGhlIHJ1bGVzIG9mIGNsYXNzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LgotICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0gKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSwgYXJncyk7Ci0gfQotCi0gLyoqCi0gKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZQotICogYXMgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uLgotICogQHJldHVybiBBbiBpbWFnZSBkZXNjcmlwdG9yLCBwb3NzaWJseSBudWxsLgotICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGluc3RhbmNlXy5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIGltYWdlVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBuYW1lKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgIHJldHVybiBudWxsOwotICAgfQotIH0KLQotIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpIHsKLSAgIHJldHVybiBQbGF0Zm9ybS5nZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKHRoaXMpLnRvT1NTdHJpbmcoKTsKLSB9Ci0KLSBwdWJsaWMgU3RyaW5nIGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbigpIHsKLSAgIHRyeSB7Ci0gICAgIHJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpLmdldEZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1dlYlNlcnZpY2VzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvV2ViU2VydmljZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGVlNmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvV2ViU2VydmljZXNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogVGhlIFdlYlNlcnZpY2VzUHJlZmVyZW5jZVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLS8qKgotICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgCi0gKiBvZiB0aGlzIHByZWZlcmVuY2UgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLSAqIDxwPgotICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUKLSAqIHN1YmNsYXNzZXMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICogQHJldHVybiB0aGUgbmV3IGNvbnRyb2wKLSAqLwotcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlIHBhcmVudCkgewotCXJldHVybiBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotfQotLyoqCi0gKiBEbyBhbnkgaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQgYnkgdGhlIGRlc2t0b3AuIEJ5IGRlZmF1bHQgZG8gbm90aGluZy4KLSAqLwotcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGRlc2t0b3ApIHt9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lBUENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lBUENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmMDRkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJQVBDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV1NVSVBsdWdpbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50V1NJQVBDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudFdTSUNvbnRleHQKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX1dTSV9BUF9DT01QTElBTkNFID0gIm5vbldTSUFQQ29tcGxpYW5jZSI7Ci0KLXB1YmxpYyBQZXJzaXN0ZW50V1NJQVBDb250ZXh0ICgpIAotewotCXN1cGVyKCk7Ci0Jbm9uX3dzaV9jb21wbGlhbmNlID0gTk9OX1dTSV9BUF9DT01QTElBTkNFOwotCW5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShXU1VJUGx1Z2luLklEICwgbm9uX3dzaV9jb21wbGlhbmNlKTsKLQl3c2lXYXJuaW5nXyA9ICJXU0lfQVBfV0FSTklORyI7Ci0Jd3NpRXJyb3JfID0gIldTSV9BUF9FUlJPUiI7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UgKCkKLXsKLQlTdHJpbmcgcHJvcGVydHkgPSBnZXRWYWx1ZUFzU3RyaW5nKG5vbl93c2lfY29tcGxpYW5jZSk7Ci0JLy8gZGVmYXVsdCB0byBJZ25vcmUgaWYgbm8gaW5pdCBoYXMgYmVlbiBkb25lIGZyb20gaW5pIGZpbGUKLQlpZiAocHJvcGVydHkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5lcXVhbHMoIiIpKSB7Ci0JCXNldFZhbHVlKCBub25fd3NpX2NvbXBsaWFuY2UsIElHTk9SRV9OT05fV1NJKTsKLQkJcmV0dXJuIElHTk9SRV9OT05fV1NJOwotCX0KLQllbHNlCi0JCXJldHVybiBwcm9wZXJ0eTsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjdiZDM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotCi0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRXU0lDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9QX05PTl9XU0kgPSAiMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTl9OT05fV1NJID0gIjEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9OT05fV1NJID0gIjIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTExPV19XU0lfUFJFRkVSRU5DRSA9ICIzIjsKLQotCXByb3RlY3RlZCBRdWFsaWZpZWROYW1lIG5hbWUgPSBudWxsOyAvLyBzZXQgaW4gc3ViY2xhc3MKLQlwcm90ZWN0ZWQgU3RyaW5nIG5vbl93c2lfY29tcGxpYW5jZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX1dTSV9TU0JQX0NPTVBMSUFOQ0UgPSAibm9uV1NJU1NCUENvbXBsaWFuY2UiOwotCXByb3RlY3RlZCBTdHJpbmcgd3NpV2FybmluZ187IC8vIHNldCBpbiBzdWJjbGFzcwotCXByb3RlY3RlZCBTdHJpbmcgd3NpRXJyb3JfOyAvLyBzZXQgaW4gc3ViY2xhc3MKLQotcHVibGljIFBlcnNpc3RlbnRXU0lDb250ZXh0ICgpIAotewotCXN1cGVyKCAgV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLQkKLS8vICBOT1RFOiAgbmFtZSwgd3NpV2FybmluZ18gYW5kIHdzaUVycm9yXyBzaG91bGQgYmUgc2V0IGluIHRoZSBzdWJjbGFzc2VzLiAgVGhpcyBpcyBwcm92aWRpbmcgZGVmYXVsdGluZyBvbmx5LgotCW5vbl93c2lfY29tcGxpYW5jZSA9IE5PTl9XU0lfU1NCUF9DT01QTElBTkNFOwotCW5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShXU1VJUGx1Z2luLklEICwgbm9uX3dzaV9jb21wbGlhbmNlKTsKLQl3c2lXYXJuaW5nXyA9ICJXU0lfU1NCUF9XQVJOSU5HIjsKLQl3c2lFcnJvcl8gPSAiV1NJX1NTQlBfRVJST1IiOwotfQotCi1wdWJsaWMgdm9pZCBsb2FkKCkgCi17Ci0JLy8gbGV0IHRoZSBkZWZhdWx0IGJlIHJlYWQgZnJvbSBwbHVnaW5fY29zdG9taXphdGlvbi5pbmkgZmlsZQotCS8vIHNldERlZmF1bHQobm9uX3dzaV9jb21wbGlhbmNlLCBXQVJOX05PTl9XU0kpOwotfQotCi0vLyB0byBiZSB1c2VkIG9ubHkgYnkgdGhlIHByZWZlcmVuY2UgcGFnZQotcHVibGljIHZvaWQgdXBkYXRlV1NJQ29tcGxpYW5jZXMgKCBTdHJpbmcgdmFsdWUpCi17Ci0gCQlzZXRWYWx1ZSggbm9uX3dzaV9jb21wbGlhbmNlLCB2YWx1ZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UgKCkKLXsKLQlTdHJpbmcgcHJvcGVydHkgPSBnZXRWYWx1ZUFzU3RyaW5nKG5vbl93c2lfY29tcGxpYW5jZSk7Ci0vLwkgZGVmYXVsdCB0byBJZ25vcmUgaWYgbm8gaW5pdCBoYXMgYmVlbiBkb25lIGZyb20gaW5pIGZpbGUKLQlpZiAocHJvcGVydHkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5lcXVhbHMoIiIpKSB7Ci0JCXNldFZhbHVlKCBub25fd3NpX2NvbXBsaWFuY2UsIElHTk9SRV9OT05fV1NJKTsKLQkJcmV0dXJuIElHTk9SRV9OT05fV1NJOwotCX0KLQllbHNlCi0JCXJldHVybiBwcm9wZXJ0eTsKLX0KLQotcHVibGljIGJvb2xlYW4gU3RvcE5vbldTSUNvbXBsaWFuY2VzKCkKLXsKLQkgcmV0dXJuIFNUT1BfTk9OX1dTSS5lcXVhbHMoZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UoKSk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIFdhcm5Ob25XU0lDb21wbGlhbmNlcygpCi17Ci0JIHJldHVybiBXQVJOX05PTl9XU0kuZXF1YWxzKGdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlKCkpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBJZ25vcmVOb25XU0lDb21wbGlhbmNlcygpCi17Ci0JIHJldHVybiBJR05PUkVfTk9OX1dTSS5lcXVhbHMoZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UoKSk7Ci19Ci0KLS8vIHRvIGJlIHVzZWQgb25seSBieSB0aGUgcHJvcGVydHkgcGFnZQotcHVibGljIHZvaWQgdXBkYXRlUHJvamVjdFdTSUNvbXBsaWFuY2VzICggSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbHVlKQotewotICAgIHRyeSB7Ci0JCXByb2plY3Quc2V0UGVyc2lzdGVudFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeyAKLSAgICAJU3lzdGVtLm91dC5wcmludGxuKCJObyBzdWNoIFByb2plY3QiKTsKLSAgICAJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0gICAgCWxvZy5sb2coTG9nLklORk8sIDUwODQsIHRoaXMsICJ1cGRhdGVQcm9qZWN0V1NJQ29tcGxpYW5jZXMiLCAiTm8gc3VjaCBQcm9qZWN0ICIrcHJvamVjdCk7Ci0gICAgfQotfQotCi1wdWJsaWMgYm9vbGVhbiBwcm9qZWN0U3RvcE5vbldTSUNvbXBsaWFuY2VzKElQcm9qZWN0IHByb2plY3QpCi17Ci0gCXJldHVybiBTVE9QX05PTl9XU0kuZXF1YWxzKGdldFByb2plY3RQZXJzaXN0ZW50UHJvcGVydHkocHJvamVjdCkpOyAgICAKLX0KLQotcHVibGljIGJvb2xlYW4gcHJvamVjdFdhcm5Ob25XU0lDb21wbGlhbmNlcyhJUHJvamVjdCBwcm9qZWN0KQotewotIAlyZXR1cm4gV0FSTl9OT05fV1NJLmVxdWFscyhnZXRQcm9qZWN0UGVyc2lzdGVudFByb3BlcnR5KHByb2plY3QpKTsgICAgCi19Ci0KLXB1YmxpYyBib29sZWFuIHByb2plY3RJZ25vcmVOb25XU0lDb21wbGlhbmNlcyhJUHJvamVjdCBwcm9qZWN0KQotewotIAlyZXR1cm4gSUdOT1JFX05PTl9XU0kuZXF1YWxzKGdldFByb2plY3RQZXJzaXN0ZW50UHJvcGVydHkocHJvamVjdCkpOyAgICAKLX0KLQotCi0vLyB0byBiZSB1c2VkIG9ubHkgYnkgdGhlIHByb3BlcnR5IHBhZ2UKLXB1YmxpYyBib29sZWFuIHByb2plY3RGb2xsb3dXU0lQcmVmZXJhbmNlKElQcm9qZWN0IHByb2plY3QpCi17Ci0gICAgdHJ5IHsKLSAJU3RyaW5nIHByb3BlcnR5ID0gcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkobmFtZSk7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eSA9PSBudWxsIHx8IHByb3BlcnR5LmVxdWFscygiIikgfHwgcHJvcGVydHkuZXF1YWxzKEZPTExPV19XU0lfUFJFRkVSRU5DRSkpOwotICAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgICAgIHsKLSAgICAJcmV0dXJuIHRydWU7Ci0gICAgIH0gICAgIAotfQotCi1wcml2YXRlIFN0cmluZyBnZXRQcm9qZWN0UGVyc2lzdGVudFByb3BlcnR5KElQcm9qZWN0IHByb2plY3QpCi17Ci0JU3RyaW5nIHByb3BlcnR5ID0gZ2V0UHJvamVjdFdTSUNvbXBsaWFuY2UocHJvamVjdCk7Ci0JaWYgKHByb3BlcnR5LmVxdWFscyhGT0xMT1dfV1NJX1BSRUZFUkVOQ0UpKSB7Ci0JCXByb3BlcnR5ID0gZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UoKTsKLQl9Ci0JcmV0dXJuIHByb3BlcnR5OwotIH0KLQotcHVibGljIFN0cmluZyBnZXRQcm9qZWN0V1NJQ29tcGxpYW5jZShJUHJvamVjdCBwcm9qZWN0KQotewotICB0cnkgewotICAgICAJU3RyaW5nIHByb3BlcnR5ID0gcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkobmFtZSk7Ci0gICAgIAlpZiAocHJvcGVydHkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5lcXVhbHMoIiIpKQotICAgICAJewotICAgICAJCXByb3BlcnR5ID0gRk9MTE9XX1dTSV9QUkVGRVJFTkNFOwotICAgICAJfQotICAgICAJcmV0dXJuIHByb3BlcnR5OwotICAgICB9Ci0gICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpICAgICB7Ci0gICAgCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gc3VjaCBQcm9qZWN0Iik7Ci0gICAgCXJldHVybiBnZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSgpOwotICAgICB9ICAgICAKLX0KLQotcHVibGljIFN0cmluZyBnZXRXYXJuaW5nKCkKLXsKLQlyZXR1cm4gd3NpV2FybmluZ187Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKQotewotCXJldHVybiB3c2lFcnJvcl87Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lTU0JQQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYjQzMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV1NVSVBsdWdpbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50V1NJQ29udGV4dAotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fV1NJX1NTQlBfQ09NUExJQU5DRSA9ICJub25XU0lTU0JQQ29tcGxpYW5jZSI7Ci0KLXB1YmxpYyBQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQgKCkgCi17Ci0Jc3VwZXIoKTsKLQlub25fd3NpX2NvbXBsaWFuY2UgPSBOT05fV1NJX1NTQlBfQ09NUExJQU5DRTsKLQluYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoV1NVSVBsdWdpbi5JRCAsIG5vbl93c2lfY29tcGxpYW5jZSk7Ci0Jd3NpV2FybmluZ18gPSAiV1NJX1NTQlBfV0FSTklORyI7Ci0Jd3NpRXJyb3JfID0gIldTSV9TU0JQX0VSUk9SIjsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvV1NJQ29tcGxpYW5jZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9XU0lDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExMjAxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9XU0lDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgV1NJQ29tcGxpYW5jZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyCi0KLXsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCSAgCi0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwMSBmb3IgdGhlIFdTLUkgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1BBR0UgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwMCI7Ci0gIC8vCi0KLSAgcHJpdmF0ZSBMYWJlbCB3c2lfc3NicF9MYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gd3NpX3NzYnBfVHlwZXNfOwotICAKLSAgLypDT05URVhUX0lEIFBXU0kwMDAxIGZvciB0aGUgc3RvcCBXUy1JIFNTQlAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1NTQlBfQ09NQk9fU1RPUF9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDEiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDIgZm9yIHRoZSB3YXJuIFdTLUkgU1NCUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19XQVJOX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwMiI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwMyBmb3IgdGhlIGlnbm9yZSBXUy1JIFNTQlAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1NTQlBfQ09NQk9fSUdOT1JFX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwMyI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwNCBmb3IgdGhlIFdTLUkgU1NCUCB0eXBlIGNvbWJvIGJveCBvbiB0aGUgV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19UWVBFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDQiOwotICAKLSAgcHJpdmF0ZSBMYWJlbCB3c2lfYXBfTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHdzaV9hcF9UeXBlc187Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDUgZm9yIHRoZSBzdG9wIFdTLUkgQVAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX0FQX0NPTUJPX1NUT1BfTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA1IjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDA2IGZvciB0aGUgd2FybiBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9BUF9DT01CT19XQVJOX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwNiI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwNyBmb3IgdGhlIGlnbm9yZSBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9BUF9DT01CT19JR05PUkVfTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA3IjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDA4IGZvciB0aGUgV1MtSSBBUCB0eXBlIGNvbWJvIGJveCBvbiB0aGUgV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfQVBfQ09NQk9fVFlQRSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA4IjsKLSAgICAKLSAgcHJpdmF0ZSBpbnQgc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsKLQotCi0gLyoqCi0gICAqIENyZWF0ZXMgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIG9uIGRlbWFuZC4KLSAgICogICBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IGZvciB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgc3VwZXJwYXJlbnQpCi0gIHsKLSAgCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS53c3Qud3MudWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0gICAgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQotICAgIENvbXBvc2l0ZSAgIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoIHN1cGVycGFyZW50LCBTV1QuTk9ORSApOwkKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIHBhcmVudC5zZXRMYXlvdXQoIGxheW91dCApOwotICAgIHBhcmVudC5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXU0lfUEFHRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LElORk9QT1BfUFdTSV9QQUdFKTsKLQotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotCi0gICAgQ29tcG9zaXRlIHdzaV9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB3c2lfQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgd3NpX0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgCi0gICAgd3NpX2FwX0xhYmVsXyA9IG5ldyBMYWJlbCh3c2lfQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgd3NpX2FwX0xhYmVsXy5zZXRUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9XU0lfQVAiKSk7Ci0gICAgd3NpX2FwX0xhYmVsXy5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1NJX0FQX0xBQkVMIikpOwotICAgIHdzaV9hcF9UeXBlc18gPSBuZXcgQ29tYm8od3NpX0NvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHdzaV9hcF9UeXBlc18uc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIHdzaV9hcF9UeXBlc18uc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdTSV9BUF9DT01CTyIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAod3NpX2FwX1R5cGVzXyxJTkZPUE9QX1BXU0lfQVBfQ09NQk9fVFlQRSk7Ci0gICAgCi0gICAgd3NpX2FwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlNUT1BfTk9OX1dTSSIpKTsKLSAgICB3c2lfYXBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiV0FSTl9OT05fV1NJIikpOwotICAgIHdzaV9hcF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfTk9OX1dTSSIpKTsKLSAgICAKLSAgICB3c2lfYXBfVHlwZXNfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIHdzaV9zc2JwX0xhYmVsXyA9IG5ldyBMYWJlbCh3c2lfQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgd3NpX3NzYnBfTGFiZWxfLnNldFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX1dTSV9TU0JQIikpOwotICAgIHdzaV9zc2JwX0xhYmVsXy5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1NJX1NTQlBfTEFCRUwiKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfID0gbmV3IENvbWJvKHdzaV9Db21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICB3c2lfc3NicF9UeXBlc18uc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIHdzaV9zc2JwX1R5cGVzXy5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1NJX1NTQlBfQ09NQk8iKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHdzaV9zc2JwX1R5cGVzXyxJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19UWVBFKTsKLSAgICAKLSAgICB3c2lfc3NicF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJTVE9QX05PTl9XU0kiKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiV0FSTl9OT05fV1NJIikpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9OT05fV1NJIikpOwotICAKLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVycGFyZW50KTsgICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIHByaXZhdGUgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCApCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuUkFESU8gKTsKLSAgICBidXR0b24uc2V0VGV4dCggdGV4dCApOwotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICAvKioKLSAgICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICBpbml0aWFsaXplRGVmYXVsdHMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotICB7Ci0gICAgc3RvcmVWYWx1ZXMoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpCi0gIHsKLSAgICBwZXJmb3JtT2soKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgICB7IH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyB1c2luZyBkZWZhdWx0IHZhbHVlcwotICAgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKQotICB7Ci0gICAgLy8gZm9yY2UgV1NJIGNvbXBsaWFuY2UgYnkgZGVmYXVsdAotICAgIAotICAgIHdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qod3NpX3NzYnBfVHlwZXNfLmluZGV4T2YobXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9OT05fV1NJIikpKTsKLSAgICBpbnQgYXBTZWxlY3Rpb24gPSB3c2lfYXBfVHlwZXNfLmluZGV4T2YobXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9OT05fV1NJIikpOwotICAgIHdzaV9hcF9UeXBlc18uc2VsZWN0KGFwU2VsZWN0aW9uKTsKLSAgICBzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOyAgLy8gZG8gbm90IHJlc3RvcmUgc2F2ZWQgU1NCUCBzZXR0aW5nCi0gICAgcHJvY2Vzc0FQU2VsZWN0aW9uKGFwU2VsZWN0aW9uKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkKLSAgewotICAgIAotCVN0cmluZyBXU0lUZXh0ID0gZ2V0V1NJU2VsZWN0aW9uKFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lTU0JQQ29udGV4dCgpKTsKLSAgICB3c2lfc3NicF9UeXBlc18uc2VsZWN0KHdzaV9zc2JwX1R5cGVzXy5pbmRleE9mKFdTSVRleHQpKTsKLSAgICAKLSAgICBpbnQgYXBTZWxlY3Rpb24gPSB3c2lfYXBfVHlwZXNfLmluZGV4T2YoZ2V0V1NJU2VsZWN0aW9uKFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lBUENvbnRleHQoKSkpOwotICAgIHdzaV9hcF9UeXBlc18uc2VsZWN0KGFwU2VsZWN0aW9uKTsKLSAgICBzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOyAgLy8gZG8gbm90IHJlc3RvcmUgc2F2ZWQgU1NCUCBzZXR0aW5nCi0gICAgcHJvY2Vzc0FQU2VsZWN0aW9uKGFwU2VsZWN0aW9uKTsKLSAgIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRXU0lTZWxlY3Rpb24oUGVyc2lzdGVudFdTSUNvbnRleHQgY29udGV4dCkKLSAgewotICAgIAotICAgIFN0cmluZyBXU0l2YWx1ZSA9IGNvbnRleHQuZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UoKTsKLSAgICBTdHJpbmcgV1NJVGV4dCA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJXQVJOX05PTl9XU0kiKTsKLSAgICBpZiAoUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJLmVxdWFscyhXU0l2YWx1ZSkpIHsKLQkJV1NJVGV4dCA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJTVE9QX05PTl9XU0kiKTsKLQl9IGVsc2UgaWYgKFBlcnNpc3RlbnRXU0lDb250ZXh0LklHTk9SRV9OT05fV1NJLmVxdWFscyhXU0l2YWx1ZSkpIHsKLQkJV1NJVGV4dCA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfTk9OX1dTSSIpOwotCX0KLQlyZXR1cm4gV1NJVGV4dDsKLSAgfQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gIAl1cGRhdGVXU0lDb250ZXh0KHdzaV9zc2JwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpLCBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJU1NCUENvbnRleHQoKSk7Ci0gIAl1cGRhdGVXU0lDb250ZXh0KHdzaV9hcF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKSwgV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSUFQQ29udGV4dCgpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdTSUNvbnRleHQoaW50IHNlbGVjdGlvbkluZGV4LCBQZXJzaXN0ZW50V1NJQ29udGV4dCBjb250ZXh0KQotICB7Ci0gICAgLy8gZ2V0IHRoZSBwZXJzaXN0ZW50IGNvbnRleHQgZnJvbSB0aGUgcGx1Z2luCi0gICAgCi0gICAgU3RyaW5nIHZhbHVlPW51bGw7Ci0gICAgc3dpdGNoIChzZWxlY3Rpb25JbmRleCkgewotICAgIAljYXNlIDA6Ci0gICAgCQl2YWx1ZSA9IFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSTsKLSAgICAJCWJyZWFrOwotICAgIAljYXNlIDE6Ci0gICAgCQl2YWx1ZSA9IFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSTsKLSAgICAJCWJyZWFrOwotICAgIAljYXNlIDI6Ci0gICAgCQl2YWx1ZSA9IFBlcnNpc3RlbnRXU0lDb250ZXh0LklHTk9SRV9OT05fV1NJOwkJCi0gICAgCQlicmVhazsKLSAgICB9Ci0gICAgY29udGV4dC51cGRhdGVXU0lDb21wbGlhbmNlcyh2YWx1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgCQotICAJcHJvY2Vzc0FQU2VsZWN0aW9uKCB3c2lfYXBfVHlwZXNfLmdldFNlbGVjdGlvbkluZGV4KCkgKTsKLSAgCQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9jZXNzQVBTZWxlY3Rpb24oaW50IHNlbGVjdGlvbikgewotICAJaWYgKHNlbGVjdGlvbiA9PSAyKSB7IC8vIHJlc2V0IFNTQlAgdG8gZGVmYXVsdCBpZiBBUCBpcyBpZ25vcmUKLSAgCQl3c2lfc3NicF9UeXBlc18uc2V0RW5hYmxlZCh0cnVlKTsKLSAgCQlpZiAoc2F2ZWRTU0JQU2V0dGluZ18gIT0gLTEpICB7Ci0gIAkJCS8vIHJlc3RvcmUgc2F2ZWQgU1NCUCBzZXR0aW5nLCBpZiBhbnkKLSAgCQkJd3NpX3NzYnBfVHlwZXNfLnNlbGVjdChzYXZlZFNTQlBTZXR0aW5nXyk7Ci0gIAkJCXNhdmVkU1NCUFNldHRpbmdfID0gLTE7Ci0gIAkJfQotICAJfSBlbHNlIHsgLy8gc2V0IFNTQlAgdG8gZm9sbG93IEFQIHNldHRpbmcgaWYgU1RPUCBvciBXQVJOIGNob3NlbgotICAJCWlmIChzYXZlZFNTQlBTZXR0aW5nXyA9PSAtMSkgIHsgIC8vIFNTQlAgc2V0dGluZyBub3Qgc2F2ZWQKLSAgCQkJc2F2ZWRTU0JQU2V0dGluZ18gPSB3c2lfc3NicF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgCQl9Ci0gIAkJd3NpX3NzYnBfVHlwZXNfLnNlbGVjdChzZWxlY3Rpb24pOwotICAJCXdzaV9zc2JwX1R5cGVzXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgCQkKLSAgCX0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCi0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9XU0lDb21wbGlhbmNlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1dTSUNvbXBsaWFuY2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTZkYzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1dTSUNvbXBsaWFuY2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci0KLQotcHVibGljIGNsYXNzIFdTSUNvbXBsaWFuY2VVdGlscwotewotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElHTk9SRV9JRCA9MDsKLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJR05PUkVfQUxMX0lEID0xOwotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9JRCA9MjsKLQotcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0V1NJU2V2ZXJpdHkgKElQcm9qZWN0IHByb2plY3QsIFBlcnNpc3RlbnRXU0lDb250ZXh0IGNvbnRleHQpIGluc3RlYWQKLSAqIEBwYXJhbSBwcm9qZWN0Ci0gKiBAcmV0dXJuIGludAotICovCi1wdWJsaWMgc3RhdGljIGludCBnZXRXU0lTZXZlcml0eSAoSVByb2plY3QgcHJvamVjdCkKLXsKLQlyZXR1cm4gZ2V0V1NJU2V2ZXJpdHkgKHByb2plY3QsIFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lTU0JQQ29udGV4dCgpKTsKLX0KLS8qKgotICogQHBhcmFtIHByb2plY3QKLSAqIEBwYXJhbSBjb250ZXh0Ci0gKiBAcmV0dXJuCi0gKi8KLXB1YmxpYyBzdGF0aWMgaW50IGdldFdTSVNldmVyaXR5IChJUHJvamVjdCBwcm9qZWN0LCBQZXJzaXN0ZW50V1NJQ29udGV4dCBjb250ZXh0KQotewotCWlmIChjb250ZXh0LnByb2plY3RTdG9wTm9uV1NJQ29tcGxpYW5jZXMocHJvamVjdCkpCi0JCXJldHVybiBTdGF0dXMuRVJST1I7Ci0JZWxzZSBpZiAoY29udGV4dC5wcm9qZWN0V2Fybk5vbldTSUNvbXBsaWFuY2VzKHByb2plY3QpKQotCQlyZXR1cm4gU3RhdHVzLldBUk5JTkc7Ci0JZWxzZQotCQlyZXR1cm4gU3RhdHVzLklORk87Ci19Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIGNoZWNrV1NJQ29tcGxpYW5jZSAoIFN0YXR1c0hhbmRsZXIgbW9uaXRvciwgU3RhdHVzW10gc3RhdHVzLCBJUHJvamVjdCBwcm9qZWN0LCBQZXJzaXN0ZW50V1NJQ29udGV4dCBjb250ZXh0KSBpbnN0ZWFkCi0gKiBAcGFyYW0gbW9uaXRvciBTdGF0dXNIYW5kbGVyCi0gKiBAcGFyYW0gc3RhdHVzIFN0YXR1c1tdCi0gKiBAcGFyYW0gcHJvamVjdCBJUHJvamVjdAotICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdG8gY29udGludWUKLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrV1NJQ29tcGxpYW5jZSAoIFN0YXR1c0hhbmRsZXIgbW9uaXRvciwgU3RhdHVzW10gc3RhdHVzLCBJUHJvamVjdCBwcm9qZWN0KQotewkvLyBjaGVjayBmb3IgU1NCUCBieSBkZWZhdWx0Ci0JcmV0dXJuIGNoZWNrV1NJQ29tcGxpYW5jZSAoIG1vbml0b3IsIHN0YXR1cywgcHJvamVjdCwgV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSVNTQlBDb250ZXh0KCkpOwotfQotLyoqCi0gKiBAcGFyYW0gbW9uaXRvciBTdGF0dXNIYW5kbGVyCi0gKiBAcGFyYW0gc3RhdHVzIFN0YXR1c1tdCi0gKiBAcGFyYW0gcHJvamVjdCBJUHJvamVjdAotICogQHBhcmFtIGNvbnRleHQgUGVyc2lzdGVudFdTSUNvbnRleHQKLSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRvIGNvbnRpbnVlCi0gKi8KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1dTSUNvbXBsaWFuY2UgKCBTdGF0dXNIYW5kbGVyIG1vbml0b3IsIFN0YXR1c1tdIHN0YXR1cywgSVByb2plY3QgcHJvamVjdCwgUGVyc2lzdGVudFdTSUNvbnRleHQgY29udGV4dCkKLXsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2Uud3N0LndzLnVpIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkpOyAKLQkKLSAgCWlmIChjb250ZXh0LnByb2plY3RTdG9wTm9uV1NJQ29tcGxpYW5jZXMocHJvamVjdCkpCi0gIAkJewotICAJCQkvLyBlbWl0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybiBmYWxzZQotICAJCQlTaW1wbGVTdGF0dXMgc3RhdHVzXyA9IG5ldyBTaW1wbGVTdGF0dXMoV1NVSVBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoY29udGV4dC5nZXRFcnJvcigpKSwgU3RhdHVzLkVSUk9SKTsKLSAgCQkJLy8gYWRkaW5nIGFsbCBtZXNzYWdlcyBmcm9tIFdTSSBJbmNvbXBsaWFuY2VzCi0gIAkJCWZvciAoaW50IGkgPSAwOyBpPCBzdGF0dXMubGVuZ3RoOyBpKyspCi0JICAJCQlzdGF0dXNfLmFkZENoaWxkKHN0YXR1c1tpXSk7IAkJCQotCQkJbW9uaXRvci5yZXBvcnRFcnJvcihzdGF0dXNfKTsKLSAgCQkJcmV0dXJuIGZhbHNlOwotICAJCX0KLSAgCWVsc2UgaWYgKGNvbnRleHQucHJvamVjdFdhcm5Ob25XU0lDb21wbGlhbmNlcyhwcm9qZWN0KSkKLSAgCQl7Ci0gIAkJCS8vIGdpdmUgYSB3YXJuaW5nIG1lc3NhZ2Ugd2l0aCB0aGUgb3B0aW9ucyB0byBzdG9wLCBpZ25vcmUgdGhpcyBvbmUsIG9yIGlnbm9yZSBhbGwgY29taW5nIG1lc3NhZ2VzCi0gIAkJCVNpbXBsZVN0YXR1cyBzdGF0dXNfID0gbmV3IFNpbXBsZVN0YXR1cyhXU1VJUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZShjb250ZXh0LmdldFdhcm5pbmcoKSksIFN0YXR1cy5XQVJOSU5HKTsKLSAgCQkJLy8gYWRkaW5nIGFsbCBtZXNzYWdlcyBmcm9tIFdTSSBJbmNvbXBsaWFuY2VzCi0gIAkJCWZvciAoaW50IGkgPSAwOyBpPCBzdGF0dXMubGVuZ3RoOyBpKyspCi0JICAJCQlzdGF0dXNfLmFkZENoaWxkKHN0YXR1c1tpXSk7Ci0KLSAgCQkJQ2hvaWNlIGlnbm9yZUNob2ljZSA9IG5ldyBDaG9pY2UoJ0knLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX0xBQkVMIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfREVTQ1JJUFRJT04iKSk7Ci0gIAkJCUNob2ljZSBpZ25vcmVBbGxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdBJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9BTExfTEFCRUwiKSwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9BTExfREVTQ1JJUFRJT04iKSk7Ci0gIAkJCUNob2ljZSBjYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkNBTkNFTF9MQUJFTCIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiQ0FOQ0VMX0RFU0NSSVBUSU9OIikpOwotICAJCQlDaG9pY2UgcmVzdWx0ID0gbW9uaXRvci5yZXBvcnQoc3RhdHVzXywgbmV3IENob2ljZVtde2lnbm9yZUNob2ljZSwgaWdub3JlQWxsQ2hvaWNlLCBjYW5jZWxDaG9pY2V9KTsKLSAgCQkJCi0gIAkJCS8vIGlmIHRoZSB1c2VyIGNsb3NlcyB0aGUgbWVzc2FnZSBib3ggb3Igc2VsZWN0cyBpZ25vcmUgY29udGludWUKLSAgCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoaWdub3JlQ2hvaWNlLmdldExhYmVsKCkpKSkKLSAgICAgICAgCQkJcmV0dXJuIHRydWU7Ci0gIAkJCS8vIGlmIHRoZSB1c2VyIHNlbGVjdHMgaWdub3JlIGFsbCwgY2hhbmdlIHRoZSBwcmVmZXJlbmNlCi0JICAgICAgICBlbHNlICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKGlnbm9yZUFsbENob2ljZS5nZXRMYWJlbCgpKSkKLQkgICAgICAgIAl7Ci0JICAgICAgICAJCWNvbnRleHQudXBkYXRlUHJvamVjdFdTSUNvbXBsaWFuY2VzKHByb2plY3QsIFBlcnNpc3RlbnRXU0lDb250ZXh0LklHTk9SRV9OT05fV1NJKTsKLQkgICAgICAgIAkJcmV0dXJuIHRydWU7Ci0JICAgICAgICAJfQotCQkJLy8gaWYgdGhlIHVzZXIgc2VsZWN0cyB0byBjYW5jZWwgLCBkbyBub3QgY29udGludWUgd2l0aCB0aGUgY29tbWFuZAotICAgICAgICAJZWxzZSBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKGNhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLSAgCQl9Ci0gIHJldHVybiB0cnVlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3Byb3BlcnRpZXMvV1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJvcGVydGllcy9XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYjgzM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJvcGVydGllcy9XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgV1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JICAKLSAgLypDT05URVhUX0lEIFBXU0kwMDAxIGZvciB0aGUgV1MtSSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfUEFHRSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDAwIjsKLSAgLy8KLQotICBwcml2YXRlIExhYmVsIHdzaV9zc2JwX0xhYmVsXzsKLSAgcHJpdmF0ZSBDb21ibyB3c2lfc3NicF9UeXBlc187Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDEgZm9yIHRoZSBzdG9wIFdTLUkgU1NCUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19TVE9QX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwMSI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwMiBmb3IgdGhlIHdhcm4gV1MtSSBTU0JQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9TU0JQX0NPTUJPX1dBUk5fTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDAyIjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDAzIGZvciB0aGUgaWdub3JlIFdTLUkgU1NCUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19JR05PUkVfTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDAzIjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDA0IGZvciB0aGUgV1MtSSBTU0JQIHR5cGUgY29tYm8gYm94IG9uIHRoZSBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9TU0JQX0NPTUJPX1RZUEUgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwNCI7Ci0gIAotICBwcml2YXRlIExhYmVsIHdzaV9hcF9MYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gd3NpX2FwX1R5cGVzXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwNSBmb3IgdGhlIHN0b3AgV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfQVBfQ09NQk9fU1RPUF9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDUiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDYgZm9yIHRoZSB3YXJuIFdTLUkgQVAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX0FQX0NPTUJPX1dBUk5fTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA2IjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDA3IGZvciB0aGUgaWdub3JlIFdTLUkgQVAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX0FQX0NPTUJPX0lHTk9SRV9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDciOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDggZm9yIHRoZSBXUy1JIEFQIHR5cGUgY29tYm8gYm94IG9uIHRoZSBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9BUF9DT01CT19UWVBFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDgiOwotICAKLSAgLypDT05URVhUX0lEIFBXU0kwMDA5IGZvciB0aGUgV1MtSSBmb2xsb3cgcHJlZmVyZW5jZSByYWRpbyBidXR0b24gdGhlIFdTLUkgU1NCUCBjb21wbGlhbmNlIHByb2plY3QgcHJvcGVydHkgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BQX1BXU0lfUkFESU9fRk9MTE9XX1dTSV9TU0JQX1BSRUZFUkVOQ0UgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwOSI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAxMCBmb3IgdGhlIFdTLUkgZm9sbG93IHByZWZlcmVuY2UgcmFkaW8gYnV0dG9uIHRoZSBXUy1JIEFQIGNvbXBsaWFuY2UgcHJvamVjdCBwcm9wZXJ0eSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUFBfUFdTSV9SQURJT19GT0xMT1dfV1NJX0FQX1BSRUZFUkVOQ0UgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAxMCI7Ci0KLSAgcHJpdmF0ZSBpbnQgc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsKLSAgCi0gLyoqCi0gICAqIENyZWF0ZXMgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIG9uIGRlbWFuZC4KLSAgICogICBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IGZvciB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgc3VwZXJwYXJlbnQpCi0gIHsKLSAgCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS53c3Qud3MudWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JCi0gICAgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAgIAotICAgIENvbXBvc2l0ZSAgIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoIHN1cGVycGFyZW50LCBTV1QuTk9ORSApOwkKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIHBhcmVudC5zZXRMYXlvdXQoIGxheW91dCApOwotICAgIHBhcmVudC5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXU0lfUEFHRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LCBJTkZPUE9QX1BXU0lfUEFHRSk7Ci0KLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLQotICAgIENvbXBvc2l0ZSB3c2lfQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgd3NpX0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIHdzaV9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgICAgICAKLSAgICB3c2lfYXBfTGFiZWxfID0gbmV3IExhYmVsKHdzaV9Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICB3c2lfYXBfTGFiZWxfLnNldFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX1dTSV9BUCIpKTsKLSAgICB3c2lfYXBfTGFiZWxfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXU0lfQVBfTEFCRUwiKSk7Ci0gICAgd3NpX2FwX1R5cGVzXyA9IG5ldyBDb21ibyh3c2lfQ29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1NJX0FQX0NPTUJPIikpOwotICAgIHdzaV9hcF9UeXBlc18uc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh3c2lfYXBfVHlwZXNfLElORk9QT1BfUFdTSV9BUF9DT01CT19UWVBFKTsKLSAgICAKLSAgICB3c2lfYXBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiU1RPUF9OT05fV1NJIikpOwotICAgIHdzaV9hcF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJXQVJOX05PTl9XU0kiKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9OT05fV1NJIikpOwotICAgIHdzaV9hcF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJGT0xMT1dfV1NJX1BSRUZFUkVOQ0UiKSk7Ci0KLSAgICB3c2lfYXBfVHlwZXNfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIHdzaV9zc2JwX0xhYmVsXyA9IG5ldyBMYWJlbCh3c2lfQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgd3NpX3NzYnBfTGFiZWxfLnNldFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX1dTSV9TU0JQIikpOwotICAgIHdzaV9zc2JwX0xhYmVsXy5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1NJX1NTQlBfTEFCRUwiKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfID0gbmV3IENvbWJvKHdzaV9Db21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICB3c2lfc3NicF9UeXBlc18uc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdTSV9TU0JQX0NPTUJPIikpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHdzaV9zc2JwX1R5cGVzXyxJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19UWVBFKTsKLSAgICAKLSAgICB3c2lfc3NicF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJTVE9QX05PTl9XU0kiKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiV0FSTl9OT05fV1NJIikpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9OT05fV1NJIikpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkZPTExPV19XU0lfUFJFRkVSRU5DRSIpKTsKLQotICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJwYXJlbnQpOyAgICAKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0gCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgCi0gIHsKLSAgCQlyZXR1cm4gV1NVSVBsdWdpbi5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbiggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQgKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPICk7Ci0gICAgYnV0dG9uLnNldFRleHQoIHRleHQgKTsKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgLyoqCi0gICAqIERvZXMgYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotICB7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0gIH0KLQotICAvKioKLSAgICogRG8gYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLSAgewotICAgIHN0b3JlVmFsdWVzKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotICB7Ci0gICAgcGVyZm9ybU9rKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBJV29ya2JlbmNoUHJvcGVydHlQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgIHsgCi0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyB1c2luZyBkZWZhdWx0IHZhbHVlcwotICAgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKQotICB7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLnNlbGVjdCh3c2lfc3NicF9UeXBlc18uaW5kZXhPZihtc2dVdGlsc18uZ2V0TWVzc2FnZSgiRk9MTE9XX1dTSV9QUkVGRVJFTkNFIikpKTsKLSAgICBpbnQgYXBTZWxlY3Rpb24gPSB3c2lfYXBfVHlwZXNfLmluZGV4T2YobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkZPTExPV19XU0lfUFJFRkVSRU5DRSIpKTsKLSAgICB3c2lfYXBfVHlwZXNfLnNlbGVjdChhcFNlbGVjdGlvbik7Ci0gICAgc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsgIC8vIGRvIG5vdCByZXN0b3JlIHNhdmVkIFNTQlAgc2V0dGluZwotICAgIHByb2Nlc3NBUFNlbGVjdGlvbihhcFNlbGVjdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0gIAlTdHJpbmcgV1NJVGV4dCA9IGdldFdTSVNlbGVjdGlvbihXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJU1NCUENvbnRleHQoKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLnNlbGVjdCh3c2lfc3NicF9UeXBlc18uaW5kZXhPZihXU0lUZXh0KSk7Ci0gICAgCi0gICAgaW50IGFwU2VsZWN0aW9uID0gd3NpX2FwX1R5cGVzXy5pbmRleE9mKGdldFdTSVNlbGVjdGlvbihXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJQVBDb250ZXh0KCkpKTsKLSAgICB3c2lfYXBfVHlwZXNfLnNlbGVjdChhcFNlbGVjdGlvbik7Ci0gICAgc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsgIC8vIGRvIG5vdCByZXN0b3JlIHNhdmVkIFNTQlAgc2V0dGluZwotICAgIHByb2Nlc3NBUFNlbGVjdGlvbihhcFNlbGVjdGlvbik7Ci0JfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFdTSVNlbGVjdGlvbihQZXJzaXN0ZW50V1NJQ29udGV4dCBjb250ZXh0KQotICB7Ci0gICAgCi0gIAlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRFbGVtZW50KCk7Ci0gIAlTdHJpbmcgV1NJdmFsdWUgPSBjb250ZXh0LmdldFByb2plY3RXU0lDb21wbGlhbmNlKHByb2plY3QpOwotCVN0cmluZyBXU0lUZXh0ID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkZPTExPV19XU0lfUFJFRkVSRU5DRSIpOwotCWlmIChQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kuZXF1YWxzKFdTSXZhbHVlKSkgewotCQlXU0lUZXh0ID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIlNUT1BfTk9OX1dTSSIpOwotCX0gZWxzZSBpZiAoUGVyc2lzdGVudFdTSUNvbnRleHQuV0FSTl9OT05fV1NJLmVxdWFscyhXU0l2YWx1ZSkpIHsKLQkJV1NJVGV4dCA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJXQVJOX05PTl9XU0kiKTsKLQl9IGVsc2UgaWYgKFBlcnNpc3RlbnRXU0lDb250ZXh0LklHTk9SRV9OT05fV1NJLmVxdWFscyhXU0l2YWx1ZSkpIHsKLQkJV1NJVGV4dCA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfTk9OX1dTSSIpOwotCX0KLQlyZXR1cm4gV1NJVGV4dDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAJdXBkYXRlV1NJQ29udGV4dCh3c2lfc3NicF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKSwgV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSVNTQlBDb250ZXh0KCkpOwotICAJdXBkYXRlV1NJQ29udGV4dCh3c2lfYXBfVHlwZXNfLmdldFNlbGVjdGlvbkluZGV4KCksIFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lBUENvbnRleHQoKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVXU0lDb250ZXh0KGludCBzZWxlY3Rpb25JbmRleCwgUGVyc2lzdGVudFdTSUNvbnRleHQgY29udGV4dCkKLSAgeyAgICAKLSAgCVN0cmluZyB2YWx1ZSA9IFBlcnNpc3RlbnRXU0lDb250ZXh0LkZPTExPV19XU0lfUFJFRkVSRU5DRTsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRFbGVtZW50KCk7Ci0gICAgCi0gICAgc3dpdGNoIChzZWxlY3Rpb25JbmRleCkgewotICAgIAljYXNlIDA6Ci0gICAgCQl2YWx1ZSA9IFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSTsKLSAgICAJCWJyZWFrOwotICAgIAljYXNlIDE6Ci0gICAgCQl2YWx1ZSA9IFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSTsKLSAgICAJCWJyZWFrOwotICAgIAljYXNlIDI6Ci0gICAgCQl2YWx1ZSA9IFBlcnNpc3RlbnRXU0lDb250ZXh0LklHTk9SRV9OT05fV1NJOwkJCi0gICAgCQlicmVhazsKLSAgICAJY2FzZSAzOgotICAgIAkJdmFsdWUgPSBQZXJzaXN0ZW50V1NJQ29udGV4dC5GT0xMT1dfV1NJX1BSRUZFUkVOQ0U7CQkKLSAgICAJCWJyZWFrOwotICAgIH0KLSAgICBjb250ZXh0LnVwZGF0ZVByb2plY3RXU0lDb21wbGlhbmNlcyhwcm9qZWN0LCB2YWx1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgCQotICAJcHJvY2Vzc0FQU2VsZWN0aW9uKCB3c2lfYXBfVHlwZXNfLmdldFNlbGVjdGlvbkluZGV4KCkgKTsKLSAgCQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9jZXNzQVBTZWxlY3Rpb24oaW50IHNlbGVjdGlvbikgewotICAJaWYgKHNlbGVjdGlvbiA9PSAyKSB7IC8vIHJlc2V0IFNTQlAgdG8gZGVmYXVsdCBpZiBBUCBpcyBpZ25vcmUKLSAgCQl3c2lfc3NicF9UeXBlc18uc2V0RW5hYmxlZCh0cnVlKTsKLSAgCQlpZiAoc2F2ZWRTU0JQU2V0dGluZ18gIT0gLTEpICB7Ci0gIAkJCS8vIHJlc3RvcmUgc2F2ZWQgU1NCUCBzZXR0aW5nLCBpZiBhbnkKLSAgCQkJd3NpX3NzYnBfVHlwZXNfLnNlbGVjdChzYXZlZFNTQlBTZXR0aW5nXyk7Ci0gIAkJCXNhdmVkU1NCUFNldHRpbmdfID0gLTE7Ci0gIAkJfQotICAJfSBlbHNlIHsgLy8gc2V0IFNTQlAgdG8gZm9sbG93IEFQIHNldHRpbmcgaWYgU1RPUCBvciBXQVJOIGNob3NlbgotICAJCWlmIChzYXZlZFNTQlBTZXR0aW5nXyA9PSAtMSkgIHsgIC8vIFNTQlAgc2V0dGluZyBub3Qgc2F2ZWQKLSAgCQkJc2F2ZWRTU0JQU2V0dGluZ18gPSB3c2lfc3NicF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgCQl9Ci0gIAkJd3NpX3NzYnBfVHlwZXNfLnNlbGVjdChzZWxlY3Rpb24pOwotICAJCXdzaV9zc2JwX1R5cGVzXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgCQkKLSAgCX0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCi0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy91aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvdWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMzQ3YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy91aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBVSQotUExVR0lOX1ZFTkRPUj1FY2xpcHNlLm9yZwotUExVR0lOX0RFU0M9XAotVGhlIFdlYiBzZXJ2aWNlcyBHVUkgcGx1Z2luIGRlbGl2ZXJzIHRoZSBncmFwaGljYWwgXAotdXNlciBpbnRlcmZhY2UgdG8gdGhlIFdlYiBzZXJ2aWNlcyBmdW5jdGlvbiBpbiB0aGUgV1NUIHN1YnByb2plY3QuCi0KLVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUz1XZWIgU2VydmljZXMKLQotCi0jCi0jICBXUy1JIFByZWZlcmVuY2UgcGFnZXMKLSMKLSMgV1MtSSBDb21wbGlhbmNlIFBhZ2UKLSMKLVBSRUZFUkVOQ0VfQ0FURUdPUllfV1NJPVdTLUkgQ29tcGxpYW5jZQotU1RPUF9OT05fV1NJPVJlcXVpcmUgY29tcGxpYW5jZQotV0FSTl9OT05fV1NJPVN1Z2dlc3QgY29tcGxpYW5jZQotSUdOT1JFX05PTl9XU0k9SWdub3JlIGNvbXBsaWFuY2UKLUZPTExPV19XU0lfUFJFRkVSRU5DRT1Gb2xsb3cgUHJlZmVyZW5jZQotCi1UT09MVElQX1BXU0lfUEFHRT1XZWIgU2VydmljZXMgSW50ZXJvcGVyYWJpbGl0eQotVE9PTFRJUF9QV1NJX1JBRElPX1NUT1BfTk9OX1dTST1TdG9wIGFuZCBwcm9kdWNlIGFuIGVycm9yIG1lc3NhZ2UgaWYgeW91IG1ha2UgYSBjaG9pY2UgdGhhdCBkb2VzIG5vdCBjb21wbHkgd2l0aCBXUy1JLgotVE9PTFRJUF9QV1NJX1JBRElPX1dBUk5JTkdfTk9OX1dTST1Qcm9kdWNlIGEgd2FybmluZyBtZXNzYWdlIGlmIHlvdSBtYWtlIGEgY2hvaWNlIHRoYXQgZG9lcyBub3QgY29tcGx5IHdpdGggV1MtSS4KLVRPT0xUSVBfUFdTSV9SQURJT19JR05PUkVfTk9OX1dTST1TaWxlbnRseSBhbGxvdyBjaG9pY2VzIHRoYXQgZG8gbm90IGNvbXBseSB3aXRoIFdTLUkuCi1UT09MVElQX1BXU0lfUkFESU9fRk9MTE9XX1dTSV9QUkVGRVJFTkNFPVByb2plY3Qgd291bGQgdXNlIFdTLUkgY29tcGxpYW5jZSBsZXZlbCBzZXQgaW4gV29ya3NwYWNlIFByZWZlcmVuY2UuCi0KLUxBQkVMX1dTSV9TU0JQPVdTLUkgU1NCUCBjb21wbGlhbmNlIGxldmVsCi1UT09MVElQX1BXU0lfU1NCUF9MQUJFTD1XUy1JIFNpbXBsZSBTT0FQIEJpbmRpbmcgUHJvZmlsZSBjb21wbGlhbmNlIGxldmVsCi1UT09MVElQX1BXU0lfU1NCUF9DT01CTz1DaG9vc2UgdGhlIFdTLUkgU2ltcGxlIFNPQVAgQmluZGluZyBQcm9maWxlIGNvbXBsaWFuY2UgbGV2ZWwKLQotTEFCRUxfV1NJX0FQPVdTLUkgQVAgY29tcGxpYW5jZSBsZXZlbAotVE9PTFRJUF9QV1NJX0FQX0xBQkVMPVdTLUkgQXR0YWNobWVudCBQcm9maWxlIGNvbXBsaWFuY2UgbGV2ZWwKLVRPT0xUSVBfUFdTSV9BUF9DT01CTz1DaG9vc2UgdGhlIFdTLUkgQXR0YWNobWVudCBQcm9maWxlIGNvbXBsaWFuY2UgbGV2ZWwKLQotCi0jCi0jCVdTLUkgQ29tcGxpYW5jZSBNZXNzYWdlcwotIwotV1NJX1NTQlBfRVJST1I9WW91IGhhdmUgbWFkZSBhIGNob2ljZSB0aGF0IG1heSByZXN1bHQgaW4gYSBXZWIgc2VydmljZSB0aGF0IGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBXUy1JIFNpbXBsZSBTT0FQIEJpbmRpbmcgUHJvZmlsZS4gWW91ciBjdXJyZW50IFdlYiBzZXJ2aWNlcyBwcmVmZXJlbmNlIGlzIHNldCB0byByZXF1aXJlIGNvbXBsaWFuY2Ugd2l0aCBXUy1JIFNTQlAuCi1XU0lfU1NCUF9XQVJOSU5HPVlvdSBoYXZlIG1hZGUgYSBjaG9pY2UgdGhhdCBtYXkgcmVzdWx0IGluIGEgV2ViIHNlcnZpY2UgdGhhdCBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgV1MtSSBTaW1wbGUgU09BUCBCaW5kaW5nIFByb2ZpbGUuIERvIHlvdSB3aXNoIHRvIGlnbm9yZSB0aGlzIHdhcm5pbmcgYW5kIGNvbnRpbnVlPwotV1NJX1NTQlBfSU5DT01QTElBTlRfUlVOVElNRT1UaGUgc2VsZWN0ZWQgV2ViIFNlcnZpY2UgcnVudGltZSBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgV1MtSSBTaW1wbGUgU09BUCBCaW5kaW5nIFByb2ZpbGUuCi1XU0lfQVBfRVJST1I9WW91IGhhdmUgbWFkZSBhIGNob2ljZSB0aGF0IG1heSByZXN1bHQgaW4gYSBXZWIgc2VydmljZSB0aGF0IGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBXUy1JIEF0dGFjaG1lbnQgUHJvZmlsZS4gWW91ciBjdXJyZW50IFdlYiBzZXJ2aWNlcyBwcmVmZXJlbmNlIGlzIHNldCB0byByZXF1aXJlIGNvbXBsaWFuY2Ugd2l0aCBXUy1JIEFQLgotV1NJX0FQX1dBUk5JTkc9WW91IGhhdmUgbWFkZSBhIGNob2ljZSB0aGF0IG1heSByZXN1bHQgaW4gYSBXZWIgc2VydmljZSB0aGF0IGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBXUy1JIEF0dGFjaG1lbnQgUHJvZmlsZS4gRG8geW91IHdpc2ggdG8gaWdub3JlIHRoaXMgd2FybmluZyBhbmQgY29udGludWU/Ci1XU0lfQVBfSU5DT01QTElBTlRfUlVOVElNRT1UaGUgc2VsZWN0ZWQgV2ViIFNlcnZpY2UgcnVudGltZSBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgV1MtSSBBdHRhY2htZW50IFByb2ZpbGUuCi1JR05PUkVfTEFCRUw9SWdub3JlCi1JR05PUkVfREVTQ1JJUFRJT049SWdub3JlIHRoZSBXUy1JIG5vbi1jb21wbGlhbmNlIGFuZCBjb250aW51ZQotSUdOT1JFX0FMTF9MQUJFTD1JZ25vcmUgQWxsCi1JR05PUkVfQUxMX0RFU0NSSVBUSU9OPUFsd2F5cyBpZ25vcmUgdGhlIFdTLUkgbm9uLWNvbXBsaWFuY2UgYW5kIGNvbnRpbnVlCi1DQU5DRUxfTEFCRUw9Q2FuY2VsCi1UQVNLX0xBQkVMX1dTSV9OT05DT01QTElBTlQ9Q2hlY2sgZm9yIFdTSSBDb21wbGlhbmNlCi1UQVNLX0RFU0NfV1NJX05PTkNPTVBMSUFOVD1DaGVjayBmb3IgV1NJIENvbXBsaWFuY2UKLUNBTkNFTF9ERVNDUklQVElPTj1DYW5jZWwKLU5PVF9PSz1DYW5ub3QgY29udGludWUgZHVlIHRvIFdTLUkgbm9uLWNvbXBsaWFuY2UKLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NGYxYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotd3MuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDk0ZTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzUxOGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNvdXJjZS53cy5qYXIgPSBzcmMvCi1vdXRwdXQud3MuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB3cy5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTkxNzYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3MiPgotICAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+Ci0gICA8L2NvbXBvbmVudC1kZXBlbmRzPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS5heGlzIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUuc29hcCIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLndzaWwiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLnVkZGk0aiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTcyZDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SPUlXQUIwMDAxRSBVbmFibGUgdG8gbW9uaXRvciBwb3J0IHswfSBvZiB7MX0uCi0KLSMgQ3VycmVudGx5IGtub3duIHB1YmxpYyBVRERJIHJlZ2lzdHJpZXMKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9JQk09SUJNIFVEREkgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9JQk1fVEVTVD1JQk0gVURESSBUZXN0IFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUPU1pY3Jvc29mdCBVRERJIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUX1RFU1Q9TWljcm9zb2Z0IFVEREkgVGVzdCBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUD1TQVAgVURESSBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUF9URVNUPVNBUCBVRERJIFRlc3QgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9YTUVUSE9EUz1YTWV0aG9kcyBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX05UVENPTU09TlRUIENvbW11bmljYXRpb25zIFJlZ2lzdHJ5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhYTJjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cyIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgbmFtZT0iJVBMVUdJTl9OQU1FIgotICAgcHJvdmlkZXItbmFtZT0iJVBMVUdJTl9QUk9WSURFUiIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuV1NQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUud3NpbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9XU1BsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9XU1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWMwZjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvV1NQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgV1NQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBXU1BsdWdpbiBwbHVnaW47Ci0KLQkvLyBSZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1NQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90Ci0JICogZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBXU1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdAotCSAqIGZvdW5kLiBSZXBsYWNlcyBzdWJzdGl0dXRpb24gdmFyaWFibGVzIGluIHRoZSBtZXNzYWdlIGJ5IG9iamVjdHMgaW4gJ2FyZ3MnLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIGFyZ3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlCi0JCQkJCQkuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Qud3MuV1NQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNDb25uZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY0Nvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4Y2FhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQmFzaWNDb25uZWN0aW9uIGltcGxlbWVudHMgQ29ubmVjdGlvbgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgUmVsIGZSZWw7Ci0gIHByaXZhdGUgRWxlbWVudCBmRWxlbWVudDsKLSAgcHJpdmF0ZSBDb25uZWN0aW9uIGZPcHBvc2luZ0Nvbm5lY3Rpb247Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUQk9VTkQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkJPVU5EID0gMTsKLQotICBwdWJsaWMgc3RhdGljIENvbm5lY3Rpb25bXSBjcmVhdGVQYWlyICggUmVsIG91dGJvdW5kUmVsLCBFbGVtZW50IHRhcmdldEVsZW1lbnQsIFJlbCBpbmJvdW5kUmVsLCBFbGVtZW50IHNvdXJjZUVsZW1lbnQgKQotICB7Ci0gICAgQmFzaWNDb25uZWN0aW9uIG91dGJvdW5kQ29ubmVjdGlvbiA9IG5ldyBCYXNpY0Nvbm5lY3Rpb24ob3V0Ym91bmRSZWwsdGFyZ2V0RWxlbWVudCk7Ci0gICAgQmFzaWNDb25uZWN0aW9uIGluYm91bmRDb25uZWN0aW9uID0gbmV3IEJhc2ljQ29ubmVjdGlvbihpbmJvdW5kUmVsLHNvdXJjZUVsZW1lbnQpOwotICAgIG91dGJvdW5kQ29ubmVjdGlvbi5mT3Bwb3NpbmdDb25uZWN0aW9uID0gaW5ib3VuZENvbm5lY3Rpb247Ci0gICAgaW5ib3VuZENvbm5lY3Rpb24uZk9wcG9zaW5nQ29ubmVjdGlvbiA9IG91dGJvdW5kQ29ubmVjdGlvbjsKLSAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25bXSB7b3V0Ym91bmRDb25uZWN0aW9uLGluYm91bmRDb25uZWN0aW9ufTsKLSAgfQotCi0gIHB1YmxpYyBCYXNpY0Nvbm5lY3Rpb24gKCBSZWwgcmVsLCBFbGVtZW50IGVsZW1lbnQgKQotICB7Ci0gICAgZlJlbCA9IHJlbDsKLSAgICBmRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgZk9wcG9zaW5nQ29ubmVjdGlvbiA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgUmVsIGdldFJlbCAoKQotICB7Ci0gICAgcmV0dXJuIGZSZWw7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRPcHBvc2luZ0Nvbm5lY3Rpb24gKCkKLSAgewotICAgIHJldHVybiBmT3Bwb3NpbmdDb25uZWN0aW9uOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKQotICB7Ci0gICAgcmV0dXJuIGZFbGVtZW50LmdldE5hbWUoKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmQwOGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEJhc2ljRWxlbWVudCBpbXBsZW1lbnRzIEVsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIFN0cmluZyBmTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgZk1VSUQ7Ci0gIHByaXZhdGUgTW9kZWwgZk1vZGVsOwotICBwcml2YXRlIEhhc2h0YWJsZSBmUmVsczsKLSAgcHJpdmF0ZSBIYXNodGFibGUgZlByb3BlcnRpZXM7Ci0gIHByaXZhdGUgVmVjdG9yIGZMaXN0ZW5lcnM7Ci0KLSAgcHVibGljIEJhc2ljRWxlbWVudCAoIFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCApCi0gIHsKLSAgICBmTmFtZSA9IG5hbWU7Ci0gICAgc2V0TVVJRChtb2RlbC5tYWtlTVVJRChuYW1lKSk7Ci0gICAgbW9kZWwuYWRkRWxlbWVudCh0aGlzKTsKLSAgICBmTW9kZWwgPSBtb2RlbDsKLSAgICBmUmVscyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBmTGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotICAgIGZQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGZQcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eS5OQU1FLG5ldyBCYXNpY1Byb3BlcnR5KFByb3BlcnR5Lk5BTUUsZk5hbWUpKTsKLSAgfQotCi0gIHB1YmxpYyBCYXNpY0VsZW1lbnQgKCBTdHJpbmcgbmFtZSwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lLCBTdHJpbmcgaW5ib3VuZFJlbE5hbWUgKQotICB7Ci0gICAgdGhpcyhuYW1lLGVsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0gICAgY29ubmVjdChlbGVtZW50LG91dGJvdW5kUmVsTmFtZSxpbmJvdW5kUmVsTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyA8Y29kZT5FbGVtZW50PC9jb2RlPgotICAqIG9mIHRoZSBzYW1lIGNsYXNzIGFuZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIG1vZGVsLAotICAqIGJ1dCB3aXRoIG5vIFByb3BlcnRpZXMsIFJlbHMgb3IgTGlzdGVuZXJzIGV4Y2VwdCBmb3IKLSAgKiB0aGUge0BsaW5rIFByb3BlcnR5I05BTUUgTkFNRX0gcHJvcGVydHkuCi0gICogQHJldHVybiBPYmplY3QgQSBuZXcgRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEVsZW1lbnQgc2hhbGxvd0Nsb25lICgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJhc2ljRWxlbWVudChmTmFtZSxmTW9kZWwpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgPGNvZGU+RWxlbWVudDwvY29kZT4KLSAgKiBvZiB0aGUgc2FtZSBjbGFzcyBhbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBtb2RlbAotICAqIGFuZCB3aXRoIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgRWxlbWVudCdzIFByb3BlcnRpZXMuCi0gICogVGhlIFJlbHMgYW5kIExpc3RlbmVycyBhcmUgbm90IGNsb25lZC4KLSAgKiBAcmV0dXJuIEVsZW1lbnQgQSBuZXcgRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIGZpbmFsIEVsZW1lbnQgZGVlcENsb25lICgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBzaGFsbG93Q2xvbmUoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0UHJvcGVydGllcygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIFByb3BlcnR5IG5ld1Byb3BlcnR5ID0gKFByb3BlcnR5KXByb3BlcnR5LnNoYWxsb3dDbG9uZSgpOwotICAgICAgbmV3RWxlbWVudC5zZXRQcm9wZXJ0eShuZXdQcm9wZXJ0eSk7Ci0gICAgfQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICogTW9kZWwtVmlldy1Db250cm9sbGVyOiBBbGwgcHJvcGVydHkgY2hhbmdlcyB0byB0aGUgbW9kZWwKLSAgKiAoc3VjaCBhcyB0aG9zZSBtYWRlIGJ5IGEgd2l6YXJkIGluIHRoZSByb2xlIG9mIGEgQ29udHJvbGxlcikKLSAgKiBzaG91bGQgeWllbGQgZXZlbnRzIHRvIHdoaWNoIGFuIGludGVyZXN0ZWQgcGFydHkgY2FuIGxpc3RlbgotICAqIChzdWNoIGFzIGEgd2l6YXJkIGluIHRoZSByb2xlIG9mIGEgVmlld2VyKS4KLSAgKiBAcGFyYW0gdG1sIFRoZSBsaXN0ZW5lciB0byBhZGQuCi0gICovCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyICggRWxlbWVudExpc3RlbmVyIGxpc3RlbmVyICkKLSAgewotICAgIGZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyBNb2RlbCBnZXRNb2RlbCAoKQotICB7Ci0gICAgcmV0dXJuIGZNb2RlbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgKCkKLSAgewotICAgIHJldHVybiAoZk1vZGVsICE9IG51bGwgJiYgZk1vZGVsLmNvbnRhaW5zRWxlbWVudCh0aGlzKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmUgKCkKLSAgewotICAgIHJldHVybiBmTW9kZWwucmVtb3ZlRWxlbWVudCh0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBmTmFtZSA9IG5hbWU7Ci0gICAgZlByb3BlcnRpZXMucHV0KFByb3BlcnR5Lk5BTUUsbmV3IEJhc2ljUHJvcGVydHkoUHJvcGVydHkuTkFNRSxmTmFtZSkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gZk5hbWU7Ci0gIH0KLQotICAvKgotICAqIFRoZSBnZXR0ZXIgZm9yIHRoZSBNVUlECi0gICogVGhlIE1VSUQgaXMgdGhlIE1vZGVsIFVuaXF1ZSBJZGVudGlmaWVyLCBtYWRlIGZyb20gdGhlIG5hbWUgYW5kIGFuCi0gICogYXBwZW5kZWQgdW5pcXVlIG51bWJlciAKLSAgKiBAcmV0dXJuIFN0cmluZyBhIHVuaXF1ZSBpZCBmb3IgdGhpcyBlbGVtZW50IHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgbW9kZWwgCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TVVJRCgpCi0gIHsKLSAgICByZXR1cm4gZk1VSUQ7Ci0gIH0KLQotICAvKgotICAqCi0gICoKLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJJRCgpCi0gIHsKLSAgICBTdHJpbmcgbnVtYmVyID0gZ2V0TVVJRCgpLnN1YnN0cmluZyhnZXROYW1lKCkubGVuZ3RoKCkpOyAgCi0gICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQobnVtYmVyKTsKLSAgfQotCi0gIC8qCi0gICogU2V0IHRoZSBNVUlEIHdoaWNoIHdhcyBtYWRlIGJ5IHRoZSBtb2RlbAotICAqIFNob3VsZCBvbmx5IGJlIHNldHRhYmxlIHdpdGhpbiB0aGlzIGVsZW1lbnQKLSAgKiBTZXQgb25jZSB1cG9uIGNyZWF0aW9uLCB5b3UgY2FuIGNoYW5nZSB0aGUgbmFtZQotICAqIGJ1dCB0aGUgaWQgd2lsbCByZW1haW4gY29uc3RhbnQuCi0gICovCi0gIHByaXZhdGUgdm9pZCBzZXRNVUlEKFN0cmluZyBNVUlEKQotICB7Ci0gICAgZk1VSUQgPSBNVUlEOwotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5ICggUHJvcGVydHkgcHJvcGVydHkgKQotICB7Ci0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5LmdldE5hbWUoKTsKLSAgICBQcm9wZXJ0eSBvbGRQcm9wZXJ0eSA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgZlByb3BlcnRpZXMucHV0KHByb3BlcnR5TmFtZSxwcm9wZXJ0eSk7Ci0gICAgaWYgKG9sZFByb3BlcnR5ID09IG51bGwpCi0gICAgewotICAgICAgUHJvcGVydHlBZGRFdmVudCBldmVudCA9IG5ldyBQcm9wZXJ0eUFkZEV2ZW50KHRoaXMscHJvcGVydHkpOwotICAgICAgRW51bWVyYXRpb24gZSA9IGZMaXN0ZW5lcnMuZWxlbWVudHMoKTsKLSAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICAoKEVsZW1lbnRMaXN0ZW5lcillLm5leHRFbGVtZW50KCkpLnByb3BlcnR5QWRkZWQoZXZlbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgT2JqZWN0IG9sZFZhbHVlID0gb2xkUHJvcGVydHkuZ2V0VmFsdWUoKTsKLSAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0gICAgICBpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpCi0gICAgICB7Ci0gICAgICAgIGlmIChvbGRWYWx1ZSA9PSBudWxsIHx8IG5ld1ZhbHVlID09IG51bGwgfHwgKCFvbGRWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKSkKLSAgICAgICAgewotICAgICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLHByb3BlcnR5LG9sZFByb3BlcnR5KTsKLSAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZkxpc3RlbmVycy5lbGVtZW50cygpOwotICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoRWxlbWVudExpc3RlbmVyKWUubmV4dEVsZW1lbnQoKSkucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUHJvcGVydHkuTkFNRSkpIGZOYW1lID0gcHJvcGVydHkuZ2V0VmFsdWUoKS50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlBc09iamVjdCAoIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUgKQotICB7Ci0gICAgc2V0UHJvcGVydHkobmV3IEJhc2ljUHJvcGVydHkobmFtZSx2YWx1ZSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlBc1N0cmluZyAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKQotICB7Ci0gICAgc2V0UHJvcGVydHkobmV3IEJhc2ljUHJvcGVydHkobmFtZSx2YWx1ZSkpOwotICB9Ci0KLSAgcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5ICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgcmV0dXJuIChQcm9wZXJ0eSlmUHJvcGVydGllcy5nZXQobmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5QXNPYmplY3QgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBQcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFByb3BlcnR5KG5hbWUpOwotICAgIHJldHVybiAocHJvcGVydHkgPT0gbnVsbCA/IG51bGwgOiBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlBc1N0cmluZyAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIFByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eSA9PSBudWxsID8gbnVsbCA6IHByb3BlcnR5LmdldFZhbHVlQXNTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UHJvcGVydGllcyAoKQotICB7Ci0gICAgcmV0dXJuIGZQcm9wZXJ0aWVzLmVsZW1lbnRzKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0ICggRWxlbWVudCB0YXJnZXRFbGVtZW50LCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lLCBTdHJpbmcgaW5ib3VuZFJlbE5hbWUgKQotICB7Ci0gICAgaWYgKGZNb2RlbCA9PSBudWxsIHx8IGZNb2RlbCAhPSB0YXJnZXRFbGVtZW50LmdldE1vZGVsKCkpIHJldHVybiBmYWxzZTsKLQotICAgIEVsZW1lbnQgc291cmNlRWxlbWVudCA9IHRoaXM7Ci0gICAgUmVsIG91dGJvdW5kUmVsID0gc291cmNlRWxlbWVudC5nZXRSZWwob3V0Ym91bmRSZWxOYW1lKTsKLSAgICBSZWwgaW5ib3VuZFJlbCA9IHRhcmdldEVsZW1lbnQuZ2V0UmVsKGluYm91bmRSZWxOYW1lKTsKLSAgICBDb25uZWN0aW9uW10gcGFpciA9IEJhc2ljQ29ubmVjdGlvbi5jcmVhdGVQYWlyKG91dGJvdW5kUmVsLHRhcmdldEVsZW1lbnQsaW5ib3VuZFJlbCxzb3VyY2VFbGVtZW50KTsKLSAgICBvdXRib3VuZFJlbC5hZGRDb25uZWN0aW9uKHBhaXJbQmFzaWNDb25uZWN0aW9uLk9VVEJPVU5EXSk7Ci0gICAgaW5ib3VuZFJlbC5hZGRDb25uZWN0aW9uKHBhaXJbQmFzaWNDb25uZWN0aW9uLklOQk9VTkRdKTsKLSAgICBSZWxBZGRFdmVudCBldmVudCA9IG5ldyBSZWxBZGRFdmVudChwYWlyKTsKLSAgICBFbnVtZXJhdGlvbiBlU291cmNlID0gZ2V0TGlzdGVuZXJzKCk7Ci0gICAgRW51bWVyYXRpb24gZVRhcmdldCA9IHRhcmdldEVsZW1lbnQuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgd2hpbGUgKGVTb3VyY2UuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgKChFbGVtZW50TGlzdGVuZXIpZVNvdXJjZS5uZXh0RWxlbWVudCgpKS5yZWxBZGRlZChldmVudCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKGVUYXJnZXQuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgKChFbGVtZW50TGlzdGVuZXIpZVRhcmdldC5uZXh0RWxlbWVudCgpKS5yZWxBZGRlZChldmVudCk7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QgKCBFbGVtZW50IHRhcmdldEVsZW1lbnQsIFN0cmluZyBvdXRib3VuZFJlbE5hbWUgKQotICB7Ci0gICAgcmV0dXJuIGRpc2Nvbm5lY3QodGFyZ2V0RWxlbWVudCxnZXRSZWwob3V0Ym91bmRSZWxOYW1lKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0UmVsICggU3RyaW5nIG91dGJvdW5kUmVsTmFtZSApCi0gIHsKLSAgICByZXR1cm4gZGlzY29ubmVjdFJlbChnZXRSZWwob3V0Ym91bmRSZWxOYW1lKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0QWxsICgpCi0gIHsKLSAgICBpZiAoZk1vZGVsID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZlJlbHMuZWxlbWVudHMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBSZWwgcmVsID0gKFJlbCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBkaXNjb25uZWN0UmVsKHJlbCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEVsZW1lbnRzICggU3RyaW5nIHJlbE5hbWUgKQotICB7Ci0gICAgcmV0dXJuIGdldFJlbChyZWxOYW1lKS5nZXRUYXJnZXRFbGVtZW50cygpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZkVsZW1lbnRzICggU3RyaW5nIHJlbE5hbWUgKQotICB7Ci0gICAgcmV0dXJuIGdldFJlbChyZWxOYW1lKS5nZXROdW1iZXJPZlRhcmdldEVsZW1lbnRzKCk7Ci0gIH0KLQotICBwdWJsaWMgUmVsIGdldFJlbCAoIFN0cmluZyByZWxOYW1lICkKLSAgewotICAgIFJlbCByZWwgPSAoUmVsKWZSZWxzLmdldChyZWxOYW1lKTsKLSAgICBpZiAocmVsID09IG51bGwpCi0gICAgewotICAgICAgcmVsID0gbmV3IEJhc2ljUmVsKHJlbE5hbWUsdGhpcyk7Ci0gICAgICBmUmVscy5wdXQocmVsTmFtZSxyZWwpOwotICAgIH0KLSAgICByZXR1cm4gcmVsOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFJlbHMgKCkKLSAgewotICAgIHJldHVybiBmUmVscy5lbGVtZW50cygpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldExpc3RlbmVycygpCi0gIHsKLSAgICByZXR1cm4gZkxpc3RlbmVycy5lbGVtZW50cygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGlzY29ubmVjdCAoIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCwgUmVsIG91dGJvdW5kUmVsICkKLSAgewotICAgIGlmIChmTW9kZWwgPT0gbnVsbCB8fCBmTW9kZWwgIT0gdGFyZ2V0RWxlbWVudC5nZXRNb2RlbCgpIHx8IG91dGJvdW5kUmVsID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBDb25uZWN0aW9uIG91dGJvdW5kQ29ubmVjdGlvbiA9IG91dGJvdW5kUmVsLmdldENvbm5lY3Rpb25Ubyh0YXJnZXRFbGVtZW50KTsKLSAgICBpZiAob3V0Ym91bmRDb25uZWN0aW9uID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBDb25uZWN0aW9uIGluYm91bmRDb25uZWN0aW9uID0gb3V0Ym91bmRDb25uZWN0aW9uLmdldE9wcG9zaW5nQ29ubmVjdGlvbigpOwotICAgIFJlbFJlbW92ZUV2ZW50IGV2ZW50ID0gbmV3IFJlbFJlbW92ZUV2ZW50KG5ldyBDb25uZWN0aW9uIFtdIHtvdXRib3VuZENvbm5lY3Rpb24saW5ib3VuZENvbm5lY3Rpb259KTsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBmTGlzdGVuZXJzLmVsZW1lbnRzKCk7Ci0gICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgKChFbGVtZW50TGlzdGVuZXIpZS5uZXh0RWxlbWVudCgpKS5yZWxSZW1vdmVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgIEVudW1lcmF0aW9uIGVUYXJnZXQgPSB0YXJnZXRFbGVtZW50LmdldExpc3RlbmVycygpOwotICAgIHdoaWxlIChlVGFyZ2V0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgICgoRWxlbWVudExpc3RlbmVyKWVUYXJnZXQubmV4dEVsZW1lbnQoKSkucmVsUmVtb3ZlZChldmVudCk7Ci0gICAgfQotCi0gICAgUmVsIGluYm91bmRSZWwgPSBpbmJvdW5kQ29ubmVjdGlvbi5nZXRSZWwoKTsKLSAgICBib29sZWFuIGRvbmUgPSBvdXRib3VuZFJlbC5yZW1vdmVDb25uZWN0aW9uKG91dGJvdW5kQ29ubmVjdGlvbik7Ci0gICAgaW5ib3VuZFJlbC5yZW1vdmVDb25uZWN0aW9uKGluYm91bmRDb25uZWN0aW9uKTsKLSAgICByZXR1cm4gZG9uZTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGRpc2Nvbm5lY3RSZWwgKCBSZWwgb3V0Ym91bmRSZWwgKQotICB7Ci0gICAgaWYgKGZNb2RlbCA9PSBudWxsIHx8IG91dGJvdW5kUmVsID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgRWxlbWVudFtvdXRib3VuZFJlbC5nZXROdW1iZXJPZlRhcmdldEVsZW1lbnRzKCldOwotICAgIGludCBpID0gMDsKLSAgICBFbnVtZXJhdGlvbiBlID0gb3V0Ym91bmRSZWwuZ2V0VGFyZ2V0RWxlbWVudHMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBlbGVtZW50c1tpKytdID0gKEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgIH0KLSAgICB3aGlsZSAoaS0tID4gMCkKLSAgICB7Ci0gICAgICBkaXNjb25uZWN0KGVsZW1lbnRzW2ldLG91dGJvdW5kUmVsKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzYjQzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQmFzaWNNb2RlbCBpbXBsZW1lbnRzIE1vZGVsCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZk5hbWU7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGZFbGVtZW50czsKLSAgcHJpdmF0ZSBFbGVtZW50IGZSb290OwotICAvL1RoaXMgaXMgdXNlZCBieSB0aGUgTVVJRAotICBwcml2YXRlIGludCBmVW5pcXVlTnVtYmVyQ291bnRlcjsKLQotICBwdWJsaWMgQmFzaWNNb2RlbCAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgICBmRWxlbWVudHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZlJvb3QgPSBudWxsOwotICAgIGZVbmlxdWVOdW1iZXJDb3VudGVyID0gMDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBmTmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBmTmFtZTsKLSAgfQotCi0KLSAgLyoKLSAgKiBzaW1wbGUgY291bnRlciB0aGF0IGluY3JlbWVudHMgZWFjaCBjYWxsIAotICAqLwotICBwdWJsaWMgaW50IGdldFVuaXF1ZU51bWJlcigpCi0gIHsKLSAgICBmVW5pcXVlTnVtYmVyQ291bnRlcisrOwotICAgIHJldHVybiBmVW5pcXVlTnVtYmVyQ291bnRlcjsKLSAgfQotCi0gIC8qCi0gICogVGhpcyB3aWxsIHVzZSBhIHVuaXF1ZSBudW1iZXIgYW5kIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBuYW1lIAotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSBvZiB0aGUgZWxlbWVudAotICAqIEByZXR1cm4gU3RyaW5nIE1VSUQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBtYWtlTVVJRChTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBudW0gPSBTdHJpbmcudmFsdWVPZihnZXRVbmlxdWVOdW1iZXIoKSk7Ci0gICAgU3RyaW5nIG11aWQgPSBuYW1lICsgbnVtOwotICAgIHJldHVybiBtdWlkOwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRSb290RWxlbWVudCAoIEVsZW1lbnQgcm9vdCApCi0gIHsKLSAgICBpZiAocm9vdC5nZXRNb2RlbCgpID09IG51bGwpCi0gICAgICBhZGRFbGVtZW50KHJvb3QpOwotICAgIGVsc2UgaWYgKHJvb3QuZ2V0TW9kZWwoKSAhPSB0aGlzKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGZSb290ID0gcm9vdDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGdldFJvb3RFbGVtZW50ICgpCi0gIHsKLSAgICBpZiAoZlJvb3QgPT0gbnVsbCkgZlJvb3QgPSBnZXRGaXJzdEVsZW1lbnQoKTsKLSAgICByZXR1cm4gZlJvb3Q7Ci0gIH0KLQotCi0gIC8qKgotICAqIEdldCB0aGUgZWxlbWVudHMgdGhhdCBoYXZlIHRoaXMgbmFtZQotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCAKLSAgKiBAcmV0dXJuIFZlY3RvciBhIHZlY3RvciBvZiBlbGVtZW50cyB0aGF0IGhhdmUgdGhpcyBuYW1lCi0gICogVGhlc2UgZWxlbWVudHMgbWF5IGJlIG9mIGRpZmZlcmVudCB0eXBlcwotICAqKi8KLQotICBwdWJsaWMgVmVjdG9yIGdldEVsZW1lbnRzQnlOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgVmVjdG9yIHZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZkVsZW1lbnRzLmtleXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHZlY3Rvci5hZGRFbGVtZW50KGVsZW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gdmVjdG9yOwotICB9Ci0KLSAKLQotICBwdWJsaWMgYm9vbGVhbiBhZGRFbGVtZW50ICggRWxlbWVudCBlbGVtZW50ICkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE1vZGVsKCkgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIGZFbGVtZW50cy5wdXQoZWxlbWVudCxlbGVtZW50KTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZW1lbnQgKCBFbGVtZW50IGVsZW1lbnQgKQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TW9kZWwoKSAhPSB0aGlzKSByZXR1cm4gZmFsc2U7Ci0gICAgZWxlbWVudC5kaXNjb25uZWN0QWxsKCk7Ci0gICAgaWYgKGZSb290ID09IGVsZW1lbnQpIGZSb290ID0gbnVsbDsKLSAgICByZXR1cm4gKGZFbGVtZW50cy5yZW1vdmUoZWxlbWVudCkgPT0gZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RWxlbWVudHMgKCkKLSAgewotICAgIHJldHVybiBmRWxlbWVudHMuZWxlbWVudHMoKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZFbGVtZW50cyAoKQotICB7Ci0gICAgcmV0dXJuIGZFbGVtZW50cy5zaXplKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VsZW1lbnQgKCBFbGVtZW50IGVsZW1lbnQgKQotICB7Ci0gICAgcmV0dXJuIGZFbGVtZW50cy5jb250YWlucyhlbGVtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgRWxlbWVudCBnZXRGaXJzdEVsZW1lbnQgKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cygpOwotICAgIHJldHVybiAoZS5oYXNNb3JlRWxlbWVudHMoKSA/IChFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGwpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKQotICB7Ci0gICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1Byb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjFhODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY1Byb3BlcnR5IGltcGxlbWVudHMgUHJvcGVydHkKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIFN0cmluZyBmTmFtZTsKLSAgcHJpdmF0ZSBPYmplY3QgZlZhbHVlOwotCi0gIHB1YmxpYyBCYXNpY1Byb3BlcnR5ICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIEJhc2ljUHJvcGVydHkgKCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgICBmVmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaGFsbG93IGNsb25lIG9mIHRoaXMgPGNvZGU+UHJvcGVydHk8L2NvZGU+LgotICAqIFByb3BlcnR5IGtleSBhbmQgdmFsdWUgcmVmZXJlbmNlcyBhcmUgY2xvbmVkLAotICAqIGJ1dCB0aGUgdmFsdWUgb2JqZWN0cyB0aGVtc2VsdmVzIGFyZSBub3QgY2xvbmVkLgotICAqIEByZXR1cm4gUHJvcGVydHkgQSBuZXcgUHJvcGVydHkuCi0gICovCi0gIHB1YmxpYyBQcm9wZXJ0eSBzaGFsbG93Q2xvbmUgKCkKLSAgewotICAgIHJldHVybiBuZXcgQmFzaWNQcm9wZXJ0eShmTmFtZSxmVmFsdWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gZk5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZSAoIE9iamVjdCB2YWx1ZSApCi0gIHsKLSAgICBmVmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUgKCkKLSAgewotICAgIHJldHVybiBmVmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUFzU3RyaW5nICggU3RyaW5nIHZhbHVlICkKLSAgewotICAgIGZWYWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gKGZWYWx1ZSAhPSBudWxsID8gZlZhbHVlLnRvU3RyaW5nKCkgOiBudWxsKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1JlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNSZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzMzZmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1JlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY1JlbCBpbXBsZW1lbnRzIFJlbAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIEVsZW1lbnQgZlNvdXJjZUVsZW1lbnQ7Ci0gIHByaXZhdGUgVmVjdG9yIGZDb25uZWN0aW9uczsKLQotICBwdWJsaWMgQmFzaWNSZWwgKCBTdHJpbmcgbmFtZSwgRWxlbWVudCBzb3VyY2VFbGVtZW50ICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgICBmU291cmNlRWxlbWVudCA9IHNvdXJjZUVsZW1lbnQ7Ci0gICAgZkNvbm5lY3Rpb25zID0gbmV3IFZlY3RvcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gZk5hbWU7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBnZXRTb3VyY2VFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZlNvdXJjZUVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0VGFyZ2V0RWxlbWVudHMgKCkKLSAgewotICAgIHJldHVybiBuZXcgRWxlbWVudEVudW1lcmF0aW9uKGZDb25uZWN0aW9ucy5lbGVtZW50cygpKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZUYXJnZXRFbGVtZW50cyAoKQotICB7Ci0gICAgcmV0dXJuIGZDb25uZWN0aW9ucy5zaXplKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRDb25uZWN0aW9uICggQ29ubmVjdGlvbiBjb25uZWN0aW9uICkKLSAgewotICAgIGZDb25uZWN0aW9ucy5hZGRFbGVtZW50KGNvbm5lY3Rpb24pOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29ubmVjdGlvbiAoIENvbm5lY3Rpb24gY29ubmVjdGlvbiApCi0gIHsKLSAgICByZXR1cm4gZkNvbm5lY3Rpb25zLnJlbW92ZUVsZW1lbnQoY29ubmVjdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uVG8gKCBFbGVtZW50IHRhcmdldEVsZW1lbnQgKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGZDb25uZWN0aW9ucy5lbGVtZW50cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIENvbm5lY3Rpb24gYyA9IChDb25uZWN0aW9uKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmIChjLmdldEVsZW1lbnQoKSA9PSB0YXJnZXRFbGVtZW50KSByZXR1cm4gYzsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBFbGVtZW50RW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbgotICB7Ci0gICAgcHJpdmF0ZSBFbnVtZXJhdGlvbiBmQ29ubmVjdGlvbkVudW1lcmF0aW9uOwotCi0gICAgcHVibGljIEVsZW1lbnRFbnVtZXJhdGlvbiAoIEVudW1lcmF0aW9uIGNvbm5lY3Rpb25FbnVtZXJhdGlvbiApCi0gICAgewotICAgICAgZkNvbm5lY3Rpb25FbnVtZXJhdGlvbiA9IGNvbm5lY3Rpb25FbnVtZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMgKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZkNvbm5lY3Rpb25FbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50ICgpCi0gICAgewotICAgICAgcmV0dXJuICgoQ29ubmVjdGlvbilmQ29ubmVjdGlvbkVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkpLmdldEVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQ29ubmVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDYyNzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogVGhpcyBpcyB0aGUgYWJzdHJhY3QgY2xhc3MgZm9yIGEgY29ubmVjdGlvbiB0aGF0IHRpZXMgYSBSZWwgdG8gYSBOb2RlLgotKiBOb3JtYWxseSBDb25uZWN0aW9uIG9iamVjdHMgYXJlIG1hbnVmYWN0dXJlZCBhbmQgbWFuYWdlZCB3aXRoaW4gdGhlCi0qIGRlcml2ZWQgY2xhc3NlcyBvZiB0aGUgTW9kZWwgZnJhbWV3b3JrLCBhbmQgYXJlIG5vdCBtYW5pcHVsYXRlZCBieQotKiB0aGUgY2FsbGVyIGRpcmVjdGx5LgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIFJlbCB0aGF0IG93bnMgdGhpcyBjb25uZWN0aW9uLgotICAqIEByZXR1cm4gUmVsIFRoZSBSZWwgdGhhdCBvd25zIHRoaXMgY29ubmVjdGlvbi4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsIHRoYXQgaXMsIGEgQ29ubmVjdGlvbgotICAqIGNhbm5vdCBleGlzdCB3aXRob3V0IGEgUmVsIHRvIG93biBpdC4KLSAgKi8KLSAgcHVibGljIFJlbCBnZXRSZWwgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgTm9kZSB0aGF0IHRoaXMgY29ubmVjdGlvbiBwb2ludHMgdG8uCi0gICogQHJldHVybiBOb2RlIFRoZSBOb2RlIHRoaXMgY29ubmVjdGlvbiBwb2ludHMgdG8uCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLCB0aGF0IGlzLCBhIENvbm5lY3Rpb24KLSAgKiBjYW5ub3QgZXhpc3Qgd2l0aG91dCBhIE5vZGUgdG8gcG9pbnQgdG8uCi0gICovCi0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgb3Bwb3NpbmcgY29ubmVjdGlvbiB0byB0aGlzIGNvbm5lY3Rpb24uCi0gICogQ29ubmVjdGlvbiBvYmplY3RzIGFsd2F5cyBleGlzdCBpbiBwYWlycywgdGhhdCBpcywKLSAgKiBpZiBub2RlICJQYXJlbnQiIGhhcyBhIHJlbGF0aW9uc2hpcCBuYW1lZCAiQ2hpbGRyZW4iCi0gICogY29udGFpbmluZyBhIGNvbm5lY3Rpb24gdG8gbm9kZSAiQ2hpbGQiLCB0aGVuIHRoZXJlCi0gICogbXVzdCBleGlzdCBhbiBvcHBvc2luZyBjb25uZWN0aW9uIGZyb20gIkNoaWxkIiB0bwotICAqICJQYXJlbnQiIGluIHNvbWUgcmVsYXRpb25zaGlwIG9mICJDaGlsZCIgKGZvciBleGFtcGxlLAotICAqIGluIGEgcmVsYXRpb25zaGlwIGNhbGxlZCAiUGFyZW50cyIpLgotICAqIEByZXR1cm4gQ29ubmVjdGlvbiBUaGUgb3Bwb3NpbmcgY29ubmVjdGlvbi4KLSAgKiBBcyBhIGdlbmVyYWwgcnVsZSwgdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIHJldHVybiBudWxsLgotICAqIEl0IG1heSBvbmx5IHJldHVybiBudWxsIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgdGhlIHBhaXIKLSAgKiBvZiBjb25uZWN0aW9ucy4KLSAgKi8KLSAgcHVibGljIENvbm5lY3Rpb24gZ2V0T3Bwb3NpbmdDb25uZWN0aW9uICgpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzcyMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSogVGhpcyBpcyB0aGUgYWJzdHJhY3QgY2xhc3MgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGJlIG1hbmFnZWQgYnkgYSBNb2RlbC4KLSogRXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLCBhIHNldCBvZiBwcm9wZXJ0aWVzLCBhbmQgYSBzZXQgb2YgcmVsYXRpb25zaGlwcwotKiB0byBvdGhlciBlbGVtZW50cy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyA8Y29kZT5FbGVtZW50PC9jb2RlPgotICAqIG9mIHRoZSBzYW1lIGNsYXNzIGFuZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIG1vZGVsLAotICAqIGJ1dCB3aXRoIG5vIFByb3BlcnRpZXMsIFJlbHMgb3IgTGlzdGVuZXJzIGV4Y2VwdCBmb3IKLSAgKiB0aGUge0BsaW5rIFByb3BlcnR5I05BTUUgTkFNRX0gcHJvcGVydHkuCi0gICogQHJldHVybiBPYmplY3QgQSBuZXcgRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEVsZW1lbnQgc2hhbGxvd0Nsb25lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIDxjb2RlPkVsZW1lbnQ8L2NvZGU+Ci0gICogb2YgdGhlIHNhbWUgY2xhc3MgYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbW9kZWwKLSAgKiBhbmQgd2l0aCBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEVsZW1lbnQncyBQcm9wZXJ0aWVzLgotICAqIFRoZSBSZWxzIGFuZCBMaXN0ZW5lcnMgYXJlIG5vdCBjbG9uZWQuCi0gICogQHJldHVybiBFbGVtZW50IEEgbmV3IEVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBFbGVtZW50IGRlZXBDbG9uZSAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGlzIGVsZW1lbnQgYmVsb25ncyB0bywgb3IgbnVsbCBpZiB0aGUgZWxlbWVudAotICAqIGhhcyBub3QgYmVlbiBhZGRlZCB0byBhIG1vZGVsLiBTZWUgYWxzbyB7QGxpbmsgI2lzVmFsaWQgaXNWYWxpZCgpfS4KLSAgKiBAcmV0dXJuIE1vZGVsIFRoZSBtb2RlbCB0aGlzIGVsZW1lbnQgYmVsb25ncyB0bywgb3IgbnVsbCBpZiBub25lLgotICAqLwotICBwdWJsaWMgTW9kZWwgZ2V0TW9kZWwgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgZWxlbWVudCBiZWxvbmdzIHRvIGEgbW9kZWwuCi0gICogU2VlIGFsc28ge0BsaW5rICNnZXRNb2RlbCBnZXRNb2RlbCgpfS4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGVsZW1lbnQgYmVsb25ncyB0byBhIG1vZGVsLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkICgpOwotCi0gIC8qKgotICAqIFJlbW92ZXMgdGhpcyBlbGVtZW50IGZyb20gdGhlIG1vZGVsIHRvIHdoaWNoIGl0IGN1cnJlbnRseSBiZWxvbmdzLgotICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIHtAbGluayAjZ2V0TW9kZWwgZ2V0TW9kZWwoKX0gd2lsbCByZXR1cm4KLSAgKiBudWxsIGFuZCB7QGxpbmsgI2lzVmFsaWQgaXNWYWxpZCgpfSB3aWxsIHJldHVybiBmYWxzZS4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgZWxlbWVudCB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbQotICAqIGl0cyBtb2RlbC4gVGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBiZWxvbmcKLSAgKiB0byBhbnkgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZSAoKTsKLQotICAvKioKLSAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhbmQgdXBkYXRlcyB0aGUgIm5hbWUiIHByb3BlcnR5LgotICAqIEV2ZXJ5IGVsZW1lbnQgaW5jbHVkZXMgYSBwcm9wZXJ0eSBjYWxsZWQgIm5hbWUiIChzZWUgUHJvcGVydHkuTkFNRSkKLSAgKiB3aG9zZSB2YWx1ZSBpcyB0aGUgc2FtZSBzdHJpbmcgYXMgcGFzc2VkIGludG8gc2V0TmFtZSgpLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZSAoIFN0cmluZyBuYW1lICk7Ci0KLSAgLyoqCi0gICoKLSAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIgKCBFbGVtZW50TGlzdGVuZXIgbGlzdGVuZXIgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgbmFtZSBvZiB0aGlzIGVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLQotICAvKioKLSAgKiBBZGRzIG9yIHNldHMgYSBwcm9wZXJ0eSBvZiB0aGlzIGVsZW1lbnQuCi0gICogUHJvcGVydGllcyBzZXQgdXNpbmcgdGhpcyBtZXRob2QgY2FuIGJlIHJldHJpZXZlZCB1c2luZyBlaXRoZXIKLSAgKiB7QGxpbmsgI2dldFByb3BlcnR5IGdldFByb3BlcnR5KCl9IG9yCi0gICoge0BsaW5rICNnZXRQcm9wZXJ0eUFzT2JqZWN0IGdldFByb3BlcnR5QXNPYmplY3QoKX0uCi0gICogRXZlcnkgZWxlbWVudCBpbmNsdWRlcyBhIHByb3BlcnR5IGNhbGxlZCAibmFtZSIgKHNlZSBQcm9wZXJ0eS5OQU1FKQotICAqIHdob3NlIHZhbHVlIGlzIHRoZSBzYW1lIHN0cmluZyBhcyBwYXNzZWQgaW50byB7QGxpbmsgI3NldE5hbWUgc2V0TmFtZSgpfS4KLSAgKiBBbnkgcHJldmlvdXMgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIHJlcGxhY2VkLgotICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gc2V0LgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eSAoIFByb3BlcnR5IHByb3BlcnR5ICk7Ci0KLSAgLyoqCi0gICogQWRkcyBvciBzZXRzIGEgcHJvcGVydHkgb2YgdGhpcyBlbGVtZW50LgotICAqIFByb3BlcnRpZXMgc2V0IHVzaW5nIHRoaXMgbWV0aG9kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgZWl0aGVyCi0gICoge0BsaW5rICNnZXRQcm9wZXJ0eSBnZXRQcm9wZXJ0eSgpfSBvcgotICAqIHtAbGluayAjZ2V0UHJvcGVydHlBc09iamVjdCBnZXRQcm9wZXJ0eUFzT2JqZWN0KCl9LgotICAqIEV2ZXJ5IGVsZW1lbnQgaW5jbHVkZXMgYSBwcm9wZXJ0eSBjYWxsZWQgIm5hbWUiIChzZWUgUHJvcGVydHkuTkFNRSkKLSAgKiB3aG9zZSB2YWx1ZSBpcyB0aGUgc2FtZSBzdHJpbmcgYXMgcGFzc2VkIGludG8ge0BsaW5rICNzZXROYW1lIHNldE5hbWUoKX0uCi0gICogQW55IHByZXZpb3VzIHByb3BlcnR5IHdpdGggdGhlIHNhbWUgbmFtZSBpcyByZXBsYWNlZC4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgotICAqIEBwYXJhbSB2YWx1ZSBUaGUgT2JqZWN0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5QXNPYmplY3QgKCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlICk7Ci0KLSAgLyoqCi0gICogQWRkcyBvciBzZXRzIGEgU3RyaW5nIHByb3BlcnR5IG9mIHRoaXMgZWxlbWVudC4KLSAgKiBQcm9wZXJ0aWVzIHNldCB1c2luZyB0aGlzIG1ldGhvZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIGVpdGhlcgotICAqIHtAbGluayAjZ2V0UHJvcGVydHkgZ2V0UHJvcGVydHkoKX0sCi0gICoge0BsaW5rICNnZXRQcm9wZXJ0eUFzT2JqZWN0IGdldFByb3BlcnR5QXNPYmplY3QoKX0gb3IKLSAgKiB7QGxpbmsgI2dldFByb3BlcnR5QXNTdHJpbmcgZ2V0UHJvcGVydHlBc1N0cmluZygpfS4KLSAgKiBFdmVyeSBlbGVtZW50IGluY2x1ZGVzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiAoc2VlIFByb3BlcnR5Lk5BTUUpCi0gICogd2hvc2UgdmFsdWUgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHBhc3NlZCBpbnRvIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9LgotICAqIEFueSBwcmV2aW91cyBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgcmVwbGFjZWQuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KLSAgKiBAcGFyYW0gdmFsdWUgVGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUFzU3RyaW5nICggU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCi0gICogRXZlcnkgZWxlbWVudCBpbmNsdWRlcyBhIHByb3BlcnR5IGNhbGxlZCAibmFtZSIgKHNlZSBQcm9wZXJ0eS5OQU1FKQotICAqIHdob3NlIHZhbHVlIGlzIHRoZSBzYW1lIHN0cmluZyBhcyBwYXNzZWQgaW50byB7QGxpbmsgI3NldE5hbWUgc2V0TmFtZSgpfS4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0dXJuLgotICAqIEByZXR1cm4gUHJvcGVydHkgVGhlIHByb3BlcnR5LCBvciBudWxsIGlmIG5vbmUuCi0gICovCi0gIHB1YmxpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eSAoIFN0cmluZyBuYW1lICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgT2JqZWN0IHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgb3IgbnVsbAotICAqIGlmIHRoZXJlIGlzIG5vbmUuCi0gICogRXZlcnkgZWxlbWVudCBpbmNsdWRlcyBhIHByb3BlcnR5IGNhbGxlZCAibmFtZSIgKHNlZSBQcm9wZXJ0eS5OQU1FKQotICAqIHdob3NlIHZhbHVlIGlzIHRoZSBzYW1lIHN0cmluZyBhcyBwYXNzZWQgaW50byB7QGxpbmsgI3NldE5hbWUgc2V0TmFtZSgpfS4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0dXJuLgotICAqIEByZXR1cm4gT2JqZWN0IFRoZSBwcm9wZXJ0eSB2YWx1ZSBhcyBhbiBPYmplY3QsIG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eUFzT2JqZWN0ICggU3RyaW5nIG5hbWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsCi0gICogaWYgdGhlcmUgaXMgbm9uZS4KLSAgKiBFdmVyeSBlbGVtZW50IGluY2x1ZGVzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiAoc2VlIFByb3BlcnR5Lk5BTUUpCi0gICogd2hvc2UgdmFsdWUgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHBhc3NlZCBpbnRvIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9LgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXR1cm4uCi0gICogQHJldHVybiBTdHJpbmcgVGhlIHByb3BlcnR5IHZhbHVlIGFzIGEgU3RyaW5nLCBvciBudWxsIGlmIG5vbmUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlBc1N0cmluZyAoIFN0cmluZyBuYW1lICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgcHJvcGVydGllcyBvZiB0aGlzIGVsZW1lbnQuCi0gICogVGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IG9uZSBwcm9wZXJ0eSB0aGF0IGNhcnJpZXMgdGhlCi0gICogbmFtZSBvZiB0aGlzIGVsZW1lbnQgKHNlZSB7QGxpbmsgI3NldE5hbWUgc2V0TmFtZSgpfSkuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBBbiBlbnVtZXJhdGlvbiBvZiBhbGwgcHJvcGVydGllcyBvZiB0aGlzIGVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0aWVzICgpOwotCi0gIC8qKgotICAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoaXMgZWxlbWVudCBhbmQgYW5vdGhlci4KLSAgKiBCb3RoIHJlbGF0aW9uc2hpcHMgYXJlIGlkZW50aWZpZWQgYnkgbmFtZXMuIFRoZSBuYW1lcyBvZiBhbGwgdGhlCi0gICogb3V0Ym91bmQgcmVsYXRpb25zaGlwcyBvZiBhIGVsZW1lbnQgbXVzdCBiZSBtdXR1YWxseSB1bmlxdWUuCi0gICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gY29ubmVjdCB0by4KLSAgKiBAcGFyYW0gb3V0Ym91bmRSZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgdG8gY29udGFpbiB0aGUKLSAgKiBjb25uZWN0aW9uIHRvIHRoZSBlbGVtZW50LgotICAqIEBwYXJhbSBpbmJvdW5kUmVsTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIHRvIGNvbnRhaW4gdGhlCi0gICogaW52ZXJzZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhpcyBlbGVtZW50LgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgotICAqIEJvdGggZWxlbWVudHMgbXVzdCBiZWxvbmcgdG8gdGhlIHNhbWUgbW9kZWwsIG90aGVyIGZhbHNlIGlzIHJldHVybmVkLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0ICggRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lLCBTdHJpbmcgaW5ib3VuZFJlbE5hbWUgKTsKLQotICAvKioKLSAgKiBEaXNtYW50bGVzIHRoZSBjb25uZWN0aW9uIHRvIGFub3RoZXIgZWxlbWVudCBpbiBhIGdpdmVuIHJlbGF0aW9uc2hpcC4KLSAgKiBUaGUgaW52ZXJzZSBjb25uZWN0aW9uIGlzIGFsc28gYXV0b21hdGljYWxseSBkaXNtYW50bGVkLgotICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGRpc2Nvbm5lY3QgZnJvbS4KLSAgKiBAcGFyYW0gb3V0Ym91bmRSZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgY29udGFpbmluZwotICAqIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBlbGVtZW50LgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgotICAqIEJvdGggZWxlbWVudHMgbXVzdCBiZWxvbmcgdG8gdGhlIHNhbWUgbW9kZWwsIG90aGVyIGZhbHNlIGlzIHJldHVybmVkLgotICAqIElmIHRoZSBlbGVtZW50cyBhcmUgbm90IGNvbm5lY3RlZCB0aHJvdWdoIHRoZSBnaXZlbiByZWxhdGlvbnNoaXAsIHRoZW4KLSAgKiBmYWxzZSBpcyByZXR1cm5lZC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCAoIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG91dGJvdW5kUmVsTmFtZSApOwotCi0gIC8qKgotICAqIERpc21hbnRsZXMgdGhlIGNvbm5lY3Rpb24gdG8gYWxsIGVsZW1lbnRzIGluIHRoZSBnaXZlbiByZWxhdGlvbnNoaXAuCi0gICogVGhlIGludmVyc2UgY29ubmVjdGlvbnMgYXJlIGFsc28gYXV0b21hdGljYWxseSBkaXNtYW50bGVkLgotICAqIEBwYXJhbSBvdXRib3VuZFJlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBhbGwgY29ubmVjdGlvbnMgYXJlIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgotICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgYmVsb25nIHRvIGEgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RSZWwgKCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lICk7Ci0KLSAgLyoqCi0gICogRGlzbWFudGxlcyBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGlzIGVsZW1lbnQuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgYWxsIGNvbm5lY3Rpb25zIGFyZSByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KLSAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGJlbG9uZyB0byBhIG1vZGVsLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0QWxsICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIGVsZW1lbnRzCi0gICogY29ubmVjdGVkIHRocnUgdGhlIGdpdmVuIHJlbGF0aW9uc2hpcC4KLSAgKiBAcGFyYW0gcmVsTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gVGhlIGVsZW1lbnRzIGluIHRoZSByZWxhdGlvbnNoaXAuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RWxlbWVudHMgKCBTdHJpbmcgcmVsTmFtZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gcmVsYXRpb25zaGlwLgotICAqIEBwYXJhbSByZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gICogQHJldHVybiBpbnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcmVsYXRpb25zaGlwLgotICAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KLSAgKi8KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TGlzdGVuZXJzKCk7Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZkVsZW1lbnRzICggU3RyaW5nIHJlbE5hbWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSByZWxhdGlvbnNoaXAgb2JqZWN0IG9mIHRoZSBnaXZlbiBuYW1lLgotICAqIEBwYXJhbSByZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gICogQHJldHVybiBpbnQgVGhlIHJlbGF0aW9uc2hpcC4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotICAqIEluIG90aGVyIHdvcmRzLCBhbnkgcmVmZXJlbmNlIHRvIGEgcmVsYXRpb25zaGlwIG5hbWUgYXV0b21hdGljYWxseQotICAqIGJyaW5ncyBhIGNvcnJlc3BvbmRpbmcgUmVsIG9iamVjdCBpbnRvIGV4aXN0ZW5jZS4gQ2FyZWxlc3MgbmFtaW5nCi0gICogbWF5IHJlc3VsdCBpbiB0aGUge0BsaW5rICNnZXRSZWxzIGdldFJlbHMoKX0gbWV0aG9kIHJldHVybmluZyBhbiBlbnVtZXJhdGlvbiBvZgotICAqIG1vcmUgcmVsYXRpb25zaGlwcyB0aGFuIHdvdWxkIGJlIG1lYW5pbmdmdWwsIGVmZmljaWVudCBvciB1c2VmdWwuCi0gICovCi0gIHB1YmxpYyBSZWwgZ2V0UmVsICggU3RyaW5nIHJlbE5hbWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBrbm93biByZWxhdGlvbnNoaXBzLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gVGhlIG91dGJvdW5kIHJlbGF0aW9uc2hpcHMgb2YgdGhlIGVsZW1lbnQuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UmVscyAoKTsKLQotCi0gIC8qCi0gICogVGhlcmUgaXMgYSBuZWVkIHNvbWV0aW1lcyBmb3IgZWFjaCBlbGVtZW50IGluIGEgbW9kZWwgdG8gaGF2ZSBhIHVuaXF1ZSBpZGVudGlmaWVyLgotICAqIE5vcm1hbGx5IHRoaXMgd291bGQgYmUgbGVmdCB0byBhIG5hbWUsIGJ1dCBzaW5jZSB0aGUgZWxlbWVudCBtYWtlciBnaXZlcyBpdCBpdHMgbmFtZQotICAqIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgYSBtb2RlbCBjb3VsZCBoYXZlIHR3byBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUuIElmIHRoZXkgCi0gICogYXJlIHRoZSBzYW1lIGVsZW1lbnQgdHlwZSB0aGVuIHRoZXJlIHdvdWxkIGJlIG5vIHdheSB0byBkaWZmZXJlbmNpYXRlIGJldHdlZW4gdGhlIHR3by4KLSAgKiBUaGUgZm9sbG93aW5nIGdldHRlciBhbmQgc2V0dGVyIHdpbGwgcHJvdmlkZSBhIHVuaXF1ZSBpZGVudGlmaWVyLiBUaGlzIGlkZW50aWZpZXIgd2lsbCBiZSBrbm93biAKLSAgKiBhcyB0aGUgbXVpZCBvciBNb2RlbCBVbmlxdWUgSWRlbnRpZmllci4gVW5saWtlIGEgdXVpZCBpdCB3aWxsIG9ubHkgYmUgYXNzdXJlZCB1bmlxdWVuZXNzIAotICAqIHdpdGhpbiBpdHMgb3duIG1vZGVsLiBUaGUgaW50ZW50aW9uIGlzIHRvIHVzZSBhIHVuaXF1ZSBudW1iZXIgYXBwZW5kZWQgdG8gdGhlIGVuZCAKLSAgKiBvZiB0aGUgbmFtZS4KLSAgKiBUaGUgZm9sbG93aW5nIGlzIHRoZSBnZXR0ZXIKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgdW5pcXVlIGlkZW50aWZpZXIKLSAgKi8KLQotICBwdWJsaWMgU3RyaW5nIGdldE1VSUQoKTsKLSAgCi0gIAotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0VsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMGNmZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogVGhpcyBpcyB3aGVyZSB3ZSBzdG9yZSBhbGwgdGhlIHN0YXRlIGRhdGEgdGhhdCB2YXJpb3VzIFVJcwotKiAoc3VjaCBhcyB0aGUgTmV3V1NETENyZWF0aW9uV2l6YXJkKSBjYXB0dXJlIGZyb20gdGhlIHVzZXIKLSogYW5kIHRoZW4gbmVlZCB0byBwcm9jZXNzLgotKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50QWRhcHRlciBpbXBsZW1lbnRzIEVsZW1lbnRMaXN0ZW5lcgotewotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSBhbmQgdmFsdWUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5QWRkZWQgKCBQcm9wZXJ0eUFkZEV2ZW50IGV2ZW50ICkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpbiB0aGUgbW9kZWwgY2hhbmdlcy4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSwgb2xkIHZhbHVlCi0gICogYW5kIG5ldyB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkICggUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCApCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaW4gdGhlIG1vZGVsIGlzIHJlbW92ZWQuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIG9sZCB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkICggUHJvcGVydHlSZW1vdmVFdmVudCBldmVudCApCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5IGFuZCB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcmVsQWRkZWQgKCBSZWxBZGRFdmVudCBldmVudCApCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5IGFuZCB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZCAoIFJlbFJlbW92ZUV2ZW50IGV2ZW50ICkKLSAgewotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0VsZW1lbnRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODE5ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0qIFRoaXMgaXMgd2hlcmUgd2Ugc3RvcmUgYWxsIHRoZSBzdGF0ZSBkYXRhIHRoYXQgdmFyaW91cyBVSXMKLSogKHN1Y2ggYXMgdGhlIE5ld1dTRExDcmVhdGlvbldpemFyZCkgY2FwdHVyZSBmcm9tIHRoZSB1c2VyCi0qIGFuZCB0aGVuIG5lZWQgdG8gcHJvY2Vzcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnRMaXN0ZW5lcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5IGFuZCB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcHJvcGVydHlBZGRlZCAoIFByb3BlcnR5QWRkRXZlbnQgZXZlbnQgKTsKLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGluIHRoZSBtb2RlbCBjaGFuZ2VzLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5LCBvbGQgdmFsdWUKLSAgKiBhbmQgbmV3IHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQgKCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ICk7Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpbiB0aGUgbW9kZWwgaXMgcmVtb3ZlZC4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSBhbmQgb2xkIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQgKCBQcm9wZXJ0eVJlbW92ZUV2ZW50IGV2ZW50ICk7Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCByZWxBZGRlZCAoIFJlbEFkZEV2ZW50IGV2ZW50ICk7Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkICggUmVsUmVtb3ZlRXZlbnQgZXZlbnQgKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjI5N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSogVGhpcyBpcyB0aGUgYWJzdHJhY3QgY2xhc3MgZm9yIGEgc2ltcGxlIGRhdGEgbW9kZWwgY29uc2lzdGluZyBvZgotKiBhIG5ldHdvcmsgb2YgbmFtZWQgbm9kZXMgKGNsYXNzIE5vZGUpLiBFdmVyeSBub2RlIGNhcnJpZXMgYSBzZXQKLSogb2YgbmFtZWQgcHJvcGVydGllcyAoY2xhc3MgUHJvcGVydHkpLiBOb2RlcyBhcmUgaW50ZXJyZWxhdGVkIGJ5Ci0qIHJlbGF0aW9uc2hpcHMgKGNsYXNzIFJlbCkgYW5kIGNvbm5lY3Rpb25zIChjbGFzcyBDb25uZWN0aW9uKS4KLSogRWFjaCBNb2RlbCBrZWVwcyBhIHJlZ2lzdHJ5IG9mIGFsbCBvZiBpdHMgbm9kZXMsIGFuZCBrZWVwcyBhCi0qIHJlZmVyZW5jZSB0byBvbmUgInJvb3QiIG5vZGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHN0YXJ0aW5nCi0qIHBvaW50IGZvciBuYXZpZ2F0aW9uLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWwKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBtb2RlbC4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kZWwuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUgKCBTdHJpbmcgbmFtZSApOwotCi0gIC8qKgotICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIG1vZGVsLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBtb2RlbC4gVGhpcyBtdXN0IG5vdCBiZSBudWxsLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCk7Ci0KLSAgLyoqCi0gICogU2V0cyBhIG5vZGUgYXMgdGhlIHJvb3Qgb2YgdGhlIG1vZGVsLiBJZiB0aGUgbm9kZSBkb2VzIG5vdAotICAqIGJlbG9uZyB0byBhIG1vZGVsLCB0aGVuIGl0IGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkuIElmIHRoZQotICAqIG5vZGUgYWxyZWFkeSBiZWxvbmdzIHRvIGFub3RoZXIgbW9kZWwsIHRoZW4gdGhlIHJvb3Qgbm9kZQotICAqIGlzIG5vdCBzZXQgYW5kIG1ldGhvZCByZXR1cm5zIGZhbHNlLgotICAqIEBwYXJhbSByb290IFRoZSBub2RlIHRvIHNldCBhcyB0aGUgcm9vdC4gVGhlIG5vZGUgbXVzdAotICAqIGJlbG9uZyBlaXRoZXIgdG8gdGhpcyBtb2RlbCBvciB0byBubyBtb2RlbC4gVGhpcyBtdXN0Ci0gICogbm90IGJlIG51bGwuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIG5vZGUgd2FzIHNldCBhcyB0aGUgcm9vdC4KLSAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlIGlmIHRoZSBnaXZlbiBub2RlIGFscmVhZHkgYmVsb25ncwotICAqIHRvIGFub3RoZXIgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIHNldFJvb3RFbGVtZW50ICggRWxlbWVudCByb290ICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgcm9vdCBub2RlLiBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBhIG5vZGUKLSAgKiBleGNlcHQgb24gYW4gZW1wdHkgTW9kZWwuIElmIHNldFJvb3ROb2RlKCkgaGFzIG5vdCBiZWVuCi0gICogY2FsbGVkLCBvciBpZiB0aGUgbGFzdCByb290IG5vZGUgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbW9kZWwsCi0gICogdGhlbiB0aGUgbWV0aG9kIHdpbGwgc2VsZWN0IGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5IG5vZGUgYXMKLSAgKiB0aGUgcm9vdC4gVGhpcyBtZXRob2Qgd2lsbCBjb25zaXN0ZW50bHkgcmV0dXJuIHRoZSBzYW1lIG5vZGUKLSAgKiB1bnRpbCBlaXRoZXIKLSAgKiAoYSkgc2V0Um9vdE5vZGUoKSBpcyBjYWxsZWQgd2l0aCBhIGRpZmZlcmVudCBub2RlIG9yCi0gICogKGIpIHJlbW92ZU5vZGUoKSBpcyBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIG1vZGVsLgotICAqIEByZXR1cm4gTm9kZSBUaGUgY3VycmVudCByb290IG5vZGUsIG9yIG51bGwgaWYgdGhlIG1vZGVsIGlzIGVtcHR5LgotICAqLwotCi0gIHB1YmxpYyBFbGVtZW50IGdldFJvb3RFbGVtZW50ICgpOwotCi0gIC8qKgotICAqIEdldCB0aGUgZWxlbWVudHMgdGhhdCBoYXZlIHRoaXMgbmFtZQotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCAKLSAgKiBAcmV0dXJuIFZlY3RvciBhIHZlY3RvciBvZiBlbGVtZW50cyB0aGF0IGhhdmUgdGhpcyBuYW1lCi0gICogVGhlc2UgZWxlbWVudHMgbWF5IGJlIG9mIGRpZmZlcmVudCB0eXBlcwotICAqKi8KLQotICBwdWJsaWMgVmVjdG9yIGdldEVsZW1lbnRzQnlOYW1lKFN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgKiBBZGRzIGEgbm9kZSB0byB0aGUgbW9kZWwuIElmIHRoZSBub2RlIGFscmVhZHkgYmVsb25ncyB0byBhbm90aGVyCi0gICogbW9kZWwgdGhlbiBpdCB3aWxsIG5vdCBiZSBhZGRlZC4KLSAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBhZGQuIFRoaXMgbXVzdCBub3QgYmUgbnVsbC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgbm9kZSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5LgotICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIGdpdmVuIG5vZGUgYWxyZWFkeSBiZWxvbmdzIHRvCi0gICogdGhlIGN1cnJlbnQgbW9kZWwgb3IgdG8gYW5vdGhlciBtb2RlbC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWRkRWxlbWVudCAoIEVsZW1lbnQgZWxlbWVudCApOwotCi0gIC8qKgotICAqIFJlbW92ZXMgYSBub2RlIGZyb20gdGhlIG1vZGVsLgotICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIHJlbW92ZS4gVGhpcyBtdXN0IG5vdCBiZSBudWxsLgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBub2RlIHdhcyByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KLSAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlIGlmIHRoZSBnaXZlbiBub2RlIGRvZXMgbm90IGJlbG9uZwotICAqIHRvIHRoaXMgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZW1lbnQgKCBFbGVtZW50IGVsZW1lbnQgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBub2RlcyBpbiB0aGUgbW9kZWwgYW5kIGluIG5vCi0gICogcGFydGljdWxhciBvcmRlciwKLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIEFuIGVudW1lcmF0aW9uIG9mIGFsbCBub2RlcyBpbiB0aGUgbW9kZWwuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RWxlbWVudHMgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBtb2RlbC4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBtb2RlbC4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUuCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZFbGVtZW50cyAoKTsKLQotICAvKioKLSAgKiBEZXRlcm1pbmVzIGlmIHRoaXMgbW9kZWwgY29udGFpbnMgdGhlIGdpdmVuIG5vZGUuCi0gICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gY2hlY2sgZm9yLiBUaGlzIG11c3Qgbm90IGJlIG51bGwuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBub2RlLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VsZW1lbnQgKCBFbGVtZW50IGVsZW1lbnQgKTsKLQotICAvKgotICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIHRoZSBuZXh0IG51bWJlciBpbiB0aGUgcXVldWUgZm9yIHRoZSBNVUlECi0gICoKLSAgKi8KLSAgcHVibGljIGludCBnZXRVbmlxdWVOdW1iZXIoKTsKLQotICAvKgotICAqIGhlcmVzIHdoYXQgd2UgY2FsbCBmcm9tIHRoZSBlbGVtZW50Ci0gICovCi0gIHB1YmxpYyBTdHJpbmcgbWFrZU1VSUQoU3RyaW5nIG5hbWUpOwotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzkzYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogVGhpcyBpcyB0aGUgYWJzdHJhY3QgY2xhc3MgZm9yIHByb3BlcnRpZXMgb2YgYSBOb2RlLgotKiBFdmVyeSBwcm9wZXJ0eSBoYXMgYW4gaW1tdXRhYmxlIG5hbWUgYW5kIGEgdmFsdWUgb2YgdHlwZSBPYmplY3QuCi0qLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIEV2ZXJ5IE5vZGUgaGFzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiB0aGF0IGlzIGVxdWl2YWxlbnQKLSAgKiB0byBhbmQga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBOb2RlLmdldE5hbWUoKSBhbmQgTm9kZS5zZXROYW1lKCkuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNoYWxsb3cgY2xvbmUgb2YgdGhpcyA8Y29kZT5Qcm9wZXJ0eTwvY29kZT4uCi0gICogUHJvcGVydHkga2V5IGFuZCB2YWx1ZSByZWZlcmVuY2VzIGFyZSBjbG9uZWQsCi0gICogYnV0IHRoZSB2YWx1ZSBvYmplY3RzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCi0gICogQHJldHVybiBQcm9wZXJ0eSBBIG5ldyBQcm9wZXJ0eS4KLSAgKi8KLSAgcHVibGljIFByb3BlcnR5IHNoYWxsb3dDbG9uZSAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbm9kZS4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgbmFtZSBvZiB0aGlzIG5vZGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLQotICAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgotICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LiBBbnkgcHJldmlvdXMgdmFsdWUgaXMgcmVwbGFjZWQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlICggT2JqZWN0IHZhbHVlICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgKiBAcmV0dXJuIE9iamVjdCBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSwgcG9zc2libHkgbnVsbC4KLSAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSAoKTsKLQotICAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGFzIGEgc3RyaW5nLgotICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHRvIHNldC4gQW55IHByZXZpb3VzIHZhbHVlIGlzIHJlcGxhY2VkLgotICAqIFRoZSB0eXBlIG9mIHRoZSBwcmV2aW91cyB2YWx1ZSwgaWYgYW55LCBpcyBvZiBubyBjb25zZXF1ZW5jZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsdWVBc1N0cmluZyAoIFN0cmluZyB2YWx1ZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgYXMgYSBzdHJpbmcuCi0gICogQHJldHVybiBTdHJpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgYXMgYSBzdHJpbmcsIHBvc3NpYmx5IG51bGwuCi0gICogSWYgdGhlIHNldCB2YWx1ZSBpcyBhbiBhcmJpdHJhcnkgT2JqZWN0LCB0aGVuIE9iamVjdC50b1N0cmluZygpIGlzCi0gICogcmV0dXJuZWQuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZyAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5QWRkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5QWRkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmYzA1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eUFkZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0qIENhcnJpZXMgZGF0YSByZWxldmFudCB0byB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUFkZEV2ZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIG1vZGVsIHRoZSBjaGFuZ2VkLgotICAqLwotICBwcm90ZWN0ZWQgQmFzaWNFbGVtZW50IGZFbGVtZW50OwotCi0gIC8qKgotICAqIFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBhZGRlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIFByb3BlcnR5IGZQcm9wZXJ0eTsKLQotIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdGhhdCBjaGFuZ2VkLgotICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHlBZGRFdmVudCAoIEJhc2ljRWxlbWVudCBlbGVtZW50LCBQcm9wZXJ0eSBwcm9wZXJ0eSkKLSAgewotICAgIGZFbGVtZW50ID0gZWxlbWVudDsKLSAgICBmUHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGF0IGNoYW5nZWQgKHRoYXQgcHJvZHVjZWQgdGhpcyBldmVudCkuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqLwotICBwdWJsaWMgQmFzaWNFbGVtZW50IGdldEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBwcm9wZXJ0eSB0aGF0IHdhcyBhZGRlZC4KLSAgICogQHJldHVybiBUaW55TW9kZWwgVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKi8KLSAgcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5ICgpCi0gIHsKLSAgICByZXR1cm4gZlByb3BlcnR5OwotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkZTdjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0qIENhcnJpZXMgZGF0YSByZWxldmFudCB0byB3aGVuIGEgcHJvcGVydHkgaXMgY2hhbmdlZCBpbiB0aGUgbW9kZWwuCi0qLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlRXZlbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBCYXNpY0VsZW1lbnQgZkVsZW1lbnQ7Ci0KLSAgLyoqCi0gICogVGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIFByb3BlcnR5IGZQcm9wZXJ0eTsKLQotICAvKioKLSAgKiBUaGUgcHJvcGVydHkncyBvbGQgdmFsdWUuCi0gICovCi0gIHByb3RlY3RlZCBQcm9wZXJ0eSBmT2xkUHJvcGVydHk7Ci0KLSAgIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAgKiBAcGFyYW0gb2xkVmFsdWUgVGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlLgotICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlLgotICAgKi8KLSAgcHVibGljIFByb3BlcnR5Q2hhbmdlRXZlbnQgKCBCYXNpY0VsZW1lbnQgZWxlbWVudCAsIFByb3BlcnR5IHByb3BlcnR5LCBQcm9wZXJ0eSBvbGRQcm9wZXJ0eSApCi0gIHsKLSAgICBmRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgZlByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgZk9sZFByb3BlcnR5ID0gb2xkUHJvcGVydHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbW9kZWwgdGhhdCBjaGFuZ2VkICh0aGF0IHByb2R1Y2VkIHRoaXMgZXZlbnQpLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgbW9kZWwgdGhhdCBjaGFuZ2VkLgotICAgKi8KLSAgcHVibGljIEJhc2ljRWxlbWVudCBnZXRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbW9kZWwgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAgKi8KLSAgcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5ICgpCi0gIHsKLSAgICByZXR1cm4gZlByb3BlcnR5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1vZGVsIHByb3BlcnR5J3Mgb2xkIHZhbHVlLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgcHJvcGVydHkncyBvbGQgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHkgZ2V0T2xkUHJvcGVydHkgKCkKLSAgewotICAgIHJldHVybiBmT2xkUHJvcGVydHk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlSZW1vdmVFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlSZW1vdmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTQ2OGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5UmVtb3ZlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogQ2FycmllcyBkYXRhIHJlbGV2YW50IHRvIHdoZW4gYSBwcm9wZXJ0eSBpcyByZW1vdmVkIGZyb20gdGhlIG1vZGVsLgotKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVJlbW92ZUV2ZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIG1vZGVsIHRoZSBjaGFuZ2VkLgotICAqLwotICBwcm90ZWN0ZWQgQmFzaWNFbGVtZW50IGZFbGVtZW50OwotCi0gIC8qKgotICAqIFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyByZW1vdmVkLgotICAqLwotICBwcm90ZWN0ZWQgUHJvcGVydHkgZlByb3BlcnR5OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdGhhdCB3YXMgcmVtb3ZlZC4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSBwcm9wZXJ0eSdzIHZhbHVlLgotICAgKi8KLSAgcHVibGljIFByb3BlcnR5UmVtb3ZlRXZlbnQgKCBCYXNpY0VsZW1lbnQgZWxlbWVudCwgUHJvcGVydHkgcHJvcGVydHkpCi0gIHsKLSAgICBmRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgZlByb3BlcnR5ID0gcHJvcGVydHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbW9kZWwgdGhhdCBjaGFuZ2VkICh0aGF0IHByb2R1Y2VkIHRoaXMgZXZlbnQpLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgbW9kZWwgdGhhdCBjaGFuZ2VkLgotICAgKi8KLSAgcHVibGljIEJhc2ljRWxlbWVudCBnZXRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbW9kZWwgcHJvcGVydHkgdGhhdCB3YXMgcmVtb3ZlZC4KLSAgICogQHJldHVybiBUaW55TW9kZWwgVGhlIHByb3BlcnR5IHRoYXQgd2FzIHJlbW92ZWQuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkgKCkKLSAgewotICAgIHJldHVybiBmUHJvcGVydHk7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9SZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjFhNmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgcmVsYXRpb25zaGlwcyBpbiBhIE1vZGVsLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVsCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHJlbGF0aW9uc2hpcC4gUmVsYXRpb25zaGlwIG5hbWVzCi0gICogY2Fubm90IGJlIGNoYW5nZWQuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5vZGUgdGhhdCBvd25zIHRoaXMgcmVsYXRpb25zaGlwLgotICAqIEByZXR1cm4gTm9kZSBUaGUgbm9kZSB0aGF0IG93bnMgdGhpcyByZWxhdGlvbnNoaXAuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLCB0aGF0IGlzLCByZWxhdGlvbnNoaXBzCi0gICogY2Fubm90IGV4aXN0IGluIHRoZSBhYnNlbmNlIG9mIGEgbm9kZS4KLSAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0U291cmNlRWxlbWVudCgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIG5vZGVzIGluIHRoaXMgcmVsYXRpb25zaGlwLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gVGhlIG5vZGVzIGluIHRoaXMgcmVsYXRpb25zaGlwLgotICAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbC4KLSAgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFRhcmdldEVsZW1lbnRzICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGlzIHJlbGF0aW9uc2hpcC4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoaXMgcmVsYXRpb25zaGlwLgotICAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlRhcmdldEVsZW1lbnRzICgpOwotCi0gIC8qKgotICAqIEFkZHMgYSBjb25uZWN0aW9uIHRvIHRoaXMgcmVsYXRpb25zaGlwLiBUaGlzIG1ldGhvZCBpcwotICAqIGludGVuZGVkIGZvciB1c2UgYnkgZGVyaXZhdGlvbnMgb2YgdGhlIE1vZGVsIGZyYW1ld29yaywKLSAgKiBub3QgYnkgdXNlcnMgb2YgdGhlIGZyYW1ld29yay4gQ29ubmVjdGlvbiBvYmplY3RzIHNob3VsZAotICAqIG9ubHkgYmUgY29uc3RydWN0ZWQsIGFkZGVkLCByZW1vdmVkIGFuZCByZXRyaWV2ZWQgYnkKLSAgKiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIE5vZGUgYW5kIFJlbCBpbnRlcmZhY2VzLgotICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIGFkZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbiAoIENvbm5lY3Rpb24gY29ubmVjdGlvbiApOwotCi0gIC8qKgotICAqIFJlbW92ZXMgYSBjb25uZWN0aW9uIGZyb20gdGhpcyByZWxhdGlvbnNoaXAuIFRoaXMgbWV0aG9kIGlzCi0gICogaW50ZW5kZWQgZm9yIHVzZSBieSBkZXJpdmF0aW9ucyBvZiB0aGUgTW9kZWwgZnJhbWV3b3JrLAotICAqIG5vdCBieSB1c2VycyBvZiB0aGUgZnJhbWV3b3JrLiBDb25uZWN0aW9uIG9iamVjdHMgc2hvdWxkCi0gICogb25seSBiZSBjb25zdHJ1Y3RlZCwgYWRkZWQsIHJlbW92ZWQgYW5kIHJldHJpZXZlZCBieQotICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgTm9kZSBhbmQgUmVsIGludGVyZmFjZXMuCi0gICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gcmVtb3ZlLgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBjb25uZWN0aW9uIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29ubmVjdGlvbiAoIENvbm5lY3Rpb24gY29ubmVjdGlvbiApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIENvbm5lY3Rpb24gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gdGFyZ2V0IG5vZGUuCi0gICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBkZXJpdmF0aW9ucyBvZiB0aGUgTW9kZWwKLSAgKiBmcmFtZXdvcmssIG5vdCBieSB1c2VycyBvZiB0aGUgZnJhbWV3b3JrLiBDb25uZWN0aW9uIG9iamVjdHMKLSAgKiBzaG91bGQgb25seSBiZSBjb25zdHJ1Y3RlZCwgYWRkZWQsIHJlbW92ZWQgYW5kIHJldHJpZXZlZCBieQotICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgTm9kZSBhbmQgUmVsIGludGVyZmFjZXMuCi0gICogQHBhcmFtIHRhcmdldE5vZGUgVGhlIG5vZGUgdG8gZmluZCB0aGUgQ29ubmVjdGlvbiB0by4KLSAgKiBAcmV0dXJuIENvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24sIG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvblRvICggRWxlbWVudCB0YXJnZXRFbGVtZW50ICk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbEFkZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9SZWxBZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWExMGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbEFkZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBDYXJyaWVzIGRhdGEgcmVsZXZhbnQgdG8gd2hlbiBhIHByb3BlcnR5IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KLSovCi1wdWJsaWMgY2xhc3MgUmVsQWRkRXZlbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBDb25uZWN0aW9uIGZPdXRCb3VuZDsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBDb25uZWN0aW9uIGZJbkJvdW5kOwotCi0gIC8qKgotICAqIFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBhZGRlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIFByb3BlcnR5IGZQcm9wZXJ0eTsKLQotIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdGhhdCBjaGFuZ2VkLgotICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUmVsQWRkRXZlbnQgKENvbm5lY3Rpb25bXSBwYWlyKQotICB7Ci0gICAgIGZPdXRCb3VuZCA9IHBhaXJbQmFzaWNDb25uZWN0aW9uLk9VVEJPVU5EXTsKLSAgICAgZkluQm91bmQgPSBwYWlyW0Jhc2ljQ29ubmVjdGlvbi5JTkJPVU5EXTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBvdXRib3VuZCBjb25uZWN0aW9uIHRoYXQgY2hhbmdlZCAKLSAgKiovCi0gIHB1YmxpYyBDb25uZWN0aW9uIGdldE91dEJvdW5kQ29ubmVjdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIGZPdXRCb3VuZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2VkIHJlbCBuYW1lIAotICAqKi8KLSAgcHVibGljIFN0cmluZyBnZXRPdXRCb3VuZFJlbE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZPdXRCb3VuZC5nZXRSZWwoKS5nZXROYW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhbmdlZCByZWwKLSAgKiovCi0gIHB1YmxpYyBSZWwgZ2V0T3V0Qm91bmRSZWwoKQotICB7Ci0gICAgcmV0dXJuIGZPdXRCb3VuZC5nZXRSZWwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2VkIHJlbCBuYW1lIAotICAqKi8KLSAgcHVibGljIFN0cmluZyBnZXRJbkJvdW5kUmVsTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZkluQm91bmQuZ2V0UmVsKCkuZ2V0TmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsCi0gICoqLwotICBwdWJsaWMgUmVsIGdldEluQm91bmRSZWwoKQotICB7Ci0gICAgcmV0dXJuIGZJbkJvdW5kLmdldFJlbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG91dGJvdW5kIGVsZW1lbnQgdGhhdCBjaGFuZ2VkIAotICAqKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudCAoKQotICB7Ci0gICAgcmV0dXJuIGZPdXRCb3VuZC5nZXRFbGVtZW50KCk7Ci0gIH0KLQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluYm91bmQgY29ubmVjdGlvbiB0aGF0IGNoYW5nZWQgCi0gICoqLwotICBwdWJsaWMgRWxlbWVudCBnZXRDaGlsZEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmSW5Cb3VuZC5nZXRFbGVtZW50KCk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsUmVtb3ZlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbFJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZmE0ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsUmVtb3ZlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBDYXJyaWVzIGRhdGEgcmVsZXZhbnQgdG8gd2hlbiBhIHByb3BlcnR5IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KLSovCi1wdWJsaWMgY2xhc3MgUmVsUmVtb3ZlRXZlbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBDb25uZWN0aW9uIGZPdXRCb3VuZDsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBDb25uZWN0aW9uIGZJbkJvdW5kOwotCi0gIC8qKgotICAqIFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBhZGRlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIFByb3BlcnR5IGZQcm9wZXJ0eTsKLQotIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdGhhdCBjaGFuZ2VkLgotICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUmVsUmVtb3ZlRXZlbnQgKENvbm5lY3Rpb25bXSBwYWlyKQotICB7Ci0gICAgIGZPdXRCb3VuZCA9IHBhaXJbQmFzaWNDb25uZWN0aW9uLk9VVEJPVU5EXTsKLSAgICAgZkluQm91bmQgPSBwYWlyW0Jhc2ljQ29ubmVjdGlvbi5JTkJPVU5EXTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGF0IGNoYW5nZWQgKHRoYXQgcHJvZHVjZWQgdGhpcyBldmVudCkuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqLwotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRPdXRCb3VuZCAoKQotICB7Ci0gICAgcmV0dXJuIGZPdXRCb3VuZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBwcm9wZXJ0eSB0aGF0IHdhcyBhZGRlZC4KLSAgICogQHJldHVybiBUaW55TW9kZWwgVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKi8KLSAgcHVibGljIENvbm5lY3Rpb24gZ2V0SW5Cb3VuZCAoKQotICB7Ci0gICAgcmV0dXJuIGZJbkJvdW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsIG5hbWUgCi0gICoqLwotICBwdWJsaWMgU3RyaW5nIGdldE91dEJvdW5kUmVsTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldFJlbCgpLmdldE5hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2VkIHJlbAotICAqKi8KLSAgcHVibGljIFJlbCBnZXRPdXRCb3VuZFJlbCgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldFJlbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsIG5hbWUgCi0gICoqLwotICBwdWJsaWMgU3RyaW5nIGdldEluQm91bmRSZWxOYW1lKCkKLSAgewotICAgIHJldHVybiBmSW5Cb3VuZC5nZXRSZWwoKS5nZXROYW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhbmdlZCByZWwKLSAgKiovCi0gIHB1YmxpYyBSZWwgZ2V0SW5Cb3VuZFJlbCgpCi0gIHsKLSAgICByZXR1cm4gZkluQm91bmQuZ2V0UmVsKCk7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG91dGJvdW5kIGVsZW1lbnQgdGhhdCBjaGFuZ2VkIAotICAqKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0T3V0Qm91bmRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldEVsZW1lbnQoKTsKLSAgfQotCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5ib3VuZCBjb25uZWN0aW9uIHRoYXQgY2hhbmdlZCAKLSAgKiovCi0gIHB1YmxpYyBFbGVtZW50IGdldEluYm91bmRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZkluQm91bmQuZ2V0RWxlbWVudCgpOwotICB9Ci0gIAotCi0gIAotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9uaXRvci9HZXRNb25pdG9yQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb25pdG9yL0dldE1vbml0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMDgwZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb25pdG9yL0dldE1vbml0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwubW9uaXRvcjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5JTW9uaXRvcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuTW9uaXRvckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuV1NQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgR2V0TW9uaXRvckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQlwcml2YXRlIGJvb2xlYW4gbW9uaXRvclNlcnZpY2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY3JlYXRlOwotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLQotCXByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0KLQlwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotCi0JcHVibGljIEdldE1vbml0b3JDb21tYW5kKCkgewotCQlzdXBlcigKLQkJCQkib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkdldE1vbml0b3JDb21tYW5kIiwKLQkJCQkib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkdldE1vbml0b3JDb21tYW5kIik7Ci0JCW1vbml0b3JTZXJ2aWNlID0gdHJ1ZTsKLQkJY3JlYXRlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0JCWVuZHBvaW50cyA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKG1vbml0b3JTZXJ2aWNlICYmIHdlYlNlcnZpY2VzUGFyc2VyICE9IG51bGwgJiYgd3NkbFVSSSAhPSBudWxsCi0JCQkJJiYgd3NkbFVSSS5sZW5ndGgoKSA+IDApIHsKLQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdlYlNlcnZpY2VzUGFyc2VyCi0JCQkJCS5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJJKTsKLQkJCWlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLQkJCQlNYXAgc2VydmljZXMgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBzZXJ2aWNlc0l0ID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgc2VydmljZXNJdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VzSXQubmV4dCgpOwotCQkJCQlNYXAgcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgcG9ydHNJdCA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHBvcnRzSXQKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUG9ydCB3c2RsUG9ydCA9IChQb3J0KSBwb3J0c0l0Lm5leHQoKTsKLQkJCQkJCUxpc3QgZXh0RWxlbWVudHMgPSB3c2RsUG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgZXh0RWxlbWVudHNJdCA9IGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IGV4dEVsZW1lbnRzSXQKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtZW50c0l0Ci0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCVN0cmluZyBlbmRwb2ludCA9IG51bGw7Ci0JCQkJCQkJVVJMIGVuZHBvaW50VVJMID0gbnVsbDsKLQkJCQkJCQlpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKQotCQkJCQkJCQllbmRwb2ludCA9ICgoU09BUEFkZHJlc3MpIGV4dEVsZW1lbnQpCi0JCQkJCQkJCQkJLmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCQkJZWxzZSBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIEhUVFBBZGRyZXNzKQotCQkJCQkJCQllbmRwb2ludCA9ICgoSFRUUEFkZHJlc3MpIGV4dEVsZW1lbnQpCi0JCQkJCQkJCQkJLmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCQkJaWYgKGVuZHBvaW50ICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWVuZHBvaW50VVJMID0gbmV3IFVSTChlbmRwb2ludCk7Ci0JCQkJCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkgewotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChlbmRwb2ludFVSTCAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBwcm90b2NvbCA9IGVuZHBvaW50VVJMLmdldFByb3RvY29sKCk7Ci0JCQkJCQkJCVN0cmluZyBob3N0ID0gZW5kcG9pbnRVUkwuZ2V0SG9zdCgpOwotCQkJCQkJCQlpbnQgcG9ydCA9IGVuZHBvaW50VVJMLmdldFBvcnQoKTsKLQkJCQkJCQkJaWYgKHBvcnQgPT0gLTEpIHsKLQkJCQkJCQkJCWlmICgiaHR0cCIuZXF1YWxzSWdub3JlQ2FzZShwcm90b2NvbCkpCi0JCQkJCQkJCQkJcG9ydCA9IDgwOwotCQkJCQkJCQkJZWxzZSBpZiAoImh0dHBzIi5lcXVhbHNJZ25vcmVDYXNlKHByb3RvY29sKSkKLQkJCQkJCQkJCQlwb3J0ID0gNDQzOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChwcm90b2NvbCAhPSBudWxsCi0JCQkJCQkJCQkJJiYgcHJvdG9jb2wuc3RhcnRzV2l0aCgiaHR0cCIpCi0JCQkJCQkJCQkJJiYgaG9zdCAhPSBudWxsICYmIGhvc3QubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCQkJJiYgcG9ydCAhPSAtMSkgewotCQkJCQkJCQkJSU1vbml0b3IgbSA9IG51bGw7Ci0JCQkJCQkJCQlJTW9uaXRvcltdIG1vbml0b3JzID0gTW9uaXRvckNvcmUKLQkJCQkJCQkJCQkJLmdldE1vbml0b3JzKCk7Ci0JCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1vbml0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJaWYgKGhvc3QuZXF1YWxzSWdub3JlQ2FzZShtb25pdG9yc1tpXQotCQkJCQkJCQkJCQkJLmdldFJlbW90ZUhvc3QoKSkKLQkJCQkJCQkJCQkJCSYmIHBvcnQgPT0gbW9uaXRvcnNbaV0KLQkJCQkJCQkJCQkJCQkJLmdldFJlbW90ZVBvcnQoKSkgewotCQkJCQkJCQkJCQltID0gbW9uaXRvcnNbaV07Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChtID09IG51bGwgJiYgY3JlYXRlKSB7Ci0JCQkJCQkJCQkJaW50IG1vbml0b3JlZFBvcnQgPSBTb2NrZXRVdGlsCi0JCQkJCQkJCQkJCQkuZmluZFVudXNlZFBvcnQoNTAwMCwgMTUwMDApOwotCQkJCQkJCQkJCUlNb25pdG9yV29ya2luZ0NvcHkgbW9uaXRvcldvcmtpbmdDb3B5ID0gTW9uaXRvckNvcmUKLQkJCQkJCQkJCQkJCS5jcmVhdGVNb25pdG9yKCk7Ci0JCQkJCQkJCQkJbW9uaXRvcldvcmtpbmdDb3B5Ci0JCQkJCQkJCQkJCQkuc2V0TG9jYWxQb3J0KG1vbml0b3JlZFBvcnQpOwotCQkJCQkJCQkJCW1vbml0b3JXb3JraW5nQ29weS5zZXRSZW1vdGVIb3N0KGhvc3QpOwotCQkJCQkJCQkJCW1vbml0b3JXb3JraW5nQ29weS5zZXRSZW1vdGVQb3J0KHBvcnQpOwotCQkJCQkJCQkJCW1vbml0b3JXb3JraW5nQ29weS5zZXRQcm90b2NvbCgiSFRUUCIpOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCW0gPSBtb25pdG9yV29ya2luZ0NvcHkuc2F2ZSgpOwotCQkJCQkJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCQkJCQkJCVN0YXR1cyB3YXJuaW5nID0gbmV3IFNpbXBsZVN0YXR1cygKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2Uud3N0LndzIiwKLQkJCQkJCQkJCQkJCQlXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygKLQkJCQkJCQkJCQkJCQkJCQkJIk1TR19FUlJPUl9VTkFCTEVfVE9fU1RBUlRfTU9OSVRPUiIsCi0JCQkJCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJU3RyaW5nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkudmFsdWVPZihwb3J0KSwKLQkJCQkJCQkJCQkJCQkJCQkJCQllbmRwb2ludCB9KSwKLQkJCQkJCQkJCQkJCQlTdGF0dXMuV0FSTklORywgdCk7Ci0JCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCQlpZiAoZW52ICE9IG51bGwpCi0JCQkJCQkJCQkJCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKQotCQkJCQkJCQkJCQkJCQkJLnJlcG9ydCh3YXJuaW5nKTsKLQkJCQkJCQkJCQkJfSBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKSB7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAobSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJaWYgKCFtLmlzUnVubmluZygpKQotCQkJCQkJCQkJCQkJbS5zdGFydCgpOwotCQkJCQkJCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKAotCQkJCQkJCQkJCQkJCWVuZHBvaW50VVJMLmdldFByb3RvY29sKCkpOwotCQkJCQkJCQkJCQlzYi5hcHBlbmQoIjovL2xvY2FsaG9zdDoiKTsKLQkJCQkJCQkJCQkJc2IuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG0KLQkJCQkJCQkJCQkJCQkuZ2V0TG9jYWxQb3J0KCkpKTsKLQkJCQkJCQkJCQkJc2IuYXBwZW5kKGVuZHBvaW50VVJMLmdldEZpbGUoKSk7Ci0JCQkJCQkJCQkJCWVuZHBvaW50cy5hZGQoc2IudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJCQkJCQkJU3RhdHVzIHdhcm5pbmcgPSBuZXcgU2ltcGxlU3RhdHVzKAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS53c3Qud3MiLAotCQkJCQkJCQkJCQkJCVdTUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKAotCQkJCQkJCQkJCQkJCQkJCQkiTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SIiwKLQkJCQkJCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQkJCQkJCQlTdHJpbmcKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS52YWx1ZU9mKHBvcnQpLAotCQkJCQkJCQkJCQkJCQkJCQkJCWVuZHBvaW50IH0pLAotCQkJCQkJCQkJCQkJCVN0YXR1cy5XQVJOSU5HLCB0KTsKLQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCWlmIChlbnYgIT0gbnVsbCkKLQkJCQkJCQkJCQkJCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpCi0JCQkJCQkJCQkJCQkJCQkucmVwb3J0KHdhcm5pbmcpOwotCQkJCQkJCQkJCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gc2UpIHsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoYm9vbGVhbiBtb25pdG9yU2VydmljZSkgewotCQl0aGlzLm1vbml0b3JTZXJ2aWNlID0gbW9uaXRvclNlcnZpY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikgewotCQl0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkgewotCQl0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENyZWF0ZShib29sZWFuIGNyZWF0ZSkgewotCQl0aGlzLmNyZWF0ZSA9IGNyZWF0ZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFbmRwb2ludHMoKSB7Ci0JCXJldHVybiBlbmRwb2ludHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmOTFmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuSUNvbW1hbmRGYWN0b3J5OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYlNlcnZpY2UgaW1wbGVtZW50cyBJV2ViU2VydmljZSB7Ci0JCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlSW5mbyBpbmZvOwotCi0JcHVibGljIEFic3RyYWN0V2ViU2VydmljZShXZWJTZXJ2aWNlSW5mbyBpbmZvKSB7Ci0JCXRoaXMuaW5mbyA9IGluZm87Ci0JfQotCQotCi0JcHVibGljIFdlYlNlcnZpY2VJbmZvIGdldFdlYlNlcnZpY2VJbmZvKCkgewotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBkZXBsb3koRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JCi0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGRldmVsb3AoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBydW4oRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTliYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50IGltcGxlbWVudHMgSVdlYlNlcnZpY2VDbGllbnQgewotCQotCXByaXZhdGUgV2ViU2VydmljZUNsaWVudEluZm8gaW5mbzsKLQotCXB1YmxpYyBBYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQoV2ViU2VydmljZUNsaWVudEluZm8gaW5mbykgewotCQl0aGlzLmluZm8gPSBpbmZvOwotCX0KLQkKLQotCXB1YmxpYyBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBnZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpIHsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsKLQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsKLQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgcnVuKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmMjg3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuSUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZSBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlUnVudGltZSB7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSVdlYlNlcnZpY2UgZ2V0V2ViU2VydmljZSgpOwotCS8qKgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJV2ViU2VydmljZUNsaWVudCBnZXRXZWJTZXJ2aWNlQ2xpZW50KCk7Ci0JLyoqCi0JICovCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhbm5vdW5jZShJV2ViU2VydmljZSB3ZWJTZXJ2aWNlKQotCXsKLQkJLy9UT0RPIHByb3ZpZGUgYSBib2lsZXItcGxhdGUgYW5ub3VuY2UgaW1wbGVtZW50YXRpb24uCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDZhODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRleHQgewotCQotCXB1YmxpYyBib29sZWFuIGdldEFzc2VtYmxlKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2hlY2tPdXRGaWxlcygpOwotCQotCXB1YmxpYyBib29sZWFuIGdldENsaWVudCgpOwotCQotCXB1YmxpYyBib29sZWFuIGdldENyZWF0ZUZvbGRlcnMoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3koKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXREZXZlbG9wKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5zdGFsbCgpOwotCQotCXB1YmxpYyBib29sZWFuIGdldE92ZXJXcml0ZUZpbGVzKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaCgpOwotCQotCXB1YmxpYyBib29sZWFuIGdldFJ1bigpOwotCQotCXB1YmxpYyBXZWJTZXJ2aWNlU2NlbmFyaW8gZ2V0U2NlbmFyaW8oKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRUZXN0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JU2VsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzA1NzQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNlbGVjdGlvbiB7Ci0JCi0JU3RyaW5nW10gZ2V0U2VsZWN0aW9uKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDhlMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuSUNvbW1hbmRGYWN0b3J5OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VJbmZvIGdldFdlYlNlcnZpY2VJbmZvKCk7Ci0JCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsKLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZUNsaWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzNjZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZUNsaWVudCB7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VDbGllbnRJbmZvIGdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCk7Ci0JCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsKLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsJCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZVB1Ymxpc2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlUHVibGlzaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTQ3MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlUHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVB1Ymxpc2hlciB7Ci0JCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBwdWJsaXNoKEVudmlyb25tZW50IGVudiwgSVdlYlNlcnZpY2Ugd3MpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2VSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODJlMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlUnVudGltZSB7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIElXZWJTZXJ2aWNlIGdldFdlYlNlcnZpY2UoKTsKLQkvKioKLQkgKi8KLQlwdWJsaWMgSVdlYlNlcnZpY2VDbGllbnQgZ2V0V2ViU2VydmljZUNsaWVudCgpOwotCS8qKgotCSAqLwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYW5ub3VuY2UoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZVRlc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlVGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjMxZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVRlc3RlciB7Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdlbmVyYXRlKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBsYXVuY2goRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlQ2xpZW50SW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VDbGllbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0N2UwNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VDbGllbnRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50SW5mbyB7Ci0KLQlwcml2YXRlIFdlYlNlcnZpY2VTdGF0ZSBzdGF0ZTsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmxldExldmVsOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBqMmVlTGV2ZWw7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNlcnZlckZhY3RvcnlJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmVySW5zdGFuY2VJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgd2ViU2VydmljZVJ1bnRpbWVJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgd3NkbFVSTDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaW1wbFVSTDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NzZhMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlSW5mbyB7Ci0KLQlwcml2YXRlIFdlYlNlcnZpY2VTdGF0ZSBzdGF0ZTsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmxldExldmVsOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBqMmVlTGV2ZWw7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNlcnZlckZhY3RvcnlJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmVySW5zdGFuY2VJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgd2ViU2VydmljZVJ1bnRpbWVJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgd3NkbFVSTDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZW5kUG9pbnRVUkw7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGltcGxVUkw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvV2ViU2VydmljZVNjZW5hcmlvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvV2ViU2VydmljZVNjZW5hcmlvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNDRkOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VTY2VuYXJpby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViU2VydmljZVNjZW5hcmlvIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yCi17Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NVVAgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1BET1dOID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UID0gMjsKLSAgCi0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTY2VuYXJpbyBCT1RUT01VUF9MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTY2VuYXJpbyhCT1RUT01VUCwgIkJPVFRPTVVQIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVNjZW5hcmlvIFRPUERPV05fTElURVJBTCA9IG5ldyBXZWJTZXJ2aWNlU2NlbmFyaW8oVE9QRE9XTiwgIlRPUERPV04iKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU2NlbmFyaW8gQ0xJRU5UX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVNjZW5hcmlvKENMSUVOVCwgIkNMSUVOVCIpOwotCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2ViU2VydmljZVNjZW5hcmlvW10gVkFMVUVTX0FSUkFZID0KLSAgICBuZXcgV2ViU2VydmljZVNjZW5hcmlvW10KLSAgICB7Ci0JICBCT1RUT01VUF9MSVRFUkFMLAotCSAgVE9QRE9XTl9MSVRFUkFMLAotCSAgQ0xJRU5UX0xJVEVSQUwsCi0gICAgfTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlU2NlbmFyaW8gZ2V0KFN0cmluZyBuYW1lKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0gICAgewotICAgICAgV2ViU2VydmljZVNjZW5hcmlvIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLSAgICAgIGlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VTY2VuYXJpbyBnZXQoaW50IHZhbHVlKQotICB7Ci0gICAgc3dpdGNoICh2YWx1ZSkKLSAgICB7Ci0gICAgICBjYXNlIEJPVFRPTVVQOiByZXR1cm4gQk9UVE9NVVBfTElURVJBTDsKLSAgICAgIGNhc2UgVE9QRE9XTjogcmV0dXJuIFRPUERPV05fTElURVJBTDsKLSAgICAgIGNhc2UgQ0xJRU5UOiByZXR1cm4gQ0xJRU5UX0xJVEVSQUw7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwkKLSAgfQotCi0gIC8qKgotICAgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcml2YXRlIFdlYlNlcnZpY2VTY2VuYXJpbyhpbnQgdmFsdWUsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIodmFsdWUsIG5hbWUpOwotICB9Ci0KLX0gLy9XZWJTZXJ2aWNlU2NlbmFyaW8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEzZWRhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvV2ViU2VydmljZVN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJTZXJ2aWNlU3RhdGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWRUxPUEVEID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTRU1CTEVEID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVQTE9ZRUQgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMRUQgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HID0gNTsKLSAgCi0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTdGF0ZSBVTktOT1dOX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKFVOS05PV04sICJVTktOT1dOIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVN0YXRlIERFVkVMT1BFRF9MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTdGF0ZShERVZFTE9QRUQsICJERVZFTE9QRUQiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU3RhdGUgQVNTRU1CTEVEX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKEFTU0VNQkxFRCwgIkFTU0VNQkxFRCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTdGF0ZSBERVBMT1lFRF9MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTdGF0ZShERVBMT1lFRCwgIkRFUExPWUVEIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVN0YXRlIElOU1RBTExFRF9MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTdGF0ZShJTlNUQUxMRUQsICJJTlNUQUxMRUQiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU3RhdGUgUlVOTklOR19MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTdGF0ZShSVU5OSU5HLCAiUlVOTklORyIpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTdGF0ZVtdIFZBTFVFU19BUlJBWSA9Ci0gICAgbmV3IFdlYlNlcnZpY2VTdGF0ZVtdCi0gICAgewotCSAgVU5LTk9XTl9MSVRFUkFMLAotCSAgREVWRUxPUEVEX0xJVEVSQUwsCi0JICBBU1NFTUJMRURfTElURVJBTCwKLQkgIERFUExPWUVEX0xJVEVSQUwsCi0JICBJTlNUQUxMRURfTElURVJBTCwKLQkgIFJVTk5JTkdfTElURVJBTCwKLSAgICB9OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VTdGF0ZSBnZXQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU3RhdGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVN0YXRlIGdldChpbnQgdmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKHZhbHVlKQotICAgIHsKLSAgICAgIGNhc2UgVU5LTk9XTjogcmV0dXJuIFVOS05PV05fTElURVJBTDsKLSAgICAgIGNhc2UgREVWRUxPUEVEOiByZXR1cm4gREVWRUxPUEVEX0xJVEVSQUw7Ci0gICAgICBjYXNlIEFTU0VNQkxFRDogcmV0dXJuIEFTU0VNQkxFRF9MSVRFUkFMOwotCSAgY2FzZSBERVBMT1lFRDogcmV0dXJuIERFUExPWUVEX0xJVEVSQUw7Ci0JICBjYXNlIElOU1RBTExFRDogcmV0dXJuIElOU1RBTExFRF9MSVRFUkFMOwotCSAgY2FzZSBSVU5OSU5HOiByZXR1cm4gUlVOTklOR19MSVRFUkFMOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsJCi0gIH0KLQotICAvKioKLSAgICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlU3RhdGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKHZhbHVlLCBuYW1lKTsKLSAgfQotCi19IC8vV2ViU2VydmljZVN0YXRlCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NpbC9BZGRXU0RMVG9XU0lMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2lsL0FkZFdTRExUb1dTSUxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MTg3NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2lsL0FkZFdTRExUb1dTSUxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuQWJzdHJhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5JbnNwZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24uRXh0ZW5zaW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLndzZGwuSW1wbGVtZW50ZWRCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24ud3NkbC5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi53c2RsLlJlZmVyZW5jZWRTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24ud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC54bWwuWE1MV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUklGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5JbGxlZ2FsQXJndW1lbnRzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV1dXQXV0aGVudGljYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFdTRExUb1dTSUxDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfV1NJTCA9ICItd3NpbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19XU0RMID0gIi13c2RsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHX1JFU09MVkVfV1NETCA9ICItcmVzb2x2ZXdzZGwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FID0gIi1odHRwdXNlcm5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEID0gIi1odHRwcGFzc3dvcmQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZCA9ICJvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuQWRkV1NETFRvV1NJTENvbW1hbmQiOwotICBwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc0J1bmRsZV87Ci0gIHByaXZhdGUgV1dXQXV0aGVudGljYXRpb25IYW5kbGVyIHd3d0F1dGhIYW5kbGVyXzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBhcmdzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NpbF87Ci0gIHByaXZhdGUgQXJyYXlMaXN0IHdzZGxzXzsKLSAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVXU0RMXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cFVzZXJuYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cFBhc3N3b3JkXzsKLQotICBwdWJsaWMgQWRkV1NETFRvV1NJTENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5BZGRXU0RMVG9XU0lMQ29tbWFuZCIsICJvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuQWRkV1NETFRvV1NJTENvbW1hbmQiKTsKLSAgICByZXNCdW5kbGVfID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwud3NpbCIpOwotICAgIHd3d0F1dGhIYW5kbGVyXyA9IG51bGw7Ci0gICAgYXJnc18gPSBuZXcgU3RyaW5nWzBdOwotICAgIGNsZWFyUGFyc2VkQXJncygpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNsZWFyUGFyc2VkQXJncygpCi0gIHsKLSAgICB3c2lsXyA9IG51bGw7Ci0gICAgaWYgKHdzZGxzXyA9PSBudWxsKQotICAgICAgd3NkbHNfID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGVsc2UKLSAgICAgIHdzZGxzXy5jbGVhcigpOwotICAgIHJlc29sdmVXU0RMXyA9IGZhbHNlOwotICAgIGh0dHBVc2VybmFtZV8gPSBudWxsOwotICAgIGh0dHBQYXNzd29yZF8gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGVzIHRoZSBDb21tYW5kLgotICAgKiAKLSAgICogQHBhcmFtIGVudmlyb25tZW50Ci0gICAqICAgICAgICAgICAgVGhlIGVudmlyb25tZW50LiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIEEgPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyB0aGUgZGVncmVlIHRvIHdoaWNoIHRoZQotICAgKiAgICAgICAgIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG1ldGhvZCB3YXMgc3VjY2Vzc2Z1bC4gQSB2YWx1ZCBvZiA8Y29kZT5udWxsPC9jb2RlPiwKLSAgICogICAgICAgICBvciBhIFN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YgbGVzcyB0aGFuIDxjb2RlPlN0YXR1cy5FUlJPUjwvY29kZT4KLSAgICogICAgICAgICBzaWduaWZpZXMgc3VjY2Vzcy4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIFVSSUZhY3RvcnkgdXJpRmFjdG9yeSA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAvLyBQYXJzZSBhcmd1bWVudHMKLSAgICB0cnkKLSAgICB7Ci0gICAgICBwYXJzZUFyZ3VtZW50cygpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50c0V4Y2VwdGlvbiBpYWUpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfSUxMRUdBTF9BUkdVTUVOVFMiKSwgU3RhdHVzLkVSUk9SLCBpYWUpOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfSU5WQUxJRF9BUkdVTUVOVFMiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICB9Ci0gICAgLy8gQ3JlYXRlIG5ldyBXU0lMIGRvY3VtZW50Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2N1bWVudCA9IG51bGw7Ci0gICAgVVJMIHdzaWxVUkwgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIHdzaWxEb2N1bWVudCA9IFdTSUxEb2N1bWVudC5uZXdJbnN0YW5jZSgpOwotICAgICAgd3NpbFVSTCA9IG5ldyBVUkwod3NpbF8pOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX0lOVkFMSURfV1NJTF9VUkkiKSwgU3RhdHVzLkVSUk9SLCBtdXJsZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChXU0lMRXhjZXB0aW9uIHdzaWxlKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OIiksIFN0YXR1cy5FUlJPUiwgd3NpbGUpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvLyBSZWFkIFdTSUwKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbSBpcyA9IHVyaUZhY3RvcnkubmV3VVJJKHdzaWxVUkwpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd3NpbERvY3VtZW50LnJlYWQobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7Ci0gICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChVUklFeGNlcHRpb24gdXJpZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9VTkVYUEVDVEVEX0VYQ0VQVElPTiIpLCBTdGF0dXMuRVJST1IsIHVyaWUpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OIiksIFN0YXR1cy5FUlJPUiwgaW9lKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTSUxFeGNlcHRpb24gd3NpbGUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT04iKSwgU3RhdHVzLkVSUk9SLCB3c2lsZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIGludGVybmFsRXhlY3V0ZQotICAgIFN0cmluZyBodHRwVXNlcm5hbWUgPSBudWxsOwotICAgIFN0cmluZyBodHRwUGFzc3dvcmQgPSBudWxsOwotICAgIGlmICh3c2Rsc18uc2l6ZSgpID09IDEgJiYgaHR0cFVzZXJuYW1lXyAhPSBudWxsICYmIGh0dHBQYXNzd29yZF8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBodHRwVXNlcm5hbWUgPSBodHRwVXNlcm5hbWVfOwotICAgICAgaHR0cFBhc3N3b3JkID0gaHR0cFBhc3N3b3JkXzsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHdzZGxzXy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyB3c2RsID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc3RhdHVzID0gaW50ZXJuYWxFeGVjdXRlKGVudmlyb25tZW50LCB3c2lsRG9jdW1lbnQsIHBsYXRmb3JtMkZpbGUodXJpRmFjdG9yeSwgd3NpbF8pLCB3c2RsLCBodHRwVXNlcm5hbWUsIGh0dHBQYXNzd29yZCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24gd3d3YWUpCi0gICAgICB7Ci0gICAgICAgIGlmICh3d3dBdXRoSGFuZGxlcl8gIT0gbnVsbCAmJiBodHRwVXNlcm5hbWUgPT0gbnVsbCAmJiBodHRwUGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHd3d0F1dGhIYW5kbGVyXy5oYW5kbGVXV1dBdXRoZW50aWNhdGlvbih3d3dhZSk7Ci0gICAgICAgICAgU3RyaW5nIGhhbmRsZXJVc2VybmFtZSA9IHd3d0F1dGhIYW5kbGVyXy5nZXRVc2VybmFtZSgpOwotICAgICAgICAgIFN0cmluZyBoYW5kbGVyUGFzc3dvcmQgPSB3d3dBdXRoSGFuZGxlcl8uZ2V0UGFzc3dvcmQoKTsKLSAgICAgICAgICBpZiAoaGFuZGxlclVzZXJuYW1lICE9IG51bGwgJiYgaGFuZGxlclBhc3N3b3JkICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN0YXR1cyA9IGludGVybmFsRXhlY3V0ZShlbnZpcm9ubWVudCwgd3NpbERvY3VtZW50LCBwbGF0Zm9ybTJGaWxlKHVyaUZhY3RvcnksIHdzaWxfKSwgd3NkbCwgaGFuZGxlclVzZXJuYW1lLCBoYW5kbGVyUGFzc3dvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RhdHVzIHd3d2FlU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9VTlJFU09MVkFCTEVfV1NETCIpLCBTdGF0dXMuRVJST1IsIHd3d2FlMi5nZXRJT0V4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHd3d2FlU3RhdHVzKTsKLSAgICAgICAgICAgICAgcmV0dXJuIHd3d2FlU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdGF0dXMgcyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfVU5SRVNPTFZBQkxFX1dTREwiKSwgU3RhdHVzLkVSUk9SLCB3d3dhZS5nZXRJT0V4Y2VwdGlvbigpKTsKLSAgICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Iocyk7Ci0gICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBTdGF0dXMuT0spCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFdyaXRlIFdTSUwKLSAgICB0cnkKLSAgICB7Ci0gICAgICBYTUxXcml0ZXIgeG1sV3JpdGVyID0gbmV3IFhNTFdyaXRlcigpOwotICAgICAgT3V0cHV0U3RyZWFtIG9zID0gdXJpRmFjdG9yeS5uZXdVUkkod3NpbFVSTCkuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBpZiAob3MgIT0gbnVsbCkKLSAgICAgICAgeG1sV3JpdGVyLndyaXRlRG9jdW1lbnQod3NpbERvY3VtZW50LCBvcyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotICAgICAgb3MuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVSSUV4Y2VwdGlvbiB1cmllKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1dSSVRFX1dTSUwiKSwgU3RhdHVzLkVSUk9SLCB1cmllKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9XUklURV9XU0lMIiksIFN0YXR1cy5FUlJPUiwgaW9lKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTSUxFeGNlcHRpb24gd3NpbGUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfV1JJVEVfV1NJTCIpLCBTdGF0dXMuRVJST1IsIHdzaWxlKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoaWQsICIiLCBTdGF0dXMuT0ssIG51bGwpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdGF0dXMgaW50ZXJuYWxFeGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50LCBXU0lMRG9jdW1lbnQgd3NpbERvY3VtZW50LCBTdHJpbmcgd3NpbCwgU3RyaW5nIHdzZGwsIFN0cmluZyBodHRwVXNlcm5hbWUsIFN0cmluZyBodHRwUGFzc3dvcmQpIHRocm93cyBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICBBcnJheUxpc3Qgd3NkbFNlcnZpY2UgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgQXJyYXlMaXN0IHdzZGxCaW5kaW5nID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChyZXNvbHZlV1NETF8pCi0gICAgewotICAgICAgLy8gUGFyc2UgV1NETAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRlZmluaXRpb24gPSBwYXJzZVdTREwod3NkbCwgd3NkbFNlcnZpY2UsIHdzZGxCaW5kaW5nLCBodHRwVXNlcm5hbWUsIGh0dHBQYXNzd29yZCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgewotICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJJIiksIFN0YXR1cy5FUlJPUiwgbXVybGUpOwotICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgICB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VOUkVTT0xWQUJMRV9XU0RMIiksIFN0YXR1cy5FUlJPUiwgaW9lKTsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpCi0gICAgICB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OIiksIFN0YXR1cy5FUlJPUiwgcGNlKTsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNheGUpCi0gICAgICB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX01BTEZPUk1FRF9XU0RMIiksIFN0YXR1cy5FUlJPUiwgc2F4ZSk7Ci0gICAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICAvLyBBZGQgV1NETCB0byBXU0lMCi0gICAgdHJ5Ci0gICAgewotICAgICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvY3VtZW50LmdldEluc3BlY3Rpb24oKTsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHdzaWxEb2N1bWVudC5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBFbGVtZW50IGRvY3VtZW50YXRpb24gPSBkZWZpbml0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICAgIEFic3RyYWN0IHNlcnZpY2VBYnN0cmFjdCA9IHdzaWxEb2N1bWVudC5jcmVhdGVBYnN0cmFjdCgpOwotICAgICAgICBzZXJ2aWNlQWJzdHJhY3Quc2V0VGV4dChFbGVtZW50MlN0cmluZyhkb2N1bWVudGF0aW9uKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkQWJzdHJhY3Qoc2VydmljZUFic3RyYWN0KTsKLSAgICAgIH0KLSAgICAgIERlc2NyaXB0aW9uIGRlc2MgPSB3c2lsRG9jdW1lbnQuY3JlYXRlRGVzY3JpcHRpb24oKTsKLSAgICAgIGRlc2Muc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0RMKTsKLSAgICAgIGRlc2Muc2V0TG9jYXRpb24oZ2V0UmVsYXRpdmVVUkkod3NpbCwgd3NkbCkpOwotICAgICAgRXh0ZW5zaW9uQnVpbGRlciBleHRCdWlsZGVyID0gd3NpbERvY3VtZW50LmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0QnVpbGRlcihXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0lMX1dTREwpOwotICAgICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCB8fCBlbmRwb2ludFByZXNlbnQoZGVmaW5pdGlvbikpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB3c2RsU2VydmljZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChSZWZlcmVuY2UpIGV4dEJ1aWxkZXIuY3JlYXRlRWxlbWVudChuZXcgUU5hbWUoV1NETENvbnN0YW50cy5OU19VUklfV1NJTF9XU0RMLCBXU0RMQ29uc3RhbnRzLkVMRU1fUkVGRVJFTkNFKSk7Ci0gICAgICAgICAgcmVmZXJlbmNlLnNldEVuZHBvaW50UHJlc2VudChuZXcgQm9vbGVhbih0cnVlKSk7Ci0gICAgICAgICAgUmVmZXJlbmNlZFNlcnZpY2UgcmVmU2VydmljZSA9IChSZWZlcmVuY2VkU2VydmljZSkgZXh0QnVpbGRlci5jcmVhdGVFbGVtZW50KG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0lMX1dTREwsIFdTRExDb25zdGFudHMuRUxFTV9SRUZfU0VSVklDRSkpOwotICAgICAgICAgIHJlZlNlcnZpY2Uuc2V0UmVmZXJlbmNlZFNlcnZpY2VOYW1lKChRTmFtZSkgaXQubmV4dCgpKTsKLSAgICAgICAgICByZWZlcmVuY2Uuc2V0UmVmZXJlbmNlZFNlcnZpY2UocmVmU2VydmljZSk7Ci0gICAgICAgICAgZGVzYy5zZXRFeHRlbnNpb25FbGVtZW50KHJlZmVyZW5jZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChSZWZlcmVuY2UpIGV4dEJ1aWxkZXIuY3JlYXRlRWxlbWVudChuZXcgUU5hbWUoV1NETENvbnN0YW50cy5OU19VUklfV1NJTF9XU0RMLCBXU0RMQ29uc3RhbnRzLkVMRU1fUkVGRVJFTkNFKSk7Ci0gICAgICAgIHJlZmVyZW5jZS5zZXRFbmRwb2ludFByZXNlbnQobmV3IEJvb2xlYW4oZmFsc2UpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHdzZGxCaW5kaW5nLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBJbXBsZW1lbnRlZEJpbmRpbmcgYmluZGluZyA9IChJbXBsZW1lbnRlZEJpbmRpbmcpIGV4dEJ1aWxkZXIuY3JlYXRlRWxlbWVudChuZXcgUU5hbWUoV1NETENvbnN0YW50cy5OU19VUklfV1NJTF9XU0RMLCBXU0RMQ29uc3RhbnRzLkVMRU1fSU1QTF9CSU5ESU5HKSk7Ci0gICAgICAgICAgYmluZGluZy5zZXRCaW5kaW5nTmFtZSgoUU5hbWUpIGl0Lm5leHQoKSk7Ci0gICAgICAgICAgcmVmZXJlbmNlLmFkZEltcGxlbWVudGVkQmluZGluZyhiaW5kaW5nKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc2VydmljZS5hZGREZXNjcmlwdGlvbihkZXNjKTsKLSAgICAgIGluc3BlY3Rpb24uYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTSUxFeGNlcHRpb24gd3NpbGUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT04iKSwgU3RhdHVzLkVSUk9SLCB3c2lsZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9VTkVYUEVDVEVEX0VYQ0VQVElPTiIpLCBTdGF0dXMuRVJST1IsIHQpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhpZCwgIiIsIFN0YXR1cy5PSywgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiwgYW5kIG9ubHkgaWYsIHRoZSBDb21tYW5kJ3MgPGNvZGU+dW5kbzwvY29kZT4KLSAgICogbWV0aG9kIGlzIHN1cHBvcnRlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgQ29tbWFuZCBzdXBwb3J0cyBiZWluZyB1bmRvbmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9hYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBVbmRvZXMgdGhlIENvbW1hbmQuCi0gICAqIAotICAgKiBAcGFyYW0gZW52aXJvbm1lbnQKLSAgICogICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlCi0gICAqICAgICAgICAgPGNvZGU+dW5kbzwvY29kZT4gbWV0aG9kIHdhcyBzdWNjZXNzZnVsLiBBIHZhbHVkIG9mIDxjb2RlPm51bGw8L2NvZGU+LAotICAgKiAgICAgICAgIG9yIGEgU3RhdHVzIHdpdGggYSBzZXZlcml0eSBvZiBsZXNzIHRoYW4gPGNvZGU+U3RhdHVzLkVSUk9SPC9jb2RlPgotICAgKiAgICAgICAgIHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoaWQsICIiLCBTdGF0dXMuT0ssIG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlLWV4ZWN1dGVzIHRoZSBDb21tYW5kLgotICAgKiAKLSAgICogQHBhcmFtIGVudmlyb25tZW50Ci0gICAqICAgICAgICAgICAgVGhlIGVudmlyb25tZW50LiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIEEgPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyB0aGUgZGVncmVlIHRvIHdoaWNoIHRoZQotICAgKiAgICAgICAgIDxjb2RlPnJlZG88L2NvZGU+IG1ldGhvZCB3YXMgc3VjY2Vzc2Z1bC4gQSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiwKLSAgICogICAgICAgICBvciBhIFN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YgbGVzcyB0aGVuIDxjb2RlPlN0YXR1cy5FUlJPUjwvY29kZT4KLSAgICogICAgICAgICBzaWduaWZpZXMgc3VjY2Vzcy4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgcmVkbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBleGVjdXRlKGVudmlyb25tZW50KTsKLSAgfQotCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBwYXJzZVdTREwoU3RyaW5nIHdzZGwsIEFycmF5TGlzdCB3c2RsU2VydmljZSwgQXJyYXlMaXN0IHdzZGxCaW5kaW5nLCBTdHJpbmcgaHR0cFVzZXJuYW1lLCBTdHJpbmcgaHR0cFBhc3N3b3JkKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgV2ViU2VydmljZXNQYXJzZXIgd3NQYXJzZXIgPSBuZXcgV2ViU2VydmljZXNQYXJzZXIod3NkbCk7Ci0gICAgaWYgKGh0dHBVc2VybmFtZSAhPSBudWxsICYmIGh0dHBQYXNzd29yZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHdzUGFyc2VyLnNldEhUVFBCYXNpY0F1dGhVc2VybmFtZShodHRwVXNlcm5hbWUpOwotICAgICAgd3NQYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKGh0dHBQYXNzd29yZCk7Ci0gICAgfQotICAgIHdzUGFyc2VyLnBhcnNlKFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX05PTkUpOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGwpOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHdzZGxTZXJ2aWNlLmFkZChwYXJzZVFOYW1lKChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKSBpdC5uZXh0KCkpKTsKLSAgICAgIE1hcCBiaW5kaW5ncyA9IGRlZmluaXRpb24uZ2V0QmluZGluZ3MoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBiaW5kaW5ncy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB3c2RsQmluZGluZy5hZGQocGFyc2VRTmFtZSgoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkgaXQubmV4dCgpKSk7Ci0gICAgfQotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGVuZHBvaW50UHJlc2VudChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICByZXR1cm4gKGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS5zaXplKCkgPiAwKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKQotICB7Ci0gICAgcmV0dXJuIGFyZ3NfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBhcmdzXyA9IGFyZ3M7Ci0gIH0KLQotICBwdWJsaWMgV1dXQXV0aGVudGljYXRpb25IYW5kbGVyIGdldFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcigpCi0gIHsKLSAgICByZXR1cm4gd3d3QXV0aEhhbmRsZXJfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V1dXQXV0aGVudGljYXRpb25IYW5kbGVyKFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlciB3d3dBdXRoSGFuZGxlcikKLSAgewotICAgIHd3d0F1dGhIYW5kbGVyXyA9IHd3d0F1dGhIYW5kbGVyOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlQXJndW1lbnRzKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24KLSAgewotICAgIGNsZWFyUGFyc2VkQXJncygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnc18ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKEFSR19XU0lMLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIHdzaWxfID0gYXJnc19bKytpXTsKLSAgICAgIGVsc2UgaWYgKEFSR19XU0RMLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIHdzZGxzXy5hZGQoYXJnc19bKytpXSk7Ci0gICAgICBlbHNlIGlmIChBUkdfUkVTT0xWRV9XU0RMLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIHJlc29sdmVXU0RMXyA9IHRydWU7Ci0gICAgICBlbHNlIGlmIChBUkdfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIGh0dHBVc2VybmFtZV8gPSBhcmdzX1srK2ldOwotICAgICAgZWxzZSBpZiAoQVJHX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRC5lcXVhbHMoYXJnc19baV0pKQotICAgICAgICBodHRwUGFzc3dvcmRfID0gYXJnc19bKytpXTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24oYXJnc19baV0pOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgUU5hbWUgcGFyc2VRTmFtZShTdHJpbmcgcW5hbWVTdHJpbmcpCi0gIHsKLSAgICBpbnQgY29sb25JbmRleCA9IHFuYW1lU3RyaW5nLmluZGV4T2YoJzonKTsKLSAgICBTdHJpbmcgbnMgPSAoY29sb25JbmRleCAhPSAtMSkgPyBxbmFtZVN0cmluZy5zdWJzdHJpbmcoMCwgY29sb25JbmRleCkgOiAiIjsKLSAgICBTdHJpbmcgbG9jYWxwYXJ0ID0gKGNvbG9uSW5kZXggIT0gLTEpID8gcW5hbWVTdHJpbmcuc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAxLCBxbmFtZVN0cmluZy5sZW5ndGgoKSkgOiBxbmFtZVN0cmluZzsKLSAgICByZXR1cm4gbmV3IFFOYW1lKG5zLCBsb2NhbHBhcnQpOwotICB9Ci0KLSAgcHJpdmF0ZSBRTmFtZSBwYXJzZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmV3IFFOYW1lKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBFbGVtZW50MlN0cmluZyhFbGVtZW50IGUpIHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVswXTsKLSAgICBpZiAoZSAhPSBudWxsKQotICAgIHsKLSAgICAgIERPTVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGUpOwotICAgICAgVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7Ci0gICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgIHNlcmlhbGl6ZXIudHJhbnNmb3JtKGRvbVNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICBiYW9zLmNsb3NlKCk7Ci0gICAgICBiID0gYmFvcy50b0J5dGVBcnJheSgpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFN0cmluZyhiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHBsYXRmb3JtMkZpbGUoVVJJRmFjdG9yeSB1cmlGYWN0b3J5LCBTdHJpbmcgdXJpKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIHVyaUZhY3RvcnkubmV3VVJJKHVyaSkuYXNGaWxlKCkudG9VUkwoKS50b1N0cmluZygpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgY2hhciBGV0RfU0xBU0ggPSAnLyc7Ci0gIHByaXZhdGUgZmluYWwgY2hhciBCV0RfU0xBU0ggPSAnXFwnOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBwYXJlbnREaXIgPSAiLi4vIjsKLQotICBwcml2YXRlIFN0cmluZyBnZXRSZWxhdGl2ZVVSSShTdHJpbmcgYmFzZVVSSSwgU3RyaW5nIHRhcmdldFVSSSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFN0cmluZyBiYXNlVVJJQ29weSA9IGJhc2VVUkkucmVwbGFjZShCV0RfU0xBU0gsIEZXRF9TTEFTSCk7Ci0gICAgICBTdHJpbmcgdGFyZ2V0VVJJQ29weSA9IHRhcmdldFVSSS5yZXBsYWNlKEJXRF9TTEFTSCwgRldEX1NMQVNIKTsKLSAgICAgIGludCBtYXRjaGluZ0luZGV4ID0gLTE7Ci0gICAgICBpbnQgaW5kZXggPSB0YXJnZXRVUklDb3B5LmluZGV4T2YoRldEX1NMQVNIKTsKLSAgICAgIHdoaWxlIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGJhc2VVUklDb3B5LnN0YXJ0c1dpdGgodGFyZ2V0VVJJQ29weS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXRjaGluZ0luZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgaW5kZXggPSB0YXJnZXRVUklDb3B5LmluZGV4T2YoRldEX1NMQVNILCBpbmRleCArIDEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChtYXRjaGluZ0luZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBpbnQgc2xhc2hDb3VudCA9IC0xOwotICAgICAgICBpbnQgZnJvbUluZGV4ID0gbWF0Y2hpbmdJbmRleDsKLSAgICAgICAgd2hpbGUgKGZyb21JbmRleCAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHNsYXNoQ291bnQrKzsKLSAgICAgICAgICBmcm9tSW5kZXggPSBiYXNlVVJJQ29weS5pbmRleE9mKEZXRF9TTEFTSCwgZnJvbUluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlbGF0aXZlVVJJID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNsYXNoQ291bnQ7IGkrKykKLSAgICAgICAgICByZWxhdGl2ZVVSSS5hcHBlbmQocGFyZW50RGlyKTsKLSAgICAgICAgcmVsYXRpdmVVUkkuYXBwZW5kKHRhcmdldFVSSS5zdWJzdHJpbmcobWF0Y2hpbmdJbmRleCArIDEsIHRhcmdldFVSSS5sZW5ndGgoKSkpOwotICAgICAgICByZXR1cm4gcmVsYXRpdmVVUkkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldFVSSTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9DbGllbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvQ2xpZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGZjMzcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9DbGllbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50VHlwZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRJbXBsIHdlYlNlcnZpY2VDbGllbnRJbXBsMTsKLQlwcml2YXRlIFN0cmluZ1tdIG1vZHVsZVR5cGVzOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZVR5cGVzKCkgewotCQlyZXR1cm4gbW9kdWxlVHlwZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVR5cGVzKFN0cmluZ1tdIG1vZHVsZVR5cGVzKSB7Ci0JCXRoaXMubW9kdWxlVHlwZXMgPSBtb2R1bGVUeXBlczsKLQl9Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VDbGllbnRJbXBsIGdldFdlYlNlcnZpY2VDbGllbnRJbXBsMSgpIHsKLQkJcmV0dXJuIHdlYlNlcnZpY2VDbGllbnRJbXBsMTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V2ViU2VydmljZUNsaWVudEltcGwxKFdlYlNlcnZpY2VDbGllbnRJbXBsIHdlYlNlcnZpY2VDbGllbnRJbXBsMSkgewotCQl0aGlzLndlYlNlcnZpY2VDbGllbnRJbXBsMSA9IHdlYlNlcnZpY2VDbGllbnRJbXBsMTsKLQl9Ci0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0Nzk3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLS8qKgotICogQGF1dGhvciByc2luaGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0IGltcGxlbWVudHMgSUNvbnRleHQgewkKLQlwcml2YXRlIFdlYlNlcnZpY2VTY2VuYXJpbyBzY2VuYXJpbzsKLQlwcml2YXRlIGJvb2xlYW4gZGV2ZWxvcDsKLQlwcml2YXRlIGJvb2xlYW4gYXNzZW1ibGU7Ci0JcHJpdmF0ZSBib29sZWFuIGRlcGxveTsKLQlwcml2YXRlIGJvb2xlYW4gaW5zdGFsbDsKLQlwcml2YXRlIGJvb2xlYW4gcnVuOwotCXByaXZhdGUgYm9vbGVhbiBjbGllbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIHRlc3Q7Ci0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2g7Ci0JcHJpdmF0ZSBib29sZWFuIG92ZXJXcml0ZUZpbGVzOwotCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVGb2xkZXJzOwotCXByaXZhdGUgYm9vbGVhbiBjaGVja091dEZpbGVzOwotCQotCXB1YmxpYyBib29sZWFuIGdldEFzc2VtYmxlKCkgewotCQlyZXR1cm4gYXNzZW1ibGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldENoZWNrT3V0RmlsZXMoKSB7Ci0JCXJldHVybiBjaGVja091dEZpbGVzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnQoKSB7Ci0JCXJldHVybiBjbGllbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldENyZWF0ZUZvbGRlcnMoKSB7Ci0JCXJldHVybiBjcmVhdGVGb2xkZXJzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3koKSB7Ci0JCXJldHVybiBkZXBsb3k7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldERldmVsb3AoKSB7Ci0JCXJldHVybiBkZXZlbG9wOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnN0YWxsKCkgewotCQlyZXR1cm4gaW5zdGFsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0T3ZlcldyaXRlRmlsZXMoKSB7Ci0JCXJldHVybiBvdmVyV3JpdGVGaWxlczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2g7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldFJ1bigpIHsKLQkJcmV0dXJuIHJ1bjsKLQl9Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VTY2VuYXJpbyBnZXRTY2VuYXJpbygpIHsKLQkJcmV0dXJuIHNjZW5hcmlvOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRUZXN0KCkgewotCQlyZXR1cm4gdGVzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBc3NlbWJsZShib29sZWFuIGFzc2VtYmxlKSB7Ci0JCXRoaXMuYXNzZW1ibGUgPSBhc3NlbWJsZTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRDaGVja091dEZpbGVzKGJvb2xlYW4gY2hlY2tPdXRGaWxlcykgewotCQl0aGlzLmNoZWNrT3V0RmlsZXMgPSBjaGVja091dEZpbGVzOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldENsaWVudChib29sZWFuIGNsaWVudCkgewotCQl0aGlzLmNsaWVudCA9IGNsaWVudDsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGVGb2xkZXJzKGJvb2xlYW4gY3JlYXRlRm9sZGVycykgewotCQl0aGlzLmNyZWF0ZUZvbGRlcnMgPSBjcmVhdGVGb2xkZXJzOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldERlcGxveShib29sZWFuIGRlcGxveSkgewotCQl0aGlzLmRlcGxveSA9IGRlcGxveTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXREZXZlbG9wKGJvb2xlYW4gZGV2ZWxvcCkgewotCQl0aGlzLmRldmVsb3AgPSBkZXZlbG9wOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGwoYm9vbGVhbiBpbnN0YWxsKSB7Ci0JCXRoaXMuaW5zdGFsbCA9IGluc3RhbGw7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0T3ZlcldyaXRlRmlsZXMoYm9vbGVhbiBvdmVyV3JpdGVGaWxlcykgewotCQl0aGlzLm92ZXJXcml0ZUZpbGVzID0gb3ZlcldyaXRlRmlsZXM7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaChib29sZWFuIHB1Ymxpc2gpIHsKLQkJdGhpcy5wdWJsaXNoID0gcHVibGlzaDsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRSdW4oYm9vbGVhbiBydW4pIHsKLQkJdGhpcy5ydW4gPSBydW47Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0U2NlbmFyaW8oV2ViU2VydmljZVNjZW5hcmlvIHNjZW5hcmlvKSB7Ci0JCXRoaXMuc2NlbmFyaW8gPSBzY2VuYXJpbzsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRUZXN0KGJvb2xlYW4gdGVzdCkgewotCQl0aGlzLnRlc3QgPSB0ZXN0OwotCX0JCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1NlbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1NlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWFjNDU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9TZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklTZWxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb24gaW1wbGVtZW50cyBJU2VsZWN0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nW10gc2VsZWN0aW9uOwotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihTdHJpbmdbXSBzZWxlY3Rpb24pCi0JewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9TZXJ2aWNlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1NlcnZpY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MDkzMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1NlcnZpY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVR5cGUgewotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlSW1wbCB3ZWJTZXJ2aWNlSW1wbDE7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBib3R0b21VcE1vZHVsZVR5cGVzOwotCXByaXZhdGUgU3RyaW5nW10gdG9wRG93bk1vZHVsZVR5cGVzOwotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRCb3R0b21VcE1vZHVsZVR5cGVzKCkgewotCQlyZXR1cm4gYm90dG9tVXBNb2R1bGVUeXBlczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Qm90dG9tVXBNb2R1bGVUeXBlcyhTdHJpbmdbXSBib3R0b21VcE1vZHVsZVR5cGVzKSB7Ci0JCXRoaXMuYm90dG9tVXBNb2R1bGVUeXBlcyA9IGJvdHRvbVVwTW9kdWxlVHlwZXM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFRvcERvd25Nb2R1bGVUeXBlcygpIHsKLQkJcmV0dXJuIHRvcERvd25Nb2R1bGVUeXBlczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VG9wRG93bk1vZHVsZVR5cGVzKFN0cmluZ1tdIHRvcERvd25Nb2R1bGVUeXBlcykgewotCQl0aGlzLnRvcERvd25Nb2R1bGVUeXBlcyA9IHRvcERvd25Nb2R1bGVUeXBlczsKLQl9Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VJbXBsIGdldFdlYlNlcnZpY2VJbXBsMSgpIHsKLQkJcmV0dXJuIHdlYlNlcnZpY2VJbXBsMTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V2ViU2VydmljZUltcGwxKFdlYlNlcnZpY2VJbXBsIHdlYlNlcnZpY2VJbXBsMSkgewotCQl0aGlzLndlYlNlcnZpY2VJbXBsMSA9IHdlYlNlcnZpY2VJbXBsMTsKLQl9Ci0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZUNsaWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlQ2xpZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmVmZjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlQ2xpZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDbGllbnRJbXBsIHsKLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nW10gcmVzb3VyY2VUeXBlTWV0YWRhdGE7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBleHRlbnNpb25NZXRhZGF0YTsKLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uTWV0YWRhdGEoKSB7Ci0JCXJldHVybiBleHRlbnNpb25NZXRhZGF0YTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uTWV0YWRhdGEoU3RyaW5nW10gZXh0ZW5zaW9uTWV0YWRhdGEpIHsKLQkJdGhpcy5leHRlbnNpb25NZXRhZGF0YSA9IGV4dGVuc2lvbk1ldGFkYXRhOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlVHlwZU1ldGFkYXRhKCkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlTWV0YWRhdGE7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZU1ldGFkYXRhKFN0cmluZ1tdIHJlc291cmNlVHlwZU1ldGFkYXRhKSB7Ci0JCXRoaXMucmVzb3VyY2VUeXBlTWV0YWRhdGEgPSByZXNvdXJjZVR5cGVNZXRhZGF0YTsKLQl9Ci0JCi0JCi0KLQkKLQkKLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzljYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0OwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUltcGwgewotCQotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nW10gcmVzb3VyY2VUeXBlTWV0YWRhdGE7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBleHRlbnNpb25NZXRhZGF0YTsKLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uTWV0YWRhdGEoKSB7Ci0JCXJldHVybiBleHRlbnNpb25NZXRhZGF0YTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uTWV0YWRhdGEoU3RyaW5nW10gZXh0ZW5zaW9uTWV0YWRhdGEpIHsKLQkJdGhpcy5leHRlbnNpb25NZXRhZGF0YSA9IGV4dGVuc2lvbk1ldGFkYXRhOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlVHlwZU1ldGFkYXRhKCkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlTWV0YWRhdGE7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZU1ldGFkYXRhKFN0cmluZ1tdIHJlc291cmNlVHlwZU1ldGFkYXRhKSB7Ci0JCXRoaXMucmVzb3VyY2VUeXBlTWV0YWRhdGEgPSByZXNvdXJjZVR5cGVNZXRhZGF0YTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzc5MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VSdW50aW1lSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQ7Ci0KLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc3RhdGU7Ci0JcHJpdmF0ZSBTZXJ2aWNlVHlwZVtdIHNlcnZpY2VUeXBlczsKLQlwcml2YXRlIENsaWVudFR5cGVbXSBjbGllbnRUeXBlczsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBzZXJ2bGV0TGV2ZWxzOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIGoyZWVMZXZlbHM7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gcnVudGltZUlkczsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBzZXJ2ZXJGYWN0b3J5SWRzOwotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JfQotCQotCXB1YmxpYyBDbGllbnRUeXBlW10gZ2V0Q2xpZW50VHlwZXMoKSB7Ci0JCXJldHVybiBjbGllbnRUeXBlczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZXMoQ2xpZW50VHlwZVtdIGNsaWVudFR5cGVzKSB7Ci0JCXRoaXMuY2xpZW50VHlwZXMgPSBjbGllbnRUeXBlczsKLQl9Ci0JCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRKMmVlTGV2ZWxzKCkgewotCQlyZXR1cm4gajJlZUxldmVsczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SjJlZUxldmVscyhqYXZhLmxhbmcuU3RyaW5nW10gbGV2ZWxzKSB7Ci0JCWoyZWVMZXZlbHMgPSBsZXZlbHM7Ci0JfQotCQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0UnVudGltZUlkcygpIHsKLQkJcmV0dXJuIHJ1bnRpbWVJZHM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVJZHMoamF2YS5sYW5nLlN0cmluZ1tdIHJ1bnRpbWVJZHMpIHsKLQkJdGhpcy5ydW50aW1lSWRzID0gcnVudGltZUlkczsKLQl9Ci0JCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTZXJ2ZXJGYWN0b3J5SWRzKCkgewotCQlyZXR1cm4gc2VydmVyRmFjdG9yeUlkczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmVyRmFjdG9yeUlkcyhqYXZhLmxhbmcuU3RyaW5nW10gc2VydmVyRmFjdG9yeUlkcykgewotCQl0aGlzLnNlcnZlckZhY3RvcnlJZHMgPSBzZXJ2ZXJGYWN0b3J5SWRzOwotCX0KLQkKLQlwdWJsaWMgU2VydmljZVR5cGVbXSBnZXRTZXJ2aWNlVHlwZXMoKSB7Ci0JCXJldHVybiBzZXJ2aWNlVHlwZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlcyhTZXJ2aWNlVHlwZVtdIHNlcnZpY2VUeXBlcykgewotCQl0aGlzLnNlcnZpY2VUeXBlcyA9IHNlcnZpY2VUeXBlczsKLQl9Ci0JCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTZXJ2bGV0TGV2ZWxzKCkgewotCQlyZXR1cm4gc2VydmxldExldmVsczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmxldExldmVscyhqYXZhLmxhbmcuU3RyaW5nW10gc2VydmxldExldmVscykgewotCQl0aGlzLnNlcnZsZXRMZXZlbHMgPSBzZXJ2bGV0TGV2ZWxzOwotCX0KLQkKLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdGF0ZShqYXZhLmxhbmcuU3RyaW5nIHN0YXRlKSB7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQl9Ci0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzZjI1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi13c2RsZWRpdG9yLmphcgotdGVtcC5mb2xkZXIKLW9yZy5lY2xpcHNlLndzdC53c2RsLnVpXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YTRkZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c2RsLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmNjkwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgd3NkbGVkaXRvci5qYXIKLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gd3NkbGVkaXRvci5qYXIKLXNvdXJjZS53c2RsZWRpdG9yLmphciA9IHNyYy8KLW91dHB1dC53c2RsZWRpdG9yLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3JlbG9hZGdyYW1tYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRjOWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3ZhbGlkYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvdmFsaWRhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy93c2RsX2ZpbGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvd3NkbF9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjFmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy93c2RsX2ZpbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTY1N2ViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEKLSEgUGx1Z2luCi0hCi1fVUlfUExVR0lOX05BTUUgICAgICAgICAgICAgPSBXU0RMIEVkaXRvcgotX1VJX0VESVRPUl9OQU1FICAgICAgICAgICAgID0gV1NETCBFZGl0b3IKLV9VSV9XU0RMX0xBQkVMICAgICAgICAgICAgICA9IFdTREwgRmlsZXMKLQotCi1fVUlfSElERV9CSU5ESU5HUyAgICAgICAgICAgPSBIaWRlIEJpbmRpbmdzCi1fVUlfQkFDS19UTyAgICAgICAgICAgICAgICAgPSBCYWNrIHRvIHswfQotX1VJX0JBQ0sgICAgICAgICAgICAgICAgICAgID0gQmFjayB0byBQcmV2aW91cyBWaWV3Ci0KLSEgTmV3IHByb3BlcnR5IHRhYnMKLV9VSV9MQUJFTF9HRU5FUkFMICAgICAgID0gR2VuZXJhbAotX1VJX0xBQkVMX09USEVSICAgICAgICAgPSBPdGhlcgotX1VJX0xBQkVMX0FUVFJJQlVURVMgICAgPSBBdHRyaWJ1dGVzCi1fVUlfTEFCRUxfRE9DVU1FTlRBVElPTiA9IERvY3VtZW50YXRpb24KLV9VSV9MQUJFTF9GQUNFVFMgICAgICAgID0gRmFjZXRzCi1fVUlfTEFCRUxfRU5VTUVSQVRJT05TICA9IEVudW1lcmF0aW9ucwotX1VJX0xBQkVMX05BTUVTUEFDRSAgICAgPSBOYW1lc3BhY2UKLQotISBTZWN0aW9uIHRpdGxlIGZvciBvdGhlciBhdHRyaWJ1dGVzCi1fVUlfU0VDVElPTl9BRFZBTkNFRF9BVFRSSUJVVEVTICAgPSBBZHZhbmNlZAotCi0hCi0hIFdvcmtib29rIFBhZ2VzCi0hCi1fVUlfVEFCX1NPVVJDRSA9IFNvdXJjZQotX1VJX1RBQl9HUkFQSCAgPSBHcmFwaAotCi1fVUlfQUREX0VYVEVOU0lCSUxJVFlfRUxFTUVOVCAgICA9IEFkZCBFeHRlbnNpYmlsaXR5IEVsZW1lbnQKLV9VSV9DUkVBVEVfV1NETF9ET0NVTUVOVEFUSU9OICAgID0gQ3JlYXRlIFdTREwgRG9jdW1lbnRhdGlvbgotX1VJX0ZPTERFUl9OT1RfQ1JFQVRFRCAgICAgICAgICAgPSBGb2xkZXIgbm90IGNyZWF0ZWQKLV9VSV9DUkVBVElOR19ET0NVTUVOVEFUSU9OICAgICAgID0gQ3JlYXRpbmcgRG9jdW1lbnRhdGlvbgotX1VJX0xBQkVMX0NSRUFURV9GT0xERVJfRk9SX0RPQ1MgPSBDcmVhdGUgYSBuZXcgZm9sZGVyIGZvciB0aGUgaHRtbCBkb2N1bWVudGF0aW9uIGZpbGVzCi1fVUlfTEFCRUxfQ1JFQVRJTkdfSFRNTF9GSUxFUyAgICA9IENyZWF0aW5nIEhUTUwgZmlsZXMKLV9VSV9MQUJFTF9ORVdfRk9MREVSICAgICAgICAgICAgID0gTmV3IGZvbGRlcgotCi1fVUlfQUNUSU9OX0FERCAgICAgICAgICAgICA9IEFkZAotX1VJX0FDVElPTl9DT1BZICAgICAgICAgICAgPSBDb3B5Ci1fVUlfQUNUSU9OX1BBU1RFICAgICAgICAgICA9IFBhc3RlCi1fVUlfQUNUSU9OX0RFTEVURSAgICAgICAgICA9IERlbGV0ZQotX1VJX0FDVElPTl9NVUxUSVBMRV9ERUxFVEUgPSBNdWx0aXBsZSBEZWxldGUKLV9VSV9BQ1RJT05fUkVOQU1FICAgICAgICAgID0gUmVuYW1lCi0KLV9VSV9MQUJFTF9CSU5ESU5HX1dJWkFSRCA9IEJpbmRpbmcgV2l6YXJkCi1fVUlfQUNUSU9OX0dFTkVSQVRFX0hUTUxfRE9DVU1FTlRBVElPTiA9IEdlbmVyYXRlIEhUTUwgRG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBXU0RMIGRvY3VtZW50Ci1fVUlfQUNUSU9OX1ZBTElEQVRFX1dTRExfRE9DVU1FTlQgPSBWYWxpZGF0ZSBXU0RMIERvY3VtZW50Ci0KLV9VSV9BQ1RJT05fQUREX0NISUxEICAgICAgICA9IEFkZCBDaGlsZAotX1VJX0FDVElPTl9TRVRfQklORElHICAgICAgID0gU2V0IEJpbmRpbmcuLi4KLV9VSV9BQ1RJT05fU0VUX1BPUlRUWVBFICAgICA9IFNldCBQb3J0VHlwZS4uLgotX1VJX0FDVElPTl9TRVRfTUVTU0FHRSAgICAgID0gU2V0IE1lc3NhZ2UuLi4KLV9VSV9BQ1RJT05fU0VUX0VMRU1FTlQgICAgICA9IFNldCBFbGVtZW50Li4uCi1fVUlfQUNUSU9OX1NFVF9UWVBFICAgICAgICAgPSBTZXQgVHlwZS4uLgotX1VJX0xBQkVMX0JJTkRJTkdfT1BFUkFUSU9OID0gQmluZGluZyBPcGVyYXRpb24KLV9VSV9BQ1RJT05fTkVXX01FU1NBR0UgICAgICA9IE5ldyBNZXNzYWdlCi1fVUlfQUNUSU9OX05FV19TRVJWSUNFICAgICAgPSBOZXcgU2VydmljZQotX1VJX0FDVElPTl9ORVdfUE9SVFRZUEUgICAgID0gTmV3IFBvcnRUeXBlCi1fVUlfQUNUSU9OX05FV19CSU5ESU5HICAgICAgPSBOZXcgQmluZGluZwotX1VJX0FDVElPTl9ORVdfUE9SVCAgICAgICAgID0gTmV3IFBvcnQKLV9VSV9BQ1RJT05fTkVXX09QRVJBVElPTiAgICA9IE5ldyBPcGVyYXRpb24KLV9VSV9BQ1RJT05fTkVXX0ZBVUxUICAgICAgICA9IE5ldyBGYXVsdAotX1VJX0FDVElPTl9ORVdfUEFSVCAgICAgICAgID0gTmV3IFBhcnQKLQotX1VJX0FDVElPTl9BRERfSU1QT1JUICAgICAgICAgICAgPSBBZGQgSW1wb3J0Ci1fVUlfQUNUSU9OX0FERF9TQ0hFTUEgICAgICAgICAgICA9IEFkZCBTY2hlbWEKLV9VSV9BQ1RJT05fQUREX1NFUlZJQ0UgICAgICAgICAgID0gQWRkIFNlcnZpY2UKLV9VSV9BQ1RJT05fQUREX0JJTkRJTkcgICAgICAgICAgID0gQWRkIEJpbmRpbmcKLV9VSV9BQ1RJT05fQUREX09QRVJBVElPTiAgICAgICAgID0gQWRkIE9wZXJhdGlvbgotX1VJX0FDVElPTl9BRERfQklORElOR19PUEVSQVRJT04gPSBBZGQgQmluZGluZyBPcGVyYXRpb24KLV9VSV9BQ1RJT05fQUREX1BBUlQgICAgICAgICAgICAgID0gQWRkIFBhcnQKLV9VSV9BQ1RJT05fQUREX1BPUlQgICAgICAgICAgICAgID0gQWRkIFBvcnQKLV9VSV9BQ1RJT05fQUREX1BPUlRUWVBFICAgICAgICAgID0gQWRkIFBvcnQgVHlwZQotX1VJX0FDVElPTl9BRERfTUVTU0FHRSAgICAgICAgICAgPSBBZGQgTWVzc2FnZQotX1VJX0FDVElPTl9BRERfSU5QVVQgICAgICAgICAgICAgPSBBZGQgSW5wdXQKLV9VSV9BQ1RJT05fQUREX09VVFBVVCAgICAgICAgICAgID0gQWRkIE91dHB1dAotX1VJX0FDVElPTl9BRERfRkFVTFQgICAgICAgICAgICAgPSBBZGQgRmF1bHQKLQotX1VJX0xBQkVMX0RFRklOSVRJT04gPSBEZWZpbml0aW9uCi1fVUlfTEFCRUxfQklORElORyAgPSBCaW5kaW5nCi1fVUlfTEFCRUxfSU5QVVQgICAgPSBJbnB1dAotX1VJX0xBQkVMX09VVFBVVCAgID0gT3V0cHV0Ci1fVUlfTEFCRUxfRkFVTFQgICAgPSBGYXVsdAotX1VJX0xBQkVMX01FU1NBR0UgID0gTWVzc2FnZQotX1VJX0xBQkVMX1BPUlQgICAgID0gUG9ydAotX1VJX0xBQkVMX1BPUlRUWVBFID0gUG9ydCBUeXBlCi1fVUlfTEFCRUxfU0VSVklDRSAgPSBTZXJ2aWNlCi1fVUlfTEFCRUxfRUxFTUVOVFMgPSBFbGVtZW50cwotX1VJX0xBQkVMX1RZUEVTICAgID0gVHlwZXMKLV9VSV9MQUJFTF9OQU1FICAgICAgPSBOYW1lCi1fVUlfTEFCRUxfT1BFUkFUSU9OID0gT3BlcmF0aW9uCi1fVUlfTEFCRUxfRUxFTUVOVCAgPSBFbGVtZW50Ci1fVUlfTEFCRUxfVFlQRSAgICAgPSBUeXBlCi0KLV9VSV9MQUJFTF9SRUFEX09OTFkgICAgID0gcmVhZC1vbmx5Ci0KLSEgTm90ZSB0byB0cmFuc2xhdG9yczoga2VlcCB0aGUgb25lIGNoYXJhY3RlciBzcGFjZSBhbmQgY29sb24gYWZ0ZXIgdGhlIHRyYW5zbGF0aW9uIG9mIFZpZXcKLV9VSV9NRU5VX1ZJRVcgICAgICAgICA9IFZpZXcgOgotX1VJX0xBQkVMX1hTRF9DT01QT05FTlRTID0gWFNEIENvbXBvbmVudHMKLQotX1VJX0xBQkVMX1VOS05PV05fT0JKRUNUID0gVW5rbm93biBPYmplY3QKLV9VSV9MQUJFTF9VTktOT1dOX05PREUgICA9IFVua25vd24gTm9kZQotX1VJX0xBQkVMX1ZJRVdfTk9UX0FWQUlMQUJMRSA9IFZpZXcgbm90IGF2YWlsYWJsZSBmb3Igc2VsZWN0ZWQgb2JqZWN0Ci0KLV9VSV9MQUJFTF9QT1JUX1dfQ09MT04gICAgID0gUG9ydCA6IAotX1VJX0xBQkVMX1BPUlRUWVBFX1dfQ09MT04gPSBQb3J0VHlwZSA6IAotX1VJX0xBQkVMX1NFUlZJQ0VfV19DT0xPTiAgPSBTZXJ2aWNlIDogCi1fVUlfTEFCRUxfVU5LTk9XTiAgPSBVbmtub3duIDogCi1fVUlfTEFCRUxfVklFV19CWV9TRVJWSUNFID0gVmlldyBCeSA6IFNlcnZpY2UKLQotX1VJX0ZPTERFUl9JTVBPUlRTID0gSW1wb3J0cwotX1VJX0ZPTERFUl9NRVNTQUdFUz0gTWVzc2FnZXMKLV9VSV9GT0xERVJfU0VSVklDRVMgPSBTZXJ2aWNlcwotX1VJX0ZPTERFUl9CSU5ESU5HUyA9IEJpbmRpbmdzCi1fVUlfRk9MREVSX1BPUlRUWVBFUyA9IFBvcnQgVHlwZXMKLV9VSV9GT0xERVJfVFlQRVMgICAgID0gVHlwZXMKLV9VSV9GT0xERVJfRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEV4dGVuc2libGl0eSBFbGVtZW50cwotX1VJX0ZPTERFUl9ERUZJTklUSU9OID0gRGVmaW5pdGlvbgotCi1fVUlfTEFCRUxfTk9ORSA9IChub25lKQotX1VJX01FTlVCQVJfR0VORVJBVEVfQklORElORyA9IEdlbmVyYXRlIEJpbmRpbmcKLQotX1VJX0xBQkVMX0hUVFBfQklORElOR19PUFRJT05TID0gSFRUUCBCaW5kaW5nIE9wdGlvbnMKLQotX1VJX1NPTUVfRUxFTUVOVF9OQU1FID0gc29tZS1lbGVtZW50LW5hbWUKLQotX1VJX0xBQkVMX0JJTkRJTkdfSU5QVVQgICA9IEJpbmRpbmcgSW5wdXQKLV9VSV9MQUJFTF9CSU5ESU5HX09VVFBVVCAgPSBCaW5kaW5nIE91dHB1dAotX1VJX0xBQkVMX0JJTkRJTkdfRkFVTFQgICA9IEJpbmRpbmcgRmF1bHQKLQotX1VJX0xBQkVMX0JJTkRJTkdfT1BFUkFUSU9OID0gQmluZGluZyBPcGVyYXRpb24KLQotX1VJX0xBQkVMX1VOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UID0gVW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQKLQotX1VJX0xBQkVMX0lNUE9SVCA9IEltcG9ydAotX1VJX0xBQkVMX05BTUVTUEFDRSA9IE5hbWVzcGFjZQotX1VJX0xBQkVMX1BSRUZJWCA9IFByZWZpeAotX1VJX0xBQkVMX0xPQ0FUSU9OID0gTG9jYXRpb24KLV9VSV9USVRMRV9TRUxFQ1QgPSBTZWxlY3QKLV9VSV9USVRMRV9TRUxFQ1RfRklMRSA9IFNlbGVjdCBGaWxlCi1fVUlfREVTQ1JJUFRJT05fU0VMRUNUX1dTRExfT1JfWFNEID0gU2VsZWN0IGEgV1NETCBvciBYU0QgZmlsZSB0byBpbXBvcnQuCi0KLV9VSV9MQUJFTF9QQVJBTUVURVJfT1JERVIgPSBQYXJhbWV0ZXIgT3JkZXIKLV9VSV9MQUJFTF9QQVJUID0gUGFydAotX1VJX0xBQkVMX1JFRkVSRU5DRV9LSU5EID0gUmVmZXJlbmNlIGtpbmQ6Ci1fVUlfTEFCRUxfT1ZFUlZJRVcgPSBPdmVydmlldwotX1VJX0xBQkVMX1ZJRVdfTk9UX0lNUExFTUVOVEVEID0gVGhpcyB2aWV3IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCi1fVUlfTEFCRUxfQklORElOR19WSUVXID0gQmluZGluZyBWaWV3Ci1fVUlfTEFCRUxfRE9DVU1FTlRJT04gPSBEb2N1bWVudGF0aW9uCi1fVUlfTEFCRUxfUFJPUEVSVFkgPSBQcm9wZXJ0eQotX1VJX0xBQkVMX1ZBTFVFID0gVmFsdWUKLQotX1VJX0JVVFRPTl9ORVcgICAgPSBOZXcuLi4KLV9VSV9CVVRUT05fSU1QT1JUID0gSW1wb3J0Li4uCi0KLV9VSV9CVVRUT05fQ1JFQVRFX0FTU09DSUFURURfQklORElOR1MgPSBDcmVhdGUgYXNzb2NpYXRlZCBiaW5kaW5ncwotX1VJX1RJVExFX0dFTkVSQVRFX0JJTkRJTkdfV0laQVJEID0gR2VuZXJhdGUgQmluZGluZyBXaXphcmQKLQotX1VJX0xBQkVMX05BTUVTUEFDRV9VUklTX1RPX0JFX0lOQ0xVREVEID0gTmFtZXNwYWNlIFVSSXMgdG8gYmUgaW5jbHVkZWQKLV9VSV9BQ1RJT05fQUREID0gQWRkCi0KLV9VSV9USVRMRV9TRUxFQ1RfV1NETF9GSUxFID0gU2VsZWN0IFdTREwgRmlsZQotX1VJX0RFU0NSSVBUSU9OX1NFTEVDVF9XU0RMX0ZJTEVfVE9fSU1QT1JUID0gU2VsZWN0IGEgV1NETCBmaWxlIHRvIGltcG9ydAotCi1fVUlfVElUTEVfU1BFQ0lGWV9CSU5ESU5HID0gU3BlY2lmeSBCaW5kaW5nCi1fVUlfVElUTEVfU1BFQ0lGWV9UWVBFID0gU3BlY2lmeSBUeXBlCi1fVUlfVElUTEVfU1BFQ0lGWV9FTEVNRU5UID0gU3BlY2lmeSBFbGVtZW50Ci1fVUlfVElUTEVfU1BFQ0lGWV9NRVNTQUdFID0gU3BlY2lmeSBNZXNzYWdlCi1fVUlfVElUTEVfU1BFQ0lGWV9QT1JUVFlQRSA9IFNwZWNpZnkgUG9ydCBUeXBlCi0KLV9VSV9USVRMRV9TUEVDSUZZX0JJTkRJTkdfREVUQUlMUyA9IFNwZWNpZnkgQmluZGluZyBEZXRhaWxzCi1fVUlfTEFCRUxfU1BFQ0lGWV9CSU5ESU5HX0RFVEFJTFNfREVTQyA9IFNwZWNpZnkgdGhlIGRldGFpbHMgb2YgdGhlIGJpbmRpbmcgeW91IHdpc2ggdG8gZ2VuZXJhdGUuCi0KLSEgVHJhbnNsYXRvcnM6IExlYXZlIHRoZSB7MH0gYXMgaXMKLV9VSV9SQURJT19TRUxFQ1RfRVhJU1RJTkcgID0gU2VsZWN0IGFuIGV4aXN0aW5nIHswfQotX1VJX1JBRElPX0NSRUFURV9ORVcgICAgICAgPSBDcmVhdGUgYSBuZXcgezB9Ci1fVUlfUkFESU9fSU1QT1JUX0ZST01fRklMRSA9IEltcG9ydCB7MH0gZnJvbSBhIGZpbGUKLV9VSV9MQUJFTF9OQU1FX09GX0lURU0gICAgID0gTmFtZSBvZiB7MH06Ci0KLSEgVHJhbnNsYXRvcnM6IExlYXZlIHRoZSB7MH0gYXMgaXMKLV9VSV9ERVNDUklQVElPTl9DSE9PU0VfRlJPTV9FWElTVElORyA9IENob29zZSB7MH0gZnJvbSB0aGUgbGlzdAotX1VJX0RFU0NSSVBUSU9OX1BST1ZJREVfTkFNRSA9IFByb3ZpZGUgYSBuYW1lIG9mIHRoZSB7MH0gdG8gY3JlYXRlCi1fVUlfREVTQ1JJUFRJT05fSU1QT1JUX0ZJTEUgPSBTZWxlY3QgYSBmaWxlIGFuZCB0aGVuIGNob29zZSB0aGUgezB9Ci1fVUlfSEVMUCA9IEhlbHAKLV9VSV9MQUJFTF9GSUxFID0gRmlsZToKLV9VSV9CVVRUT05fQlJPV1NFID0gQnJvd3NlLi4uCi0KLV9VSV9USVRMRV9ORVdfV1NETF9GSUxFID0gTmV3IFdTREwgRmlsZQotX1VJX1RJVExFX09QVElPTlMgICAgICAgPSBPcHRpb25zCi0KLV9VSV9ERVNDUklQVElPTl9TUEVDSUZZX0JJTkRJTkdfUEFHRSA9IERlc2NyaXB0aW9uIG9mIFNwZWNpZnkgQmluZGluZyBQYWdlCi1fVUlfUkFESU9fR0VORVJBVEVfQ09OVEVOVCA9IEdlbmVyYXRlIGNvbnRlbnQgZm9yIGFuIGV4aXN0aW5nIGJpbmRpbmcKLV9VSV9SQURJT19HRU5FUkFURV9ORVdfQklORElORyA9IEdlbmVyYXRlIGEgbmV3IGJpbmRpbmcKLV9VSV9MQUJFTF9CSU5ESU5HX05BTUUgPSBOYW1lOgotX1VJX0xBQkVMX0JJTkRJTkdfUFJPVE9DT0wgPSBQcm90b2NvbDoKLV9VSV9DSEVDS0JPWF9PVkVSV1JJVEUgPSBPdmVyd3JpdGUgZXhpc3RpbmcgYmluZGluZyBpbmZvcm1hdGlvbgotX1VJX0xBQkVMX1NPQVBfQklORElOR19PUFRJT05TID0gU09BUCBCaW5kaW5nIE9wdGlvbnMKLV9VSV9SQURJT19ET0NVTUVOVF9MSVRFUkFMID0gZG9jdW1lbnQgbGl0ZXJhbAotX1VJX1JBRElPX1JQQ19MSVRFUkFMID0gcnBjIGxpdGVyYWwKLV9VSV9SQURJT19SUENfRU5DT0RFRCA9IHJwYyBlbmNvZGVkCi0KLV9VSV9ERVNDUklQVElPTl9ORVdfV1NETF9GSUxFID0gU3BlY2lmeSB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIG5ldyBXU0RMIGZpbGUuCi1fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRSA9IFRhcmdldCBuYW1lc3BhY2U6Ci1fVUlfTEFCRUxfUFJFRklYX1dJVEhfQ09MT04gPSBQcmVmaXg6Ci1fVUlfTEFCRUxfREVGSU5JVElPTl9OQU1FICAgPSBEZWZpbml0aW9uIG5hbWU6Ci1fVUlfTEFCRUxfQ1JFQVRFX05FV19XU0RMX0ZJTEUgPSBDcmVhdGUgYSBuZXcgV1NETCBGaWxlCi1fVUlfTEFCRUxfQ1JFQVRFX1dTRExfU0tFTEVUT04gPSBDcmVhdGUgV1NETCBTa2VsZXRvbgotX1VJX0xBQkVMX05FV19DQVRFR09SWV9OQU1FX1dTID0gV2ViIFNlcnZpY2VzCi0KLSEgVHJhbnNsYXRvcnM6IExlYXZlIHRoZSB7MH0gYXMgaXMKLV9VSV9FUlJPUl9OQU1FU1BBQ0VfSU5WQUxJRCA9IFRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzIGludmFsaWQKLV9VSV9FUlJPUl9QUkVGSVhfSVNfSU5WQUxJRCA9IFByZWZpeCB7MH0gaXMgaW52YWxpZAotX1VJX0VSUk9SX1BSRUZJWF9JU19BX0RVUExJQ0FURSA9IFByZWZpeCB7MH0gaXMgYSBkdXBsaWNhdGUKLV9VSV9FUlJPUl9NT1JFX1RIQU5fT05FX1BSRUZJWF9JU19CTEFOSyA9IE1vcmUgdGhhbiBvbmUgcHJlZml4IGlzIGJsYW5rCi1fVUlfRVJST1JfRklMRV9NVVNUX0VORF9XSVRIX1dTREwgPSBFcnJvcjogRmlsZSBtdXN0IGVuZCB3aXRoIHdzZGwKLV9VSV9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTID0gRmlsZSBhbHJlYWR5IGV4aXN0czogezB9Ci0KLV9VSV9FUlJPUl9JTlZBTElEX1dTREwgPSBJbnZhbGlkIFdTREwKLV9VSV9FUlJPUl9JTlZBTElEX1dTRExfREVTQyA9IFRoZSBXU0RMIEZpbGUgaXMgaW52YWxpZC4gIEZpeCBlcnJvcnMgYW5kIHRoZW4gcmV0cnkgdGhpcyBhY3Rpb24uCi1fVUlfRVJST1JfRVJST1IgICAgICAgICAgICAgPSBFcnJvcgotX1VJX0VSUk9SX0ZPTERFUl9OT1RfQ1JFQVRFRCAgPSBGb2xkZXIgbm90IGNyZWF0ZWQuCi1fVUlfRVJST1JfQ1JFQVRJTkdfSFRNTF9GSUxFUyA9IEVycm9yIGNyZWF0aW5nIEhUTUwgZmlsZXMuCi0KLV9VSV9FUlJPUl9JTVBPUlRfRVJST1IgICAgICA9IEltcG9ydCBFcnJvcgotX1VJX0VSUk9SX0lNUE9SVElOR19JVFNFTEYgID0gVGhpcyBmaWxlIGlzIGF0dGVtcHRpbmcgdG8gaW1wb3J0IGl0c2VsZi4gIENoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIGltcG9ydC4KLQotCi1fVUlfVVNFX1dTLUlfU1RZTEVfU0NIRU1BX0lNUE9SVCAgICAgICA9IFVzZSBXUy1JIHN0eWxlIHNjaGVtYSBpbXBvcnQKLV9VSV9CSU5ESU5HX1dJWkFSRCAgICAgICAgICAgICAgICAgICAgID0gQmluZGluZyBXaXphcmQKLV9VSV9TUEVDSUZZX0JJTkRJTkdfREVUQUlMU19MQUJFTCAgICAgID0gU3BlY2lmeSB0aGUgZGV0YWlscyBvZiB0aGUgYmluZGluZyB0aGF0IHdpbGwgYmUgY3JlYXRlZAotX1VJX1BPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBQb3J0IFR5cGUKLV9VSV9QT1JUX1dJWkFSRCAgICAgICAgICAgICAgICAgICAgICAgID0gUG9ydCBXaXphcmQKLV9VSV9TUEVDSUZZX1BPUlRfREVUQUlMUyAgICAgICAgICAgICAgID0gU3BlY2lmeSBQb3J0IERldGFpbHMKLV9VSV9TUEVDSUZZX1BPUlRfREVUQUlMU19UT19CRV9DUkVBVEVEID0gU3BlY2lmeSB0aGUgZGV0YWlscyBvZiB0aGUgcG9ydCB0aGF0IHdpbGwgYmUgY3JlYXRlZAotX1VJX0JJTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBCaW5kaW5nCi1fVUlfTkFNRVNQQUNFUyAgICAgICAgICAgICAgICAgICAgICAgICA9IE5hbWVzcGFjZXMKLV9VSV9FRElUX05BTUVTUEFDRVMgICAgICAgICAgICAgICAgICAgID0gRWRpdCBOYW1lc3BhY2VzLi4uCi1fVUlfU0VMRUNUX1JFR0lTVEVSRURfTkFNRVNQQUNFUyAgICAgICA9IFNlbGVjdCBGcm9tIFJlZ2lzdGVyZWQgTmFtZXNwYWNlcwotX1VJX1NQRUNJRllfTkVXX05BTUVTUEFDRSAgICAgICAgICAgICAgPSBTcGVjaWZ5IE5ldyBOYW1lc3BhY2UKLV9VSV9TRUxFQ1RfTkFNRVNQQUNFX1RPX0FERCAgICAgICAgICAgID0gU2VsZWN0IHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHRvIGFkZC4KLV9VSV9FTlRFUl9SRVFfUFJFRklYX0FORF9OQU1FU1BBQ0UgICAgID0gRW50ZXIgdGhlIHJlcXVpcmVkIHByZWZpeCBhbmQgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbi4KLV9VSV9UQVJHRVRfTkFNRVNQQUNFICAgICAgICAgICAgICAgICAgID0gVGFyZ2V0IE5hbWVzcGFjZQotX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlMgICAgICAgICAgICAgPSBOYW1lc3BhY2UgRGVjbGFyYXRpb25zCi1fVUlfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFkZC4uLgotX1VJX0FERF9OQU1FU1BBQ0VfREVDTEFSQVRJT05TX1RJVExFICAgPSBBZGQgTmFtZXNwYWNlIERlY2xhcmF0aW9ucwotX1VJX1NPQVBfUE9SVF9ERVRBSUxTICAgICAgICAgICAgICAgICAgPSBTT0FQIFBvcnQgRGV0YWlscwotX1VJX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMb2NhdGlvbjoKLV9VSV9IVFRQX1BPUlRfREVUQUlMUyAgICAgICAgICAgICAgICAgID0gSFRUUCBQb3J0IERldGFpbHMKLV9VSV9FRElUX05BTUVTUEFDRVNfRElBTE9HX1RJVExFICAgICAgID0gRWRpdCBOYW1lc3BhY2VzCi1fVUlfREVQRU5ERU5DSUVTX0NIQU5HRUQgICAgICAgICAgICAgICA9IERlcGVuZGVuY2llcyBDaGFuZ2VkCi1fVUlfREVQRU5ERU5DSUVTX0NIQU5HRURfUkVGUkVTSCAgICAgICA9IE9uZSBvciBtb3JlIGRlcGVuZGVuY2llcyBoYXZlIGNoYW5nZWQuICBEbyB5b3Ugd2FudCB0byByZWZyZXNoIHRoZSBlZGl0b3IgdG8gcmVmbGVjdCB0aGVzZSBjaGFuZ2VzPwotX1VJX1JFTE9BRF9ERVBFTkRFTkNJRVMgICAgICAgICAgICAgICAgPSBSZWxvYWQgRGVwZW5kZW5jaWVzCi1fVUlfVU5TUEVDSUZJRUQgICAgICAgICAgICAgICAgICAgICAgICA9ICh1bnNwZWNpZmllZCkKLV9VSV9OT19JTVBPUlRfU1BFQ0lGSUVEICAgICAgICAgICAgICAgID0gKG5vIGltcG9ydCBsb2NhdGlvbiBzcGVjaWZpZWQpCi1fVUlfR0VORVJBVEVfQklORElOR19DT05URU5UICAgICAgICAgICA9IEdlbmVyYXRlIEJpbmRpbmcgQ29udGVudC4uLgotX1VJX09QRU5fSU1QT1JUICAgICAgICAgICAgICAgICAgICAgICAgPSBPcGVuIEltcG9ydAotCi1fVUlfUFJFRl9QQUdFX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9IERlZmF1bHQgVGFyZ2V0IE5hbWVzcGFjZToKLV9VSV9QUkVGX1BBR0VfQ1JFQVRJTkdfRklMRVMJCSAgID0gQ3JlYXRpbmcgZmlsZXMKLQotX1VJX0NSRUFURV9NRVNTQUdFX0NIRUNLQk9YX0xBQkVMICAgICAgID0gQ3JlYXRlIGRlZmF1bHQgbWVzc2FnZXMKLV9VSV9ERUxFVEVfQVNTT0NJQVRFRF9NU0dfQU5EX1BBUlRTICAgICA9IERlbGV0ZSBhc3NvY2lhdGVkIE1lc3NhZ2VzIGFuZCBQYXJ0cwotX1VJX0RFTEVURV9PUEVSQVRJT05fVElUTEUgICAgICAgICAgICAgID0gRGVsZXRlIE9wZXJhdGlvbgotX1VJX0xBQkVMX1dBUk5JTkdfRFVQTElDQVRFX05BTUVfRVhJU1RTID0gV2FybmluZzogZHVwbGljYXRlIG5hbWUgYWxyZWFkeSBleGlzdHMKLQotX1dBUk5fTkFNRV9IQVNfU1BBQ0UgICAgICAgICA9IElXQVgxNDAyVyBOYW1lIGZpZWxkIGNhbm5vdCBjb250YWluIGEgc3BhY2UKLV9XQVJOX05BTUVfSU5WQUxJRF9GSVJTVCAgICAgID0gSVdBWDE0MDNXIEZpcnN0IGNoYXJhY3RlciBpbiBuYW1lIGZpZWxkIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgKCdfJywgJzonLCAnbGV0dGVyJykKLV9XQVJOX05BTUVfTVVTVF9DT05UQUlOX0FUX0xFQVNUX09ORV9DSEFSID0gSVdBWDE0MTVXIE5hbWUgZmllbGQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIKLV9XQVJOX05BTUVfSU5WQUxJRF9DSEFSICAgICAgID0gSVdBWDE0MDRXIE5hbWUgZmllbGQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIgKCcKLV9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQgICA9ICcpCi0KLQotISAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0hIFRyYW5zbGF0b3JzIDogcGxlYXNlIGRvbid0IHRyYW5zbGF0ZSBhbnkgc3RyaW5nIGJlbG93IHRoaXMgbGluZSAKLSEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotISBfREVCVUdfVVBEQVRFX1BPTElDWSA9IDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZGU2NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luICAgICAgICAgICAgICAgICAgICAgCi0gICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiCi0gICBuYW1lPSIlX1VJX1BMVUdJTl9OQU1FIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lID0gIkVjbGlwc2Uub3JnIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzZGxlZGl0b3IuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4gICAgCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZ2VmIi8+ICAgICAgICAgIAotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+ICAgICAgCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPiAgICAgIAotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4gICAgICAKLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnhzZCIvPiAgICAgICAgICAgIAotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IiVfVUlfRURJVE9SX05BTUUiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvd3NkbF9maWxlX29iai5naWYiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ3c2RsIiAgICAgICAgICAgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3IiPgotICAgICAgPC9lZGl0b3I+Ci0gICA8L2V4dGVuc2lvbj4gICAgCi0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImludGVybmFsRWRpdG9yRXh0ZW5zaW9ucyIgbmFtZT0iSW50ZXJuYWwgRWRpdG9yIEV4dGVuc2lvbnMiLz4gIAotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzIiBuYW1lPSJFeHRlbnNpYmlsaXR5IEl0ZW0gVHJlZSBQcm92aWRlcnMiLz4gICAKLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbnRlbnRHZW5lcmF0b3JzIiBuYW1lPSJQb3J0IGFuZCBCaW5kaW5nIENvbnRlbnQgR2VuZXJhdG9ycyIvPiAgICAgICAgICAgICAgICAgICAgICAKLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByb3BlcnR5U291cmNlUHJvdmlkZXIiIG5hbWU9IlByb3BlcnR5IFNvdXJjZSBQcm92aWRlcnMiLz4KLSAgIAotICAgPCEtLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHN1cGxlbWVudCBXU0RMIDEuMSBzY2hlbWFzIGluIG9yZGVyIHRvICAgLS0+Ci0gICA8IS0tIGNvbnN0cmFpbiB0aGUgZXh0ZW5zaWJsaXR5IGVsZW1lbnRzIHRoYXQgYXJlIGFsbG93ZWQgYXQgdGhlICd3c2RsJyBsZXZlbCAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIiBuYW1lPSJFeHRlbnNpYmxpdHkgRWxlbWVudCBGaWx0ZXIiLz4gICAKLQotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlciIgbmFtZT0iUHJvcGVydHkgRGVzY3JpcHRvciBQcm92aWRlciIvPiAgIAotICAgICAgICAKLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZGV0YWlsc1ZpZXdlclByb3ZpZGVycyIgbmFtZT0iRGV0YWlscyBWaWV3ZXIgUHJvdmlkZXJzIi8+ICAgIAotICAgICAgICAgICAKLSAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzIj4KLSAgICAgIDxleHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzLmh0dHAiCi0gICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICAgICAgbGFiZWxQcm92aWRlckNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lLkhUVFBMYWJlbFByb3ZpZGVyIj4gICAgICAgICAKLSAgICAgIDwvZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgICAgIAotCi0gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVycyI+Ci0gICAgICA8ZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVycy5zb2FwIgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgIGxhYmVsUHJvdmlkZXJDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZS5TT0FQTGFiZWxQcm92aWRlciI+ICAgICAgICAgCi0gICAgICA8L2V4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAKLQotICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5jb250ZW50R2VuZXJhdG9ycyI+Ci0gICAgICA8Y29udGVudEdlbmVyYXRvcgotICAgICAgICBuYW1lPSJTT0FQIgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgIGNvbnRlbnRHZW5lcmF0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5Tb2FwQ29udGVudEdlbmVyYXRvciIKLSAgICAgICAgcG9ydE9wdGlvbnNQYWdlQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWkuU29hcFBvcnRPcHRpb25zUGFnZSIKLSAgICAgICAgYmluZGluZ09wdGlvbnNQYWdlQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWkuU29hcEJpbmRpbmdPcHRpb25zUGFnZSI+Ci0gICAgICA8L2NvbnRlbnRHZW5lcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgIAotCi0gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmNvbnRlbnRHZW5lcmF0b3JzIj4KLSAgICAgIDxjb250ZW50R2VuZXJhdG9yCi0gICAgICAgIG5hbWU9IkhUVFAiCi0gICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICAgICAgY29udGVudEdlbmVyYXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLkh0dHBDb250ZW50R2VuZXJhdG9yIgotICAgICAgICBwb3J0T3B0aW9uc1BhZ2VDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aS5IdHRwUG9ydE9wdGlvbnNQYWdlIgotICAgICAgICBiaW5kaW5nT3B0aW9uc1BhZ2VDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aS5IdHRwQmluZGluZ09wdGlvbnNQYWdlIj4KLSAgICAgIDwvY29udGVudEdlbmVyYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDxleHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXIuU29hcEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIiPgotICAgICAgPC9leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDxleHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXIuSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIiPgotICAgICAgPC9leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcj4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDxleHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXIuTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIiPgotICAgICAgPC9leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcj4KLSAgIDwvZXh0ZW5zaW9uPiAgICAKLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlciI+Ci0gICAgICA8ZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIKLSAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlci5YU0RFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDwvZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXI+Ci0gICA8L2V4dGVuc2lvbj4gICAgICAKLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgIDxjYXRlZ29yeQotICAgICAJaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy51aS5uZXciCi0gICAgIAluYW1lPSIlX1VJX0xBQkVMX05FV19DQVRFR09SWV9OQU1FX1dTIi8+Ci0gICAgIDx3aXphcmQKLSAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiCi0gICAgICAgbmFtZT0iV1NETCIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdXU0RMV2l6YXJkIgotICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICAgICAgIGljb249Imljb25zL3dzZGxfZmlsZV9vYmouZ2lmIj4KLSAgICAgICA8ZGVzY3JpcHRpb24+JV9VSV9MQUJFTF9DUkVBVEVfTkVXX1dTRExfRklMRTwvZGVzY3JpcHRpb24+Ci0gICAgICAgPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPiAKLSAgICAgPC93aXphcmQ+Ci0KLSAgICAgPHdpemFyZAotICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSIKLSAgICAgICBuYW1lPSJXU0RMIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1dTRExXaXphcmQiCi0gICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLSAgICAgICBpY29uPSJpY29ucy93c2RsX2ZpbGVfb2JqLmdpZiI+Ci0gICAgICAgPGRlc2NyaXB0aW9uPiVfVUlfTEFCRUxfQ1JFQVRFX05FV19XU0RMX0ZJTEU8L2Rlc2NyaXB0aW9uPgotICAgICAgIDxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4gCi0gICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+IAotICAgPGVkaXRvckNvbnRyaWJ1dGlvbiAKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5hcnRpY2xlcy5hY3Rpb24uY29udHJpYnV0aW9uLmVkaXRvcjIiIAotICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3IiPgotCi0gICAgICA8bWVudQotICAgICAgICAgaWQ9IldTRExFZGl0b3IiCi0gICAgICAgICBsYWJlbD0iJV9VSV9FRElUT1JfTkFNRSIKLSAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyI+Ci0gICAgICAgICA8c2VwYXJhdG9yIG5hbWU9Imdyb3VwMSIvPgotICAgICAgPC9tZW51PgotICAgICAKLSAgICAgIDxhY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5hY3Rpb25zLlJlbG9hZERlcGVuZGVuY2llc0FjdGlvbkRlbGVnYXRlIiAKLSAgICAgICAgIGxhYmVsPSIlX1VJX1JFTE9BRF9ERVBFTkRFTkNJRVMiCi0gICAgICAgICBpY29uPSJpY29ucy9yZWxvYWRncmFtbWFyLmdpZiIgCi0gICAgICAgICB0b29sdGlwPSJSZWxvYWQgRGVwZW5kZW5jaWVzIgotICAgICAgICAgbWVudWJhclBhdGg9IldTRExFZGl0b3IvZ3JvdXAxIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUiPiAKLSAgICAgIDwvYWN0aW9uPiAgCi0gICAgICAgICAKLSAgICAgIDwhLS0KLSAgICAgIDxhY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlZhbGlkYXRlQWN0aW9uRGVsZWdhdGUiIAotICAgICAgICAgbGFiZWw9IiVfVUlfQUNUSU9OX1ZBTElEQVRFX1dTRExfRE9DVU1FTlQiIAotICAgICAgICAgaWNvbj0iaWNvbnMvdmFsaWRhdGUuZ2lmIiAKLSAgICAgICAgIHRvb2x0aXA9IiVfVUlfQUNUSU9OX1ZBTElEQVRFX1dTRExfRE9DVU1FTlQiCi0gICAgICAgICBtZW51YmFyUGF0aD0iV1NETEVkaXRvci9ncm91cDEiCi0gICAgICAgICB0b29sYmFyUGF0aD0iJU5vcm1hbC9XU0RMRWRpdG9yIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuVmFsaWRhdGVBY3Rpb25EZWxlZ2F0ZSI+IAotICAgICAgPC9hY3Rpb24+ICAgICAgCi0gICAgICAtLT4KLSAgICAgICAgICAgICAgICAgCi0gICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci08L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JPCEtLSBwbGFjZSBldmVyeXRoaW5nIGluICJXZWIgYW5kIFhNTCIgLS0+Ci0gICAgICA8cGFnZQotCQkJbmFtZT0iJV9VSV9XU0RMX0xBQkVMIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbmRlZGNvbmZpZ3VyYXRpb24iPgotICAgICAgPCEtLSBhZGQgcHJlZmVyZW5jZSBwYWdlcyB0byB0aGUgY29udGV4dCBtZW51IGFjdGlvbiAoSUQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBkZWNsYXJlZCAicGF0aCIgYWJvdmUpIC0tPgotICAgICAgPGRlZmluaXRpb24KLSAgICAgIAkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yLnNvdXJjZSIgLz4KLTwhLS0KLSAgICAgIDxwcm9wZXJ0eXNoZWV0Y29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuV1NETFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotICAgICAgICAgICAgdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMVGV4dEVkaXRvciI+Ci0gICAgICA8L3Byb3BlcnR5c2hlZXRjb25maWd1cmF0aW9uPgotLS0+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5wcm9wZXJ0eUNvbnRyaWJ1dG9yIj4KLSAgICAgIDxwcm9wZXJ0eUNvbnRyaWJ1dG9yCi0gICAgICAgICAgICB0eXBlTWFwcGVyPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uV1NETFR5cGVNYXBwZXIiCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMVGV4dEVkaXRvciIKLSAgICAgICAgICAgIHNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5XU0RMU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlciIKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5XU0RMTGFiZWxQcm92aWRlciI+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImdlbmVyYWwiPgotICAgICAgICAgPC9wcm9wZXJ0eUNhdGVnb3J5PgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJuYW1lc3BhY2UiPgotICAgICAgICAgPC9wcm9wZXJ0eUNhdGVnb3J5PgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJvdGhlciI+Ci0gICAgICAgICA8L3Byb3BlcnR5Q2F0ZWdvcnk+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImF0dHJpYnV0ZXMiPgotICAgICAgICAgPC9wcm9wZXJ0eUNhdGVnb3J5PgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbnVtZXJhdGlvbnMiPgotICAgICAgICAgPC9wcm9wZXJ0eUNhdGVnb3J5PgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkb2N1bWVudGF0aW9uIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZmFjZXRzIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgIDwvcHJvcGVydHlDb250cmlidXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5wcm9wZXJ0eVRhYnMiPgotICAgICAgPHByb3BlcnR5VGFicwotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETFRleHRFZGl0b3IiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9HRU5FUkFMIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImdlbmVyYWwiCi0gICAgICAgICAgICAgICBpZD0iY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIj4KLSAgICAgICAgIDwvcHJvcGVydHlUYWI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX05BTUVTUEFDRSIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJuYW1lc3BhY2UiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0iY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMubmFtZXNwYWNlIj4KLSAgICAgICAgIDwvcHJvcGVydHlUYWI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX09USEVSIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMub3RoZXIiPgotICAgICAgICAgPC9wcm9wZXJ0eVRhYj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfQVRUUklCVVRFUyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJhdHRyaWJ1dGVzIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMuYXR0cmlidXRlcyI+Ci0gICAgICAgICA8L3Byb3BlcnR5VGFiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9FTlVNRVJBVElPTlMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZW51bWVyYXRpb25zIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZW51bWVyYXRpb25zIj4KLSAgICAgICAgIDwvcHJvcGVydHlUYWI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04iCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmRvY3VtZW50YXRpb24iPgotICAgICAgICAgPC9wcm9wZXJ0eVRhYj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfU0VDVElPTl9BRFZBTkNFRF9BVFRSSUJVVEVTIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImZhY2V0cyIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmZhY2V0cyI+Ci0gICAgICAgICA8L3Byb3BlcnR5VGFiPgotICAgICAgPC9wcm9wZXJ0eVRhYnM+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbEVkaXRvckV4dGVuc2lvbnMiPgotICAgICA8aW50ZXJuYWxFZGl0b3JFeHRlbnNpb24gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5YU0RFeHRlbnNpb24iLz4KLSAgPC9leHRlbnNpb24+ICAKLQotICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5leHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMiPgotICAgICAgPGV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5leHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMueHNkIgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAgICAgICAgICAgIAotICAgICAgICBsYWJlbFByb3ZpZGVyQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5YU0RMYWJlbFByb3ZpZGVyIj4KLSAgICAgIDwvZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2UyOGI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmF2aWdhdGlvbkxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5XU0RMTWVudUFjdGlvbkNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLldTRExHcmFwaFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuV1NETEVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETE1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZS5FeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmUuTW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmUuTW9kZWxBZGFwdGVyTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyLlNFRERvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50eXBlc3lzdGVtLkV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMuV1NETERldGFpbHNWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy5XU0RMRGV0YWlsc1ZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8vcHVibGljIGNsYXNzIFdTRExFZGl0b3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dE11bHRpUGFnZUVkaXRvclBhcnQgaW1wbGVtZW50cyBJTmF2aWdhdGlvbkxvY2F0aW9uUHJvdmlkZXIKLXB1YmxpYyBjbGFzcyBXU0RMRWRpdG9yIGV4dGVuZHMgV1NETE11bHRpUGFnZUVkaXRvclBhcnQgaW1wbGVtZW50cyBJTmF2aWdhdGlvbkxvY2F0aW9uUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIEV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIgZXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlcjsKLQotICBwcm90ZWN0ZWQgV1NETFRleHRFZGl0b3IgdGV4dEVkaXRvcjsKLSAgcHJvdGVjdGVkIFdTRExHcmFwaFZpZXdlciBncmFwaFZpZXdlcjsKLSAgcHJvdGVjdGVkIFdTRExEZXRhaWxzVmlld2VyIGRldGFpbHNWaWV3ZXI7Ci0gIHByb3RlY3RlZCBXU0RMU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyOwotICBwcm90ZWN0ZWQgU2FzaEZvcm0gc2FzaEZvcm07Ci0KLSAgaW50IGdyYXBoUGFnZUluZGV4OwotCi0gIC8vcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlOwotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcm90ZWN0ZWQgV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlciByZXNvdXJjZUNoYW5nZUhhbmRsZXI7Ci0gIAotICAvLyBVc2VkIGZvciBDdXQsIENvcHksIFBhc3RlIGFjdGlvbnMuICBUaGlzIGFjdHMgYXMgYSBjb3B5LCBjdXQsIHBhc3RlIGNsaXBib2FyZAotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgY2xpcGJvYXJkRWxlbWVudDsKLQotICBwdWJsaWMgV1NETEVkaXRvcigpCi0gIHsKLSAgICBzZWxlY3Rpb25NYW5hZ2VyID0gbmV3IFdTRExTZWxlY3Rpb25NYW5hZ2VyKCk7Ci0gIH0KLSAgCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotCXsKLSAgICBzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFnZS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGFydEluaXRFeGNlcHRpb24pIAotICAgIHsKLQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0JfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoa2V5ID09IElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcykKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzZWxlY3Rpb25NYW5hZ2VyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICAvLyBjYWxsIHRoZSBleHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyJ3MgaW5wdXRDaGFuZ2VkIG1ldGhvZCBhIG51bGwgdmlld2VyIAotICAgIC8vIHNvIHRoYXQgdGhlIG91dGxpbmUncyBjb250ZW50cHJvdmlkZXIvYWRhcHRlcnMgZG9uJ3QgYXR0ZW1wdCB0byB1cGRhdGUgdGhlIHZpZXdlcgotICAgIC8vIGFmdGVyIHRoZSBlZGl0b3IgY2xvc2VzCi0gICAgZXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlci5pbnB1dENoYW5nZWQobnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgaWYgKHJlc291cmNlQ2hhbmdlSGFuZGxlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc291cmNlQ2hhbmdlSGFuZGxlci5kaXNwb3NlKCk7Ci0gICAgfQotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMU2VsZWN0aW9uTWFuYWdlciBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25NYW5hZ2VyOwotICB9Ci0KLSAgcHVibGljIEV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIgZ2V0RXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlcigpCi0gIHsKLSAgICBpZiAoZXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIGV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIgPSBuZXcgRXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgV1NETFRleHRFZGl0b3IgZ2V0V1NETFRleHRFZGl0b3IoKQotICB7Ci0gICAgcmV0dXJuIHRleHRFZGl0b3I7Ci0gIH0KLQotICBwdWJsaWMgV1NETEdyYXBoVmlld2VyIGdldEdyYXBoVmlld2VyKCkKLSAgewotICAgIHJldHVybiBncmFwaFZpZXdlcjsKLSAgfQotCi0gIHB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldFN0cnVjdHVyZWRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gdGV4dEVkaXRvci5nZXRNb2RlbCgpOwotICB9Ci0KLSAgcHVibGljIERvY3VtZW50IGdldFhNTERvY3VtZW50KCkKLSAgewotICAgIHJldHVybiAoKElET01Nb2RlbCl0ZXh0RWRpdG9yLmdldE1vZGVsKCkpLmdldERvY3VtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoaXMgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqIDxwPgotICAgKiBTdWJjbGFzc2VzIG9mIDxjb2RlPk11bHRpUGFnZUVkaXRvcjwvY29kZT4gbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gICAqIDwvcD4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhZ2VzKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChyZXNvdXJjZUNoYW5nZUhhbmRsZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzb3VyY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFdTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgIHJlc291cmNlQ2hhbmdlSGFuZGxlci5hdHRhY2goKTsKLSAgICAgIH0KLSAgICAgIGNyZWF0ZVNvdXJjZVBhZ2UoKTsKLSAgICAgIGFkZFNvdXJjZVBhZ2UoKTsKLQotICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBXU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dChXU0RMUmVzb3VyY2VJbXBsLlVTRV9FWFRFTlNJT05fRkFDVE9SSUVTLCBCb29sZWFuLkZBTFNFKTsKLQotICAgICAgSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dClnZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0KLSAgICAgIC8vIGNyZWF0ZSBhIGRlZmluaXRpb24gYmFzZWQgb24gdGhlIHRleHQgZWRpdG9yIGRvY3VtZW50Ci0gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBkZWZpbml0aW9uID0gV1NETFJlc291cmNlVXRpbC5jcmVhdGVEZWZpbml0aW9uKHJlc291cmNlU2V0LCBmaWxlLCBnZXRYTUxEb2N1bWVudCgpKTsKLQotICAgICAgV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5zZXRUeXBlU3lzdGVtUHJvdmlkZXIoZGVmaW5pdGlvbiwgbmV3IEV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIodGhpcykpOwotCi0gICAgICAvL1JlZmVyZW5jZU1hbmFnZXIuYWRhcHREZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgbmV3IFNFRERvY3VtZW50QWRhcHRlcihnZXRTdHJ1Y3R1cmVkTW9kZWwoKSwgZGVmaW5pdGlvbik7Ci0gICAgICBjcmVhdGVBbmRBZGRHcmFwaFBhZ2UoKTsKLQotICAgICAgLy8gZ2V0IHRoZSB0eXBlIG9mIHBhZ2UgYW5kIHNldCB0aGUgYWN0aXZlIHBhZ2UgdG8gc2hvdwotICAgICAgaW50IHBhZ2VJbmRleFRvU2hvdyA9IGdldERlZmF1bHRQYWdlSW5kZXgoKTsKLSAgICAgIHNldEFjdGl2ZVBhZ2UocGFnZUluZGV4VG9TaG93KTsKLSAgICAgIAotICAgICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXREZWZpbml0aW9uKCkpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oU1NFQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW4xX0VSUk9SXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiBpbml0aWFsaXppbmcgdGhlIGlucHV0IGZvciB0aGUgdGhlIGVkaXRvcidzIHNvdXJjZSBwYWdlLiIKLSAgICB9Ci0gICAgLy8gVE9ETzogYWRkIGEgY2F0Y2ggYmxvY2sgaGVyZSBmb3IgYW55IGV4Y2VwdGlvbiB0aGUgZGVzaWduIHBhZ2UgdGhyb3dzIGFuZCBjb252ZXJ0IGl0IGludG8gYSBtb3JlIGluZm9ybWF0aXZlIG1lc3NhZ2UuCi0gIH0KLQotICBwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRQYWdlSW5kZXgoKQotICB7Ci0gICAgaWYgKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0UGFnZSgpLmVxdWFscyhXU0RMRWRpdG9yUGx1Z2luLkdSQVBIX1BBR0UpKQotICAgIHsKLSAgICAgIGlmIChncmFwaFBhZ2VJbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdyYXBoUGFnZUluZGV4OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc291cmNlUGFnZUluZGV4OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuV1NETE11bHRpUGFnZUVkaXRvclBhcnQjY3JlYXRlVGV4dEVkaXRvcigpCi0gICAqLwotICBwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRFZGl0b3IgY3JlYXRlVGV4dEVkaXRvcigpCi0gIHsKLSAgICB0ZXh0RWRpdG9yID0gbmV3IFdTRExUZXh0RWRpdG9yKHRoaXMpOwotICAgIHJldHVybiB0ZXh0RWRpdG9yOwotICB9Ci0KLSAgLyoqCi0gICAqIGNyZWF0ZSBvdXIgb3duCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VQYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5jcmVhdGVTb3VyY2VQYWdlKCk7Ci0KLSAgICB0ZXh0RWRpdG9yID0gKFdTRExUZXh0RWRpdG9yKWdldFRleHRFZGl0b3IoKTsKLSAgfQotCi0gIGludCBzb3VyY2VQYWdlSW5kZXggPSAtMTsKLSAgLyoqCi0gICAqIEFkZHMgdGhlIHNvdXJjZSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFNvdXJjZVBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLSAgewotICAgIHNvdXJjZVBhZ2VJbmRleCA9IGFkZFBhZ2UodGV4dEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0KLSAgCXNldFBhZ2VUZXh0KHNvdXJjZVBhZ2VJbmRleCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVEFCX1NPVVJDRSIpKTsKLSAgICAvLyBkZWZlY3QgMjIzMDQzIC4uLiBkbyB0ZXh0RWRpdG9yLnNldE1vZGVsKCkgaGVyZSBpbnN0ZWFkIG9mIGluIGNyZWF0ZVNvdXJjZVBhZ2UoKQotICAgIHRleHRFZGl0b3Iuc2V0TW9kZWwoKElGaWxlRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgLy8gdGhlIHVwZGF0ZXMgY3JpdGljYWwsIHRvIGdldCB2aWV3ZXIgc2VsZWN0aW9uIG1hbmFnZXIgYW5kIGhpZ2hsaWdodGluZyB0byB3b3JrCi0gICAgdGV4dEVkaXRvci51cGRhdGUoKTsKLSAgfQotICAKLSAgaW50W10gd2VpZ2h0czsKLSAgcHVibGljIHZvaWQgc2V0RGVzaWduV2VpZ2h0cyhpbnRbXSB3ZWlnaHRzLCBib29sZWFuIHVwZGF0ZVNvdXJjZURlc2lnbikKLSAgewotICAgIHRoaXMud2VpZ2h0cyA9IHdlaWdodHM7Ci0gICAgaWYgKHVwZGF0ZVNvdXJjZURlc2lnbikKLSAgICB7Ci0gICAgICBzYXNoRm9ybS5zZXRXZWlnaHRzKHdlaWdodHMpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IGFyZykKLSAgewotICAgIHN1cGVyLnBhZ2VDaGFuZ2UoYXJnKTsKLSAgICBpZiAoZ2V0UGFnZVRleHQoYXJnKS5lcXVhbHMoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVEFCX1NPVVJDRSIpKSkgLy8gVFJBTlNMQVRFICEKLSAgICB7Ci0gICAgICAvLyB1cGRhdGUgdGhlIGlucHV0Ci0gICAgfQotICAgIGVsc2UgaWYgKGdldFBhZ2VUZXh0KGFyZykuZXF1YWxzKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RBQl9HUkFQSCIpKSkgLy8gVFJBTlNMQVRFICEKLSAgICB7Ci0gICAgICAvLyB1cGRhdGUgdGhlIGlucHV0Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgQ29sb3IgZGl2aWRlckNvbG9yOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIHRoZSBncmFwaCBwYWdlIGFuZCBhZGRzIGl0IHRvIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAgICoqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBbmRBZGRHcmFwaFBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLSAgewotICAgIC8vIGNyZWF0ZSB0aGUgZ3JhcGggcGFnZQotICAgIHNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKGdldENvbnRhaW5lcigpLCBTV1QuQk9SREVSKTsKLSAgICBzYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICBzYXNoRm9ybS5zZXRPcmllbnRhdGlvbihTV1QuVkVSVElDQUwpOwotICAgIGludFtdIHdlaWdodHMgPSB7IDgsIDMgfTsKLQotICAgIGdyYXBoUGFnZUluZGV4ID0gYWRkUGFnZShzYXNoRm9ybSk7Ci0gICAgc2V0UGFnZVRleHQoZ3JhcGhQYWdlSW5kZXgsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RBQl9HUkFQSCIpKTsKLQotICAgIC8vIGNyZWF0ZSB0aGUgZ3JhcGggdmlld2VyCi0gICAgZ3JhcGhWaWV3ZXIgPSBuZXcgV1NETEdyYXBoVmlld2VyKHRoaXMpOwotICAgIGdyYXBoVmlld2VyLmNyZWF0ZUNvbnRyb2woc2FzaEZvcm0pOwotCi0vLyAgICBkZXRhaWxzVmlld2VyID0gbmV3IFdTRExEZXRhaWxzVmlld2VyKHRoaXMpOyAgICAKLS8vICAgIGRldGFpbHNWaWV3ZXIuY3JlYXRlQ29udHJvbChzYXNoRm9ybSk7ICAKLS8vCi0vLyAgICBzYXNoRm9ybS5zZXRXZWlnaHRzKHdlaWdodHMpOwotCi0gICAgaWYgKGRpdmlkZXJDb2xvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGRpdmlkZXJDb2xvciA9IG5ldyBDb2xvcihnZXRDb250YWluZXIoKS5nZXREaXNwbGF5KCksIDE0MywgMTQxLCAxMzgpOwotICAgIH0KLQotICAgIGdldENvbnRhaW5lcigpLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKQotICAgIHsKLSAgICAgIC8qKgotICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXIjcGFpbnRDb250cm9sKFBhaW50RXZlbnQpCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQ29tcG9zaXRlKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKXNvdXJjZTsKLSAgICAgICAgICBSZWN0YW5nbGUgYm91bmRhcnkgPSBjb21wLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICBlLmdjLnNldEZvcmVncm91bmQoZGl2aWRlckNvbG9yKTsKLSAgICAgICAgICBlLmdjLmRyYXdMaW5lKGJvdW5kYXJ5LngsIGJvdW5kYXJ5LnksIGJvdW5kYXJ5LnggKyBib3VuZGFyeS53aWR0aCwgYm91bmRhcnkueSk7Ci0gICAgICAgICAgc2V0RGVzaWduV2VpZ2h0cyhzYXNoRm9ybS5nZXRXZWlnaHRzKCksIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpCi0gIHsKLSAgICBzdXBlci5zZXRGb2N1cygpOwotICAgIGludCBhY3RpdmVQYWdlID0gZ2V0QWN0aXZlUGFnZSgpOwotICAgIGlmIChhY3RpdmVQYWdlID09IHNvdXJjZVBhZ2VJbmRleCkKLSAgICB7Ci0gICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuc2V0RGVmYXVsdFBhZ2UoV1NETEVkaXRvclBsdWdpbi5TT1VSQ0VfUEFHRSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuc2V0RGVmYXVsdFBhZ2UoV1NETEVkaXRvclBsdWdpbi5HUkFQSF9QQUdFKTsKLSAgICB9Ci0gIH0KLQotICAvLwotICAvLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWx0SW5XU0RMRWRpdG9yRXh0ZW5zaW9uIGltcGxlbWVudHMgV1NETEVkaXRvckV4dGVuc2lvbgotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb25UeXBlU3VwcG9ydGVkKGludCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IE9VVExJTkVfVFJFRV9DT05URU5UX1BST1ZJREVSCi0gICAgICAgIHx8IHR5cGUgPT0gT1VUTElORV9MQUJFTF9QUk9WSURFUgotICAgICAgICB8fCB0eXBlID09IEVESVRfUEFSVF9GQUNUT1JZCi0gICAgICAgIHx8IHR5cGUgPT0gREVUQUlMU19WSUVXRVJfUFJPVklERVIKLSAgICAgICAgfHwgdHlwZSA9PSBNRU5VX0FDVElPTl9DT05UUklCVVRPUgotICAgICAgICB8fCB0eXBlID09IE5PREVfUkVDT05DSUxFUgotICAgICAgICB8fCB0eXBlID09IE5PREVfQVNTT0NJQVRJT05fUFJPVklERVI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCAmJiAhKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSkgfHwgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb25PYmplY3QoaW50IHR5cGUsIFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIHN3aXRjaCAodHlwZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBPVVRMSU5FX1RSRUVfQ09OVEVOVF9QUk9WSURFUiA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlcihXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPVVRMSU5FX0xBQkVMX1BST1ZJREVSIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgTW9kZWxBZGFwdGVyTGFiZWxQcm92aWRlcihXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBERVRBSUxTX1ZJRVdFUl9QUk9WSURFUiA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFdTRExEZXRhaWxzVmlld2VyUHJvdmlkZXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBNRU5VX0FDVElPTl9DT05UUklCVVRPUiA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFdTRExNZW51QWN0aW9uQ29udHJpYnV0b3Iod3NkbEVkaXRvcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgTk9ERV9BU1NPQ0lBVElPTl9QUk9WSURFUiA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFdTRExOb2RlQXNzb2NpYXRpb25Qcm92aWRlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIEVESVRfUEFSVF9GQUNUT1JZIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgV1NETEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotIAotICBwdWJsaWMgdm9pZCByZWxvYWREZXBlbmRlbmNpZXMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKS5zZXRQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICBXU0RMUmVzb3VyY2VVdGlsLnJlbG9hZERpcmVjdGl2ZXMoZGVmaW5pdGlvbik7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnVwZGF0ZUJpbmRpbmdSZWZlcmVuY2VzKGRlZmluaXRpb24pOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC51cGRhdGVQb3J0VHlwZVJlZmVyZW5jZXMoZGVmaW5pdGlvbik7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnVwZGF0ZU1lc3NhZ2VSZWZlcmVuY2VzKGRlZmluaXRpb24pOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC51cGRhdGVTY2hlbWFSZWZlcmVuY2VzKGRlZmluaXRpb24pOwotCi0gICAgICAvLyB0aGUgbGluZSBiZWxvdyBzaW1wbHkgY2F1c2VzIGEgbm90aWZpY2F0aW9uIGluIG9yZGVyIHRvIHVwZGF0ZSBvdXIgdmlld3MKLSAgICAgIC8vCi0gICAgICBkZWZpbml0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRlZmluaXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBnZXRHcmFwaFZpZXdlcigpLmdldENvbXBvbmVudFZpZXdlcigpLnNldFByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgb3Blbk9uU2VsZWN0aW9uKFN0cmluZyBzcGVjaWZpY2F0aW9uKQotICB7Ci0gICAgRU9iamVjdCBlT2JqZWN0ID0gZ2V0RGVmaW5pdGlvbigpLmVSZXNvdXJjZSgpLmdldEVPYmplY3Qoc3BlY2lmaWNhdGlvbik7Ci0gICAgaWYgKGVPYmplY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVPYmplY3QpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSU5hdmlnYXRpb25Mb2NhdGlvbiBjcmVhdGVFbXB0eU5hdmlnYXRpb25Mb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbmV3IEludGVybmFsVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbih0ZXh0RWRpdG9yLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgSU5hdmlnYXRpb25Mb2NhdGlvbiBjcmVhdGVOYXZpZ2F0aW9uTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIG5ldyBJbnRlcm5hbFRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb24odGV4dEVkaXRvciwgdHJ1ZSk7Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgSW50ZXJuYWxUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uIGV4dGVuZHMgVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbgotICB7Ci0gICAgcHVibGljIEludGVybmFsVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbihJVGV4dEVkaXRvciBwYXJ0LCBib29sZWFuIGluaXRpYWxpemUpCi0gICAgewotICAgICAgc3VwZXIocGFydCwgaW5pdGlhbGl6ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBzdXBlci5nZXRFZGl0b3JQYXJ0KCk7Ci0gICAgICBpZiAocGFydCBpbnN0YW5jZW9mIFdTRExFZGl0b3IpCi0gICAgICB7Ci0gICAgICAgIHBhcnQgPSAoKFdTRExFZGl0b3IpcGFydCkuZ2V0VGV4dEVkaXRvcigpOwotICAgICAgfQotICAgICAgcmV0dXJuIHBhcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0RWRpdG9yUGFydCgpOwotICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBXU0RMVGV4dEVkaXRvcikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoV1NETFRleHRFZGl0b3IpcGFydCkuZ2V0V1NETEVkaXRvcigpLmdldFRpdGxlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBSZXR1cm5zIHRoZSBlbGVtZW50IGN1cnJlbnRseSBvbiB0aGUgY29weSwgY3V0LCBwYXN0ZSBjbGlwYm9hcmQKLSAgcHVibGljIFdTRExFbGVtZW50IGdldENsaXBib2FyZENvbnRlbnRzKCkgewotICAJcmV0dXJuIGNsaXBib2FyZEVsZW1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaXBib2FyZENvbnRlbnRzKFdTRExFbGVtZW50IGVsZW1lbnQpIHsKLSAgCWNsaXBib2FyZEVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNWRmMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLkNvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5Db250ZW50R2VuZXJhdG9yUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLk5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMRWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiAvLywgSVBsdWdpbkhlbHBlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGVmYXVsdHBhZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9QQUdFID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBocGFnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9QQUdFID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNvdXJjZXBhZ2UiOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhTRF9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5YU0RFZGl0b3IiOyAKLSAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9ICJodHRwOi8vdGVtcHVyaS5vcmciOwotICAKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUFJPTVBUID0gMDsKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfSUdOT1JFID0gMTsKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEID0gMjsKLQotICBwcm90ZWN0ZWQgc3RhdGljIFdTRExFZGl0b3JQbHVnaW4gaW5zdGFuY2U7Ci0gIC8vICBwcm90ZWN0ZWQgWE1MU2NoZW1hUGFja2FnZSB4bWxzY2hlbWFQYWNrYWdlOwotLy8gIHByaXZhdGUgc3RhdGljIE1zZ0xvZ2dlciBteU1zZ0xvZ2dlcjsKLQotICBwcml2YXRlIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSB3c2RsRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIHByaXZhdGUgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeTsKLSAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5IHRyZWVQcm92aWRlclJlZ2lzdHJ5OwotICBwcml2YXRlIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5OwotICBwcml2YXRlIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnk7Ci0gIHByaXZhdGUgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5OwotICBwcml2YXRlIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSBjb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIHByaXZhdGUgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGRldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5OyAgCi0gIC8vcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGdyYXllZEltYWdlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotICBwcml2YXRlIGludCBkZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5ID0gREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEOwotCi0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFJlc291cmNlcyBoZWxwZXIuCi0gICAqLwotCi0gIHB1YmxpYyBXU0RMRWRpdG9yUGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpCi0gIHsKLSAgICBzdXBlcihkZXNjcmlwdG9yKTsKLSAgICBpbnN0YW5jZSA9IHRoaXM7Ci0KLSAgICAvLyBUT0RPLi4uIHJlbW92ZSB0aGlzIGNvZGUgd2hlbiB3ZSBhZGQgJ2RlcGVuZGVuY2llc0NoYW5nZWRQb2xpY3knCi0gICAgLy8gdG8gYW4gZWRpdG9yIHByZWZlcmVuY2VzIHBhZ2UKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyaW5nID0gZ2V0V1NETFN0cmluZygiX0RFQlVHX1VQREFURV9QT0xJQ1kiKTsKLSAgICAgIGludCBwb2xpY3kgPSBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZyk7Ci0gICAgICBpZiAocG9saWN5ID49IDAgJiYgcG9saWN5IDw9IERFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZX1JFTE9BRCkKLSAgICAgIHsKLSAgICAgICAgZGVwZW5kZW5jaWVzQ2hhbmdlZFBvbGljeSA9IHBvbGljeTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5IGdldFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAod3NkbEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgd3NkbEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5ID0gbmV3IFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IEludGVybmFsRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIod3NkbEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzZGxFZGl0b3JFeHRlbnNpb25SZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0RGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKGRldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotCSAgZGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnkgPSBuZXcgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICBuZXcgRGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnlSZWFkZXIoZGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gZGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGdldEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAoZXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgZXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5ID0gbmV3IE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IEVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoZXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5IGdldEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKHRyZWVQcm92aWRlclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgdHJlZVByb3ZpZGVyUmVnaXN0cnkgPSBuZXcgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeSgpOwotICAgICAgbmV3IEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnlSZWFkZXIodHJlZVByb3ZpZGVyUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gdHJlZVByb3ZpZGVyUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGdldFByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKHByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5ID0gbmV3IE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IFByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnlSZWFkZXIocHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXJSZWdpc3RyeSkucmVhZFJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBnZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKHByb3BlcnR5U291cmNlUHJvdmlkZXJSZWdpc3RyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5U291cmNlUHJvdmlkZXJSZWdpc3RyeSA9IG5ldyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgIG5ldyBQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnlSZWFkZXIocHJvcGVydHlTb3VyY2VQcm92aWRlclJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BlcnR5U291cmNlUHJvdmlkZXJSZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0UHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkgPSBuZXcgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICBuZXcgUHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkocHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5IGdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAoY29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgY29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5ID0gbmV3IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihjb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gY29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgSW5zdGFsbCBVUkwKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJMIGdldEluc3RhbGxVUkwoKQotICB7Ci0gICAgcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVzb3VyY2Ugc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU3RyaW5nKFN0cmluZyBrZXkpCi0gIHsKLSAgICByZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yKCkuZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVzb3VyY2Ugc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBhcmcwKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFdTRExTdHJpbmcoa2V5KSwgbmV3IE9iamVjdCBbXSB7IGFyZzAgfSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgcmVzb3VyY2Ugc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRXU0RMU3RyaW5nKGtleSksIG5ldyBPYmplY3QgW10geyBhcmcwLCBhcmcxIH0pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcGx1Z2luIHBoeXNpY2FsIGRpcmVjdG9yeSBsb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQbHVnaW5Mb2NhdGlvbigpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUGF0aCBpbnN0YWxsUGF0aCA9IG5ldyBQYXRoKGdldEluc3RhbGxVUkwoKS50b0V4dGVybmFsRm9ybSgpKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgU3RyaW5nIGluc3RhbGxTdHIgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKG5ldyBVUkwoaW5zdGFsbFBhdGgudG9TdHJpbmcoKSkpLmdldEZpbGUoKTsKLSAgICAgIHJldHVybiBuZXcgUGF0aChpbnN0YWxsU3RyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIldTRExFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luTG9jYXRpb24oKSBleGNlcHRpb24uLiIgKyBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGltYWdlRGVzY3JpcHRvckNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIHByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgaW50ZXJuYWxHZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkKLSAgewotICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXQoa2V5KTsKLSAgICBpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpCi0gICAgewotICAgICAgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsIGtleSk7Ci0gICAgICBpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGltYWdlRGVzY3JpcHRvckNhY2hlLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmludGVybmFsR2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKQotICB7Ci0gICAgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotICAgIAotICAgIGlmIChpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShnZXRDbGFzcygpLCBpY29uTmFtZSkpOwotICAgICAgcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXksIGJvb2xlYW4gaXNHcmF5ZWQpCi0gICAgeyAKLSAgICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICAgIGlmICghaXNHcmF5ZWQpCi0gICAgICB7Ci0gICAgICAgIGltYWdlID0gc3VwZXIuZ2V0SW1hZ2Uoa2V5KTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbWFnZSA9IChJbWFnZSlncmF5ZWRJbWFnZU1hcC5nZXQoa2V5KTsKLSAgICAgICAgaWYgKGltYWdlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJbWFnZSBjb2xvckltYWdlID0gc3VwZXIuZ2V0SW1hZ2Uoa2V5KTsKLSAgICAgICAgICBpZiAoY29sb3JJbWFnZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBjb2xvckltYWdlLCBTV1QuSU1BR0VfR1JBWSk7Ly9TV1QuSU1BR0VfRElTQUJMRSk7Ci0gICAgICAgICAgICBncmF5ZWRJbWFnZU1hcC5wdXQoa2V5LCBpbWFnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotICAqLwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1ldGFkYXRhIGRpcmVjdG9yeSBmb3IgdGhpcyBwbHVnaW4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhRGlyZWN0b3J5KCkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdTRExFZGl0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkKLSAgewotICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFNoZWxsIGdldFNoZWxsKCkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkKLSAgewotICAgIHN1cGVyLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoc3RvcmUpOwotICAgIHN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9QQUdFLCBHUkFQSF9QQUdFKTsKLSAgICAKLSAgICAvLyBXU0RMUHJlZmVyZW5jZVBhZ2UgcHJlZnMKLSAgICBzdG9yZS5zZXREZWZhdWx0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UiKSwgREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAvLyBEbyB3ZSBuZWVkIHRoaXMgcHJlZmVyZW5jZSBiZWxvdz8gIExvb2sgYXQgV1NETFByZWZlcmVuY2VQYWdlLmphdmEKLS8vICAgIHN0b3JlLnNldERlZmF1bHQoIkRlZnVhbHQgTG9jYXRpb246IiwgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20iKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIHNldERlZmF1bHRQYWdlCi0gICAqIFNldCB0aGUgZGVmYXVsdCBwYWdlIHRvIG9wZW4gd2hlbiB0aGUgZWRpdG9yIHN0YXJ0cy4gTWFpbnRhaW5zIHRoZSBzdGF0ZQotICAgKiB3aGVuIFdTQUQgaXMgc2h1dGRvd24gYW5kIHJlc3RhcnRlZC4KLSAgICogQHBhcmFtIHBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1bHRQYWdlKFN0cmluZyBwYWdlKQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoREVGQVVMVF9QQUdFLCBwYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhERUZBVUxUX1BBR0UpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXREZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5KCkKLSAgewotICAgIC8vcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludChERVBFTkRFQ0lFU19DSEFOR0VEX1BPTElDWSk7Ci0gICAgcmV0dXJuIGRlcGVuZGVuY2llc0NoYW5nZWRQb2xpY3k7Ci0gIH0KLX0KLQotY2xhc3MgQmFzZVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSI7Ci0KLSAgLyoqCi0gICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KFN0cmluZyBleHRlbnNpb25Qb2ludElkKQotICB7Ci0gIAlib29sZWFuICBib28gPSB0cnVlOwotICAgIElQbHVnaW5SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBleHRlbnNpb25Qb2ludElkKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gIH0KLX0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gbWFuaWZlc3RzIGFuZCByZWdpc3RlcnMgZWFjaCBpbnRlcm5hbCBlZGl0b3IgZXh0ZW5zaW9uCi0gKi8KLWNsYXNzIEludGVybmFsRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBCYXNlUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImludGVybmFsRWRpdG9yRXh0ZW5zaW9ucyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImludGVybmFsRWRpdG9yRXh0ZW5zaW9uIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeTsKLQotICBwdWJsaWMgSW50ZXJuYWxFZGl0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgc3VwZXIucmVhZFJlZ2lzdHJ5KEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZEVsZW1lbnQoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLSAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDbGFzc0xvYWRlciBwbHVnaW5DbHNMb2FkZXIgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRQbHVnaW4oKS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgcmVnaXN0cnkuYWRkKHBsdWdpbkNsc0xvYWRlciwgY2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgdGhlIHBsdWdpbiBtYW5pZmVzdHMgYW5kIHJlZ2lzdGVycyBlYWNoIGV4dGVuc2liaWxpdHkgaXRlbSB0cmVlIHByb3ZpZGVyCi0gKi8KLWNsYXNzIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlciBleHRlbmRzIEJhc2VSZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY29udGVudEdlbmVyYXRvcnMiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPTlRFTlRfR0VORVJBVE9SID0gImNvbnRlbnRHZW5lcmF0b3IiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPTlRFTlRfR0VORVJBVE9SX1BST1ZJREVSID0gImNvbnRlbnRHZW5lcmF0b3JQcm92aWRlciI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DT05URU5UX0dFTkVSQVRPUl9DTEFTUyA9ICJjb250ZW50R2VuZXJhdG9yQ2xhc3MiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUE9SVF9PUFRJT05TX1BBR0VfQ0xBU1MgPSAicG9ydE9wdGlvbnNQYWdlQ2xhc3MiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQklORElOR19PUFRJT05TX1BBR0VfQ0xBU1MgPSAiYmluZGluZ09wdGlvbnNQYWdlQ2xhc3MiOwotCi0gIHByb3RlY3RlZCBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgc3VwZXIucmVhZFJlZ2lzdHJ5KEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZEVsZW1lbnQoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfQ09OVEVOVF9HRU5FUkFUT1IpKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotICAgICAgU3RyaW5nIGdlbmVyYXRvckNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NPTlRFTlRfR0VORVJBVE9SX0NMQVNTKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgZ2VuZXJhdG9yQ2xhc3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiBiaW5kaW5nR2VuZXJhdG9yRXh0ZW5zaW9uID0gbmV3IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24obmFtZSwgZ2VuZXJhdG9yQ2xhc3MpOwotICAgICAgICBiaW5kaW5nR2VuZXJhdG9yRXh0ZW5zaW9uLnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICBiaW5kaW5nR2VuZXJhdG9yRXh0ZW5zaW9uLnNldFBvcnRPcHRpb25zUGFnZUNsYXNzTmFtZShlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUE9SVF9PUFRJT05TX1BBR0VfQ0xBU1MpKTsKLSAgICAgICAgYmluZGluZ0dlbmVyYXRvckV4dGVuc2lvbi5zZXRCaW5kaW5nT3B0aW9uc1BhZ2VDbGFzc05hbWUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0JJTkRJTkdfT1BUSU9OU19QQUdFX0NMQVNTKSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NzTG9hZGVyID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0UGx1Z2luKCkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgIGJpbmRpbmdHZW5lcmF0b3JFeHRlbnNpb24uc2V0Q2xhc3NMb2FkZXIocGx1Z2luQ2xhc3NzTG9hZGVyKTsKLSAgICAgICAgICByZWdpc3RyeS5hZGQoYmluZGluZ0dlbmVyYXRvckV4dGVuc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfQ09OVEVOVF9HRU5FUkFUT1JfUFJPVklERVIpKQotICAgIHsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgewotCQlDb250ZW50R2VuZXJhdG9yUHJvdmlkZXJFeHRlbnNpb24gY29udGVudEdlbmVyYXRvckV4dGVuc2lvbiA9IG5ldyBDb250ZW50R2VuZXJhdG9yUHJvdmlkZXJFeHRlbnNpb24oY2xhc3NOYW1lKTsKLSAgICAgICAgcmVnaXN0cnkuYWRkKGNvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBCYXNlUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUVfU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBleHRlbnNpb25Qb2ludElkOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhZ05hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBhdHRyaWJ1dGVOYW1lczsKLSAgcHJvdGVjdGVkIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLSAgcHJpdmF0ZSBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoU3RyaW5nIGV4dGVuc2lvblBvaW50SWQsIFN0cmluZyB0YWdOYW1lLCBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnRJZDsKLSAgICB0aGlzLnRhZ05hbWUgPSB0YWdOYW1lOwotICAgIHRoaXMubnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5ID0gbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCwgU3RyaW5nIHRhZ05hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcyhleHRlbnNpb25Qb2ludElkLCB0YWdOYW1lLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIGF0dHJpYnV0ZU5hbWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICBhdHRyaWJ1dGVOYW1lc1swXSA9IGF0dHJpYnV0ZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKFN0cmluZyBleHRlbnNpb25Qb2ludElkLCBTdHJpbmcgdGFnTmFtZSwgU3RyaW5nW10gYXR0cmlidXRlTmFtZXMsIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzKGV4dGVuc2lvblBvaW50SWQsIHRhZ05hbWUsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgdGhpcy5hdHRyaWJ1dGVOYW1lcyA9IGF0dHJpYnV0ZU5hbWVzOwotICB9Ci0gIC8qKgotICAgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBzdXBlci5yZWFkUmVnaXN0cnkoZXh0ZW5zaW9uUG9pbnRJZCk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZEVsZW1lbnQoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKHRhZ05hbWUpKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRV9TUEFDRSk7Ci0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENsYXNzTG9hZGVyIHBsdWdpbkNsYXNzc0xvYWRlciA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lcy5sZW5ndGggPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lc1swXSk7Ci0gICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeS5wdXQobmFtZXNwYWNlLCBjbGFzc05hbWUsIHBsdWdpbkNsYXNzc0xvYWRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZXNbaV07Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWFwLnB1dChhdHRyaWJ1dGVOYW1lLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkucHV0KG5hbWVzcGFjZSwgbWFwLCBwbHVnaW5DbGFzc3NMb2FkZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Z2luIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggZXh0ZW5zaWJpbGl0eSBpdGVtIHRyZWUgcHJvdmlkZXIKLSAqLwotY2xhc3MgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeVJlYWRlciBleHRlbmRzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXIiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFUVF9OQU1FUyA9IHsgImxhYmVsUHJvdmlkZXJDbGFzcyIsICJjb250ZW50UHJvdmlkZXJDbGFzcyIgfTsKLQotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeVJlYWRlcihOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgc3VwZXIoRVhURU5TSU9OX1BPSU5UX0lELCBUQUdfTkFNRSwgQVRUX05BTUVTLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICB9Ci19Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIEVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIiOwotCi0gIHB1YmxpYyBFbGVtZW50Q29udGVudEZpbHRlckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICBzdXBlcihFWFRFTlNJT05fUE9JTlRfSUQsIFRBR19OQU1FLCAiY2xhc3MiLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICB9Ci19Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIFByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAicHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIiOwotCi0gIHB1YmxpYyBQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5UmVhZGVyKE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICBzdXBlcihFWFRFTlNJT05fUE9JTlRfSUQsIFRBR19OQU1FLCAiY2xhc3MiLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBzdXBlci5yZWFkRWxlbWVudChlbGVtZW50KTsKLSAgfQotfQotCi1jbGFzcyBQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInByb3BlcnR5U291cmNlUHJvdmlkZXIiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIjsKLQotICBwdWJsaWMgUHJvcGVydHlTb3VyY2VQcm92aWRlclJlZ2lzdHJ5UmVhZGVyKE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICBzdXBlcihFWFRFTlNJT05fUE9JTlRfSUQsIFRBR19OQU1FLCAiY2xhc3MiLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBzdXBlci5yZWFkRWxlbWVudChlbGVtZW50KTsKLSAgfQotfQotCi1jbGFzcyBQcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJSZWdpc3RyeSBleHRlbmRzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAicHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAicHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyIjsKLQotICBwdWJsaWMgUHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkoTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSkKLSAgewotICAgIHN1cGVyKEVYVEVOU0lPTl9QT0lOVF9JRCwgVEFHX05BTUUsICJjbGFzcyIsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlYWRFbGVtZW50KGVsZW1lbnQpOwotICB9Ci19Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIERldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJkZXRhaWxzVmlld2VyUHJvdmlkZXJzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZGV0YWlsc1ZpZXdlclByb3ZpZGVyIjsKLQotICBwdWJsaWMgRGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnlSZWFkZXIoTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSkKLSAgewotICAgIHN1cGVyKEVYVEVOU0lPTl9QT0lOVF9JRCwgVEFHX05BTUUsICJjbGFzcyIsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlYWRFbGVtZW50KGVsZW1lbnQpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzc3OTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIFdTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIKLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGVSZXF1aXJlZDsKLSAgcHJvdGVjdGVkIEludGVybmFsUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotICBwcm90ZWN0ZWQgSW50ZXJuYWxQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyOwotCi0gIHB1YmxpYyBXU0RMRWRpdG9yUmVzb3VyY2VDaGFuZ2VIYW5kbGVyKFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgewotICAgIHRoaXMud3NkbEVkaXRvciA9IHdzZGxFZGl0b3I7Ci0gICAgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICBwYXJ0TGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxQYXJ0TGlzdGVuZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGF0dGFjaCgpCi0gIHsKLSAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICB3c2RsRWRpdG9yLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICB3c2RsRWRpdG9yLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIE1hcCBjb21wdXRlRGVwZW5kZW5jeU1hcCgpCi0gIHsKLSAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKTsKLSAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGRlZmluaXRpb24uZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpaS5uZXh0KCk7Ci0gICAgICBpZiAocmVzb3VyY2UgIT0gZGVmaW5pdGlvbi5lUmVzb3VyY2UoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHVyaSA9IHJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChtYXAuZ2V0KHVyaSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG1hcC5wdXQodXJpLCB1cmkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVsb2FkKCkKLSAgewotICAJYm9vbGVhbiBkb1JlbG9hZCA9IGZhbHNlOyAgCQotCWludCBwb2xpY3kgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RGVwZW5kZW5jaWVzQ2hhbmdlZFBvbGljeSgpOwotCQotICAJaWYgKHBvbGljeSA9PSBXU0RMRWRpdG9yUGx1Z2luLkRFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZX1BST01QVCkKLSAgCXsKLQkJZG9SZWxvYWQgPSBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbih3c2RsRWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERVBFTkRFTkNJRVNfQ0hBTkdFRCIpLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERVBFTkRFTkNJRVNfQ0hBTkdFRF9SRUZSRVNIIikpOyAgCQotICAJfQotICAJZWxzZSBpZiAocG9saWN5ID09IFdTRExFZGl0b3JQbHVnaW4uREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEKQotICAJewotICAJCWRvUmVsb2FkID0gdHJ1ZTsKLSAgCX0KLSAgCQotICAgIGlmIChkb1JlbG9hZCkKLSAgICB7ICAgIAotICAgICAgd3NkbEVkaXRvci5yZWxvYWREZXBlbmRlbmNpZXMoKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5pbmdUb1Jlc291cmNlQ2hhbmdlcygpCi0gIHsKLSAgCWludCBwb2xpY3kgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RGVwZW5kZW5jaWVzQ2hhbmdlZFBvbGljeSgpOwotICAJcmV0dXJuIHBvbGljeSA9PSBXU0RMRWRpdG9yUGx1Z2luLkRFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZX1BST01QVCB8fAotICAJCSAgIHBvbGljeSA9PSBXU0RMRWRpdG9yUGx1Z2luLkRFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZX1JFTE9BRDsKLSAgfQotCi0KLSAgY2xhc3MgSW50ZXJuYWxSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvcgotICB7Ci0gICAgcHJvdGVjdGVkIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlbmRpbmcgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgaW50IGNvdW50ID0gMDsKLQotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkKLSAgICB7ICAgICAgCQotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAJICAgICAJCi0gICAgICBpZiAoZGlzcGxheSAhPSBudWxsICYmIGlzTGlzdGVuaW5nVG9SZXNvdXJjZUNoYW5nZXMoKSAmJiAhaXNVcGRhdGVSZXF1aXJlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSkKLSAgICAgICAgewotICAgICAgICAgIElSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gZXZlbnQuZ2V0RGVsdGEoKS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRlbHRhc1tpXS5hY2NlcHQodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzUGVuZGluZykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1BlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgZGlzcGxheS50aW1lckV4ZWMoMjAwMCwgbmV3IFRpbWVyRXZlbnQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICB7Ci0gICAgICAgIGlmICghbGlzdC5jb250YWlucyhyZXNvdXJjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChyZXNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGNsYXNzIFRpbWVyRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZQotICAgIHsKLSAgICAgIHB1YmxpYyBUaW1lckV2ZW50KCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIk5ld1RpbWVyRXZlbnQoIiArIHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpLmVSZXNvdXJjZSgpLmdldFVSSSgpICsgIikgIiArIGNvdW50KTsgICAgICAJCi0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgcGxhdGZvcm1QYXRoID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwIGRlcGVuZGVuY3lNYXAgPSBjb21wdXRlRGVwZW5kZW5jeU1hcCgpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgcGxhdGZvcm1QYXRoID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS50b1N0cmluZygpOwotICAgICAgICAgIGlmIChkZXBlbmRlbmN5TWFwLmdldChwbGF0Zm9ybVBhdGgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNVcGRhdGVSZXF1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAod3NkbEVkaXRvci5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCkgPT0gd3NkbEVkaXRvcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNVcGRhdGVSZXF1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICBwZXJmb3JtUmVsb2FkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaXNQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgSW50ZXJuYWxQYXJ0TGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgICAgaWYgKHBhcnQgPT0gd3NkbEVkaXRvcikKLSAgICAgIHsgICAgIAotICAgICAgICBpZiAoaXNVcGRhdGVSZXF1aXJlZCkKLSAgICAgICAgewotICAgICAgICAgIGlzVXBkYXRlUmVxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICBwZXJmb3JtUmVsb2FkKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICB9Ci0gIH0KLQotCi19Ci0KLS8qCi1jbGFzcyBEZXBlbmRlbmN5VmlzaXRvcgotewotCXB1YmxpYyB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB0aGVJbXBvcnQpCi0JewotCQlpZiAodGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLQkJewotCQkJdmlzaXREZWZpbml0aW9uKHRoZUltcG9ydC5nZXRFRGVmaW5pdGlvbigpKTsKLQkJfQotCQllbHNlIGlmICh0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpICE9IG51bGwpCi0JCXsKLQkJCXZpc2l0U2NoZW1hKHRoZUltcG9ydC5nZXRFU2NoZW1hKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRYU0RTY2hlbWFEaXJlY3RpdmUoWFNEU2NoZW1hRGlyZWN0aXZlIGRpcmVjdGl2ZSkKLQl7Ci0JCVhTRFNjaGVtYSByZWZlcmVuY2VkU2NoZW1hID0gZGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0JCWlmIChyZWZlcmVuY2VkU2NoZW1hICE9IG51bGwpCi0JCXsKLQkJCXZpc2l0U2NoZW1hKHJlZmVyZW5jZWRTY2hlbWEpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLQl7Ci0JCWlmIChkZWZpbml0aW9uICE9IG51bGwpCi0JCXsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQl7Ci0JCQkJdmlzaXRJbXBvcnQoKEltcG9ydClpLm5leHQoKSk7Ci0JCQl9Ci0JCQlUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0JCQlpZiAodHlwZXMgIT0gbnVsbCkKLQkJCXsKLQotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlPYmplY3QgbyA9IGkubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotCQkJCQl7Ci0JCQkJCQlYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW87Ci0JCQkJCQlpZiAoZS5nZXRFWFNEU2NoZW1hKCkgIT0gbnVsbCkKLQkJCQkJCXsKLQkJCQkJCQl2aXNpdFNjaGVtYShlLmdldEVYU0RTY2hlbWEoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotCXsKLQkJZm9yIChJdGVyYXRvciBpID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlPYmplY3QgbyA9IGkubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0JCQl7Ci0JCQkJdmlzaXRYU0RTY2hlbWFEaXJlY3RpdmUoKFhTRFNjaGVtYURpcmVjdGl2ZSlvKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotY2xhc3MgUmVsb2FkRGVwZW5kZW5jeVZpc2l0b3IgZXh0ZW5kcyBEZXBlbmRlbmN5VmlzaXRvcgotewotCXB1YmxpYyB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB0aGVJbXBvcnQpCi0JewotCQlDb21wb25lbnRIYW5kbGVyIGhhbmRsZXIgPSBXU0RMUmVjb25jaWxlci5nZXRSZWNvbmNpbGVyKHRoZUltcG9ydCk7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdCh0aGVJbXBvcnQpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGhhbmRsZXIgIT0gbnVsbCkKLQkJewotCQkJaGFuZGxlci5yZWNvbmNpbGUod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCksIHRoZUltcG9ydCwgZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFhTRFNjaGVtYURpcmVjdGl2ZShYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlKQotCXsKLQotCX0KLX0qLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVkOTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLklYTUxQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETE11bHRpUGFnZUVkaXRvclBhcnQgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IGltcGxlbWVudHMgSVByb3BlcnR5TGlzdGVuZXIKLXsKLQotCSAgLyoqCi0JICAgKiAKLQkgICAqLwotCSAgcHVibGljIFdTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0KCkKLQkgIHsKLQkgICAgc3VwZXIoKTsKLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiBJbnRlcm5hbCBwYXJ0IGFjdGl2YXRpb24gbGlzdGVuZXIKLQkgICAqLwotCSAgY2xhc3MgUGFydExpc3RlbmVyIGV4dGVuZHMgU2hlbGxBZGFwdGVyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lciB7Ci0JICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZkFjdGl2ZVBhcnQ7Ci0JICAgIHByaXZhdGUgYm9vbGVhbiBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKLQotCSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWN0aXZhdGlvbigpIHsKLQotCSAgICAgIGlmIChmSXNIYW5kbGluZ0FjdGl2YXRpb24pCi0JICAgICAgICByZXR1cm47Ci0KLQkgICAgICBpZiAoZkFjdGl2ZVBhcnQgPT0gV1NETE11bHRpUGFnZUVkaXRvclBhcnQudGhpcykgewotCSAgICAgICAgZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gdHJ1ZTsKLQkgICAgICAgIHRyeSB7Ci0JICAgICAgICAgIHNhZmVseVNhbml0eUNoZWNrU3RhdGUoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGZpbmFsbHkgewotCSAgICAgICAgICBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQotCSAgICAvKioKLQkgICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQpCi0JICAgICAqLwotCSAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkgICAgICBmQWN0aXZlUGFydCA9IHBhcnQ7Ci0JICAgICAgaGFuZGxlQWN0aXZhdGlvbigpOwotCSAgICB9Ci0KLQkgICAgLyoqCi0JICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0KQotCSAgICAgKi8KLQkgICAgcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JICAgIH0KLQotCSAgICAvKioKLQkgICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQpCi0JICAgICAqLwotCSAgICBwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkgICAgfQotCi0JICAgIC8qKgotCSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0KQotCSAgICAgKi8KLQkgICAgcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkgICAgICBmQWN0aXZlUGFydCA9IG51bGw7Ci0JICAgIH0KLQotCSAgICAvKioKLQkgICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQpCi0JICAgICAqLwotCSAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkgICAgfQotCi0JICAgIC8qCi0JICAgICAqIEBzZWUgU2hlbGxMaXN0ZW5lciNzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50KQotCSAgICAgKi8KLQkgICAgcHVibGljIHZvaWQgc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCBlKSB7Ci0JICAgICAgaGFuZGxlQWN0aXZhdGlvbigpOwotCSAgICB9Ci0JICB9Ci0KLQkgIGNsYXNzIFRleHRJbnB1dExpc3RlbmVyIGltcGxlbWVudHMgSVRleHRJbnB1dExpc3RlbmVyIHsKLQkgICAgcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkgICAgfQotCi0JICAgIHB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JICAgIH0KLQkgIH0KLQotCSAgLyoqIFRoZSBzb3VyY2UgcGFnZSBpbmRleC4gKi8KLQkgIHByaXZhdGUgaW50IGZTb3VyY2VQYWdlSW5kZXg7Ci0JICAvKiogVGhlIHRleHQgZWRpdG9yLiAqLwotCSAgcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBmVGV4dEVkaXRvcjsKLQotCSAgcHJpdmF0ZSBQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyOwotCi0KLQkgIC8qCi0JICAgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIG1ha2UgZmlyZVByb3BlcnR5Q2hhbmdlZCBhY2Nlc3NiaWJsZSBmcm9tIHNvbWUKLQkgICAqIChhbm9ub21vdXMpIGlubmVyIGNsYXNzZXMuCi0JICAgKi8KLQkgIHByb3RlY3RlZCB2b2lkIF9maXJlUHJvcGVydHlDaGFuZ2UoaW50IHByb3BlcnR5KSB7Ci0JICAgIHN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogQWRkcyB0aGUgc291cmNlIHBhZ2Ugb2YgdGhlIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBhZGRTb3VyY2VQYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkgICAgdHJ5IHsKLQkgICAgICBmU291cmNlUGFnZUluZGV4ID0gYWRkUGFnZShmVGV4dEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JICAgICAgc2V0UGFnZVRleHQoZlNvdXJjZVBhZ2VJbmRleCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVEFCX1NPVVJDRSIpKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgIC8vIHRoZSB1cGRhdGUncyBjcml0aWNhbCwgdG8gZ2V0IHZpZXdlciBzZWxlY3Rpb24gbWFuYWdlciBhbmQKLQkgICAgICAvLyBoaWdobGlnaHRpbmcgdG8gd29yawotCSAgICAgIGZUZXh0RWRpdG9yLnVwZGF0ZSgpOwotCSAgCi0JICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfVElUTEUpOwotCSAgCi0JICAgICAgLy8gQ2hhbmdlcyB0byB0aGUgVGV4dCBWaWV3ZXIncyBkb2N1bWVudCBpbnN0YW5jZSBzaG91bGQgYWxzbyBmb3JjZSBhbgotCSAgICAgIC8vIGlucHV0IHJlZnJlc2gKLQkgICAgICBmVGV4dEVkaXRvci5nZXRUZXh0Vmlld2VyKCkuYWRkVGV4dElucHV0TGlzdGVuZXIobmV3IFRleHRJbnB1dExpc3RlbmVyKCkpOwotCSAgICB9Ci0JICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkgICAgICAvLyBkaXNwb3NlIGVkaXRvcgotCSAgICAgIGRpc3Bvc2UoKTsKLQotCSAgICAgIHRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihTU0VDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJBbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbjFfRVJST1JfIikpOyAvLyROT04tTkxTLTEkCi0JICAgIH0KLQkgIH0KLQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVQYWdlcygpCi0JICAgKi8KLQkgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhZ2VzKCkKLQkgIHsKLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgICAvLyBzb3VyY2UgcGFnZSBNVVNUIGJlIGNyZWF0ZWQgYmVmb3JlIGRlc2lnbiBwYWdlLCBub3cKLQkgICAgICBjcmVhdGVTb3VyY2VQYWdlKCk7Ci0JICAgICAgYWRkU291cmNlUGFnZSgpOwotCSAgICAgIHNldEFjdGl2ZVBhZ2UoKTsKLQotCSAgICAvLyBmdXR1cmVfVE9ETzogYWRkIGEgY2F0Y2ggYmxvY2sgaGVyZSBmb3IgYW55IGV4Y2VwdGlvbiB0aGUgZGVzaWduCi0JICAgIC8vIHBhZ2UgdGhyb3dzIGFuZCBjb252ZXJ0IGl0IGludG8gYSBtb3JlIGluZm9ybWF0aXZlIG1lc3NhZ2UuCi0JICAgIH0KLQkgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkgICAgfQotCSAgfQotCi0JICAvKioKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2NyZWF0ZVNpdGUob3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0JICAgKi8KLQkgIHByb3RlY3RlZCBJRWRpdG9yU2l0ZSBjcmVhdGVTaXRlKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCSAgICBJRWRpdG9yU2l0ZSBzaXRlID0gbnVsbDsKLQkgICAgaWYgKGVkaXRvciA9PSBmVGV4dEVkaXRvcikgewotCSAgICAgIHNpdGUgPSBuZXcgTXVsdGlQYWdlRWRpdG9yU2l0ZSh0aGlzLCBlZGl0b3IpIHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGUjZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKQotCSAgICAgICAgICovCi0JICAgICAgICBwdWJsaWMgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCSAgICAgICAgICBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSBzdXBlci5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCSAgICAgICAgICBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgbXVsdGlDb250cmlidXRvciA9IFdTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0vLwkgICAgICAgICAgaWYgKG11bHRpQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgewotLy8JICAgICAgICAgICAgY29udHJpYnV0b3IgPSAoKFhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBtdWx0aUNvbnRyaWJ1dG9yKS5zb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcjsKLS8vCSAgICAgICAgICB9Ci0JICAgICAgICAgIHJldHVybiBjb250cmlidXRvcjsKLQkgICAgICAgIH0KLQkgICAgICB9OwotCSAgICB9Ci0JICAgIGVsc2UgewotCSAgICAgIHNpdGUgPSBzdXBlci5jcmVhdGVTaXRlKGVkaXRvcik7Ci0JICAgIH0KLQkgICAgcmV0dXJuIHNpdGU7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogQ3JlYXRlcyB0aGUgc291cmNlIHBhZ2Ugb2YgdGhlIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VQYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkgICAgZlRleHRFZGl0b3IgPSBjcmVhdGVUZXh0RWRpdG9yKCk7Ci0JICAgIGZUZXh0RWRpdG9yLnNldEVkaXRvclBhcnQodGhpcyk7Ci0KLQkgICAgLy8gU2V0IHRoZSBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIG5vdyBzbyB0aGUgdGV4dCBlZGl0b3Igd29uJ3QgdXNlCi0JICAgIC8vIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlyc3QKLQkgICAgLy8gYW5kIHN3aXRjaCB0byB0aGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGxhdGVyLgotCSAgICAvLyBETVcgcmVtb3ZlZCBzZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIDMvMjYvMjAwMyBzaW5jZSBhZGRlZAotCSAgICAvLyBjcmVhdGVQYXJ0Q29udHJvbCB0byBvdXIgdGV4dCBlZGl0b3IuCi0JICAgIC8vIGZUZXh0RWRpdG9yLnNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkgICAgZlRleHRFZGl0b3IuYWRkUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBNZXRob2QgY3JlYXRlVGV4dEVkaXRvci4KLQkgICAqIAotCSAgICogQHJldHVybiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcgotCSAgICovCi0JICBwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRFZGl0b3IgY3JlYXRlVGV4dEVkaXRvcigpIHsKLQkgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclhNTCgpOwotCSAgfQotCi0JICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQkgIHsKLQkgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JICAgIHdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCSAgICB3aW5kb3cuZ2V0U2hlbGwoKS5yZW1vdmVTaGVsbExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLQkgICAgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkgICAgaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpIHsKLQkgICAgICBmVGV4dEVkaXRvci5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotCSAgICB9Ci0KLQkgICAgLy8gbW92ZWQgdG8gbGFzdCB3aGVuIGFkZGVkIHdpbmRvdyAuLi4gc2VlbXMgbGlrZQotCSAgICAvLyB3ZSdkIGJlIGluIGRhbmdlciBvZiBsb3Npbmcgc29tZSBkYXRhLCBsaWtlIHNpdGUsCi0JICAgIC8vIG9yIHNvbWV0aGluZy4KLQkgICAgc3VwZXIuZGlzcG9zZSgpOwotCSAgfQotCi0JICAvKgotCSAgICogKG5vbi1KYXZhZG9jKSBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3IuIDxwPiBTdWJjbGFzc2VzIG11c3QKLQkgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZSBmb3IgYW4KLQkgICAqIGVkaXRvci4gRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPiBJRWRpdG9yUGFydCA8L2NvZGU+PC9wPgotCSAgICogCi0JICAgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkgICAgZlRleHRFZGl0b3IuZG9TYXZlKG1vbml0b3IpOwotCSAgICAvLyAgICAvLyB0aGlzIGlzIGEgdGVtcG9yYXJ5IHdheSB0byBmb3JjZSB2YWxpZGF0aW9uLgotCSAgICAvLyAgICAvLyB3aGVuIHRoZSB2YWxpZGF0b3IgaXMgYSB3b3JrYmVuY2ggYnVpbGRlciwgdGhlIGZvbGxvd2luZyBsaW5lcwotCSAgICAvLyBjYW4gYmUgcmVtb3ZlZAotCSAgICAvLyAgICBpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKQotCSAgICAvLyAgICAgIGZEZXNpZ25WaWV3ZXIuc2F2ZU9jY3VycmVkKCk7Ci0KLQkgIH0KLQotCSAgLyoKLQkgICAqIChub24tSmF2YWRvYykgU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yIHRvIGFub3RoZXIgb2JqZWN0LiA8cD4KLQkgICAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZQotCSAgICogbGlmZWN5Y2xlIGZvciBhbiBlZGl0b3IuIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT4gSUVkaXRvclBhcnQKLQkgICAqIDwvY29kZT48L3A+Ci0JICAgKiAKLQkgICAqIEBzZWUgSUVkaXRvclBhcnQKLQkgICAqLwotCSAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JICAgIGZUZXh0RWRpdG9yLmRvU2F2ZUFzKCk7Ci0JICAgIC8vIDI1MzYxOQotCSAgICAvLyBmb2xsb3dpbmcgdXNlZCB0byBiZSBleGVjdXRlZCBoZXJlLCBidXQgaXMKLQkgICAgLy8gbm93IGNhbGxlZCAiYmFjayIgZnJvbSB0ZXh0IGVkaXRvciAoc2luY2UKLQkgICAgLy8gbXVsaXRpcGxlIHBhdGhzIHRvIHRoZSBwZXJmb3JtU2F2ZUFzIGluIFN0cnVjdHVyZWRUZXh0RWRpdG9yLgotCSAgICAvL2RvU2F2ZUFzRm9yU3RydWN0dXJlZFRleHRNdWxpdFBhZ2VQYXJ0KCk7Ci0JICB9Ci0KLQkgIHByaXZhdGUgdm9pZCBlZGl0b3JJbnB1dElzQWNjZXB0YWJsZShJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkgICAgICAvLyB2ZXJpZnkgdGhhdCBpdCBjYW4gYmUgb3BlbmVkCi0JICAgICAgQ29yZUV4Y2VwdGlvbltdIGNvcmVFeGNlcHRpb25BcnJheSA9IG5ldyBDb3JlRXhjZXB0aW9uWzFdOwotCSAgICAgIGlmIChmaWxlRG9lc05vdEV4aXN0KChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCwgY29yZUV4Y2VwdGlvbkFycmF5KSkgewotCSAgICAgICAgLy8gdG9kbyB1c2UgbWVzc2FnZSBmb3JtYXR0ZXIgZm9yIHswfQotCSAgICAgICAgVGhyb3dhYmxlIGNvcmVFeGNlcHRpb24gPSBjb3JlRXhjZXB0aW9uQXJyYXlbMF07Ci0JICAgICAgICBpZiAoY29yZUV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlc291cmNlRXhjZXB0aW9uKSB7Ci0JICAgICAgICAgIC8vIEknbSBhc3N1bWluZyB0aGlzIGlzIGFsd2F5cyAnZG9lcyBub3QgZXhpc3QnCi0JICAgICAgICAgIC8vIHdlJ2xsIHJlZnJlc2ggbG9jYWwgZ28gbWltaWMgYmVoYXZpb3Igb2YgZGVmYXVsdAotCSAgICAgICAgICAvLyBlZGl0b3IsIHdoZXJlIHRoZQotCSAgICAgICAgICAvLyB0cm91Ymxlc29tZSBmaWxlIGlzIHJlZnJlc2hlZCAoYW5kIHdpbGwgY2F1c2UgaXQgdG8KLQkgICAgICAgICAgLy8gJ2Rpc2FwcGVhcicgZnJvbSBOYXZpZ2F0b3IuCi0JICAgICAgICAgIHRyeSB7Ci0JICAgICAgICAgICAgKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkgICAgICAgICAgICAvLyB2ZXJ5IHVubGlrZWx5Ci0vLwkgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGNlKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgICB0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oU1NFQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiMjNjb25jYXRfRVhDXyIsIChuZXcgT2JqZWN0W117aW5wdXQuZ2V0TmFtZSgpfSkpKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICAvLyROT04tTkxTLTEkID0gIlJlc291cmNlIHswfSBkb2VzIG5vdCBleGlzdC4iCi0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIHsKLQkgICAgICAgICAgdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKFNTRUNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIjMyY29uY2F0X0VYQ18iLCAobmV3IE9iamVjdFtde2lucHV0LmdldE5hbWUoKX0pKSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgICAgLy8kTk9OLU5MUy0xJCA9ICJFZGl0b3IgY291bGQgbm90IGJlIG9wZW4gb24gezB9IgotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkgICAgICBJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JICAgICAgdHJ5IHsKLQkgICAgICAgIGNvbnRlbnRzID0gKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldENvbnRlbnRzKCk7Ci0JICAgICAgfQotCSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIG5vU3RvcmFnZUV4YykgewotCSAgICAgIH0KLQkgICAgICBpZiAoY29udGVudHMgPT0gbnVsbCkgewotCSAgICAgICAgdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKFNTRUNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIjMyY29uY2F0X0VYQ18iLCAobmV3IE9iamVjdFtde2lucHV0LmdldE5hbWUoKX0pKSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICB9Ci0JICAgICAgZWxzZSB7Ci0JICAgICAgICB0cnkgewotCSAgICAgICAgICBjb250ZW50cy5jbG9zZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQotCSAgLy8gIHZvaWQgZG9TYXZlQXNGb3JTdHJ1Y3R1cmVkVGV4dE11bGl0UGFnZVBhcnQoKSB7Ci0JICAvLyAgICBzZXRQYWdlVGV4dChnZXRBY3RpdmVQYWdlKCksIGZUZXh0RWRpdG9yLmdldFRpdGxlKCkpOwotCSAgLy8gICAgc2V0SW5wdXQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JICAvLyAgICBpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKSB7Ci0JICAvLyAgICAgIC8vZkRlc2lnblZpZXdlci5zZXRFZGl0b3JJbnB1dChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkgIC8vICAgICAgZkRlc2lnblZpZXdlci5zZXRNb2RlbChnZXRNb2RlbCgpKTsKLQkgIC8vICAgICAgZkRlc2lnblZpZXdlci5zYXZlQXNPY2N1cnJlZCgpOwotCSAgLy8gICAgfQotCSAgLy8gICAgLy8gZXZlbiB0aG91Z2ggd2UndmUgc2V0IHRpdGxlIGV0Yy4sIHNldmVyYWwgdGltZXMgYWxyZWFkeSEKLQkgIC8vICAgIC8vIG9ubHkgbm93IGlzIGFsbCBwcmVwYXJlZCBmb3IgaXQuCi0JICAvLyAgICBmaXJlUHJvcGVydHlDaGFuZ2UoSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSk7Ci0JICAvLyAgICBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JICAvLyAgfQotCSAgLyoKLQkgICAqIChub24tSmF2YWRvYykgSW5pdGlhbGl6ZXMgdGhlIGVkaXRvciBwYXJ0IHdpdGggYSBzaXRlIGFuZCBpbnB1dC4gPHA+Ci0JICAgKiBTdWJjbGFzc2VzIG9mIDxjb2RlPiBFZGl0b3JQYXJ0IDwvY29kZT4gbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0JICAgKiBXaXRoaW4gdGhlIGltcGxlbWVudGF0aW9uIHN1YmNsYXNzZXMgc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSBpbnB1dCB0eXBlCi0JICAgKiBpcyBhY2NlcHRhYmxlIGFuZCB0aGVuIHNhdmUgdGhlIHNpdGUgYW5kIGlucHV0LiBIZXJlIGlzIHNhbXBsZSBjb2RlOgotCSAgICogPC9wPjxwcmU+IGlmICghKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpIHRocm93IG5ldwotCSAgICogUGFydEluaXRFeGNlcHRpb24oIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOwotCSAgICogc2V0U2l0ZShzaXRlKTsgc2V0SW5wdXQoZWRpdG9ySW5wdXQpOyA8L3ByZT4KLQkgICAqLwotCSAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZURvZXNOb3RFeGlzdChJRmlsZUVkaXRvcklucHV0IGlucHV0LCBUaHJvd2FibGVbXSBjb3JlRXhjZXB0aW9uKSB7Ci0JICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JICAgIElucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkgICAgaWYgKCghKGlucHV0LmV4aXN0cygpKSkgfHwgKCEoaW5wdXQuZ2V0RmlsZSgpLmV4aXN0cygpKSkpIHsKLQkgICAgICByZXN1bHQgPSB0cnVlOwotCSAgICB9Ci0JICAgIGVsc2UgewotCSAgICAgIHRyeSB7Ci0JICAgICAgICBpblN0cmVhbSA9IGlucHV0LmdldEZpbGUoKS5nZXRDb250ZW50cyh0cnVlKTsKLQkgICAgICB9Ci0JICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCSAgICAgICAgLy8gdmVyeSBsaWtlbHkgdG8gYmUgZmlsZSBub3QgZm91bmQKLQkgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0JICAgICAgICBjb3JlRXhjZXB0aW9uWzBdID0gZTsKLQkgICAgICB9Ci0JICAgICAgZmluYWxseSB7Ci0JICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotCSAgICAgICAgICB0cnkgewotCSAgICAgICAgICAgIGlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgfQotCSAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCi0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgICAgcmV0dXJuIHJlc3VsdDsKLQkgIH0KLQotCSAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotCSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQotCSAgICAgIC8vIERNVzogSSdtIGJ1bGxldC1wcm9vZmluZyB0aGlzIGJlY2F1c2UKLQkgICAgICAvLyBpdHMgYmVlbiByZXBvcnRlZCAob24gNC4wMyB2ZXJzaW9uKSBhIG51bGwgcG9pbnRlciBzb21ldGltZXMKLQkgICAgICAvLyBoYXBwZW5zIGhlcmUgb24gc3RhcnR1cCwgd2hlbiBhbiBlZGl0b3IgaGFzIGJlZW4gbGVmdAotCSAgICAgIC8vIG9wZW4gd2hlbiB3b3JrYmVuY2ggc2h1dGRvd24uCi0JICAgICAgaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpIHsKLQkgICAgICAgIHJlc3VsdCA9IGZUZXh0RWRpdG9yLmdldEFkYXB0ZXIoa2V5KTsKLQkgICAgICB9Ci0JICAgIHJldHVybiByZXN1bHQ7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogSUV4dGVuZGVkTWFya3VwRWRpdG9yIG1ldGhvZAotCSAgICovCi0JICBwdWJsaWMgTm9kZSBnZXRDYXJldE5vZGUoKSB7Ci0JICAgIGlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLQkgICAgICByZXR1cm4gbnVsbDsKLQotCSAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpLmdldENhcmV0Tm9kZSgpOwotCSAgfQotCi0JICAvKioKLQkgICAqIElFeHRlbmRlZFNpbXBsZUVkaXRvciBtZXRob2QKLQkgICAqLwotCSAgcHVibGljIGludCBnZXRDYXJldFBvc2l0aW9uKCkgewotCSAgICBpZiAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpCi0JICAgICAgcmV0dXJuIC0xOwotCi0JICAgIHJldHVybiBnZXRUZXh0RWRpdG9yKCkuZ2V0Q2FyZXRQb3NpdGlvbigpOwotCSAgfQotCi0JICAvKioKLQkgICAqIElFeHRlbmRlZFNpbXBsZUVkaXRvciBtZXRob2QKLQkgICAqLwotCSAgcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkgICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotCSAgICAgIHJldHVybiBudWxsOwotCi0JICAgIHJldHVybiBnZXRUZXh0RWRpdG9yKCkuZ2V0RG9jdW1lbnQoKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBJRXh0ZW5kZWRNYXJrdXBFZGl0b3IgbWV0aG9kCi0JICAgKi8KLQkgIHB1YmxpYyBEb2N1bWVudCBnZXRET01Eb2N1bWVudCgpIHsKLQkgICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotCSAgICAgIHJldHVybiBudWxsOwotCi0JICAgIHJldHVybiBnZXRUZXh0RWRpdG9yKCkuZ2V0RE9NRG9jdW1lbnQoKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgbWV0aG9kCi0JICAgKi8KLQkgIHB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkgewotCSAgICByZXR1cm4gdGhpczsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCSAgICBpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkKLQkgICAgICBtb2RlbCA9IGZUZXh0RWRpdG9yLmdldE1vZGVsKCk7Ci0JICAgIHJldHVybiBtb2RlbDsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCSAgfQotCi0JICAvKioKLQkgICAqIElFeHRlbmRlZE1hcmt1cEVkaXRvciBtZXRob2QKLQkgICAqLwotCSAgcHVibGljIExpc3QgZ2V0U2VsZWN0ZWROb2RlcygpIHsKLQkgICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotCSAgICAgIHJldHVybiBudWxsOwotCSAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGVkTm9kZXMoKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgbWV0aG9kCi0JICAgKi8KLQkgIHB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb25SYW5nZSgpIHsKLQkgICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotCSAgICAgIHJldHVybiBuZXcgUG9pbnQoLTEsIC0xKTsKLQotCSAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JICB9Ci0KLQkgIHB1YmxpYyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKCkgewotCSAgICByZXR1cm4gZlRleHRFZGl0b3I7Ci0JICB9Ci0KLQkgIC8qCi0JICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoUGFydC4KLQkgICAqLwotCSAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkgICAgU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkgICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKSB7Ci0JICAgICAgaWYgKGdldEVkaXRvcklucHV0KCkgIT0gbnVsbCkgewotCSAgICAgICAgdGl0bGUgPSBnZXRFZGl0b3JJbnB1dCgpLmdldE5hbWUoKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgdGl0bGUgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0VGl0bGUoKTsKLQkgICAgfQotCSAgICBpZiAodGl0bGUgPT0gbnVsbCkgewotCSAgICAgIHRpdGxlID0gZ2V0UGFydE5hbWUoKTsKLQkgICAgfQotCSAgICByZXR1cm4gdGl0bGU7Ci0JICB9Ci0KLQkgIC8qCi0JICAgKiAobm9uLUphdmFkb2MpIFNldHMgdGhlIGN1cnNvciBhbmQgc2VsZWN0aW9uIHN0YXRlIGZvciB0aGlzIGVkaXRvciB0bwotCSAgICogdGhlIHBhc3NhZ2UgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gbWFya2VyLiA8cD4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICAgKiBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+IElFZGl0b3JQYXJ0IDwvY29kZT48L3A+Ci0JICAgKiAKLQkgICAqIEBzZWUgSUVkaXRvclBhcnQKLQkgICAqLwotCSAgcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCSAgICAvLyAocGEpIDIwMDIwMjE3IHRoaXMgd2FzIG51bGwgd2hlbiBvcGVuaW5nIGFuIGVkaXRvciB0aGF0IHdhcwotCSAgICAvLyBhbHJlYWR5IG9wZW4KLQkgICAgaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpIHsKLQkgICAgICBJR290b01hcmtlciBtYXJrZXJHb3RvZXIgPSAoSUdvdG9NYXJrZXIpIGZUZXh0RWRpdG9yLmdldEFkYXB0ZXIoSUdvdG9NYXJrZXIuY2xhc3MpOwotCSAgICAgIG1hcmtlckdvdG9lci5nb3RvTWFya2VyKG1hcmtlcik7Ci0JICAgIH0KLQkgIH0KLQotCSAgcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JICAgIGVkaXRvcklucHV0SXNBY2NlcHRhYmxlKGlucHV0KTsKLQkgICAgdHJ5IHsKLQkgICAgICBzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkgICAgICBpZiAocGFydExpc3RlbmVyID09IG51bGwpIHsKLQkgICAgICAgIHBhcnRMaXN0ZW5lciA9IG5ldyBQYXJ0TGlzdGVuZXIoKTsKLQkgICAgICB9Ci0JICAgICAgLy9nZXRTaXRlKCkuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdG5lcik7Ci0JICAgICAgLy8gd2Ugd2FudCB0byBsaXN0ZW4gZm9yIG91ciBvd24gYWN0aXZhdGlvbgotCSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCSAgICAgIHdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCSAgICAgIHdpbmRvdy5nZXRTaGVsbCgpLmFkZFNoZWxsTGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkgICAgfQotCSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkgICAgICBpZiAoZSBpbnN0YW5jZW9mIFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKSB7Ci0JICAgICAgICBUaHJvd2FibGUgdCA9ICgoU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24pIGUpLmdldE9yaWdpbmFsRXhjZXB0aW9uKCk7Ci0JICAgICAgICBpZiAodCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0KTsKLQkgICAgICAgICAgLy8gZmlsZSBub3QgZm91bmQKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgICAgc2V0UGFydE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLQkgIH0KLQotCSAgLyoKLQkgICAqIChub24tSmF2YWRvYykgUmV0dXJucyB3aGV0aGVyIHRoZSAic2F2ZSBhcyIgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBieQotCSAgICogdGhpcyBlZGl0b3IuIDxwPiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wbGVtZW50IHRoZQotCSAgICogb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZSBmb3IgYW4gZWRpdG9yLiBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUKLQkgICAqIDxjb2RlPiBJRWRpdG9yUGFydCA8L2NvZGU+PC9wPgotCSAgICogCi0JICAgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICAgKi8KLQkgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkgICAgcmV0dXJuIGZUZXh0RWRpdG9yICE9IG51bGwgJiYgZlRleHRFZGl0b3IuaXNTYXZlQXNBbGxvd2VkKCk7Ci0JICB9Ci0KLQkgIC8qCi0JICAgKiAobm9uLUphdmFkb2MpIFJldHVybnMgd2hldGhlciB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3Igc2hvdWxkIGJlCi0JICAgKiBzYXZlZCB3aGVuIHRoZSBlZGl0b3IgaXMgY2xvc2VkLiA8cD4gVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT4gdHJ1ZQotCSAgICogPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgZWRpdG9yIGlzIGRpcnR5ICggPGNvZGU+IGlzRGlydHkgPC9jb2RlPiApLgotCSAgICogPC9wPgotCSAgICovCi0JICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVPbkNsb3NlTmVlZGVkKCkgewotCSAgICAvLyBvdmVycmlkaW5nIHN1cGVyIGNsYXNzIHNpbmNlIGl0IGRvZXMgYSBsb3dseSBpc0RpcnR5IQotCSAgICBpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkKLQkgICAgICByZXR1cm4gZlRleHRFZGl0b3IuaXNTYXZlT25DbG9zZU5lZWRlZCgpOwotCSAgICByZXR1cm4gaXNEaXJ0eSgpOwotCSAgfQotCi0JICAvKioKLQkgICAqIE5vdGlmaWVzIHRoaXMgbXVsdGktcGFnZSBlZGl0b3IgdGhhdCB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBpZCBoYXMKLQkgICAqIGJlZW4gYWN0aXZhdGVkLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgZGlmZmVyZW50Ci0JICAgKiB0YWIuCi0JICAgKiAKLQkgICAqIEBwYXJhbSBuZXdQYWdlSW5kZXgKLQkgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBhY3RpdmF0ZWQgcGFnZQotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkgICAgc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCi0JICAgIHNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KG5ld1BhZ2VJbmRleCk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogUG9zdHMgdGhlIHVwZGF0ZSBjb2RlICJiZWhpbmQiIHRoZSBydW5uaW5nIG9wZXJhdGlvbi4KLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgcG9zdE9uRGlzcGxheVF1ZShSdW5uYWJsZSBydW5uYWJsZSkgewotCSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JICAgIElXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkgICAgaWYgKHdpbmRvd3MgIT0gbnVsbCAmJiB3aW5kb3dzLmxlbmd0aCA+IDApIHsKLQkgICAgICBEaXNwbGF5IGRpc3BsYXkgPSB3aW5kb3dzWzBdLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCSAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgICAgcnVubmFibGUucnVuKCk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogSW5kaWNhdGVzIHRoYXQgYSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgICAqIAotCSAgICogQHBhcmFtIHNvdXJjZQotCSAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkCi0JICAgKiBAcGFyYW0gcHJvcElkCi0JICAgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcHJvcGVydHkgd2hpY2ggaGFzIGNoYW5nZWQ7IHByb3BlcnR5IGlkcyBhcmUKLQkgICAqICAgICAgICAgICAgZ2VuZXJhbGx5IGRlZmluZWQgYXMgY29uc3RhbnRzIG9uIHRoZSBzb3VyY2UgY2xhc3MKLQkgICAqLwotCSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLQkgICAgc3dpdGNoIChwcm9wSWQpIHsKLQkgICAgICAvLyBoYWQgdG8gaW1wbGVtZW50IGlucHV0IGNoYW5nZWQgImxpc3RlbmVyIiBzbyB0aGF0Ci0JICAgICAgLy8gc3RydWN1dGVkVGV4dCBjb3VsZCB0ZWxsIGl0IGNvbnRhaW5pbmcgZWRpdG9yIHRoYXQKLQkgICAgICAvLyB0aGUgaW5wdXQgaGFzIGNoYW5nZSwgd2hlbiBhICdyZXNvdXJjZSBtb3ZlZCcgZXZlbnQgaXMKLQkgICAgICAvLyBmb3VuZC4KLQkgICAgICBjYXNlIElFZGl0b3JQYXJ0LlBST1BfSU5QVVQgOgotCSAgICAgIGNhc2UgSUVkaXRvclBhcnQuUFJPUF9ESVJUWSA6IHsKLQkgICAgICAgIGlmIChzb3VyY2UgPT0gZlRleHRFZGl0b3IpIHsKLQkgICAgICAgICAgaWYgKGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkgewotCSAgICAgICAgICAgIHNldElucHV0KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCSAgICAgICAgICAgIC8vIHRpdGxlIHNob3VsZCBhbHdheXMgY2hhbmdlIHdoZW4gaW5wdXQgY2hhbmdlcy4KLQkgICAgICAgICAgICAvLyBjcmVhdGUgcnVubmFibGUgZm9yIGZvbGxvd2luZyBwb3N0IGNhbGwKLQkgICAgICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkgICAgICAgICAgICAgICAgX2ZpcmVQcm9wZXJ0eUNoYW5nZShJV29ya2JlbmNoUGFydC5QUk9QX1RJVExFKTsKLQkgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9OwotCSAgICAgICAgICAgIC8vIFVwZGF0ZSBpcyBqdXN0IHRvIHBvc3QgdGhpbmdzIG9uIHRoZSBkaXNwbGF5IHF1ZXVlCi0JICAgICAgICAgICAgLy8gKHRocmVhZCkuIFdlIGhhdmUgdG8gZG8gdGhpcyB0byBnZXQgdGhlIGRpcnR5Ci0JICAgICAgICAgICAgLy8gcHJvcGVydHkgdG8gZ2V0IHVwZGF0ZWQgYWZ0ZXIgb3RoZXIgdGhpbmdzIG9uIHRoZQotCSAgICAgICAgICAgIC8vIHF1ZXVlIGFyZSBleGVjdXRlZC4KLQkgICAgICAgICAgICBwb3N0T25EaXNwbGF5UXVlKHJ1bm5hYmxlKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgYnJlYWs7Ci0JICAgICAgfQotCSAgICAgIGNhc2UgSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSA6IHsKLQkgICAgICAgIC8vIHVwZGF0ZSB0aGUgaW5wdXQgaWYgdGhlIHRpdGxlIGlzIGNoYW5nZWQKLQkgICAgICAgIGlmIChzb3VyY2UgPT0gZlRleHRFZGl0b3IpIHsKLQkgICAgICAgICAgaWYgKGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkgewotCSAgICAgICAgICAgIHNldElucHV0KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICBicmVhazsKLQkgICAgICB9Ci0JICAgICAgZGVmYXVsdCA6IHsKLQkgICAgICAgIC8vIHByb3BhZ2F0ZSBjaGFuZ2VzLiBJcyB0aGlzIG5lZWRlZD8gQW5zd2VyOiBZZXMuCi0JICAgICAgICBpZiAoc291cmNlID09IGZUZXh0RWRpdG9yKSB7Ci0JICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wSWQpOwotCSAgICAgICAgfQotCSAgICAgICAgYnJlYWs7Ci0JICAgICAgfQotCSAgICB9Ci0KLQkgIH0KLQotCSAgcHJvdGVjdGVkIHZvaWQgc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZSgpIHsKLQkgICAgLy8gSWYgd2UncmUgY2FsbGVkIGJlZm9yZSBlZGl0b3IgaXMgY3JlYXRlZCwgc2ltcGx5IGlnbm9yZSBzaW5jZSB3ZQotCSAgICAvLyBkZWxlZ2F0ZSB0aGlzIGZ1bmN0aW9uIHRvIG91ciBlbWJlZGRlZCBUZXh0RWRpdG9yCi0JICAgIGlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLQkgICAgICByZXR1cm47Ci0KLQkgICAgZ2V0VGV4dEVkaXRvcigpLnNhZmVseVNhbml0eUNoZWNrU3RhdGUoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0KLQkgIH0KLQotCSAgcHJvdGVjdGVkIHZvaWQgc2F2ZUxhc3RBY3RpdmVQYWdlSW5kZXgoaW50IG5ld1BhZ2VJbmRleCkgewotCSAgICAvLyBzYXZlIHRoZSBsYXN0IGFjdGl2ZSBwYWdlIGluZGV4IHRvIHByZWZlcmVuY2UgbWFuYWdlcgotCSAgICBnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShJWE1MUHJlZmVyZW5jZU5hbWVzLkxBU1RfQUNUSVZFX1BBR0UsIG5ld1BhZ2VJbmRleCk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogU2V0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBwYWdlLgotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBzZXRBY3RpdmVQYWdlKCkgewotCSAgICAvLyByZXRyaWV2ZSB0aGUgbGFzdCBhY3RpdmUgcGFnZSBpbmRleCBmcm9tIHByZWZlcmVuY2UgbWFuYWdlcgotCSAgICBpbnQgYWN0aXZlUGFnZUluZGV4ID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuTEFTVF9BQ1RJVkVfUEFHRSk7Ci0KLQkgICAgLy8gV2UgY2hlY2sgdGhpcyByYW5nZSBzaW5jZSBzb21lb25lIGNvdWxkIGhhbmQgZWRpdCB0aGUgWE1MCi0JICAgIC8vIHByZWZlcmVuY2UgZmlsZSB0byBhbiBpbnZhbGlkIHZhbHVlIC4uLiB3aGljaCBJIGtub3cgZnJvbQotCSAgICAvLyBleHBlcmllbmNlIDooIC4uLiBpZiB0aGV5IGRvLCB3ZSdsbCByZXNldCB0byBkZWZhdWx0IGFuZCBjb250aW51ZQotCSAgICAvLyByYXRoZXIgdGhhbiB0aHJvdyBhbiBhc3NlcnRpb24gZXJyb3IgaW4gdGhlIHNldEFjdGl2ZVBhZ2UoaW50KQotCSAgICAvLyBtZXRob2QuCi0JICAgIGlmIChhY3RpdmVQYWdlSW5kZXggPCAwIHx8IGFjdGl2ZVBhZ2VJbmRleCA+PSBnZXRQYWdlQ291bnQoKSkgewotCSAgICAgIGFjdGl2ZVBhZ2VJbmRleCA9IGZTb3VyY2VQYWdlSW5kZXg7Ci0JICAgIH0KLQkgICAgc2V0QWN0aXZlUGFnZShhY3RpdmVQYWdlSW5kZXgpOwotCSAgfQotCi0JICAvKgotCSAgICogKG5vbi1KYXZhZG9jKQotCSAgICogCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICAgKi8KLQkgIHByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCSAgICAvLyBJZiBkcml2ZW4gZnJvbSB0aGUgU291cmNlIHBhZ2UsIGl0J3MgIm1vZGVsIiBtYXkgbm90IGJlIHVwIHRvIGRhdGUKLQkgICAgLy8gd2l0aCB0aGUgaW5wdXQganVzdCB5ZXQuIFdlJ2xsIHJlbHkgb24gbGF0ZXIgbm90aWZpY2F0aW9uIGZyb20gdGhlCi0JICAgIC8vIFRleHRWaWV3ZXIgdG8gc2V0IHVzIHN0cmFpZ2h0Ci0JICAgIHN1cGVyLnNldElucHV0KGlucHV0KTsKLQkgICAgc2V0UGFydE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBJRXh0ZW5kZWRNYXJrdXBFZGl0b3IgbWV0aG9kCi0JICAgKi8KLQkgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChTaGVsbCBjb250ZXh0KSB7Ci0JICAgIGlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLQkgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBXU0RMRWRpdG9yUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5JTkZPLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCSAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpLnZhbGlkYXRlRWRpdChjb250ZXh0KTsKLQkgIH0KLQkgIAotCX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExTZWxlY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMU2VsZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE0ZDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExTZWxlY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsgICAgICAgCi0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlTm90aWZ5ID0gdHJ1ZTsKLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UpCi0gIHsgIAotICAgIGlmIChlbmFibGVOb3RpZnkpCi0gICAgewotICAgICAgY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICAgIGVuYWJsZU5vdGlmeSA9IGZhbHNlOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc291cmNlLCBzZWxlY3Rpb24pOwotICAgICAgICBMaXN0IGNvcHlPZkxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QobGlzdGVuZXJMaXN0KTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29weU9mTGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgZW5hYmxlTm90aWZ5ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAKLQotICAvLyAgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLSAgLy8KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdGhpcyk7Ci0gIH0KLQotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSAKLSAgewotICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIAotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSAKLSAgewotICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICB9IAotICAKLSAgLy8gaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSAgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChlbmFibGVOb3RpZnkpCi0gICAgewotICAgICAgc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpLCBldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLSAgICB9Ci0gIH0KLX0gICAgICAgICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETFRleHRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2I5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlldy5ldmVudHMuSU5vZGVTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXcuZXZlbnRzLk5vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JTW9kZWxRdWVyeUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlci5FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmUuV1NETENvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uV1NETFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uRGF0YVR5cGVWYWx1ZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLkVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMVGV4dEVkaXRvciBleHRlbmRzIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGltcGxlbWVudHMgSU5vZGVTZWxlY3Rpb25MaXN0ZW5lciwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IKLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJvdGVjdGVkIFdTRExDb250ZW50T3V0bGluZVBhZ2Ugb3V0bGluZVBhZ2U7Ci0gIHByb3RlY3RlZCBXU0RMU2VsZWN0aW9uTWFuYWdlciB3c2RsU2VsZWN0aW9uTWFuYWdlcjsKLSAgcHJvdGVjdGVkIEludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBJbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5RXh0ZW5zaW9uSGVscGVyIG1vZGVsUXVlcnlFeHRlbnNpb25IZWxwZXI7Ci0gIHByb3RlY3RlZCBMaXN0IG1vZGVsUXVlcnlDb250cmlidXRvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgcHVibGljIFdTRExUZXh0RWRpdG9yKFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgewotICAgIHRoaXMud3NkbEVkaXRvciA9IHdzZGxFZGl0b3I7Ci0gICAgd3NkbFNlbGVjdGlvbk1hbmFnZXIgPSB3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLSAgICB3c2RsU2VsZWN0aW9uTWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucyhXU0RMRWRpdG9yRXh0ZW5zaW9uLk1PREVMX1FVRVJZX0NPTlRSSUJVVE9SKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk1PREVMX1FVRVJZX0NPTlRSSUJVVE9SLCB3c2RsRWRpdG9yKTsKLSAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsUXVlcnlDb250cmlidXRvckxpc3QuYWRkKG8pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBhcmcwKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlUGFydENvbnRyb2woYXJnMCk7Ci0gICAgYWRkT3Blbk9uU2VsZWN0aW9uTGlzdGVuZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE9wZW5PblNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgewotICAgIEtleUFkYXB0ZXIga2V5QWRhcHRlciA9IG5ldyBLZXlBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBhcmcwKQotICAgICAgewotICAgICAgICBpZiAoYXJnMC5rZXlDb2RlID09IFNXVC5GMykKLSAgICAgICAgewotICAgICAgICAgIExpc3QgbGlzdCA9IGdldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGVzKCk7Ci0gICAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgT3Blbk9uU2VsZWN0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBPcGVuT25TZWxlY3Rpb25IZWxwZXIod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkpOyAgIAotICAgICAgICAgICAgICBoZWxwZXIub3BlbkVkaXRvcigoTm9kZSlvYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5hZGRLZXlMaXN0ZW5lcihrZXlBZGFwdGVyKTsKLSAgfQotCi0gCi0gIC8qCi0gICAqIEBzZWUgU3RydWN0dXJlZFRleHRFZGl0b3Ijc2V0TW9kZWwoSUZpbGVFZGl0b3JJbnB1dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKElGaWxlRWRpdG9ySW5wdXQgaW5wdXQpCi0gIHsKLSAgICBpZiAobW9kZWxRdWVyeUV4dGVuc2lvbkhlbHBlciAhPSBudWxsKQotICAgIHsKLSAgICAgIG1vZGVsUXVlcnlFeHRlbnNpb25IZWxwZXIuZGlzcG9zZSgpOwotICAgICAgbW9kZWxRdWVyeUV4dGVuc2lvbkhlbHBlciA9IG51bGw7Ci0gICAgfQotCi0gICAgc3VwZXIuc2V0TW9kZWwoaW5wdXQpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWxRdWVyeUNvbnRyaWJ1dG9yTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSU1vZGVsUXVlcnlDb250cmlidXRvciBtb2RlbFF1ZXJ5Q29udHJpYnV0b3IgPSAoSU1vZGVsUXVlcnlDb250cmlidXRvcilpLm5leHQoKTsKLSAgICAgIG1vZGVsUXVlcnlDb250cmlidXRvci5zZXRNb2RlbCgoSURPTU1vZGVsKWdldE1vZGVsKCkpOwotICAgIH0KLQotICAgIC8vIGNvbnRyaWJ1dGUgdGhlIE1vZGVsUXVlcnlFeHRlbnNpb25IZWxwZXIgYXMgYW4gZXh0ZW5zaW9uIHRvbwotICAgIC8vCi0gICAgbW9kZWxRdWVyeUV4dGVuc2lvbkhlbHBlciA9IG5ldyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uSGVscGVyKChJRE9NTW9kZWwpZ2V0TW9kZWwoKSk7Ci0gIH0KLQotICAKLSAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHJlcXVpcmVkKQotICB7Ci0JCWlmIChJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpCi0JCXsKLQkJICByZXR1cm4gZ2V0Q29udGVudE91dGxpbmVQYWdlKCk7Ci0JCX0gICAgCi0JCWlmIChJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkKLQkJewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsIHx8IGZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkgPT0gbnVsbCB8fCBmUHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLQkJCXsKLS8vCQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZSBXU0RMIFByb3BlcnR5IFNoZWV0Iik7Ci0vLyAgICAgICAgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gY2ZnID0gY3JlYXRlUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKTsKLS8vICAgICAgICBpZiAoY2ZnICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICBpZiAoY2ZnIGluc3RhbmNlb2YgU3RydWN0dXJlZFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAoKFN0cnVjdHVyZWRQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbikgY2ZnKS5zZXRFZGl0b3IodGhpcyk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UoKTsKLS8vICAgICAgICAgICAgcHJvcGVydHlTaGVldFBhZ2Uuc2V0Q29uZmlndXJhdGlvbihjZmcpOwotLy8gICAgICAgICAgICBwcm9wZXJ0eVNoZWV0UGFnZS5zZXRNb2RlbChnZXRNb2RlbCgpKTsKLS8vICAgICAgICAgICAgZlByb3BlcnR5U2hlZXRQYWdlID0gcHJvcGVydHlTaGVldFBhZ2U7Ci0vLyAgICAgICAgfQotCi0vLyAgCSAgICBmUHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgV1NETFByb3BlcnR5U2hlZXRQYWdlKGdldE1vZGVsKCksIGdldEVkaXRvclBhcnQoKSk7Ci0vLyAgCSAgICAoKFdTRExQcm9wZXJ0eVNoZWV0UGFnZSkgZlByb3BlcnR5U2hlZXRQYWdlKS5zZXRTZWxlY3Rpb25NYW5hZ2VyKGdldFdTRExFZGl0b3IoKS5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOyAvL2dldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0vLy8vCSAgCSAgKChXU0RMUHJvcGVydHlTaGVldFBhZ2UpIGZQcm9wZXJ0eVNoZWV0UGFnZSkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcigoV1NETFByb3BlcnR5U2hlZXRQYWdlKSBmUHJvcGVydHlTaGVldFBhZ2UpOwotLy8gIAkgICAgKChXU0RMUHJvcGVydHlTaGVldFBhZ2UpZlByb3BlcnR5U2hlZXRQYWdlKS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldyBFeHRlbnNpYmxlUHJvcGVydHlTb3VyY2VQcm92aWRlcihnZXRXU0RMRWRpdG9yKCkpKTsKLS8vLy8gIAkgICAgZ2V0V1NETEVkaXRvcigpLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKFdTRExQcm9wZXJ0eVNoZWV0UGFnZSlmUHJvcGVydHlTaGVldFBhZ2UpOwotCi0gIAkgICAgZlByb3BlcnR5U2hlZXRQYWdlID0gbmV3IFdTRExUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSh0aGlzLCBnZXRXU0RMRWRpdG9yKCkpOwotICAJICAgICgoV1NETFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKWZQcm9wZXJ0eVNoZWV0UGFnZSkuc2V0U2VsZWN0aW9uTWFuYWdlcihnZXRXU0RMRWRpdG9yKCkuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLQotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQkJfQotCQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihyZXF1aXJlZCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvcGVydHlDYXRlZ29yaWVzKCkKLSAgewotICAgIHJldHVybiBuZXcgU3RyaW5nW10geyAiZ2VuZXJhbCIsICJuYW1lc3BhY2UiLCAib3RoZXIiLCAiYXR0cmlidXRlcyIsICJkb2N1bWVudGF0aW9uIiwgImZhY2V0cyIgfTsKLSAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IjZ2V0Q29udHJpYnV0b3JJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250cmlidXRvcklkKCkKLQl7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMVGV4dEVkaXRvciI7Ci0JLy8JIHJldHVybiBnZXRTaXRlKCkuZ2V0SWQoKTsKLSAgfQotICAKLSAgLyoKLSAgICogQHNlZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciNnZXRDb250ZW50T3V0bGluZVBhZ2UoKQotICAgKi8KLSAgcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkKLSAgewotICAgIGlmICgob3V0bGluZVBhZ2UgPT0gbnVsbCkgfHwgb3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgKG91dGxpbmVQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpKQotICAgIHsKLSAgICAgIG91dGxpbmVQYWdlID0gbmV3IFdTRExDb250ZW50T3V0bGluZVBhZ2Uod3NkbEVkaXRvcik7Ci0gICAgICBvdXRsaW5lUGFnZS5zZXRDb250ZW50UHJvdmlkZXIod3NkbEVkaXRvci5nZXRFeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyKCkpOwotICAgICAgb3V0bGluZVBhZ2Uuc2V0TGFiZWxQcm92aWRlcih3c2RsRWRpdG9yLmdldEV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIoKSk7Ci0gICAgICBvdXRsaW5lUGFnZS5zZXRNb2RlbCh3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKSk7IC8vWE1MRG9jdW1lbnQoKSk7Ci0KLSAgICAgIGdldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKS5hZGROb2RlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihnZXRWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgICAgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlci5zZXRFdmVudFNvdXJjZShvdXRsaW5lUGFnZSk7Ci0gICAgfQotICAgIHJldHVybiBvdXRsaW5lUGFnZTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMRWRpdG9yIGdldFdTRExFZGl0b3IoKQotICB7Ci0gICAgcmV0dXJuIChXU0RMRWRpdG9yKWdldEVkaXRvclBhcnQoKTsKLSAgfQotCi0gIC8vIHVzZWQgdG8gbWFwIHNlbGVjdGlvbnMgZnJvbSB0aGUgb3V0bGluZSB2aWV3IHRvIHRoZSBzb3VyY2UgdmlldwotICAvLyB0aGlzIGNsYXNzIHRoaW5rcyBvZiBzZWxlY3Rpb25zIGluIHRlcm1zIG9mIERPTSBlbGVtZW50Ci0gIGNsYXNzIEludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdEZvck90aGVyTW9kZWwoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBudWxsOwotCi0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IChOb2RlKW9iamVjdDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChvYmplY3QpOwotICAgICAgfQotCi0gICAgICAvLyB0aGUgdGV4dCBlZGl0b3IgY2FuIG9ubHkgYWNjZXB0IHNlZCBub2RlcyEKLSAgICAgIC8vCi0gICAgICBpZiAoIShub2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlKSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIC8vIGhlcmUgd2UgY29udmVydCB0aGUgbW9kZWwgc2VsZWN0aW9uIHRvIGEgbm9kZSBzZWxlY3Rpb24gcmVxJ2QgZm9yIHRoZSBzb3VyY2UgdmlldwotICAgIC8vCi0gICAgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm9kZVNlbGVjdGlvbkNoYW5nZWQoTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIC8vIGhlcmUgd2UgY29udmVydCBhbiBub2RlIHNlbGVjaXRvbiB0byBhIG1vZGVsIHNlbGVjdGlvbiBhcyByZXEnZCBieSB0aGUgb3RoZXIgdmlld3MKLSAgICAvLwotICAgIGlmICghZXZlbnQuZ2V0U291cmNlKCkuZXF1YWxzKGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICBMaXN0IGxpc3QgPSBldmVudC5nZXRTZWxlY3RlZE5vZGVzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgICAgIHsKLQkgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudClub2RlOwotCSAgICAgICAgICBicmVhazsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCSAgICAgICAgewotCSAgICAgICAgICBlbGVtZW50ID0gKChBdHRyKW5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCSAgICAgICAgICBicmVhazsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBPYmplY3QgbyA9IGVsZW1lbnQ7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCksIGVsZW1lbnQpOwotICAgICAgICBpZiAobW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG8gPSBtb2RlbE9iamVjdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAobyAhPSBudWxsKQotICAgICAgewotICAgICAgICB3c2RsU2VsZWN0aW9uTWFuYWdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obyksIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB3c2RsU2VsZWN0aW9uTWFuYWdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSwgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIHN1cGVyLnVwZGF0ZSgpOwotICAgIGlmIChvdXRsaW5lUGFnZSAhPSBudWxsKQotICAgICAgb3V0bGluZVBhZ2Uuc2V0TW9kZWwoZ2V0TW9kZWwoKSk7Ci0gIH0KLQotICBwdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUV4dGVuc2lvbkhlbHBlcgotICB7Ci0gICAgcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLSAgICBwcm90ZWN0ZWQgRGF0YVR5cGVWYWx1ZUV4dGVuc2lvbiBkYXRhVHlwZVZhbHVlRXh0ZW5zaW9uOwotICAgIHByb3RlY3RlZCBFbGVtZW50Q29udGVudEZpbHRlckV4dGVuc2lvbiBlbGVtZW50Q29udGVudEZpbHRlckV4dGVuc2lvbjsKLQotICAgIHB1YmxpYyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uSGVscGVyKElET01Nb2RlbCB4bWxNb2RlbCkKLSAgICB7Ci0gICAgICBkYXRhVHlwZVZhbHVlRXh0ZW5zaW9uID0gbmV3IFdTRExEYXRhVHlwZVZhbHVlRXh0ZW5zaW9uKCk7Ci0gICAgICBlbGVtZW50Q29udGVudEZpbHRlckV4dGVuc2lvbiA9IG5ldyBXU0RMRWxlbWVudENvbnRlbnRGaWx0ZXJFeHRlbnNpb24oKTsKLQotICAgICAgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoeG1sTW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICBpZiAobW9kZWxRdWVyeSAhPSBudWxsICYmIG1vZGVsUXVlcnkuZ2V0RXh0ZW5zaW9uTWFuYWdlcigpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsUXVlcnkuZ2V0RXh0ZW5zaW9uTWFuYWdlcigpLmFkZEV4dGVuc2lvbihkYXRhVHlwZVZhbHVlRXh0ZW5zaW9uKTsKLSAgICAgICAgbW9kZWxRdWVyeS5nZXRFeHRlbnNpb25NYW5hZ2VyKCkuYWRkRXh0ZW5zaW9uKGVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxRdWVyeSAhPSBudWxsICYmIG1vZGVsUXVlcnkuZ2V0RXh0ZW5zaW9uTWFuYWdlcigpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsUXVlcnkuZ2V0RXh0ZW5zaW9uTWFuYWdlcigpLnJlbW92ZUV4dGVuc2lvbihkYXRhVHlwZVZhbHVlRXh0ZW5zaW9uKTsKLSAgICAgICAgbW9kZWxRdWVyeS5nZXRFeHRlbnNpb25NYW5hZ2VyKCkucmVtb3ZlRXh0ZW5zaW9uKGVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGV4dGVuZCB0aGUgTW9kZWxRdWVyeSBiZWhhdmlvdXIgc28gdGhhdCB3ZSBjYW4gY29udHJpYnV0ZSBvdXIgb3duCi0gICAqICdhbGxvd2VkIHZhbHVlcycgZm9yIGF0dHJpYnV0ZXMgb3IgZWxlbWVudHMgKGUuZy4gdGhlICd0eXBlJyBhdHRyaWJ1dGUpLgotICAgKi8KLSAgcHVibGljIGNsYXNzIFdTRExEYXRhVHlwZVZhbHVlRXh0ZW5zaW9uIGltcGxlbWVudHMgRGF0YVR5cGVWYWx1ZUV4dGVuc2lvbgotICB7Ci0gICAgcHVibGljIGludCBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gREFUQV9UWVBFX1ZBTFVFX0VYVEVOU0lPTjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIldTRExEYXRhVHlwZVZhbHVlRXh0ZW5zaW9uIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIGphdmEudXRpbC5MaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBpZiAoY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZ2V0V1NETEVkaXRvcigpLmdldERlZmluaXRpb24oKSk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50RWxlbWVudE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUgPSAiIjsKLSAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLmdldExvY2FsTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoZWNrTmFtZShuYW1lLCAibWVzc2FnZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwodXRpbC5nZXRNZXNzYWdlTmFtZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJiaW5kaW5nIikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldEJpbmRpbmdOYW1lcygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgInR5cGUiKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiYmluZGluZyIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkQWxsKHV0aWwuZ2V0UG9ydFR5cGVOYW1lcygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgInBhcnQiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldENvbXBvbmVudE5hbWVMaXN0KHRydWUpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJlbGVtZW50IikpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgInBhcnQiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldENvbXBvbmVudE5hbWVMaXN0KGZhbHNlKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja05hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHRva2VuKQotICAgIHsKLSAgICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUudHJpbSgpLmVxdWFscyh0b2tlbikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGNsYXNzIHBlcmZvcm1zIHNvbWUgZmlsdGVyaW5nIGZvciBzb21lIGtub3duIGV4dGVuc2libGl0eSBlbGVtZW50cyB0byBlbmFibGUKLSAgICogc21hcnRlciBzdWdnZXN0aW9ucyB0aGFuIHRob3NlIHByb3ZpZGVkIGJ5IHRoZSAnZHVtYicgd3NkbCBzY2hlbWEgCi0gICAqLwotICBwdWJsaWMgY2xhc3MgV1NETEVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uIGltcGxlbWVudHMgRWxlbWVudENvbnRlbnRGaWx0ZXJFeHRlbnNpb24KLSAgewotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEVMRU1FTlRfQ09OVEVOVF9GSUxURVI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gICAgewotICAgICAgcmV0dXJuICJXU0RMRWxlbWVudENvbnRlbnRGaWx0ZXJFeHRlbnNpb24iOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUGFyZW50RWxlbWVudE1lc3NhZ2VSZWZlcmVuY2UoU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImlucHV0IikgfHwgcGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvdXRwdXQiKSB8fCBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImZhdWx0Iik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDTU5vZGVNZXNzYWdlUmVmZXJlbmNlQ29udGVudChTdHJpbmcgY21Ob2RlTmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gY21Ob2RlTmFtZS5lcXVhbHMoImJvZHkiKSB8fCBjbU5vZGVOYW1lLmVxdWFscygiaGVhZGVyIikgfHwgY21Ob2RlTmFtZS5lcXVhbHMoImZhdWx0IikgfHwgY21Ob2RlTmFtZS5lcXVhbHMoInVybFJlcGxhY2VtZW50IikgfHwgY21Ob2RlTmFtZS5lcXVhbHMoInVybEVuY29kZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChMaXN0IGxpc3QsIEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgewotICAgICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lc3BhY2VVUkkgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgLy8gb25seSBmaWx0ZXIgY2hpbGRyZW4gZm9yICdub24tc2NoZW1hJyBlbGVtZW50cwotICAgICAgLy8gICAgIAkKLSAgICAgIGlmICghV1NETENvbnN0YW50cy5YU0RfTkFNRVNQQUNFX1VSSS5lcXVhbHMocGFyZW50RWxlbWVudE5hbWVzcGFjZVVSSSkpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBsaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBpbmNsdWRlID0gdHJ1ZTsKLSAgICAgICAgICBDTU5vZGUgY21Ob2RlID0gKENNTm9kZSlsaXN0LmdldChpKTsKLSAgICAgICAgICBTdHJpbmcgY21Ob2RlTmFtZSA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50TmFtZSAhPSBudWxsICYmIGNtTm9kZU5hbWUgIT0gbnVsbCAmJiBjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsKLSAgICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsKLSAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETy4uLiBwcm92aWRlIGEgbGlzdCBvZiBuYW1lc3BhY2VzIHRoYXQgc2hvdWxkIGFsd2F5cyBnZXQgZmlsdGVyZWQgb3V0IAotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikgfHwgbmFtZXNwYWNlVVJJLmVxdWFscyhXU0RMQ29uc3RhbnRzLlhTRF9OQU1FU1BBQ0VfVVJJKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBleGNsdWRlIHNvYXAtZW5jIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciBmaWx0ZXIgPSAoRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlcilXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5KCkuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBmaWx0ZXIuaXNWYWxpZENvbnRleHQoZWxlbWVudCwgY21Ob2RlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICghaW5jbHVkZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LnJlbW92ZShpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyIGdldEludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JcmV0dXJuIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1NjczMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEVFTWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOyAKLSAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExTd2l0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSU1lbnVBY3Rpb25Db250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTUNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmFjdGlvbnMuTWVudUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS51dGlsLlhNTENvbW1vblJlc291cmNlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8qKgotICogVE9ETy4uLiB0aGVyZSBhcmUgbGlrZWx5IHNldmVyYWwgcGxhY2VzIHdoZXJlIHdlIGNhbiByZWZhY3RvciBjb2RlIGZyb20gIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIKLSAqLwotcHVibGljIGNsYXNzIEFkZEVFTWVudUFjdGlvbkNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU1lbnVBY3Rpb25Db250cmlidXRvcgoteyAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gbmV3IE1lbnVCdWlsZGVyKCk7Ci0KLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZU1lbnVBY3Rpb25zKGZpbmFsIElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUsIE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBib29sZWFuIGlzU3VibWVudVJlcXVpcmVkID0gZmFsc2U7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7ICAgICAKLSAgICAgIFdTRExTd2l0Y2ggd3NkbFN3aXRjaCA9IG5ldyBXU0RMU3dpdGNoKCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotCSAgICAgIH0gCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0JICAgICAgfSAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0KQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkgICAgICB9IAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotCSAgICAgIH0KLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkgICAgICB9IAotIAotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgICAgICB7ICAgICAgCi0gICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkgICAgICB9ICAgICAgICAgICAKLSAgICAgCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IHBvcnQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgIH0gCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCB1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAJewotICAgICAgCQlpZiAoZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRBY3Rpb25zKHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50KCkpLnNpemUoKSA+IDApCi0gICAgICAJCXsgICAgICAJCQotICAgICAgCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICAgIAkJfQotICAgICAgCQllbHNlCi0gICAgICAJCXsKLSAgICAgIAkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotICAgICAgCQl9Ci0gICAgICAJfQotICAgICAgfTsgICAgICAgIAotICAgICAgaXNTdWJtZW51UmVxdWlyZWQgPSB3c2RsU3dpdGNoLmRvU3dpdGNoKChXU0RMRWxlbWVudClvYmplY3QpICE9IG51bGw7Ci0gICAgICBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KG9iamVjdCk7ICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICB7Ci0gICAgICBXU0RMR3JvdXBPYmplY3QgZ3JvdXBPYmplY3QgPSAoV1NETEdyb3VwT2JqZWN0KW9iamVjdDsKLSAgICAgCi0gICAgICBzd2l0Y2ggKGdyb3VwT2JqZWN0LmdldFR5cGUoKSkKLSAgICAgIHsgICAKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuRVhURU5TSUJJTElUWV9FTEVNRU5UU19HUk9VUCA6IAotICAgICAgICB7Ci0gICAgICAgICAgaXNTdWJtZW51UmVxdWlyZWQgPSB0cnVlOwotICAgICAgICAgIGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZ3JvdXBPYmplY3QuZ2V0RGVmaW5pdGlvbigpKTsgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICB9Ci0KLSAgICBpZiAoaXNTdWJtZW51UmVxdWlyZWQpCi0gICAgewotICAgICAgTWVudU1hbmFnZXIgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BRERfRVhURU5TSUJJTElUWV9FTEVNRU5UIikpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gaGVyZSBJJ20gYXR0ZW1wdGluZyB0byBhZGQgdGhlIG1lbnUgaXRlbSBpbiBhICdnb29kJyBwbGFjZSBpbiB0aGUgZXhpc2l0aW5nIG1lbnUKLSAgICAgIC8vIHRvZG8gYWRkIG1lbnUgZ3JvdXBzIHRvIGF2b2lkIHRoZSBuZWVkIGZvciB0aGlzIHRlc3QKLSAgICAgIC8vCi0vLyAgICAgIGlmIChtZW51LmZpbmQoImFkZGNoaWxkIikgIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAJbWVudS5pbnNlcnRBZnRlcigiYWRkY2hpbGQiLCBzdWJtZW51KTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgIHsKLS8vICAgICAgCW1lbnUuYWRkKHN1Ym1lbnUpOwotLy8gICAgICB9CSAKLSAgICAJbWVudS5hZGQoc3VibWVudSk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgIHsKLSAgICAgICAgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRBY3Rpb25zKHN1Ym1lbnUsIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgCi0gICAgaWYgKGVkICE9IG51bGwpCi0gICAgewotICAgICAgYWRkQWN0aW9uSGVscGVyKG1lbnUsIGdldEV4dGVuc2liaWxpdHlFbGVtZW50QWN0aW9ucyhlbGVtZW50KSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEFjdGlvbnMoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgTGlzdCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvLyBhZGQgaW5zZXJ0IGNoaWxkIG5vZGUgYWN0aW9ucwotICAgICAgLy8KLSAgICAgIGludCBpYyA9IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLSAgICAgIGludCB2YyA9IE1vZGVsUXVlcnkuVkFMSURJVFlfU1RSSUNUOwotCi0gICAgICBtb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZWxlbWVudCwgZWQsIC0xLCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG1vZGVsUXVlcnlBY3Rpb25MaXN0OwotICB9Ci0gIAotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEFjdGlvbkhlbHBlcihJTWVudU1hbmFnZXIgbWVudSwgTGlzdCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCBhY3Rpb25MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWxRdWVyeUFjdGlvbkxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKWkubmV4dCgpOwotICAgICAgQ01Ob2RlIGNtbm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLSAgICAgIGlmIChjbW5vZGUgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc090aGVyTmFtZXNwYWNlID0gZmFsc2U7Ci0gICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWNtbm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOwotICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKSAgICAgICAgICAKLSAgICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IAotICAgICAgICAgIGlzT3RoZXJOYW1lc3BhY2UgPSBuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiAhbmFtZXNwYWNlVVJJLmVxdWFscyhXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNPdGhlck5hbWVzcGFjZSkKLSAgICAgICAgewotICAgICAgICAgIGludCBjbU5vZGVUeXBlID0gY21ub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICAgICAgaWYgKGFjdGlvbi5nZXRLaW5kKCkgPT0gTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHN3aXRjaCAoY21Ob2RlVHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKG5ldyBBZGROb2RlQWN0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbiljbW5vZGUsIGFjdGlvbi5nZXRQYXJlbnQoKSwgYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICB9ICAKLSAgICBtZW51QnVpbGRlci5wb3B1bGF0ZU1lbnUobWVudSwgYWN0aW9uTGlzdCwgZmFsc2UpOwotICB9ICAgCi0KLSAgLyoqCi0gICAqIEFkZE5vZGVBY3Rpb24KLSAgICovCi0gIHB1YmxpYyBjbGFzcyBBZGROb2RlQWN0aW9uIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb24KLSAgewotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB1bmRvRGVzY3JpcHRpb247IAotICAgIHByb3RlY3RlZCBDTU5vZGUgY21ub2RlOwotICAgIHByb3RlY3RlZCBpbnQgaW5kZXg7Ci0gICAgcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCi0KLSAgICBwdWJsaWMgQWRkTm9kZUFjdGlvbihDTU5vZGUgY21ub2RlLCBOb2RlIHBhcmVudCwgIGludCBpbmRleCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLmNtbm9kZSA9IGNtbm9kZTsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5pbmRleCA9IGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0TGFiZWwocGFyZW50LCBjbW5vZGUpOwotICAgICAgc2V0VGV4dCh0ZXh0KTsgICAgIAotICAgICAgZGVzY3JpcHRpb24gPSB0ZXh0OwotICAgICAgdW5kb0Rlc2NyaXB0aW9uID0gWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfTUVOVV9BREQiKSArICIgIiArIHRleHQ7Ci0gICAgICAvL3NldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKSk7IAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9ICI/IiArIGNtbm9kZSArICI/IjsKLSAgICAgIGlmIChjbW5vZGUgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbW5vZGUsIHBhcmVudCwgbnVsbCk7ICAgICAgICAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OyAgIAotICAgIH0gIAotCi0gICAgcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0gICAgewotICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIHVuZG9EZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKCk7Ci0KLSAgICAgIGlmIChjbW5vZGUgIT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsgICAgICAgIAotCi0gICAgICAgIERPTUNvbnRlbnRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRE9NQ29udGVudEJ1aWxkZXJJbXBsKGRvY3VtZW50KTsgCi0gICAgICAgIGJ1aWxkZXIuc2V0UHJvcGVydHkoRE9NQ29udGVudEJ1aWxkZXIuUFJPUEVSVFlfQlVJTERfQkxBTktfVEVYVF9OT0RFUywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgYnVpbGRlci5zZXRCdWlsZFBvbGljeShET01Db250ZW50QnVpbGRlci5CVUlMRF9PTkxZX1JFUVVJUkVEX0NPTlRFTlQpOwotICAgICAgICBidWlsZGVyLmJ1aWxkKHBhcmVudCwgY21ub2RlKTsKLSAgICAgICAgaW5zZXJ0Tm9kZXNBdEluZGV4KHBhcmVudCwgYnVpbGRlci5nZXRSZXN1bHQoKSwgaW5kZXgsIHRydWUpOwotICAgICAgfQotCi0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0Tm9kZXNBdEluZGV4KE5vZGUgcGFyZW50LCBMaXN0IGxpc3QsIGludCBpbmRleCwgYm9vbGVhbiBmb3JtYXQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaW5kZXggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgIH0KLSAgICAgIE5vZGUgcmVmQ2hpbGQgPSAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkgPyBub2RlTGlzdC5pdGVtKGluZGV4KSA6IG51bGw7Ci0gICAgCi0gICAgICAvLyBoZXJlIHdlIGNvbnNpZGVyIHRoZSBjYXNlIHdoZXJlIHRoZSBwcmV2aW91cyBub2RlIGlzIGEgJ3doaXRlIHNwYWNlJyBUZXh0IG5vZGUKLSAgICAgIC8vIHdlIHNob3VsZCByZWFsbHkgZG8gdGhlIGluc2VydCBiZWZvcmUgdGhpcyBub2RlCi0gICAgICAvLwotICAgICAgaW50IHByZXZJbmRleCA9IGluZGV4IC0gMTsKLSAgICAgIE5vZGUgcHJldkNoaWxkID0gKHByZXZJbmRleCA8IG5vZGVMaXN0LmdldExlbmd0aCgpKSA/IG5vZGVMaXN0Lml0ZW0ocHJldkluZGV4KSA6IG51bGw7Ci0JICAgIGlmIChpc1doaXRlc3BhY2VUZXh0Tm9kZShwcmV2Q2hpbGQpKSAKLSAgICAgIHsKLQkgIAkgIHJlZkNoaWxkID0gcHJldkNoaWxkOwotCSAgICB9Ci0gICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbmV3Tm9kZSA9IChOb2RlKWkubmV4dCgpOwotICAgIAotICAgICAgICBpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnQ7Ci0gICAgICAgICAgcGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKChBdHRyKW5ld05vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmQ2hpbGQpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBuZXdOb2RlID0gKE5vZGUpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChmb3JtYXQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCSAgICAgIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCSAgICAgIGZvcm1hdFByb2Nlc3NvclhNTC5mb3JtYXROb2RlKChJRE9NTm9kZSluZXdOb2RlKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAvL3NldFZpZXdlclNlbGVjdGlvbihsaXN0KTsKLSAgICB9ICAgCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1doaXRlc3BhY2VUZXh0Tm9kZShOb2RlIG5vZGUpIAotICAgIHsKLQkgICAgcmV0dXJuIChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLSAgICB9IAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYTA1OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHMuTmV3Q29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbGVtZW50QWN0aW9uIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb24gewotCXByb3RlY3RlZCBOb2RlIHBhcmVudE5vZGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7Ci0JcHJvdGVjdGVkIFN0cmluZyBub2RlTmFtZTsKLQlwcm90ZWN0ZWQgRWxlbWVudCBuZXdFbGVtZW50OwotCXByb3RlY3RlZCBOb2RlIHJlbGF0aXZlTm9kZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0JcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY29tcHV0ZVRvcExldmVsUmVmQ2hpbGQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZWxlY3ROZXdseUNyZWF0ZWRPYmplY3QgPSB0cnVlOyAvLyBXZSBzaG91bGQgbm90IGJlCi0JCQkJCQkJCQkJCQkJCS8vIHNlbGVjdGluZyB0aGUKLQkJCQkJCQkJCQkJCQkJLy8gb2JqZWN0IGluIHRoZQotCQkJCQkJCQkJCQkJCQkvLyBhY3Rpb24uLi4uLiBUT0RPCi0KLQlwdWJsaWMgQWRkRWxlbWVudEFjdGlvbihTdHJpbmcgdGV4dCwgU3RyaW5nIGltYWdlRGVzY3JpcHRvcktleSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJc2V0VGV4dCh0ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcktleSkpOwotCQl0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotCQl0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7Ci0JfQotCi0JcHVibGljIEFkZEVsZW1lbnRBY3Rpb24oU3RyaW5nIHRleHQsIFN0cmluZyBpbWFnZURlc2NyaXB0b3JLZXksIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlzZXRUZXh0KHRleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoV1NETEVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yS2V5KSk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl0aGlzLm5vZGVOYW1lID0gbG9jYWxOYW1lOwotCX0KLQotCXB1YmxpYyBBZGRFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0LCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpIHsKLQkJc2V0VGV4dCh0ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwpOwotCQl0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJdGhpcy5ub2RlTmFtZSA9IGxvY2FsTmFtZTsKLQl9Ci0KLQlwdWJsaWMgQWRkRWxlbWVudEFjdGlvbihOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIE5vZGUgcmVsYXRpdmVOb2RlKSB7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl0aGlzLm5vZGVOYW1lID0gbG9jYWxOYW1lOwotCQl0aGlzLnJlbGF0aXZlTm9kZSA9IHJlbGF0aXZlTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wdXRlVG9wTGV2ZWxSZWZDaGlsZChib29sZWFuIGlzRW5hYmxlZCkgewotCQljb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCA9IGlzRW5hYmxlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpIHsKLQkJdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93RGlhbG9nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWJvb2xlYW4gb2sgPSBzaG93RGlhbG9nKCk7Ci0JCWlmIChvaykgewotCQkJYmVnaW5SZWNvcmRpbmcoKTsKLQkJCXBlcmZvcm1BZGRFbGVtZW50KCk7Ci0JCQllbmRSZWNvcmRpbmcoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChub2RlTmFtZSk7Ci0JCQlhZGRBdHRyaWJ1dGVzKG5ld0VsZW1lbnQpOwotCQkJaWYgKHJlbGF0aXZlTm9kZSA9PSBudWxsICYmIGNvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKSB7Ci0JCQkJcmVsYXRpdmVOb2RlID0gY29tcHV0ZVRvcExldmVsUmVmQ2hpbGQobmV3RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCWlmIChyZWxhdGl2ZU5vZGUgPT0gbnVsbCkgewotCQkJCXBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdFbGVtZW50LCByZWxhdGl2ZU5vZGUpOwotCQkJfQotCQkJLy8gZm9ybWF0KHBhcmVudE5vZGUpOwotCQkJZm9ybWF0KG5ld0VsZW1lbnQpOwotCQkJLy8gVWdseS4uLi4uIFdlIHNob3VsZCBub3QgYmUgc2VsZWN0aW5nIHRoZSBvYmplY3QgaW4gdGhlIGdyYXBoCi0JCQkvLyB2aWV3IGluIHRoZSBBY3Rpb24uCi0JCQkvLyBUaGlzIHNob3VsZCBiZSByZWZhY3RvcmVkIG91dC4gV2UgYWRkIHRoaXMgYm9vbGVhbiBjaGVjawotCQkJLy8gYmVjYXVzZSBXU0RMU2V0VHlwZURpYWxvZy5qYXZhCi0JCQkvLyB1c2VzIEFkZEltcG9ydEFjdGlvbi5qYXZhIGJ1dCB3ZSBzaG91bGQgbm90IGJlIHNlbGVjdGluZyB0aGUKLQkJCS8vIG5ld2x5IGNyZWF0ZWQgaW1wb3J0Li4uLgotCQkJaWYgKHNlbGVjdE5ld2x5Q3JlYXRlZE9iamVjdCkgewotCQkJCXNlbGVjdE9iamVjdEZvck5ld0VsZW1lbnQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIFVnbHkuLi4uLiBXZSBzaG91bGQgbm90IGJlIHNlbGVjdGluZyB0aGUgb2JqZWN0IGluIHRoZSBncmFwaCB2aWV3IGluCi0JLy8gdGhlIEFjdGlvbi4KLQkvLyBUaGlzIHNob3VsZCBiZSByZWZhY3RvcmVkIG91dC4gV2UgYWRkIHRoaXMgYm9vbGVhbiBjaGVjayBiZWNhdXNlCi0JLy8gV1NETFNldFR5cGVEaWFsb2cuamF2YQotCS8vIHVzZXMgQWRkSW1wb3J0QWN0aW9uLmphdmEgYnV0IHdlIHNob3VsZCBub3QgYmUgc2VsZWN0aW5nIHRoZSBuZXdseQotCS8vIGNyZWF0ZWQgaW1wb3J0Li4uLgotCS8vIFdlIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSBjYWxsaW5nIHJ1bigpCi0JcHVibGljIHZvaWQgc2VsZWN0T2JqZWN0Rm9yTmV3RWxlbWVudChib29sZWFuIHNlbGVjdCkgewotCQlzZWxlY3ROZXdseUNyZWF0ZWRPYmplY3QgPSBzZWxlY3Q7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudE5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERCIpOwotCX0KLQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgbm9kZU5hbWUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnROb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHByZWZpeCArICI6IiArIG5vZGVOYW1lKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCWlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCS8vIGZvcm1hdCBzZWxlY3RlZCBub2RlCi0JCQlGb3JtYXRQcm9jZXNzb3JYTUwgZm9ybWF0UHJvY2Vzc29yWE1MID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkJZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKSBwYXJlbnROb2RlKTsKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgZ2V0RGVmaW5pdGlvbkVsZW1lbnQoRWxlbWVudCBwYXJlbnRFbGVtZW50KSB7Ci0JCUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBudWxsOwotCi0JCWZvciAoTm9kZSBub2RlID0gcGFyZW50RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQlpZiAoV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShlbGVtZW50KSA9PSBXU0RMQ29uc3RhbnRzLkRFRklOSVRJT04pIHsKLQkJCQkJZGVmaW5pdGlvbkVsZW1lbnQgPSBlbGVtZW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmluaXRpb25FbGVtZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGdldE5ld0VsZW1lbnQoKSB7Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0T2JqZWN0Rm9yTmV3RWxlbWVudCgpIHsKLQkJaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yUGFydCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCX0KLQkJaWYgKGVkaXRvclBhcnQgIT0gbnVsbCAmJiBkZWZpbml0aW9uICE9IG51bGwpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoZGVmaW5pdGlvbiwgbmV3RWxlbWVudCk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSAoSVNlbGVjdGlvblByb3ZpZGVyKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0T2JqZWN0KFdTRExFbGVtZW50IG9iamVjdCkgewotCQlpZiAoZWRpdG9yUGFydCA9PSBudWxsKSB7Ci0JCQllZGl0b3JQYXJ0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJfQotCQlpZiAoZWRpdG9yUGFydCAhPSBudWxsICYmIGRlZmluaXRpb24gIT0gbnVsbCkgewotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgZWRpdG9yUGFydC5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgc2hvd0RpYWxvZ0hlbHBlcihTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSwgTGlzdCB1c2VkTmFtZXMpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IGRlZmF1bHROYW1lOwotCQlOZXdDb21wb25lbnREaWFsb2cgZGlhbG9nID0gbmV3IE5ld0NvbXBvbmVudERpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHRpdGxlLCBkZWZhdWx0TmFtZSwgdXNlZE5hbWVzKTsKLQkJaW50IHJjID0gZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLQkJaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCXJlc3VsdCA9IGRpYWxvZy5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgY29tcHV0ZVRvcExldmVsUmVmQ2hpbGQoTm9kZSBub2RlVG9BZGQpIHsKLQkJTm9kZSByZXN1bHQgPSBudWxsOwotCQlpbnQgYSA9IGdldFByZWNlZGVuY2Uobm9kZVRvQWRkKTsKLQotCQlmb3IgKE5vZGUgbm9kZSA9IHBhcmVudE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlpbnQgYiA9IGdldFByZWNlZGVuY2Uobm9kZSk7Ci0JCQkJaWYgKGIgPiBhKSB7Ci0JCQkJCXJlc3VsdCA9IG5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmluaXRpb25TdHViKCkgewotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBEZWZpbml0aW9ucyBlbGVtZW50IHdpdGggcHJvcGVyIG5hbWVzcGFjZQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgewotCQkJCWNoYXJTZXQgPSAiVVRGLTgiOwotCQkJfQotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCAidmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGNoYXJTZXQgKyAiXCIiKSk7Ci0JCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ3c2RsOmRlZmluaXRpb25zIik7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChyb290KTsKLQotCQkJLy8gQWRkIHZhcmlvdXMgbmFtZXNwYWNlIGF0dHJpYnV0ZXMgaGVyZS4KLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczpzb2FwIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iKTsKLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczp0bnMiLCBnZXREZWZhdWx0TmFtZXNwYWNlKCkpOwotCQkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOndzZGwiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iKTsKLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczp4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJuYW1lIiwgZ2V0RmlsZU5hbWUoKSk7Ci0JCQlyb290LnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpKTsKLQotCQkJZGVmaW5pdGlvbi5zZXRFbGVtZW50KHJvb3QpOwotCQkJcGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCQlwcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKCkgewotCQlTdHJpbmcgbmFtZXNwYWNlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QUkVGX1BBR0VfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFIikpOwotCQlpZiAoIW5hbWVzcGFjZS5lbmRzV2l0aCgiLyIpKSB7Ci0JCQluYW1lc3BhY2UgPSBuYW1lc3BhY2UuY29uY2F0KCIvIik7Ci0JCX0KLQotCQluYW1lc3BhY2UgKz0gZ2V0RmlsZU5hbWUoKSArICIvIjsKLQotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlTdHJpbmcgZmlsZUxvY2F0aW9uID0gZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpOwotCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVMb2NhdGlvbik7Ci0JCXJldHVybiBmaWxlUGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSGFzaE1hcCBwcmVjZWRlbmNlTWFwID0gY3JlYXRlUHJlY2VkZW5jZU1hcCgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0UHJlY2VkZW5jZShOb2RlIG5vZGUpIHsKLQkJaW50IHJlc3VsdCA9IDI7Ci0JCVN0cmluZyBsb2NhbE5hbWUgPSBub2RlLmdldExvY2FsTmFtZSgpOwotCQlpZiAobG9jYWxOYW1lICE9IG51bGwpIHsKLQkJCUludGVnZXIgaW50ZWdlciA9IChJbnRlZ2VyKSBwcmVjZWRlbmNlTWFwLmdldChsb2NhbE5hbWUpOwotCQkJaWYgKGludGVnZXIgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGludGVnZXIuaW50VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSGFzaE1hcCBjcmVhdGVQcmVjZWRlbmNlTWFwKCkgewotCQlIYXNoTWFwIGhhc2hNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDEpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDMpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5UWVBFU19FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNCkpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDUpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5QT1JUX1RZUEVfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDYpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5CSU5ESU5HX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig3KSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuU0VSVklDRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoOCkpOwotCQlyZXR1cm4gaGFzaE1hcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRWxlbWVudERlY2xhcmF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZGVlMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotCXByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7Ci0JCi0JcHVibGljIEFkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBzdWdnZXN0ZWRQcmVmaXgpCi0JewotCQl0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJdGhpcy5wcmVmaXggPSBzdWdnZXN0ZWRQcmVmaXg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpCi0JewotCQlTdHJpbmcgZXhpc3RpbmdQcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChuYW1lc3BhY2UpOwotCQlpZiAoZXhpc3RpbmdQcmVmaXggIT0gbnVsbCkKLQkJewotCQkJcHJlZml4ID0gZXhpc3RpbmdQcmVmaXg7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwcmVmaXggPSBOYW1lVXRpbC5idWlsZFVuaXF1ZVByZWZpeChkZWZpbml0aW9uLCBwcmVmaXgpOwotCQkJRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLQkJCWlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsKQotCQkJewotCQkJCWRlZmluaXRpb25FbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwgbmFtZXNwYWNlKTsKLQkJCX0JCQkKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkKLQl7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRJbXBvcnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkSW1wb3J0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODUzNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRJbXBvcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsgCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEFkZEltcG9ydEFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb247Ci0gIHByb3RlY3RlZCBTdHJpbmcgZWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4OwotCi0gIHB1YmxpYyBBZGRJbXBvcnRBY3Rpb24oSUVkaXRvclBhcnQgcGFydCwgRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLQl0aGlzKHBhcnQsIGRlZmluaXRpb24sIHBhcmVudE5vZGUsIHByZWZpeCwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGRJbXBvcnRBY3Rpb24oSUVkaXRvclBhcnQgcGFydCwgRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfSU1QT1JUIiksICJpY29ucy9pbXBvcnRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImltcG9ydCIpOwotCSAgc2V0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLQkgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotCSAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JICBzZXRFZGl0b3JQYXJ0KHBhcnQpOwotCSAgCi0JICBpZiAocGFydCBpbnN0YW5jZW9mIFdTRExFZGl0b3IpIHsKLQkgIAlkb2N1bWVudCA9ICgoV1NETEVkaXRvcikgcGFydCkuZ2V0WE1MRG9jdW1lbnQoKTsKLQkgIH0KLSAgfQotICAgICAgICAKLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgbm9kZU5hbWUpCi0gIHsKLSAgCWlmIChlbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXggIT0gbnVsbCAmJiBuYW1lc3BhY2UgIT0gbnVsbCkKLSAgCXsgCi0gICAgCUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0gICAgCWlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsKQotICAgIAl7ICAgIAotCSAgCSAgZGVmaW5pdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgZWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4LCBuYW1lc3BhY2UpOwotICAgIAl9ICAgICAgCQotICAJfQotICAJcmV0dXJuIHN1cGVyLmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnREZWNsYXJhdGlvbk5hbWVzcGFjZVByZWZpeChTdHJpbmcgbnNQcmVmaXgpCi0gIHsKLSAgCXRoaXMuZWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4ID0gbnNQcmVmaXg7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIsIG5hbWVzcGFjZSAhPSBudWxsID8gbmFtZXNwYWNlIDogIiIpOwotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsIGxvY2F0aW9uICE9IG51bGwgPyBsb2NhdGlvbiA6ICIiKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotICAJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCB8fCAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkpIHsKLSAgCQljcmVhdGVEZWZpbml0aW9uU3R1YigpOwotICAJfQotICAJCi0gIAlzdXBlci5wZXJmb3JtQWRkRWxlbWVudCgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRNZXNzYWdlVUlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkTWVzc2FnZVVJQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNWI3YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRNZXNzYWdlVUlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkTWVzc2FnZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHMuTmV3Q29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRNZXNzYWdlVUlBY3Rpb24gZXh0ZW5kcyBXU0RMRWxlbWVudFVJQWN0aW9uCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIAotICBwdWJsaWMgQWRkTWVzc2FnZVVJQWN0aW9uCi0gIAkoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAKLSAgICAgU3RyaW5nIG5hbWUsIAotICAgICBib29sZWFuIGNyZWF0ZVBhcnQpCi0gIHsKLSAgICBzdXBlcgotICAgIAkobmV3IEFkZE1lc3NhZ2VDb21tYW5kKGRlZmluaXRpb24sbmFtZSxjcmVhdGVQYXJ0KSwgCi0gICAgCSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREIiksIAotICAgIAkgV1NETENvbnN0YW50cy5NRVNTQUdFX0VMRU1FTlRfVEFHLCAKLSAgICAJIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9tZXNzYWdlX29iai5naWYiKSk7Ci0gICAgCi0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0gCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0JICBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCBuYW1lKTsKLQkgIG5hbWUgPSBzaG93RGlhbG9nSGVscGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfTUVTU0FHRSIpLCBuYW1lKTsKLQkgIHJldHVybiBuYW1lICE9IG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgc2hvd0RpYWxvZ0hlbHBlcihTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSkKLSAgeyAgIAotICAgIFN0cmluZyByZXN1bHQgPSBkZWZhdWx0TmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBOZXdDb21wb25lbnREaWFsb2cgZGlhbG9nID0gbmV3IE5ld0NvbXBvbmVudERpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHRpdGxlLCBkZWZhdWx0TmFtZSk7Ci0gICAgaW50IHJjID0gZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLSAgICBpZiAocmMgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkaWFsb2cuZ2V0TmFtZSgpOyAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBudWxsOwotICAgIH0gICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAKLSAgcHJvdGVjdGVkIHZvaWQgcHJlUnVuKCkKLSAgewotICAgICgoQWRkTWVzc2FnZUNvbW1hbmQpc3VwZXIubW9kZWxBY3Rpb24pLnNldExvY2FsTmFtZShuYW1lKTsKLSAgfQotCi0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCBnZXRPd25lcigpCi0gIHsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZE5hbWVzcGFjZURlY2xhcmF0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1MmUzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZE5hbWVzcGFjZURlY2xhcmF0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIEVsZW1lbnQgb3duZXJFbGVtZW50OwotICBwcm90ZWN0ZWQgU3RyaW5nW10gbmFtZXNwYWNlTmFtZXM7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBwcmVmZXJyZWRQcmVmaXhlczsKLQotICBwdWJsaWMgQWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zQWN0aW9uKEVsZW1lbnQgb3duZXJFbGVtZW50LCBTdHJpbmdbXSBuYW1lc3BhY2VOYW1lcywgU3RyaW5nW10gcHJlZmVycmVkUHJlZml4ZXMpCi0gIHsKLSAgICB0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDsKLSAgICB0aGlzLm5hbWVzcGFjZU5hbWVzID0gbmFtZXNwYWNlTmFtZXM7Ci0gICAgdGhpcy5wcmVmZXJyZWRQcmVmaXhlcyA9IHByZWZlcnJlZFByZWZpeGVzOwotICB9Ci0KLSAgcHVibGljIEFkZE5hbWVzcGFjZURlY2xhcmF0aW9uc0FjdGlvbihFbGVtZW50IG93bmVyRWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBwcmVmZXJyZWRQcmVmaXgpCi0gIHsKLSAgICB0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDsKLSAgICBuYW1lc3BhY2VOYW1lcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgbmFtZXNwYWNlTmFtZXNbMF0gPSBuYW1lc3BhY2VOYW1lOwotCi0gICAgcHJlZmVycmVkUHJlZml4ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgIHByZWZlcnJlZFByZWZpeGVzWzBdID0gcHJlZmVycmVkUHJlZml4OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGlmIChvd25lckVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBOYW1lZE5vZGVNYXAgbWFwID0gb3duZXJFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIEhhc2h0YWJsZSBwcmVmaXhUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0cmlidXRlID0gKEF0dHIpIG1hcC5pdGVtKGkpOwotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLnN0YXJ0c1dpdGgoInhtbG5zOiIpKQotICAgICAgICB7Ci0gICAgICAgICAgdGFibGUucHV0KGF0dHJpYnV0ZS5nZXRWYWx1ZSgpLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgIHByZWZpeFRhYmxlLnB1dChhdHRyaWJ1dGVOYW1lLnN1YnN0cmluZyg2KSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygieG1sbnMiKSkKLSAgICAgICAgewotICAgICAgICAgIHRhYmxlLnB1dChhdHRyaWJ1dGUuZ2V0VmFsdWUoKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICBwcmVmaXhUYWJsZS5wdXQoIiIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VOYW1lcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG5hbWVzcGFjZU5hbWVzW2ldOwotICAgICAgICBpZiAodGFibGUuZ2V0KG5hbWVzcGFjZSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoaSA8IHByZWZlcnJlZFByZWZpeGVzLmxlbmd0aCkgPyBwcmVmZXJyZWRQcmVmaXhlc1tpXSA6ICJwMCI7Ci0gICAgICAgICAgaWYgKHByZWZpeFRhYmxlLmdldChwcmVmaXgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ID0gY29tcHV0ZVVuaXF1ZVByZWZpeCgicCIsIHByZWZpeFRhYmxlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHByZWZpeC5sZW5ndGgoKSA+IDAgPyAieG1sbnM6IiArIHByZWZpeCA6ICJ4bWxucyI7Ci0gICAgICAgICAgb3duZXJFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBuYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlVW5pcXVlUHJlZml4KFN0cmluZyBiYXNlLCBIYXNodGFibGUgdGFibGUpCi0gIHsKLSAgICBpbnQgaSA9IDA7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGJhc2U7Ci0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgaWYgKHRhYmxlLmdldChwcmVmaXgpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmVmaXggPSBiYXNlICsgaTsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkV1NJU2NoZW1hSW1wb3J0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjRkZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBBZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbgotewotICAgIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnREZWNsYXJhdGlvbk5hbWVzcGFjZVByZWZpeDsKLQotICAgIHB1YmxpYyBBZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWZpbml0aW9uRWxlbWVudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAJcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfSU1QT1JUIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0T3JDcmVhdGVUeXBlc0VsZW1lbnQoKQotICAgIHsKLSAgICAgICAgRWxlbWVudCB0eXBlc0VsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoZGVmaW5pdGlvbi5nZXRUeXBlcygpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWRkVHlwZXNBY3Rpb24gPSBuZXcgQWRkRWxlbWVudEFjdGlvbigiIiwgImljb25zL3hzZF9vYmouZ2lmIiwgZGVmaW5pdGlvbkVsZW1lbnQsIGRlZmluaXRpb25FbGVtZW50LmdldFByZWZpeCgpLCAidHlwZXMiKTsKLSAgICAgICAgICAgICAgICBhZGRUeXBlc0FjdGlvbi5zZXRDb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBhZGRUeXBlc0FjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgICB0eXBlc0VsZW1lbnQgPSBhZGRUeXBlc0FjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0KHR5cGVzRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlc0VsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbi5nZXRUeXBlcygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZXNFbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRJbXBvcnRIb2xkZXJFbGVtZW50KEVsZW1lbnQgdHlwZXNFbGVtZW50KSB7Ci0gICAgCUVsZW1lbnQgaW1wb3J0SG9sZGVyRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gdHlwZXNFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLSAgICAgICAgICAgICAgICBpZiAoInNjaGVtYSIuZXF1YWxzKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0SG9sZGVyRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGltcG9ydEhvbGRlckVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0T3JDcmVhdGVJbXBvcnRIb2xkZXJFbGVtZW50KEVsZW1lbnQgdHlwZXNFbGVtZW50KQotICAgIHsKLSAgICAgICAgRWxlbWVudCBpbXBvcnRIb2xkZXJFbGVtZW50ID0gZ2V0SW1wb3J0SG9sZGVyRWxlbWVudCh0eXBlc0VsZW1lbnQpOwotICAgICAgICBpZiAoaW1wb3J0SG9sZGVyRWxlbWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGRFbGVtZW50QWN0aW9uIGFkZEltcG9ydEhvbGRlckFjdGlvbiA9IG5ldyBBZGRFbGVtZW50QWN0aW9uKCIiLCAiaWNvbnMveHNkX29iai5naWYiLCB0eXBlc0VsZW1lbnQsICJ4c2QiLCAic2NoZW1hIikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczp4c2QiLCBXU0RMQ29uc3RhbnRzLlhTRF9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgYWRkSW1wb3J0SG9sZGVyQWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgaW1wb3J0SG9sZGVyRWxlbWVudCA9IGFkZEltcG9ydEhvbGRlckFjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0gICAgICAgICAgICBmb3JtYXQoaW1wb3J0SG9sZGVyRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGltcG9ydEhvbGRlckVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gYWRkIHRoZSBpbXBvcnQgaWYgaXQncyBhbHJlYWR5IHRoZXJlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0Tm90QWxyZWFkeUV4aXN0cygpIHsKLSAgICAJYm9vbGVhbiBub3RFeGlzdHMgPSB0cnVlOwotICAgIAkKLSAgICAJaWYgKGRlZmluaXRpb24uZ2V0VHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgCQlFbGVtZW50IHR5cGVzRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uLmdldFR5cGVzKCkpOwotICAgIAkJRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gZ2V0SW1wb3J0SG9sZGVyRWxlbWVudCh0eXBlc0VsZW1lbnQpOwotCi0gICAgCQlpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgCQkJLy8gQ29sbGVjdCBjaGlsZHJlbgotICAgIAkJCU5vZGUgbm9kZSA9IHNjaGVtYUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgIAkJCWphdmEudXRpbC5WZWN0b3Igc2NoZW1hQ2hpbGRyZW4gPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgIAkJCWlmIChub2RlICE9IG51bGwpIHsKLSAgICAJCQkJTm9kZSBjaGlsZCA9IG5vZGU7Ci0JCQkJCQotICAgIAkJCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UZXh0SW1wbCkpIHsKLSAgICAJCQkJCXNjaGVtYUNoaWxkcmVuLmFkZEVsZW1lbnQoY2hpbGQpOwotICAgIAkJCQl9Ci0JCQkJCQotICAgIAkJCQl3aGlsZSAoY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKSB7Ci0gICAgCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgCQkJCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UZXh0SW1wbCkpIHsKLSAgICAJCQkJCQlzY2hlbWFDaGlsZHJlbi5hZGRFbGVtZW50KGNoaWxkKTsKLSAgICAJCQkJCX0KLSAgICAJCQkJfQotCi0gICAgCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzY2hlbWFDaGlsZHJlbi5zaXplKCk7IGluZGV4KyspIHsKLSAgICAJCQkJCUVsZW1lbnQgc2NoZW1hQ2hpbGQgPSAoRWxlbWVudCkgc2NoZW1hQ2hpbGRyZW4uZWxlbWVudEF0KGluZGV4KTsKLSAgICAJCQkJCVN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYUNoaWxkLmdldEF0dHJpYnV0ZSgic2NoZW1hTG9jYXRpb24iKTsKLSAgICAJCQkJCVN0cmluZyBzY2hlbWFOYW1lc3BhY2UgPSBzY2hlbWFDaGlsZC5nZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIpOwotCQkJCQotICAgIAkJCQkJaWYgKHNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgbmFtZXNwYWNlICE9IG51bGwgJiYKLSAgICAJCQkJCQkJc2NoZW1hTG9jYXRpb24uZXF1YWxzKGxvY2F0aW9uKSAmJiBzY2hlbWFOYW1lc3BhY2UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAJCQkJCQlub3RFeGlzdHMgPSBmYWxzZTsKLSAgICAJCQkJCQlicmVhazsKLSAgICAJCQkJCX0KLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAkKLSAgICAJcmV0dXJuIG5vdEV4aXN0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgICAgaWYgKGRlZmluaXRpb25FbGVtZW50ICE9IG51bGwgJiYgaW1wb3J0Tm90QWxyZWFkeUV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBiZWdpblJlY29yZGluZygpOwotICAgICAgICAgICAgcGVyZm9ybUFkZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGVuZFJlY29yZGluZygpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IHR5cGVzRWxlbWVudCA9IGdldE9yQ3JlYXRlVHlwZXNFbGVtZW50KCk7Ci0gICAgICAgICAgICBFbGVtZW50IGltcG9ydEhvbGRlckVsZW1lbnQgPSBnZXRPckNyZWF0ZUltcG9ydEhvbGRlckVsZW1lbnQodHlwZXNFbGVtZW50KTsKLQotICAgICAgICAgICAgQWRkRWxlbWVudEFjdGlvbiBhZGRJbXBvcnRBY3Rpb24gPSBuZXcgQWRkRWxlbWVudEFjdGlvbigiIiwgImljb25zL3hzZF9vYmouZ2lmIiwgaW1wb3J0SG9sZGVyRWxlbWVudCwgaW1wb3J0SG9sZGVyRWxlbWVudC5nZXRQcmVmaXgoKSwgImltcG9ydCIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBhZGRJbXBvcnRBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBhZGRJbXBvcnRBY3Rpb24uZ2V0TmV3RWxlbWVudCgpOwotICAgICAgICAgICAgZm9ybWF0KG5ld0VsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4KFN0cmluZyBuc1ByZWZpeCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4ID0gbnNQcmVmaXg7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZvcm1hdChOb2RlIHBhcmVudE5vZGUpCi0gICAgewotICAgICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICAgICAgICBmb3JtYXRQcm9jZXNzb3JYTUwuZm9ybWF0Tm9kZSgoSURPTU5vZGUpcGFyZW50Tm9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDFlMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOyAKLSAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTm9kZUFjdGlvbiBleHRlbmRzIEFjdGlvbgoteyAKLSAgcHVibGljIGFic3RyYWN0IE5vZGUgZ2V0Tm9kZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpOwotCi0gIHB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKCkKLSAgeyAgICAKLSAgICBOb2RlIG5vZGUgPSBnZXROb2RlKCk7ICAKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRVbmRvRGVzY3JpcHRpb24oKSk7ICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoKQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBOb2RlIG5vZGUgPSBnZXROb2RlKCk7IAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgIAotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQ29weUdsb2JhbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5R2xvYmFsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDVmZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5R2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQ29weUdsb2JhbEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0gIAlwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvcjsKLSAgCXByaXZhdGUgV1NETEVsZW1lbnQgc2VsZWN0aW9uOwotICAJCi0gIAlwdWJsaWMgQ29weUdsb2JhbEFjdGlvbihXU0RMRWxlbWVudCBzZWxlY3Rpb24sIElFZGl0b3JQYXJ0IGVkaXRvcikgewotICAJCXNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0NPUFkiKSk7Ci0gIAkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIAkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gIAkJc2V0RW5hYmxlZFN0YXRlKCk7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgV1NETEVkaXRvcikgewotICAJCQkoKFdTRExFZGl0b3IpIGVkaXRvcikuc2V0Q2xpcGJvYXJkQ29udGVudHMoc2VsZWN0aW9uKTsKLSAgCQkJCi0gIAkJCSgoV1NETEVkaXRvcikgZWRpdG9yKS5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotICAJCX0KLSAgCX0KLSAgCQotICAJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKFdTRExFbGVtZW50IG5ld1NlbGVjdGlvbikgewotICAJCXNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLSAgCQlzZXRFbmFibGVkU3RhdGUoKTsKLSAgCX0KLSAgCQotICAJcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlZFN0YXRlKCkgewotICAJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgCQkJc2V0RW5hYmxlZCh0cnVlKTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkgIAkJc2V0RW5hYmxlZChmYWxzZSk7Ci0gIAkJfQotICAJfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5V1NETEVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQ29weVdTRExFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZTdmOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5V1NETEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRPcGVyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLldTRExFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5XU0RMVHJlZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoKLSAqIENsYXNzIHdoaWNoIGNvcGllcyBhIFdTRExFbGVtZW50IGFuZCBpdCdzICdjaGlsZHJlbicgZWxlbWVudHMuCi0gKiBGb3IgZXhhbXBsZSwgYSBjb3B5IGNvbW1hbmQgb24gYSBPcGVyYXRpb24gd2lsbCByZXN1bHQgaW4gYSBjb3B5Ci0gKiBvZiB0aGUgb3BlcmF0aW9uIGFuZCBpdCdzIGlucHV0L291dHB1dC9mYXVsdHMsIGFuZCBpdCdzIG1lc3NhZ2UKLSAqIGFuZCBwYXJ0cy4KLSAqLwotcHVibGljIGNsYXNzIENvcHlXU0RMRWxlbWVudEFjdGlvbiBleHRlbmRzIFdTRExEcmFnQWN0aW9uIHsKLQlXU0RMRWxlbWVudCBlbGVtZW50LCBwYXJlbnQ7Ci0JTm9kZSBwYXJlbnROb2RlOwotCVdTRExFbGVtZW50Q29tbWFuZCB3c2RsRWxlbWVudENvbW1hbmQ7Ci0JRWRpdFBhcnRWaWV3ZXIgZWRpdFBhcnRWaWV3ZXI7Ci0JCi0JLyoKLQkgKiAgZWxlbWVudCA9IFRoZSBXU0RMRWxlbWVudCBiZWluZyBjb3BpZWQKLQkgKiAgcGFyZW50ID0gVGhlIFBhcmVudCBvZiB0aGUgJ25ldycgV1NETEVsZW1lbnQKLQkgKiAgcGFyZW50Tm9kZSA9IEVsZW1lbnRJbXBsIChmb3IgdW5kbykKLQkgKi8JCi0JcHVibGljIENvcHlXU0RMRWxlbWVudEFjdGlvbihFZGl0UGFydFZpZXdlciBlZGl0UGFydFZpZXdlciwgV1NETEVsZW1lbnQgZWxlbWVudCwgV1NETEVsZW1lbnQgcGFyZW50LCBOb2RlIHBhcmVudE5vZGUpIHsKLQkJc2V0VGV4dCgiQ29weSBXU0RMRWxlbWVudCIpOyAgLy8gRG8gbm90IFRyYW5zbGF0ZSBUaGlzCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CQotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLQkJdGhpcy5lZGl0UGFydFZpZXdlciA9IGVkaXRQYXJ0Vmlld2VyOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbil7Ci0JCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBQb3J0VHlwZSkgewotCQkJCVBvcnRUeXBlIHB0ID0gKFBvcnRUeXBlKSBwYXJlbnQ7Ci0JCQkJT3BlcmF0aW9uIG9wID0gKE9wZXJhdGlvbikgZWxlbWVudDsKLQkJCQl3c2RsRWxlbWVudENvbW1hbmQgID0gbmV3IEFkZE9wZXJhdGlvbkNvbW1hbmQocHQsIG9wLCBOYW1lVXRpbC5idWlsZFVuaXF1ZU9wZXJhdGlvbk5hbWUocHQsIG9wLmdldE5hbWUoKSksIHRydWUpOwkJCi0JCQl9Ci0JCX0KLQkJLyoKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSW5wdXQpIHsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPdXRwdXQpIHsKLQkJCQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGYXVsdCkgewotCQkJCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2UpIHsKLQkJCQotCQl9Ci0JCSovCi0JCQotCQlpZiAod3NkbEVsZW1lbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHdzZGxFbGVtZW50Q29tbWFuZCA9PSBudWxsKSB7Ci0JCQlpZiAoY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJcnVuQ29tbWFuZCgpOwotCQkJfQotCQl9Ci0JCSBlbHNlIHsKLQkJIAlydW5Db21tYW5kKCk7Ci0JCSB9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBydW5Db21tYW5kKCkgewotCSAJdGhpcy5iZWdpblJlY29yZGluZygpOwotCQl3c2RsRWxlbWVudENvbW1hbmQucnVuKCk7Ci0JCXNlbGVjdFdTRExFbGVtZW50KHdzZGxFbGVtZW50Q29tbWFuZC5nZXRXU0RMRWxlbWVudCgpKTsKLQkJdGhpcy5lbmRSZWNvcmRpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdFdTRExFbGVtZW50KFdTRExFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gU2VsZWN0IHRoZSBuZXdseSBjcmVhdGVkIGVsZW1lbnQKLQkgICAgLy8gRXhwYW5kIGFsbCB0aGUgYXNzb2NpYXRlZCBlbGVtZW50cyAnYmVsb3cnIHRoZSBnaXZlbiBlbGVtZW50Ci0JICAgIE1hcCBlZGl0UGFydE1hcCA9IGVkaXRQYXJ0Vmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKTsKLQkgICAgV1NETFRyZWVOb2RlRWRpdFBhcnQgd3NkbEVkaXRQYXJ0ID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBlZGl0UGFydE1hcC5nZXQoZWxlbWVudCk7Ci0JICAgIGlmICh3c2RsRWRpdFBhcnQgIT0gbnVsbCkgewotCSAgICAJZWRpdFBhcnRWaWV3ZXIuc2VsZWN0KHdzZGxFZGl0UGFydCk7Ci0JCSAgICBleHBhbmRFZGl0UGFydHMoZWxlbWVudCwgdHJ1ZSk7Ci0JICAgIH0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZEVkaXRQYXJ0cyhPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBleHBhbmRDaGlsZHJlbikgewotCSAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JICAgIAlNYXAgZWRpdFBhcnRNYXAgPSBlZGl0UGFydFZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCk7Ci0JICAgIAlXU0RMVHJlZU5vZGVFZGl0UGFydCB3c2RsRWRpdFBhcnQgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIGVkaXRQYXJ0TWFwLmdldChlbGVtZW50KTsKLQkJCXdzZGxFZGl0UGFydC5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCQotCQkJaWYgKGV4cGFuZENoaWxkcmVuKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBXU0RMRWRpdG9yVXRpbC5nZXRNb2RlbEdyYXBoVmlld0NoaWxkcmVuKGVsZW1lbnQpLml0ZXJhdG9yKCk7Ci0JCQkJCi0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlleHBhbmRFZGl0UGFydHMoaXRlcmF0b3IubmV4dCgpLCBleHBhbmRDaGlsZHJlbik7Ci0JCQkJfQotCQkJfQotCSAgICB9Ci0JfQotCQotCS8vIEluaGVyaXRlZCBjbGFzc2VzIGZyb20gQmFzZU5vZGVBY3Rpb24KLQkgIHB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JICAJcmV0dXJuIHBhcmVudE5vZGU7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCSAgCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQ09QWSIpOwotCSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlRG9jQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlRG9jQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0YjljNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZURvY0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3Rm9sZGVyTWFpblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZURvY0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUKLXsKLSAgcHJvdGVjdGVkIElGaWxlIGlGaWxlOwotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMRURJVE9SX0RPQ0dFTl9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZG9jZ2VuIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBWQUxJREFURV9XU0RMX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGUud3NkbCI7IC8vJE5PTi1OTFMtMSQKLQotICBwcm90ZWN0ZWQgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IG51bGw7Ci0KLSAgcHVibGljIENyZWF0ZURvY0FjdGlvbkRlbGVnYXRlKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RmlsZShJRmlsZSBpRmlsZSkKLSAgewotICAgIHRoaXMuaUZpbGUgPSBpRmlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLS8vIFRPRE86IFVuY29tbWVudCB3aGVuIHZhbGlkYXRpb24gaXMgY2hlY2tlZCBpbnRvIGNvcm9uYSAgICAKLS8vICAgIElTaGFyZWRTZXJ2aWNlIHZhbGlkYXRlU2hhcmVkU2VydmljZSA9IEV4dGVuc2lvblBsdWdpbi5nZXRTaGFyZWRTZXJ2aWNlKCJWYWxpZGF0ZVdTRExTaGFyZWRTZXJ2aWNlIik7IC8vJE5PTi1OTFMtMSQKLS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbih2YWxpZGF0ZVNoYXJlZFNlcnZpY2UpOwotLy8gICAgaWYgKHZhbGlkYXRlU2hhcmVkU2VydmljZSAhPSBudWxsKQotLy8gICAgewotLy8gICAgICB0cnkKLS8vICAgICAgewotLy8gICAgICAgIEJvb2xlYW4gcmMgPSAoQm9vbGVhbikgdmFsaWRhdGVTaGFyZWRTZXJ2aWNlLnJ1bihpRmlsZSk7Ci0vLyAgICAgICAgaWYgKHJjLmJvb2xlYW5WYWx1ZSgpKQotLy8gICAgICAgIHsKLSAgICAgICAgICBOZXdXU0RMRG9jRm9sZGVyV2l6YXJkIHdpeiA9IG5ldyBOZXdXU0RMRG9jRm9sZGVyV2l6YXJkKCk7Ci0gICAgICAgICAgTmV3V1NETERvY0RpYWxvZyBkbGcgPSBuZXcgTmV3V1NETERvY0RpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHdpeik7Ci0gICAgICAgICAgZGxnLm9wZW4oKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VSUk9SX0lOVkFMSURfV1NETCIpLCAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9JTlZBTElEX1dTRExfREVTQyIpKTsgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLyAgICAgIHsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAiRXJyb3IiLCAvLyROT04tTkxTLTEkCi0vLyAgICAgICJDYW5ub3QgZmluZCB2YWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotLy8gICAgfQotICB9Ci0KLSAgY2xhc3MgR2VuSFRNTE9wZXJhdGlvbiBleHRlbmRzIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbgotICB7Ci0gICAgSUZpbGUgaUZpbGU7Ci0gICAgU3RyaW5nIG91dHB1dExvY2F0aW9uOwotICAgIHB1YmxpYyBHZW5IVE1MT3BlcmF0aW9uKElGaWxlIGlGaWxlKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICB0aGlzLmlGaWxlID0gaUZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0TG9jYXRpb24oU3RyaW5nIG91dHB1dExvY2F0aW9uKQotICAgIHsKLSAgICAgIHRoaXMub3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgCS8qCi0gICAgICBtb25pdG9yLmJlZ2luVGFzayhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9DUkVBVElOR19IVE1MX0ZJTEVTIiksIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFdTRExEb2MgZG9jID0gbmV3IFdTRExEb2MobmV3IFdTRExEb2NGaWxlV3JpdGVyKCkpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGx1Z2luIHBsdWdpbiA9IFBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZG9jZ2VuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSVBhdGggaW5zdGFsbFBhdGggPSBuZXcgUGF0aChwbHVnaW4uZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKS50b0V4dGVybmFsRm9ybSgpKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgICBTdHJpbmcgaW5zdGFsbFN0ciA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChpbnN0YWxsUGF0aC50b1N0cmluZygpKSkuZ2V0RmlsZSgpOwotICAgICAgICBQYXRoIGRvY2dlblBhdGggPSBuZXcgUGF0aChpbnN0YWxsU3RyKTsKLQotICAgICAgICBkb2Muc2V0VGVtcGxhdGVMb2NhdGlvbihkb2NnZW5QYXRoLnRvT1NTdHJpbmcoKSArICJ0ZW1wbGF0ZSIgKyBGaWxlLnNlcGFyYXRvcik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZG9jLnNldE9wdGlvbnMoaUZpbGUuZ2V0UmF3TG9jYXRpb24oKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9PU1N0cmluZygpLCBvdXRwdXRMb2NhdGlvbiwgIiIpOwotCi0gICAgICAgIGRvYy5hZGRGaWxlKGlGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGRvYy5kb0J1aWxkU3RlcCgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOyAKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICB9Ci0gICAgICAqLwotICAgIH0KLSAgfQotCi0gIGNsYXNzIFdTRExEb2NOZXdGb2xkZXJNYWluUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZvbGRlck1haW5QYWdlCi0gIHsKLSAgICBwdWJsaWMgV1NETERvY05ld0ZvbGRlck1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkKLSAgICB7Ci0gICAgICBzdXBlcihwYWdlTmFtZSwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaUZpbGUpKTsKLSAgICAgIHNldERlc2NyaXB0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0NSRUFURV9GT0xERVJfRk9SX0RPQ1MiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBOZXdXU0RMRG9jRm9sZGVyV2l6YXJkIGV4dGVuZHMgV2l6YXJkCi0gIHsKLSAgICBJRm9sZGVyIGZvbGRlcjsKLQotICAgIHByaXZhdGUgV1NETERvY05ld0ZvbGRlck1haW5QYWdlIG5ld0ZvbGRlclBhZ2U7Ci0KLSAgICBwdWJsaWMgTmV3V1NETERvY0ZvbGRlcldpemFyZCgpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIHNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICAgIHsKLSAgICAgIGZvbGRlciA9IG5ld0ZvbGRlclBhZ2UuY3JlYXRlTmV3Rm9sZGVyKCk7Ci0gICAgICBpZiAoZm9sZGVyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfRVJST1IiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9GT0xERVJfTk9UX0NSRUFURUQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBHZW5IVE1MT3BlcmF0aW9uIG9wID0gbmV3IEdlbkhUTUxPcGVyYXRpb24oaUZpbGUpOwotICAgICAgb3Auc2V0T3V0cHV0TG9jYXRpb24oZm9sZGVyLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIG9wLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLSAgICAgICAgLy8gcmVmcmVzaCBmb2xkZXIgYW5kIG9wZW4gaW5kZXguaHRtbCBpbiB3ZWIgYnJvd3NlcgotICAgICAgICBmb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBpbmRleEh0bWxGaWxlID0gZm9sZGVyLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IgKyAiaW5kZXguaHRtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSUZpbGUgaW5kZXhIdG1sSUZpbGUgPSBnZXRXb3Jrc3BhY2VGaWxlRnJvbUxvY2FsTG9jYXRpb24oaW5kZXhIdG1sRmlsZSk7Ci0gICAgICAgIGlmIChpbmRleEh0bWxJRmlsZSAhPSBudWxsICYmIGluZGV4SHRtbElGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV2ZWFsU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGluZGV4SHRtbElGaWxlKSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgb3BlbkVkaXRvcihpbmRleEh0bWxJRmlsZSwgIm9yZy5lY2xpcHNlLndlYmJyb3dzZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VSUk9SX0VSUk9SIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9DUkVBVElOR19IVE1MX0ZJTEVTIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgICAvLyAgICAgICAgY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmV2ZWFsU2VsZWN0aW9uKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBmaW5hbCBJV29ya2JlbmNoUGFydCBmb2N1c1BhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgaWYgKGZvY3VzUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMKLSAgICAgICAgICAobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKChJU2V0U2VsZWN0aW9uVGFyZ2V0KWZvY3VzUGFydCkuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBpRmlsZSwgZmluYWwgU3RyaW5nIGVkaXRvcklkKQotICAgIHsKLSAgICAgIGlmIChpRmlsZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLSAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjCi0gICAgICAgIChuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGlGaWxlKSwgZWRpdG9ySWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIEIyQkdVSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRXhjZXB0aW9uIGVuY291bnRlcmVkIHdoZW4gYXR0ZW1wdGluZyB0byBvcGVuIGZpbGU6ICIgKyBpRmlsZSArICJcblxuIiArIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSUZpbGUgZ2V0V29ya3NwYWNlRmlsZUZyb21Mb2NhbExvY2F0aW9uKFN0cmluZyBmaWxlTmFtZSkKLSAgICB7Ci0gICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgIGlmICh3b3Jrc3BhY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGUgaUZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlTmFtZSkpOwotICAgICAgICBpZiAoaUZpbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBpRmlsZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkKLSAgICB7Ci0gICAgICBuZXdGb2xkZXJQYWdlID0gbmV3IFdTRExEb2NOZXdGb2xkZXJNYWluUGFnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9ORVdfRk9MREVSIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBhZGRQYWdlKG5ld0ZvbGRlclBhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpCi0gICAgewotICAgICAgaWYgKG5ld0ZvbGRlclBhZ2UuaXNQYWdlQ29tcGxldGUoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIElGb2xkZXIgZ2V0Rm9sZGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZm9sZGVyOwotICAgIH0KLSAgfQotCi0gIGNsYXNzIE5ld1dTRExEb2NEaWFsb2cgZXh0ZW5kcyBXaXphcmREaWFsb2cKLSAgewotICAgIHB1YmxpYyBOZXdXU0RMRG9jRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJV2l6YXJkIG5ld1dpemFyZCkKLSAgICB7Ci0gICAgICBzdXBlcihwYXJlbnRTaGVsbCwgbmV3V2l6YXJkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikKLSAgewotICAgIGVkaXRvclBhcnQgPSB0YXJnZXRFZGl0b3I7Ci0gICAgaUZpbGUgPSBudWxsOwotICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gdGFyZ2V0RWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBpRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldEZpbGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQzODY4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb24gewotCSBwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCSBwcm90ZWN0ZWQgU3RyaW5nIGRlbGV0ZVN0cmluZyA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSArICIgIjsgLy8kTk9OLU5MUy0xJAotLy8JIHByaXZhdGUgT2JqZWN0IG9iamVjdDsKLS8vCSBwcml2YXRlIE5vZGUgbm9kZTsKLQkKLQlwdWJsaWMgRGVsZXRlQWN0aW9uKE9iamVjdCBvYmplY3QsIE5vZGUgbm9kZSkgewotCQlzZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSk7ICAvLyROT04tTkxTLTEkCi0JICAgIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JICAgIGxpc3QuYWRkKG9iamVjdCk7Ci0JfQotCQotCXB1YmxpYyBEZWxldGVBY3Rpb24oTGlzdCBkZWxldGVMaXN0KSB7Ci0JCXNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURSIpKTsgIC8vJE5PTi1OTFMtMSQKLQkgICAgbGlzdCA9IGRlbGV0ZUxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3IgZ2V0UmVmZXJlbmNlZE1lc3NhZ2VzKE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJVmVjdG9yIG1lc3NhZ2VzID0gbmV3IFZlY3RvcigpOwotCQltZXNzYWdlcy5hZGRBbGwoZ2V0TWVzc2FnZXMob3BlcmF0aW9uLmdldEVGYXVsdHMoKSkpOwotCQkKLQkJaWYgKG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsICYmIG9wZXJhdGlvbi5nZXRFSW5wdXQoKS5nZXRFTWVzc2FnZSgpICE9IG51bGwpCi0JCQltZXNzYWdlcy5hZGRFbGVtZW50KG9wZXJhdGlvbi5nZXRFSW5wdXQoKS5nZXRFTWVzc2FnZSgpKTsKLQkJaWYgKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkgIT0gbnVsbCAmJiBvcGVyYXRpb24uZ2V0RU91dHB1dCgpLmdldEVNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCW1lc3NhZ2VzLmFkZEVsZW1lbnQob3BlcmF0aW9uLmdldEVPdXRwdXQoKS5nZXRFTWVzc2FnZSgpKTsKLQkJCi0JCXJldHVybiBtZXNzYWdlczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBXZSB3YW50IHRvIGRlbGV0ZSBPcGVyYXRpb25zIGZpcnN0LiAgU28gd2UgbmVlZCB0byBzb3J0IHRoZSBsaXN0Ci0JCUxpc3Qgc29ydGVkTGlzdCA9IG5ldyBBcnJheUxpc3QobGlzdC5zaXplKCkpOwotCQlJdGVyYXRvciBsaXN0SXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQotCQl3aGlsZSAobGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHVuc29ydGVkT2JqZWN0ID0gbGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh1bnNvcnRlZE9iamVjdCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotCQkJCXNvcnRlZExpc3QuYWRkKDAsIHVuc29ydGVkT2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvcnRlZExpc3QuYWRkKHVuc29ydGVkT2JqZWN0KTsKLQkJCX0KLQkJfQotCQkKLQkJTm9kZSByZWNvcmRpbmdOb2RlID0gbnVsbDsKLQkJaWYgKHNvcnRlZExpc3Quc2l6ZSgpID4gMSkgewotCQkJcmVjb3JkaW5nTm9kZSA9IGdldEVsZW1lbnQoc29ydGVkTGlzdC5nZXQoMCkpOwotCQkJYmVnaW5SZWNvcmRpbmcocmVjb3JkaW5nTm9kZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX01VTFRJUExFX0RFTEVURSIpKTsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzb3J0ZWRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLQkJCQlkZWxldGVPcGVyYXRpb24oKE9wZXJhdGlvbikgb2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcnQpIHsKLQkJCQlkZWxldGVQYXJ0KChQYXJ0KSBvYmplY3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRGVsZXRlTm9kZUFjdGlvbiBkZWxldGVOb2RlQWN0aW9uID0gbmV3IERlbGV0ZU5vZGVBY3Rpb24oZ2V0RWxlbWVudChvYmplY3QpKTsKLQkJCQlkZWxldGVOb2RlQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocmVjb3JkaW5nTm9kZSAhPSBudWxsKSB7Ci0JCQllbmRSZWNvcmRpbmcocmVjb3JkaW5nTm9kZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBWZWN0b3IgZ2V0TWVzc2FnZXMoTGlzdCBmYXVsdHMpIHsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZmF1bHRzLml0ZXJhdG9yKCk7Ci0JCQotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgaXQubmV4dCgpOwotCQkJaWYgKGZhdWx0LmdldEVNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCXYuYWRkRWxlbWVudChmYXVsdC5nZXRFTWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHY7Ci0JfQotCQotCXByaXZhdGUgVmVjdG9yIGdldFBhcnRzKFZlY3RvciBtZXNzYWdlcykgewotCQlWZWN0b3IgcGFydHMgPSBuZXcgVmVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBpdC5uZXh0KCk7Ci0JCQkKLQkJCWlmIChtZXNzYWdlLmdldEVQYXJ0cygpICE9IG51bGwpIHsKLQkJCQlwYXJ0cy5hZGRBbGwobWVzc2FnZS5nZXRFUGFydHMoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwYXJ0czsKLQl9Ci0JCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0JewotCSAgcmV0dXJuIGxpc3Quc2l6ZSgpID4gMCA/IChOb2RlKSBnZXRFbGVtZW50KGxpc3QuZ2V0KDApKSA6IG51bGw7Ci0JfSAKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLQl7Ci0JICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgdm9pZCBkZWxldGVPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlEZWxldGVPcGVyYXRpb25EaWFsb2cgZGlhbG9nID0gbmV3IERlbGV0ZU9wZXJhdGlvbkRpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIG9wZXJhdGlvbi5nZXROYW1lKCkpOwotCSAgICBpbnQgcmV0dXJuQ29kZSA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0JICAgIAotCSAgICBpZiAocmV0dXJuQ29kZSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JICAgIAlpZiAoZGlhbG9nLmRlbGV0ZU1lc3NhZ2VzQW5kUGFydHMoKSkgewotCSAgICAJCS8vIEdldCBhbGwgYXNzb2NpYXRlZCBtZXNzYWdlcwotCSAgICAJCVZlY3RvciBtZXNzYWdlcyA9IGdldFJlZmVyZW5jZWRNZXNzYWdlcyhvcGVyYXRpb24pOwotCSAgICAJCQotCSAgICAJCS8vIERldGVybWluZSB3aGljaCBNZXNzYWdlcyBhcmUgcmVmZXJlbmNlZCBmcm9tICdvdXRzaWRlJyB0aGlzIG9wZXJhdGlvbgotCSAgICAJCVZlY3RvciByZWZlcmVuY2VkTWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0JICAgIAkJaWYgKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0RVBvcnRUeXBlcygpICE9IG51bGwpIHsKLQkgICAgCQkJSXRlcmF0b3IgcG9ydFR5cGVJdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0RVBvcnRUeXBlcygpLml0ZXJhdG9yKCk7Ci0JICAgIAkJCVZlY3RvciBvcGVyYXRpb25zID0gbmV3IFZlY3RvcigpOwotCSAgICAJCQkKLQkgICAgCQkJd2hpbGUgKHBvcnRUeXBlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JICAgIAkJCQlQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgcG9ydFR5cGVJdGVyYXRvci5uZXh0KCk7Ci0JICAgIAkJCQkKLQkgICAgCQkJCWlmIChwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpICE9IG51bGwpIHsKLQkgICAgCQkJCQlJdGVyYXRvciBvcGVyYXRpb25JdGVyYXRvciA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLQkgICAgCQkJCQl3aGlsZSAob3BlcmF0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JICAgIAkJCQkJCU9wZXJhdGlvbiBuZXh0T3BlcmF0aW9uID0gKE9wZXJhdGlvbikgb3BlcmF0aW9uSXRlcmF0b3IubmV4dCgpOwotCSAgICAJCQkJCQlpZiAoIW5leHRPcGVyYXRpb24uZXF1YWxzKG9wZXJhdGlvbikpCi0JICAgIAkJCQkJCQlvcGVyYXRpb25zLmFkZChuZXh0T3BlcmF0aW9uKTsKLQkgICAgCQkJCQl9Ci0JICAgIAkJCQl9Ci0JICAgIAkJCX0KLQkgICAgCQkJCi0JICAgIAkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBvcGVyYXRpb25zLnNpemUoKTsgaW5kZXgrKykgewotCSAgICAJCQkJcmVmZXJlbmNlZE1lc3NhZ2VzLmFkZEFsbChnZXRSZWZlcmVuY2VkTWVzc2FnZXMoKE9wZXJhdGlvbikgb3BlcmF0aW9ucy5lbGVtZW50QXQoaW5kZXgpKSk7Ci0JICAgIAkJCX0KLQkgICAgCQkKLQkgICAgCQkJLy8gRmlsdGVyIHdoaWNoIE1lc3NhZ2VzIG5lZWQgdG8gYmUgZGVsZXRlZAotCSAgICAJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JICAgIAkJCQlpbnQgZm91bmRJbmRleCA9IHJlZmVyZW5jZWRNZXNzYWdlcy5pbmRleE9mKG1lc3NhZ2VzLmVsZW1lbnRBdChpbmRleCkpOwotCSAgICAJCQkJCi0JICAgIAkJCQlpZiAoZm91bmRJbmRleCAhPSAtMSkgewotCSAgICAJCQkJCS8vIE1lc3NhZ2UgaXMgcmVmZXJlbmNlZCBlbHNld2hlcmUuICBEbyBub3QgZGVsZXRlCi0JICAgIAkJCQkJbWVzc2FnZXMucmVtb3ZlKGluZGV4KTsKLQkgICAgCQkJCX0KLQkgICAgCQkJfQotCSAgICAJCX0KLQkgICAgCQkKLQkgICAgCQkvLyBHZXQgYWxsIGFzc29jaWF0ZWQgcGFydHMKLQkgICAgCQlWZWN0b3IgcGFydHMgPSBnZXRQYXJ0cyhtZXNzYWdlcyk7Ci0JICAgIAkJCi0JICAgIAkJLy8gUmVtb3ZlIG91ciBsaXN0IG9mIE1lc3NhZ2VzIGFuZCBQYXJ0cwotCSAgICAJCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBvcGVyYXRpb24uZUNvbnRhaW5lcigpOwotCSAgICAJCU5vZGUgcmVjb3JkaW5nTm9kZSA9IHBvcnRUeXBlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRFbGVtZW50KCk7Ci0JICAgIAkJYmVnaW5SZWNvcmRpbmcocmVjb3JkaW5nTm9kZSwgZGVsZXRlU3RyaW5nICsgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfT1BFUkFUSU9OIikpOwotCSAgICAJCQotCSAgICAJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtZXNzYWdlcy5zaXplKCk7IGluZGV4KyspIHsKLQkgICAgCQkJTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIG1lc3NhZ2VzLmVsZW1lbnRBdChpbmRleCk7Ci0JICAgIAkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBtZXNzYWdlLmVDb250YWluZXIoKTsKLQkgICAgCQkJZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKS5yZW1vdmUobWVzc2FnZSk7Ci0JICAgIAkJfQotCi0JICAgIAkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhcnRzLnNpemUoKTsgaW5kZXgrKykgewotCSAgICAJCQlQYXJ0IHBhcnQgPSAoUGFydCkgcGFydHMuZWxlbWVudEF0KGluZGV4KTsKLQkgICAgCQkJTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIHBhcnQuZUNvbnRhaW5lcigpOwotCSAgICAJCQltZXNzYWdlLmdldEVQYXJ0cygpLnJlbW92ZShwYXJ0KTsKLQkgICAgCQl9Ci0JICAgIAkJCi0JICAgIAkJLy8gRGVsZXRlIHRoZSBPcGVyYXRpb24KLQkgICAgCQlwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLnJlbW92ZShvcGVyYXRpb24pOwotCi0JICAgIAkJZW5kUmVjb3JkaW5nKHJlY29yZGluZ05vZGUpOwotCSAgICAJfQotCSAgICAJZWxzZSB7Ci0JICAgIAkJLy8gT25seSBkZWxldGUgdGhlIE9wZXJhdGlvbgotCSAgICAJCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBvcGVyYXRpb24uZUNvbnRhaW5lcigpOwotCSAgICAJCU5vZGUgcmVjb3JkaW5nTm9kZSA9IHBvcnRUeXBlLmdldEVsZW1lbnQoKTsKLQkgICAgCQkKLQkgICAgCQliZWdpblJlY29yZGluZyhyZWNvcmRpbmdOb2RlLCBkZWxldGVTdHJpbmcgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9PUEVSQVRJT04iKSk7IC8vIFRyYW5zbGF0ZSB0aGlzISEhCi0JICAgIAkJcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5yZW1vdmUob3BlcmF0aW9uKTsKLQkgICAgCQllbmRSZWNvcmRpbmcocmVjb3JkaW5nTm9kZSk7Ci0JICAgIAl9Ci0JICAgIH0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZVBhcnQoUGFydCBwYXJ0KSB7Ci0JCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBwYXJ0LmVDb250YWluZXIoKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJYmVnaW5SZWNvcmRpbmcobWVzc2FnZS5nZXRFbGVtZW50KCksIGRlbGV0ZVN0cmluZyArIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BBUlQiKSk7Ci0JCQltZXNzYWdlLmdldEVQYXJ0cygpLnJlbW92ZShwYXJ0KTsKLQkJCWVuZFJlY29yZGluZyhtZXNzYWdlLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBFbGVtZW50IGdldEVsZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQpIHsKLQkJCWVsZW1lbnQgPSAoKFdTRExFbGVtZW50KSBvYmplY3QpLmdldEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEpIHsKLQkJCWVsZW1lbnQgPSAoKFhTRFNjaGVtYSkgb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIGJlZ2luIHJlY29yZGluZyBjaGFuZ2VzLgotCSAqIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgcmVwbGFjZSBCYXNlTm9kZUFjdGlvbi5iZWdpblJlY29yZGluZygpCi0JICogd2hlbiBhbGwgZGVsZXRlcyBhcmUgbW9kZWwgZHJpdmVuLgotCSAqLwotCSAgcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKE5vZGUgbm9kZSwgU3RyaW5nIHVuZG9EZXNjcmlwdGlvbikKLQkgIHsgICAgCi0JICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0JICAgIHsKLQkgICAgICAoKElET01Ob2RlKW5vZGUpLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgdW5kb0Rlc2NyaXB0aW9uKTsgIAotCSAgICB9Ci0JICB9Ci0KLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIGJlZ2luIHJlY29yZGluZyBjaGFuZ2VzLgotCSAqIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgcmVwbGFjZSBCYXNlTm9kZUFjdGlvbi5iZWdpblJlY29yZGluZygpCi0JICogd2hlbiBhbGwgZGVsZXRlcyBhcmUgbW9kZWwgZHJpdmVuLgotCSAqLwotCSAgcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKE5vZGUgbm9kZSkKLQkgIHsKLQkgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkgICAgewotCSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7ICAKLQkgICAgfQotCSAgfQotCQotCXByaXZhdGUgY2xhc3MgRGVsZXRlT3BlcmF0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXJ7Ci0JCXByaXZhdGUgQnV0dG9uIGNoZWNrQnV0dG9uID0gbnVsbDsKLQkJcHJpdmF0ZSBib29sZWFuIGRlbGV0ZU1lc3NhZ2VzQW5kUGFydHMgPSB0cnVlOwotCQlwcml2YXRlIFN0cmluZyBvcGVyYXRpb25OYW1lOwotCQkgCi0JCXB1YmxpYyBEZWxldGVPcGVyYXRpb25EaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihzaGVsbCk7Ci0JCQlvcGVyYXRpb25OYW1lID0gbmFtZTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSAKLQkJICB7Ci0JCSAgICBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCSAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQotCQkgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCSAgICBHcmlkRGF0YSBnZEZpbGw9IG5ldyBHcmlkRGF0YSgpOwotCQkgICAgZ2RGaWxsLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLQkJICAgIGdkRmlsbC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkJICAgIGdkRmlsbC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkRmlsbCk7Ci0KLQkJICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkgICAgbGFiZWwuc2V0VGV4dChvcGVyYXRpb25OYW1lKTsKLS8vCQkgICAgbGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9PUEVSQVRJT04iKSArICIgIiArIG9wZXJhdGlvbk5hbWUpOwotCQkgICAgR3JpZERhdGEgbGFiZWxEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCSAgICBsYWJlbERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkgICAgCi0JCSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0JCSAgICAKLQkJICAgIExhYmVsIGVtcHR5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCSAgICBHcmlkRGF0YSBlbXB0eURhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJICAgIGVtcHR5RGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCSAgICBlbXB0eUxhYmVsLnNldExheW91dERhdGEoZW1wdHlEYXRhKTsKLQotCQkgICAgY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJICAgIGNoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihkZWxldGVNZXNzYWdlc0FuZFBhcnRzKTsKLQkJICAgIGNoZWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkgICAgTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkgICAgbmFtZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfREVMRVRFX0FTU09DSUFURURfTVNHX0FORF9QQVJUUyIpKTsKLQkJICAgIAotCQkgICAgcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JCSAgfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZGVsZXRlTWVzc2FnZXNBbmRQYXJ0cygpIHsKLQkJCXJldHVybiBkZWxldGVNZXNzYWdlc0FuZFBhcnRzOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgIHt9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgIHsKLQkJCWlmIChlLndpZGdldCA9PSBjaGVja0J1dHRvbikgewotCQkJCWlmIChjaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlkZWxldGVNZXNzYWdlc0FuZFBhcnRzID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlbGV0ZU1lc3NhZ2VzQW5kUGFydHMgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKSB7Ci0JCQljcmVhdGUoKTsKLQkJICAgIGdldFNoZWxsKCkuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERUxFVEVfT1BFUkFUSU9OX1RJVExFIikpOwotCQkgICAgc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCSAgICByZXR1cm4gb3BlbigpOwotCQl9Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlSW50ZXJmYWNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZUludGVyZmFjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzY0Mjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlSW50ZXJmYWNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBEZWxldGVJbnRlcmZhY2VBY3Rpb24gewotCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlTGlzdChMaXN0IGxpc3QpOwotCQotCXB1YmxpYyB2b2lkIHJ1bigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZU5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNjgxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZU5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsgCi0gICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVOb2RlQWN0aW9uIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb24KLXsgCi0gIHByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLSAgcHVibGljIERlbGV0ZU5vZGVBY3Rpb24oTm9kZSBub2RlKQotICB7Ci0gICAgc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOyAgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbGlzdC5hZGQobm9kZSk7Ci0gIH0gICAgCi0gIAotICBwdWJsaWMgRGVsZXRlTm9kZUFjdGlvbihMaXN0IG5vZGVMaXN0KQotICB7Ci0gICAgc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOyAgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXQgPSBub2RlTGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAJbGlzdC5hZGQoaXQubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmVnaW5SZWNvcmRpbmcoKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpLm5leHQoKTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpbm9kZTsKLSAgICAgICAgYXR0ci5nZXRPd25lckVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBOb2RlIHByZXZpb3VzU2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgICAgaWYgKHByZXZpb3VzU2libGluZyAhPSBudWxsICYmIGlzV2hpdGVzcGFjZVRleHROb2RlKHByZXZpb3VzU2libGluZykpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHByZXZpb3VzU2libGluZyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAKLQotICAgIGVuZFJlY29yZGluZygpOwotICB9ICAgCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNXaGl0ZXNwYWNlVGV4dE5vZGUoTm9kZSBub2RlKSAKLSAgewotCSAgcmV0dXJuIChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLSAgfSAgICAKLQotICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiBsaXN0LnNpemUoKSA+IDAgPyAoTm9kZSlsaXN0LmdldCgwKSA6IG51bGw7Ci0gIH0gCi0KLSAgcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVXU0RMQW5kWFNEQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZVdTRExBbmRYU0RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4NGM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZVdTRExBbmRYU0RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgZGVsZXRlIHdpdGggdGhlIFdTREwgRWRpdG9yJ3MgZ3JhcGggdmlldy4gIHRoZSBvYmplY3QgZm9yCi0gKiBkZWxldGlvbiBjb3VsZCBiZSBhIFdTREwgJ29iamVjdCcgb3IgYW4gWFNEICdvYmplY3QnLiAgV2UgbmVlZCB0byBtYWtlIHRoaXMKLSAqIGRpc3RpbmN0aW9uIGJlY2F1c2Ugd2UgaGF2ZSB0d28gZGlmZmVyZW50IERlbGV0ZSBjbGFzc2VzLiAgT25lIHRvIGhhbmRsZQotICogV1NETCBhbmQgYW5vdGhlciB0byBoYW5kbGUgWFNELgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlV1NETEFuZFhTREFjdGlvbiBleHRlbmRzIEJhc2VOb2RlQWN0aW9uIHsKLQlMaXN0IGxpc3Q7Ci0JTm9kZSByZWNvcmRpbmdOb2RlOwotCVdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLQotCXB1YmxpYyBEZWxldGVXU0RMQW5kWFNEQWN0aW9uKExpc3QgZGVsZXRlTGlzdCwgTm9kZSByZWNvcmRpbmdOb2RlLCBXU0RMRWRpdG9yIHdzZGxFZGl0b3IpIHsKLQkJc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOwotCQlsaXN0ID0gZGVsZXRlTGlzdDsKLQkJdGhpcy5yZWNvcmRpbmdOb2RlID0gcmVjb3JkaW5nTm9kZTsKLQkJdGhpcy53c2RsRWRpdG9yID0gd3NkbEVkaXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJTGlzdCB3c2RsRGVsZXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB4c2REZWxldGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEpIHsKLQkJCQl3c2RsRGVsZXRlTGlzdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXhzZERlbGV0ZUxpc3QuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCU9iamVjdCBuZXdTZWxlY3Rpb24gPSBudWxsOwotCQlPYmplY3QgdG9wTGV2ZWxPYmplY3QgPSBudWxsOwotCQlpZiAod3NkbERlbGV0ZUxpc3Quc2l6ZSgpID4gMCB8fCB4c2REZWxldGVMaXN0LnNpemUoKSA+IDApCi0JCXsJCi0JCQl0cnkKLQkJCXsKLQkJCWJlZ2luUmVjb3JkaW5nKCk7CQotCQkJCQotCQkKLQkJLy8gRGVsZXRlIFdTREwgb2JqZWN0cwotCQlpZiAod3NkbERlbGV0ZUxpc3Quc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IHdzZGxPYmplY3QgPSB3c2RsRGVsZXRlTGlzdC5nZXQoMCk7Ci0JCQlpZiAod3NkbE9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSB7Ci0JCQkJbmV3U2VsZWN0aW9uID0gKChXU0RMRWxlbWVudCkgd3NkbE9iamVjdCkuZUNvbnRhaW5lcigpOwotCQkJCXRvcExldmVsT2JqZWN0ID0gZ2V0VG9wTGV2ZWxXU0RMT2JqZWN0KChXU0RMRWxlbWVudCkgd3NkbE9iamVjdCk7Ci0JCQl9Ci0JCQkKLQkJCURlbGV0ZUFjdGlvbiB3c2RsRGVsZXRlID0gbmV3IERlbGV0ZUFjdGlvbih3c2RsRGVsZXRlTGlzdCk7Ci0JCQl3c2RsRGVsZXRlLnJ1bigpOwotCQl9Ci0JCQotCQkvLyBEZWxldGUgWFNEIG9iamVjdHMKLQkJaWYgKHhzZERlbGV0ZUxpc3Quc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IHhzZE9iamVjdCA9IHhzZERlbGV0ZUxpc3QuZ2V0KDApOwotCQkJaWYgKHhzZE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSB7Ci0JCQkJbmV3U2VsZWN0aW9uID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgeHNkT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJCQl0b3BMZXZlbE9iamVjdCA9IGdldFRvcExldmVsWFNET2JqZWN0KChYU0RDb25jcmV0ZUNvbXBvbmVudCkgeHNkT2JqZWN0KTsKLQkJCX0KLQkJCQotCQkJRGVsZXRlSW50ZXJmYWNlQWN0aW9uIHhzZERlbGV0ZSA9IChEZWxldGVJbnRlcmZhY2VBY3Rpb24pIGdldFhTRERlbGV0ZSgpOwotCQkJeHNkRGVsZXRlLnNldERlbGV0ZUxpc3QoeHNkRGVsZXRlTGlzdCk7Ci0JCQl4c2REZWxldGUucnVuKCk7Ci0JCQkvLyBIYWNrIHRvIGZvcmNlIGEgcmVmcmVzaCBvZiBhbGwgY29tcG9uZW50cyBvZiB0aGUgR3JhcGggVmlldy4gIFRoaXMgaXMgbmVlZGVkCi0JCQkvLyBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgZGVsZXRlIGEgWFNEIEVsZW1lbnQgKFZpZXcgaW5wdXQgPT0gRGVmaW5pdGlvbikuICBUaGUgWFNECi0JCQkvLyBFbGVtZW50IEVkaXRQYXJ0IHZpc3VhbCB3b3VsZCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSB2aWV3LgotCQkJd3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkuc2V0UU5hbWUod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkuZ2V0UU5hbWUoKSk7Ci0JCX0KLQkJCX0KLQkJCWZpbmFsbHkKLQkJCXsKLQkJCSAgZW5kUmVjb3JkaW5nKCk7Ci0JCQl9Ci0JCQkvLyBNYWtlIG91ciBzZWxlY3Rpb24gYWZ0ZXIgb3VyIERlbGV0aW9ucwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcil3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLQkJICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotCQkgICAgewotCQkgICAgCWlmIChuZXdTZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICBuZXdTZWxlY3Rpb24gPSAoKFhTRFBhcnRpY2xlKSBuZXdTZWxlY3Rpb24pLmdldENvbnRhaW5lcigpOwotCSAgICAgICAgICAgIH0KLQkgICAgCQkKLQkJICAgIAlpZiAobmV3U2VsZWN0aW9uID09IG51bGwpIHsKLQkJICAgIAkJbmV3U2VsZWN0aW9uID0gZ2V0TmV3U2VsZWN0aW9uKCk7Ci0JCSAgICAJfQotCQkgICAgCWlmIChuZXdTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkgICAgCQkvLyBXZSBoYXZlIGEgbmV3U2VsZWN0aW9uLCBidXQgaXQgbWF5IGFsc28gYmUgZGVsZXRlZCBieSB0aGUgdXNlci4gIEluIHRoaXMgY2FzZSwgc2VsZWN0IHRoZSB0b3AgbGV2ZWwgb2JqZWN0Ci0JCSAgICAJCWlmIChsaXN0LmNvbnRhaW5zKG5ld1NlbGVjdGlvbikgJiYgdG9wTGV2ZWxPYmplY3QgIT0gbnVsbCkgewotCQkgICAgCQkJbmV3U2VsZWN0aW9uID0gdG9wTGV2ZWxPYmplY3Q7Ci0JCSAgICAJCX0KLQotCQkgICAgCQlzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKSk7Ci0JCSAgICAJfQotCQkgICAgfQotCQl9Ci0JfQotCQotCXB1YmxpYyBOb2RlIGdldE5vZGUoKQotCXsKLQkgIHJldHVybiByZWNvcmRpbmdOb2RlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLQl7Ci0JICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0WFNERGVsZXRlKCkgewotCQlXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uTUVOVV9BQ1RJT05fQ09OVFJJQlVUT1IpOwotCSAgICBPYmplY3QgeHNkRGVsZXRlID0gbnVsbDsKLQkgICAgCi0JICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkgICAgewotLy8JICAgIAl4c2REZWxldGUgPSBleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLlhTRF9ERUxFVEVfQUNUSU9OLCB3c2RsRWRpdG9yKTsKLQkgICAgCXhzZERlbGV0ZSA9IGV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uWFNEX0RFTEVURV9BQ1RJT04sIG51bGwpOwotCSAgICAJaWYgKHhzZERlbGV0ZSAhPSBudWxsKSB7Ci0JICAgIAkJYnJlYWs7Ci0JICAgIAl9Ci0JICAgIH0JICAgIAotCSAgICAKLQkgICAgcmV0dXJuIHhzZERlbGV0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0TmV3U2VsZWN0aW9uKCkgewotCQkvLyBIYWNrIHVzaW5nIHdzZGxlZGl0b3IuLi4uICBUaGlzIHNpdHVhdGlvbiBvY2N1cnMgd2hlbiB3ZSBkZWxldGUgdGhlIFNjaGVtYSBmcm9tIHRoZSBUeXBlcyBncm91cC4uLi4gIFdlCi0JCS8vIHVzdWFsbHkgZ2V0IHRoZSBjb250YWluZXIgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkLi4uIGhvd2V2ZXIsIGluIHRoaXMgc2l0dWF0aW9uLCB0aGUgY29udGFpbmVyIHdvdWxkCi0JCS8vIGJlIG51bGwgYmVjYXVzZSB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWQgaXMgYSBTY2hlbWEuLi4uLi4KLQkJT2JqZWN0IHNlbGVjdGlvbjsKLQkJdHJ5IHsKLQkJCXNlbGVjdGlvbiA9IHdzZGxFZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJc2VsZWN0aW9uID0gd3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZWxlY3Rpb24gPSB3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIFdTRExFbGVtZW50IGdldFRvcExldmVsV1NETE9iamVjdChXU0RMRWxlbWVudCBlbGVtZW50KSB7Ci0JCVdTRExFbGVtZW50IHRvcE9iamVjdCA9IChXU0RMRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQotCQl3aGlsZSAodG9wT2JqZWN0ICE9IG51bGwgJiYgISh0b3BPYmplY3QgaW5zdGFuY2VvZiBEZWZpbml0aW9uKSkgewotCQkJdG9wT2JqZWN0ID0gKFdTRExFbGVtZW50KSB0b3BPYmplY3QuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcmV0dXJuIHRvcE9iamVjdDsKLQl9Ci0JCi0JcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRUb3BMZXZlbFhTRE9iamVjdChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJWFNEQ29uY3JldGVDb21wb25lbnQgdG9wT2JqZWN0ID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotCQkKLQkJd2hpbGUgKHRvcE9iamVjdCAhPSBudWxsICYmICEodG9wT2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hKSkgewotCQkJdG9wT2JqZWN0ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSB0b3BPYmplY3QuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcmV0dXJuIHRvcE9iamVjdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzRiZTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5uc2VkaXQuRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSW5mb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRWRpdE5hbWVzcGFjZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotICBwdWJsaWMgRWRpdE5hbWVzcGFjZXNBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FRElUX05BTUVTUEFDRVMiKSk7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLSAgICAgIExpc3Qgb2xkTmFtZXNwYWNlSW5mb0xpc3QgPSBOYW1lc3BhY2VJbmZvLmNsb25lTmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCi0gICAgICAvLyBoZXJlIHdlIHN0b3JlIGEgY29weSBvZiB0aGUgb2xkIGluZm8gZm9yIGVhY2ggTmFtZXNwYWNlSW5mbwotICAgICAgLy8gdGhpcyBpbmZvIHdpbGwgYmUgdXNlZCBpbiBjcmVhdGVQcmVmaXhNYXBwaW5nKCkgdG8gZmlndXJlIG91dCBob3cgdG8gdXBkYXRlIHRoZSBkb2N1bWVudCAKLSAgICAgIC8vIGluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZXMKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotICAgICAgICBOYW1lc3BhY2VJbmZvIG9sZENvcHkgPSBuZXcgTmFtZXNwYWNlSW5mbyhpbmZvKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eSgib2xkQ29weSIsIG9sZENvcHkpOwotICAgICAgfQotCi0JICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gICAgICBFZGl0TmFtZXNwYWNlc0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdE5hbWVzcGFjZXNEaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCAgcGF0aCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRURJVF9OQU1FU1BBQ0VTX0RJQUxPR19USVRMRSIpLCBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gICAgICBpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICAgICAgaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgICB7ICAgICAgCQotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgZGlhbG9nLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCi0gICAgICAgIExpc3QgbmV3SW5mb0xpc3QgPSBkaWFsb2cuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLSAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLSAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhlbGVtZW50LCBuZXdJbmZvTGlzdCwgZmFsc2UpOwotCi0vKgotICAgICAgICAvLyBzZWUgaWYgd2UgbmVlZCB0byByZW5hbWUgYW55IHByZWZpeGVzCi0gICAgICAgIE1hcCBwcmVmaXhNYXBwaW5nID0gY3JlYXRlUHJlZml4TWFwcGluZyhvbGROYW1lc3BhY2VJbmZvTGlzdCwgbmFtZXNwYWNlSW5mb0xpc3QpOwotICAgICAgICBpZiAocHJlZml4TWFwcGluZy5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgLy9tYW5hZ2VyLmdldE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0gICAgICAgICAgUmVwbGFjZVByZWZpeEFjdGlvbiByZXBsYWNlUHJlZml4QWN0aW9uID0gbmV3IFJlcGxhY2VQcmVmaXhBY3Rpb24oZWxlbWVudCwgcHJlZml4TWFwcGluZyk7Ci0gICAgICAgICAgcmVwbGFjZVByZWZpeEFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAvL21hbmFnZXIuZ2V0TW9kZWwoKS5jaGFuZ2VkTW9kZWwoKTsKLSAgICAgICAgfQotKi8gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBNYXAgY3JlYXRlUHJlZml4TWFwcGluZyhMaXN0IG9sZExpc3QsIExpc3QgbmV3TGlzdCkKLSAgewotICAgIE1hcCBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBIYXNodGFibGUgb2xkVVJJVG9QcmVmaXhUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0gICAgICBvbGRVUklUb1ByZWZpeFRhYmxlLnB1dChvbGRJbmZvLnVyaSwgb2xkSW5mbyk7Ci0gICAgfQotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbmV3TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBuZXdJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotICAgICAgTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG9sZFVSSVRvUHJlZml4VGFibGUuZ2V0KG5ld0luZm8udXJpICE9IG51bGwgPyBuZXdJbmZvLnVyaSA6ICIiKTsKLQotICAgICAgLy8gaWYgb2xkSW5mbyBpcyBub24gbnVsbCAuLi4gdGhlcmUncyBhIG1hdGNoaW5nIFVSSSBpbiB0aGUgb2xkIHNldAotICAgICAgLy8gd2UgY2FuIHVzZSBpdHMgcHJlZml4IHRvIGRldGVtaW5lIG91dCBtYXBwaW5nCi0gICAgICAvLwotICAgICAgLy8gaWYgb2xkSW5mbyBpcyBudWxsIC4uLiAgd2UgdXNlIHRoZSAnb2xkQ29weScgd2Ugc3Rhc2hlZCBhd2F5IAotICAgICAgLy8gYXNzdW1pbmcgdGhhdCB0aGUgdXNlciBjaGFuZ2VkIHRoZSBVUkkgYW5kIHRoZSBwcmVmaXgKLSAgICAgIGlmIChvbGRJbmZvID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgbmV3SW5mby5nZXRQcm9wZXJ0eSgib2xkQ29weSIpOwotICAgICAgfQotCi0gICAgICBpZiAob2xkSW5mbyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gbmV3SW5mby5wcmVmaXggIT0gbnVsbCA/IG5ld0luZm8ucHJlZml4IDogIiI7Ci0gICAgICAgIFN0cmluZyBvbGRQcmVmaXggPSBvbGRJbmZvLnByZWZpeCAhPSBudWxsID8gb2xkSW5mby5wcmVmaXggOiAiIjsKLSAgICAgICAgaWYgKCFvbGRQcmVmaXguZXF1YWxzKG5ld1ByZWZpeCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXAucHV0KG9sZFByZWZpeCwgbmV3UHJlZml4KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0V4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDIwZGI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOyAgICAgICAgICAgICAgICAgICAgICAgIAotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU1lbnVBY3Rpb25Db250cmlidXRvcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJvdGVjdGVkIElNZW51QWN0aW9uQ29udHJpYnV0b3JbXSBtZW51QWN0aW9uQ29udHJpYnV0b3JzOyAgCi0KLSAgcHVibGljIEV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IoV1NETEVkaXRvciB3c2RsRWRpdG9yKQotICB7Ci0gICAgdGhpcy53c2RsRWRpdG9yID0gd3NkbEVkaXRvcjsgCi0KLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCi0gICAgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSByZWdpc3RyeS5nZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucyhXU0RMRWRpdG9yRXh0ZW5zaW9uLk1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SKTsKLSAgICBtZW51QWN0aW9uQ29udHJpYnV0b3JzID0gbmV3IElNZW51QWN0aW9uQ29udHJpYnV0b3JbZXh0ZW5zaW9ucy5sZW5ndGhdOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51QWN0aW9uQ29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIG1lbnVBY3Rpb25Db250cmlidXRvcnNbaV0gPSAoSU1lbnVBY3Rpb25Db250cmlidXRvcilleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SLCB3c2RsRWRpdG9yKTsKLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBjb250cmlidXRlTWVudUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIE5vZGUgbm9kZSwgT2JqZWN0IG9iamVjdCkKLSAgeyAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51QWN0aW9uQ29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKG1lbnVBY3Rpb25Db250cmlidXRvcnNbaV0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWVudUFjdGlvbkNvbnRyaWJ1dG9yc1tpXS5jb250cmlidXRlTWVudUFjdGlvbnMobWFuYWdlciwgbm9kZSwgb2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0lEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9JRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4Njk1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0lEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQlwdWJsaWMgdm9pZCBpbml0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zKElBY3Rpb25CYXJzIGJhcnMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUGFzdGVHbG9iYWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUGFzdGVHbG9iYWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyNDljNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1Bhc3RlR2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFBhc3RlR2xvYmFsQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvcjsKLQlwcml2YXRlIFdTRExFbGVtZW50IHNlbGVjdGlvbjsKLQlwcml2YXRlIE5vZGUgc2VsZWN0aW9uTm9kZTsKLQkKLQlwdWJsaWMgUGFzdGVHbG9iYWxBY3Rpb24oV1NETEVsZW1lbnQgc2VsZWN0aW9uLCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fUEFTVEUiKSk7ICAvLyBUcmFuc2xhdGUgVGhpcwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0JCXNlbGVjdGlvbk5vZGUgPSBzZWxlY3Rpb24uZ2V0RWxlbWVudCgpOwotCQlzZXRFbmFibGVkU3RhdGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgV1NETEVkaXRvcikgewotCQkJV1NETEVkaXRvciB3c2RsRWRpdG9yID0gKFdTRExFZGl0b3IpIGVkaXRvcjsKLQkJCUNvcHlXU0RMRWxlbWVudEFjdGlvbiBjb3B5QWN0aW9uID0gbmV3IENvcHlXU0RMRWxlbWVudEFjdGlvbih3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCksIHdzZGxFZGl0b3IuZ2V0Q2xpcGJvYXJkQ29udGVudHMoKSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25Ob2RlKTsKLQkJCWNvcHlBY3Rpb24ucnVuKCk7Ci0JCX0KLQl9Ci0JCi0gIAlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oV1NETEVsZW1lbnQgbmV3U2VsZWN0aW9uKSB7Ci0gIAkJc2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotICAJCXNldEVuYWJsZWRTdGF0ZSgpOwotICAJfQotICAJCi0gIAlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkU3RhdGUoKSB7Ci0gIAkJV1NETEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gIAkJaWYgKChwYXJlbnRFbGVtZW50ID0gc2hvd1Bhc3RlQWN0aW9uKChXU0RMRWxlbWVudCkgc2VsZWN0aW9uLCBlZGl0b3IpKSAhPSBudWxsKSB7Ci0gIAkJCXNlbGVjdGlvbiA9IHBhcmVudEVsZW1lbnQ7Ci0gIAkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0gIAkJfQotICAJCWVsc2UgewotICAJCQlzZXRFbmFibGVkKGZhbHNlKTsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCSBwcml2YXRlIFdTRExFbGVtZW50IHNob3dQYXN0ZUFjdGlvbihXU0RMRWxlbWVudCBlbGVtZW50LCBJRWRpdG9yUGFydCBlUGFydCkgewotICAJICAJV1NETEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gIAkgIAkKLSAgCSAgCWlmIChlUGFydCBpbnN0YW5jZW9mIFdTRExFZGl0b3IpIHsKLSAgCSAgCQlXU0RMRWxlbWVudCBjbGlwYm9hcmRFbGVtZW50ID0gKChXU0RMRWRpdG9yKSBlUGFydCkuZ2V0Q2xpcGJvYXJkQ29udGVudHMoKTsKLSAgCSAgCQkKLSAgCSAgCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0gIAkgIAkJCWlmIChjbGlwYm9hcmRFbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gIAkgIAkJCQlwYXJlbnRFbGVtZW50ID0gZWxlbWVudDsKLSAgCSAgCQkJfQotICAJICAJCX0KLSAgCSAgCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAJICAJCQlpZiAoY2xpcGJvYXJkRWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAJICAJCQkJcGFyZW50RWxlbWVudCA9IChXU0RMRWxlbWVudCkgKChPcGVyYXRpb24pIGVsZW1lbnQpLmVDb250YWluZXIoKTsKLSAgCSAgCQkJfQotICAJICAJCX0KLSAgCSAgCX0KLSAgCSAgCQotICAJICAJcmV0dXJuIHBhcmVudEVsZW1lbnQ7Ci0gIAkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwNDYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbG9hZERlcGVuZGVuY2llc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZQotewotCXByaXZhdGUgV1NETEVkaXRvciB3c2RsRWRpdG9yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpCi0JewotCQl3c2RsRWRpdG9yID0gKHRhcmdldEVkaXRvciBpbnN0YW5jZW9mIFdTRExFZGl0b3IpID8gKFdTRExFZGl0b3IpdGFyZ2V0RWRpdG9yIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0JewotCQlpZiAod3NkbEVkaXRvciAhPSBudWxsKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQl3c2RsRWRpdG9yLnJlbG9hZERlcGVuZGVuY2llcygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0Yjk5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsgCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvci5CaW5kaW5nUmVuYW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yLk1lc3NhZ2VSZW5hbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3IuUG9ydFR5cGVSZW5hbWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIFJlbmFtZUFjdGlvbiAvL2V4dGVuZHMgQmFzZU5vZGVBY3Rpb24gaW1wbGVtZW50cyBSdW5uYWJsZQotewotICBwcm90ZWN0ZWQgT2JqZWN0IG1vZGVsT2JqZWN0OyAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbmV3TmFtZTsKLSAgcHJvdGVjdGVkIE5vZGUgbm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgUmVuYW1lQWN0aW9uKE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIG5ld05hbWUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMubW9kZWxPYmplY3QgPSBtb2RlbE9iamVjdDsKLSAgICB0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotICAgIHRoaXMubm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChtb2RlbE9iamVjdCk7Ci0gIH0gICAgICAKLQotICAvKgotICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiBub2RlOwotICB9Ci0gICovCi0KLSAgLyoKLSAgcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9SRU5BTUUiKTsgIC8vJE5PTi1OTFMtMSQKLSAgfQotICAqLwotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pIAotICAgIHsKLSAgICAgIHJlbmFtZU9wZXJhdGlvbkhlbHBlcigoT3BlcmF0aW9uKW1vZGVsT2JqZWN0KTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIElucHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIHJlbmFtZUlPRkhlbHBlcigoV1NETEVsZW1lbnQpbW9kZWxPYmplY3QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVuYW1lTW9kZWxPYmplY3RIZWxwZXIobW9kZWxPYmplY3QsIG5ld05hbWUpOwotICAgIH0KLSAgfSAKLQotICBwcm90ZWN0ZWQgdm9pZCByZW5hbWVNb2RlbE9iamVjdEhlbHBlcihPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyB0aGVOZXdOYW1lKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsgCi0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIHRoZU5ld05hbWUpOwotICAgIH0gICAgCi0KLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlKQotICAgIHsKLSAgICAgIE1lc3NhZ2VSZW5hbWVyIHJlbmFtZXIgPSBuZXcgTWVzc2FnZVJlbmFtZXIoKE1lc3NhZ2UpbW9kZWxPYmplY3QsIHRoZU5ld05hbWUpOwotICAgICAgcmVuYW1lci52aXNpdEJpbmRpbmdzKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgUG9ydFR5cGUpCi0gICAgewotICAgICAgUG9ydFR5cGVSZW5hbWVyIHJlbmFtZXIgPSBuZXcgUG9ydFR5cGVSZW5hbWVyKChQb3J0VHlwZSltb2RlbE9iamVjdCwgdGhlTmV3TmFtZSk7Ci0gICAgICByZW5hbWVyLnZpc2l0QmluZGluZ3MoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nKQotICAgIHsKLSAgICAgIEJpbmRpbmdSZW5hbWVyIHJlbmFtZXIgPSBuZXcgQmluZGluZ1JlbmFtZXIoKEJpbmRpbmcpbW9kZWxPYmplY3QsIHRoZU5ld05hbWUpOwotICAgICAgcmVuYW1lci52aXNpdFNlcnZpY2VzKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVuYW1lT3BlcmF0aW9uSGVscGVyKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICAvLyBmaW5kIGJpbmRpbmcgb3BlcmF0aW9ucyB3aXRoIGEgbWF0Y2hpbmcgc2lnbmF0dXJlCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsgCi0gICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1dGlsLmdldEJpbmRpbmdPcGVyYXRpb25zKG9wZXJhdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbilpLm5leHQoKTsKLSAgICAgIHJlbmFtZU1vZGVsT2JqZWN0SGVscGVyKGJpbmRpbmdPcGVyYXRpb24sIG5ld05hbWUpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICByZW5hbWVNb2RlbE9iamVjdEhlbHBlcihvcGVyYXRpb24sIG5ld05hbWUpOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW5hbWVJT0ZIZWxwZXIoV1NETEVsZW1lbnQgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9iamVjdC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7IAotICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBudWxsOwotCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElucHV0KQotICAgIHsKLSAgICAgIGxpc3QgPSB1dGlsLmdldEJpbmRpbmdJbnB1dHMoKElucHV0KW9iamVjdCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE91dHB1dCkKLSAgICB7Ci0gICAgICBsaXN0ID0gdXRpbC5nZXRCaW5kaW5nT3V0cHV0cygoT3V0cHV0KW9iamVjdCk7Ci0gICAgfQotICAgIGVsc2UgLy8gZmF1bHQKLSAgICB7Ci0gICAgICBsaXN0ID0gdXRpbC5nZXRCaW5kaW5nRmF1bHRzKChGYXVsdClvYmplY3QpOwotICAgIH0KLSAgICAgIAotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgYmluZGluZ09iamVjdCA9IGkubmV4dCgpOwotICAgICAgICByZW5hbWVNb2RlbE9iamVjdEhlbHBlcihiaW5kaW5nT2JqZWN0LCBuZXdOYW1lKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotCi0gICAgcmVuYW1lTW9kZWxPYmplY3RIZWxwZXIob2JqZWN0LCBuZXdOYW1lKTsKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYzNWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy5JbnZva2VTZXREaWFsb2c7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsKLSAgT2JqZWN0IGlucHV0OwotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgcHJvdGVjdGVkIFN0cmluZyBraW5kOwotCi0gIHB1YmxpYyBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbigKLSAgICBTdHJpbmcgdGV4dCwKLSAgICBOb2RlIHBhcmVudE5vZGUsCi0gICAgU3RyaW5nIHByZWZpeCwKLSAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgIE9iamVjdCBpbnB1dCkKLSAgewotICAgIHN1cGVyKHRleHQsIHBhcmVudE5vZGUsIHByZWZpeCwgbG9jYWxOYW1lKTsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlS2luZChTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpCi0gIHsKLSAgICBJbnZva2VTZXREaWFsb2cgZGlhbG9nID0gbmV3IEludm9rZVNldERpYWxvZygpOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFBhcnQpCi0gICAgewotICAgICAgZGlhbG9nLnNldFJlZmVyZW5jZUtpbmQoa2luZCk7Ci0gICAgfQotICAgIGRpYWxvZy5ydW4oaW5wdXQsIGVkaXRvclBhcnQpOwotICAgIAotICAgIC8vIFdlIHNob3VsZG4ndCBrbm93IGFib3V0IHRoZSBlZGl0b3IgaW4gdGhpcyBjbGFzcwotICAgIFdTRExFZGl0b3IgZWRpdG9yID0gKFdTRExFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5wdXQpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXROZXdDb21wb25lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU2V0TmV3Q29tcG9uZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTYzNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXROZXdDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkTWVzc2FnZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuV1NETEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IuQmluZGluZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5DcmVhdGVXU0RMRWxlbWVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0cy5OZXdDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qCi0gKiBUT0RPOiBOZWVkIHRvIGNsZWFuIHVwIHRoaXMgY2xhc3MuLi4uIFdlIHByb2JhYmx5IGRvbid0IHVzZSBxdWl0ZSBhIGZldyBvZiB0aGVzZQotICogbWV0aG9kcy9pbnN0YW5jZSB2YXJpYWJsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXROZXdDb21wb25lbnRBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIE9iamVjdCBpbnB1dDsKLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2luZDsKLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZUtpbmQgPSAiY29tcGxleCI7ICAgICAgLy8gVE9ETzogUmVmYWN0b3IgY29kZSB0byBoYW5kbGUgdGhpcyBiZXR0ZXIKLQotICBwdWJsaWMgU2V0TmV3Q29tcG9uZW50QWN0aW9uKAotICAgIFN0cmluZyB0ZXh0LAotICAgIE5vZGUgcGFyZW50Tm9kZSwKLSAgICBTdHJpbmcgcHJlZml4LAotICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgT2JqZWN0IGlucHV0KQotICB7Ci0gICAgc3VwZXIodGV4dCwgcGFyZW50Tm9kZSwgcHJlZml4LCBsb2NhbE5hbWUpOwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VHlwZUtpbmQoU3RyaW5nIHR5cGVLaW5kKQotICB7Ci0gICAgICB0aGlzLnR5cGVLaW5kID0gdHlwZUtpbmQ7Ci0gIH0KLQotICAvLyBUT0RPOiBDbGVhbiB1cCBuZXh0IG1ldGhvZHMgYmVsb3chISEKLSAgcHJpdmF0ZSBXU0RMRWxlbWVudENvbW1hbmQgY29tbWFuZDsKLSAgcHJpdmF0ZSBTdHJpbmcgbmV3RGlhbG9nVGl0bGUgPSAiTmV3IENvbXBvbmVudCI7Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpCi0gIHsKLSAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgU3RyaW5nIGRlZmF1bHROYW1lID0gZ2V0RGVmYXVsdE5hbWUoKTsKLSAgICBOZXdDb21wb25lbnREaWFsb2cgZGlhbG9nID0gbmV3IE5ld0NvbXBvbmVudERpYWxvZyhzaGVsbCwgbmV3RGlhbG9nVGl0bGUsIGRlZmF1bHROYW1lLCBnZXRVc2VkTmFtZXMoKSk7Ci0KLSAgICBpbnQgZGlhbG9nQ29kZSA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgCi0gICAgaWYgKGRpYWxvZ0NvZGUgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFBvcnQpIHsKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoUG9ydCkgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gZGlhbG9nLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETzogV2Ugc2hvdWxkIGJlIHNtYXJ0ZXIgaW4gY2hvb3Npbmcgc29tZSBkZWZhdWx0IG9wdGlvbnMvc2V0dGluZ3MgZm9yIGdlbmVyYXRpbmcgYSBuZXcgQmluZGluZwotICAgICAgICAgICAgQmluZGluZ0dlbmVyYXRvciBiaW5kaW5nR2VuZXJhdG9yID0gbmV3IEJpbmRpbmdHZW5lcmF0b3IoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICBiaW5kaW5nR2VuZXJhdG9yLnNldE5hbWUobmV3TmFtZSk7Ci0gICAgICAgICAgICBiaW5kaW5nR2VuZXJhdG9yLnNldFByb3RvY29sKCJTT0FQIik7Ci0gICAgICAgICAgICBiaW5kaW5nR2VuZXJhdG9yLmdlbmVyYXRlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgaXRlbVByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgIGlmIChpdGVtUHJlZml4ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbVByZWZpeCA9ICIiOwotICAgICAgICAgIH0KLSAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IHdzZGxFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KChXU0RMRWxlbWVudCkgaW5wdXQpOwotICAgICAgICAgIHdzZGxFbGVtZW50LnNldEF0dHJpYnV0ZSgiYmluZGluZyIsIGl0ZW1QcmVmaXgubGVuZ3RoKCkgPT0gMCA/IG5ld05hbWUgOiBpdGVtUHJlZml4ICsgIjoiICsgbmV3TmFtZSk7ICAgICAKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoQmluZGluZykgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gZGlhbG9nLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBkZWZpbml0aW9uRWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgIC8vIFVzZSBBZGRNZXNzYWdlQWN0aW9uIGluIFdTRExNZW51QWN0aW9uQ29udHJpYnV0b3IKLSAgICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWRkUG9ydFR5cGVBY3Rpb24gPSBuZXcgQWRkRWxlbWVudEFjdGlvbigiIiwgImljb25zL21lc3NhZ2Vfb2JqLmdpZiIsIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJwb3J0VHlwZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICAgICAgYWRkUG9ydFR5cGVBY3Rpb24uc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gICAgICAgICAgICBhZGRQb3J0VHlwZUFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgbmV3TWVzc2FnZSA9IGFkZFBvcnRUeXBlQWN0aW9uLmdldE5ld0VsZW1lbnQoKTsKLSAgICAgICAgICAgIG5ld01lc3NhZ2Uuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmV3TmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIC8vIG5lZWQgdG8gZ2V0IHRoZSBwcmVmaXggZm9yIHRoZSBpdGVtCi0gICAgICAgICAgICAvLyBjb3VsZCBnZXQgbGlzdCBvZiB1cGRhdGVkIG1lc3NhZ2VzIGFuZCB0aGVuIHNlbGVjdCBidXQgY3VycmVudGx5IHdlIG9ubHkgaGF2ZSB0aGUgbG9jYWwgbmFtZQotICAgICAgICAgICAgU3RyaW5nIGl0ZW1QcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIGlmIChpdGVtUHJlZml4ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGl0ZW1QcmVmaXggPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlVmFsdWUgPSBpdGVtUHJlZml4Lmxlbmd0aCgpID09IDAgPyBuZXdOYW1lIDogaXRlbVByZWZpeCArICI6IiArIG5ld05hbWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgcG9ydFR5cGVWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCB3c2RsRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdCgoV1NETEVsZW1lbnQpIGlucHV0KTsKLSAgICAgICAgICAgICAgICB3c2RsRWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBwb3J0VHlwZVZhbHVlKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJbnB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIE91dHB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKE1lc3NhZ2VSZWZlcmVuY2UpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IGRpYWxvZy5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIEFkZE1lc3NhZ2VDb21tYW5kIGFjdGlvbiA9IG5ldyBBZGRNZXNzYWdlQ29tbWFuZChkZWZpbml0aW9uLCBuZXdOYW1lKTsKLSAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLSAgICAgICAgICAgIENyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuZ2V0UGFydEluZm8obWVzc2FnZSk7IAotICAgICAgICAgICAgQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlUGFydChtZXNzYWdlKTsKLQotICAgICAgICAgIC8vIG5lZWQgdG8gZ2V0IHRoZSBwcmVmaXggZm9yIHRoZSBpdGVtCi0gICAgICAgICAgLy8gY291bGQgZ2V0IGxpc3Qgb2YgdXBkYXRlZCBtZXNzYWdlcyBhbmQgdGhlbiBzZWxlY3QgYnV0IGN1cnJlbnRseSB3ZSBvbmx5IGhhdmUgdGhlIGxvY2FsIG5hbWUKLSAgICAgICAgICBTdHJpbmcgaXRlbVByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgIGlmIChpdGVtUHJlZml4ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbVByZWZpeCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgd3NkbEVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoKFdTRExFbGVtZW50KSBpbnB1dCk7Ci0gICAgICAgICAgd3NkbEVsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgaXRlbVByZWZpeC5sZW5ndGgoKSA9PSAwID8gbmV3TmFtZSA6IGl0ZW1QcmVmaXggKyAiOiIgKyBuZXdOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFBhcnQpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNpbmdQcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gZGlhbG9nLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGtpbmQuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVLaW5kLmVxdWFsc0lnbm9yZUNhc2UoImNvbXBsZXgiKSkgewotICAgICAgICAgICAgICAgICAgICAoKEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCkgY29tbWFuZCkuaXNDb21wbGV4VHlwZSh0cnVlKTsgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAoKEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCkgY29tbWFuZCkuaXNDb21wbGV4VHlwZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAoKEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCkgY29tbWFuZCkucnVuKG5ld05hbWUpOwotICAgICAgICAgICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwuc2V0Q29tcG9uZW50UmVmZXJlbmNlKChQYXJ0KSBpbnB1dCwgdHJ1ZSwgcmVmZXJlbmNpbmdQcmVmaXguZXF1YWxzKCIiKSA/IG5ld05hbWUgOiByZWZlcmVuY2luZ1ByZWZpeCArICI6IiArIG5ld05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoa2luZC5lcXVhbHNJZ25vcmVDYXNlKCJlbGVtZW50IikpIHsKLSAgICAgICAgICAgICAgICAoKEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQpIGNvbW1hbmQpLnJ1bihuZXdOYW1lKTsKLSAgICAgICAgICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZSgoUGFydCkgaW5wdXQsIGZhbHNlLCByZWZlcmVuY2luZ1ByZWZpeC5lcXVhbHMoIiIpID8gbmV3TmFtZSA6IHJlZmVyZW5jaW5nUHJlZml4ICsgIjoiICsgbmV3TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFdlIHNob3VsZG4ndCBrbm93IGFib3V0IHRoZSBlZGl0b3IgaW4gdGhpcyBjbGFzcwotICAgICAgV1NETEVkaXRvciBlZGl0b3IgPSAoV1NETEVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGlucHV0KSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0VXNlZE5hbWVzKCkgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUG9ydCkgewotICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoUG9ydCkgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICByZXR1cm4gTmFtZVV0aWwuZ2V0VXNlZEJpbmRpbmdOYW1lcyhkZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQmluZGluZykgewotICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoQmluZGluZykgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICByZXR1cm4gTmFtZVV0aWwuZ2V0VXNlZFBvcnRUeXBlTmFtZXMoZGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElucHV0IHx8IGlucHV0IGluc3RhbmNlb2YgT3V0cHV0IHx8IGlucHV0IGluc3RhbmNlb2YgRmF1bHQpIHsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKE1lc3NhZ2VSZWZlcmVuY2UpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgcmV0dXJuIE5hbWVVdGlsLmdldFVzZWRNZXNzYWdlTmFtZXMoZGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFBhcnQpIHsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFBhcnQpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgaWYgKGtpbmQuZXF1YWxzSWdub3JlQ2FzZSgiZWxlbWVudCIpKSB7Ci0gICAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZChkZWZpbml0aW9uLCAiTmV3RWxlbWVudCIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBwYXJlbnRTY2hlbWEgPSAoKEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQpIGNvbW1hbmQpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmV0dXJuIGdldFVzZWRFbGVtZW50TmFtZXMocGFyZW50U2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoa2luZC5lcXVhbHNJZ25vcmVDYXNlKCJ0eXBlIikpIHsKLSAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoZGVmaW5pdGlvbiwgIk5ld1R5cGUiKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBYU0RTY2hlbWEgcGFyZW50U2NoZW1hID0gKChBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQpIGNvbW1hbmQpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgTGlzdCB1c2VkTmFtZXM7Ci0gICAgICAgICAgICAgIGlmICh0eXBlS2luZC5lcXVhbHNJZ25vcmVDYXNlKCJjb21wbGV4IikpIHsKLSAgICAgICAgICAgICAgICAgIHVzZWROYW1lcyA9IGdldFVzZWRDb21wbGV4VHlwZU5hbWVzKHBhcmVudFNjaGVtYSk7ICAgIAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgdXNlZE5hbWVzID0gZ2V0VXNlZFNpbXBsZVR5cGVOYW1lcyhwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICByZXR1cm4gdXNlZE5hbWVzOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIChuZXcgQXJyYXlMaXN0KCkpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFBvcnQpIHsKLSAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9ICJOZXcgQmluZGluZyI7ICAgICAgIC8vIFRPRE86IFVnbHkgSGFjay4uLiByZW1vdmUKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZiA9ICgoUG9ydCkgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICByZXR1cm4gTmFtZVV0aWwuZ2V0VW5pcXVlTmFtZUhlbHBlcigiTmV3QmluZGluZyIsIE5hbWVVdGlsLmdldFVzZWRCaW5kaW5nTmFtZXMoZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsKLSAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9ICJOZXcgUG9ydCBUeXBlIjsgICAgICAgLy8gVE9ETzogVWdseSBIYWNrLi4uIHJlbW92ZQotICAgICAgICAgIERlZmluaXRpb24gZGVmID0gKChCaW5kaW5nKSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgICAgIHJldHVybiBOYW1lVXRpbC5nZXRVbmlxdWVOYW1lSGVscGVyKCJOZXdQb3J0VHlwZSIsIE5hbWVVdGlsLmdldFVzZWRQb3J0VHlwZU5hbWVzKGRlZikpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJbnB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIE91dHB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0gICAgICAgICAgbmV3RGlhbG9nVGl0bGUgPSAiTmV3IE1lc3NhZ2UiOyAgICAgICAvLyBUT0RPOiBVZ2x5IEhhY2suLi4gcmVtb3ZlCi0gICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSAoKE1lc3NhZ2VSZWZlcmVuY2UpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgcmV0dXJuIE5hbWVVdGlsLmdldFVuaXF1ZU5hbWVIZWxwZXIoIk5ld01lc3NhZ2UiLCBOYW1lVXRpbC5nZXRVc2VkTWVzc2FnZU5hbWVzKGRlZikpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSAoKFBhcnQpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGtpbmQuZXF1YWxzSWdub3JlQ2FzZSgiZWxlbWVudCIpKSB7Ci0gICAgICAgICAgICAgIG5ld0RpYWxvZ1RpdGxlID0gIk5ldyBFbGVtZW50IjsgICAgICAgLy8gVE9ETzogVWdseSBIYWNrLi4uIHJlbW92ZQotICAgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQoZGVmLCAiTmV3RWxlbWVudCIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBwYXJlbnRTY2hlbWEgPSAoKEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQpIGNvbW1hbmQpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgTGlzdCB1c2VkTmFtZXMgPSBnZXRVc2VkRWxlbWVudE5hbWVzKHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgIHJldHVybiBOYW1lVXRpbC5nZXRVbmlxdWVOYW1lSGVscGVyKCJOZXdFbGVtZW50IiwgdXNlZE5hbWVzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoa2luZC5lcXVhbHNJZ25vcmVDYXNlKCJ0eXBlIikpIHsKLSAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoZGVmLCAiTmV3VHlwZSIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBwYXJlbnRTY2hlbWEgPSAoKEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCkgY29tbWFuZCkuZ2V0U2NoZW1hKCk7Ci0KLSAgICAgICAgICAgICAgU3RyaW5nIG5ld0l0ZW1OYW1lID0gIk5ld0NvbXBsZXhUeXBlIjsKLSAgICAgICAgICAgICAgTGlzdCB1c2VkTmFtZXMgPSBudWxsOwotICAgICAgICAgICAgICBpZiAodHlwZUtpbmQuZXF1YWxzSWdub3JlQ2FzZSgiY29tcGxleCIpKSB7Ci0gICAgICAgICAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9ICJOZXcgQ29tcGxleCBUeXBlIjsgICAgICAgLy8gVE9ETzogVWdseSBIYWNrLi4uIHJlbW92ZQotICAgICAgICAgICAgICAgICAgdXNlZE5hbWVzID0gZ2V0VXNlZENvbXBsZXhUeXBlTmFtZXMocGFyZW50U2NoZW1hKTsgICAgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9ICJOZXcgU2ltcGxlIFR5cGUiOyAgICAgICAvLyBUT0RPOiBVZ2x5IEhhY2suLi4gcmVtb3ZlCi0gICAgICAgICAgICAgICAgICB1c2VkTmFtZXMgPSBnZXRVc2VkU2ltcGxlVHlwZU5hbWVzKHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICBuZXdJdGVtTmFtZSA9ICJOZXdTaW1wbGVUeXBlIjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmV0dXJuIG5ld0l0ZW1OYW1lID0gTmFtZVV0aWwuZ2V0VW5pcXVlTmFtZUhlbHBlcihuZXdJdGVtTmFtZSwgdXNlZE5hbWVzKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiAiTmV3Q29tcG9uZW50IjsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGdldFVzZWRTaW1wbGVUeXBlTmFtZXMoWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgTGlzdCBuYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIHR5cGVzSXQgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlICh0eXBlc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIHR5cGVzSXQubmV4dCgpOwotICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgbmFtZXNMaXN0LmFkZCh0eXBlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gbmFtZXNMaXN0OwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0VXNlZENvbXBsZXhUeXBlTmFtZXMoWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgTGlzdCBuYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIHR5cGVzSXQgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlICh0eXBlc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIHR5cGVzSXQubmV4dCgpOwotICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgIG5hbWVzTGlzdC5hZGQodHlwZS5nZXROYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIG5hbWVzTGlzdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGdldFVzZWRFbGVtZW50TmFtZXMoWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgTGlzdCBuYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIGVsZW1lbnRzSXQgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZWxlbWVudHNJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzSXQubmV4dCgpOwotICAgICAgICAgIG5hbWVzTGlzdC5hZGQoZWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gbmFtZXNMaXN0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TbWFydFJlbmFtZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TbWFydFJlbmFtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDM1ZmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU21hcnRSZW5hbWVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoKLSAqIFRoaXMgY2xhc3MgcmVuYW1lcyAncmVsYXRlZCcgV1NETEVsZW1lbnRzLiAgVGhlIHNjZW5hcmlvIGlzIGFzIGZvbGxvd3M6Ci0gKiBUaGUgdXNlciByZW5hbWVzIGEgV1NETEVsZW1lbnQgaW4gdGhlIGVkaXRvciwgc2F5IGEgTWVzc2FnZS4gIFRoaXMgY2xhc3MKLSAqIHdpbGwgZmluZCB0aGUgJ3JlbGF0ZWQnIGVsZW1lbnRzIHRvIHRoaXMgTWVzc2FnZSBhbmQgcmVuYW1lIHRoZW0gYXMgd2VsbC4KLSAqIEl0IHdpbGwgb25seSByZW5hbWUgYSAncmVsYXRlZCcgZWxlbWVudCBpZiB0aGUgZWxlbWVudCBuYW1lIChvciBwYXJ0IG9mIGl0KQotICogaXMgZ2VuZXJhdGVkLgotICogCi0gKiBTZWUgTmFtZVV0aWwuamF2YQotICovCi1wdWJsaWMgY2xhc3MgU21hcnRSZW5hbWVBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQlwcm90ZWN0ZWQgT2JqZWN0IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBuZXdOYW1lOwotCXByaXZhdGUgTGlzdCBtZXNzYWdlUmVmZXJlbmNlczsgLy8gVGhpcyB2YXJpYWJsZSBzaG91bGQgYmUgYWNjZXNzZWQgYnkgbWV0aG9kIGdldEFsbE1lc3NhZ2VSZWZlcmVuY2VzKCkKLQlwcm90ZWN0ZWQgTm9kZSBub2RlOyAgIAotCQotCXB1YmxpYyBTbWFydFJlbmFtZUFjdGlvbihPYmplY3QgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc2V0VGV4dCgiU21hcnQgUmVuYW1lIEFjdGlvbiIpOyAvLyBEbyBub3QgdHJhbnNsYXRlCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JICAgIHRoaXMubm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkgICByZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fUkVOQU1FIik7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlSZW5hbWVBY3Rpb24gcmVuYW1lcjsKLQkJU3RyaW5nIG9sZE5hbWU7Ci0JCQotCQliZWdpblJlY29yZGluZygpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotCQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGVsZW1lbnQ7Ci0JCQlvbGROYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLQotCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBSZW5hbWUgT3BlcmF0aW9uIAotCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24ob3BlcmF0aW9uLCBuZXdOYW1lKTsKLQkJCXJlbmFtZXIucnVuKCk7Ci0JCQkKLQkJCS8vIFJlbmFtZSBJbnB1dAotCQkJSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0JCQkvKgotCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaXNJbnB1dE91dHB1dE5hbWVHZW5lcmF0ZWQob2xkTmFtZSwgaW5wdXQuZ2V0TmFtZSgpKSkgewotCQkJCXJlbmFtZXIgPSBuZXcgUmVuYW1lQWN0aW9uKGlucHV0LCBuZXdOYW1lKTsKLQkJCQlyZW5hbWVyLnJ1bigpOwotCQkJfQotCQkJKi8KLQkJCQotCQkJLy8gUmVuYW1lIE91dHB1dAotCQkJT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0JCQkvKgotCQkJaWYgKG91dHB1dCAhPSBudWxsICYmIGlzSW5wdXRPdXRwdXROYW1lR2VuZXJhdGVkKG9sZE5hbWUsIG91dHB1dC5nZXROYW1lKCkpKSB7Ci0JCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24ob3V0cHV0LCBuZXdOYW1lKTsKLQkJCQlyZW5hbWVyLnJ1bigpOwotCQkJfQotCQkJKi8KLQkJCQotCQkJLy8gUmVuYW1lIE1lc3NhZ2VzIGFuZCBQYXJ0cwotCQkJTWVzc2FnZSBtc2c7Ci0KLQkJCS8vIElucHV0Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQltc2cgPSBpbnB1dC5nZXRFTWVzc2FnZSgpOwotCQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCi0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCW9sZE1lc3NhZ2VOYW1lID0gbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQkJCQotCQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb2xkTmFtZSwgIlJlcXVlc3QiKSkgewotCQkJCQkJcmVuYW1lTWVzc2FnZUhlbHBlcihtc2csIGNvbXB1dGVOZXdNZXNzYWdlTmFtZShtc2csIG9sZE5hbWUsIG5ld05hbWUpKTsKLQkJCQkJCQotCQkJCQkJaWYgKG1zZy5nZXRFUGFydHMoKSAhPSBudWxsKQotCQkJCQkJCXJlbmFtZVBhcnRzSGVscGVyKG1zZy5nZXRFUGFydHMoKSwgb2xkTWVzc2FnZU5hbWUsIG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCB0cnVlKTsJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIE91dHB1dAotCQkJaWYgKG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCW1zZyA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotCQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCQkJCQotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQkKLQkJCQkJaWYgKGlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob2xkTWVzc2FnZU5hbWUsIG9sZE5hbWUsICJSZXNwb25zZSIpKSB7Ci0JCQkJCQlyZW5hbWVNZXNzYWdlSGVscGVyKG1zZywgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKG1zZywgb2xkTmFtZSwgbmV3TmFtZSkpOwotCQkJCQkJCi0JCQkJCQlpZiAobXNnLmdldEVQYXJ0cygpICE9IG51bGwpCi0JCQkJCQkJcmVuYW1lUGFydHNIZWxwZXIobXNnLmdldEVQYXJ0cygpLCBvbGRNZXNzYWdlTmFtZSwgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHRydWUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gRmF1bHRzCi0JCQlMaXN0IGZhdWx0cyA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCk7Ci0JCQlpZiAoZmF1bHRzICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBpdCA9IGZhdWx0cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGl0Lm5leHQoKTsKLQkJCQkJbXNnID0gZmF1bHQuZ2V0RU1lc3NhZ2UoKTsKLQkJCQkJU3RyaW5nIG9sZE1lc3NhZ2VOYW1lID0gIiI7Ci0KLQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQkJCi0JCQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb2xkTmFtZSwgZmF1bHQuZ2V0TmFtZSgpKSkgewotCQkJCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBjb21wdXRlTmV3TWVzc2FnZU5hbWUobXNnLCBvbGROYW1lLCBuZXdOYW1lKSk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKG1zZy5nZXRFUGFydHMoKSAhPSBudWxsKQotCQkJCQkJCQlyZW5hbWVQYXJ0c0hlbHBlcihtc2cuZ2V0RVBhcnRzKCksIG9sZE1lc3NhZ2VOYW1lLCBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElucHV0KSB7Ci0JCQlJbnB1dCBpbnB1dCA9IChJbnB1dCkgZWxlbWVudDsKLQkJCW9sZE5hbWUgPSBpbnB1dC5nZXROYW1lKCk7Ci0JCQlpZiAob2xkTmFtZSA9PSBudWxsKSB7Ci0JCQkJb2xkTmFtZSA9ICIiOwotCQkJfQotCQkJCi0JCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWlucHV0LnNldE5hbWUobmV3TmFtZSk7Ci0KLS8vCQkJIFJlbmFtZSBNZXNzYWdlcyBhbmQgUGFydHMKLQkJCU1lc3NhZ2UgbXNnOwotCQkJCi0JCQkvLyBJbnB1dAotCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJbXNnID0gaW5wdXQuZ2V0RU1lc3NhZ2UoKTsKLQkJCQlTdHJpbmcgb2xkTWVzc2FnZU5hbWUgPSAiIjsKLQkJCQkKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJb2xkTWVzc2FnZU5hbWUgPSBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQkJCi0JCQkJCWlmIChpc01lc3NhZ2VOYW1lR2VuZXJhdGVkKG9sZE1lc3NhZ2VOYW1lLCBvbGROYW1lLCAiUmVxdWVzdCIpKSB7Ci0JCQkJCQlyZW5hbWVNZXNzYWdlSGVscGVyKG1zZywgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKG1zZywgb2xkTmFtZSwgbmV3TmFtZSkpOwotCQkJCQkJCi0JCQkJCQlpZiAobXNnLmdldEVQYXJ0cygpICE9IG51bGwpCi0JCQkJCQkJcmVuYW1lUGFydHNIZWxwZXIobXNnLmdldEVQYXJ0cygpLCBvbGRNZXNzYWdlTmFtZSwgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHRydWUpOwkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgT3V0cHV0KSB7Ci0JCQlPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCkgZWxlbWVudDsKLQkJCW9sZE5hbWUgPSBvdXRwdXQuZ2V0TmFtZSgpOwotCQkJaWYgKG9sZE5hbWUgPT0gbnVsbCkgewotCQkJCW9sZE5hbWUgPSAiIjsKLQkJCX0KLQkJCQotCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlvdXRwdXQuc2V0TmFtZShuZXdOYW1lKTsKLQotLy8JCQkgUmVuYW1lIE1lc3NhZ2VzIGFuZCBQYXJ0cwotCQkJTWVzc2FnZSBtc2c7Ci0JCQkKLQkJCS8vIE91dHB1dAotCQkJaWYgKG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCW1zZyA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotCQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb2xkTmFtZSwgIlJlc3BvbnNlIikpIHsKLQkJCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBjb21wdXRlTmV3TWVzc2FnZU5hbWUobXNnLCBvbGROYW1lLCBuZXdOYW1lKSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChtc2cuZ2V0RVBhcnRzKCkgIT0gbnVsbCkKLQkJCQkJCQlyZW5hbWVQYXJ0c0hlbHBlcihtc2cuZ2V0RVBhcnRzKCksIG9sZE1lc3NhZ2VOYW1lLCBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0JCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgZWxlbWVudDsKLQkJCU1lc3NhZ2UgbXNnID0gZmF1bHQuZ2V0RU1lc3NhZ2UoKTsKLQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCQkJb2xkTmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLQkJCQotCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBSZW5hbWUgdGhlIEZhdWx0Ci0JCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihmYXVsdCwgbmV3TmFtZSk7Ci0JCQlyZW5hbWVyLnJ1bigpOwotCi0JCQkvLyBSZW5hbWUgdGhlIE1lc3NhZ2UgYW5kIFBhcnRzCi0JCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQotCQkJCU9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIGZhdWx0LmVDb250YWluZXIoKTsKLQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb3AuZ2V0TmFtZSgpLCBvbGROYW1lKSkgewotCQkJCQlyZW5hbWVNZXNzYWdlSGVscGVyKG1zZywgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKG1zZywgb2xkTmFtZSwgbmV3TmFtZSkpOwotCQkJCQkKLQkJCQkJaWYgKG1zZy5nZXRFUGFydHMoKSAhPSBudWxsKQotCQkJCQkJcmVuYW1lRmF1bHRQYXJ0cyhtc2cuZ2V0RVBhcnRzKCksIG9wLmdldE5hbWUoKSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlKSB7Ci0JCQlNZXNzYWdlIG1zZyA9IChNZXNzYWdlKSBlbGVtZW50OwotCQkJb2xkTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJU3RyaW5nIG9sZE1lc3NhZ2VOYW1lID0gbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQkKLQkJCWlmIChvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJcmVuYW1lTWVzc2FnZUhlbHBlcihtc2csIGNvbXB1dGVOZXdNZXNzYWdlTmFtZShtc2csIG9sZE5hbWUsIG5ld05hbWUpKTsKLQkJCQkJCi0JCQlpZiAobXNnLmdldEVQYXJ0cygpICE9IG51bGwpCi0JCQkJcmVuYW1lUGFydHNIZWxwZXIobXNnLmdldEVQYXJ0cygpLCBvbGRNZXNzYWdlTmFtZSwgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0JCQlQYXJ0IHBhcnQgPSAoUGFydCkgZWxlbWVudDsKLQkJCVN0cmluZyBvbGRQYXJ0TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotCQkJCi0JCQlpZiAob2xkUGFydE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihlbGVtZW50LCBuZXdOYW1lKTsKLQkJCXJlbmFtZXIucnVuKCk7Ci0JCQkKLS8vCQkJUmVuYW1lIEVsZW1lbnRzCi0JCQlyZW5hbWVYU0RFbGVtZW50KHBhcnQsIG9sZFBhcnROYW1lLCBuZXdOYW1lKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUG9ydCkgewotCQkJUG9ydCBwb3J0ID0gKFBvcnQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgb2xkUG9ydE5hbWUgPSBwb3J0LmdldE5hbWUoKTsKLQkJCQotCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24oZWxlbWVudCwgbmV3TmFtZSk7Ci0JCQlyZW5hbWVyLnJ1bigpOwotCi0vLwkJCVJlbmFtZSBCaW5kaW5nCi0JCQlCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0JCQlpZiAoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMob2xkUG9ydE5hbWUpKSB7Ci0JCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24oYmluZGluZywgbmV3TmFtZSk7CQotCQkJCXJlbmFtZXIucnVuKCk7Ci0JCQl9Ci0JCX0KLQkJZW5kUmVjb3JkaW5nKCk7Ci0JfQotCQotCS8vIGJvb2xlYW4gaXNJbnB1dE91dHB1dCBzaG91bGQgYmUgc2V0IHRvIHRydWUgaWYgdGhlIHBhcnQgaXMgYW4gSW5wdXQgb3IgT3V0cHV0LgotCS8vIFNldCBmYWxzZSBpZiB0aGUgcGFydCBpcyBhIEZhdWx0LgotCXByaXZhdGUgdm9pZCByZW5hbWVQYXJ0c0hlbHBlcihMaXN0IHBhcnRzTGlzdCwgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZywgYm9vbGVhbiBpc0lucHV0T3V0cHV0KSB7Ci0JCVJlbmFtZUFjdGlvbiByZW5hbWVyOwotCQkKLQkJaWYgKHBhcnRzTGlzdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBwSXQgPSBwYXJ0c0xpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChwSXQuaGFzTmV4dCgpKSB7Ci0JCQkJUGFydCBwYXJ0ID0gKFBhcnQpIHBJdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9sZFBhcnROYW1lID0gcGFydC5nZXROYW1lKCk7Ci0JCQkJCi0JCQkJaWYgKGlzUGFydE5hbWVHZW5lcmF0ZWQob2xkUGFydE5hbWUsIG9sZFN1YlN0cmluZykpIHsKLQkJCQkJU3RyaW5nIG5ld1BhcnROYW1lOwotCQkJCQlpZiAoaXNJbnB1dE91dHB1dCkgewotCQkJCQkJbmV3UGFydE5hbWUgPSBjb21wdXRlTmV3UGFydE5hbWUocGFydCwgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbmV3UGFydE5hbWUgPSBjb21wdXRlTmV3RmF1bHRQYXJ0TmFtZShwYXJ0LCBvbGRTdWJTdHJpbmcsIG5ld1N1YlN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJlbmFtZXIgPSBuZXcgUmVuYW1lQWN0aW9uKHBhcnQsIG5ld1BhcnROYW1lKTsKLQkJCQkJcmVuYW1lci5ydW4oKTsKLQkJCQkJCi0JCQkJCS8vIFJlbmFtZSBFbGVtZW50cwotCQkJCQlyZW5hbWVYU0RFbGVtZW50KHBhcnQsIG9sZFBhcnROYW1lLCBuZXdQYXJ0TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBQYXJ0IG5hbWUgd2hlbiB0aGUgRmF1bHQgbmFtZSBpcyBjaGFuZ2VkLiAgT25seQotCS8vIGNoYW5nZSB0aGUgUGFydCBuYW1lIGlmIHRoZSBwYXJ0IG5hbWUgaXMgYSBnZW5lcmF0ZWQgbmFtZS4KLQkvLyBDb21wYXJlIHRvIHJlbmFtZVBhcnRzSGVscGVyKCkuICBUaGUgcmVuYW1lUGFydHNIZWxwZXIoKSBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBGYXVsdAotCS8vIGhhcyBOT1QgYmVlbiByZW5hbWVkLCByYXRoZXIsIGl0IGlzIHRyaWdnZXJlZCBieSBzb21lIG90aGVyIG5hbWluZyAoZXguIE9wZXJhdGlvbgotCS8vIHJlbmFtaW5nKS4gIEl0IHdpbGwgdXBkYXQgSW5wdXQvT3V0cHV0LCBBTkQgRmF1bHQgUGFydHMuCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZUZhdWx0UGFydHMoTGlzdCBwYXJ0c0xpc3QsIFN0cmluZyBiYXNlTmFtZSwgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZykgewotCQlSZW5hbWVBY3Rpb24gcmVuYW1lcjsKLQkJCi0JCWlmIChwYXJ0c0xpc3QgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgcEl0ID0gcGFydHNMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAocEl0Lmhhc05leHQoKSkgewotCQkJCVBhcnQgcGFydCA9IChQYXJ0KSBwSXQubmV4dCgpOwotCQkJCVN0cmluZyBvbGRQYXJ0TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotCQkJCQotCQkJCWlmIChpc1BhcnROYW1lR2VuZXJhdGVkKG9sZFBhcnROYW1lLCBiYXNlTmFtZSwgb2xkU3ViU3RyaW5nKSkgewotCQkJCQlTdHJpbmcgbmV3UGFydE5hbWU7Ci0JCQkJCW5ld1BhcnROYW1lID0gY29tcHV0ZU5ld0ZhdWx0UGFydE5hbWUocGFydCwgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcpOwotCQkJCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihwYXJ0LCBuZXdQYXJ0TmFtZSk7Ci0JCQkJCXJlbmFtZXIucnVuKCk7Ci0JCQkJCQotCQkJCQkvLyBSZW5hbWUgRWxlbWVudHMKLQkJCQkJcmVuYW1lWFNERWxlbWVudChwYXJ0LCBvbGRQYXJ0TmFtZSwgbmV3UGFydE5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBjb21wdXRlTmV3TWVzc2FnZU5hbWUoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgb2xkU3ViU3RyaW5nLCBTdHJpbmcgbmV3U3ViU3RyaW5nKSB7Ci0JCVN0cmluZyBzdHJpbmcgPSBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCXJldHVybiByZXBsYWNlU2VjdGlvbldpdGhTdWJTdHJpbmcoc3RyaW5nLCBvbGRTdWJTdHJpbmcsIG5ld1N1YlN0cmluZywgMCk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZU5ld0ZhdWx0TWVzc2FnZU5hbWUoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgb2xkU3ViU3RyaW5nLCBTdHJpbmcgbmV3U3ViU3RyaW5nKSB7Ci0JCVN0cmluZyBzdHJpbmcgPSBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCXJldHVybiByZXBsYWNlU2VjdGlvbldpdGhTdWJTdHJpbmcoc3RyaW5nLCBvbGRTdWJTdHJpbmcsIG5ld1N1YlN0cmluZywgMSk7CQkKLQl9Ci0JCi0JLy8gTWV0aG9kIGZvciBJbnB1dCwgT3V0cHV0LCBhbmQgRmF1bHQgUGFydHMKLQkvLyBTZWUgY29tcHV0ZU5ld0ZhdWx0UGFydE5hbWUoKSBmb3IgY29tcGFyaXNvbgotCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVOZXdQYXJ0TmFtZShQYXJ0IHBhcnQsIFN0cmluZyBvbGRTdWJTdHJpbmcsIFN0cmluZyBuZXdTdWJTdHJpbmcpIHsKLQkJU3RyaW5nIHN0cmluZyA9IHBhcnQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcmVwbGFjZVNlY3Rpb25XaXRoU3ViU3RyaW5nKHN0cmluZywgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcsIDApOwkJCi0JfQotCQotCS8vIE1ldGhvZCBmb3IgRmF1bHQgUGFydHMKLQkvLyBUaGlzIG1ldGhvZCBiZWhhdmVzIGluIHRoZSBleGFjdCBzYW1lIHdheSBhcyBjb21wdXRlTmV3UGFydE5hbWUoKSBleGNlcHQgaXQgc3RhcnRzIHNlYXJjaGluZyBmb3IgYSBtYXRjaAotCS8vIGFmdGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlcnMgd2hvIHdpc2ggdG8gcmVuYW1lIGEgZ2VuZXJhdGVkIChGYXVsdCkgcGFydAotCS8vIHdoZXJlIHRoZSBGYXVsdCBuYW1lIGhhcyBjaGFuZ2VkLiAgV2Ugc3RhcnQgb3VyIHNlYXJjaCBhZnRlciB0aGUgZmlyc3QgY2hhcmFjdGVyIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBuYW1lCi0JLy8gb2YgdGhlIHBhcnQgaXMgYnVpbHQgYnkgYXBwZW5kaW5nIHRoZSBGYXVsdCBuYW1lIGFmdGVyIHRoZSBPcGVyYXRpb24gbmFtZS4KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlTmV3RmF1bHRQYXJ0TmFtZShQYXJ0IHBhcnQsIFN0cmluZyBvbGRTdWJTdHJpbmcsIFN0cmluZyBuZXdTdWJTdHJpbmcpIHsKLQkJU3RyaW5nIHN0cmluZyA9IHBhcnQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcmVwbGFjZVNlY3Rpb25XaXRoU3ViU3RyaW5nKHN0cmluZywgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcsIDEpOwkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VTZWN0aW9uV2l0aFN1YlN0cmluZyhTdHJpbmcgZnVsbFN0cmluZywgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZywgaW50IHN0YXJ0U2VhcmNoSW5kZXgpIHsKLQkJU3RyaW5nQnVmZmVyIGZ1bGxTQiA9IG5ldyBTdHJpbmdCdWZmZXIoZnVsbFN0cmluZyk7Ci0JCWludCBpbmRleCA9IGZ1bGxTQi5pbmRleE9mKG9sZFN1YlN0cmluZywgc3RhcnRTZWFyY2hJbmRleCk7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQlyZXR1cm4gZnVsbFNCLnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgb2xkU3ViU3RyaW5nLmxlbmd0aCgpLCBuZXdTdWJTdHJpbmcpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXJldHVybiAiIjsKLQl9Ci0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21tb25OYW1lR2VuZXJhdG9yQ2hlY2soU3RyaW5nIHRhcmdldE5hbWUsIFN0cmluZyBiYXNlTmFtZSwgU3RyaW5nIGFwcGVuZE5hbWUpIHsKLQkJLy8gRmlyc3QgY3JpdGVyaWEgaXMgdGFyZ2V0TmFtZSBtdXN0IHN0YXJ0IHdpdGggdGhlIGJhc2VOYW1lCi0JCWlmICghdGFyZ2V0TmFtZS5zdGFydHNXaXRoKGJhc2VOYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlpZiAoYXBwZW5kTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBTZWNvbmQgY3JpdGVyaWEuICBUaGUgYXBwZW5kZWQgbmFtZSBtdXN0IGJlIGluIHRoZSB0YXJnZXROYW1lIGFuZCBiZWdpbiByaWdodAotCQkJLy8gYWZ0ZXIgdGhlIGJhc2VOYW1lIGxvY2F0aW9uCi0JCQlpZiAoIXRhcmdldE5hbWUuc3RhcnRzV2l0aChhcHBlbmROYW1lLCBiYXNlTmFtZS5sZW5ndGgoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQkKLQkJLy8gVGhpcmQgY3JpdGVyaWEgKGlmIG5lY2Vzc2FyeSkuICBJZiBiYXNlTmFtZSArIGFwcGVuZE5hbWUgaXMgc2hvcnRlciB0aGFuIHRhcmdldE5hbWUsCi0JCS8vIHRoZW4gdGhlcmUgbXVzdCBiZSAnZXh0cmEnIGNoYXJhY3RlcnMgYXQgdGhlIGVuZCBvZiB0YXJnZXROYW1lLiAgVGhlc2UgY2hhcmFjdGVycyBtdXN0Ci0JCS8vIG1ha2UgdXAgYW4gaW50ZWdlci4gIElmIG5vdCwgaXQgaXMgbm90IGEgZ2VuZXJhdGVkIHN0cmluZy4KLQkJaW50IHN1Ykxlbmd0aCA9IGJhc2VOYW1lLmxlbmd0aCgpICsgYXBwZW5kTmFtZS5sZW5ndGgoKTsKLQkJaWYgKHRhcmdldE5hbWUubGVuZ3RoKCkgPiBzdWJMZW5ndGgpIHsKLQkJCS8vIFdlIGhhdmUgJ2V4dHJhJyBjaGFyYWN0ZXJzCi0JCQlTdHJpbmcgZXh0cmFzID0gdGFyZ2V0TmFtZS5zdWJzdHJpbmcoc3ViTGVuZ3RoKTsKLQkJCQotCQkJaWYoIWlzRGlnaXQoZXh0cmFzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPcGVyYXRpb25OYW1lR2VuZXJhdGVkKFN0cmluZyBvcE5hbWUsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBvcE5hbWUuZXF1YWxzKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChTdHJpbmcgbXNnTmFtZSwgU3RyaW5nIGJhc2VOYW1lLCBTdHJpbmcgYXBwZW5kTmFtZSkgewotCQlyZXR1cm4gY29tbW9uTmFtZUdlbmVyYXRvckNoZWNrKG1zZ05hbWUsIGJhc2VOYW1lLCBhcHBlbmROYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5wdXRPdXRwdXROYW1lR2VuZXJhdGVkKFN0cmluZyBpbk91dE5hbWUsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBpbk91dE5hbWUuZXF1YWxzKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYXVsdE5hbWVHZW5lcmF0ZWQoU3RyaW5nIGZhdWx0TmFtZSwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZhdWx0TmFtZS5lcXVhbHMobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhcnROYW1lR2VuZXJhdGVkKFN0cmluZyBwYXJ0TmFtZSwgU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCXJldHVybiBjb21tb25OYW1lR2VuZXJhdG9yQ2hlY2socGFydE5hbWUsIGJhc2VOYW1lLCAiIik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcnROYW1lR2VuZXJhdGVkKFN0cmluZyBwYXJ0TmFtZSwgU3RyaW5nIGJhc2VOYW1lLCBTdHJpbmcgYXBwZW5kTmFtZSkgewotCQlyZXR1cm4gY29tbW9uTmFtZUdlbmVyYXRvckNoZWNrKHBhcnROYW1lLCBiYXNlTmFtZSwgYXBwZW5kTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWdpdChTdHJpbmcgc3RyaW5nKSB7Ci0JCWJvb2xlYW4gclZhbHVlID0gdHJ1ZTsKLQkJY2hhcltdIGNoYXJzID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGFycy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzRGlnaXQoY2hhcnNbaW5kZXhdKSkgewotCQkJCXJWYWx1ZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gclZhbHVlOwotCX0KLQkKLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhaWQgaW4gcmVuYW1pbmcgYSBtZXNzYWdlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZU1lc3NhZ2VIZWxwZXIoTWVzc2FnZSBtc2csIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUxpc3QgbWVzc2FnZVJlZnMgPSBnZXRSZWZlcmVuY2luZ01lc3NhZ2VSZWZlcmVuY2VzKG1zZywgZ2V0QWxsTWVzc2FnZVJlZmVyZW5jZXMoKSk7Ci0JCQotCQlSZW5hbWVBY3Rpb24gcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24obXNnLCBuZXdOYW1lKTsKLQkJcmVuYW1lci5ydW4oKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZVJlZnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlID0gKE1lc3NhZ2VSZWZlcmVuY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1lc3NhZ2VSZWZlcmVuY2Uuc2V0RU1lc3NhZ2UobXNnKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0UmVmZXJlbmNpbmdNZXNzYWdlUmVmZXJlbmNlcyhNZXNzYWdlIG1zZywgTGlzdCBtZXNzYWdlUmVmcykgewotCQlWZWN0b3IgcmVmZXJlbmNlc1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJUU5hbWUgbWVzc2FnZVFOYW1lID0gbXNnLmdldFFOYW1lKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZVJlZnMuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZmVyZW5jZSA9IChNZXNzYWdlUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWVzc2FnZVJlZmVyZW5jZS5nZXRFTWVzc2FnZSgpICE9IG51bGwgJiYgbWVzc2FnZVFOYW1lLmVxdWFscyhtZXNzYWdlUmVmZXJlbmNlLmdldEVNZXNzYWdlKCkuZ2V0UU5hbWUoKSkpIHsKLQkJCQlyZWZlcmVuY2VzVmVjdG9yLmFkZEVsZW1lbnQobWVzc2FnZVJlZmVyZW5jZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZWZlcmVuY2VzVmVjdG9yOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0QWxsTWVzc2FnZVJlZmVyZW5jZXMoKSB7Ci0JCWlmIChtZXNzYWdlUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlUmVmZXJlbmNlcyA9IG5ldyBWZWN0b3IoKTsKLQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpIGVsZW1lbnQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQkJCUxpc3QgcG9ydFR5cGVzID0gZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCk7Ci0JCQotCQkJaWYgKHBvcnRUeXBlcyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgcG9ydFR5cGVJdGVyYXRvciA9IHBvcnRUeXBlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChwb3J0VHlwZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlMaXN0IG9wZXJhdGlvbnNMaXN0ID0gKChQb3J0VHlwZSkgcG9ydFR5cGVJdGVyYXRvci5uZXh0KCkpLmdldEVPcGVyYXRpb25zKCk7Ci0JCQkJCQotCQkJCQlpZiAob3BlcmF0aW9uc0xpc3QgIT0gbnVsbCkgewotCQkJCQkJSXRlcmF0b3Igb3BlcmF0aW9uc0l0ZXJhdG9yID0gb3BlcmF0aW9uc0xpc3QuaXRlcmF0b3IoKTsKLQkJCQkJCXdoaWxlIChvcGVyYXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJbWVzc2FnZVJlZmVyZW5jZXMuYWRkQWxsKGdldEFsbE1lc3NhZ2VSZWZlcmVuY2VzKChPcGVyYXRpb24pIG9wZXJhdGlvbnNJdGVyYXRvci5uZXh0KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG1lc3NhZ2VSZWZlcmVuY2VzOwotCX0KLQkKLQlwcml2YXRlIFZlY3RvciBnZXRBbGxNZXNzYWdlUmVmZXJlbmNlcyhPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCVZlY3RvciBpb2ZzID0gbmV3IFZlY3RvcigpOwotCQlJdGVyYXRvciBpdCA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJaW9mcy5hZGRFbGVtZW50KGl0Lm5leHQoKSk7Ci0JCX0KLQkJCi0JCWlmIChpb2ZzID09IG51bGwpCi0JCQlpb2ZzID0gbmV3IFZlY3RvcigpOwotCQkKLQkJaWYgKG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsKQotCQkJaW9mcy5hZGRFbGVtZW50KG9wZXJhdGlvbi5nZXRFSW5wdXQoKSk7Ci0JCQotCQlpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKQotCQkJaW9mcy5hZGRFbGVtZW50KG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkpOwotCQkKLQkJcmV0dXJuIGlvZnM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW5hbWVYU0RFbGVtZW50KFBhcnQgcGFydCwgU3RyaW5nIG9sZFhTRE5hbWUsIFN0cmluZyBuZXdYU0ROYW1lKSB7Ci0JCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSBwYXJ0LmdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotCQlpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwgJiYgb2xkWFNETmFtZS5lcXVhbHMoZWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKSkpIHsKLQkJCXJlbmFtZUVsZW1lbnREZWNsYXJhdGlvbkhlbHBlcihlbGVtZW50RGVjbGFyYXRpb24sIG9sZFhTRE5hbWUsIG5ld1hTRE5hbWUpOwotCQkJCi0JCQkvLyBIZXJlIHdlIHJlbmFtZSB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JCQkvLwotCQkJUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUocGFydC5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBuZXdYU0ROYW1lKTsKLQkJCXBhcnQuc2V0RWxlbWVudE5hbWUocW5hbWUpOwkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW5hbWVFbGVtZW50RGVjbGFyYXRpb25IZWxwZXIoWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiwgU3RyaW5nIG9sZFhTRE5hbWUsIFN0cmluZyBuZXdYU0ROYW1lKSB7Ci0JCWlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCAmJiBlbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhvbGRYU0ROYW1lKSkgewotCQkJZWxlbWVudERlY2xhcmF0aW9uLnNldE5hbWUobmV3WFNETmFtZSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjIwMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Tb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLklFeHRlbmRlZENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETE11bHRpUGFnZUVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSUV4dGVuZGVkQ29udHJpYnV0b3IgewotCi0JcHJvdGVjdGVkIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIFdTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0IG11bHRpUGFnZUVkaXRvciA9IG51bGw7Ci0KLQkvLyBFZGl0b3JFeHRlbnNpb24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElFeHRlbmRlZENvbnRyaWJ1dG9yIGV4dGVuZGVkQ29udHJpYnV0b3I7Ci0KLQlwdWJsaWMgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBuZXcgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0KLQkJLy8gUmVhZCBhY3Rpb24gZXh0ZW5zaW9ucy4KLQkJRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyKCk7Ci0JCWV4dGVuZGVkQ29udHJpYnV0b3IgPSBidWlsZGVyLnJlYWRBY3Rpb25FeHRlbnNpb25zKEVESVRPUl9JRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmluaXQoYWN0aW9uQmFycyk7Ci0KLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKGFjdGlvbkJhcnMpOwotCQkJaW5pdFNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKGFjdGlvbkJhcnMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5pbml0KGFjdGlvbkJhcnMsIGdldFBhZ2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5pbml0KGFjdGlvbkJhcnMsIGdldFBhZ2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKQotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotCi0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKQotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQotCQlhZGRUb01lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElFeHRlbmRlZENvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29udHJpYnV0ZVRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0KLQkJYWRkVG9Qb3B1cE1lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvUG9wdXBNZW51KG1lbnUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlhZGRUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQotCQlhZGRUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElFeHRlbmRlZENvbnRyaWJ1dG9yI3VwZGF0ZVRvb2xiYXJBY3Rpb25zKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sYmFyQWN0aW9ucygpIHsKLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IudXBkYXRlVG9vbGJhckFjdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCS8vIHNhdmUgbXVsdGlQYWdlRWRpdG9yIGJlZm9yZSBjYWxsaW5nIHN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpCi0JCS8vIHN1cGVyLnNldEFjdGl2ZUVkaXRvciB3aWxsIGNhbGwgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpCi0JCS8vIG11bHRpUGFnZUVkaXRvciBpcyBuZWVkZWQgaW4gc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpCi0JCWlmICh0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBXU0RMTXVsdGlQYWdlRWRpdG9yUGFydCkKLQkJCW11bHRpUGFnZUVkaXRvciA9IChXU0RMTXVsdGlQYWdlRWRpdG9yUGFydCkgdGFyZ2V0RWRpdG9yOwotCi0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCi0JCXVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJLy8gVGhpcyBjb250cmlidXRvciBpcyBkZXNpZ25lZCBmb3IgU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0LgotCQkvLyBUbyBzYWZlLWd1YXJkIHRoaXMgZnJvbSBwcm9ibGVtcyBjYXVzZWQgYnkgdW5leHBlY3RlZCB1c2FnZSBieSBvdGhlciBlZGl0b3JzLCB0aGUgZm9sbG93aW5nCi0JCS8vIGNoZWNrIGlzIGFkZGVkLgotCQlpZiAobXVsdGlQYWdlRWRpdG9yICE9IG51bGwpIHsKLQkJCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCAmJiBhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikKLQkJCQlhY3RpdmF0ZVNvdXJjZVBhZ2UoYWN0aXZlRWRpdG9yKTsKLQkJCWVsc2UKLQkJCQlhY3RpdmF0ZURlc2lnblBhZ2UoYWN0aXZlRWRpdG9yKTsKLQkJfQotCi0JCXVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0KLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJLy8gdXBkYXRlIG1lbnUgYmFyIGFuZCB0b29sIGJhcgotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZURlc2lnblBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsICYmIGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJfQotCi0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsICYmIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQkvLyBpZiBkZXNpZ24gcGFnZSBpcyBub3QgcmVhbGx5IGFuIElFZGl0b3JQYXJ0LCBhY3RpdmVFZGl0b3IgPT0gbnVsbCwgc28gcGFzcyBpbiBtdWx0aVBhZ2VFZGl0b3IgaW5zdGVhZCAoZDI4MjQxNCkKLQkJCWlmIChhY3RpdmVFZGl0b3IgPT0gbnVsbCkgewotCQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihtdWx0aVBhZ2VFZGl0b3IpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQl9Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVTb3VyY2VQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCX0KLQotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Tb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyMmY0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yWE1MOwotCi0KLS8qKgotICogU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgZm9yIG11bHRpIHBhZ2UgZWRpdG9yJ3Mgc291cmNlIHBhZ2UgY29udHJpYnV0b3IuCi0gKgotICogVXNlIFdTRExFZGl0b3JBY3Rpb25Db250cmlidXRvciBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yCi0gKiAqLwotcHVibGljIGNsYXNzIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yWE1MIHsKLQotCXByaXZhdGUgSUFjdGlvbkJhcnMgZkJhcnM7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYWxsczoKLQkgKiA8dWw+Ci0JICogIDxsaT48Y29kZT5jb250cmlidXRlVG9NZW51PC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JyBtZW51IG1hbmFnZXI8L2xpPgotCSAqICA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvVG9vbEJhcjwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgdG9vbCBiYXIKLQkgKiAgICBtYW5hZ2VyPC9saT4KLQkgKiAgPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIHN0YXR1cyBsaW5lCi0JICogICAgbWFuYWdlcjwvbGk+Ci0JICogPC91bD4KLQkgKiBUaGUgZ2l2ZW4gYWN0aW9uIGJhcnMgYXJlIGFsc28gcmVtZW1iZXJlZCBhbmQgbWFkZSBhY2Nlc3NpYmxlIHZpYSAKLQkgKiA8Y29kZT5nZXRBY3Rpb25CYXJzPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFycyB0aGUgYWN0aW9uIGJhcnMKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMpIHsKLQkJZkJhcnMgPSBiYXJzOwotCQljb250cmlidXRlVG9NZW51KGJhcnMuZ2V0TWVudU1hbmFnZXIoKSk7Ci0JCWNvbnRyaWJ1dGVUb1Rvb2xCYXIoYmFycy5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQkJY29udHJpYnV0ZVRvU3RhdHVzTGluZShiYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBjb250cmlidXRvcidzIGFjdGlvbiBiYXJzLgotCSAqCi0JICogQHJldHVybiB0aGUgYWN0aW9uIGJhcnMKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKLQkJcmV0dXJuIGZCYXJzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyYTY0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExUZXh0RWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IKLXsKLSAgcHJvdGVjdGVkIFdTRExUZXh0RWRpdG9yIHRleHRFZGl0b3I7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBXU0RMQWN0aW9uQmFyQ29udHJpYnV0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikKLSAgewotICAgIHN1cGVyLnNldEFjdGl2ZVBhZ2UoYWN0aXZlRWRpdG9yKTsKLQotICAgIC8vIGFsd2F5cyBlbmFibGUgdW5kby9yZWRvIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggcGFnZSB3ZSdyZSBvbi4gIFRoZSB1bmRvL3JlZG8gY29tZXMgZnJvbSB0aGUgZWRpdG9yCi0gICAgLy8gICAgCi0gICAgdXBkYXRlQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuVU5ETywgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ETywgdHJ1ZSk7Ci0gICAgdXBkYXRlQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuUkVETywgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETywgdHJ1ZSk7Ci0KLSAgICAvLyB0dXJuIHRoZXNlIG9mZiBzbyB0aGF0IHRoZSBhY3Rpb25oYW5kbGVyIHdpbGwgaGFuZGxlIGl0IGZvciB1cwotICAgIC8vCi0gICAgLy91cGRhdGVBY3Rpb24oSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DVVQsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNVVCwgZmFsc2UpOwotICAgIC8vdXBkYXRlQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ09QWSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQ09QWSwgZmFsc2UpOwotICAgIC8vdXBkYXRlQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuUEFTVEUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlBBU1RFLCBmYWxzZSk7Ci0KLSAgICBnZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQWN0aW9uKFN0cmluZyBnbG9iYWxBY3Rpb25JZCwgU3RyaW5nIHRleHRFZGl0b3JBY3Rpb25JZCwgYm9vbGVhbiBlbmFibGUpCi0gIHsKLSAgICBnZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihnbG9iYWxBY3Rpb25JZCwgZW5hYmxlID8gZ2V0QWN0aW9uKHRleHRFZGl0b3IsIHRleHRFZGl0b3JBY3Rpb25JZCkgOiBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24gcmVnaXN0ZWQgd2l0aCB0aGUgZ2l2ZW4gdGV4dCBlZGl0b3IuCi0gICAqIEByZXR1cm4gSUFjdGlvbiBvciBudWxsIGlmIGVkaXRvciBpcyBudWxsLgotICAgKi8KLSAgcHJvdGVjdGVkIElBY3Rpb24gZ2V0QWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgU3RyaW5nIGFjdGlvbklEKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIChlZGl0b3IgPT0gbnVsbCA/IG51bGwgOiBlZGl0b3IuZ2V0QWN0aW9uKGFjdGlvbklEKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpCi0gIHsKLSAgICBzdXBlci5hZGRUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoIldTRExFZGl0b3IiKSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpCi0gIHsKLSAgICBzdXBlci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLSAgICB0ZXh0RWRpdG9yID0gbnVsbDsKLSAgICBpZiAoYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgV1NETEVkaXRvcikKLSAgICB7Ci0gICAgICB0ZXh0RWRpdG9yID0gKChXU0RMRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmdldFdTRExUZXh0RWRpdG9yKCk7Ci0gICAgfQotICAgIAotICAgIHVwZGF0ZUFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE8sIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIHRydWUpOwotICAgIHVwZGF0ZUFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlJFRE8sIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8sIHRydWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExEcmFnQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExEcmFnQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODNjMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRHJhZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5XU0RMVHJlZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETERyYWdBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbiB7Ci0JcHJvdGVjdGVkIFdTRExUcmVlTm9kZUVkaXRQYXJ0IG1vdmluZ0NoaWxkRWRpdFBhcnQ7Ci0JcHJvdGVjdGVkIFBvaW50IHBvaW50ZXJMb2NhdGlvbjsKLQkKLQkvKgotCSAqIFN1Yi1jbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXJ1bigpOwotCX0KLQkKLQkvKgotCSAqIFN1Yi1jbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICIiOwotCX0KLQkKLQkvKgotCSAqIFN1Yi1jbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBTdWItY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0RmVlZGJhY2tGaWd1cmUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETERyYWdSZW9yZGVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExEcmFnUmVvcmRlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFkOWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETERyYWdSZW9yZGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLldTRExEcmFnQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLldTRExDb21wb25lbnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLldTRExUcmVlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgV1NETERyYWdSZW9yZGVyQWN0aW9uIGV4dGVuZHMgV1NETERyYWdBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IG1vdmluZ0NoaWxkOwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgbmV3UGFyZW50OwotICBwcm90ZWN0ZWQgV1NETFRyZWVOb2RlRWRpdFBhcnQgbGVmdFNpYmxpbmdFZGl0UGFydDsKLSAgcHJvdGVjdGVkIFdTRExUcmVlTm9kZUVkaXRQYXJ0IHJpZ2h0U2libGluZ0VkaXRQYXJ0OwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgbGVmdFNpYkVsZW1lbnQ7Ci0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCByaWdodFNpYkVsZW1lbnQ7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNhbk5ldmVyRXhlY3V0ZSA9IGZhbHNlOwotICAKLSAgcHVibGljIFdTRExEcmFnUmVvcmRlckFjdGlvbihXU0RMVHJlZU5vZGVFZGl0UGFydCBtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBFZGl0UGFydCBwb2ludGVyRWRpdFBhcnQsIFBvaW50IHBvaW50ZXJMb2NhdGlvbikgewotICAJdGhpcy5tb3ZpbmdDaGlsZEVkaXRQYXJ0ID0gbW92aW5nQ2hpbGRFZGl0UGFydDsKLSAgCXRoaXMucG9pbnRlckxvY2F0aW9uID0gcG9pbnRlckxvY2F0aW9uOwotCi0JRWRpdFBhcnQgcG9zc2libGVQYXJlbnQgPSBnZXRQYXJlbnRFZGl0UGFydChwb2ludGVyRWRpdFBhcnQpOwotCQotCWlmICghKHBvc3NpYmxlUGFyZW50IGluc3RhbmNlb2YgV1NETFRyZWVOb2RlRWRpdFBhcnQpKSB7Ci0JCWNhbk5ldmVyRXhlY3V0ZSA9IHRydWU7Ci0JCXJldHVybjsKLQl9Ci0gIAkKLQlXU0RMVHJlZU5vZGVFZGl0UGFydCB0YXJnZXRQYXJlbnRFZGl0UGFydCA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgcG9zc2libGVQYXJlbnQ7Ci0Jd3NkbEVkaXRvciA9ICgoV1NETENvbXBvbmVudFZpZXdlcikgcG9zc2libGVQYXJlbnQuZ2V0Vmlld2VyKCkpLmdldFdTRExFZGl0b3IoKTsKLQkKLQlpZiAocG9pbnRlckVkaXRQYXJ0LmdldFBhcmVudCgpICE9IG51bGwpIHsKLQkJLy8gU29ydCB0aGUgc2libGluZ3MgKGFuZCBpdHNlbGYpCi0JCUxpc3QgdGFyZ2V0RWRpdFBhcnRTaWJsaW5ncyA9IHBvaW50ZXJFZGl0UGFydC5nZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRhcmdldEVkaXRQYXJ0U2libGluZ3MsIG5ldyBWZXJ0aWNhbEVkaXRQYXJ0Q29tcGFyYXRvcigpKTsKLSAgCi0JCS8vIEdldCAnbGVmdCcgYW5kICdyaWdodCcgc2libGluZ3MKLQkJbGVmdFNpYmxpbmdFZGl0UGFydCA9IGdldFZlcnRpY2FsTGVmdFNpYmxpbmcodGFyZ2V0RWRpdFBhcnRTaWJsaW5ncywgbW92aW5nQ2hpbGRFZGl0UGFydCwgcG9pbnRlckxvY2F0aW9uKTsKLQkJcmlnaHRTaWJsaW5nRWRpdFBhcnQgPSBnZXRWZXJ0aWNhbFJpZ2h0U2libGluZyh0YXJnZXRFZGl0UGFydFNpYmxpbmdzLCBtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBwb2ludGVyTG9jYXRpb24pOyAgICAgICAgICAgCQotCi0JCWlmIChtb3ZpbmdDaGlsZEVkaXRQYXJ0ICE9IG51bGwpCi0JCQltb3ZpbmdDaGlsZCA9IChXU0RMRWxlbWVudCkgbW92aW5nQ2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZiAobGVmdFNpYmxpbmdFZGl0UGFydCAhPSBudWxsKQotCQkJbGVmdFNpYkVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIGxlZnRTaWJsaW5nRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYgKHJpZ2h0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwpCi0JCQlyaWdodFNpYkVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIHJpZ2h0U2libGluZ0VkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQotCQluZXdQYXJlbnQgPSAoV1NETEVsZW1lbnQpIHRhcmdldFBhcmVudEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JfQotCWVsc2UgewotCQluZXdQYXJlbnQgPSAoV1NETEVsZW1lbnQpIHRhcmdldFBhcmVudEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWxlZnRTaWJFbGVtZW50ID0gbnVsbDsKLQkJcmlnaHRTaWJFbGVtZW50PSBudWxsOwotCX0KLSAgfQotICAgICAgICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotICAgIGlmIChjYW5OZXZlckV4ZWN1dGUgfHwgbmV3UGFyZW50ID09IG51bGwgfHwgbW92aW5nQ2hpbGQgPT0gbnVsbCkgewotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIElucHV0KSB7Ci0gICAgCWlmICghKGxlZnRTaWJFbGVtZW50IGluc3RhbmNlb2YgRmF1bHQpICYmIG5ld1BhcmVudC5lcXVhbHMobW92aW5nQ2hpbGQuZUNvbnRhaW5lcigpKSkgewotICAgIAkJcmVzdWx0ID0gdHJ1ZTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIGlmIChtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIE91dHB1dCkgewotICAgIAlpZiAoIShsZWZ0U2liRWxlbWVudCBpbnN0YW5jZW9mIEZhdWx0KSAmJiBuZXdQYXJlbnQuZXF1YWxzKG1vdmluZ0NoaWxkLmVDb250YWluZXIoKSkpIHsKLSAgICAJCXJlc3VsdCA9IHRydWU7Ci0gICAgCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAobW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gICAgCWlmIChuZXdQYXJlbnQgaW5zdGFuY2VvZiBNZXNzYWdlICYmIG5ld1BhcmVudC5lcXVhbHMobW92aW5nQ2hpbGQuZUNvbnRhaW5lcigpKSkgewotICAgIAkJcmVzdWx0ID0gdHJ1ZTsKLSAgICAJfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgIAotCi0KLSAgLyoKLSAgICogQHNlZSBJQWN0aW9uI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgYmVnaW5SZWNvcmRpbmcoKTsKLSAgCWlmIChjYW5FeGVjdXRlKCkpIHsKLSAgCQlpZiAobW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBJbnB1dCkgewotICAJCQlJbnB1dCBpbnB1dCA9IChJbnB1dCkgbW92aW5nQ2hpbGQ7Ci0gIAkJCU9wZXJhdGlvbkltcGwgb3BlcmF0aW9uID0gKE9wZXJhdGlvbkltcGwpIGlucHV0LmVDb250YWluZXIoKTsKLSAgCQkJCi0gIAkJCWlmIChsZWZ0U2libGluZ0VkaXRQYXJ0ID09IG51bGwpIHsKLSAgCQkJCS8vIElucHV0L091dHB1dCBzdHlsZQotICAJCQkJc2V0SW5wdXRPdXRwdXRPcmRlcihvcGVyYXRpb24sIHRydWUpOwotICAJCQl9Ci0gIAkJCWVsc2UgewotICAJCQkJLy8gT3V0cHV0L0lucHV0IHN0eWxlCi0gIAkJCQlzZXRJbnB1dE91dHB1dE9yZGVyKG9wZXJhdGlvbiwgZmFsc2UpOwotICAJCQl9Ci0gIAkJfQotICAJCWVsc2UgaWYgKG1vdmluZ0NoaWxkIGluc3RhbmNlb2YgT3V0cHV0KSB7Ci0gCQkJT3V0cHV0IG91dHB1dCA9IChPdXRwdXQpIG1vdmluZ0NoaWxkOwotICAJCQlPcGVyYXRpb25JbXBsIG9wZXJhdGlvbiA9IChPcGVyYXRpb25JbXBsKSBvdXRwdXQuZUNvbnRhaW5lcigpOwotICAJCQkKLSAgCQkJaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgPT0gbnVsbCkgewotICAJCQkJLy8gT3V0cHV0L0lucHV0IHN0eWxlCi0gIAkJCQlzZXRJbnB1dE91dHB1dE9yZGVyKG9wZXJhdGlvbiwgZmFsc2UpOwotICAJCQl9Ci0gIAkJCWVsc2UgewotICAJCQkJLy8gSW5wdXQvT3V0cHV0IHN0eWxlCi0gIAkJCQlzZXRJbnB1dE91dHB1dE9yZGVyKG9wZXJhdGlvbiwgdHJ1ZSk7Ci0gIAkJCX0KLSAgCQl9Ci0gIAkJZWxzZSBpZiAobW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gIAkJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBuZXdQYXJlbnQ7Ci0gIAkJCUxpc3QgcGFydHMgPSBtZXNzYWdlLmdldEVQYXJ0cygpOwotCi0gIAkJCXBhcnRzLnJlbW92ZShtb3ZpbmdDaGlsZCk7Ci0KLSAgCQkJaW50IGxlZnRJbmRleCA9IC0xLCByaWdodEluZGV4ID0gLTE7Ci0gIAkJCWlmIChsZWZ0U2liRWxlbWVudCAhPSBudWxsKSB7Ci0gIAkJCQlsZWZ0SW5kZXggPSBwYXJ0cy5pbmRleE9mKGxlZnRTaWJFbGVtZW50KTsKLSAgCQkJfQotICAJCQlpZiAocmlnaHRTaWJFbGVtZW50ICE9IG51bGwpIHsKLSAgCQkJCXJpZ2h0SW5kZXggPSBwYXJ0cy5pbmRleE9mKHJpZ2h0U2liRWxlbWVudCk7Ci0gIAkJCX0KLQotICAJCQlpZiAobGVmdEluZGV4ID09IC0xKSB7Ci0gIAkJCQkvLyBBZGQgbW92aW5nIGNoaWxkIHRvIHRoZSBmcm9udAotICAJCQkJcGFydHMuYWRkKDAsIG1vdmluZ0NoaWxkKTsgIAkJCQkKLSAgCQkJfQotICAJCQllbHNlIGlmIChyaWdodEluZGV4ID09IC0xKSB7Ci0gIAkJCQkvLyBBZGQgbW92aW5nIGNoaWxkIHRvIHRoZSBlbmQKLSAgCQkJCXBhcnRzLmFkZChtb3ZpbmdDaGlsZCk7Ci0gIAkJCX0KLSAgCQkJZWxzZSB7Ci0gIAkJCQkvLyBBZGQgbW92aW5nIGNoaWxkIGFmdGVyIHRoZSBvY2N1cmVuY2Ugb2YgdGhlIGxlZnQgc2libGluZwotICAJCQkJcGFydHMuYWRkKGxlZnRJbmRleCArIDEsIG1vdmluZ0NoaWxkKTsKLSAgCQkJfQotICAJCX0KLSAgCQl3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW92aW5nQ2hpbGQpKTsKLSAgCX0KLS8vICAgIGVuZFJlY29yZGluZygpOwotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRGZWVkYmFja0ZpZ3VyZSgpIHsKLSAgCUlGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBudWxsOwotICAgIGlmIChmZWVkYmFja0ZpZ3VyZSA9PSBudWxsICYmIG1vdmluZ0NoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBXU0RMVHJlZU5vZGVFZGl0UGFydCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBQb2x5bGluZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICBwb2x5TGluZS5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9EQVNIRE9UKTsgICAgICAKLSAgICAgICgoUG9seWxpbmUpZmVlZGJhY2tGaWd1cmUpLnNldExpbmVXaWR0aCgyKTsJCi0gICAgICBkcmF3TGluZXMoKFBvbHlsaW5lKSBmZWVkYmFja0ZpZ3VyZSk7Ci0gICAgfQotICAgIAotICAJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotICB9Ci0KLSAgLyogUmV0dXJuIGEgUG9pbnRMaXN0IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBhZGQgYSBmZWVkYmFjayBmaWd1cmUuICBUaGUgZmVlZGJhY2sgZmlndXJlIHdpbGwgYmUgYQotICAgKiBQb2x5bGluZSBjb21wb3NlZCBvZiB0aGUgUG9pbnRzIGluIHRoZSBQb2ludExpc3QKLSAgICovCi0gIHByaXZhdGUgUG9pbnRMaXN0IGRyYXdMaW5lcyhQb2x5bGluZSBwb2x5TGluZSkgewotICAgIFBvaW50TGlzdCBwb2ludExpc3QgPSBuZXcgUG9pbnRMaXN0KCk7IAotICAgIAotICAgIGlmIChsZWZ0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwpIHsKLSAgICAJUmVjdGFuZ2xlIGxlZnRSZWN0YW5nbGUgPSBsZWZ0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCSAgIAlpbnQgeENvb3JkID0gbGVmdFJlY3RhbmdsZS54ICsgMTU7Ci0JICAJaW50IHlDb29yZCA9IGxlZnRSZWN0YW5nbGUueTsKLQkgICAJaW50IGhlaWdodCA9IGxlZnRSZWN0YW5nbGUuaGVpZ2h0OwotCSAgIAlpbnQgd2lkdGggPSBsZWZ0UmVjdGFuZ2xlLndpZHRoIC0gMTU7Ci0KLQkgICAJLy8gRHJhdyBsZWZ0IGVuZCBsaW5lCi0JICAgCWFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCArIDMsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0IC0gMyk7Ci0JICAgCWFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCAtIDMsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0KTsKLQkgICAJCi0JICAgCS8vIERyYXcgaG9yaXpvbnRhbCBsaW5lCi0JICAgCWFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIGhlaWdodCk7Ci0JICAgCQotCSAgIAkvLyBEcmF3IHJpZ2h0IGVuZCBsaW5lCi0JICAgCWFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0LCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0IC0gMyk7Ci0JICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQgKyAzKTsgICAJCi0gICAgfQotICAgIGVsc2UgaWYgKHJpZ2h0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwpIHsKLSAgICAJUmVjdGFuZ2xlIHJpZ2h0UmVjdGFuZ2xlID0gcmlnaHRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgCWludCB4Q29vcmQgPSByaWdodFJlY3RhbmdsZS54ICsgMTU7Ci0gICAgCWludCB5Q29vcmQgPSByaWdodFJlY3RhbmdsZS55OwotICAgCQlpbnQgaGVpZ2h0ID0gcmlnaHRSZWN0YW5nbGUuaGVpZ2h0OwotICAgCQlpbnQgd2lkdGggPSByaWdodFJlY3RhbmdsZS53aWR0aCAtIDE1OwkKLQotICAgCQkvLyBEcmF3IGxlZnQgZW5kIGxpbmUKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgMywgeENvb3JkLCB5Q29vcmQgLSAzKTsKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkIC0gMywgeENvb3JkLCB5Q29vcmQpOwotCSAgIAkKLQkgICAJLy8gRHJhdyBob3Jpem9udGFsIGxpbmUKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkKTsKLQkgICAJCi0JICAgCS8vIERyYXcgcmlnaHQgZW5kIGxpbmUKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgLSAzKTsKLQkgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkICsgd2lkdGgsIHlDb29yZCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIDMpOyAgIAotICAgIH0KLQotICAgIHJldHVybiBwb2ludExpc3Q7Ci0gIH0gICAgICAgICAgICAgICAgICAgIAotICAKLSAgcHJvdGVjdGVkIFBvbHlsaW5lIGFkZExpbmVUb1BvbHlsaW5lKFBvbHlsaW5lIHBvbHlsaW5lLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQlwb2x5bGluZS5hZGRQb2ludChuZXcgUG9pbnQoeDEsIHkxKSk7Ci0JcG9seWxpbmUuYWRkUG9pbnQobmV3IFBvaW50KHgyLCB5MikpOwotCi0JcmV0dXJuIHBvbHlsaW5lOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotICAvKgotICAgKiBQcmUtY29uZGl0aW9uOiBUaGUgTGlzdCBzaWJsaW5ncyBzaG91bGQgYmUgc29ydGVkIGJ5IGl0J3MgeS1jb29yZGluYXRlIAotICAgKi8KLSAgcHJpdmF0ZSBXU0RMVHJlZU5vZGVFZGl0UGFydCBnZXRWZXJ0aWNhbFJpZ2h0U2libGluZyhMaXN0IHNpYmxpbmdzLCBXU0RMVHJlZU5vZGVFZGl0UGFydCBtb3ZpbmdFZGl0UGFydCwgUG9pbnQgcG9pbnRlckxvY2F0aW9uKSB7Ci0gIAlXU0RMVHJlZU5vZGVFZGl0UGFydCByaWdodFNpYmxpbmcgPSBudWxsOwotICAJaW50IHBvaW50ZXJZTG9jYXRpb24gPSBwb2ludGVyTG9jYXRpb24ueTsKLQotICAJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpYmxpbmdzLnNpemUoKTsgaW5kZXgrKykgewotICAJCVdTRExUcmVlTm9kZUVkaXRQYXJ0IHNpYmxpbmcgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCk7Ci0gIAkJaW50IHNpYmxpbmdZTG9jYXRpb24gPSBzaWJsaW5nLmdldFNlbGVjdGlvbkZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpLnk7Ci0KLSAgCQlpZiAoc2libGluZ1lMb2NhdGlvbiA+IHBvaW50ZXJZTG9jYXRpb24pIHsKLSAgCQkJcmlnaHRTaWJsaW5nID0gc2libGluZzsKLSAgCQkJYnJlYWs7Ci0gIAkJfQotICAJfQotICAJCi0gIAlyZXR1cm4gcmlnaHRTaWJsaW5nOwotICB9Ci0KLSAgLyoKLSAgICogUHJlLWNvbmRpdGlvbjogVGhlIExpc3Qgc2libGluZ3Mgc2hvdWxkIGJlIHNvcnRlZCBieSBpdCdzIHktY29vcmRpbmF0ZSAKLSAgICovCi0gIHByaXZhdGUgV1NETFRyZWVOb2RlRWRpdFBhcnQgZ2V0VmVydGljYWxMZWZ0U2libGluZyhMaXN0IHNpYmxpbmdzLCBXU0RMVHJlZU5vZGVFZGl0UGFydCBtb3ZpbmdFZGl0UGFydCwgUG9pbnQgcG9pbnRlckxvY2F0aW9uKSB7Ci0gIAlXU0RMVHJlZU5vZGVFZGl0UGFydCBsZWZ0U2libGluZyA9IG51bGw7Ci0gIAlpbnQgcG9pbnRlcllMb2NhdGlvbiA9IHBvaW50ZXJMb2NhdGlvbi55OwotCi0gIAlpbnQgaW5kZXg7Ci0gIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzaWJsaW5ncy5zaXplKCk7IGluZGV4KyspIHsKLSAgCQlXU0RMVHJlZU5vZGVFZGl0UGFydCBzaWJsaW5nID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXgpOwotICAJCWludCBzaWJsaW5nWUxvY2F0aW9uID0gc2libGluZy5nZXRTZWxlY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS55OwotICAJICAJCi0gIAkJaWYgKHNpYmxpbmdZTG9jYXRpb24gPiBwb2ludGVyWUxvY2F0aW9uKSB7Ci0gIAkJCWlmIChpbmRleCA+IDApIHsKLSAgCQkJCWxlZnRTaWJsaW5nID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXggLSAxKTsKLSAgCQkJfQotCi0gIAkJCWJyZWFrOwotICAJCX0KLSAgCX0KLQotICAJaWYgKGluZGV4ID09IHNpYmxpbmdzLnNpemUoKSkgewotICAJCWxlZnRTaWJsaW5nID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXggLSAxKTsKLSAgCX0KLQotICAJcmV0dXJuIGxlZnRTaWJsaW5nOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZ2V0UGFyZW50RWRpdFBhcnQoRWRpdFBhcnQgdGFyZ2V0KQotICB7Ci0gIAlyZXR1cm4gdGFyZ2V0LmdldFBhcmVudCgpOwotICB9Ci0gIAotICAvLyBib29sZWFuIGlucHV0Rmlyc3QgPSB0cnVlIGlmIHRoZSBJbnB1dCBpcyB0aGUgZmlyc3QgaW4gdGhlIG9yZGVyIG9mIElucHV0IGFuZCBPdXRwdXQKLSAgcHJpdmF0ZSB2b2lkIHNldElucHV0T3V0cHV0T3JkZXIoT3BlcmF0aW9uSW1wbCBvcGVyYXRpb24sIGJvb2xlYW4gaW5wdXRGaXJzdCkgewotICAJLy8gV2UgbmVlZCB0byBkZXRlcm1pbmUgbW9yZSBpbmZvIGJlZm9yZSB3ZSBjYW4gc2V0IHRoZSBzdHlsZQkKLSAgCWlmIChpbnB1dEZpcnN0ICYmIG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsKSB7Ci0gIAkJLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW4gT3V0cHV0Ci0gIAkJaWYgKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkgIT0gbnVsbCkgewotICAJCQkvLyBPcmRlciBpczogSW5wdXQsIE91dHB1dAotLyogIAkJCQotICAJCQlOb2RlIG9wZXJhdGlvbk5vZGUgPSBvcGVyYXRpb24uZ2V0RWxlbWVudCgpOwkJCi0gIAkJCU5vZGVMaXN0IGNoaWxkTm9kZUxpc3QgPSBvcGVyYXRpb25Ob2RlLmdldENoaWxkTm9kZXMoKTsKLSAgCQkJCi0gIAkJCU5vZGUgaW5wdXROb2RlID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpLmdldEVsZW1lbnQoKTsKLSAgCQkJTm9kZSBvdXRwdXROb2RlID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKS5nZXRFbGVtZW50KCk7Ci0gIAkJCQotICAJCQlOb2RlIGlucHV0VGV4dE5vZGUgPSBpbnB1dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgCQkJTm9kZSBvdXRwdXRUZXh0Tm9kZSA9IG91dHB1dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgCQkJCi0gIAkJCWludCBpbnB1dE5vZGVJbmRleCA9IGdldE5vZGVJbmRleChjaGlsZE5vZGVMaXN0LCBpbnB1dE5vZGUpOwotICAJCQlpbnQgb3V0cHV0Tm9kZUluZGV4ID0gZ2V0Tm9kZUluZGV4KGNoaWxkTm9kZUxpc3QsIG91dHB1dE5vZGUpOwotICAJCQkKLSAgCQkJaWYgKGlucHV0Tm9kZUluZGV4ID4gb3V0cHV0Tm9kZUluZGV4KSB7Ci0gIAkJCQkvLyBXZSBuZWVkIHRvIHN3YXAgSW5wdXQgYW5kIE91dHB1dAotICAJCQkJb3BlcmF0aW9uTm9kZS5yZW1vdmVDaGlsZChpbnB1dE5vZGUpOwotICAJCQkJb3BlcmF0aW9uTm9kZS5yZW1vdmVDaGlsZChvdXRwdXROb2RlKTsKLSAgCQkJCQotICAJCQkJb3BlcmF0aW9uTm9kZS5pbnNlcnRCZWZvcmUoaW5wdXROb2RlLCBvdXRwdXRUZXh0Tm9kZSk7Ci0gIAkJCQlvcGVyYXRpb25Ob2RlLmluc2VydEJlZm9yZShvdXRwdXROb2RlLCBpbnB1dFRleHROb2RlKTsKLSAgCQkJfQotKi8gIAkJCQotICAJCQkKLSAgCQkJc2V0T3BlcmF0aW9uU3R5bGUob3BlcmF0aW9uLCBPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpOwotICAJCX0KLSAgCQkvKgotICAJCWVsc2UgewotICAJCQkvLyBPcmRlciBpczogSW5wdXQKLSAgCQkJc2V0T3BlcmF0aW9uU3R5bGUob3BlcmF0aW9uLCBPcGVyYXRpb25UeXBlLk9ORV9XQVkpOwotICAJCX0KLSAgCQkqLwotICAJfQotICAJZWxzZSBpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKSB7Ci0gIAkJLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW4gSW5wdXQKLSAgCQlpZiAob3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLSAgCQkJLy8gT3JkZXIgaXM6IE91dHB1dCwgSW5wdXQKLS8qICAJCQkKLSAgCQkJTm9kZSBvcGVyYXRpb25Ob2RlID0gb3BlcmF0aW9uLmdldEVsZW1lbnQoKTsJCQotICAJCQlOb2RlTGlzdCBjaGlsZE5vZGVMaXN0ID0gb3BlcmF0aW9uTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gIAkJCQotICAJCQlOb2RlIGlucHV0Tm9kZSA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKS5nZXRFbGVtZW50KCk7Ci0gIAkJCU5vZGUgb3V0cHV0Tm9kZSA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkuZ2V0RWxlbWVudCgpOwotICAJCQkKLSAgCQkJTm9kZSBpbnB1dFRleHROb2RlID0gaW5wdXROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gIAkJCU5vZGUgb3V0cHV0VGV4dE5vZGUgPSBvdXRwdXROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gIAkJCQotICAJCQlpbnQgaW5wdXROb2RlSW5kZXggPSBnZXROb2RlSW5kZXgoY2hpbGROb2RlTGlzdCwgaW5wdXROb2RlKTsKLSAgCQkJaW50IG91dHB1dE5vZGVJbmRleCA9IGdldE5vZGVJbmRleChjaGlsZE5vZGVMaXN0LCBvdXRwdXROb2RlKTsKLSAgCQkJCi0gIAkJCWlmIChvdXRwdXROb2RlSW5kZXggPiBpbnB1dE5vZGVJbmRleCkgewotICAJCQkJLy8gV2UgbmVlZCB0byBzd2FwIElucHV0IGFuZCBPdXRwdXQKLSAgCQkJCW9wZXJhdGlvbk5vZGUucmVtb3ZlQ2hpbGQoaW5wdXROb2RlKTsKLSAgCQkJCW9wZXJhdGlvbk5vZGUucmVtb3ZlQ2hpbGQob3V0cHV0Tm9kZSk7Ci0KLSAgCQkJCW9wZXJhdGlvbk5vZGUuaW5zZXJ0QmVmb3JlKGlucHV0Tm9kZSwgb3V0cHV0VGV4dE5vZGUpOwotICAJCQkJb3BlcmF0aW9uTm9kZS5pbnNlcnRCZWZvcmUob3V0cHV0Tm9kZSwgaW5wdXRUZXh0Tm9kZSk7Ci0gIAkJCX0KLSovICAJCQkKLSAgCQkJc2V0T3BlcmF0aW9uU3R5bGUob3BlcmF0aW9uLCBPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpOwotICAJCX0KLSAgCQkvKgotICAJCWVsc2UgewotICAJCQkvLyBPcmRlciBpczogT3V0cHV0Ci0gIAkJCXNldE9wZXJhdGlvblN0eWxlKG9wZXJhdGlvbiwgT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04pOwotICAJCX0KLSAgCQkqLwotICAJfQotICB9Ci0KLS8qCi0gKiByZXR1cm4gLTEgaWYgbm9kZSBpcyBub3QgZm91bmQgaW4gdGhlIGdpdmVuIG5vZGVMaXN0Ci0gKi8KLQlwcml2YXRlIGludCBnZXROb2RlSW5kZXgoTm9kZUxpc3Qgbm9kZUxpc3QsIE5vZGUgbm9kZSkgewotCQlpbnQgaW5kZXggPSAwOwotCQl3aGlsZSAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSAmJiAhKG5vZGVMaXN0Lml0ZW0oaW5kZXgpLmVxdWFscyhub2RlKSkpIHsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJCi0JCWlmIChpbmRleCA+PSBub2RlTGlzdC5nZXRMZW5ndGgoKSkgewotCQkJaW5kZXggPSAtMTsKLQkJfQotCQkKLQkJcmV0dXJuIGluZGV4OwotCX0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXRPcGVyYXRpb25TdHlsZShPcGVyYXRpb25JbXBsIG9wZXJhdGlvbiwgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlKSB7Ci0gIAkvLyBJZiB0aGVyZSBpcyBubyBzdHlsZSB0byBiZWdpbiB3aXRoLCBkb24ndCBzZXQgb25lIG5vdwotICAJaWYgKG9wZXJhdGlvbi5nZXRTdHlsZSgpID09IG51bGwpIHsKLSAgCQlyZXR1cm47Ci0gIAl9Ci0gIAkKLSAgCW9wZXJhdGlvbi5zZXRTdHlsZShvcGVyYXRpb25UeXBlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBWZXJ0aWNhbEVkaXRQYXJ0Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotICAJCi0gIAlwdWJsaWMgVmVydGljYWxFZGl0UGFydENvbXBhcmF0b3IoKSB7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgcGFydDEsIE9iamVjdCBwYXJ0MikgewotICAJCWludCBjb21wYXJlVmFsdWUgPSAwOwotCi0gIAkJaWYgKHBhcnQxIGluc3RhbmNlb2YgV1NETFRyZWVOb2RlRWRpdFBhcnQgJiYgcGFydDIgaW5zdGFuY2VvZiBXU0RMVHJlZU5vZGVFZGl0UGFydCkgewotICAJCQlXU0RMVHJlZU5vZGVFZGl0UGFydCBlZGl0UGFydDEgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIHBhcnQxOwotICAJCQlXU0RMVHJlZU5vZGVFZGl0UGFydCBlZGl0UGFydDIgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIHBhcnQyOwotICAJCQkKLSAgCQkJaW50IGVkaXRQYXJ0MVkgPSBlZGl0UGFydDEuZ2V0U2VsZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkueTsKLSAgCQkJaW50IGVkaXRQYXJ0MlkgPSBlZGl0UGFydDIuZ2V0U2VsZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkueTsKLSAgCQkJCi0gIAkJCUludGVnZXIgaW50ZWdlclBhcnQxID0gbmV3IEludGVnZXIoZWRpdFBhcnQxWSk7Ci0gIAkJCUludGVnZXIgaW50ZWdlclBhcnQyID0gbmV3IEludGVnZXIoZWRpdFBhcnQyWSk7Ci0gIAkJCQotICAJCQljb21wYXJlVmFsdWUgPSBpbnRlZ2VyUGFydDEuY29tcGFyZVRvKGludGVnZXJQYXJ0Mik7Ci0gIAkJfQotCi0gIAkJcmV0dXJuIGNvbXBhcmVWYWx1ZTsKLSAgCX0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETERyYWdTZXRNZXNzYWdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZjllODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OyAKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5JQ29ubmVjdGVkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLldTRExDb21wb25lbnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkdyb3VwRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLldTRExUcmVlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotCi1wdWJsaWMgY2xhc3MgV1NETERyYWdTZXRNZXNzYWdlQWN0aW9uIGV4dGVuZHMgV1NETERyYWdBY3Rpb24gewotCXByb3RlY3RlZCBFZGl0UGFydCBwb2ludGVyRWRpdFBhcnQ7Ci0JcHJvdGVjdGVkIFdTRExFbGVtZW50IG1vdmluZ0NoaWxkOwotCXByb3RlY3RlZCBXU0RMRWxlbWVudCBwb2ludGVyTW9kZWxFbGVtZW50OwotCQotCXB1YmxpYyBXU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb24oV1NETFRyZWVOb2RlRWRpdFBhcnQgbW92aW5nQ2hpbGRFZGl0UGFydCwgRWRpdFBhcnQgcG9pbnRlckVkaXRQYXJ0LCBQb2ludCBwb2ludGVyTG9jYXRpb24pIHsKLQkJdGhpcy5tb3ZpbmdDaGlsZEVkaXRQYXJ0ID0gbW92aW5nQ2hpbGRFZGl0UGFydDsKLQkJdGhpcy5wb2ludGVyRWRpdFBhcnQgPSBwb2ludGVyRWRpdFBhcnQ7Ci0JCXRoaXMucG9pbnRlckxvY2F0aW9uID0gcG9pbnRlckxvY2F0aW9uOwotCQkKLQkJbW92aW5nQ2hpbGQgPSAoV1NETEVsZW1lbnQpIG1vdmluZ0NoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJcG9pbnRlck1vZGVsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgcG9pbnRlckVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQotCQkvLyBBbGxvdyB0aGUgdXNlciB0byBob3ZlciBvdmVyIGEgUGFydCAob2YgYSBNZXNzYWdlKSB0byBzZXQgdGhlIE1lc3NhZ2UKLQkJaWYgKHBvaW50ZXJNb2RlbEVsZW1lbnQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0JCQl0aGlzLnBvaW50ZXJFZGl0UGFydCA9IHBvaW50ZXJFZGl0UGFydC5nZXRQYXJlbnQoKTsKLQkJCXBvaW50ZXJNb2RlbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIHRoaXMucG9pbnRlckVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JICAgIGlmIChwb2ludGVyTW9kZWxFbGVtZW50ID09IG51bGwgfHwgbW92aW5nQ2hpbGQgPT0gbnVsbCkgewotCSAgICAJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAgIAotCSAgICBpZiAobW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBJbnB1dCB8fCBtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIE91dHB1dCB8fCBtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0JICAgIAlpZiAocG9pbnRlck1vZGVsRWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2UpIHsKLQkgICAgCQlyZXN1bHQgPSB0cnVlOwotCSAgICAJfQotCSAgICB9Ci0KLQkgICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoY2FuRXhlY3V0ZSgpKSB7Ci0JCQlNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2UgPSAoTWVzc2FnZVJlZmVyZW5jZSkgbW92aW5nQ2hpbGQ7Ci0JCQltZXNzYWdlUmVmZXJlbmNlLnNldEVNZXNzYWdlKChNZXNzYWdlKSBwb2ludGVyTW9kZWxFbGVtZW50KTsKLQkJCSgoV1NETEVsZW1lbnRJbXBsKSBtZXNzYWdlUmVmZXJlbmNlKS51cGRhdGVFbGVtZW50KHRydWUpOwotCQkJCi0JCQlXU0RMRWRpdG9yIHdzZGxFZGl0b3IgPSAoKFdTRExDb21wb25lbnRWaWV3ZXIpIHBvaW50ZXJFZGl0UGFydC5nZXRWaWV3ZXIoKSkuZ2V0V1NETEVkaXRvcigpOwotCQkJd3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vdmluZ0NoaWxkKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUZpZ3VyZSBnZXRGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJUG9seWxpbmUgcG9seWZpZ3VyZSA9IG5ldyBQb2x5bGluZSgpOwotCQlHcm91cEVkaXRQYXJ0IGxlZnRHcm91cEVkaXRQYXJ0ID0gZ2V0R3JvdXBFZGl0UGFydChtb3ZpbmdDaGlsZEVkaXRQYXJ0KTsKLQkJR3JvdXBFZGl0UGFydCByaWdodEdyb3VwRWRpdFBhcnQgPSBnZXRHcm91cEVkaXRQYXJ0KHBvaW50ZXJFZGl0UGFydCk7Ci0JCWludCBteCA9IHJpZ2h0R3JvdXBFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54IC0gNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAKLSAgICAgICAgZHJhd0xpbmUocG9seWZpZ3VyZSwgbGVmdEdyb3VwRWRpdFBhcnQub3V0cHV0Q29ubmVjdGlvbi5nZXRGaWd1cmUoKSwgKChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwb2ludGVyRWRpdFBhcnQpLmdldEZpZ3VyZSgpLCBteCk7Ci0JCQotCQlyZXR1cm4gcG9seWZpZ3VyZTsKLQl9Ci0JCi0JICBwcm90ZWN0ZWQgdm9pZCBkcmF3TGluZShQb2x5bGluZSBmZWVkYmFja0ZpZ3VyZSwgSUZpZ3VyZSBhLCBJRmlndXJlIGIsIGludCBteCkKLQkgIHsKLQkgICAgICAgIFJlY3RhbmdsZSByMSA9IGdldENvbm5lY3Rpb25Cb3VuZHMoYSk7Ci0JICAgICAgICBSZWN0YW5nbGUgcjIgPSBnZXRDb25uZWN0aW9uQm91bmRzKGIpOwotCSAgICAgICAgaW50IHgxID0gcjEueCArIHIxLndpZHRoOwotCSAgICAgICAgaW50IHkxID0gcjEueSArIHIxLmhlaWdodCAvIDI7Ci0JICAgICAgICBpbnQgeDIgPSByMi54IC0gMTsKLQkgICAgICAgIGludCB5MiA9IHIyLnkgKyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAvLyBkcmF3IGhvcml6b250YWwgbGluZQotCSAgICAgICAJYWRkTGluZVRvUG9seWxpbmUoZmVlZGJhY2tGaWd1cmUsIHgxLCB5MSwgbXgsIHkxKTsKLQotCSAgICAgICAgLy8gZHJhdyBob3Jpem9udGFsIGxpbmUKLQkgICAgICAgCWFkZExpbmVUb1BvbHlsaW5lKGZlZWRiYWNrRmlndXJlLCBteCwgeTIsIHgyIC0gMSwgeTIpOwotCi0JICAgICAgICAvLyBkcmF3IHRoZSBhcnJvdyBoZWFkCi0JICAgICAgIAlhZGRMaW5lVG9Qb2x5bGluZShmZWVkYmFja0ZpZ3VyZSwgeDIgLSAxLCB5MiwgeDIgLSA0LCB5MiAtIDMpOwotCSAgICAgICAJYWRkTGluZVRvUG9seWxpbmUoZmVlZGJhY2tGaWd1cmUsIHgyIC0gMSwgeTIsIHgyIC0gNCwgeTIgKyAzKTsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRDb25uZWN0aW9uQm91bmRzKElGaWd1cmUgZmlndXJlKQotCSAgeyAgICAgICAgICAgICAgICAgCi0JICAgIFJlY3RhbmdsZSByID0gbnVsbDsKLQkgICAgaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIElDb25uZWN0ZWRGaWd1cmUpCi0JICAgIHsKLQkgICAgICBJQ29ubmVjdGVkRmlndXJlIGNvbm5lY3RlZEZpZ3VyZSA9IChJQ29ubmVjdGVkRmlndXJlKWZpZ3VyZTsKLQkgICAgICByID0gY29ubmVjdGVkRmlndXJlLmdldENvbm5lY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkgICAgICByID0gZmlndXJlLmdldEJvdW5kcygpOwotCSAgICB9Ci0JICAgIHJldHVybiByOyAKLQkgIH0gICAgICAgICAgICAgICAgICAgICAgCi0JICAKLQkgIHByb3RlY3RlZCBQb2x5bGluZSBhZGRMaW5lVG9Qb2x5bGluZShQb2x5bGluZSBwb2x5bGluZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0gICAgICAJcG9seWxpbmUuYWRkUG9pbnQobmV3IFBvaW50KHgxLCB5MSkpOwotICAgICAgCXBvbHlsaW5lLmFkZFBvaW50KG5ldyBQb2ludCh4MiwgeTIpKTsKLSAgICAgIAlwb2x5bGluZS5zZXRMaW5lV2lkdGgoMSk7Ci0gICAgICAJLy9wb2x5bGluZS5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9ET1QpOwotICAgICAgCQotICAgICAgCXJldHVybiBwb2x5bGluZTsKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSBHcm91cEVkaXRQYXJ0IGdldEdyb3VwRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkgIAlFZGl0UGFydCBwYXJlbnRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0JICAJCi0JICAJaWYgKHBhcmVudFBhcnQgPT0gbnVsbCkgewotCSAgCQlyZXR1cm4gbnVsbDsKLQkgIAl9Ci0JICAJaWYgKCEocGFyZW50UGFydCBpbnN0YW5jZW9mIEdyb3VwRWRpdFBhcnQpKSB7Ci0JICAJCXBhcmVudFBhcnQgPSBnZXRHcm91cEVkaXRQYXJ0KHBhcmVudFBhcnQpOwotCSAgCX0KLQkgIAkKLQkgIAlyZXR1cm4gKEdyb3VwRWRpdFBhcnQpIHBhcmVudFBhcnQ7Ci0JICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2Q4YzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5XU0RMRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aWRnZXRzLk5ld0NvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMRWxlbWVudEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnRDb21tYW5kIG1vZGVsQ29tbWFuZDsKLSAgcHJpdmF0ZSBTdHJpbmcgdW5kb0Rlc2NyaXB0aW9uOwotICBwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnRBY3Rpb24KLSAgCShXU0RMRWxlbWVudENvbW1hbmQgY29tbWFuZCwKLSAgCSBTdHJpbmcgdW5kb0Rlc2NyaXB0aW9uLAotICAJIFN0cmluZyBsYWJlbCwKLSAgCSBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcihsYWJlbCxpbWFnZSk7Ci0gICAgbW9kZWxDb21tYW5kID0gY29tbWFuZDsKLSAgICB0aGlzLnVuZG9EZXNjcmlwdGlvbiA9IHVuZG9EZXNjcmlwdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdW5kb0Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIFdTRExFbGVtZW50IGdldE93bmVyKCk7Ci0gIAotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93RGlhbG9nKCk7Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYm9vbGVhbiBvayA9IHNob3dEaWFsb2coKTsKLSAgICBpZiAob2spCi0gICAgewotCSAgICBwcmVSdW4oKTsKLQkgICAgbW9kZWxDb21tYW5kLnJ1bigpOwotCSAgICBmb3JtYXQoKTsKLQkgICAgc2VsZWN0T2JqZWN0KCk7Ci0JICAgIHBvc3RSdW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHByZVJ1bigpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcG9zdFJ1bigpCi0gIHsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBiZWdpblJlY29yZGluZygpCi0gIHsgICAgCi0gICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICBpZiAoZ2V0T3duZXIoKSAhPSBudWxsKQotICAgICAgbm9kZSA9IGdldE93bmVyKCkuZ2V0RWxlbWVudCgpOyAKLSAgICAKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRVbmRvRGVzY3JpcHRpb24oKSk7ICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5kUmVjb3JkaW5nKCkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICBpZiAoZ2V0T3duZXIoKSAhPSBudWxsKQotICAgICAgbm9kZSA9IGdldE93bmVyKCkuZ2V0RWxlbWVudCgpOyAKLSAgICAKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxDb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBmb3JtYXQoKQotICB7Ci0gICAgTm9kZSBwYXJlbnROb2RlID0gbnVsbDsKLSAgICBpZiAoZ2V0T3duZXIoKSAhPSBudWxsKQotICAgICAgcGFyZW50Tm9kZSA9IGdldE93bmVyKCkuZ2V0RWxlbWVudCgpOyAKLSAgICAKLSAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSAKLSAgICB7Ci0JCSAgLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBGb3JtYXRQcm9jZXNzb3JYTUwgZm9ybWF0UHJvY2Vzc29yWE1MID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotICAgICAgZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKXBhcmVudE5vZGUpOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNlbGVjdE9iamVjdCgpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsICYmIGdldE93bmVyKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0V1NETEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcillZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0gICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBzaG93RGlhbG9nSGVscGVyKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lKQotICB7ICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IGRlZmF1bHROYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE5ld0NvbXBvbmVudERpYWxvZyBkaWFsb2cgPSBuZXcgTmV3Q29tcG9uZW50RGlhbG9nKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgdGl0bGUsIGRlZmF1bHROYW1lKTsKLSAgICBpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICAgIGlmIChyYyA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRpYWxvZy5nZXROYW1lKCk7ICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfSAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETEVsZW1lbnRVSUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRWxlbWVudFVJQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZjg1Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRWxlbWVudFVJQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuV1NETEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExFbGVtZW50VUlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50Q29tbWFuZCBtb2RlbEFjdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgdW5kb0Rlc2NyaXB0aW9uOwotICBwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnRVSUFjdGlvbgotICAJKFdTRExFbGVtZW50Q29tbWFuZCBhY3Rpb24sCi0gIAkgU3RyaW5nIHVuZG9EZXNjcmlwdGlvbiwKLSAgCSBTdHJpbmcgbGFiZWwsCi0gIAkgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKQotICB7Ci0gICAgc3VwZXIobGFiZWwsaW1hZ2UpOwotICAgIG1vZGVsQWN0aW9uID0gYWN0aW9uOwotICAgIHRoaXMudW5kb0Rlc2NyaXB0aW9uID0gdW5kb0Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiB1bmRvRGVzY3JpcHRpb247Ci0gIH0KLQotICBwcml2YXRlIE5vZGUgZ2V0T3duZXJOb2RlKCkKLSAgewotICAgIGlmIChnZXRPd25lcigpICE9IG51bGwpCi0gICAgICByZXR1cm4gZ2V0T3duZXIoKS5nZXRFbGVtZW50KCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgZ2V0T3duZXIoKTsKLSAgCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIHNob3dEaWFsb2coKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBib29sZWFuIG9rID0gc2hvd0RpYWxvZygpOwotICAgIGlmIChvaykKLSAgICB7Ci0JICAgIHByZVJ1bigpOwotCSAgICBtb2RlbEFjdGlvbi5ydW4oKTsKLQkgICAgZm9ybWF0KCk7Ci0JICAgIHNlbGVjdE9iamVjdCgpOwotCSAgICBwb3N0UnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwcmVSdW4oKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBvc3RSdW4oKQotICB7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYmVnaW5SZWNvcmRpbmcoKQotICB7ICAgIAotICAgIE5vZGUgbm9kZSA9IGdldE93bmVyTm9kZSgpOyAgCi0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICAoKElET01Ob2RlKW5vZGUpLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkpOyAgCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuZFJlY29yZGluZygpCi0gIHsgICAgICAgICAgICAgICAgIAotICAgIE5vZGUgbm9kZSA9IGdldE93bmVyTm9kZSgpOyAKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxBY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZvcm1hdCgpCi0gIHsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBnZXRPd25lck5vZGUoKTsKLSAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSAKLSAgICB7Ci0JCSAgLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBGb3JtYXRQcm9jZXNzb3JYTUwgZm9ybWF0UHJvY2Vzc29yWE1MID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotICAgICAgZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKXBhcmVudE5vZGUpOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNlbGVjdE9iamVjdCgpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsICYmIGdldE93bmVyKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0V1NETEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcillZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0gICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMTWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmYTZjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExTd2l0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZElucHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRNZXNzYWdlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRPcGVyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLldTRExUcmVlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5DcmVhdGVXU0RMRWxlbWVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0cy5OZXdDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0cy5OZXdDb21wb25lbnRXaXRoQ2hpbGREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkcy5CaW5kaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHMuUG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMTWVudUFjdGlvbkNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU1lbnVBY3Rpb25Db250cmlidXRvcgotewotICBwcm90ZWN0ZWQgQWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IgYWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci0gIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0KLSAgcHVibGljIFdTRExNZW51QWN0aW9uQ29udHJpYnV0b3IoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIGFkZEVFTWVudUFjdGlvbkNvbnRyaWJ1dG9yID0gbmV3IEFkZEVFTWVudUFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgTGlzdCBjcmVhdGVMaXN0KEFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoYWN0aW9uKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLQlwcml2YXRlIGNsYXNzIE9wZW5TY2hlbWFPblNlbGVjdGlvbkhlbHBlciBleHRlbmRzIEFjdGlvbiB7Ci0JCU9iamVjdCBvYmplY3Q7Ci0JCQotCQlwdWJsaWMgT3BlblNjaGVtYU9uU2VsZWN0aW9uSGVscGVyKE9iamVjdCBvYmplY3QpIHsKLQkJCXNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfT1BFTl9JTVBPUlQiKSk7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEltcG9ydCkgewotCQkJCVN0cmluZyBsb2NhdGlvbiA9ICgoSW1wb3J0KSBvYmplY3QpLmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCi0JCQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24udHJpbSgpLmVxdWFscygiIikpCi0JCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExFbGVtZW50KSBvYmplY3QpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQkJCW9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuT3Blbk9uU2VsZWN0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk9wZW5PblNlbGVjdGlvbkhlbHBlcihkZWZpbml0aW9uKTsKLQkJICAgIGhlbHBlci5vcGVuRWRpdG9yKChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgb2JqZWN0KTsKLQkJfQotCX0KLQotICBwdWJsaWMgdm9pZCBjb250cmlidXRlTWVudUFjdGlvbnMoZmluYWwgSU1lbnVNYW5hZ2VyIG1lbnUsIGZpbmFsIE5vZGUgbm9kZSwgT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGZpbmFsIElNZW51TWFuYWdlciBhZGRNZW51OwotICAgIGJvb2xlYW4gYWRkRWRpdEFjdGlvbiA9IGZhbHNlOwotICAgIGZpbmFsIGJvb2xlYW4gaXNFZGl0YWJsZSA9IChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCAmJiBub2RlICE9IG51bGwgJiYgaXNFZGl0YWJsZSkKLSAgICB7Ci0gICAgICBhZGRFZGl0QWN0aW9uID0gdHJ1ZTsKLSAgICAgIGFkZE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9DSElMRCIpLCAiYWRkY2hpbGQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBtZW51LmFkZChhZGRNZW51KTsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpIG9iamVjdCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW1wb3J0KSB7Ci0gICAgICAJbWVudS5hZGQobmV3IE9wZW5TY2hlbWFPblNlbGVjdGlvbkhlbHBlcihvYmplY3QpKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgV1NETFN3aXRjaCB3c2RsU3dpdGNoID0gbmV3IFdTRExTd2l0Y2goKQotICAgICAgewotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0VkaXRhYmxlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRCaW5kaW5nT3BlcmF0aW9uQWN0aW9uKG5vZGUsICJOZXdCaW5kaW5nT3BlcmF0aW9uIiwgcHJlZml4KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldFBvcnRUeXBlTWVudShiaW5kaW5nLCBpc0VkaXRhYmxlKSk7Ci0gICAgICAgICAgbWVudS5hZGQobmV3IEdlbmVyYXRlQmluZGluZ0NvbnRlbnRBY3Rpb24oYmluZGluZywgaXNFZGl0YWJsZSkpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkQmluZGluZ0lucHV0QWN0aW9uKGVkaXRvclBhcnQsIG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZEJpbmRpbmdPdXRwdXRBY3Rpb24oZWRpdG9yUGFydCwgbm9kZSwgcHJlZml4KSk7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkQmluZGluZ0ZhdWx0QWN0aW9uKG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgIG1lbnUuYWRkKG5ldyBFZGl0TmFtZXNwYWNlc0FjdGlvbihkZWZpbml0aW9uKSk7Ci0gICAgICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIAkKLSAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkTWVzc2FnZUFjdGlvbihkZWZpbml0aW9uLCBudWxsLCBub2RlLCBwcmVmaXgsICgoV1NETEVkaXRvcikgZWRpdG9yUGFydCkuZ2V0WE1MRG9jdW1lbnQoKSkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZFNlcnZpY2VBY3Rpb24oZGVmaW5pdGlvbiwgbnVsbCwgbm9kZSwgcHJlZml4LCAoKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpLmdldFhNTERvY3VtZW50KCkpKTsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRQb3J0VHlwZUFjdGlvbihkZWZpbml0aW9uLCBudWxsLCBub2RlLCBwcmVmaXgsICgoV1NETEVkaXRvcikgZWRpdG9yUGFydCkuZ2V0WE1MRG9jdW1lbnQoKSkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZEJpbmRpbmdBY3Rpb24oZGVmaW5pdGlvbiwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ly8sIG51bGwsIG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZEltcG9ydEFjdGlvbihlZGl0b3JQYXJ0LCBkZWZpbml0aW9uLCBub2RlLCBwcmVmaXgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VGYXVsdChGYXVsdCBmYXVsdCkKLSAgICAgICAgewotICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldE1lc3NhZ2VNZW51KGZhdWx0LCBpc0VkaXRhYmxlKSk7Ci0gICAgICAgICAgLy9tZW51LmFkZChjcmVhdGVBZGRCaW5kaW5nTWVudUZvcklPRihmYXVsdCkpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICBtZW51LmFkZChjcmVhdGVTZXRNZXNzYWdlTWVudShpbnB1dCwgaXNFZGl0YWJsZSkpOwotICAgICAgICAgIC8vbWVudS5hZGQoY3JlYXRlQWRkQmluZGluZ01lbnVGb3JJT0YoaW5wdXQpKTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb3V0cHV0KQotICAgICAgICB7Ci0gICAgICAgICAgbWVudS5hZGQoY3JlYXRlU2V0TWVzc2FnZU1lbnUob3V0cHV0LCBpc0VkaXRhYmxlKSk7Ci0gICAgICAgICAgLy9tZW51LmFkZChjcmVhdGVBZGRCaW5kaW5nTWVudUZvcklPRihvdXRwdXQpKTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRWRpdGFibGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZFBhcnRBY3Rpb24oZWRpdG9yUGFydCwgbWVzc2FnZSwgbm9kZSwgcHJlZml4KSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkSW5wdXRBY3Rpb24oZWRpdG9yUGFydCwgbm9kZSwgb3BlcmF0aW9uLCBwcmVmaXgpKTsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRPdXRwdXRBY3Rpb24oZWRpdG9yUGFydCwgbm9kZSwgb3BlcmF0aW9uLCBwcmVmaXgpKTsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRGYXVsdEFjdGlvbihlZGl0b3JQYXJ0LCBub2RlLCBvcGVyYXRpb24sIHByZWZpeCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvL21lbnUuYWRkKGNyZWF0ZUFkZEJpbmRpbmdNZW51Rm9yT3BlcmF0aW9uKG9wZXJhdGlvbikpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlUGFydChQYXJ0IHBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBtZW51LmFkZChjcmVhdGVTZXRQYXJ0TWVudShwYXJ0LCAoRWxlbWVudCkgbm9kZSwgImVsZW1lbnQiLCBpc0VkaXRhYmxlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBtZW51LmFkZChjcmVhdGVTZXRQYXJ0TWVudShwYXJ0LCAoRWxlbWVudCkgbm9kZSwgInR5cGUiLCBpc0VkaXRhYmxlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVBvcnQoUG9ydCBwb3J0KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldEJpbmRpbmdNZW51KHBvcnQsIChFbGVtZW50KSBub2RlLCBpc0VkaXRhYmxlKSk7Ci0gICAgICAgICAgICBpZiAocG9ydC5nZXRFQmluZGluZygpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldFBvcnRUeXBlTWVudShwb3J0LmdldEVCaW5kaW5nKCksIGlzRWRpdGFibGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0VkaXRhYmxlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRPcGVyYXRpb25BY3Rpb24oZWRpdG9yUGFydCwgcG9ydFR5cGUsIG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRWRpdGFibGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZFBvcnRBY3Rpb24oc2VydmljZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcHVibGljIE9iamVjdCBjYXNlVHlwZXMoVHlwZXMgdHlwZXMpCi0gICAgICAgIC8veyAgIAotICAgICAgICAvLyAgcmV0dXJuIGNyZWF0ZVR5cGVzQWRhcHRlcigpOwotICAgICAgICAvLyB9IAotICAgICAgfTsKLSAgICAgIHdzZGxTd2l0Y2guZG9Td2l0Y2goKFdTRExFbGVtZW50KSBvYmplY3QpOwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgewotICAgICAgYWRkTWVudSA9IG5ldyBNZW51TWFuYWdlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NISUxEIiksICJhZGRjaGlsZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIG1lbnUuYWRkKGFkZE1lbnUpOwotICAgICAgCi0gICAgICBXU0RMR3JvdXBPYmplY3QgZ3JvdXBPYmplY3QgPSAoV1NETEdyb3VwT2JqZWN0KSBvYmplY3Q7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCk7Ci0KLSAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgIC8vZm9yIChJdGVyYXRvciBpID0gYWN0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgLy97ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvLyAgQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24paS5uZXh0KCk7Ci0gICAgICAvLyAgbWFuYWdlci5hZGQoYWN0aW9uKTsgCi0gICAgICAvL30KLQotICAgICAgc3dpdGNoIChncm91cE9iamVjdC5nZXRUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0Lk1FU1NBR0VTX0dST1VQIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkTWVzc2FnZUFjdGlvbihncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCksIG51bGwsIG5vZGUsIHByZWZpeCwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlNFUlZJQ0VTX0dST1VQIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkU2VydmljZUFjdGlvbihncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCksIG51bGwsIG5vZGUsIHByZWZpeCwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlBPUlRfVFlQRVNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRQb3J0VHlwZUFjdGlvbihncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCksIG51bGwsIG5vZGUsIHByZWZpeCwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkJJTkRJTkdTX0dST1VQIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkQmluZGluZ0FjdGlvbihncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCksICgoV1NETEVkaXRvcikgZWRpdG9yUGFydCkuZ2V0WE1MRG9jdW1lbnQoKSkpOy8vLCBudWxsLCBub2RlLCBwcmVmaXgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuSU1QT1JUU19HUk9VUCA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZEltcG9ydEFjdGlvbihlZGl0b3JQYXJ0LCBncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCksIG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgCi0gICAJYWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IuY29udHJpYnV0ZU1lbnVBY3Rpb25zKG1lbnUsIG5vZGUsIG9iamVjdCk7Ci0KLSAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50ICYmIG5vZGUgIT0gbnVsbCAmJiBhZGRFZGl0QWN0aW9uICYmIG5vZGUgIT0gbnVsbCAmJiBpc0VkaXRhYmxlKQotICAgIHsKLSAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ3VycmVudGx5LCBvbmx5IGFsbG93IENvcHkgYW5kIFBhc3RlIG9uIE9wZXJhdGlvbnMKLSAgICAJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAgIAkJLy8gQWRkIEN1dCwgQ29weSBBY3Rpb25zCi0gICAgCQkvLyBOb3RlOiAgVGhlIEN1dCwgQ29weSwgUGFzdGUgQWN0aW9ucyBhcmUgTW9kZWwgRHJpdmVuLiAgVGhlIERlbGV0ZSBBY3Rpb24gaXMgc3RpbGwKLSAgICAJCS8vIGN1cnJlbnRseSBET00gZHJpdmVuLgotICAgIAkJLy8gICAgICBtZW51LmFkZChuZXcgQ3V0QWN0aW9uKChXU0RMRWxlbWVudCkgb2JqZWN0LCBlZGl0b3JQYXJ0KSk7Ci0gICAJCSAJbWVudS5hZGQobmV3IENvcHlHbG9iYWxBY3Rpb24oKFdTRExFbGVtZW50KSBvYmplY3QsIGVkaXRvclBhcnQpKTsKLSAgICAJfQotCi0gICAJIAlBY3Rpb24gcGFzdGVBY3Rpb24gPSBuZXcgUGFzdGVHbG9iYWxBY3Rpb24oKFdTRExFbGVtZW50KSBvYmplY3QsIGVkaXRvclBhcnQpOwotICAgCSAJaWYgKHBhc3RlQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0gICAJIAkJbWVudS5hZGQocGFzdGVBY3Rpb24pOwotICAgCSAJfQotICAgCSAJCi0JIAltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDdXJyZW50bHksIG9ubHkgYWxsb3cgQ29weSBhbmQgUGFzdGUgb24gT3BlcmF0aW9ucwotCQkKLQkJLy8gR2V0IHRoZSBsaXN0IG9mIHNlbGVjdGVkIGVsZW1lbnRzLiAgVXNlIHRoaXMgbGlzdCBmb3IgdGhlIERlbGV0ZUFjdGlvbi4JCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25MaXN0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAoKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKTsJCi0JCUFjdGlvbiBkZWxldGVBdGlvbiA9IG5ldyBEZWxldGVXU0RMQW5kWFNEQWN0aW9uKHNlbGVjdGlvbkxpc3QudG9MaXN0KCksIG5vZGUsIChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KTsKLQkJbWVudS5hZGQoZGVsZXRlQXRpb24pOwotCQlkZWxldGVBdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUpOwotICAgIH0KLSAgICAKLSAgICAvLyBBbGxvdyBSZW5hbWUgdGhyb3VnaCBhIGRpYWxvZyBtZWNoYW5pc20uLi4uLiAgVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB3aGVuCi0gICAgLy8gZGlyZWN0IGVkaXRpbmcgaXMgcmVhZHkKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQgJiYgaXNFZGl0YWJsZSkgewotICAgIAlSZW5hbWVEaWFsb2dBY3Rpb24gcmVuYW1lRGlhbG9nID0gbmV3IFJlbmFtZURpYWxvZ0FjdGlvbigoV1NETEVsZW1lbnQpIG9iamVjdCk7Ci0gICAgCWlmIChyZW5hbWVEaWFsb2cuc2hvd1JlbmFtZURpYWxvZygpKQotICAgIAkJbWVudS5hZGQocmVuYW1lRGlhbG9nKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlQWRkQmluZGluZ01lbnVGb3JPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikgCi0gIHsKLSAgICBNZW51TWFuYWdlciBzdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCJBZGQgQmluZGluZyIpOyAgICAgICAgICAgICAgICAgICAgCi0gIAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7IAotICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGRlZmluaXRpb24pOwotICAKLSAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkKLSAgICB7ICAgICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gdXRpbC5nZXRCaW5kaW5ncyhvcGVyYXRpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgCi0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gbWF0Y2hpbmdCaW5kaW5nT3BlcmF0aW9uID0gbnVsbDsKLSAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pai5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUuZXF1YWxzKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7IAotICAgICAgICAgICAgbWF0Y2hpbmdCaW5kaW5nT3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgIAotICAKLSAgICAgICAgaWYgKG1hdGNoaW5nQmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIEVsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgICAgICAgc3ViTWVudS5hZGQobmV3IEFkZEJpbmRpbmdPcGVyYXRpb25BY3Rpb24oYmluZGluZ0VsZW1lbnQsIG9wZXJhdGlvbiwgcHJlZml4KSk7Ci0gICAgICAgIH0gICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdWJNZW51OwotICB9Ki8KLQotICAvKgotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlQWRkQmluZGluZ01lbnVGb3JJT0YoV1NETEVsZW1lbnQgaW9mKSAKLSAgewotICAgIE1lbnVNYW5hZ2VyIHN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIkFkZCBCaW5kaW5nIik7ICAgICAgICAgICAgICAgICAgICAKLSAgCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaW9mLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsgCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24paW9mLmVDb250YWluZXIoKTsKLSAgCi0gICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0gIAotICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICBpZiAob3BlcmF0aW9uTmFtZSAhPSBudWxsKQotICAgIHsgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gdXRpbC5nZXRCaW5kaW5ncyhvcGVyYXRpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgCi0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKWkubmV4dCgpOwotICAKLSAgICAgICAgYm9vbGVhbiBoYXNOYW1lID0gZmFsc2U7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pai5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUuZXF1YWxzKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYXNOYW1lID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgIAotICAKLSAgICAgICAgaWYgKCFoYXNOYW1lKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIFRPRE8uLi4gc2hvdWxkIHdlIGFkZCB0aGUgb3BlcmF0aW9uIHRvIGFsbCBvZiB0aGUgYmluZGluZ3M/Ci0gICAgICAgICAgLy8KLSAgICAgICAgICBFbGVtZW50IGJpbmRpbmdFbGVtZW50ID0gV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGJpbmRpbmcpOwotICAgICAgICAgIHN1Yk1lbnUuYWRkKG5ldyBBZGRCaW5kaW5nT3BlcmF0aW9uQWN0aW9uKGJpbmRpbmdFbGVtZW50LCBvcGVyYXRpb25OYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN1Yk1lbnU7Ci0gIH0KLSAgKi8KLQotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlU2V0QmluZGluZ01lbnUoUG9ydCBwb3J0LCBFbGVtZW50IHBvcnRFbGVtZW50LCBib29sZWFuIGlzRWRpdGFibGUpCi0gIHsKLSAgICBNZW51TWFuYWdlciBzdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCJTZXQgQmluZGluZyIpOyAgICAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcKLSAgICAKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBwb3J0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0KLSAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcgYmVsb3cKLSAgICBTZXROZXdDb21wb25lbnRBY3Rpb24gc2V0TmV3QWN0aW9uID0gbmV3IFNldE5ld0NvbXBvbmVudEFjdGlvbigiTmV3IEJpbmRpbmcuLi4iLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAiYmluZGluZyIsIHBvcnQpOwotICAgIHNldE5ld0FjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgc2V0TmV3QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgc3VibWVudS5hZGQoc2V0TmV3QWN0aW9uKTsgICAgIAotICAgIAotICAgIC8vIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9TRVRfQklORElHIikKLSAgICBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbiBhY3Rpb24gPSBuZXcgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24oIkV4aXN0aW5nIEJpbmRpbmcuLi4iLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAiYmluZGluZyIsIHBvcnQpOwotICAgIGFjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgYWN0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0gICAgc3VibWVudS5hZGQoYWN0aW9uKTsKLSAgICAKLSAgICByZXR1cm4gc3VibWVudTsKLSAgfQotCi0gIHByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVTZXRQb3J0VHlwZU1lbnUoQmluZGluZyBiaW5kaW5nLCBib29sZWFuIGlzRWRpdGFibGUpCi0gIHsgICAgICAKLSAgICBNZW51TWFuYWdlciBzdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCJTZXQgUG9ydFR5cGUiKTsgIC8vIFRPRE86IEV4dGVybmFsaXplIFN0cmluZ3MKLQotICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gYmluZGluZy5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgIAotICAgICAgLy8gVE9ETzogRXh0ZXJuYWxpemUgU3RyaW5nIGJlbG93Ci0gICAgICBTZXROZXdDb21wb25lbnRBY3Rpb24gc2V0TmV3QWN0aW9uID0gbmV3IFNldE5ld0NvbXBvbmVudEFjdGlvbigiTmV3IFBvcnQgVHlwZS4uLiIsIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJwb3J0VHlwZSIsIGJpbmRpbmcpOwotICAgICAgc2V0TmV3QWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIHNldE5ld0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgc3VibWVudS5hZGQoc2V0TmV3QWN0aW9uKTsgICAgICAKLQotICAgICAgLy8gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX1NFVF9QT1JUVFlQRSIpCi0gICAgICBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbiBhY3Rpb24gPSBuZXcgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24oIkV4aXN0aW5nIFBvcnQgVHlwZS4uLiIsIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJwb3J0VHlwZSIsIGJpbmRpbmcpOwotICAgICAgYWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIGFjdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUpOyAgICAgIAotICAgICAgc3VibWVudS5hZGQoYWN0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1Ym1lbnU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlU2V0TWVzc2FnZU1lbnUoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQsIGJvb2xlYW4gaXNFZGl0YWJsZSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxFbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgIEVsZW1lbnQgcmVmZXJlbmNpbmdFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHdzZGxFbGVtZW50KTsKLQotICAgIE1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIlNldCBNZXNzYWdlIik7ICAgICAgIC8vIFRPRE86IEV4dGVybmFsaXplIFN0cmluZ3MKLSAgICBpZiAoZGVmaW5pdGlvbkVsZW1lbnQgIT0gbnVsbCAmJiByZWZlcmVuY2luZ0VsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgICAgCi0gICAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcgYmVsb3cKLSAgICAgIFNldE5ld0NvbXBvbmVudEFjdGlvbiBzZXROZXdBY3Rpb24gPSBuZXcgU2V0TmV3Q29tcG9uZW50QWN0aW9uKCJOZXcgTWVzc2FnZS4uLiIsIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJtZXNzYWdlIiwgd3NkbEVsZW1lbnQpOwotICAgICAgc2V0TmV3QWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIHNldE5ld0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgc3VibWVudS5hZGQoc2V0TmV3QWN0aW9uKTsgIAotICAgICAgCi0gICAgICAvLyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fU0VUX01FU1NBR0UiKQotICAgICAgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24gYWN0aW9uID0gbmV3IFNldEV4aXN0aW5nQ29tcG9uZW50QWN0aW9uKCJFeGlzdGluZyBNZXNzZ2FlLi4uIiwgZGVmaW5pdGlvbkVsZW1lbnQsIHByZWZpeCwgIm1lc3NhZ2UiLCB3c2RsRWxlbWVudCk7Ci0gICAgICBhY3Rpb24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotICAgICAgYWN0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0gICAgICBzdWJtZW51LmFkZChhY3Rpb24pOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3VibWVudTsKLSAgfQotCi0gIHByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVTZXRQYXJ0TWVudShQYXJ0IHBhcnQsIEVsZW1lbnQgcG9ydEVsZW1lbnQsIFN0cmluZyByZWZlcmVuY2VLaW5kLCBib29sZWFuIGlzRWRpdGFibGUpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBwYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0KLSAgICBTdHJpbmcgYWN0aW9uTmFtZTsKLSAgICBNZW51TWFuYWdlciBzdWJtZW51ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNlS2luZC5lcXVhbHNJZ25vcmVDYXNlKCJlbGVtZW50IikpIC8vIE5PTiBOTFMKLSAgICB7Ci0vLyAgICAgIGFjdGlvbk5hbWUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fU0VUX0VMRU1FTlQiKTsKLSAgICAgIGFjdGlvbk5hbWUgPSAiRXhpc3RpbmcgRWxlbWVudC4uLiI7Ci0gIAotICAgICAgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcigiU2V0IEVsZW1lbnQiKTsgICAgICAgLy8gVE9ETzogRXh0ZXJuYWxpemUgU3RyaW5ncwotICAgICAgCi0gICAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcgYmVsb3cKLSAgICAgIFNldE5ld0NvbXBvbmVudEFjdGlvbiBzZXROZXdFbGVtZW50QWN0aW9uID0gbmV3IFNldE5ld0NvbXBvbmVudEFjdGlvbigiTmV3IEVsZW1lbnQuLi4iLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAiZWxlbWVudCIsIHBhcnQpOwotICAgICAgc2V0TmV3RWxlbWVudEFjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgICBzZXROZXdFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICBzZXROZXdFbGVtZW50QWN0aW9uLnNldFJlZmVyZW5jZUtpbmQocmVmZXJlbmNlS2luZCk7Ci0gICAgICBzdWJtZW51LmFkZChzZXROZXdFbGVtZW50QWN0aW9uKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLS8vICAgICAgYWN0aW9uTmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9TRVRfVFlQRSIpOwotICAgICAgYWN0aW9uTmFtZSA9ICJFeGlzdGluZyBUeXBlLi4uIjsKLSAgICAgICAgICAKLSAgICAgIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIlNldCBUeXBlIik7ICAgICAgIC8vIFRPRE86IEV4dGVybmFsaXplIFN0cmluZ3MKLSAgICAgIAotICAgICAgLy8gVE9ETzogRXh0ZXJuYWxpemUgU3RyaW5nIGJlbG93Ci0gICAgICBTZXROZXdDb21wb25lbnRBY3Rpb24gc2V0TmV3Q29tcGxleEFjdGlvbiA9IG5ldyBTZXROZXdDb21wb25lbnRBY3Rpb24oIk5ldyBDb21wbGV4IFR5cGUuLi4iLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAiY29tcGxleCB0eXBlIiwgcGFydCk7Ci0gICAgICBzZXROZXdDb21wbGV4QWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0UmVmZXJlbmNlS2luZChyZWZlcmVuY2VLaW5kKTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0VHlwZUtpbmQoImNvbXBsZXgiKTsKLSAgICAgIEltYWdlIGltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RDb21wbGV4VHlwZS5naWYiKTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2UoaW1hZ2UpKTsKLSAgICAgIHN1Ym1lbnUuYWRkKHNldE5ld0NvbXBsZXhBY3Rpb24pOwotICAgICAgCi0gICAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcgYmVsb3cKLSAgICAgIFNldE5ld0NvbXBvbmVudEFjdGlvbiBzZXROZXdTaW1wbGVBY3Rpb24gPSBuZXcgU2V0TmV3Q29tcG9uZW50QWN0aW9uKCJOZXcgU2ltcGxlIFR5cGUuLi4iLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAic2ltcGxlIHR5cGUiLCBwYXJ0KTsKLSAgICAgIHNldE5ld1NpbXBsZUFjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgICBzZXROZXdTaW1wbGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIHNldE5ld1NpbXBsZUFjdGlvbi5zZXRSZWZlcmVuY2VLaW5kKHJlZmVyZW5jZUtpbmQpOwotICAgICAgc2V0TmV3U2ltcGxlQWN0aW9uLnNldFR5cGVLaW5kKCJzaW1wbGUiKTsKLSAgICAgIGltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpOwotICAgICAgc2V0TmV3U2ltcGxlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUltYWdlKGltYWdlKSk7Ci0KLSAgICAgIHN1Ym1lbnUuYWRkKHNldE5ld1NpbXBsZUFjdGlvbik7IAotICAgIH0KLQotICAgIAotICAgIFNldEV4aXN0aW5nQ29tcG9uZW50QWN0aW9uIGFjdGlvbiA9IG5ldyBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbihhY3Rpb25OYW1lLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCBhY3Rpb25OYW1lLCBwYXJ0KTsKLSAgICBhY3Rpb24uc2V0UmVmZXJlbmNlS2luZChyZWZlcmVuY2VLaW5kKTsKLSAgICBhY3Rpb24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotICAgIGFjdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUpOwotICAgIHN1Ym1lbnUuYWRkKGFjdGlvbik7Ci0gICAgCi0gICAgcmV0dXJuIHN1Ym1lbnU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgV1NETEVsZW1lbnQgc2hvd1Bhc3RlQWN0aW9uKFdTRExFbGVtZW50IGVsZW1lbnQsIElFZGl0b3JQYXJ0IGVQYXJ0KSB7Ci0gIAlXU0RMRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gbnVsbDsKLSAgCQotICAJaWYgKGVQYXJ0IGluc3RhbmNlb2YgV1NETEVkaXRvcikgewotICAJCVdTRExFbGVtZW50IGNsaXBib2FyZEVsZW1lbnQgPSAoKFdTRExFZGl0b3IpIGVQYXJ0KS5nZXRDbGlwYm9hcmRDb250ZW50cygpOwotICAJCQotICAJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUG9ydFR5cGUpIHsKLSAgCQkJaWYgKGNsaXBib2FyZEVsZW1lbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgCQkJCXBhcmVudEVsZW1lbnQgPSBlbGVtZW50OwotICAJCQl9Ci0gIAkJfQotICAJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gIAkJCWlmIChjbGlwYm9hcmRFbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gIAkJCQlwYXJlbnRFbGVtZW50ID0gKFdTRExFbGVtZW50KSAoKE9wZXJhdGlvbikgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotICAJCQl9Ci0gIAkJfQotICAJfQotICAJCi0gIAlyZXR1cm4gcGFyZW50RWxlbWVudDsKLSAgfQotfQotCi1jbGFzcyBBZGRCaW5kaW5nT3BlcmF0aW9uQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBPcGVyYXRpb24gb3BlcmF0aW9uOwotCi0gIHB1YmxpYyBBZGRCaW5kaW5nT3BlcmF0aW9uQWN0aW9uKE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICAvLyBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREIikgKyAiICIgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX09QRVJBVElPTiIpLCAiaWNvbnMvb3BlcmF0aW9uYmluZGluZ19vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAib3BlcmF0aW9uIik7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9CSU5ESU5HX09QRVJBVElPTiIpLCAiaWNvbnMvb3BlcmF0aW9uYmluZGluZ19vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAib3BlcmF0aW9uIik7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBBZGRCaW5kaW5nT3BlcmF0aW9uQWN0aW9uKE5vZGUgcGFyZW50Tm9kZSwgT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHRoaXMocGFyZW50Tm9kZSwgb3BlcmF0aW9uLmdldE5hbWUoKSwgcHJlZml4KTsKLSAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1BZGRFbGVtZW50KCk7Ci0KLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKG9wZXJhdGlvbi5nZXRJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5ldyBBZGRCaW5kaW5nSW5wdXRBY3Rpb24oZWRpdG9yUGFydCwgbmV3RWxlbWVudCwgcHJlZml4KS5ydW4oKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcGVyYXRpb24uZ2V0T3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmV3IEFkZEJpbmRpbmdPdXRwdXRBY3Rpb24oZWRpdG9yUGFydCwgbmV3RWxlbWVudCwgcHJlZml4KS5ydW4oKTsKLSAgICAgIH0KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICAgIG5ldyBBZGRCaW5kaW5nRmF1bHRBY3Rpb24obmV3RWxlbWVudCwgZmF1bHQsIHByZWZpeCkucnVuKCk7Ci0gICAgICB9Ci0gICAgICBmb3JtYXQob3BlcmF0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICB9Ci19Ci0KLQotY2xhc3MgQWRkT3BlcmF0aW9uQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSAiTmV3T3BlcmF0aW9uIjsKLSAgcHJvdGVjdGVkIFBvcnRUeXBlIHBvcnRUeXBlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVTdWJDb21wb25lbnRzID0gZmFsc2U7Ci0KLSAgcHVibGljIEFkZE9wZXJhdGlvbkFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBQb3J0VHlwZSBwb3J0VHlwZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9PUEVSQVRJT04iKSwgImljb25zL29wZXJhdGlvbl9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAib3BlcmF0aW9uIik7Ci0gICAgc2V0RWRpdG9yUGFydChlZGl0b3JQYXJ0KTsKLSAgICBzZXREZWZpbml0aW9uKHBvcnRUeXBlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgdGhpcy5wb3J0VHlwZSA9IHBvcnRUeXBlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZygpCi0gIHsKLSAgICBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVPcGVyYXRpb25OYW1lKHBvcnRUeXBlKTsKLSAgICBuYW1lID0gc2hvd0RpYWxvZ0hlbHBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fTkVXX09QRVJBVElPTiIpLCBuYW1lLCBOYW1lVXRpbC5nZXRVc2VkT3BlcmF0aW9uTmFtZXMocG9ydFR5cGUpKTsKLSAgICByZXR1cm4gbmFtZSAhPSBudWxsOwotICB9Ci0KLS8vICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLS8vICB7Ci0vLyAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotLy8gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpCi0gIHsKLSAgCWlmIChjcmVhdGVTdWJDb21wb25lbnRzKSB7Ci0gIAkgIAlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5vcGVyYXRpb25OYW1lID0gbmFtZTsKLSAgCSAgCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuZ2V0UGFydEluZm8ocG9ydFR5cGUpOwotICAJCU9wZXJhdGlvbiBvcGVyYXRpb24gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVPcGVyYXRpb24ocG9ydFR5cGUpOwotICAJCWZvcm1hdChvcGVyYXRpb24uZ2V0RWxlbWVudCgpKTsgIAkJCi0gIAkJc2VsZWN0T2JqZWN0KG9wZXJhdGlvbik7Ci0gIAkJZXhwYW5kRWRpdFBhcnRzKG9wZXJhdGlvbix0cnVlKTsKLSAgCX0KLSAgCWVsc2UgewotICAJCURlZmluaXRpb24gZGVmID0gcG9ydFR5cGUuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwkKLQkJCi0gIAkJLy8gQWRkIE9wZXJhdGlvbgotICAJCUFkZE9wZXJhdGlvbkNvbW1hbmQgb3BBY3Rpb24gPSBuZXcgQWRkT3BlcmF0aW9uQ29tbWFuZChwb3J0VHlwZSwgbmFtZSk7Ci0JCW9wQWN0aW9uLnJ1bigpOwotCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgb3BBY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLQkJCi0JCS8vIEFkZCBPdXRwdXQKLSAgCQlBZGRPdXRwdXRDb21tYW5kIG91dEFjdGlvbiA9IG5ldyBBZGRPdXRwdXRDb21tYW5kKG9wZXJhdGlvbiwgTmFtZVV0aWwuYnVpbGRVbmlxdWVJbnB1dE5hbWUocG9ydFR5cGUsIG9wZXJhdGlvbi5nZXROYW1lKCksICIiKSk7Ci0gIAkJb3V0QWN0aW9uLnJ1bigpOwotICAJCQotCQkvLyBBZGQgSW5wdXQKLQkJQWRkSW5wdXRDb21tYW5kIGluQWN0aW9uID0gbmV3IEFkZElucHV0Q29tbWFuZChvcGVyYXRpb24sIE5hbWVVdGlsLmJ1aWxkVW5pcXVlT3V0cHV0TmFtZShwb3J0VHlwZSwgb3BlcmF0aW9uLmdldE5hbWUoKSwgIiIpKTsKLSAgCQlpbkFjdGlvbi5ydW4oKTsKLQotICAJCWZvcm1hdChvcGVyYXRpb24uZ2V0RWxlbWVudCgpKTsKLQotIAkgIAlzZWxlY3RPYmplY3Qob3BlcmF0aW9uKTsKLSAJICAJZXhwYW5kRWRpdFBhcnRzKG9wZXJhdGlvbiwgdHJ1ZSk7Ci0gIAl9Ci0gIH0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRFZGl0UGFydHMoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZXhwYW5kQ2hpbGRyZW4pIHsKLQkgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCSAgICAJRWRpdFBhcnRWaWV3ZXIgZWRpdFBhcnRWaWV3ZXIgPSAoKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCk7Ci0JICAgIAlNYXAgZWRpdFBhcnRNYXAgPSBlZGl0UGFydFZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCk7Ci0JICAgIAlXU0RMVHJlZU5vZGVFZGl0UGFydCB3c2RsRWRpdFBhcnQgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIGVkaXRQYXJ0TWFwLmdldChlbGVtZW50KTsKLQkJCXdzZGxFZGl0UGFydC5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCQotCQkJaWYgKGV4cGFuZENoaWxkcmVuKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBXU0RMRWRpdG9yVXRpbC5nZXRNb2RlbEdyYXBoVmlld0NoaWxkcmVuKGVsZW1lbnQpLml0ZXJhdG9yKCk7Ci0JCQkJCi0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlleHBhbmRFZGl0UGFydHMoaXRlcmF0b3IubmV4dCgpLCBleHBhbmRDaGlsZHJlbik7Ci0JCQkJfQotCQkJfQotCSAgICB9Ci0JfQotCi0gIHB1YmxpYyBTdHJpbmcgc2hvd0RpYWxvZ0hlbHBlcihTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSwgTGlzdCB1c2VkTmFtZXMpCi0gIHsgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gZGVmYXVsdE5hbWU7IAotICAgIE5ld0NvbXBvbmVudFdpdGhDaGlsZERpYWxvZyBkaWFsb2cgPSBuZXcgTmV3Q29tcG9uZW50V2l0aENoaWxkRGlhbG9nKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgdGl0bGUsIGRlZmF1bHROYW1lLCB1c2VkTmFtZXMpOwotICAgIGludCByYyA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGlhbG9nLmdldE5hbWUoKTsgIAotICAgICAgY3JlYXRlU3ViQ29tcG9uZW50cyA9IGRpYWxvZy5jcmVhdGVTdWJDb21wb25lbnRzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBudWxsOwotICAgIH0gICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19Ci0KLWFic3RyYWN0IGNsYXNzIEFkZElPRkFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBvcGVyYXRpb247Ci0KLSAgcHVibGljIEFkZElPRkFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBTdHJpbmcgdGV4dCwgU3RyaW5nIGltYWdlRGVzY3JpcHRvcktleSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLCBPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgc3VwZXIodGV4dCwgaW1hZ2VEZXNjcmlwdG9yS2V5LCBwYXJlbnROb2RlLCBwcmVmaXgsIGxvY2FsTmFtZSk7Ci0gICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgc2V0RWRpdG9yUGFydChlZGl0b3JQYXJ0KTsKLSAgICBzZXREZWZpbml0aW9uKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnRUb0JpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50KTsKLQotICAvKgotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgewotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgIiIpOwotICB9Ci0gICovCi0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKQotICB7Ci0gICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChkZWZpbml0aW9uKTsKLQotICAgICAgZm9yIChJdGVyYXRvciBpID0gdXRpbC5nZXRCaW5kaW5nT3BlcmF0aW9ucyhvcGVyYXRpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgICBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBlcmZvcm1BZGRFbGVtZW50VG9CaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb25FbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9ybWF0KG9wZXJhdGlvbi5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgfQotfQotCi1jbGFzcyBBZGRJbnB1dEFjdGlvbiBleHRlbmRzIEFkZElPRkFjdGlvbgotewotICBwdWJsaWMgQWRkSW5wdXRBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgTm9kZSBwYXJlbnROb2RlLCBPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoZWRpdG9yUGFydCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9JTlBVVCIpLCAiaWNvbnMvaW5wdXRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImlucHV0Iiwgb3BlcmF0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50VG9CaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwgRWxlbWVudCBiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCkKLSAgewotICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpID09IG51bGwpCi0gICAgewotICAgICAgbmV3IEFkZEJpbmRpbmdJbnB1dEFjdGlvbihlZGl0b3JQYXJ0LCBiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCwgcHJlZml4KS5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotICAJUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpICgoV1NETEVsZW1lbnRJbXBsKSBvcGVyYXRpb24pLmdldENvbnRhaW5lcigpOwotICAJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5nZXRQYXJ0SW5mbyhwb3J0VHlwZSk7Ci0gIAlJbnB1dCBpbnB1dCA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZUlucHV0KHBvcnRUeXBlLCBvcGVyYXRpb24sIG51bGwpOyAKLSAgCWZvcm1hdChpbnB1dC5nZXRFbGVtZW50KCkpOwotICAJc2VsZWN0T2JqZWN0KGlucHV0KTsKLSAgfQotfQotCi1jbGFzcyBBZGRPdXRwdXRBY3Rpb24gZXh0ZW5kcyBBZGRJT0ZBY3Rpb24KLXsKLSAgcHVibGljIEFkZE91dHB1dEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBOb2RlIHBhcmVudE5vZGUsIE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihlZGl0b3JQYXJ0LCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX09VVFBVVCIpLCAiaWNvbnMvb3V0cHV0X29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJvdXRwdXQiLCBvcGVyYXRpb24pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnRUb0JpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50KQotICB7Ci0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpID09IG51bGwpCi0gICAgewotICAgICAgbmV3IEFkZEJpbmRpbmdPdXRwdXRBY3Rpb24oZWRpdG9yUGFydCwgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsIHByZWZpeCkucnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpIHsKLSAgCS8vIERldGVybWluZSBQYXJ0IGluZm8KLSAgCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSAoKFdTRExFbGVtZW50SW1wbCkgb3BlcmF0aW9uKS5nZXRDb250YWluZXIoKTsKLSAgCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuZ2V0UGFydEluZm8ocG9ydFR5cGUpOwotICAJT3V0cHV0IG91dHB1dCA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU91dHB1dChwb3J0VHlwZSwgb3BlcmF0aW9uKTsgCi0gIAlmb3JtYXQob3V0cHV0LmdldEVsZW1lbnQoKSk7Ci0gIAlzZWxlY3RPYmplY3Qob3V0cHV0KTsKLSAgfQotfQotCi1jbGFzcyBBZGRGYXVsdEFjdGlvbiBleHRlbmRzIEFkZElPRkFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSAiTmV3RmF1bHQiOwotICBwdWJsaWMgQWRkRmF1bHRBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgTm9kZSBwYXJlbnROb2RlLCBPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoZWRpdG9yUGFydCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9GQVVMVCIpLCAiaWNvbnMvZmF1bHRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImZhdWx0Iiwgb3BlcmF0aW9uKTsKLSAgICBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVGYXVsdE5hbWUob3BlcmF0aW9uKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0gICAgbmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlRmF1bHROYW1lKG9wZXJhdGlvbik7Ci0gICAgbmFtZSA9IHNob3dEaWFsb2dIZWxwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX05FV19GQVVMVCIpLCBuYW1lLCBOYW1lVXRpbC5nZXRVc2VkRmF1bHROYW1lcyhvcGVyYXRpb24pKTsKLSAgICByZXR1cm4gbmFtZSAhPSBudWxsOwotICB9Ci0KLSAgLyoKLSAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsICIiKTsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotICB9Ci0gICovCi0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnRUb0JpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50KQotICB7Ci0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0ZhdWx0KG5hbWUpID09IG51bGwpCi0gICAgewotICAgICAgbmV3IEFkZEJpbmRpbmdGYXVsdEFjdGlvbihiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCwgcHJlZml4KS5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotICAJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuZmF1bHROYW1lID0gbmFtZTsKLSAgCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuZ2V0UGFydEluZm8ob3BlcmF0aW9uKTsKLSAgCUZhdWx0IGZhdWx0ID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlRmF1bHQob3BlcmF0aW9uKTsKLSAgCWZvcm1hdChmYXVsdC5nZXRFbGVtZW50KCkpOyAgCQotICAJc2VsZWN0T2JqZWN0KGZhdWx0KTsKLSAgfQotfQotCi1jbGFzcyBBZGRCaW5kaW5nSW5wdXRBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRCaW5kaW5nSW5wdXRBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9JTlBVVCIpLCAiaWNvbnMvaW5wdXRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImlucHV0Iik7Ci0gICAgc2V0RWRpdG9yUGFydChlZGl0b3JQYXJ0KTsKLSAgfQotfQotCi1jbGFzcyBBZGRCaW5kaW5nT3V0cHV0QWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwdWJsaWMgQWRkQmluZGluZ091dHB1dEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX09VVFBVVCIpLCAiaWNvbnMvb3V0cHV0X29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJvdXRwdXQiKTsKLSAgICBzZXRFZGl0b3JQYXJ0KGVkaXRvclBhcnQpOwotICB9Ci19Ci0KLWNsYXNzIEFkZEJpbmRpbmdGYXVsdEFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIEZhdWx0IGZhdWx0OwotCi0gIHB1YmxpYyBBZGRCaW5kaW5nRmF1bHRBY3Rpb24oTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9GQVVMVCIpLCAiaWNvbnMvZmF1bHRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImZhdWx0Iik7Ci0gIH0KLQotICBwdWJsaWMgQWRkQmluZGluZ0ZhdWx0QWN0aW9uKE5vZGUgcGFyZW50Tm9kZSwgRmF1bHQgZmF1bHQsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICB0aGlzKHBhcmVudE5vZGUsIHByZWZpeCk7Ci0gICAgdGhpcy5mYXVsdCA9IGZhdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBpZiAoZmF1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsICJOZXdGYXVsdCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBmYXVsdC5nZXROYW1lKCkpOwotICAgIH0KLSAgfQotfQotCi1jbGFzcyBBZGRNZXNzYWdlQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLSAgcHVibGljIEFkZE1lc3NhZ2VBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9NRVNTQUdFIiksICJpY29ucy9tZXNzYWdlX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJtZXNzYWdlIik7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIEFkZE1lc3NhZ2VBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4LCBEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfTUVTU0FHRSIpLCAiaWNvbnMvbWVzc2FnZV9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAibWVzc2FnZSIpOwotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnNldERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotICAgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBzaG93RGlhbG9nKCkKLSAgewotICAgIG5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGRlZmluaXRpb24sIG5hbWUpOwotICAgIG5hbWUgPSBzaG93RGlhbG9nSGVscGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfTUVTU0FHRSIpLCBuYW1lLCBOYW1lVXRpbC5nZXRVc2VkTWVzc2FnZU5hbWVzKGRlZmluaXRpb24pKTsKLSAgICByZXR1cm4gbmFtZSAhPSBudWxsOwotICB9Ci0KLS8vICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLS8vICB7Ci0vLyAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotLy8gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotICAJTm9kZUxpc3QgbGlzdCA9IGRvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgCWlmIChwYXJlbnROb2RlID09IG51bGx8fCBsaXN0LmdldExlbmd0aCgpID09IDApIHsKLSAgCQljcmVhdGVEZWZpbml0aW9uU3R1YigpOwotICAJfQotICAJCi0gIAlBZGRNZXNzYWdlQ29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmaW5pdGlvbiwgbmFtZSk7Ci0JYWN0aW9uLnJ1bigpOwotCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLQlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVQYXJ0KG1lc3NhZ2UpOwotCWZvcm1hdChtZXNzYWdlLmdldEVsZW1lbnQoKSk7Ci0Jc2VsZWN0T2JqZWN0KG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci19Ci0KLWNsYXNzIEFkZFBhcnRBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHByb3RlY3RlZCBNZXNzYWdlIG1lc3NhZ2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICBwdWJsaWMgQWRkUGFydEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBNZXNzYWdlIG1lc3NhZ2UsIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfUEFSVCIpLCAiaWNvbnMvcGFydF9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAicGFydCIpOwotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgc2V0RWRpdG9yUGFydChlZGl0b3JQYXJ0KTsKLSAgICBzZXREZWZpbml0aW9uKG1lc3NhZ2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0gICAgbmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlUGFydE5hbWUobWVzc2FnZSwgbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICBuYW1lID0gc2hvd0RpYWxvZ0hlbHBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fTkVXX1BBUlQiKSwgbmFtZSwgTmFtZVV0aWwuZ2V0VXNlZFBhcnROYW1lcyhtZXNzYWdlKSk7Ci0gICAgcmV0dXJuIG5hbWUgIT0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLSAgICBTdHJpbmcgeHNkUHJlZml4ID0gbWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0UHJlZml4KFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkpOwotICAgIGlmICh4c2RQcmVmaXggPT0gbnVsbCkKLSAgICB7Ci0gICAgCUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QobWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOyAgICAJCi0gICAgICAgIG5ldyBBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNBY3Rpb24oZGVmaW5pdGlvbkVsZW1lbnQsIFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkksICJ4c2QiKS5ydW4oKTsKLQkJeHNkUHJlZml4ID0gbWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0UHJlZml4KFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkpOwotICAgIH0KLQkJCQotICAgIFN0cmluZyBkZWZhdWx0VHlwZU5hbWUgPSAic3RyaW5nIjsKLSAgICBpZiAoeHNkUHJlZml4ICE9IG51bGwgJiYgeHNkUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBkZWZhdWx0VHlwZU5hbWUgPSB4c2RQcmVmaXggKyAiOiIgKyBkZWZhdWx0VHlwZU5hbWU7Ci0gICAgfQotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgZGVmYXVsdFR5cGVOYW1lKTsKLSAgfQotfQotCi1jbGFzcyBBZGRTZXJ2aWNlQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgcHVibGljIEFkZFNlcnZpY2VBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9TRVJWSUNFIiksICJpY29ucy9zZXJ2aWNlX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJzZXJ2aWNlIik7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIEFkZFNlcnZpY2VBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4LCBEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfU0VSVklDRSIpLCAiaWNvbnMvc2VydmljZV9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAic2VydmljZSIpOwotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnNldERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotICAgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZygpCi0gIHsKLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZVNlcnZpY2VOYW1lKGRlZmluaXRpb24pOwotICAgIH0KLSAgICBuYW1lID0gc2hvd0RpYWxvZ0hlbHBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fTkVXX1NFUlZJQ0UiKSwgbmFtZSwgTmFtZVV0aWwuZ2V0VXNlZFNlcnZpY2VOYW1lcyhkZWZpbml0aW9uKSk7Ci0gICAgcmV0dXJuIG5hbWUgIT0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKSB7ICAJCi0gIAlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCB8fCBsaXN0LmdldExlbmd0aCgpID09IDApIHsKLSAgCQljcmVhdGVEZWZpbml0aW9uU3R1YigpOwotICAJfQotICAJCi0gIAlzdXBlci5wZXJmb3JtQWRkRWxlbWVudCgpOwotICB9Ci19Ci0KLWNsYXNzIEFkZFBvcnRUeXBlQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgcHVibGljIEFkZFBvcnRUeXBlQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWUsIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfUE9SVFRZUEUiKSwgImljb25zL3BvcnR0eXBlX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJwb3J0VHlwZSIpOwotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICBzZXRDb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRQb3J0VHlwZUFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9QT1JUVFlQRSIpLCAiaWNvbnMvcG9ydHR5cGVfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgInBvcnRUeXBlIik7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuc2V0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0gICAgc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0gICAgbmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlUG9ydFR5cGVOYW1lKGRlZmluaXRpb24sIG5hbWUpOwotICAgIG5hbWUgPSBzaG93RGlhbG9nSGVscGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfUE9SVFRZUEUiKSwgbmFtZSwgTmFtZVV0aWwuZ2V0VXNlZFBvcnRUeXBlTmFtZXMoZGVmaW5pdGlvbikpOwotICAgIHJldHVybiBuYW1lICE9IG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgewotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBvcnRUeXBlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKSB7Ci0gIAlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCB8fCBsaXN0LmdldExlbmd0aCgpID09IDApIHsKLSAgCQljcmVhdGVEZWZpbml0aW9uU3R1YigpOwotICAJfQotICAJCi0gIAlzdXBlci5wZXJmb3JtQWRkRWxlbWVudCgpOwotICB9Ci19Ci0KLWNsYXNzIEFkZEJpbmRpbmdBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotCi0gIHB1YmxpYyBBZGRCaW5kaW5nQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0JJTkRJTkciKSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9iaW5kaW5nX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAvL3NldFRvb2xUaXBUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQklORElOR19XSVpBUkQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBCaW5kaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBCaW5kaW5nV2l6YXJkKGRlZmluaXRpb24sIGRvY3VtZW50KTsKLSAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQotICAgIGludCByZXN1bHQgPSB3aXphcmREaWFsb2cub3BlbigpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgLy90b2RvLi4uICAgICAgCi0gICAgfQotICB9Ci19Ci0KLWNsYXNzIEFkZFBvcnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLQlwcm90ZWN0ZWQgU2VydmljZSBzZXJ2aWNlOwotCi0JcHVibGljIEFkZFBvcnRBY3Rpb24oU2VydmljZSBzZXJ2aWNlKQotCXsKLQkJc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9QT1JUIiksIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShXU0RMRWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvYmluZGluZ19vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCS8vc2V0VG9vbFRpcFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX1dJWkFSRCIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpCi0JewotCQlQb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBQb3J0V2l6YXJkKHNlcnZpY2UpOwotCQlXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQl3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0KLQkJaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotCQl7Ci0JCQkvL3RvZG8uLi4gICAgICAKLQkJfQotCX0KLX0KLQotY2xhc3MgR2VuZXJhdGVCaW5kaW5nQ29udGVudEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotCXByb3RlY3RlZCBCaW5kaW5nIGJpbmRpbmc7Ci0JcHVibGljIEdlbmVyYXRlQmluZGluZ0NvbnRlbnRBY3Rpb24oQmluZGluZyBiaW5kaW5nLCBib29sZWFuIGlzRWRpdGFibGUpCi0JewotCQlzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9HRU5FUkFURV9CSU5ESU5HX0NPTlRFTlQiKSk7Ci0JCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7Ci0JCXNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpCi0JewotCQlCaW5kaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBCaW5kaW5nV2l6YXJkKGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBCaW5kaW5nV2l6YXJkLktJTkRfUkVHRU5FUkFURV9CSU5ESU5HKTsKLQkJd2l6YXJkLnNldEJpbmRpbmdOYW1lKENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0TmFtZShiaW5kaW5nKSk7Ci0JCXdpemFyZC5zZXRQb3J0VHlwZU5hbWUoQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRQb3J0VHlwZVJlZmVyZW5jZShiaW5kaW5nKSk7Ci0JCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCXdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQkJd2l6YXJkRGlhbG9nLm9wZW4oKTsJCi0JfQotfQotCi0vL1RoaXMgaXMgYSB0ZW1wb3JhcnkgY2xhc3MgdG8gYWxsb3cgcmVuYW1pbmcuICBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aGVuIGRpcmVjdAotLy9yZW5hbWluZyBpcyByZWFkeQotY2xhc3MgUmVuYW1lRGlhbG9nQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIFdTRExFbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE5hbWUgPSAiTmV3TmFtZSI7Ci0JcHJpdmF0ZSBMaXN0IHVzZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gdXNlU21hcnRSZW5hbWUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gc2hvd0RpYWxvZyA9IGZhbHNlOwotCQotCXB1YmxpYyBSZW5hbWVEaWFsb2dBY3Rpb24oV1NETEVsZW1lbnQgc2VsZWN0aW9uKSB7Ci0JCXNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX1JFTkFNRSIpKTsKLQkJZWxlbWVudCA9IHNlbGVjdGlvbjsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVN0cmluZyByZXN1bHQ7Ci0KLQkJTmV3Q29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IG5ldyBOZXdDb21wb25lbnREaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fUkVOQU1FIiksIGRlZmF1bHROYW1lLCB1c2VkTmFtZXMpOwotCQlpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotCQlpZiAocmMgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLQkJewotCQkgIHJlc3VsdCA9IGRpYWxvZy5nZXROYW1lKCk7Ci0JCSAgaWYgKHVzZVNtYXJ0UmVuYW1lKSB7Ci0JCSAgCVNtYXJ0UmVuYW1lQWN0aW9uIHNtYXJ0UmVuYW1lID0gbmV3IFNtYXJ0UmVuYW1lQWN0aW9uKGVsZW1lbnQsIHJlc3VsdCk7CQotCQkgIAlzbWFydFJlbmFtZS5ydW4oKTsKLQkJICB9Ci0JCSAgZWxzZSB7Ci0JCSAgCVJlbmFtZUFjdGlvbiByZW5hbWUgPSBuZXcgUmVuYW1lQWN0aW9uKGVsZW1lbnQsIHJlc3VsdCk7Ci0JCSAgCXJlbmFtZS5ydW4oKTsKLQkJICB9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGYXVsdCkgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZEZhdWx0TmFtZXMoKE9wZXJhdGlvbikgKChGYXVsdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpKTsKLQkJCWRlZmF1bHROYW1lID0gKChGYXVsdCkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCi0JCQlzaG93RGlhbG9nID0gdHJ1ZTsKLQkJCXVzZVNtYXJ0UmVuYW1lID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZSkgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZE1lc3NhZ2VOYW1lcyhlbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCQlkZWZhdWx0TmFtZSA9ICgoTWVzc2FnZSkgZWxlbWVudCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQotCQkJc2hvd0RpYWxvZyA9IHRydWU7Ci0JCQl1c2VTbWFydFJlbmFtZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZE9wZXJhdGlvbk5hbWVzKChQb3J0VHlwZSkgKChPcGVyYXRpb24pIGVsZW1lbnQpLmVDb250YWluZXIoKSk7CQkKLQkJCWRlZmF1bHROYW1lID0gKChPcGVyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQotCQkJc2hvd0RpYWxvZyA9IHRydWU7Ci0JCQl1c2VTbWFydFJlbmFtZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBhcnQpIHsKLQkJCXVzZWROYW1lcyA9IE5hbWVVdGlsLmdldFVzZWRQYXJ0TmFtZXMoKE1lc3NhZ2UpICgoUGFydCkgZWxlbWVudCkuZUNvbnRhaW5lcigpKTsJCQkKLQkJCWRlZmF1bHROYW1lID0gKChQYXJ0KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkKLQkJCXNob3dEaWFsb2cgPSB0cnVlOwotCQkJdXNlU21hcnRSZW5hbWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQb3J0VHlwZSkgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZFBvcnRUeXBlTmFtZXMoZWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQkJZGVmYXVsdE5hbWUgPSAoKFBvcnRUeXBlKSBlbGVtZW50KS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCi0JCQlzaG93RGlhbG9nID0gdHJ1ZTsKLQkJCXVzZVNtYXJ0UmVuYW1lID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBvcnQpIHsKLQkJCXVzZWROYW1lcyA9IE5hbWVVdGlsLmdldFVzZWRQb3J0TmFtZXMoKFNlcnZpY2UpICgoUG9ydCkgZWxlbWVudCkuZUNvbnRhaW5lcigpKTsKLQkJCWRlZmF1bHROYW1lID0gKChQb3J0KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkKLQkJCXNob3dEaWFsb2cgPSB0cnVlOwotCQkJdXNlU21hcnRSZW5hbWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCaW5kaW5nKSB7Ci0JCQl1c2VkTmFtZXMgPSBOYW1lVXRpbC5nZXRVc2VkQmluZGluZ05hbWVzKGVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsJCQkKLQkJCWRlZmF1bHROYW1lID0gKChCaW5kaW5nKSBlbGVtZW50KS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCi0JCQlzaG93RGlhbG9nID0gdHJ1ZTsKLQkJCXVzZVNtYXJ0UmVuYW1lID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2UpIHsKLQkJCXVzZWROYW1lcyA9IE5hbWVVdGlsLmdldFVzZWRTZXJ2aWNlTmFtZXMoZWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQkJZGVmYXVsdE5hbWUgPSAoKFNlcnZpY2UpIGVsZW1lbnQpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQkKLQkJCXNob3dEaWFsb2cgPSB0cnVlOwotCQkJdXNlU21hcnRSZW5hbWUgPSBmYWxzZTsKLQkJfQotCQl1c2VkTmFtZXMucmVtb3ZlKGRlZmF1bHROYW1lKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2hvd1JlbmFtZURpYWxvZygpIHsKLQkJcmV0dXJuIHNob3dEaWFsb2c7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETE1lbnVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMTWVudUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MWMyMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMTWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFdTRExNZW51TGlzdGVuZXIgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotICBwcm90ZWN0ZWQgRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvciBleHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yOwotCi0gIHB1YmxpYyBXU0RMTWVudUxpc3RlbmVyKFdTRExFZGl0b3IgZWRpdG9yLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICBzdXBlcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuZXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvciA9IG5ldyBFeHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yKGVkaXRvcik7Ci0gICAgdGhpcy5zZWxlY3Rpb25Qcm92aWRlciA9IHNlbGVjdGlvblByb3ZpZGVyOyAgICAgICAgICAgICAgCi0gIH0KLSAgICAgIAotICBwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGVkT2JqZWN0KCkKLSAgeyAgICAgIAotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7ICAgIAotICAgIHJldHVybiBzZWxlY3Rpb24uaXNFbXB0eSgpID8gbnVsbCA6ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IG9iamVjdCA9IGdldFNlbGVjdGVkT2JqZWN0KCk7Ci0gICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICB7Ci0gICAgICBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7Ci0gICAgICBub2RlID0gKChXU0RMRWxlbWVudClvYmplY3QpLmdldEVsZW1lbnQoKTsgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICB7Ci0gICAgICBub2RlID0gICgoV1NETEdyb3VwT2JqZWN0KW9iamVjdCkuZ2V0RGVmaW5pdGlvbigpLmdldEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgZXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvci5jb250cmlidXRlTWVudUFjdGlvbnMobWFuYWdlciwgbm9kZSwgb2JqZWN0KTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk4MTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkQmluZGluZ0NvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJpdmF0ZSBCaW5kaW5nIGJpbmRpbmc7Ci0gCi0gIHB1YmxpYyBBZGRCaW5kaW5nQ29tbWFuZAotCQkoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAgCi0JCSBTdHJpbmcgbG9jYWxOYW1lKQotCXsKLQkgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLQl9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmc7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmluZGluZyA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgYmluZGluZy5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSxsb2NhbE5hbWUpKTsKLSAgICBiaW5kaW5nLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgZGVmaW5pdGlvbi5hZGRCaW5kaW5nKGJpbmRpbmcpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nRmF1bHRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nRmF1bHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTAyYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ0ZhdWx0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkQmluZGluZ0ZhdWx0Q29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0OwotICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0gIFN0cmluZyBuYW1lOwotICAKLSAgcHVibGljIEFkZEJpbmRpbmdGYXVsdENvbW1hbmQoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuYmluZGluZ09wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiaW5kaW5nRmF1bHQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgYmluZGluZ0ZhdWx0LnNldE5hbWUobmFtZSk7IAotICAgIGJpbmRpbmdGYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGJpbmRpbmdPcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdCgoQmluZGluZ0ZhdWx0KWJpbmRpbmdGYXVsdCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZ0ZhdWx0OwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdJbnB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdJbnB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwM2I0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nSW5wdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRCaW5kaW5nSW5wdXRDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQ7Ci0gIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjsKLSAgU3RyaW5nIG5hbWU7Ci0gIAotICBwdWJsaWMgQWRkQmluZGluZ0lucHV0Q29tbWFuZChCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sIFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5iaW5kaW5nT3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGJpbmRpbmdJbnB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICBiaW5kaW5nSW5wdXQuc2V0TmFtZShuYW1lKTsgCi0gICAgYmluZGluZ0lucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oYmluZGluZ09wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpYmluZGluZ0lucHV0KTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBiaW5kaW5nSW5wdXQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPcGVyYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nT3BlcmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWUwZjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPcGVyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZEJpbmRpbmdPcGVyYXRpb25Db21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgQmluZGluZyBiaW5kaW5nOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgYmluZGluZ0lucHV0TmFtZSA9ICIiOwotICBwcml2YXRlIFN0cmluZyBiaW5kaW5nT3V0cHV0TmFtZSA9ICIiOwotICBwcml2YXRlIFN0cmluZyBiaW5kaW5nRmF1bHROYW1lID0iIjsKLSAgCi0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUJpbmRpbmdJbnB1dCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlQmluZGluZ091dHB1dCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlQmluZGluZ0ZhdWx0ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgQWRkQmluZGluZ09wZXJhdGlvbkNvbW1hbmQoQmluZGluZyBiaW5kaW5nLFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgQWRkQmluZGluZ09wZXJhdGlvbkNvbW1hbmQKLSAgICAoQmluZGluZyBiaW5kaW5nLCAgCi0gICAgIFN0cmluZyBuYW1lLAotICAgICBib29sZWFuIGNyZWF0ZUJpbmRpbmdJbnB1dCwKLSAgICAgYm9vbGVhbiBjcmVhdGVCaW5kaW5nT3V0cHV0LAotICAgICBib29sZWFuIGNyZWF0ZUJpbmRpbmdGYXVsdCkKLSAgewotICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmNyZWF0ZUJpbmRpbmdJbnB1dCA9IGNyZWF0ZUJpbmRpbmdJbnB1dDsKLSAgICB0aGlzLmNyZWF0ZUJpbmRpbmdPdXRwdXQgPSBjcmVhdGVCaW5kaW5nT3V0cHV0OwotICAgIHRoaXMuY3JlYXRlQmluZGluZ0ZhdWx0ID0gY3JlYXRlQmluZGluZ0ZhdWx0OwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiaW5kaW5nT3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE5hbWUobmFtZSk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBiaW5kaW5nLmFkZEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICBXU0RMRWxlbWVudENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgaWYgKGNyZWF0ZUJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZEJpbmRpbmdJbnB1dENvbW1hbmQoYmluZGluZ09wZXJhdGlvbixiaW5kaW5nSW5wdXROYW1lKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgfQotCi0gICAgaWYgKGNyZWF0ZUJpbmRpbmdPdXRwdXQpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRCaW5kaW5nT3V0cHV0Q29tbWFuZChiaW5kaW5nT3BlcmF0aW9uLGJpbmRpbmdPdXRwdXROYW1lKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgfQotCi0gICAgaWYgKGNyZWF0ZUJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZEJpbmRpbmdGYXVsdENvbW1hbmQoYmluZGluZ09wZXJhdGlvbixiaW5kaW5nRmF1bHROYW1lKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nSW5wdXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5iaW5kaW5nSW5wdXROYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QmluZGluZ091dHB1dE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdPdXRwdXROYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QmluZGluZ0ZhdWx0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuYmluZGluZ0ZhdWx0TmFtZSA9IG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nT3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjg2YjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkQmluZGluZ091dHB1dENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0OwotICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0gIFN0cmluZyBuYW1lOwotICAKLSAgcHVibGljIEFkZEJpbmRpbmdPdXRwdXRDb21tYW5kKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdPcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmluZGluZ091dHB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgYmluZGluZ091dHB1dC5zZXROYW1lKG5hbWUpOyAKLSAgICBiaW5kaW5nT3V0cHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oYmluZGluZ09wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dCgoQmluZGluZ091dHB1dCliaW5kaW5nT3V0cHV0KTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBiaW5kaW5nT3V0cHV0OwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEZhdWx0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkRmF1bHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYTA2YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkRmF1bHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlNtYXJ0UmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZEZhdWx0Q29tbWFuZCBleHRlbmRzIEFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kCi17Ci0gIHByaXZhdGUgRmF1bHQgb3JpZ2luYWxGYXVsdDsKLSAgCi0gIHB1YmxpYyBBZGRGYXVsdENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgQWRkRmF1bHRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZU1lc3NhZ2UpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSxjcmVhdGVNZXNzYWdlKTsKLSAgfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYSBGYXVsdCBiYXNlZCBvbiB0aGUgZ2l2ZW4gRmF1bHQuICBJbiBlc3NlbmNlLCB0aGlzIHdpbGwKLSAgICogY3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gRmF1bHQuCi0gICAqLwotICBwdWJsaWMgQWRkRmF1bHRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIEZhdWx0IG9yaWdpbmFsRmF1bHQsIFN0cmluZyBuYW1lKSB7Ci0gIAlzdXBlcihvcGVyYXRpb24sIG5hbWUsIGZhbHNlKTsKLSAgCQotICAJdGhpcy5vcmlnaW5hbEZhdWx0ID0gb3JpZ2luYWxGYXVsdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIG1lc3NhZ2VSZWZlcmVuY2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmF1bHQoKTsKLSAgICBtZXNzYWdlUmVmZXJlbmNlLnNldE5hbWUobmFtZSk7IAotICAgIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBvcGVyYXRpb24uYWRkRmF1bHQoKEZhdWx0KW1lc3NhZ2VSZWZlcmVuY2UpOwotICAgIAotICAgIC8vICBUQkQgLSBhZGQgYmluZGluZyBmYXVsdAotCi0gICAgaWYgKG9yaWdpbmFsRmF1bHQgPT0gbnVsbCkgewotICAgIAlpZiAoY3JlYXRlTWVzc2FnZSkKLSAgICAJCWNyZWF0ZU1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCS8vIERvIG5lY2Vzc2FyeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSBvcmlnaW5hbCBGYXVsdCB0byBuZXcgRmF1bHQKLSAgICAJaWYgKG9yaWdpbmFsRmF1bHQuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0gICAgCQlTdHJpbmcgb3JpZ2luYWxNc2dOYW1lID0gb3JpZ2luYWxGYXVsdC5nZXRFTWVzc2FnZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgCQkKLSAgICAJCWJvb2xlYW4gZ2VuZWQgPSBmYWxzZTsKLSAgICAJCWlmIChvcmlnaW5hbEZhdWx0LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE9wZXJhdGlvbikKLSAgICAJCQlnZW5lZCA9IFNtYXJ0UmVuYW1lQWN0aW9uLmlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob3JpZ2luYWxNc2dOYW1lLCAoKE9wZXJhdGlvbikgb3JpZ2luYWxGYXVsdC5lQ29udGFpbmVyKCkpLmdldE5hbWUoKSwgIiIpOwotICAgIAkJCi0gICAgCQlTdHJpbmcgbmV3TXNnTmFtZSA9ICIiOwotICAgIAkJaWYgKGdlbmVkKSB7Ci0gICAgCQkJbmV3TXNnTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUob3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgbWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgCQl9Ci0gICAgCQllbHNlIHsKLSAgICAJCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIAkJCU1lc3NhZ2UgdE1lc3NhZ2UgPSBvcmlnaW5hbEZhdWx0LmdldEVNZXNzYWdlKCk7Ci0gICAgCQkJbmV3TXNnTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUoZGVmaW5pdGlvbiwgdE1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgCQl9Ci0gICAgCQkKLSAgICAJCWNyZWF0ZU1lc3NhZ2Uob3JpZ2luYWxGYXVsdCwgTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBtZXNzYWdlUmVmZXJlbmNlKSk7Ci0gICAgCX0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEltcG9ydENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEltcG9ydENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjNGViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRJbXBvcnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRJbXBvcnRDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotICBwcml2YXRlIEltcG9ydCBpbXBvcnRFbGVtZW50OwotICAKLSAgcHVibGljIEFkZEltcG9ydENvbW1hbmQKLSAgCShEZWZpbml0aW9uIGRlZmluaXRpb24sICAKLSAgCSBTdHJpbmcgbmFtZXNwYWNlLAotICAJIFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGltcG9ydEVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaW1wb3J0RWxlbWVudCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbXBvcnQoKTsKLSAgICBpbXBvcnRFbGVtZW50LnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2UpOwotICAgIGltcG9ydEVsZW1lbnQuc2V0TG9jYXRpb25VUkkobG9jYXRpb24pOwotICAgIGltcG9ydEVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICBkZWZpbml0aW9uLmFkZEltcG9ydChpbXBvcnRFbGVtZW50KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRJbnB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZElucHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTMzYjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZElucHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRJbnB1dENvbW1hbmQgZXh0ZW5kcyBBZGRNZXNzYWdlUmVmZXJlbmNlQ29tbWFuZAotewotICBwcml2YXRlIElucHV0IG9yaWdpbmFsSW5wdXQ7Ci0JCi0gIHB1YmxpYyBBZGRJbnB1dENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgQWRkSW5wdXRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZU1lc3NhZ2UpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSxjcmVhdGVNZXNzYWdlKTsKLSAgfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYW4gSW5wdXQgYmFzZWQgb24gdGhlIGdpdmVuIElucHV0LiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIElucHV0LgotICAgKi8KLSAgcHVibGljIEFkZElucHV0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBJbnB1dCBvcmlnaW5hbElucHV0LCBTdHJpbmcgbmFtZSkgewotICAJc3VwZXIob3BlcmF0aW9uLCBuYW1lLCBmYWxzZSk7Ci0gIAkKLSAgCXRoaXMub3JpZ2luYWxJbnB1dCA9IG9yaWdpbmFsSW5wdXQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBtZXNzYWdlUmVmZXJlbmNlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlucHV0KCk7Ci0gIC8vICBtZXNzYWdlUmVmZXJlbmNlLnNldE5hbWUobmFtZSk7IAotICAgIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBvcGVyYXRpb24uc2V0SW5wdXQoKElucHV0KW1lc3NhZ2VSZWZlcmVuY2UpOwotICAgIAotICAgIC8vIFRCRCAtIGFkZCBiaW5kaW5nIGlucHV0IAotICAgIAotICAgIGlmIChvcmlnaW5hbElucHV0ID09IG51bGwpIHsKLSAgICAJaWYgKGNyZWF0ZU1lc3NhZ2UpCi0gICAgCQljcmVhdGVNZXNzYWdlKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgIAkvLyBEbyBuZWNlc3NhcnkgY29weWluZyBvZiBkYXRhIGZyb20gb3JpZ2luYWwgSW5wdXQgdG8gbmV3IElucHV0Ci0gICAgCWlmIChvcmlnaW5hbElucHV0LmdldEVNZXNzYWdlKCkgIT0gbnVsbCkgewotICAgIAkJU3RyaW5nIG9yaWdpbmFsTXNnTmFtZSA9IG9yaWdpbmFsSW5wdXQuZ2V0RU1lc3NhZ2UoKS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgIAkJCi0gICAgCQlib29sZWFuIGdlbmVkID0gZmFsc2U7Ci0gICAgCQlpZiAob3JpZ2luYWxJbnB1dC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgCQkJZ2VuZWQgPSBTbWFydFJlbmFtZUFjdGlvbi5pc01lc3NhZ2VOYW1lR2VuZXJhdGVkKG9yaWdpbmFsTXNnTmFtZSwgKChPcGVyYXRpb24pIG9yaWdpbmFsSW5wdXQuZUNvbnRhaW5lcigpKS5nZXROYW1lKCksICJSZXF1ZXN0Iik7Ci0gICAgCQkKLSAgICAJCVN0cmluZyBuZXdNc2dOYW1lID0gIiI7Ci0gICAgCQlpZiAoZ2VuZWQpIHsKLSAgICAJCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBtZXNzYWdlUmVmZXJlbmNlKTsKLSAgICAJCX0KLSAgICAJCWVsc2UgewotICAgIAkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgCQkJTWVzc2FnZSB0TWVzc2FnZSA9IG9yaWdpbmFsSW5wdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICAJCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCB0TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAJCX0KLQotICAgIAkJY3JlYXRlTWVzc2FnZShvcmlnaW5hbElucHV0LCBuZXdNc2dOYW1lKTsKLSAgICAJfQotICAgIH0KLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRNZXNzYWdlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTE0ZDAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkTWVzc2FnZUNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJpdmF0ZSBNZXNzYWdlIG1lc3NhZ2U7Ci0gIHByaXZhdGUgTWVzc2FnZSBvcmlnaW5hbE1lc3NhZ2U7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlUGFydCA9IGZhbHNlOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBUlRfTkFNRSA9ICJOZXdQYXJ0IjsKLSAgCi0gIHB1YmxpYyBBZGRNZXNzYWdlQ29tbWFuZAotICAJKERlZmluaXRpb24gZGVmaW5pdGlvbiwgIAotICAJIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgQWRkTWVzc2FnZUNvbW1hbmQKLQkJKERlZmluaXRpb24gZGVmaW5pdGlvbiwgCi0JCSBTdHJpbmcgbG9jYWxOYW1lLAotCQkgYm9vbGVhbiBjcmVhdGVQYXJ0KQotCXsKLQkgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLQkgIHRoaXMuY3JlYXRlUGFydCA9IGNyZWF0ZVBhcnQ7Ci0JfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYSBNZXNzYWdlIGJhc2VkIG9uIHRoZSBnaXZlbiBNZXNzYWdlLiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIE1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgQWRkTWVzc2FnZUNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBNZXNzYWdlIG9yaWdpbmFsTWVzc2FnZSwgU3RyaW5nIGxvY2FsTmFtZSwgYm9vbGVhbiBjb3B5UGFydCkgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JdGhpcy5jcmVhdGVQYXJ0ID0gY29weVBhcnQ7Ci0gIAl0aGlzLm9yaWdpbmFsTWVzc2FnZSA9IG9yaWdpbmFsTWVzc2FnZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIG1lc3NhZ2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZSgpOwotICAgIG1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksbG9jYWxOYW1lKSk7Ci0gICAgbWVzc2FnZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIGRlZmluaXRpb24uYWRkTWVzc2FnZShtZXNzYWdlKTsKLSAgICAKLSAgICBpZiAob3JpZ2luYWxNZXNzYWdlID09IG51bGwpIHsKLSAgICAJaWYgKGNyZWF0ZVBhcnQpCi0gICAgCXsKLSAgICAJCUFkZFBhcnRDb21tYW5kIGNvbW1hbmQgPSAKLSAgICAJCQluZXcgQWRkUGFydENvbW1hbmQobWVzc2FnZSxERUZBVUxUX1BBUlRfTkFNRSxXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCJzdHJpbmciLHRydWUpOwotICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJaWYgKG9yaWdpbmFsTWVzc2FnZS5nZXRFUGFydHMoKSAhPSBudWxsKSB7Ci0gICAgCQlJdGVyYXRvciBpdCA9IG9yaWdpbmFsTWVzc2FnZS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIAkJCi0gICAgCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgCQkJUGFydCBwYXJ0ID0gKFBhcnQpIGl0Lm5leHQoKTsKLSAgICAJCQlBZGRQYXJ0Q29tbWFuZCBjb21tYW5kOwotICAgIAkJCWlmIChTbWFydFJlbmFtZUFjdGlvbi5pc1BhcnROYW1lR2VuZXJhdGVkKHBhcnQuZ2V0TmFtZSgpLCBvcmlnaW5hbE1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpCi0gICAgCQkJCWNvbW1hbmQgPSBuZXcgQWRkUGFydENvbW1hbmQobWVzc2FnZSwgcGFydCwgTmFtZVV0aWwuYnVpbGRVbmlxdWVQYXJ0TmFtZShtZXNzYWdlLCBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKTsJCi0gICAgCQkJZWxzZQotICAgIAkJCQljb21tYW5kID0gbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsIHBhcnQsIHBhcnQuZ2V0TmFtZSgpKTsKLSAgICAJCQkKLSAgICAJCQkKLSAgICAJCQljb21tYW5kLnJ1bigpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TG9jYWxOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRNZXNzYWdlUmVmZXJlbmNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMxMWVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotICBwcm90ZWN0ZWQgTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlOwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uIG9wZXJhdGlvbjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlTWVzc2FnZSA9IGZhbHNlOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX01FU1NBR0VfTkFNRSA9ICJOZXdNZXNzYWdlIjsKLQotICBwdWJsaWMgQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlTWVzc2FnZSkKLSAgewotICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy5jcmVhdGVNZXNzYWdlID0gY3JlYXRlTWVzc2FnZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1lc3NhZ2UoKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBBZGRNZXNzYWdlQ29tbWFuZCBjb21tYW5kID0gCi0gICAgICBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmaW5pdGlvbixERUZBVUxUX01FU1NBR0VfTkFNRSxjcmVhdGVNZXNzYWdlKTsgICAgICAKLSAgICBjb21tYW5kLnJ1bigpOwotICAgIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpKTsKLSAgfQotICAKLSAgLyoKLSAgICogT3ZlcmxvYWRlZCBjcmVhdGVNZXNzYWdlKGFyZykgbWV0aG9kLiAgU2ltaWxhciB0byB0byBjcmVhdGVNZXNzYWdlKCkgYnV0IHRha2VzIGluIGEgTWVzc2FnZVJlZmVyZW5jZS4KLSAgICogTWV0aG9kIHVzZWQgdG8gY3JlYXRlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgTWVzc2FnZSAoY29udGFpbmVkIGluIHRoZSBwYXNzZWQgaW4gTWVzc2FnZVJlZmVyZW5jZSkuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNZXNzYWdlKE1lc3NhZ2VSZWZlcmVuY2Ugb3JpZ2luYWxNUmVmLCBTdHJpbmcgbmV3TWVzc2FnZVJlZk5hbWUpIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIE1lc3NhZ2UgdE1lc3NhZ2UgPSBvcmlnaW5hbE1SZWYuZ2V0RU1lc3NhZ2UoKTsKLSAgICBBZGRNZXNzYWdlQ29tbWFuZCBjb21tYW5kID0gCi0gICAgICBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmaW5pdGlvbiwgdE1lc3NhZ2UsIG5ld01lc3NhZ2VSZWZOYW1lLCB0cnVlKTsKLSAgICBjb21tYW5kLnJ1bigpOwotICAgIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpKTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlUmVmZXJlbmNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkT3BlcmF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkT3BlcmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU5ZmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE9wZXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRPcGVyYXRpb25Db21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgUG9ydFR5cGUgcG9ydFR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIHByaXZhdGUgT3BlcmF0aW9uIG9wZXJhdGlvbjsKLSAgcHJpdmF0ZSBPcGVyYXRpb24gb3JpZ2luYWxPcGVyYXRpb247Ci0gIHByaXZhdGUgYm9vbGVhbiBjb3B5SW5PdXRGYXVsdDsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVJbnB1dCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlT3V0cHV0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVGYXVsdCA9IGZhbHNlOwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlBVVF9OQU1FID0gIiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfT1VUUFVUX05BTUUgPSAiIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9GQVVMVF9OQU1FID0gIiI7Ci0gIAotICBwdWJsaWMgQWRkT3BlcmF0aW9uQ29tbWFuZAotCQkoUG9ydFR5cGUgcG9ydFR5cGUsICAKLQkJIFN0cmluZyBuYW1lKQotCXsKLQkgIHRoaXMucG9ydFR5cGUgPSBwb3J0VHlwZTsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0JfQotICAKLSAgcHVibGljIEFkZE9wZXJhdGlvbkNvbW1hbmQKLQkJKFBvcnRUeXBlIHBvcnRUeXBlLCAgCi0JCSBTdHJpbmcgbmFtZSwKLQkJIGJvb2xlYW4gY3JlYXRlSW5wdXQsCi0JCSBib29sZWFuIGNyZWF0ZU91dHB1dCwKLQkJIGJvb2xlYW4gY3JlYXRlRmF1bHQpCi0JewotCSAgdGhpcy5wb3J0VHlwZSA9IHBvcnRUeXBlOwotCSAgdGhpcy5uYW1lID0gbmFtZTsKLQkgIHRoaXMuY3JlYXRlSW5wdXQgPSBjcmVhdGVJbnB1dDsKLQkgIHRoaXMuY3JlYXRlT3V0cHV0ID0gY3JlYXRlT3V0cHV0OwotCSAgdGhpcy5jcmVhdGVGYXVsdCA9IGNyZWF0ZUZhdWx0OwotCX0KLSAgCi0gIC8qCi0gICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIGFuIE9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gT3BlcmF0aW9uLiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIE9wZXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBBZGRPcGVyYXRpb25Db21tYW5kKFBvcnRUeXBlIHBvcnRUeXBlLCBPcGVyYXRpb24gb3JpZ2luYWxPcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNvcHlJbk91dEZhdWx0KSB7Ci0gIAl0aGlzLnBvcnRUeXBlID0gcG9ydFR5cGU7Ci0gIAl0aGlzLm9yaWdpbmFsT3BlcmF0aW9uID0gb3JpZ2luYWxPcGVyYXRpb247Ci0gIAl0aGlzLm5hbWUgPSBuYW1lOwotICAJdGhpcy5jb3B5SW5PdXRGYXVsdCA9IGNvcHlJbk91dEZhdWx0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgb3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIG9wZXJhdGlvbi5zZXROYW1lKG5hbWUpOwotICAgIG9wZXJhdGlvbi5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHBvcnRUeXBlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgcG9ydFR5cGUuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0KLSAgICBpZiAob3JpZ2luYWxPcGVyYXRpb24gPT0gbnVsbCkgeyAgICAKLSAgICAJV1NETEVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIAlpZiAoY3JlYXRlSW5wdXQpCi0gICAgCXsKLSAgICAJCWNvbW1hbmQgPSBuZXcgQWRkSW5wdXRDb21tYW5kKG9wZXJhdGlvbixERUZBVUxUX0lOUFVUX05BTUUsdHJ1ZSk7Ci0gICAgCQljb21tYW5kLnJ1bigpOwotICAgIAl9Ci0gICAgCi0gICAgCWlmIChjcmVhdGVPdXRwdXQpCi0gICAgCXsKLSAgICAJCWNvbW1hbmQgPSBuZXcgQWRkT3V0cHV0Q29tbWFuZChvcGVyYXRpb24sREVGQVVMVF9PVVRQVVRfTkFNRSx0cnVlKTsKLSAgICAJCWNvbW1hbmQucnVuKCk7Ci0gICAgCX0KLSAgICAKLSAgICAJaWYgKGNyZWF0ZUZhdWx0KQotICAgIAl7Ci0gICAgCQljb21tYW5kID0gbmV3IEFkZEZhdWx0Q29tbWFuZChvcGVyYXRpb24sREVGQVVMVF9GQVVMVF9OQU1FLHRydWUpOwotICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJLy8gRG8gbmVjZXNzYXJ5IGNvcHlpbmcgb2YgZGF0YSBmcm9tIG9yaWdpbmFsIG9wZXJhdGlvbiB0byBuZXcgb3BlcmF0aW9uCi0gICAgCS8vIFBhcmFtYXRlciBvcmRlcmluZz8gRG9jdW1lbnRhdGlvbj8gIFRoaXMgcGFydCBzdGlsbCBuZWVkcyB0byBiZSB3b3JrZWQgb24gICAgCQotICAgIAkvLyBDb3B5ICdraWRzJyBpZiBuZWNlc3NhcnkKLSAgICAJaWYgKGNvcHlJbk91dEZhdWx0KSB7Ci0gICAgCQlXU0RMRWxlbWVudENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAJaWYgKG9yaWdpbmFsT3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJCU91dHB1dCBvdXRwdXQgPSBvcmlnaW5hbE9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgICAgIAkJY29tbWFuZCA9IG5ldyBBZGRPdXRwdXRDb21tYW5kKG9wZXJhdGlvbiwgb3V0cHV0LCBOYW1lVXRpbC5idWlsZFVuaXF1ZU91dHB1dE5hbWUocG9ydFR5cGUsIG9wZXJhdGlvbi5nZXROYW1lKCksICIiKSk7Ci0gICAgICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAgICAgCX0KLSAgICAgICAgCQotICAgICAgICAJaWYgKG9yaWdpbmFsT3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpCi0gICAgICAgIAl7Ci0gICAgICAgIAkJSW5wdXQgaW5wdXQgPSBvcmlnaW5hbE9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLSAgICAgICAgCQljb21tYW5kID0gbmV3IEFkZElucHV0Q29tbWFuZChvcGVyYXRpb24sIGlucHV0LCBOYW1lVXRpbC5idWlsZFVuaXF1ZUlucHV0TmFtZShwb3J0VHlwZSwgb3BlcmF0aW9uLmdldE5hbWUoKSwgIiIpKTsKLSAgICAgICAgCQljb21tYW5kLnJ1bigpOwotICAgICAgICAJfQotICAgICAgICAKLSAgICAgICAgCWlmIChvcmlnaW5hbE9wZXJhdGlvbi5nZXRFRmF1bHRzKCkgIT0gbnVsbCkKLSAgICAgICAgCXsKLSAgICAgICAgCQlJdGVyYXRvciBpdCA9IG9yaWdpbmFsT3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOwotICAgICAgICAJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgCQkJRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGl0Lm5leHQoKTsKLSAgICAgICAgCQkJY29tbWFuZCA9IG5ldyBBZGRGYXVsdENvbW1hbmQob3BlcmF0aW9uLCBmYXVsdCwgTmFtZVV0aWwuYnVpbGRVbmlxdWVGYXVsdE5hbWUob3JpZ2luYWxPcGVyYXRpb24sIGZhdWx0LmdldE5hbWUoKSkpOwotICAgICAgICAJCQljb21tYW5kLnJ1bigpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAJCQotICAgIAl9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE91dHB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1N2M1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRPdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRPdXRwdXRDb21tYW5kIGV4dGVuZHMgQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBPdXRwdXQgb3JpZ2luYWxPdXRwdXQ7Ci0gIAotICBwdWJsaWMgQWRkT3V0cHV0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG9wZXJhdGlvbixuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRPdXRwdXRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZU1lc3NhZ2UpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSxjcmVhdGVNZXNzYWdlKTsKLSAgfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYW4gT3V0cHV0IGJhc2VkIG9uIHRoZSBnaXZlbiBPdXRwdXQuICBJbiBlc3NlbmNlLCB0aGlzIHdpbGwKLSAgICogY3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gT3V0cHV0LgotICAgKi8KLSAgcHVibGljIEFkZE91dHB1dENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgT3V0cHV0IG9yaWdpbmFsT3V0cHV0LCBTdHJpbmcgbmFtZSkgewotICAJc3VwZXIob3BlcmF0aW9uLCBuYW1lLCBmYWxzZSk7Ci0gIAkKLSAgCXRoaXMub3JpZ2luYWxPdXRwdXQgPSBvcmlnaW5hbE91dHB1dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIG1lc3NhZ2VSZWZlcmVuY2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0vLyAgICBtZXNzYWdlUmVmZXJlbmNlLnNldE5hbWUobmFtZSk7Ci0gICAgbWVzc2FnZVJlZmVyZW5jZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIG9wZXJhdGlvbi5zZXRPdXRwdXQoKE91dHB1dCltZXNzYWdlUmVmZXJlbmNlKTsKLSAgICAKLSAgICAvLyAgVEJEIC0gYWRkIGJpbmRpbmcgb3V0cHV0IAotICAgIAotICAgIGlmIChvcmlnaW5hbE91dHB1dCA9PSBudWxsKSB7Ci0gICAgCWlmIChjcmVhdGVNZXNzYWdlKQotICAgIAkJY3JlYXRlTWVzc2FnZSgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJLy8gRG8gbmVjZXNzYXJ5IGNvcHlpbmcgb2YgZGF0YSBmcm9tIG9yaWdpbmFsIE91dHB1dCB0byBuZXcgT3V0cHV0Ci0gICAgCWlmIChvcmlnaW5hbE91dHB1dC5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLSAgICAJCVN0cmluZyBvcmlnaW5hbE1zZ05hbWUgPSBvcmlnaW5hbE91dHB1dC5nZXRFTWVzc2FnZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQotCQlib29sZWFuIGdlbmVkID0gZmFsc2U7Ci0JCWlmIChvcmlnaW5hbE91dHB1dC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0JCQlnZW5lZCA9IFNtYXJ0UmVuYW1lQWN0aW9uLmlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob3JpZ2luYWxNc2dOYW1lLCAoKE9wZXJhdGlvbikgb3JpZ2luYWxPdXRwdXQuZUNvbnRhaW5lcigpKS5nZXROYW1lKCksICJSZXNwb25zZSIpOwotCQkKLQkJU3RyaW5nIG5ld01zZ05hbWUgPSAiIjsKLQkJaWYgKGdlbmVkKSB7Ci0JCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBtZXNzYWdlUmVmZXJlbmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0JCQlNZXNzYWdlIHRNZXNzYWdlID0gb3JpZ2luYWxPdXRwdXQuZ2V0RU1lc3NhZ2UoKTsKLQkJCW5ld01zZ05hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGRlZmluaXRpb24sIHRNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCQl9Ci0JCQotICAgIAljcmVhdGVNZXNzYWdlKG9yaWdpbmFsT3V0cHV0LCBuZXdNc2dOYW1lKTsKLSAgICAJfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGFydENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBhcnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlN2VkNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGFydENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuUGFydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZFBhcnRDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlOwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIFBhcnQgcGFydDsKLSAgcHJpdmF0ZSBQYXJ0IG9yaWdpbmFsUGFydDsKLSAgCi0gIHByaXZhdGUgUU5hbWUgdHlwZU9yRWxlbWVudE5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB1c2VUeXBlID0gdHJ1ZTsKLQotICBwdWJsaWMgQWRkUGFydENvbW1hbmQKLQkJKE1lc3NhZ2UgbWVzc2FnZSwKLQkJIFN0cmluZyBuYW1lKQotCXsKLQkgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JICB0aGlzLm5hbWUgPSBuYW1lOwotCX0KLSAgCi0gIHB1YmxpYyBBZGRQYXJ0Q29tbWFuZAotCQkoTWVzc2FnZSBtZXNzYWdlLAotCQkgU3RyaW5nIG5hbWUsCi0JCSBTdHJpbmcgbmFtZXNwYWNlLAotCQkgU3RyaW5nIGxvY2FsTmFtZSwKLQkJIGJvb2xlYW4gdXNlVHlwZSkKLQl7Ci0JICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCSAgdGhpcy5uYW1lID0gbmFtZTsKLQkgIHRoaXMudXNlVHlwZSA9IHVzZVR5cGU7Ci0JICB0eXBlT3JFbGVtZW50TmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2UsbG9jYWxOYW1lKTsKLQl9Ci0gIAotICAvKgotICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGNyZWF0ZSBhIFBhcnQgYmFzZWQgb24gdGhlIGdpdmVuIFBhcnQuICBJbiBlc3NlbmNlLCB0aGlzIHdpbGwKLSAgICogY3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gUGFydC4KLSAgICovCi0gIHB1YmxpYyBBZGRQYXJ0Q29tbWFuZAotCShNZXNzYWdlIG1lc3NhZ2UsCi0JIFBhcnQgb3JpZ2luYWxQYXJ0LAotCSBTdHJpbmcgbmFtZSkKLSAgewotICAJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgCXRoaXMubmFtZSA9IG5hbWU7Ci0gIAl0aGlzLm9yaWdpbmFsUGFydCA9IG9yaWdpbmFsUGFydDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgQWRkUGFydENvbW1hbmQKLQkJKE1lc3NhZ2UgbWVzc2FnZSwKLQkJIFN0cmluZyBuYW1lLAotCQkgU3RyaW5nIG5hbWVzcGFjZSwKLQkJIFN0cmluZyBsb2NhbE5hbWUpCi0JewotCSAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0JICB0eXBlT3JFbGVtZW50TmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2UsbG9jYWxOYW1lKTsKLQl9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBwYXJ0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaWYgKHR5cGVPckVsZW1lbnROYW1lID09IG51bGwpCi0gICAgICB0eXBlT3JFbGVtZW50TmFtZSA9IGNyZWF0ZURlZmF1bHRUeXBlTmFtZSgpOwotICAgIAotICAgIC8vIEFkZCBuYW1lc3BhY2UgdG8gdGhlIERlZmluaXRpb25zIGlmIGl0IGlzIG5vdCB0aGVyZSB5ZXQuCi0gICAgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oKTsKLSAgICAKLSAgICBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICBwYXJ0LnNldE5hbWUobmFtZSk7Ci0gICAgCi0gICAgaWYgKG9yaWdpbmFsUGFydCA9PSBudWxsKSB7Ci0gICAgCWlmICh1c2VUeXBlKQotICAgIAkJcGFydC5zZXRUeXBlTmFtZSh0eXBlT3JFbGVtZW50TmFtZSk7Ci0gICAgCWVsc2UKLSAgICAJCXBhcnQuc2V0RWxlbWVudE5hbWUodHlwZU9yRWxlbWVudE5hbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJaWYgKG9yaWdpbmFsUGFydC5nZXRUeXBlTmFtZSgpICE9IG51bGwpCi0gICAgCQlwYXJ0LnNldFR5cGVOYW1lKG9yaWdpbmFsUGFydC5nZXRUeXBlTmFtZSgpKTsKLQotICAgIAlTdHJpbmcgbmV3RWxlbWVudE5hbWUgPSBudWxsOwotICAgIAlpZiAob3JpZ2luYWxQYXJ0LmdldEVsZW1lbnROYW1lKCkgIT0gbnVsbCkgewotICAgIAkJCi0gICAgCQlib29sZWFuIGNyZWF0ZU5ld0VsZW1lbnQgPSB0cnVlOwotICAgIAkJaWYgKG9yaWdpbmFsUGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKSAhPSBudWxsICYmIG9yaWdpbmFsUGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAJCWlmICghKG9yaWdpbmFsUGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJRE9NTm9kZSkpIHsKLSAgICAgICAgCQkJY3JlYXRlTmV3RWxlbWVudCA9IGZhbHNlOwotICAgICAgICAJCX0gICAgICAgIAkJCi0gICAgCQl9Ci0gICAgCQkKLSAgICAJCWlmIChjcmVhdGVOZXdFbGVtZW50KSB7Ci0gICAgCQkJbmV3RWxlbWVudE5hbWUgPSBnZXROZXdOYW1lSGVscGVyKG5hbWUsIG9yaWdpbmFsUGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGZhbHNlKTsKLSAgICAJCQlwYXJ0LnNldEVsZW1lbnROYW1lKG5ldyBRTmFtZShvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgbmV3RWxlbWVudE5hbWUpKTsKLQkKLSAgICAJCQlpZiAob3JpZ2luYWxQYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0gICAgCQkJCWlmIChuZXdFbGVtZW50TmFtZSA9PSBudWxsKSB7Ci0gICAgCQkJCQluZXdFbGVtZW50TmFtZSA9IGdldE5ld05hbWVIZWxwZXIobmFtZSwgb3JpZ2luYWxQYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgZmFsc2UpOwotICAgIAkJCQl9Ci0gICAgCQkKLSAgICAJCQkJQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZCBlbGVtZW50QWN0aW9uID0gbmV3IEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQob3JpZ2luYWxQYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgbmV3RWxlbWVudE5hbWUpOwotICAgIAkJCQllbGVtZW50QWN0aW9uLnJ1bigpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJCWVsc2UgewotICAgIAkJCXBhcnQuc2V0RWxlbWVudE5hbWUobmV3IFFOYW1lKG9yaWdpbmFsUGFydC5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIAkKLSAgICBwYXJ0LnNldEVuY2xvc2luZ0RlZmluaXRpb24obWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICgoUGFydEltcGwpcGFydCkucmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7IAotICAgIG1lc3NhZ2UuYWRkUGFydChwYXJ0KTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG1lc3NhZ2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIGlmICghZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCkuY29udGFpbnNWYWx1ZSh0eXBlT3JFbGVtZW50TmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgewotICAgICAgZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoInAiLHR5cGVPckVsZW1lbnROYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICgoV1NETEVsZW1lbnRJbXBsKWRlZmluaXRpb24pLnVwZGF0ZUVsZW1lbnQoZmFsc2UpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBRTmFtZSBjcmVhdGVEZWZhdWx0VHlwZU5hbWUoKQotICB7Ci0gICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwic3RyaW5nIik7Ci0gICAgcmV0dXJuIHFuYW1lOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROZXdOYW1lSGVscGVyKFN0cmluZyBiYXNlLCBEZWZpbml0aW9uIGRlZiwgYm9vbGVhbiBpc1R5cGUpCi0gIHsgCi0gICAgU3RyaW5nIG5hbWUgPSBiYXNlOyAgICAKLSAgICBpbnQgY291bnQgPSAwOwotCi0gICAgLy8gVWdseS4uLi4gIFJlZG8gdGhpcy4uLgotICAgIC8vIEdldCBhIGxpc3Qgb2YgRWxlbWVudHMuLi4KLSAgICBMaXN0IGVsZW1lbnRMaXN0ID0gbnVsbDsKLSAgICBpZiAoZGVmLmdldEVUeXBlcygpICE9IG51bGwpIHsKLSAgICAJTGlzdCB4c2RzTGlzdCA9IGRlZi5nZXRFVHlwZXMoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgCWlmICh4c2RzTGlzdCAhPSBudWxsKSB7Ci0gICAgCQlJdGVyYXRvciB4c2RzSXRlcmF0b3IgPSB4c2RzTGlzdC5pdGVyYXRvcigpOwotICAgIAkJWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkRWxlbWVudCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgeHNkc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAJCVhTRFNjaGVtYSBzY2hlbWEgPSB4c2RFbGVtZW50LmdldFNjaGVtYSgpOwotICAgIAkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgCQkJZWxlbWVudExpc3QgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIAotICAgIGlmIChlbGVtZW50TGlzdCAhPSBudWxsKSB7Ci0gICAgCWludCBpbmRleCA9IDA7Ci0gICAgCXdoaWxlIChpbmRleCA8IGVsZW1lbnRMaXN0LnNpemUoKSkgewotICAgIAkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRMaXN0LmdldChpbmRleCk7Ci0gICAgCQkKLSAgICAJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpKSkgewotICAgIAkJCWNvdW50Kys7Ci0gICAgCQkJbmFtZSA9IG5hbWUgKyBjb3VudDsKLSAgICAJCQlpbmRleCA9IDA7Ci0gICAgCQl9Ci0gICAgCQllbHNlIHsKLSAgICAJCQlpbmRleCsrOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBvcnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjQ3YzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBvcnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkUG9ydENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2U7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIHByaXZhdGUgUG9ydCBwb3J0OwotICAKLSAgcHVibGljIEFkZFBvcnRDb21tYW5kCi0JCShTZXJ2aWNlIHNlcnZpY2UsCi0JCSBTdHJpbmcgbmFtZSkKLQl7Ci0JICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCSAgdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBwb3J0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIHBvcnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydCgpOwotICAgIHBvcnQuc2V0TmFtZShuYW1lKTsKLSAgICBwb3J0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oc2VydmljZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIHNlcnZpY2UuYWRkUG9ydChwb3J0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUG9ydFR5cGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0VHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViNGQ1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0VHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkUG9ydFR5cGVDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gIHByaXZhdGUgUG9ydFR5cGUgcG9ydFR5cGU7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlT3BlcmF0aW9uID0gZmFsc2U7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfT1BFUkFUSU9OX05BTUUgPSAiTmV3T3BlcmF0aW9uIjsKLQotICBwdWJsaWMgQWRkUG9ydFR5cGVDb21tYW5kCi0JCShEZWZpbml0aW9uIGRlZmluaXRpb24sICAKLQkJIFN0cmluZyBsb2NhbE5hbWUpCi0JewotCSAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotCX0KLQotICBwdWJsaWMgQWRkUG9ydFR5cGVDb21tYW5kCi0JCShEZWZpbml0aW9uIGRlZmluaXRpb24sIAotCQkgU3RyaW5nIGxvY2FsTmFtZSwKLQkJIGJvb2xlYW4gY3JlYXRlT3BlcmF0aW9uKQotCXsKLQkgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLQkgIHRoaXMuY3JlYXRlT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uOwotCX0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuV1NETEVsZW1lbnRBY3Rpb24jZ2V0V1NETEVsZW1lbnQoKQotICAgKi8KLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBwb3J0VHlwZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBwb3J0VHlwZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgIHBvcnRUeXBlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLGxvY2FsTmFtZSkpOwotICAgIHBvcnRUeXBlLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgZGVmaW5pdGlvbi5hZGRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgCi0gICAgaWYgKGNyZWF0ZU9wZXJhdGlvbikKLSAgICB7Ci0gICAgICBBZGRPcGVyYXRpb25Db21tYW5kIGNvbW1hbmQgPSAKLSAgICAgICAgbmV3IEFkZE9wZXJhdGlvbkNvbW1hbmQocG9ydFR5cGUsREVGQVVMVF9PUEVSQVRJT05fTkFNRSx0cnVlLHRydWUsZmFsc2UpOwotICAgICAgY29tbWFuZC5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldExvY2FsTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGxvY2FsTmFtZSA9IG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFNlcnZpY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRTZXJ2aWNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWZlZDQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFNlcnZpY2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkU2VydmljZUNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2U7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlUG9ydCA9IGZhbHNlOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX1BPUlRfTkFNRSA9ICJOZXdQb3J0IjsKLQotICBwdWJsaWMgQWRkU2VydmljZUNvbW1hbmQKLQkJKERlZmluaXRpb24gZGVmaW5pdGlvbiwgIAotCQkgU3RyaW5nIGxvY2FsTmFtZSkKLQl7Ci0JICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCSAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JfQotCi0JcHVibGljIEFkZFNlcnZpY2VDb21tYW5kCi0JCShEZWZpbml0aW9uIGRlZmluaXRpb24sIAotCQkgU3RyaW5nIGxvY2FsTmFtZSwKLQkJIGJvb2xlYW4gY3JlYXRlUG9ydCkKLQl7Ci0JICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCSAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JICB0aGlzLmNyZWF0ZVBvcnQgPSBjcmVhdGVQb3J0OwotCX0KLQotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgc2VydmljZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgc2VydmljZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSxsb2NhbE5hbWUpKTsKLSAgICBzZXJ2aWNlLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgZGVmaW5pdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIAotICAgIGlmIChjcmVhdGVQb3J0KQotICAgIHsKLSAgICAgIEFkZFBvcnRDb21tYW5kIGNvbW1hbmQgPSAKLSAgICAgICAgbmV3IEFkZFBvcnRDb21tYW5kKHNlcnZpY2UsREVGQVVMVF9QT1JUX05BTUUpOwotICAgICAgY29tbWFuZC5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldExvY2FsTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGxvY2FsTmFtZSA9IG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFR5cGVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkVHlwZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NjhmZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkVHlwZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotLy8gRGVmaW5pdGlvbiBtdXN0IG5vdCBoYXZlICJ0eXBlcyIgZWxlbWVudCB0byBydW4gdGhpcyBjb21tYW5kLgotcHVibGljIGZpbmFsIGNsYXNzIEFkZFR5cGVzQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBUeXBlcyB0eXBlczsKLSAgCi0gIHB1YmxpYyBBZGRUeXBlc0NvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgCWlmICgodHlwZXMgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpKSAhPSBudWxsKQotICAgICAgcmV0dXJuOyAvLyAidHlwZXMiIGFscmVhZHkgZXhpc3RzLgotICAJCi0gICAgdHlwZXMgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZXMoKTsKLSAgICB0eXBlcy5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIGRlZmluaXRpb24uc2V0VHlwZXModHlwZXMpOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MmNiNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudDsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJOwotICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gIHByaXZhdGUgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50OwotICBwcml2YXRlIE1hcCBwcm9wZXJ0aWVzOwotIAotICBwdWJsaWMgQWRkVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZAotICAgIChFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCwgCi0gICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2libGVFbGVtZW50ID0gZXh0ZW5zaWJsZUVsZW1lbnQ7Ci0gICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kCi0gICAgKEV4dGVuc2libGVFbGVtZW50IGV4dGVuc2libGVFbGVtZW50LCAKLSAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgTWFwIHByb3BlcnRpZXMpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2libGVFbGVtZW50ID0gZXh0ZW5zaWJsZUVsZW1lbnQ7Ci0gICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBleHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgCWV4dGVuc2liaWxpdHlFbGVtZW50ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAJZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudFR5cGUobmV3IFFOYW1lKG5hbWVzcGFjZVVSSSxsb2NhbE5hbWUpKTsKLSAgCQotICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgCWVudHJ5ID0gKE1hcC5FbnRyeSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAJU3RyaW5nIGF0dHJpYnV0ZSA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAJU3RyaW5nIHZhbHVlID0gKFN0cmluZyllbnRyeS5nZXRWYWx1ZSgpOyAgICAgIAkKLSAgICAgIAkoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsdmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgCWV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgCWV4dGVuc2libGVFbGVtZW50LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlmMTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi0KLS8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgWFNERWxlbWVudERlY2xhcmF0aW9uIGluIHRoZSB0YXJnZXROYW1lc3BhY2UuCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICBwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKLSAgcHJpdmF0ZSBYU0RTY2hlbWEgc2NoZW1hOwotICAKLSAgLyoqCi0gICAqIFRPRE86Ci0gICAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgcHJvYmxlbSBoZXJlLi4uLiAgV2hhdCBpZiB0aGUgZGVmaW5pdGlvbiB0YXJnZXRuYW1lc3BhY2UgaXMgbnVsbC4uLi4KLSAgICovCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogVXNlIEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUpCi0gICAqLwotICBwdWJsaWMgQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZAotICAgIChEZWZpbml0aW9uIGRlZmluaXRpb24sIAotICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCAKLSAgICAgU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGdldFNjaGVtYSgpOwotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IAotICAgICAgWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgZWxlbWVudERlY2wuc2V0TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgCi0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZURlZmluaXRpb24gPSBnZXRYU0RTdHJpbmdUeXBlKHhzZFNjaGVtYSk7Ci0gICAgZWxlbWVudERlY2wuc2V0VHlwZURlZmluaXRpb24oc2ltcGxlVHlwZURlZmluaXRpb24pOyAgICAKLSAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoZWxlbWVudERlY2wpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oU3RyaW5nIG5ld0VsZW1lbnROYW1lKSB7Ci0gIAllbGVtZW50TmFtZSA9IG5ld0VsZW1lbnROYW1lOwotICAJcnVuKCk7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFNwZWNpZnkgd2hpY2ggU2NoZW1hIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBUeXBlLgotICAgKiBDYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSBjYWxsaW5nIHJ1bigpLiAgT3RoZXJ3aXNlIGl0IHdpbGwgdXNlIHRoZSBmaXJzdAotICAgKiBTY2hlbWEgaXQgZmluZHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkgewotICAJdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJldHVybiB0aGUgU2NoZW1hIHVzZWQgdG8gY3JlYXRlIHRoZSBUeXBlCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpIHsKLSAgCWlmIChzY2hlbWEgPT0gbnVsbCkgewotICAJCXJldHVybiBnZXRYU0RTY2hlbWEodGFyZ2V0TmFtZXNwYWNlKTsKLSAgCX0KLSAgCWVsc2UgewotICAJCXJldHVybiBzY2hlbWE7Ci0gIAl9Ci0gIH0KLSAgCi0gIHByaXZhdGUgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0WFNEU3RyaW5nVHlwZShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOwotICB9Ci0gIAotICBwcml2YXRlIFhTRFNjaGVtYSBnZXRYU0RTY2hlbWEoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkKLSAgewotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gICAgCi0gICAgLy8gRG8gd2UgaGF2ZSBhIHNjaGVtYSBhbHJlYWR5PwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0VHlwZXMoKS5nZXRTY2hlbWFzKHRhcmdldE5hbWVzcGFjZSkuaXRlcmF0b3IoKTsKLSAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpaXRlcmF0b3IubmV4dCgpOyAvLyBHZXQgdGhlIGZpcnN0IG9uZS4KLSAgICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CSAgICAKLSAgICAgIC8vIENyZWF0ZSBhIG5ldyBzY2hlbWEgYmVjYXVzZSB0aGVyZSdzIG5vbmUuCi0gICAgICBBZGRYU0RTY2hlbWFDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNEU2NoZW1hQ29tbWFuZChkZWZpbml0aW9uLHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICBjb21tYW5kLnJ1bigpOwotICAgICAgcmV0dXJuICgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpKS5nZXRTY2hlbWEoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgVHlwZXMgZ2V0VHlwZXMoKQotICB7Ci0gICAgLy8gVHlwZXMgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0gICAgVHlwZXMgdHlwZXMgPSAoVHlwZXMpZGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgcmV0dXJuIHR5cGVzOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBBZGRUeXBlc0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRUeXBlc0NvbW1hbmQoZGVmaW5pdGlvbik7Ci0gICAgICBjb21tYW5kLnJ1bigpOwotICAgICAgcmV0dXJuIChUeXBlcyljb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RTY2hlbWFDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RTY2hlbWFDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmQxZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNEU2NoZW1hQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRYU0RTY2hlbWFDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50OwotICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gIAotICBwdWJsaWMgQWRkWFNEU2NoZW1hQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTRFNjaGVtYUNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgeyAgICAKLSAgICBleHRlbnNpYmlsaXR5RWxlbWVudCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIGV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gCi0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgIHhzZFNjaGVtYS5zZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgieHNkIik7Ci0gICAgeHNkU2NoZW1hLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgIC8vIENob29zZSB0aGUgcHJlZml4IENob29zZSB0aGUgcHJlZml4IHVzZWQgZm9yIHRoaXMgc2NoZW1hJ3MgbmFtZXNwYWNlIGFuZCB0aGUgc2NoZW1hIGZvciBzY2hlbWEncyBuYW1lc3BhY2UuCi0gICAgLy8gICAgCi0gICAgamF2YS51dGlsLk1hcCBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLS8vICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0KCJwIiwgeHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwLnB1dAotCSAgKHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpLG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gICAgICAgCi0gICAgLy8gVEJEIC0gQ2hlY2sgaWYgbXVsdGlwbGUgc2NoZW1hcyB3aXRoIHRoZSBzYW1lIHRhcmdldE5hbWVzcGFjZSBjYW4gY28tZXhpc3QuCi0gICAgVHlwZXMgdHlwZXMgPSBnZXRUeXBlcygpOwotICAgIHR5cGVzLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgVHlwZXMgZ2V0VHlwZXMoKQotICB7Ci0gICAgLy8gVHlwZXMgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcylkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICByZXR1cm4gdHlwZXM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEFkZFR5cGVzQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFR5cGVzQ29tbWFuZChkZWZpbml0aW9uKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgICByZXR1cm4gKFR5cGVzKWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDQ2MzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgWFNEVHlwZURlZmluaXRpb24gaW4gdGhlIHRhcmdldE5hbWVzcGFjZS4KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0gIHByaXZhdGUgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxleFR5cGUgPSB0cnVlOwotICAKLSAgLyoqCi0gICAqIFRPRE86Ci0gICAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgcHJvYmxlbSBoZXJlLi4uLiAgV2hhdCBpZiB0aGUgZGVmaW5pdGlvbiB0YXJnZXRuYW1lc3BhY2UgaXMgbnVsbC4uLi4KLSAgICovCi0gIHB1YmxpYyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUsIGJvb2xlYW4gaXNDb21wbGV4VHlwZSkKLSAgewotICAJdGhpcyhkZWZpbml0aW9uLCB0eXBlTmFtZSk7Ci0gIAl0aGlzLmlzQ29tcGxleFR5cGUgPSBpc0NvbXBsZXhUeXBlOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogVXNlIEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgICovCi0gIHB1YmxpYyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQKLSAgICAoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAKLSAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0gICAgWFNETmFtZWRDb21wb25lbnQgdHlwZURlZjsKLSAgICAKLSAgICBpZiAoaXNDb21wbGV4VHlwZSkgewotICAgIAl0eXBlRGVmID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgIAl0eXBlRGVmID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgdHlwZURlZi5zZXROYW1lKHR5cGVOYW1lKTsKLSAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQodHlwZURlZik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgbmV3VHlwZU5hbWUpIHsKLSAgCXR5cGVOYW1lID0gbmV3VHlwZU5hbWU7Ci0gIAlydW4oKTsKLSAgfQotICAKLSAgLyoKLSAgICogU3BlY2lmaXkgaWYgd2Ugc2hvdWxkIGNyZWF0ZSBhIGNvbXBsZXggb3Igc2ltcGxlIHR5cGUuICBUaGlzIHNob3VsZCBzaG91bGQgYmUKLSAgICogY2FsbGVkIGJlZm9yZSBydW4oKS4KLSAgICogT3ZlcnJpZGVzIHRoZSB2YWx1ZSBzZXQgd2hlbiB0aGUgY29uc3RydWN0b3IKLSAgICogQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHR5cGVOYW1lLCBib29sZWFuIGlzQ29tcGxleFR5cGUpCi0gICAqIGlzIHVzZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpc0NvbXBsZXhUeXBlKGJvb2xlYW4gaXNDb21wbGV4VHlwZSkgewotICAJdGhpcy5pc0NvbXBsZXhUeXBlID0gaXNDb21wbGV4VHlwZTsKLSAgfQotICAKLSAgLyoKLSAgICogU3BlY2lmeSB3aGljaCBTY2hlbWEgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIFR5cGUuCi0gICAqIENhbGwgdGhpcyBtZXRob2QgYmVmb3JlIGNhbGxpbmcgcnVuKCkuICBPdGhlcndpc2UgaXQgd2lsbCB1c2UgdGhlIGZpcnN0Ci0gICAqIFNjaGVtYSBpdCBmaW5kcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKSB7Ci0gIAl0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICAKLSAgLyoKLSAgICogUmV0dXJuIHRoZSBTY2hlbWEgdXNlZCB0byBjcmVhdGUgdGhlIFR5cGUKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkgewotICAJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0gIAkJcmV0dXJuIGdldFhTRFNjaGVtYSh0YXJnZXROYW1lc3BhY2UpOwotICAJfQotICAJZWxzZSB7Ci0gIAkJcmV0dXJuIHNjaGVtYTsKLSAgCX0KLSAgfQotCi0gIHByaXZhdGUgWFNEU2NoZW1hIGdldFhTRFNjaGVtYShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgICAKLSAgICAvLyBEbyB3ZSBoYXZlIGEgc2NoZW1hIGFscmVhZHk/Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRUeXBlcygpLmdldFNjaGVtYXModGFyZ2V0TmFtZXNwYWNlKS5pdGVyYXRvcigpOwotICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7IC8vIEdldCB0aGUgZmlyc3Qgb25lLgotICAgICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsJICAgIAotICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNjaGVtYSBiZWNhdXNlIHRoZXJlJ3Mgbm9uZS4KLSAgICAgIEFkZFhTRFNjaGVtYUNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTY2hlbWFDb21tYW5kKGRlZmluaXRpb24sdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgICByZXR1cm4gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCljb21tYW5kLmdldFdTRExFbGVtZW50KCkpLmdldFNjaGVtYSgpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBUeXBlcyBnZXRUeXBlcygpCi0gIHsKLSAgICAvLyBUeXBlcyBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0IHlldC4KLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcylkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICByZXR1cm4gdHlwZXM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEFkZFR5cGVzQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFR5cGVzQ29tbWFuZChkZWZpbml0aW9uKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgICByZXR1cm4gKFR5cGVzKWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL1dTRExFbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvV1NETEVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzljMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvV1NETEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHVibGljIGFic3RyYWN0IFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9BYnN0cmFjdEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9BYnN0cmFjdEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmU4NjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQWJzdHJhY3RHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuQWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0R2VuZXJhdG9yCi17Ci0gIC8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TUEVDSUZJRUQgPSAiKHVuc3BlY2lmaWVkKSI7IC8vV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9OT05FIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkRJTkdfR0VORVJBVE9SID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9SVF9HRU5FUkFUT1IgPSAyOyAgCi0KLSAgcHJvdGVjdGVkIENvbnRlbnRHZW5lcmF0b3IgYmluZGluZ0NvbnRlbnRHZW5lcmF0b3I7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcndyaXRlOwotICBwcm90ZWN0ZWQgT2JqZWN0W10gb3B0aW9uczsKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IG5ld0NvbXBvbmVudDsKLQotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFR5cGUoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IE5vZGUgZ2V0UGFyZW50Tm9kZSgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlQ29udGVudCgpOwotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCk7Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0TmV3Q29tcG9uZW50KCkKLSAgewotICAJcmV0dXJuIG5ld0NvbXBvbmVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAJdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAJcmV0dXJuIG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlZk5hbWUoU3RyaW5nIHJlZk5hbWUpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFJlZk5hbWUoKTsKLQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKCk7Ci0KLSAgICAgIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24gZXh0ZW5zaW9uID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24ocHJvdG9jb2wpOwotICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvciA9IGV4dGVuc2lvbi5jcmVhdGVCaW5kaW5nQ29udGVudEdlbmVyYXRvcigpOwotICAgICAgfQotCi0gICAgICBpZiAoYmluZGluZ0NvbnRlbnRHZW5lcmF0b3IgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0NvbnRlbnRHZW5lcmF0b3IgPSBuZXcgRW1wdHlCaW5kaW5nQ29udGVudEdlbmVyYXRvcigpOwotICAgICAgfQotCi0gICAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5pbml0KGdldERlZmluaXRpb24oKSwgdGhpcywgb3B0aW9ucyk7Ci0KLSAgICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgIGlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNBY3Rpb24gYWN0aW9uID0KLSAgICAgICAgICBuZXcgQWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zQWN0aW9uKGRlZmluaXRpb25FbGVtZW50LCBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5nZXRSZXF1aXJlZE5hbWVzcGFjZXMoKSwgYmluZGluZ0NvbnRlbnRHZW5lcmF0b3IuZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXMoKSk7Ci0gICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgIH0KLQotICAgICAgZ2VuZXJhdGVDb250ZW50KCk7Ci0gICAgICBmb3JtYXQoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpCi0gIHsKLSAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKE9iamVjdFtdIG9wdGlvbnMpCi0gIHsKLSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpCi0gIHsKLSAgICByZXR1cm4gcHJvdG9jb2w7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGUoYm9vbGVhbiBvdmVyd3JpdGUpCi0gIHsKLSAgICB0aGlzLm92ZXJ3cml0ZSA9IG92ZXJ3cml0ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldE92ZXJ3cml0ZSgpCi0gIHsKLSAgICByZXR1cm4gb3ZlcndyaXRlOwotICB9Ci0KLSAgY2xhc3MgRW1wdHlCaW5kaW5nQ29udGVudEdlbmVyYXRvciBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3IKLSAgewotICAgIHB1YmxpYyB2b2lkIGluaXQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBPYmplY3QgZ2VuZXJhdG9yLCBPYmplY3RbXSBvcHRpb25zKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXMoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoRWxlbWVudCBwb3J0RWxlbWVudCwgUG9ydCBwb3J0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdDb250ZW50KEVsZW1lbnQgYmluZGluZ0VsZW1lbnQsIFBvcnRUeXBlIHBvcnRUeXBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0lucHV0Q29udGVudChFbGVtZW50IGJpbmRpbmdJbnB1dEVsZW1lbnQsIElucHV0IGlucHV0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ091dHB1dEVsZW1lbnQsIE91dHB1dCBvdXRwdXQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0ZhdWx0Q29udGVudChFbGVtZW50IGJpbmRpbmdGYXVsdEVsZW1lbnQsIEZhdWx0IGZhdWx0KQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZygpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSBnZXRQYXJlbnROb2RlKCk7Ci0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGdldFVuZG9EZXNjcmlwdGlvbigpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoKQotICB7Ci0gICAgTm9kZSBub2RlID0gZ2V0UGFyZW50Tm9kZSgpOwotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0KCkKLSAgewotICAgIE5vZGUgbm9kZSA9IGdldFBhcmVudE5vZGUoKTsKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAvL21vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0gICAgICAvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICBmb3JtYXRQcm9jZXNzb3JYTUwuZm9ybWF0Tm9kZSgoSURPTU5vZGUpbm9kZSk7Ci0gICAgICAKLSAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgLy9tb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVXU0RMRWxlbWVudChFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBwYXJlbnRFbGVtZW50LmdldFByZWZpeCgpOwotICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgIjoiICsgZWxlbWVudE5hbWUpIDogZWxlbWVudE5hbWU7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkgLG5hbWUpOwotICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgIjoiICsgZWxlbWVudE5hbWUpIDogZWxlbWVudE5hbWU7Ci0gICAgLy8gVE9ETy4uLiBjb25zaWRlciBjcmVhdGVFbGVtZW50TlMgZm9yIHRoZXNlIGVsZW1lbnRzIHRvbwotICAgIC8vCi0gICAgRWxlbWVudCByZXN1bHQgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KG5hbWUpOwotICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0JpbmRpbmdHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQmluZGluZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdiZTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQmluZGluZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQmluZGluZ0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0R2VuZXJhdG9yCi17Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByb3RlY3RlZCBTdHJpbmcgcG9ydFR5cGVOYW1lOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUJpbmRpbmdCb2R5ID0gdHJ1ZTsgCi0KLSAgcHVibGljIEJpbmRpbmdHZW5lcmF0b3IoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVCaW5kaW5nQm9keShib29sZWFuIGdlbmVyYXRlQmluZGluZ0JvZHkpCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRlQmluZGluZ0JvZHkgPSBnZW5lcmF0ZUJpbmRpbmdCb2R5OwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gIAlyZXR1cm4gQklORElOR19HRU5FUkFUT1I7Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmRlZmluaXRpb247Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTUVOVUJBUl9HRU5FUkFURV9CSU5ESU5HIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWZOYW1lKFN0cmluZyByZWZOYW1lKQotICB7Ci0gICAgc2V0UG9ydFR5cGVOYW1lKHJlZk5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJlZk5hbWUoKQotICB7Ci0gIAlyZXR1cm4gcG9ydFR5cGVOYW1lOwotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIHNldFBvcnRUeXBlTmFtZShTdHJpbmcgcG9ydFR5cGVOYW1lKQotICB7Ci0gICAgdGhpcy5wb3J0VHlwZU5hbWUgPSBwb3J0VHlwZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBvcnRUeXBlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcG9ydFR5cGVOYW1lOwotICB9Ci0KLSAgY2xhc3MgQmluZGluZ09wZXJhdGlvblRhYmxlCi0gIHsKLSAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgcHV0QmluZGluZ09wZXJhdGlvbigoQmluZGluZ09wZXJhdGlvbikgaS5uZXh0KCkpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIFN0cmluZyBrZXkgPSBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBtYXAuZ2V0KGtleSk7Ci0gICAgICBpZiAobGlzdCA9PSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBtYXAucHV0KGtleSwgbGlzdCk7Ci0gICAgICB9Ci0gICAgICBpZiAoIWxpc3QuY29udGFpbnMoYmluZGluZ09wZXJhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGxvb2t1cEJpbmRpbmdPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBudWxsOwotCi0gICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgbWFwLmdldChvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGxpc3QuZ2V0KDApOwotICAgICAgfQotCi0gICAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbjsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbnRlbnQoKQotICB7Ci0gICAgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLQotICAgIEJpbmRpbmcgYmluZGluZyA9IGdldE9yQ3JlYXRlQmluZGluZyhuYW1lLCBkZWZpbml0aW9uRWxlbWVudCk7Ci0JbmV3Q29tcG9uZW50ID0gYmluZGluZzsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwuc2V0UG9ydFR5cGVSZWZlcmVuY2UoYmluZGluZywgcG9ydFR5cGVOYW1lICE9IG51bGwgPyBwb3J0VHlwZU5hbWUgOiAiIik7Ci0gICAgfQotCi0gICAgRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IGJpbmRpbmcgIT0gbnVsbCA/IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChiaW5kaW5nKSA6IG51bGw7Ci0KLSAgICBpZiAoYmluZGluZ0VsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAob3ZlcndyaXRlKQotICAgICAgewotICAgICAgICBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKE5vZGUgbm9kZSA9IGJpbmRpbmdFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZXMuYWRkKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBpLm5leHQoKTsKLSAgICAgICAgICBiaW5kaW5nRWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0JICBnZW5lcmF0ZVBvcnRDb250ZW50KGJpbmRpbmcpOwotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotICAgICAgICAgICAKLSAgICAgIGlmIChiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGJpbmRpbmdDb250ZW50R2VuZXJhdG9yLmdlbmVyYXRlQmluZGluZ0NvbnRlbnQoYmluZGluZ0VsZW1lbnQsIHBvcnRUeXBlKTsKLSAgICAgIH0KLQotCSAgaWYgKHBvcnRUeXBlICE9IG51bGwgJiYgZ2VuZXJhdGVCaW5kaW5nQm9keSkKLQkgIHsJICAKLQkJCUJpbmRpbmdPcGVyYXRpb25UYWJsZSB0YWJsZSA9IG5ldyBCaW5kaW5nT3BlcmF0aW9uVGFibGUoKTsKLQkJCXRhYmxlLmFkZEJpbmRpbmcoYmluZGluZyk7Ci0JCQkJICAJCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IHRhYmxlLmxvb2t1cEJpbmRpbmdPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdlbmVyYXRlQmluZGluZ09wZXJhdGlvbihiaW5kaW5nLCBiaW5kaW5nRWxlbWVudCwgb3BlcmF0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFU2VydmljZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGkubmV4dCgpOwotICAgICAgLyoKLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHNlcnZpY2UuZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgai5uZXh0KCk7Ci0gICAgICAgIGlmIChwb3J0LmdldEJpbmRpbmcoKSA9PSBiaW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHBvcnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnNpemUoKSA9PSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgcG9ydEVsZW1lbnQgPSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocG9ydCk7Ci0gICAgICAgICAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5nZW5lcmF0ZVBvcnRDb250ZW50KHBvcnRFbGVtZW50LCBwb3J0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0qLwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQmluZGluZ09wZXJhdGlvbihCaW5kaW5nIGJpbmRpbmcsIEVsZW1lbnQgYmluZGluZ0VsZW1lbnQsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50ID0gY3JlYXRlV1NETEVsZW1lbnQoYmluZGluZ0VsZW1lbnQsICJvcGVyYXRpb24iKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5nZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCBvcGVyYXRpb24pOwotCi0gICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBiaW5kaW5nSW5wdXRFbGVtZW50ID0gY3JlYXRlV1NETEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsICJpbnB1dCIpOwotICAgICAgaWYgKGlucHV0LmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBiaW5kaW5nSW5wdXRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIGlucHV0LmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5nZW5lcmF0ZUJpbmRpbmdJbnB1dENvbnRlbnQoYmluZGluZ0lucHV0RWxlbWVudCwgaW5wdXQpOwotICAgIH0KLQotICAgIE91dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0RU91dHB1dCgpOwotICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGJpbmRpbmdPdXRwdXRFbGVtZW50ID0gY3JlYXRlV1NETEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsICJvdXRwdXQiKTsKLSAgICAgIGlmIChvdXRwdXQuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPdXRwdXRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG91dHB1dC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgYmluZGluZ0NvbnRlbnRHZW5lcmF0b3IuZ2VuZXJhdGVCaW5kaW5nT3V0cHV0Q29udGVudChiaW5kaW5nT3V0cHV0RWxlbWVudCwgb3V0cHV0KTsKLSAgICB9Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvcGVyYXRpb24uZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0KLSAgICAgIEVsZW1lbnQgYmluZGluZ0ZhdWx0RWxlbWVudCA9IGNyZWF0ZVdTRExFbGVtZW50KGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCAiZmF1bHQiKTsKLSAgICAgIGlmIChmYXVsdC5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0ZhdWx0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBmYXVsdC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgYmluZGluZ0NvbnRlbnRHZW5lcmF0b3IuZ2VuZXJhdGVCaW5kaW5nRmF1bHRDb250ZW50KGJpbmRpbmdGYXVsdEVsZW1lbnQsIGZhdWx0KTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgQmluZGluZyBnZXRPckNyZWF0ZUJpbmRpbmdIZWxwZXIoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBCaW5kaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXREZWZpbml0aW9uKCkuZ2V0RUJpbmRpbmdzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nTmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGJpbmRpbmdOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGJpbmRpbmc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBCaW5kaW5nIGdldE9yQ3JlYXRlQmluZGluZyhTdHJpbmcgbmFtZSwgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCkKLSAgewotICAgIEJpbmRpbmcgcmVzdWx0ID0gZ2V0T3JDcmVhdGVCaW5kaW5nSGVscGVyKG5hbWUpOwotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgICAgQWRkQmluZGluZ0FjdGlvbiBhY3Rpb24gPSBuZXcgQWRkQmluZGluZ0FjdGlvbihkZWZpbml0aW9uLCBuYW1lLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4KTsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgIHJlc3VsdCA9IGdldE9yQ3JlYXRlQmluZGluZ0hlbHBlcihuYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgfQotfQotCi1jbGFzcyBBZGRCaW5kaW5nQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgcHVibGljIEFkZEJpbmRpbmdBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoImJpbmRpbmciLCAiaWNvbnMvYmluZGluZ19vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAiYmluZGluZyIpOwotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICBzZXRDb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICIiKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ05hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNiZmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yOyAgCi0gICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0b3IKLXsgICAgICAgIAotCQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERSRVNTX0xPQ0FUSU9OID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iOyAgCi0gIHB1YmxpYyB2b2lkIGluaXQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBPYmplY3QgZ2VuZXJhdG9yLCBPYmplY3RbXSBvcHRpb25zKTsKLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXMoKTsKLQotICAvLyBnZW5lcmF0ZXMgdGhlICdhZGRyZXNzJyBleHRlbnNpYmxpdHkgZWxlbWVudCBmb3IgYSBwb3J0Ci0gIC8vCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoRWxlbWVudCBwb3J0RWxlbWVudCwgUG9ydCBwb3J0KTsKLSAKLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nQ29udGVudChFbGVtZW50IGJpbmRpbmdFbGVtZW50LCBQb3J0VHlwZSBwb3J0VHlwZSk7Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uQ29udGVudChFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCBPcGVyYXRpb24gb3BlcmF0aW9uKTsKLSAKLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nSW5wdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ0lucHV0RWxlbWVudCwgSW5wdXQgaW5wdXQpOyAgICAKLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ091dHB1dEVsZW1lbnQsIE91dHB1dCBvdXRwdXQpOwotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0ZhdWx0Q29udGVudChFbGVtZW50IGJpbmRpbmdGYXVsdEVsZW1lbnQsIEZhdWx0IGZhdWx0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDNlYWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWkuQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY29udGVudEdlbmVyYXRvckNsYXNzTmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBwb3J0T3B0aW9uc1BhZ2VDbGFzc05hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYmluZGluZ09wdGlvbnNQYWdlQ2xhc3NOYW1lOwotCi0gIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGVudEdlbmVyYXRvckNsYXNzTmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy5jb250ZW50R2VuZXJhdG9yQ2xhc3NOYW1lID0gY29udGVudEdlbmVyYXRvckNsYXNzTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICB7Ci0gICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICB9Ci0KLSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3IgY3JlYXRlQmluZGluZ0NvbnRlbnRHZW5lcmF0b3IoKQotICB7Ci0gICAgQ29udGVudEdlbmVyYXRvciByZXN1bHQgPSBudWxsOwotICAgIGlmIChjb250ZW50R2VuZXJhdG9yQ2xhc3NOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIENsYXNzIHRoZUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjb250ZW50R2VuZXJhdG9yQ2xhc3NOYW1lKSA6IENsYXNzLmZvck5hbWUoY29udGVudEdlbmVyYXRvckNsYXNzTmFtZSk7Ci0gICAgICAgIHJlc3VsdCA9IChDb250ZW50R2VuZXJhdG9yKSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSBjcmVhdGVCaW5kaW5nQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKCkKLSAgewotICAgIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSByZXN1bHQgPSBudWxsOwotICAgIGlmIChiaW5kaW5nT3B0aW9uc1BhZ2VDbGFzc05hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGJpbmRpbmdPcHRpb25zUGFnZUNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGJpbmRpbmdPcHRpb25zUGFnZUNsYXNzTmFtZSk7Ci0gICAgICAgIHJlc3VsdCA9IChDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UpIHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIGNyZWF0ZVBvcnRDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UoKQotICB7Ci0gICAgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHBvcnRPcHRpb25zUGFnZUNsYXNzTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MocG9ydE9wdGlvbnNQYWdlQ2xhc3NOYW1lKSA6IENsYXNzLmZvck5hbWUocG9ydE9wdGlvbnNQYWdlQ2xhc3NOYW1lKTsKLSAgICAgICAgcmVzdWx0ID0gKENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSkgdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdPcHRpb25zUGFnZUNsYXNzTmFtZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgYmluZGluZ09wdGlvbnNQYWdlQ2xhc3NOYW1lID0gc3RyaW5nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UG9ydE9wdGlvbnNQYWdlQ2xhc3NOYW1lKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBwb3J0T3B0aW9uc1BhZ2VDbGFzc05hbWUgPSBzdHJpbmc7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBuYW1lc3BhY2UgPSBzdHJpbmc7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0NWJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIHByb3RlY3RlZCBMaXN0IHN0YXRpY0V4dGVuc2lvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBMaXN0IGR5bmFtaWNFeHRlbnNpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIHB1YmxpYyB2b2lkIGFkZChDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbikKLSAgewotICAgIHN0YXRpY0V4dGVuc2lvbkxpc3QuYWRkKGV4dGVuc2lvbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGQoQ29udGVudEdlbmVyYXRvclByb3ZpZGVyRXh0ZW5zaW9uIGV4dGVuc2lvbikKLSAgewotICAgIGR5bmFtaWNFeHRlbnNpb25MaXN0LmFkZChleHRlbnNpb24pOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbkxpc3QoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKHN0YXRpY0V4dGVuc2lvbkxpc3QpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGR5bmFtaWNFeHRlbnNpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvclByb3ZpZGVyRXh0ZW5zaW9uIGR5bmFtaWNFeHRlbnNpb24gPSAoQ29udGVudEdlbmVyYXRvclByb3ZpZGVyRXh0ZW5zaW9uKSBpLm5leHQoKTsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvclByb3ZpZGVyIHByb3ZpZGVyID0gZHluYW1pY0V4dGVuc2lvbi5jcmVhdGVDb250ZW50R2VuZXJhdG9yUHJvdmlkZXIoKTsKLSAgICAgICAgTGlzdCBkeW5hbWljYWxseUNvbnRyaWJ1dGVkRXh0ZW5zaW9ucyA9IHByb3ZpZGVyLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25zKCk7Ci0gICAgICAgIGlmIChkeW5hbWljYWxseUNvbnRyaWJ1dGVkRXh0ZW5zaW9ucyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZHluYW1pY2FsbHlDb250cmlidXRlZEV4dGVuc2lvbnMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ0V4dGVuc2lvbk5hbWVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9uTGlzdCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uKSBpLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkKGV4dGVuc2lvbi5nZXROYW1lKCkpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGdldEV4dGVuc2lvbkZvck5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiByZXN1bHQgPSBudWxsOwotICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9uTGlzdCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSAoQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBleHRlbnNpb247Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGdldEV4dGVuc2lvbkZvck5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9uTGlzdCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSAoQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhleHRlbnNpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGV4dGVuc2lvbjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoKLSAgICogQGRlcHJlY2F0ZWQgLSB1c2UgZ2V0RXh0ZW5zaW9uRm9yTmFtZQotICAgKi8KLSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24gZ2V0Q29udGVudEdlbmVyYXRvckV4dGVuc2lvbihTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBnZXRFeHRlbnNpb25Gb3JOYW1lKG5hbWUpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9Db250ZW50R2VuZXJhdG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZGZiNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9Db250ZW50R2VuZXJhdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0b3JQcm92aWRlcgotewotCXB1YmxpYyBMaXN0IGdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3JQcm92aWRlckV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9Db250ZW50R2VuZXJhdG9yUHJvdmlkZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwMmY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3JQcm92aWRlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudEdlbmVyYXRvclByb3ZpZGVyRXh0ZW5zaW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0KLSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JQcm92aWRlckV4dGVuc2lvbihTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgfQotCi0gIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yUHJvdmlkZXIgY3JlYXRlQ29udGVudEdlbmVyYXRvclByb3ZpZGVyKCkKLSAgewotCUNvbnRlbnRHZW5lcmF0b3JQcm92aWRlciByZXN1bHQgPSBudWxsOwotICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgIHJlc3VsdCA9IChDb250ZW50R2VuZXJhdG9yUHJvdmlkZXIpIHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvSHR0cENvbnRlbnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvSHR0cENvbnRlbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4Zjc4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0h0dHBDb250ZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgSHR0cENvbnRlbnRHZW5lcmF0b3IgaW1wbGVtZW50cyBDb250ZW50R2VuZXJhdG9yCi17Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUG9zdDsKLSAgcHJvdGVjdGVkIFN0cmluZyBhZGRyZXNzTG9jYXRpb24gPSBDb250ZW50R2VuZXJhdG9yLkFERFJFU1NfTE9DQVRJT047Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSByZXF1aXJlZE5hbWVzcGFjZXMgPSB7ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIH07Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gcHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXMgPSB7ICJtaW1lIiwgImh0dHAiIH07Ci0KLSAgcHVibGljIHZvaWQgaW5pdChEZWZpbml0aW9uIGRlZmluaXRpb24sIE9iamVjdCBnZW5lcmF0b3IsIE9iamVjdFtdIG9wdGlvbnMpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnNbMF0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQm9vbGVhbiBpc1Bvc3RPcHRpb24gPSAoQm9vbGVhbikgb3B0aW9uc1swXTsKLSAgICAgICAgaXNQb3N0ID0gaXNQb3N0T3B0aW9uLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMSAmJiBvcHRpb25zWzFdICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGFkZHJlc3NMb2NhdGlvbiA9IChTdHJpbmcpIG9wdGlvbnNbMV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFJlcXVpcmVkTmFtZXNwYWNlcygpCi0gIHsKLSAgICByZXR1cm4gcmVxdWlyZWROYW1lc3BhY2VzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFByZWZlcnJlZE5hbWVzcGFjZVByZWZpeGVzKCkKLSAgewotICAgIHJldHVybiBwcmVmZXJyZWROYW1lc3BhY2VQcmVmaXhlczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoRWxlbWVudCBwb3J0RWxlbWVudCwgUG9ydCBwb3J0KQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChwb3J0RWxlbWVudCwgImh0dHAiLCAiYWRkcmVzcyIpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsIGFkZHJlc3NMb2NhdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdDb250ZW50KEVsZW1lbnQgYmluZGluZ0VsZW1lbnQsIFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChiaW5kaW5nRWxlbWVudCwgImh0dHAiLCAiYmluZGluZyIpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ2ZXJiIiwgaXNQb3N0ID8gIlBPU1QiIDogIkdFVCIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uQ29udGVudChFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCBPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCwgImh0dHAiLCAib3BlcmF0aW9uIik7Ci0gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImxvY2F0aW9uIiwgIi8iICsgb3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdJbnB1dENvbnRlbnQoRWxlbWVudCBiaW5kaW5nSW5wdXRFbGVtZW50LCBJbnB1dCBpbnB1dCkKLSAgewotICAgIGlmIChpc1Bvc3QpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChiaW5kaW5nSW5wdXRFbGVtZW50LCAibWltZSIsICJjb250ZW50Iik7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ0lucHV0RWxlbWVudCwgImh0dHAiLCAidXJsRW5jb2RlZCIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ091dHB1dENvbnRlbnQoRWxlbWVudCBiaW5kaW5nT3V0cHV0RWxlbWVudCwgT3V0cHV0IG91dHB1dCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ091dHB1dEVsZW1lbnQsICJtaW1lIiwgImNvbnRlbnQiKTsKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L3htbCIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nRmF1bHRDb250ZW50KEVsZW1lbnQgYmluZGluZ0ZhdWx0RWxlbWVudCwgRmF1bHQgZmF1bHQpCi0gIHsKLSAgICAvL1RPRE8hIQotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgIjoiICsgZWxlbWVudE5hbWUpIDogZWxlbWVudE5hbWU7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KG5hbWUpOwotICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9Qb3J0R2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL1BvcnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlZjM0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL1BvcnRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBQb3J0R2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RHZW5lcmF0b3IKLXsKLSAgcHJvdGVjdGVkIFNlcnZpY2Ugc2VydmljZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBiaW5kaW5nTmFtZTsKLQotICBwdWJsaWMgUG9ydEdlbmVyYXRvcihTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBQT1JUX0dFTkVSQVRPUjsKLSAgfQotCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChzZXJ2aWNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1BPUlQiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlZk5hbWUoU3RyaW5nIHJlZk5hbWUpCi0gIHsKLSAgICBzZXRCaW5kaW5nTmFtZShyZWZOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVmTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZ05hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nTmFtZShTdHJpbmcgYmluZGluZ05hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdOYW1lID0gYmluZGluZ05hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbnRlbnQoKQotICB7Ci0gICAgRWxlbWVudCBwb3J0RWxlbWVudCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGkubmV4dCgpOwotICAgICAgaWYgKHBvcnQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcG9ydEVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocG9ydCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBkb0dlbmVyYXRlQ29udGVudCA9IGZhbHNlOwotICAgIGlmIChwb3J0RWxlbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qoc2VydmljZSk7Ci0gICAgICBwb3J0RWxlbWVudCA9IGNyZWF0ZVdTRExFbGVtZW50KHNlcnZpY2VFbGVtZW50LCAicG9ydCIpOwotICAgICAgcG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0gICAgICBkb0dlbmVyYXRlQ29udGVudCA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkb0dlbmVyYXRlQ29udGVudCA9IG92ZXJ3cml0ZTsKLSAgICB9Ci0KLSAgICBwb3J0RWxlbWVudC5zZXRBdHRyaWJ1dGUoImJpbmRpbmciLCBiaW5kaW5nTmFtZSAhPSBudWxsID8gYmluZGluZ05hbWUgOiAiIik7Ci0gICAgUG9ydCBwb3J0ID0gKFBvcnQpIFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChnZXREZWZpbml0aW9uKCksIHBvcnRFbGVtZW50KTsKLSAgICBuZXdDb21wb25lbnQgPSBwb3J0OwotCi0gICAgLy9wb3J0RWxlbWVudC4KLSAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5nZW5lcmF0ZVBvcnRDb250ZW50KHBvcnRFbGVtZW50LCBwb3J0KTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvU29hcENvbnRlbnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvU29hcENvbnRlbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViZjUyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL1NvYXBDb250ZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yOyAgCi0gICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNvYXBDb250ZW50R2VuZXJhdG9yIGltcGxlbWVudHMgQ29udGVudEdlbmVyYXRvcgoteyAKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgRE9DVU1FTlRfTElURVJBTCA9IDE7Ci0gIHByaXZhdGUgZmluYWwgaW50IFJQQ19MSVRFUkFMICAgICAgPSAyOwotICBwcml2YXRlIGZpbmFsIGludCBSUENfRU5DT0RFRCAgICAgID0gMzsKLQotICBwcm90ZWN0ZWQgaW50IGJpbmRpbmdPcHRpb24gPSBET0NVTUVOVF9MSVRFUkFMOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVZhbHVlID0gIiI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYWRkcmVzc0xvY2F0aW9uID0gQ29udGVudEdlbmVyYXRvci5BRERSRVNTX0xPQ0FUSU9OOyAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ1tdIHJlcXVpcmVkTmFtZXNwYWNlcyA9IHsiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyJ9OwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ1tdIHByZWZlcnJlZE5hbWVzcGFjZVByZWZpeGVzID0geyJzb2FwIn07Ci0KLQotICBwdWJsaWMgdm9pZCBpbml0KERlZmluaXRpb24gZGVmaW5pdGlvbiwgT2JqZWN0IGdlbmVyYXRvciwgT2JqZWN0W10gb3B0aW9ucykKLSAgeyAgICAgICAgICAgICAgCi0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3B0aW9uID0gY29tcHV0ZUJpbmRpbmdPcHRpb24ob3B0aW9ucyk7Ci0KLSAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDEgJiYgb3B0aW9uc1sxXSAhPSBudWxsKQotICAgICAgewotICAgICAgCWFkZHJlc3NMb2NhdGlvbiA9IChTdHJpbmcpb3B0aW9uc1sxXTsKLSAgICAgIH0gIAotICAgIH0KLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZVZhbHVlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9IAotICB9Ci0gIAotICBwcml2YXRlIGludCBjb21wdXRlQmluZGluZ09wdGlvbihPYmplY3RbXSBvcHRpb25zKSB7Ci0gIAlpbnQgb3B0aW9uID0gRE9DVU1FTlRfTElURVJBTDsKLSAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnNbMF0gIT0gbnVsbCkKLSAgICB7Ci0JCWJvb2xlYW4gaXNEb2N1bWVudExpdGVyYWxPcHRpb24gPSAoKEJvb2xlYW4pb3B0aW9uc1swXSkuYm9vbGVhblZhbHVlKCk7Ci0JCWlmIChpc0RvY3VtZW50TGl0ZXJhbE9wdGlvbikKLQkJCW9wdGlvbiA9ICBET0NVTUVOVF9MSVRFUkFMOwotCQllbHNlCi0JCQlvcHRpb24gPSBSUENfRU5DT0RFRDsJCQotCQkKLSAgICAJaWYgKG9wdGlvbnMubGVuZ3RoID49IDMgJiYgb3B0aW9uc1syXSAhPSBudWxsKSB7Ci0gICAgCQkvLyBFeHRyYSBpbmZvIHNlbnQgaW4KLSAgICAJCWlmICgoKEJvb2xlYW4pb3B0aW9uc1syXSkuYm9vbGVhblZhbHVlKCkpCi0gICAgCQkJb3B0aW9uID0gUlBDX0xJVEVSQUw7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gb3B0aW9uOwotICB9Ci0gICAgIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCkKLSAgewotICAgIHJldHVybiByZXF1aXJlZE5hbWVzcGFjZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQcmVmZXJyZWROYW1lc3BhY2VQcmVmaXhlcygpCi0gIHsKLSAgICByZXR1cm4gcHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXM7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoRWxlbWVudCBwb3J0RWxlbWVudCwgUG9ydCBwb3J0KQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChwb3J0RWxlbWVudCwgInNvYXAiLCAiYWRkcmVzcyIpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsIGFkZHJlc3NMb2NhdGlvbik7ICAgICAKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nQ29udGVudChFbGVtZW50IGJpbmRpbmdFbGVtZW50LCBQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ0VsZW1lbnQsICJzb2FwIiwgImJpbmRpbmciKTsKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgic3R5bGUiLCAoYmluZGluZ09wdGlvbiA9PSBET0NVTUVOVF9MSVRFUkFMKSA/ICJkb2N1bWVudCIgOiAicnBjIik7IAotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0cmFuc3BvcnQiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCAic29hcCIsICJvcGVyYXRpb24iKTsKLSAgICAKLSAgICBTdHJpbmcgc29hcEFjdGlvblZhbHVlID0gbmFtZXNwYWNlVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmICghc29hcEFjdGlvblZhbHVlLmVuZHNXaXRoKCIvIikpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIHNvYXBBY3Rpb25WYWx1ZSArPSAiLyI7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHNvYXBBY3Rpb25WYWx1ZSArPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJzb2FwQWN0aW9uIiwgc29hcEFjdGlvblZhbHVlKTsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nSW5wdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ0lucHV0RWxlbWVudCwgSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBnZW5lcmF0ZVNvYXBCb2R5KGJpbmRpbmdJbnB1dEVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3V0cHV0Q29udGVudChFbGVtZW50IGJpbmRpbmdPdXRwdXRFbGVtZW50LCBPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgZ2VuZXJhdGVTb2FwQm9keShiaW5kaW5nT3V0cHV0RWxlbWVudCk7Ci0gIH0gICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdGYXVsdENvbnRlbnQoRWxlbWVudCBiaW5kaW5nRmF1bHRFbGVtZW50LCBGYXVsdCBmYXVsdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ0ZhdWx0RWxlbWVudCwgInNvYXAiLCAiZmF1bHQiKTsgICAgICAKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIGZhdWx0LmdldE5hbWUoKSk7IAotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ1c2UiLCAoYmluZGluZ09wdGlvbiA9PSBSUENfRU5DT0RFRCkgPyAiZW5jb2RlZCIgOiAibGl0ZXJhbCIpOwotICAgIGlmIChiaW5kaW5nT3B0aW9uID09IFJQQ19FTkNPREVEKQotICAgIHsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJlbmNvZGluZ1N0eWxlIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgbmFtZXNwYWNlVmFsdWUpOwotICAgIH0KLSAgICBlbHNlIGlmIChiaW5kaW5nT3B0aW9uID09IFJQQ19MSVRFUkFMKSB7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiLCBuYW1lc3BhY2VWYWx1ZSk7Ci0gICAgfQotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNvYXBCb2R5KEVsZW1lbnQgcGFyZW50RWxlbWVudCkKLSAgeyAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBzb2FwQWN0aW9uVmFsdWUgPSAiIjsKLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNvYXBBY3Rpb25WYWx1ZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfSAgICAKLQotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQocGFyZW50RWxlbWVudCwgInNvYXAiLCAiYm9keSIpOyAgICAgIAotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ1c2UiLCAoYmluZGluZ09wdGlvbiA9PSBSUENfRU5DT0RFRCkgPyAiZW5jb2RlZCIgOiAibGl0ZXJhbCIpOyAKLSAgICBpZiAoYmluZGluZ09wdGlvbiA9PSBSUENfRU5DT0RFRCkKLSAgICB7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgiZW5jb2RpbmdTdHlsZSIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIsIG5hbWVzcGFjZVZhbHVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYmluZGluZ09wdGlvbiA9PSBSUENfTElURVJBTCkgewotICAgIAllbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgbmFtZXNwYWNlVmFsdWUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgIjoiICsgZWxlbWVudE5hbWUpIDogZWxlbWVudE5hbWU7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KG5hbWUpOwotICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL0NvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzgzMDk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWk7ICAKLSAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IuQWJzdHJhY3RHZW5lcmF0b3I7Ci0KLQotcHVibGljIGludGVyZmFjZSBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgaW5pdChBYnN0cmFjdEdlbmVyYXRvciBhYnN0cmFjdEdlbmVyYXRvcik7ICAgICAgICAgICAgIAotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlQXBwbGljYWJsZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvSHR0cEJpbmRpbmdPcHRpb25zUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9IdHRwQmluZGluZ09wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ODZhZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9IdHRwQmluZGluZ09wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IuQWJzdHJhY3RHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBIdHRwQmluZGluZ09wdGlvbnNQYWdlIGltcGxlbWVudHMgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQnV0dG9uIGdldEJ1dHRvbjsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBwb3N0QnV0dG9uOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBBYnN0cmFjdEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgcHVibGljIEh0dHBCaW5kaW5nT3B0aW9uc1BhZ2UoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgewotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb250cm9sLnNldExheW91dChsYXlvdXQpOwotCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgIAotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIG9wdGlvbnNIZWFkaW5nID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLSAgICBvcHRpb25zSGVhZGluZy5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0hUVFBfQklORElOR19PUFRJT05TIikpOwotCi0gICAgZ2V0QnV0dG9uID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUkFESU8pOwotICAgIGdldEJ1dHRvbi5zZXRUZXh0KCJIVFRQIEdFVCIpOwotICAgIGdldEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLSAgICBwb3N0QnV0dG9uID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUkFESU8pOwotICAgIHBvc3RCdXR0b24uc2V0VGV4dCgiSFRUUCBQT1NUIik7Ci0KLSAgICBpZiAoZ2VuZXJhdG9yLmdldE5hbWUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdlbmVyYXRvci5nZXREZWZpbml0aW9uKCk7Ci0gICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBnZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBkZWZpbml0aW9uLmdldEJpbmRpbmcocW5hbWUpOwotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBlZUxpc3QgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgaWYgKGVlTGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVlTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGVlKTsKLSAgICAgICAgICBTdHJpbmcgdmVyYiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZXJiIik7Ci0gICAgICAgICAgaWYgKCJQT1NUIi5lcXVhbHModmVyYikpCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICBwb3N0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwb3N0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGdldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQljb21wdXRlT3B0aW9ucygpOwotCQotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUFwcGxpY2FibGUoKQotICB7Ci0gIAlyZXR1cm4gdHJ1ZTsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQljb21wdXRlT3B0aW9ucygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZU9wdGlvbnMoKQotICB7Ci0gICAgT2JqZWN0W10gb3B0aW9ucyA9IG5ldyBPYmplY3RbMV07Ci0gICAgb3B0aW9uc1swXSA9IG5ldyBCb29sZWFuKHBvc3RCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIGdlbmVyYXRvci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvSHR0cFBvcnRPcHRpb25zUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9IdHRwUG9ydE9wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkODkzY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9IdHRwUG9ydE9wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5BYnN0cmFjdEdlbmVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgSHR0cFBvcnRPcHRpb25zUGFnZSBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSwgTW9kaWZ5TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgYWRkcmVzc0ZpZWxkOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBBYnN0cmFjdEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgcHVibGljIEh0dHBQb3J0T3B0aW9uc1BhZ2UoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgewotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb250cm9sLnNldExheW91dChsYXlvdXQpOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIG9wdGlvbnNIZWFkaW5nID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLSAgICBvcHRpb25zSGVhZGluZy5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0hUVFBfUE9SVF9ERVRBSUxTIikpOwotCi0gICAgQ29tcG9zaXRlIG5hbWVWYWx1ZUdyb3VwID0gbmV3IENvbXBvc2l0ZShjb250cm9sLCBTV1QuTk9ORSk7Ci0gICAgbmFtZVZhbHVlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQyID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGxheW91dDIubWFyZ2luV2lkdGggPSAwOwotICAgIG5hbWVWYWx1ZUdyb3VwLnNldExheW91dChsYXlvdXQyKTsKLQotICAgIExhYmVsIGFkZHJlc3NMYWJlbCA9IG5ldyBMYWJlbChuYW1lVmFsdWVHcm91cCwgU1dULk5PTkUpOwotICAgIGFkZHJlc3NMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xPQ0FUSU9OIikgKyAiICIpOwotICAgIGFkZHJlc3NGaWVsZCA9IG5ldyBUZXh0KG5hbWVWYWx1ZUdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICBhZGRyZXNzRmllbGQuc2V0VGV4dCgiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotICAgIGFkZHJlc3NGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBhZGRyZXNzRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlQXBwbGljYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gIHsKLSAgICBPYmplY3RbXSBvcHRpb25zID0gbmV3IE9iamVjdFsyXTsKLSAgICBvcHRpb25zWzFdID0gYWRkcmVzc0ZpZWxkLmdldFRleHQoKTsKLSAgICBnZW5lcmF0b3Iuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9Tb2FwQmluZGluZ09wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL1NvYXBCaW5kaW5nT3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliZjAyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL1NvYXBCaW5kaW5nT3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5BYnN0cmFjdEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNvYXBCaW5kaW5nT3B0aW9uc1BhZ2UgaW1wbGVtZW50cyBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBCdXR0b24gZG9jTGl0ZXJhbDsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBycGNMaXRlcmFsOwotICBwcm90ZWN0ZWQgQnV0dG9uIHJwY0VuY29kZWQ7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLSAgcHJvdGVjdGVkIEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcjsKLQotICBwdWJsaWMgU29hcEJpbmRpbmdPcHRpb25zUGFnZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoQWJzdHJhY3RHZW5lcmF0b3IgZ2VuZXJhdG9yKQotICB7Ci0gICAgdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIG9wdGlvbnNIZWFkaW5nID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLSAgICBvcHRpb25zSGVhZGluZy5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1NPQVBfQklORElOR19PUFRJT05TIikpOwotCi0gICAgZG9jTGl0ZXJhbCA9IG5ldyBCdXR0b24oY29udHJvbCwgU1dULlJBRElPKTsKLSAgICBkb2NMaXRlcmFsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfUkFESU9fRE9DVU1FTlRfTElURVJBTCIpKTsKLSAgICBkb2NMaXRlcmFsLnNldFNlbGVjdGlvbih0cnVlKTsKLQotICAgIHJwY0xpdGVyYWwgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5SQURJTyk7Ci0gICAgcnBjTGl0ZXJhbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1JBRElPX1JQQ19MSVRFUkFMIikpOwotICAgIAotICAgIHJwY0VuY29kZWQgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5SQURJTyk7Ci0gICAgcnBjRW5jb2RlZC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1JBRElPX1JQQ19FTkNPREVEIikpOwotCi0gICAgaWYgKGdlbmVyYXRvci5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZ2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKTsKLSAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3QgZWVMaXN0ID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGlmIChlZUxpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBlZUxpc3QuZ2V0KDApOwotCi0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGVlKTsKLSAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgic3R5bGUiKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoInJwYyIuZXF1YWxzKHN0eWxlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgUlBDIExpdGVyYWwgb3IgUlBDIEVuY29kZWQKLSAgICAgICAgICAJU3RyaW5nIHVzZSA9ICJlbmNvZGVkIjsKLSAgICAgICAgICAJTGlzdCBvcGVyYXRpb25zID0gYmluZGluZy5nZXRFQmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICAgICAgICAJaWYgKG9wZXJhdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgIAkJZWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgCQlCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcGVyYXRpb25zLmdldCgwKTsKLSAgICAgICAgICAJCWlmIChvcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpICE9IG51bGwgJiYgb3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgIAkJCU9iamVjdCBvYmplY3QgPSBvcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5nZXQoMCk7Ci0gICAgICAgICAgCQkJZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvYmplY3QpOwotICAgICAgICAgIAkJfQotICAgICAgICAgIAkJZWxzZSBpZiAob3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCAmJiBvcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgIAkJCU9iamVjdCBvYmplY3QgPSBvcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuZ2V0KDApOwotICAgICAgICAgIAkJCWVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgICAJCX0KLSAgICAgICAgICAJCWVsc2UgaWYgKG9wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAJCQlCaW5kaW5nRmF1bHQgZmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBvcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKS5nZXQoMCk7Ci0gICAgICAgICAgCQkJTGlzdCBmYXVsdEVFID0gZmF1bHQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgCQkJCi0gICAgICAgICAgCQkJaWYgKGZhdWx0RUUuc2l6ZSgpID4gMCkgewotICAgICAgICAgIAkJCQllbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGZhdWx0RUUuZ2V0KDApKTsKLSAgICAgICAgICAJCQl9Ci0gICAgICAgICAgCQl9Ci0gICAgICAgICAgCQkKLSAgICAgICAgICAJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAJCQl1c2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidXNlIik7Ci0gICAgICAgICAgCQl9Ci0gICAgICAgICAgCX0KLSAgICAgICAgICAJCi0gICAgICAgICAgCWlmICh1c2UgIT0gbnVsbCAmJiAibGl0ZXJhbCIuZXF1YWxzKHVzZSkpIHsKLSAgICAgICAgICAJCWRvY0xpdGVyYWwuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAJCXJwY0xpdGVyYWwuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIAkJcnBjRW5jb2RlZC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgIAl9Ci0gICAgICAgICAgCWVsc2UgeyAgICAgICAgICAJCi0gICAgICAgICAgCQlkb2NMaXRlcmFsLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgCQlycGNMaXRlcmFsLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgCQlycGNFbmNvZGVkLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAJfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGRvY0xpdGVyYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgcnBjTGl0ZXJhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBycGNFbmNvZGVkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGNvbXB1dGVPcHRpb25zKCk7Ci0KLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlQXBwbGljYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gICAgY29tcHV0ZU9wdGlvbnMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVPcHRpb25zKCkKLSAgewotICAgIE9iamVjdFtdIG9wdGlvbnMgPSBuZXcgT2JqZWN0WzNdOwotICAgIG9wdGlvbnNbMF0gPSBuZXcgQm9vbGVhbihkb2NMaXRlcmFsLmdldFNlbGVjdGlvbigpKTsKLSAgICBvcHRpb25zWzJdID0gbmV3IEJvb2xlYW4ocnBjTGl0ZXJhbC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgZ2VuZXJhdG9yLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9Tb2FwUG9ydE9wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL1NvYXBQb3J0T3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiYzYwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL1NvYXBQb3J0T3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5BYnN0cmFjdEdlbmVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgU29hcFBvcnRPcHRpb25zUGFnZSBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSwgTW9kaWZ5TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgYWRkcmVzc0ZpZWxkOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBBYnN0cmFjdEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgcHVibGljIFNvYXBQb3J0T3B0aW9uc1BhZ2UoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgewotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb250cm9sLnNldExheW91dChsYXlvdXQpOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIG9wdGlvbnNIZWFkaW5nID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLSAgICBvcHRpb25zSGVhZGluZy5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1NPQVBfUE9SVF9ERVRBSUxTIikpOwotCi0gICAgQ29tcG9zaXRlIG5hbWVWYWx1ZUdyb3VwID0gbmV3IENvbXBvc2l0ZShjb250cm9sLCBTV1QuTk9ORSk7Ci0gICAgbmFtZVZhbHVlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQyID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGxheW91dDIubWFyZ2luV2lkdGggPSAwOwotICAgIG5hbWVWYWx1ZUdyb3VwLnNldExheW91dChsYXlvdXQyKTsKLQotICAgIExhYmVsIGFkZHJlc3NMYWJlbCA9IG5ldyBMYWJlbChuYW1lVmFsdWVHcm91cCwgU1dULk5PTkUpOwotICAgIGFkZHJlc3NMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xPQ0FUSU9OIikgKyAiICIpOwotICAgIGFkZHJlc3NGaWVsZCA9IG5ldyBUZXh0KG5hbWVWYWx1ZUdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICBhZGRyZXNzRmllbGQuc2V0VGV4dCgiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotICAgIGFkZHJlc3NGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBhZGRyZXNzRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlQXBwbGljYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gIHsKLSAgICBPYmplY3RbXSBvcHRpb25zID0gbmV3IE9iamVjdFsyXTsKLSAgICBvcHRpb25zWzFdID0gYWRkcmVzc0ZpZWxkLmdldFRleHQoKTsKLSAgICBnZW5lcmF0b3Iuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9JbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL0ltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5NmNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL0ltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvcgotewotICBWZWN0b3IgaW1wb3J0ZWRGaWxlczsKLQotICBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKCkKLSAgewotICAgIGltcG9ydGVkRmlsZXMgPSBuZXcgVmVjdG9yKCk7IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBJUmVzb3VyY2VEZWx0YSByZXNvdXJjZURlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAocmVzb3VyY2VEZWx0YSAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgcmVzb3VyY2VEZWx0YS5hY2NlcHQodGhpcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0vLyAgICAgIEIyQkdVSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRXhjZXB0aW9uIGNhdWdodCBkdXJpbmcgcmVzb3VyY2UgY2hhbmdlIiArIGUpOwotLy8gICAgICBCMkJHVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGVDdXJyZW50VGhyZWFkKCk7IAotICAgIH0gICAgICAKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKQotICB7Ci0gICAgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkKLSAgICB7Ci0gICAgICBpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICAgICAgaW1wb3J0ZWRGaWxlcy5hZGQoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0SW1wb3J0ZWRGaWxlcygpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0ZWRGaWxlczsKLSAgfQotICAgIAotICAvLyBUaGlzIHJldHVybnMgdGhlIGZpcnN0IGltcG9ydGVkIGZpbGUgaW4gdGhlIGxpc3Qgb2YgaW1wb3J0ZWQgZmlsZXMKLSAgcHVibGljIElGaWxlIGdldEltcG9ydGVkRmlsZSgpCi0gIHsKLSAgICBpZiAoaW1wb3J0ZWRGaWxlcy5pc0VtcHR5KCkgPT0gZmFsc2UpIAotICAgICAgcmV0dXJuIChJRmlsZSlpbXBvcnRlZEZpbGVzLmZpcnN0RWxlbWVudCgpOwotICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9JbnZva2VTZXREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvSW52b2tlU2V0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTg2NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9JbnZva2VTZXREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5XU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMuV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMuV1NETFNldENvbXBvbmVudEhlbHBlcjsKLQotcHVibGljIGNsYXNzIEludm9rZVNldERpYWxvZwotewotICBTdHJpbmcga2luZDsKLSAgU3RyaW5nIG5ld1ZhbHVlID0gIiI7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3VmFsdWU7IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oT2JqZWN0IGlucHV0LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgICBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0gICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICBJRmlsZSBpRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExFbGVtZW50KSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgU3RyaW5nIHByb3BlcnR5ID0gIiI7Ci0gICAgICBMaXN0IGxvb2t1cFBhdGhzID0gbmV3IEFycmF5TGlzdCgyKTsKLSAgICAgIAotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgewotICAgICAgICBTdHJpbmcgZGlhbG9nVGl0bGUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9TUEVDSUZZX1BPUlRUWVBFIik7Ci0gICAgICAgIAotICAgICAgICBXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyKGlGaWxlLCBkZWZpbml0aW9uLCBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSk7Ci0gICAgICAgIGRpYWxvZyA9IG5ldyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgcHJvdmlkZXIpOwotICAgICAgICBwcm92aWRlci5zZXREaWFsb2coZGlhbG9nKTsKLSAgICAgICAgcHJvcGVydHkgPSAidHlwZSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgUG9ydCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBkaWFsb2dUaXRsZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NQRUNJRllfQklORElORyIpOwotICAgICAgICAKLSAgICAgICAgV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihpRmlsZSwgZGVmaW5pdGlvbiwgV1NETENvbnN0YW50cy5CSU5ESU5HKTsKLSAgICAgICAgZGlhbG9nID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIGRpYWxvZ1RpdGxlLCBwcm92aWRlcik7Ci0gICAgICAgIHByb3ZpZGVyLnNldERpYWxvZyhkaWFsb2cpOwotICAgICAgICBwcm9wZXJ0eSA9ICJiaW5kaW5nIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KQotICAgIHsKLSAgICAgICAgTGlzdCB2YWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotICAgICAgICB2YWxpZEV4dGVuc2lvbnMuYWRkKCJ3c2RsIik7Ci0gICAgICAgIHZhbGlkRXh0ZW5zaW9ucy5hZGQoInhzZCIpOwotICAgICAgICBsb29rdXBQYXRocyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0gICAgICAgIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0gICAgICAgIGlmIChraW5kLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSkgewotICAgICAgICAgICAgcHJvcGVydHkgPSAiIjsgCi0gICAgICAgICAgICBTdHJpbmcgZGlhbG9nVGl0bGUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9TUEVDSUZZX1RZUEUiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJvdmlkZXIgPSBuZXcgV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyKGlGaWxlLCBkZWZpbml0aW9uLCBXU0RMQ29uc3RhbnRzLlRZUEUsIHZhbGlkRXh0ZW5zaW9ucyk7Ci0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgZGlhbG9nVGl0bGUsIHByb3ZpZGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByb3BlcnR5ID0gIiI7IAotICAgICAgICAgICAgU3RyaW5nIGRpYWxvZ1RpdGxlID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU1BFQ0lGWV9FTEVNRU5UIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByb3ZpZGVyID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihpRmlsZSwgZGVmaW5pdGlvbiwgV1NETENvbnN0YW50cy5FTEVNRU5ULCB2YWxpZEV4dGVuc2lvbnMpOwotICAgICAgICAgICAgZGlhbG9nID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIGRpYWxvZ1RpdGxlLCBwcm92aWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdmlkZXIuc2V0RGlhbG9nKGRpYWxvZyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSW5wdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBPdXRwdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBkaWFsb2dUaXRsZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NQRUNJRllfTUVTU0FHRSIpOwotCi0gICAgICAgIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG5ldyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIoaUZpbGUsIGRlZmluaXRpb24sIFdTRExDb25zdGFudHMuTUVTU0FHRSk7Ci0gICAgICAgIGRpYWxvZyA9IG5ldyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgcHJvdmlkZXIpOyAgIAotICAgICAgICBwcm92aWRlci5zZXREaWFsb2coZGlhbG9nKTsKLSAgICAgICAgcHJvcGVydHkgPSAibWVzc2FnZSI7Ci0gICAgfQotCi0gICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLQotICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICBXU0RMU2V0Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG5ldyBXU0RMU2V0Q29tcG9uZW50SGVscGVyKGlGaWxlLCBkZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKGtpbmQgIT0gbnVsbCAmJiBraW5kLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSkgewotICAgICAgICAgICAgaGVscGVyLnNldFhTRFR5cGVDb21wb25lbnQoKFBhcnQpIGlucHV0LCBkaWFsb2cuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGtpbmQgIT0gbnVsbCAmJiBraW5kLmVxdWFsc0lnbm9yZUNhc2UoImVsZW1lbnQiKSl7Ci0gICAgICAgICAgICBoZWxwZXIuc2V0WFNERWxlbWVudENvbXBvbmVudCgoUGFydCkgaW5wdXQsIGRpYWxvZy5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBoZWxwZXIuc2V0V1NETENvbXBvbmVudCgoV1NETEVsZW1lbnQpIGlucHV0LCBwcm9wZXJ0eSwgZGlhbG9nLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0gCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETENvbXBvbmVudEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMQ29tcG9uZW50RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzUwMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMQ29tcG9uZW50RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54bWwuWE1MQ29tcG9uZW50RmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54bWwuWE1MUXVpY2tTY2FuOwotCi1wdWJsaWMgY2xhc3MgV1NETENvbXBvbmVudEZpbmRlciBleHRlbmRzIFhNTENvbXBvbmVudEZpbmRlciB7Ci0gICAgTGlzdCBsb29rdXBUYWdQYXRoczsKLSAgICAKLSAgICBwdWJsaWMgV1NETENvbXBvbmVudEZpbmRlcihMaXN0IHRhZ1BhdGhzKSB7Ci0gICAgICAgIGxvb2t1cFRhZ1BhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsb29rdXBUYWdQYXRocy5hZGRBbGwodGFnUGF0aHMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdCBnZXRXb3JrYmVuY2hSZXNvdXJjZUNvbXBvbmVudHMoaW50IHNjb3BlKSB7Ci0gICAgICAgIExpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBmaWxlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHNlYXJjaCB0aHJvdWdoIHRoZSBjdXJyZW50IGZpbGUgd2UncmUgd29ya2luZyBvbi4KLSAgICAgICAgaWYgKGN1cnJlbnRJRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBleGNsdWRlRmlsZXMuYWRkKGN1cnJlbnRJRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEZpbmQgZmlsZXMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYSBzcGVjaWZpZWQgaW4gTGlzdCBleHRlbnNpb25zIGFuZAotICAgICAgICAvLyBMaXN0IGV4Y2x1ZGVGaWxlcy4KLSAgICAgICAgc3dpdGNoIChzY29wZSkgewotICAgICAgICBjYXNlIEVOQ0xPU0lOR19QUk9KRUNUX1NDT1BFOgotICAgICAgICAgICAgZmlsZVBhdGhzID0gZ2V0RW5jbG9zaW5nUHJvamVjdEZpbGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICBjYXNlIEVOVElSRV9XT1JLU1BBQ0VfU0NPUEU6Ci0gICAgICAgICAgICBmaWxlUGF0aHMgPSBnZXRXb3Jrc3BhY2VGaWxlcygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBjb21wb25lbnRzIGluIGVhY2ggb2YgdGhlIGZpbGVzIHNwZWNpZmllZCBpbiB0aGUgcGF0aC4KLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmdbXSBuYW1lQXR0ciA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICAgIG5hbWVBdHRyWzBdID0gIm5hbWUiOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZChuYW1lQXR0cik7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5hbWVBdHRyKTsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQobmFtZUF0dHIpOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZChuYW1lQXR0cik7Ci0KLSAgICAgICAgSXRlcmF0b3IgcGF0aHNJdGVyYXRvciA9IGZpbGVQYXRocy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocGF0aHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLS8vICAgICAgICAgICBTdHJpbmcgc3RyaW5nUGF0aCA9ICgoUGF0aCkgcGF0aHNJdGVyYXRvci5uZXh0KCkpLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgU3RyaW5nIHN0cmluZ1BhdGggPSAoKFBhdGgpIHBhdGhzSXRlcmF0b3IubmV4dCgpKS50b1N0cmluZygpOwotICAgICAgICAgICBjb21wb25lbnRzLmFkZEFsbChYTUxRdWlja1NjYW4uZ2V0VGFnSW5mbyhzdHJpbmdQYXRoLCBsb29rdXBUYWdQYXRocywgYXR0cmlidXRlcykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29tcG9uZW50czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL1dTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU2NDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLmNvbW1vbi5JQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTZWxlY3Rpb25EaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgWE1MQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIHsKLQkKLSAgICBwdWJsaWMgV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBJQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoc2hlbGwsIGRpYWxvZ1RpdGxlLCBwcm92aWRlcik7Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL1dTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxMWExOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL1dTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5JbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnR5cGVzeXN0ZW0uRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5jb21tb24uSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sLlhNTENvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNESW1wb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTFRfSU5fVFlQRSA9ICJCVUlMVF9JTl9UWVBFIjsKLSAgICAKLSAgICBwcml2YXRlIFdTRExDb21wb25lbnRGaW5kZXIgd3NkbENvbXBvbmVudEZpbmRlcjsKLSAgICBwcml2YXRlIFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nOwotICAgIHByaXZhdGUgV1NETENvbXBvbmVudExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLSAgICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgICBwcml2YXRlIExpc3QgbG9va3VwVGFnUGF0aHM7Ci0gICAgcHJpdmF0ZSBpbnQga2luZDsKLSAgICAKLSAgICAvKgotICAgICAqIFRha2VzIGluIHRoZSBJRmlsZSB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmcuCi0gICAgICovCi0gICAgcHVibGljIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihJRmlsZSBmaWxlLCBEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCBraW5kKSB7Ci0gICAgCXRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICAgIExpc3QgdmFsaWRFeHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgICAgICB2YWxpZEV4dC5hZGQoIndzZGwiKTsKLSAgICAgICAgdGhpcy5sb29rdXBUYWdQYXRocyA9IGdldExvb2t1cFRhZ1BhdGgoKTsKLSAgICAgICAgd3NkbENvbXBvbmVudEZpbmRlciA9IG5ldyBXU0RMQ29tcG9uZW50RmluZGVyKGxvb2t1cFRhZ1BhdGhzKTsKLSAgICAgICAgd3NkbENvbXBvbmVudEZpbmRlci5zZXRGaWxlKGZpbGUpOwotICAgICAgICB3c2RsQ29tcG9uZW50RmluZGVyLnNldFZhbGlkRXh0ZW5zaW9ucyh2YWxpZEV4dCk7Ci0gICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgICAgIGxhYmVsUHJvdmlkZXIgPSBuZXcgV1NETENvbXBvbmVudExhYmVsUHJvdmlkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0TG9va3VwVGFnUGF0aCgpCi0gICAgeyAgICAJCi0gICAgCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAJc3dpdGNoIChraW5kKQotCQl7Ci0JCWNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLQkJewotCQkJbGlzdC5hZGQoIi9kZWZpbml0aW9ucy9iaW5kaW5nIik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFdTRExDb25zdGFudHMuUE9SVF9UWVBFIDoKLQkJewotCQkJbGlzdC5hZGQoIi9kZWZpbml0aW9ucy9wb3J0VHlwZSIpOwotCQkJYnJlYWs7Ci0JCX0JCi0JCWNhc2UgV1NETENvbnN0YW50cy5NRVNTQUdFIDoKLQkJewotCQkJbGlzdC5hZGQoIi9kZWZpbml0aW9ucy9tZXNzYWdlIik7Ci0JCQlicmVhazsKLQkJfSAgIAotCQljYXNlIFdTRExDb25zdGFudHMuVFlQRSA6Ci0JCXsKLQkJCWxpc3QuYWRkKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKTsKLQkJCWxpc3QuYWRkKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2NvbXBsZXhUeXBlIik7Ci0JCQlsaXN0LmFkZCgiL3NjaGVtYS9jb21wbGV4VHlwZSIpOwotCQkJbGlzdC5hZGQoIi9zY2hlbWEvc2ltcGxlVHlwZSIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBXU0RMQ29uc3RhbnRzLkVMRU1FTlQgOgotCQl7Ci0JCQlsaXN0LmFkZCgiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9lbGVtZW50Iik7Ci0JCQlsaXN0LmFkZCgiL3NjaGVtYS9lbGVtZW50Iik7Ci0JCQlicmVhazsKLQkJfQotCQl9ICAgIAkKLSAgICAJcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihJRmlsZSBmaWxlLCBEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCBraW5kLCBMaXN0IHZhbGlkRXh0KSB7Ci0gICAgICAgIHRoaXMoZmlsZSwgZGVmaW5pdGlvbiwga2luZCk7Ci0gICAgICAgIHdzZGxDb21wb25lbnRGaW5kZXIuc2V0VmFsaWRFeHRlbnNpb25zKHZhbGlkRXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGlhbG9nKFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nKSB7Ci0gICAgICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXU0RMQ29tcG9uZW50T2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBMaXN0IGlucHV0Q29tcG9uZW50cywgU3RyaW5nIHRhZ1BhdGgpIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBpbnB1dENvbXBvbmVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG5ldyBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKHRhZ1BhdGgpOyAKLSAgICAgICAgICAgIHNwZWMuYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIHdzZGxFbGVtZW50LmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgICAgICAgICBzcGVjLnNldFRhcmdldE5hbWVzcGFjZSh3c2RsRWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24od3NkbEVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgc3BlYy5zZXRGaWxlTG9jYXRpb24obm9ybWFsaXplZEZpbGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGREYXRhSXRlbVRvVHJlZU5vZGUobGlzdCwgc3BlYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMoSUNvbXBvbmVudExpc3QgbGlzdCwgTGlzdCBpbnB1dENvbXBvbmVudHMsIFN0cmluZyB0YWdQYXRoKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gaW5wdXRDb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IHhzZEVsZW1lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG5ldyBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKHRhZ1BhdGgpOyAKLSAgICAgICAgICAgIHNwZWMuYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIHhzZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHNwZWMuc2V0VGFyZ2V0TmFtZXNwYWNlKHhzZEVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oeHNkRWxlbWVudC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIHNwZWMuc2V0RmlsZUxvY2F0aW9uKG5vcm1hbGl6ZWRGaWxlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYWRkRGF0YUl0ZW1Ub1RyZWVOb2RlKGxpc3QsIHNwZWMpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBnZXRDb21wb25lbnRzKElDb21wb25lbnRMaXN0IGxpc3QsIGJvb2xlYW4gcXVpY2spIHsKLSAgICAgICAgaWYgKHF1aWNrKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB0YWdzID0gbG9va3VwVGFnUGF0aHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlICh0YWdzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGdldENvbXBvbmVudHNRdWljayhsaXN0LCAoU3RyaW5nKSB0YWdzLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGNvbXBvbmVudHMgZnJvbSB3b3Jrc3BhY2UgbG9jYXRpb25zCi0gICAgICAgICAgICBTdHJpbmcgc2NvcGUgPSAiIjsKLSAgICAgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNjb3BlID0gZGlhbG9nLmdldFNlYXJjaFNjb3BlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgY29tcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKFhNTENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5TQ09QRV9FTkNMT1NJTkdfUFJPSkVDVCkpIHsKLSAgICAgICAgICAgICAgICBjb21wcyA9IHdzZGxDb21wb25lbnRGaW5kZXIuZ2V0V29ya2JlbmNoUmVzb3VyY2VDb21wb25lbnRzKFhNTENvbXBvbmVudEZpbmRlci5FTkNMT1NJTkdfUFJPSkVDVF9TQ09QRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzY29wZS5lcXVhbHMoWE1MQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nLlNDT1BFX1dPUktTUEFDRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wcyA9IHdzZGxDb21wb25lbnRGaW5kZXIuZ2V0V29ya2JlbmNoUmVzb3VyY2VDb21wb25lbnRzKFhNTENvbXBvbmVudEZpbmRlci5FTlRJUkVfV09SS1NQQUNFX1NDT1BFKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSXRlcmF0b3IgY29tcHNJdCA9IGNvbXBzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY29tcHNJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIGl0ZW0gPSAoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgY29tcHNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYWRkRGF0YUl0ZW1Ub1RyZWVOb2RlKGxpc3QsIGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBnZXRDb21wb25lbnRzUXVpY2soSUNvbXBvbmVudExpc3QgbGlzdCwgU3RyaW5nIHRhZ1BhdGgpIHsKLSAgICAgICAgLy8gR3JhYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgZmlsZQotICAgICAgICBpZiAodGFnUGF0aC5lcXVhbHMoIi9kZWZpbml0aW9ucy9iaW5kaW5nIikpIHsKLSAgICAgICAgICAgIC8vIEdyYWIgZXhwbGljdGx5IGRlZmluZWQgY29tcG9uZW50cwotICAgICAgICAgICAgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKSwgdGFnUGF0aCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdyYWIgZGlyZWN0bHkgaW1wb3J0ZWQgY29tcG9uZW50cwotICAgICAgICAgICAgSXRlcmF0b3IgaW1wb3J0c0l0ID0gZ2V0V1NETEZpbGVJbXBvcnRzKGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKSkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpbXBvcnRzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSW1wb3J0IGltcG9ydEl0ZW0gPSAoSW1wb3J0KSBpbXBvcnRzSXQubmV4dCgpOwotICAgICAgICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0RGVmaW5pdGlvbiA9IGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBMaXN0IGltcG9ydGVkQ29tcG9uZW50cyA9IGltcG9ydERlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgaW1wb3J0ZWRDb21wb25lbnRzLCB0YWdQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0YWdQYXRoLmVxdWFscygiL2RlZmluaXRpb25zL3BvcnRUeXBlIikpIHsKLSAgICAgICAgICAgIC8vIEdyYWIgZXhwbGljdGx5IGRlZmluZWQgY29tcG9uZW50cwotICAgICAgICAgICAgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCksIHRhZ1BhdGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHcmFiIGRpcmVjdGx5IGltcG9ydGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydHNJdCA9IGdldFdTRExGaWxlSW1wb3J0cyhkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaW1wb3J0c0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0c0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGltcG9ydERlZmluaXRpb24gPSBpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRlZENvbXBvbmVudHMgPSBpbXBvcnREZWZpbml0aW9uLmdldEVQb3J0VHlwZXMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjcmVhdGVXU0RMQ29tcG9uZW50T2JqZWN0cyhsaXN0LCBpbXBvcnRlZENvbXBvbmVudHMsIHRhZ1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvbWVzc2FnZSIpKSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGV4cGxpY3RseSBkZWZpbmVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGNyZWF0ZVdTRExDb21wb25lbnRPYmplY3RzKGxpc3QsIGRlZmluaXRpb24uZ2V0RU1lc3NhZ2VzKCksIHRhZ1BhdGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHcmFiIGRpcmVjdGx5IGltcG9ydGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydHNJdCA9IGdldFdTRExGaWxlSW1wb3J0cyhkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaW1wb3J0c0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0c0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGltcG9ydERlZmluaXRpb24gPSBpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRlZENvbXBvbmVudHMgPSBpbXBvcnREZWZpbml0aW9uLmdldEVNZXNzYWdlcygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNyZWF0ZVdTRExDb21wb25lbnRPYmplY3RzKGxpc3QsIGltcG9ydGVkQ29tcG9uZW50cywgdGFnUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9kZWZpbml0aW9ucy90eXBlcy9zY2hlbWEvY29tcGxleFR5cGUiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNESW5saW5lVHlwZXNPYmplY3RzKGxpc3QsIHRhZ1BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNESW5saW5lVHlwZXNPYmplY3RzKGxpc3QsIHRhZ1BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2VsZW1lbnQiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNERWxlbWVudE9iamVjdHMobGlzdCwgdGFnUGF0aCk7Ci0gICAgICAgICAgICBjcmVhdGVSZWd1bGFySW1wb3J0WFNERWxlbWVudE9iamVjdHMobGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9zY2hlbWEvY29tcGxleFR5cGUiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNESW5saW5lV3JhcHBlclR5cGVPYmplY3RzKGxpc3QsIHRhZ1BhdGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjcmVhdGVYU0RCdWlsdEluVHlwZU9iamVjdHMobGlzdCk7Ci0gICAgICAgICAgICBjcmVhdGVSZWd1bGFySW1wb3J0WFNEVHlwZU9iamVjdHMobGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9zY2hlbWEvc2ltcGxlVHlwZSIpKSB7Ci0gICAgICAgICAgICBjcmVhdGVYU0RJbmxpbmVXcmFwcGVyVHlwZU9iamVjdHMobGlzdCwgdGFnUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9zY2hlbWEvZWxlbWVudCIpKSB7Ci0gICAgICAgICAgICBjcmVhdGVYU0RJbmxpbmVXcmFwcGVyRWxlbWVudE9iamVjdHMobGlzdCwgdGFnUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0IGdldFdTRExGaWxlSW1wb3J0cyhMaXN0IHdzZGxJbXBvcnRzKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSB3c2RsSW1wb3J0cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJbXBvcnRJbXBsIGltcG9ydEl0ZW0gPSAoSW1wb3J0SW1wbCkgaXQubmV4dCgpOwotICAgICAgICAgICAgaW1wb3J0SXRlbS5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsgICAgICAgICAgLy8gTG9hZCBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgIGlmIChpbXBvcnRJdGVtLmdldEVTY2hlbWEoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoaW1wb3J0SXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlWFNEQnVpbHRJblR5cGVPYmplY3RzKElDb21wb25lbnRMaXN0IGxpc3QpIHsgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgWFNERE9NSGVscGVyLmRhdGFUeXBlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYnVpbHRJbiA9IFhTRERPTUhlbHBlci5kYXRhVHlwZVtpXVswXTsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG5ldyBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKEJVSUxUX0lOX1RZUEUpOyAKLSAgICAgICAgICAgIHNwZWMuYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIGJ1aWx0SW4pOwotICAgICAgICAgICAgc3BlYy5zZXRUYXJnZXROYW1lc3BhY2UoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLQotLy8gICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKTsKLS8vICAgICAgICAgICAgc3BlYy5zZXRGaWxlTG9jYXRpb24obm9ybWFsaXplZEZpbGUpOwotICAgICAgICAgICAgc3BlYy5zZXRGaWxlTG9jYXRpb24oIkJ1aWx0LWluIik7ICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGREYXRhSXRlbVRvVHJlZU5vZGUobGlzdCwgc3BlYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZ3VsYXJJbXBvcnRYU0RUeXBlT2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0KSB7Ci0gICAgICAgIC8vIEhhbmRsZSByZWd1bGFyIGltcG9ydHMoeHNkIGFuZCB3c2RsKS4KLSAgICAgICAgSXRlcmF0b3IgaW1wb3J0cyA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW1wb3J0cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0cy5uZXh0KCk7Ci0gICAgICAgICAgICAoKEltcG9ydEltcGwpIGltcG9ydEl0ZW0pLmltcG9ydERlZmluaXRpb25PclNjaGVtYSgpOwotICAgICAgICAgICAgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXhQYXRoID0gIiI7Ci0gICAgICAgICAgICBTdHJpbmcgc2ltcGxlUGF0aCA9ICIiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEltcG9ydCBpcyBhIHhzZCBmaWxlCi0gICAgICAgICAgICAgICAgc2NoZW1hcy5hZGQoaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCkpOwotICAgICAgICAgICAgICAgIGNvbXBsZXhQYXRoID0gIi9zY2hlbWEvY29tcGxleFR5cGUiOwotICAgICAgICAgICAgICAgIHNpbXBsZVBhdGggPSAiL3NjaGVtYS9zaW1wbGVUeXBlIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW1wb3J0IGlzIGEgd3NkbCBmaWxlCi0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaW1wb3J0SXRlbS5nZXRFRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmdldEVUeXBlcygpICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgSXRlcmF0b3Igc2NoZW1hSXQgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCSAgICAgICAgICAgICAgICB3aGlsZSAoc2NoZW1hSXQuaGFzTmV4dCgpKSB7Ci0JICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlZUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHNjaGVtYUl0Lm5leHQoKTsKLQkgICAgICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkKGVlRWxlbWVudC5nZXRTY2hlbWEoKSk7Ci0JICAgICAgICAgICAgICAgICAgICBjb21wbGV4UGF0aCA9ICIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2NvbXBsZXhUeXBlIjsKLQkgICAgICAgICAgICAgICAgICAgIHNpbXBsZVBhdGggPSAiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9zaW1wbGVUeXBlIjsKLQkgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNjaGVtYXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNjaGVtYUl0ID0gc2NoZW1hcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChzY2hlbWFJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgdHlwZXNJdCA9ICgoWFNEU2NoZW1hKSBzY2hlbWFJdC5uZXh0KCkpLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgY29tcGxleExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Qgc2ltcGxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHR5cGVzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29tcG9uZW50ID0gdHlwZXNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleExpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZUxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMobGlzdCwgY29tcGxleExpc3QsIGNvbXBsZXhQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlWFNEQ29tcG9uZW50T2JqZWN0cyhsaXN0LCBzaW1wbGVMaXN0LCBzaW1wbGVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZ3VsYXJJbXBvcnRYU0RFbGVtZW50T2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0KSB7Ci0gICAgICAgIC8vIEhhbmRsZSByZWd1bGFyIGltcG9ydHMoeHNkIGFuZCB3c2RsKS4KLSAgICAgICAgSXRlcmF0b3IgaW1wb3J0cyA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW1wb3J0cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0cy5uZXh0KCk7Ci0gICAgICAgICAgICAoKEltcG9ydEltcGwpIGltcG9ydEl0ZW0pLmltcG9ydERlZmluaXRpb25PclNjaGVtYSgpOwotICAgICAgICAgICAgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGltcG9ydEl0ZW0uZ2V0RVNjaGVtYSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBJbXBvcnQgaXMgYSB4c2QgZmlsZQotICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkKGltcG9ydEl0ZW0uZ2V0RVNjaGVtYSgpKTsKLSAgICAgICAgICAgICAgICBwYXRoID0gIi9zY2hlbWEvZWxlbWVudCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEltcG9ydCBpcyBhIHdzZGwgZmlsZQotICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNjaGVtYUl0ID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkgICAgICAgICAgICAgICAgd2hpbGUgKHNjaGVtYUl0Lmhhc05leHQoKSkgewotCSAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWVFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBzY2hlbWFJdC5uZXh0KCk7Ci0JICAgICAgICAgICAgICAgICAgICBzY2hlbWFzLmFkZChlZUVsZW1lbnQuZ2V0U2NoZW1hKCkpOwotCSAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2VsZW1lbnQiOwotCSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc2NoZW1hcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Igc2NoZW1hSXQgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNjaGVtYUl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBMaXN0IGVsZW1lbnRMaXN0ID0gKChYU0RTY2hlbWEpIHNjaGVtYUl0Lm5leHQoKSkuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBjcmVhdGVYU0RDb21wb25lbnRPYmplY3RzKGxpc3QsIGVsZW1lbnRMaXN0LCBwYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVhTRElubGluZVR5cGVzT2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBTdHJpbmcgdGFnUGF0aCkgewotICAgICAgICAvLyBIYW5kbGUgaW5saW5lIHNjaGVtYXMKLSAgICAJaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgPT0gbnVsbCkgewotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCQotICAgICAgICBJdGVyYXRvciBpbmxpbmVTY2hlbWFzSXQgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldFNjaGVtYXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW5saW5lU2NoZW1hc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGlubGluZVNjaGVtYXNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiAhc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBrZWVwVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHR5cGVJdGVyYXRvciA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IHVud2FudGVkIFR5cGVzCi0gICAgICAgICAgICAgICAgICAgIGlmICh0YWdQYXRoLmVxdWFscygiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9jb21wbGV4VHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHlwZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB0eXBlID0gdHlwZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHR5cGUpLmdldFNjaGVtYSgpLmVxdWFscyhzY2hlbWEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBUeXBlcy5hZGQodHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHR5cGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdHlwZSA9IHR5cGVJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0U2NoZW1hKCkuZXF1YWxzKHNjaGVtYSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMobGlzdCwga2VlcFR5cGVzLCB0YWdQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVYU0RFbGVtZW50T2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBTdHJpbmcgdGFnUGF0aCkgewotICAgIAlpZiAoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJCi0gICAgICAgIEl0ZXJhdG9yIGlubGluZVNjaGVtYXNJdCA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbmxpbmVTY2hlbWFzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgaW5saW5lU2NoZW1hc0l0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCBrZWVwRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwgJiYgIXNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgZWxlbWVudEl0ID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50SXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbG9vayBmb3IgZWxlbWVudHMgZXhwbGljaXRseSBkZWZpbmVkIGluIHRoZSBTY2hlbWEgKG5vdCB0aHJvdWdoIGltcG9ydHMpLgotICAgICAgICAgICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4c2RFbGVtZW50LmdldFNjaGVtYSgpLmVxdWFscyhzY2hlbWEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZWVwRWxlbWVudHMuYWRkKHhzZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMobGlzdCwga2VlcEVsZW1lbnRzLCB0YWdQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlWFNESW5saW5lV3JhcHBlclR5cGVPYmplY3RzKElDb21wb25lbnRMaXN0IGxpc3QsIFN0cmluZyB0YWdQYXRoKSB7Ci0gICAgICAgIC8vIEhhbmRsZSBpbmxpbmUgc2NoZW1hcwotICAgIAlpZiAoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJCi0gICAgICAgIEl0ZXJhdG9yIGlubGluZVNjaGVtYXNJdCA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbmxpbmVTY2hlbWFzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgaW5saW5lU2NoZW1hc0l0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsIHx8IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBrZWVwVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY29udGVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhTRFNjaGVtYUNvbnRlbnQgY29udGVudCA9IChYU0RTY2hlbWFDb250ZW50KSBjb250ZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZChjb250ZW50KTsgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaW1wb3J0SXRlcmF0b3IgPSBpbXBvcnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGltcG9ydEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBYU0RJbXBvcnQgaW1wb3J0T2JqZWN0ID0gKFhTREltcG9ydCkgaW1wb3J0SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWEgaW1wb3J0U2NoZW1hID0gKChYU0RJbXBvcnRJbXBsKSBpbXBvcnRPYmplY3QpLmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciB0eXBlc0l0ID0gaW1wb3J0U2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHR5cGVPYmplY3QgPSB0eXBlc0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdQYXRoLmVxdWFscygiL3NjaGVtYS9jb21wbGV4VHlwZSIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBUeXBlcy5hZGQodHlwZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YWdQYXRoLmVxdWFscygiL3NjaGVtYS9zaW1wbGVUeXBlIikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPYmplY3QgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBUeXBlcy5hZGQodHlwZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY3JlYXRlWFNEQ29tcG9uZW50T2JqZWN0cyhsaXN0LCBrZWVwVHlwZXMsIHRhZ1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVYU0RJbmxpbmVXcmFwcGVyRWxlbWVudE9iamVjdHMoSUNvbXBvbmVudExpc3QgbGlzdCwgU3RyaW5nIHRhZ1BhdGgpIHsKLSAgICAJaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgPT0gbnVsbCkgewotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCQotICAgICAgICBJdGVyYXRvciBpbmxpbmVTY2hlbWFzSXQgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldFNjaGVtYXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW5saW5lU2NoZW1hc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGlubGluZVNjaGVtYXNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCB8fCBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBMaXN0IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgY29udGVudHMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0cy5hZGQoY29udGVudCk7ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydEl0ZXJhdG9yID0gaW1wb3J0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpbXBvcnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgWFNESW1wb3J0IGltcG9ydE9iamVjdCA9IChYU0RJbXBvcnQpIGltcG9ydEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hIGltcG9ydFNjaGVtYSA9ICgoWFNESW1wb3J0SW1wbCkgaW1wb3J0T2JqZWN0KS5pbXBvcnRTY2hlbWEoKTsKLQotICAgICAgICAgICAgICAgICAgICBjcmVhdGVYU0RDb21wb25lbnRPYmplY3RzKGxpc3QsIGltcG9ydFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCksIHRhZ1BhdGgpOyAgICAKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgICBwcml2YXRlIElUeXBlU3lzdGVtUHJvdmlkZXIgZ2V0VHlwZVN5c3RlbVByb3ZpZGVyKCkgewotICAgICAgICAgICAgSVR5cGVTeXN0ZW1Qcm92aWRlciBwcm92aWRlciA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0VHlwZVN5c3RlbVByb3ZpZGVyKGRlZmluaXRpb24pOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlcikgewotICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gKEV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIpIHByb3ZpZGVyOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7Ci0gICAgICB9Ci0KLSAgICAKLSAgCi0gICAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVyOwotICAgIH0gICAgCi0gICAgCi0JcHVibGljIFN0cmluZyBnZXRMaXN0VGl0bGUoKSB7Ci0KLQkJc3dpdGNoIChraW5kKQotCQl7Ci0JCWNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLQkJewotCQkJcmV0dXJuICJNYXRjaGluZyBCaW5kaW5nczoiOwotCQl9Ci0JCWNhc2UgV1NETENvbnN0YW50cy5QT1JUX1RZUEUgOgotCQl7Ci0JCQlyZXR1cm4gIk1hdGNoaW5nIFBvcnQgVHlwZXM6IjsKLQkJfQkKLQkJY2FzZSBXU0RMQ29uc3RhbnRzLk1FU1NBR0UgOgotCQl7Ci0JCQlyZXR1cm4gIk1hdGNoaW5nIE1lc3NhZ2VzOiI7Ci0JCX0gICAKLQkJY2FzZSBXU0RMQ29uc3RhbnRzLlRZUEUgOgotCQl7Ci0JCQlyZXR1cm4gIk1hdGNoaW5nIFR5cGVzOiI7Ci0JCX0KLQkJY2FzZSBXU0RMQ29uc3RhbnRzLkVMRU1FTlQgOgotCQl7Ci0JCQlyZXR1cm4gIk1hdGNoaW5nIEVsZW1lbnRzOiI7Ci0JCX0KLQkJfSAgICAJCi0JCXJldHVybiBudWxsOwkgICAKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVGaWVsZFRpdGxlKCkgewotCQkKLQkJc3dpdGNoIChraW5kKQotCQl7Ci0JCWNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLQkJewotCQkJcmV0dXJuICJCaW5kaW5nIE5hbWU6IjsKLQkJfQotCQljYXNlIFdTRExDb25zdGFudHMuUE9SVF9UWVBFIDoKLQkJewotCQkJcmV0dXJuICJQb3J0IFR5cGUgTmFtZToiOwotCQl9CQotCQljYXNlIFdTRExDb25zdGFudHMuTUVTU0FHRSA6Ci0JCXsKLQkJCXJldHVybiAiTWVzc2FnZSBOYW1lOiI7Ci0JCX0gICAKLQkJY2FzZSBXU0RMQ29uc3RhbnRzLlRZUEUgOgotCQl7Ci0JCQlyZXR1cm4gIlR5cGUgTmFtZToiOwotCQl9Ci0JCWNhc2UgV1NETENvbnN0YW50cy5FTEVNRU5UIDoKLQkJewotCQkJcmV0dXJuICJFbGVtZW50IE5hbWU6IjsKLQkJfQotCQl9ICAgIAkKLQkJcmV0dXJuIG51bGw7CSAgIAotCX0KLSAgICBwdWJsaWMgY2xhc3MgV1NETENvbXBvbmVudExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBYTUxDb21wb25lbnRTZWxlY3Rpb25MYWJlbFByb3ZpZGVyIHsKLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBYTUxDb21wb25lbnRUcmVlT2JqZWN0IHNwZWNpZmljYXRpb24gPSAoWE1MQ29tcG9uZW50VHJlZU9iamVjdCkgZWxlbWVudDsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IChYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBzcGVjaWZpY2F0aW9uLmdldFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24oKS5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAoc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvZGVmaW5pdGlvbnMvYmluZGluZyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvYmluZGluZ19vYmouZ2lmIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzcGVjLmdldFRhZ1BhdGgoKS5lcXVhbHMoIi9kZWZpbml0aW9ucy9wb3J0VHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvcG9ydF9vYmouZ2lmIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzcGVjLmdldFRhZ1BhdGgoKS5lcXVhbHMoIi9kZWZpbml0aW9ucy9tZXNzYWdlIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9tZXNzYWdlX29iai5naWYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscygiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9jb21wbGV4VHlwZSIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICBzcGVjLmdldFRhZ1BhdGgoKS5lcXVhbHMoIi9zY2hlbWEvY29tcGxleFR5cGUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRENvbXBsZXhUeXBlLmdpZiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKSB8fAotICAgICAgICAgICAgICAgICAgICAgc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvc2NoZW1hL3NpbXBsZVR5cGUiKSB8fAotICAgICAgICAgICAgICAgICAgICAgc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCJCVUlMVF9JTl9UWVBFIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2VsZW1lbnQiKSB8fAotICAgICAgICAgICAgICAgICAgICAgc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvc2NoZW1hL2VsZW1lbnQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIik7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETFNldENvbXBvbmVudEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMU2V0Q29tcG9uZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjgwNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMU2V0Q29tcG9uZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRJbXBvcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sLlhNTENvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFDb250ZW50OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMU2V0Q29tcG9uZW50SGVscGVyIHsKLSAgICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgICBwcml2YXRlIElGaWxlIGN1cnJlbnRJRmlsZTsKLSAgICAKLSAgICBwdWJsaWMgV1NETFNldENvbXBvbmVudEhlbHBlcihJRmlsZSBpRmlsZSwgRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgICAgIGN1cnJlbnRJRmlsZSA9IGlGaWxlOwotICAgICAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMQ29tcG9uZW50KFdTRExFbGVtZW50IGlucHV0RWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMpIHsKLSAgICAgICAgYWRkSW1wb3J0SWZOZWNlc3Nhcnkoc3BlYyk7Ci0gICAgICAgIFN0cmluZyBjb21wb25lbnRPYmplY3QgPSBnZXRQcmVmaXhlZENvbXBvbmVudE5hbWUoc3BlYyk7Ci0KLSAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCB3c2RsRWxlbWVudCA9IGlucHV0RWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBkZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIHdzZGxFbGVtZW50LnNldEF0dHJpYnV0ZShwcm9wZXJ0eSwgY29tcG9uZW50T2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0WFNEVHlwZUNvbXBvbmVudChQYXJ0IHBhcnQsIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBpZiAoIXNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscyhXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIuQlVJTFRfSU5fVFlQRSkpIHsKLSAgICAgICAgICAgIGFkZEltcG9ydElmTmVjZXNzYXJ5KHNwZWMpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjb21wb25lbnRPYmplY3QgPSBnZXRQcmVmaXhlZENvbXBvbmVudE5hbWUoc3BlYyk7Ci0gICAgICAgIAotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZSgoUGFydCkgcGFydCwgdHJ1ZSwgY29tcG9uZW50T2JqZWN0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0WFNERWxlbWVudENvbXBvbmVudChQYXJ0IHBhcnQsIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBhZGRJbXBvcnRJZk5lY2Vzc2FyeShzcGVjKTsKLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudE9iamVjdCA9IGdldFByZWZpeGVkQ29tcG9uZW50TmFtZShzcGVjKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwuc2V0Q29tcG9uZW50UmVmZXJlbmNlKChQYXJ0KSBwYXJ0LCBmYWxzZSwgY29tcG9uZW50T2JqZWN0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gdGhlIHByZWZpeGVkIGNvbXBvbmVudCBuYW1lIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4KLSAgICAgKiBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeGVkQ29tcG9uZW50TmFtZShYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBzcGVjLmdldEF0dHJpYnV0ZUluZm8oIm5hbWUiKTsKLSAgICAgICAgTGlzdCBwcmVmaXhlcyA9IGdldFByZWZpeGVzKGRlZmluaXRpb24sIHNwZWMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBpZiAocHJlZml4ZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbmFtZSA9IHByZWZpeGVzLmdldCgwKSArICI6IiArIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0gICAgICAgICAKLSAgICAgICAgICAKLSAgICBwcml2YXRlIExpc3QgZ2V0UHJlZml4ZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTWFwIG1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdGhlTmFtZXNwYWNlID0gKFN0cmluZykgbWFwLmdldChwcmVmaXgpOwotICAgICAgICAgICAgaWYgKHRoZU5hbWVzcGFjZSAhPSBudWxsICYmIHRoZU5hbWVzcGFjZS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEltcG9ydElmTmVjZXNzYXJ5KFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIGl0c2VsZgotICAgICAgICBTdHJpbmcgY3VycmVudEZpbGVMb2NhdGlvbiA9IGN1cnJlbnRJRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChjdXJyZW50RmlsZUxvY2F0aW9uLmVxdWFscyhzcGVjLmdldEZpbGVMb2NhdGlvbigpKSkgewotICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHJlZ3VsYXIgSW1wb3J0cwotICAgICAgICBpZiAoIWZvdW5kTWF0Y2gpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydHNJdCA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoaW1wb3J0c0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpbXBvcnRMb2NhdGlvbiA9ICIiOwotICAgICAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0c0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydExvY2F0aW9uID0gZ2V0Tm9ybWFsaXplZExvY2F0aW9uKHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0RGVmaW5pdGlvbiA9IGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0TG9jYXRpb24gPSBnZXROb3JtYWxpemVkTG9jYXRpb24oaW1wb3J0RGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKTsgCi0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgIAotICAgICAgICAgICAgICAgIGlmIChpbXBvcnRMb2NhdGlvbi5lcXVhbHMoc3BlYy5nZXRGaWxlTG9jYXRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgaW5saW5lIFNjaGVtYXMKLSAgICAgICAgaWYgKCFmb3VuZE1hdGNoKSB7Ci0gICAgICAgICAgICBMaXN0IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmdldEVUeXBlcygpICE9IG51bGwpIHsKLQkgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCkuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCSAgICAgICAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlZUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLQkgICAgICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGVlRWxlbWVudC5nZXRTY2hlbWEoKTsKLQkgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsIHx8IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoIiIpKSB7ICAgICAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLQkgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb250ZW50cy5oYXNOZXh0KCkpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgY29udGVudHMubmV4dCgpOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0KSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKGNvbnRlbnQpOyAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydEl0ID0gaW1wb3J0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGltcG9ydEl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFhTREltcG9ydCBpbXBvcnRJdGVtID0gKFhTREltcG9ydCkgaW1wb3J0SXQubmV4dCgpOwotICAgICAgICAgICAgICAgIFhTRFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGltcG9ydEl0ZW0uZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSByZXNvbHZlZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpbXBvcnRMb2NhdGlvbiA9IGdldE5vcm1hbGl6ZWRMb2NhdGlvbihyZXNvbHZlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGltcG9ydExvY2F0aW9uLmVxdWFscyhzcGVjLmdldEZpbGVMb2NhdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZE1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIWZvdW5kTWF0Y2gpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gd3NpU3R5bGVJbXBvcnQgPSBpc1hTRFNjaGVtYUZpbGUoc3BlYyk7Ci0gICAgICAgICAgICBpZiAod3NpU3R5bGVJbXBvcnQpIHsKLSAgICAgICAgICAgICAgICBBZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb24gYWN0aW9uID0gbmV3IEFkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbihkZWZpbml0aW9uLCBzcGVjLmdldFRhcmdldE5hbWVzcGFjZSgpLCAieHNkIik7Ci0gICAgICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShuZXcgUGF0aChzcGVjLmdldEZpbGVMb2NhdGlvbigpKSwgY3VycmVudElGaWxlLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIEFkZFdTSVNjaGVtYUltcG9ydEFjdGlvbiBhZGRJbXBvcnQgPSBuZXcgQWRkV1NJU2NoZW1hSW1wb3J0QWN0aW9uKGRlZmluaXRpb24sIHNwZWMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBhZGRJbXBvcnQucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3U2VsZWN0ZWRGaWxlTG9jID0gc3BlYy5nZXRGaWxlTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudEZpbGVMb2MgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVsYXRpdmVMb2MgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVSZWxhdGl2ZVVSSShuZXdTZWxlY3RlZEZpbGVMb2MsIGN1cnJlbnRGaWxlTG9jLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHNwZWMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQWRkSW1wb3J0QWN0aW9uIGFkZEltcG9ydEFjdGlvbiA9IG5ldyBBZGRJbXBvcnRBY3Rpb24obnVsbCwgZGVmaW5pdGlvbiwgZGVmaW5pdGlvbkVsZW1lbnQsIHByZWZpeCwgbmFtZXNwYWNlLCByZWxhdGl2ZUxvYyk7Ci0gICAgICAgICAgICAgICAgYWRkSW1wb3J0QWN0aW9uLnJ1bigpOyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVQcmVmaXggPSBnZXRVbmlxdWVQcmVmaXgoZGVmaW5pdGlvbiwgcHJlZml4KTsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyB1bmlxdWVQcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoKLSAgICAgKiBUcnkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwYXNzZWQgaW4gWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZWZlcnMgdG8KLSAgICAgKiBhbiBYU0Qgb3IgV1NETCBmaWxlLiAgSWYgaXQncyBhbiBYU0QsIHJldHVybiB0cnVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1hTRFNjaGVtYUZpbGUoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTG9jYXRpb24gPSBzcGVjLmdldEZpbGVMb2NhdGlvbigpOwotICAgICAgICBpbnQgcGVyaW9kSW5kZXggPSBmaWxlTG9jYXRpb24ubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwZXJpb2RJbmRleCA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBmaWxlTG9jYXRpb24uc3Vic3RyaW5nKHBlcmlvZEluZGV4ICsgMSk7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInhzZCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZVByZWZpeChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBpbml0UHJlZml4KSB7Ci0gICAgICBTdHJpbmcgdW5pcXVlUHJlZml4OwotICAgICAgTWFwIG1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotCi0gICAgICBpZiAoZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UoaW5pdFByZWZpeCkgPT0gbnVsbCkgewotICAgICAgICB1bmlxdWVQcmVmaXggPSBpbml0UHJlZml4OwotICAgICAgfQotICAgICAgZWxzZSB7Ly8gaWYgdXNlZCwgdGhlbiB0cnkgdG8gY3JlYXRlIGEgdW5pcXVlIG9uZQotICAgICAgICBTdHJpbmcgdGVtcFByZWZpeCA9IGluaXRQcmVmaXg7Ci0gICAgICAgIGludCBpID0gMTsKLSAgICAgICAgd2hpbGUobWFwLmNvbnRhaW5zS2V5KHRlbXBQcmVmaXggKyBpKSkgewotICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICB1bmlxdWVQcmVmaXggPSB0ZW1wUHJlZml4ICsgaTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB1bmlxdWVQcmVmaXg7ICAgIAotICAgIH0gCi0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9ybWFsaXplZExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgICAgICAgVVJMIHJlc29sdmVkVVJMID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpOwotICAgICAgICAgICAgbG9jYXRpb24gPSByZXNvbHZlZFVSTC5nZXRQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbG9jYXRpb247IAotICAgICAgfQotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNjQyOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gbWFuaWZlc3RzIGFuZCByZWdpc3RlcnMgZWFjaCBleHRlbnNpYmlsaXR5IGl0ZW0gdHJlZSBwcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeSBleHRlbmRzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeQotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9QUk9WSURFUl9QUk9QRVJUWSA9ICJsYWJlbFByb3ZpZGVyQ2xhc3MiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BST1ZJREVSX1BST1BFUlRZID0gImNvbnRlbnRQcm92aWRlckNsYXNzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBVFRfTkFNRVMgPSB7ICJsYWJlbFByb3ZpZGVyQ2xhc3MiLCAiY29udGVudFByb3ZpZGVyQ2xhc3MiIH07Ci0KLSAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIHJldHVybiAoSUxhYmVsUHJvdmlkZXIpIGdldFByb3BlcnR5KG5hbWVzcGFjZSwgTEFCRUxfUFJPVklERVJfUFJPUEVSVFkpOwotICB9Ci0KLSAgcHVibGljIElUcmVlQ2hpbGRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIHJldHVybiAoSVRyZWVDaGlsZFByb3ZpZGVyKSBnZXRQcm9wZXJ0eShuYW1lc3BhY2UsIENPTlRFTlRfUFJPVklERVJfUFJPUEVSVFkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSURldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lEZXRhaWxzVmlld2VyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNDc0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSURldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURldGFpbHNWaWV3ZXJQcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0Vmlld2VyS2V5KE9iamVjdCBtb2RlbE9iamVjdCk7Ci0gIHB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKE9iamVjdCBtb2RlbE9iamVjdCwgQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lFZGl0UGFydFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSUVkaXRQYXJ0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjODIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSUVkaXRQYXJ0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFZGl0UGFydFByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZU1lbnVBY3Rpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsIE9iamVjdCBvYmplY3QpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZmOTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBJTWVudUFjdGlvbkNvbnRyaWJ1dG9yCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZU1lbnVBY3Rpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsIE9iamVjdCBvYmplY3QpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTW9kZWxRdWVyeUNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU1vZGVsUXVlcnlDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2EyYTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTW9kZWxRdWVyeUNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTW9kZWw7Ci0gICAgICAgICAgICAgICAgICAgCi0vLyBOb3RlIHRoaXMgY2xhc3Mgd2lsbCBsaWtlbHkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlIHdoZW4gdGhlIE1vZGVsUXVlcnkncyBleHRlbnNpb24gbWVjaGFuaXNtIGlzIHVwZGF0ZWQKLS8vCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFF1ZXJ5Q29udHJpYnV0b3IKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChJRE9NTW9kZWwgeG1sTW9kZWwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5NTZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KE9iamVjdCBwYXJlbnRNb2RlbE9iamVjdCwgRWxlbWVudFtdIGVsZW1lbnRDaGFpbiwgaW50IHN0YXJ0LCBpbnRbXSBlbmQpOwotICBwdWJsaWMgTm9kZSBnZXROb2RlKE9iamVjdCBtb2RlbE9iamVjdCk7IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTm9kZVJlY29uY2lsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTm9kZVJlY29uY2lsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjZmViYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU5vZGVSZWNvbmNpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBJTm9kZVJlY29uY2lsZXIKLXsKLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChPYmplY3QgbW9kZWxPYmplY3QsIEVsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lUcmVlQ2hpbGRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lUcmVlQ2hpbGRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWMzODBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JVHJlZUNoaWxkUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYWxsb3dzIGV4dGVuc2lvbiB3cml0ZXJzIHRvIHByb3ZpZGUgc3BlY2lhbGl6ZSB0cmVlIGNvbnRlbnQgYmVoYXZpb3VyLgotICogSXQgaXMgaW50ZW5kZWQgdG8gYmVoYXZlIHNpbWlsYXIgdG8gdGhlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIuCi0gKiBUaGUgbWFqb3IgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgY2xhc3MgaXMgc2ltcGxpZmllZCBzbyB0aGF0IG9ubHkgb25lIG1ldGhvZCBpcyBpbnZvbHZlZC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpICAJCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRyZWVDaGlsZFByb3ZpZGVyCi17Ci0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lUeXBlU3lzdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDBlZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lUeXBlU3lzdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVR5cGVTeXN0ZW1Qcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOX1RZUEUgPSAweDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxUX0lOX1RZUEUgPSAweDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVJfREVGSU5FRF9TSU1QTEVfVFlQRSA9IDB4MjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFUl9ERUZJTkVEX0NPTVBMRVhfVFlQRSA9IDB4NDsKLQotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUeXBlTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBpbnQgdHlwZU5hbWVDYXRlZ29yeSk7Ci0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUVsZW1lbnROYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24pOyAgCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVR5cGVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSwgaW50IHR5cGVOYW1lQ2F0ZWdvcnkpOwotICBwdWJsaWMgaW50IGdldENhdGVnb3J5Rm9yVHlwZU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUpOwotICBwdWJsaWMgTGlzdCBnZXRQcmVmaXhlZE5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL05TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL05TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2I3ZWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9OU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIHByb3RlY3RlZCBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTE9BRElOR19FUlJPUiA9ICJQTFVHSU5fTE9BRElOR19FUlJPUiI7Ci0KLSAgcHVibGljIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIEV4dGVuc2lvbkluZm8gaW5mbyA9IChFeHRlbnNpb25JbmZvKSBtYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgaWYgKGluZm8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbmZvID0gbmV3IFNpbmdsZVByb3BlcnR5RXh0ZW5zaW9uSW5mbyhjbGFzc05hbWUsIGNsYXNzTG9hZGVyKTsKLSAgICAgIG1hcC5wdXQobmFtZXNwYWNlVVJJLCBpbmZvKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgSGFzaE1hcCBwcm9wZXJ0eVRvQ2xhc3NOYW1lTWFwLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIEV4dGVuc2lvbkluZm8gaW5mbyA9IChFeHRlbnNpb25JbmZvKSBtYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgaWYgKGluZm8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbmZvID0gbmV3IE11bHRpUHJvcGVydHlFeHRlbnNpb25JbmZvKHByb3BlcnR5VG9DbGFzc05hbWVNYXAsIGNsYXNzTG9hZGVyKTsKLSAgICAgIG1hcC5wdXQobmFtZXNwYWNlVVJJLCBpbmZvKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgRXh0ZW5zaW9uSW5mbyBpbmZvID0gKEV4dGVuc2lvbkluZm8pIG1hcC5nZXQobmFtZXNwYWNlVVJJKTsKLSAgICByZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mby5nZXRPYmplY3QoIiIpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgRXh0ZW5zaW9uSW5mbyBpbmZvID0gKEV4dGVuc2lvbkluZm8pIG1hcC5nZXQobmFtZXNwYWNlVVJJKTsKLSAgICByZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mby5nZXRPYmplY3QocHJvcGVydHkpIDogbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaW9uSW5mbwotICB7Ci0gICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCi0gICAgcHVibGljIEV4dGVuc2lvbkluZm8oQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gICAgewotICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBwcm9wZXJ0eSk7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFNpbmdsZVByb3BlcnR5RXh0ZW5zaW9uSW5mbyBleHRlbmRzIEV4dGVuc2lvbkluZm8KLSAgewotICAgIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotICAgIHByb3RlY3RlZCBPYmplY3Qgb2JqZWN0OwotICAgIHByb3RlY3RlZCBib29sZWFuIGVycm9yOwotCi0gICAgcHVibGljIFNpbmdsZVByb3BlcnR5RXh0ZW5zaW9uSW5mbyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgICB7Ci0gICAgICBzdXBlcihjbGFzc0xvYWRlcik7Ci0gICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIENsYXNzIHRoZUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpIDogQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgIG9iamVjdCA9IHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgb2JqZWN0ID0gUExVR0lOX0xPQURJTkdfRVJST1I7Ci0gICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG9iamVjdCAhPSBQTFVHSU5fTE9BRElOR19FUlJPUiA/IG9iamVjdCA6IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBNdWx0aVByb3BlcnR5RXh0ZW5zaW9uSW5mbyBleHRlbmRzIEV4dGVuc2lvbkluZm8KLSAgewotICAgIHByb3RlY3RlZCBIYXNoTWFwIHByb3BlcnR5VG9DbGFzc05hbWVUYWJsZTsKLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcm9wZXJ0eVRvT2JqZWN0VGFibGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIE11bHRpUHJvcGVydHlFeHRlbnNpb25JbmZvKEhhc2hNYXAgcHJvcGVydFRvQ2xhc3NOYW1lVGFibGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICAgIHsKLSAgICAgIHN1cGVyKGNsYXNzTG9hZGVyKTsKLSAgICAgIHRoaXMucHJvcGVydHlUb0NsYXNzTmFtZVRhYmxlID0gcHJvcGVydFRvQ2xhc3NOYW1lVGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIHByb3BlcnR5VG9DbGFzc05hbWVUYWJsZS5nZXQocHJvcGVydHkpOwotICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwcm9wZXJ0eVRvT2JqZWN0VGFibGUuZ2V0KHByb3BlcnR5KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICByZXN1bHQgPSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgcHJvcGVydHlUb09iamVjdFRhYmxlLnB1dChwcm9wZXJ0eSwgcmVzdWx0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5VG9PYmplY3RUYWJsZS5wdXQocHJvcGVydHksIFBMVUdJTl9MT0FESU5HX0VSUk9SKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBMVUdJTl9MT0FESU5HX0VSUk9SOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQkgIHJldHVybiByZXN1bHQgIT0gUExVR0lOX0xPQURJTkdfRVJST1IgPyByZXN1bHQgOiBudWxsOyAgICAgIAotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9XU0RMRWRpdG9yRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vV1NETEVkaXRvckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJhZjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9XU0RMRWRpdG9yRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV1NETEVkaXRvckV4dGVuc2lvbgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRMSU5FX1RSRUVfQ09OVEVOVF9QUk9WSURFUiA9IDE7ICAgIC8vIHJlcSdkIGZvciBtb2RlbCBiYXNlZCBleHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUTElORV9MQUJFTF9QUk9WSURFUiA9IDI7ICAgICAgICAgICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVOVV9BQ1RJT05fQ09OVFJJQlVUT1IgPSAzOyAgICAgICAgICAvLyBub2RlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVEFJTFNfVklFV0VSX1BST1ZJREVSID0gNDsgICAgICAgICAgLy8gbm9kZQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfUEFSVF9GQUNUT1JZID0gNTsgICAgICAgICAgICAgICAgLy8gcmVxJ2QgZm9yIG1vZGVsIGJhc2VkIGV4dAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NZU1RFTV9QUk9WSURFUiA9IDY7ICAgICAgICAgICAgIC8vIHJlcSdkIGZvciB0eXBlIHN5c3RlbSBleHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9SRUNPTkNJTEVSID0gNzsgICAgICAgICAgICAgICAgICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PREVfQVNTT0NJQVRJT05fUFJPVklERVIgPSA4OyAgICAgICAgLy8gcmVxJ2QgZm9yIG1vZGVsIGJhc2VkIGV4dAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9RVUVSWV9DT05UUklCVVRPUiA9IDk7ICAgICAgICAgIC8vIHJlcSdkIGZvciBtb2RlbCBiYXNlZCBleHQKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TT1VSQ0VfUFJPVklERVIgPSAxMDsgICAgICAgIC8vIHJlcSdkIGZvciBtb2RlbCBiYXNlZCBleHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0VDVElPTl9ERVNDUklQVE9SX1BST1ZJREVSID0gMTE7ICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhTRF9ERUxFVEVfQUNUSU9OID0gMTI7Ci0gIAotICBib29sZWFuIGlzRXh0ZW5zaW9uVHlwZVN1cHBvcnRlZChpbnQgdHlwZSk7Ci0gIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE9iamVjdCBtb2RlbE9iamVjdCk7Ci0gIE9iamVjdCBjcmVhdGVFeHRlbnNpb25PYmplY3QoaW50IHR5cGUsIFdTRExFZGl0b3Igd3NkbEVkaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL1dTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL1dTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGUyNDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLSAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5Ci17ICAgICAgICAgICAgICAgICAgIAotICAvL3Byb3RlY3RlZCBMaXN0IGNsYXNzTmFtZUNsYXNzTG9hZGVyUGFpckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIC8vcHJvdGVjdGVkIEhhc2hNYXAgdHJlZVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsgCi0gIHByb3RlY3RlZCBMaXN0IHJlZ2lzdGVyZWRFeHRlbnNpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIHB1YmxpYyBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKQotICB7Ci0gICAgYWRkKG5ldyBXU0RMRWRpdG9yLkJ1aWx0SW5XU0RMRWRpdG9yRXh0ZW5zaW9uKCkpOwotICB9ICAgICAgICAgICAgCi0KLSAgLy9wdWJsaWMgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXIgZ2V0RXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXIoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgLy97Ci0gIC8vICByZXR1cm4gKEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyKXRyZWVQcm92aWRlck1hcC5nZXQobmFtZXNwYWNlVVJJKTsKLSAgLy99Ci0KLSAgLy9wdWJsaWMgdm9pZCBwdXRFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcihTdHJpbmcgbmFtZXNwYWNlVVJJLCBFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlciB0cmVlUHJvdmlkZXIpCi0gIC8vewotICAvLyAgdHJlZVByb3ZpZGVyTWFwLnB1dChuYW1lc3BhY2VVUkksIHRyZWVQcm92aWRlcik7Ci0gIC8vfQotICAKLSAgcHVibGljIExpc3QgZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZWdpc3RlcmVkRXh0ZW5zaW9uTGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgV1NETEVkaXRvckV4dGVuc2lvbiBnZXRBcHBsaWNhYmxlRXh0ZW5zaW9uKGludCB0eXBlLCBPYmplY3Qgb2JqZWN0KQotICB7IAotICAgIFdTRExFZGl0b3JFeHRlbnNpb24gcmVzdWx0ID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgV1NETEVkaXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSAoV1NETEVkaXRvckV4dGVuc2lvbilpLm5leHQoKTsKLSAgICAgIGlmIChleHRlbnNpb24uaXNFeHRlbnNpb25UeXBlU3VwcG9ydGVkKHR5cGUpICYmIGV4dGVuc2lvbi5pc0FwcGxpY2FibGUob2JqZWN0KSkKLSAgICAgIHsgCi0gICAgICAgIHJlc3VsdCA9IGV4dGVuc2lvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotCi0gIHB1YmxpYyBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoaW50IHR5cGUpCi0gIHsgCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChXU0RMRWRpdG9yRXh0ZW5zaW9uKWkubmV4dCgpOwotICAgICAgaWYgKGV4dGVuc2lvbi5pc0V4dGVuc2lvblR5cGVTdXBwb3J0ZWQodHlwZSkpCi0gICAgICB7IAotICAgICAgICBsaXN0LmFkZChleHRlbnNpb24pOwotICAgICAgfQotICAgIH0gCi0KLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gcmVzdWx0ID0gbmV3IFdTRExFZGl0b3JFeHRlbnNpb25bbGlzdC5zaXplKCldOwotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsgCi0gICAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChXU0RMRWRpdG9yRXh0ZW5zaW9uKWkubmV4dCgpOwotICAgICAgcmVzdWx0W2NvdW50XSA9IGV4dGVuc2lvbjsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBhZGRBc0ZpcnN0KFdTRExFZGl0b3JFeHRlbnNpb24gZXh0ZW5zaW9uKQotICB7ICAgICAgICAgICAgICAgCi0gICAgZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoKS5hZGQoMCwgZXh0ZW5zaW9uKTsKLSAgfSAgICAKLQotICBwdWJsaWMgdm9pZCBhZGQoV1NETEVkaXRvckV4dGVuc2lvbiBleHRlbnNpb24pCi0gIHsgICAgICAgICAgICAgICAKLSAgICBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucygpLmFkZChleHRlbnNpb24pOwotICB9ICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGFkZChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgU3RyaW5nIGNsYXNzTmFtZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyBUT0RPLi4uIGNvbnNpZGVyIGRlZmVyZWQgaW5zdGFudGlhdGlvbiBvZiBXU0RMRWRpdG9yRXh0ZW5zaW9ucyAgICAgICAgIAotICAgIHRyeQotICAgIHsgICAgICAgCi0gICAgICBDbGFzcyB0aGVDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSA6IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgIFdTRExFZGl0b3JFeHRlbnNpb24gZXh0ZW5zaW9uID0gKFdTRExFZGl0b3JFeHRlbnNpb24pdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgIHJlZ2lzdGVyZWRFeHRlbnNpb25MaXN0LmFkZChleHRlbnNpb24pOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWJmMGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciAKLXsKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKTsgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL0h0dHBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5MjU5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIgaW1wbGVtZW50cyBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyCi17ICAKLSAgcHVibGljIEh0dHBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyKCkKLSAgewotICB9ICAJCi0JCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRDb250ZXh0KEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUgPSBwYXJlbnRFbGVtZW50LmdldExvY2FsTmFtZSgpOwotCWlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImJpbmRpbmciKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJiaW5kaW5nIik7IAkgIAotCX0JICAKLQllbHNlIGlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoIm9wZXJhdGlvbiIpKQotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoIm9wZXJhdGlvbiIpOyAKLQl9Ci0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJpbnB1dCIpIHx8IAotCSAgICAgICAgIHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygib3V0cHV0IikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYm9keSIpIHx8IAotCSAgICAgICAgICAgbG9jYWxOYW1lLmVxdWFscygiaGVhZGVyIik7IAkgIAotCX0JCi0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJmYXVsdCIpKQotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoImZhdWx0Iik7IAkgIAotCX0KLQllbHNlIGlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoInBvcnQiKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJhZGRyZXNzIik7IAkgIAotCX0JCi0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9NaW1lRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWE3MDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9NaW1lRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIgaW1wbGVtZW50cyBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyCi17ICAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX05BTUVTUEFDRV9VUkk9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iOwotICBwdWJsaWMgTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIoKQotICB7Ci0gIH0gIAkKLQkKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gIAlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWVzcGFjZSA9IHBhcmVudEVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgCWlmIChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSS5lcXVhbHMocGFyZW50RWxlbWVudE5hbWVzcGFjZSkpCi0gIAl7Ci0gICAgCWlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImlucHV0IikgfHwgcGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvdXRwdXQiKSkKLSAgICAJewotICAgIAkgIAlyZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJjb250ZW50IikgfHwKLQkJCQkgICAgIGxvY2FsTmFtZS5lcXVhbHMoIm11bHRpcGFydFJlbGF0ZWQiKSB8fAotCQkJCSAgICAgbG9jYWxOYW1lLmVxdWFscygibWltZVhtbCIpOyAgICAJICAJCi0gICAgCX0KLSAgCX0KLSAgCWVsc2UgaWYgKE1JTUVfTkFNRVNQQUNFX1VSSS5lcXVhbHMocGFyZW50RWxlbWVudE5hbWVzcGFjZSkpCi0gIAl7Ci0JCXJlc3VsdCA9IHRydWU7CQkJCQotICAJfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1NvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvU29hcEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmZTk1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvU29hcEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIGltcGxlbWVudHMgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlcgoteyAgIAotICBwdWJsaWMgU29hcEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIoKQotICB7Ci0gIH0gIAkKLQkKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gIAlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQlpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJiaW5kaW5nIikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYmluZGluZyIpOyAJICAKLQl9CSAgCi0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvcGVyYXRpb24iKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJvcGVyYXRpb24iKTsgCi0JfQotCWVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiaW5wdXQiKSB8fCAKLQkgICAgICAgICBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoIm91dHB1dCIpKQotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoImJvZHkiKSB8fCAKLQkgICAgICAgICAgIGxvY2FsTmFtZS5lcXVhbHMoImhlYWRlciIpOyAJICAKLQl9CQotCWVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiZmF1bHQiKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJmYXVsdCIpOyAJICAKLQl9Ci0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJwb3J0IikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYWRkcmVzcyIpOyAJICAKLQl9CQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvWFNERXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1hTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkM2FlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvWFNERXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNERXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciBpbXBsZW1lbnRzIEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIKLXsgICAKLSAgcHVibGljIFhTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIoKQotICB7Ci0gIH0gIAkKLQkKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gIAlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSA9IHBhcmVudEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygidHlwZXMiKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJzY2hlbWEiKTsgCSAgCi0JfQkgIAkKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwYXJ0cy9JbnRlcmFjdG9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cGFydHMvSW50ZXJhY3RvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzYwNmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwYXJ0cy9JbnRlcmFjdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLklFeHBhbmRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuSW50ZXJhY3RvcjsKLQotICAgICAgICAgICAgICAgICAKLS8vIGhvb2tzIHVwIGFuIGludGVyYWN0b3Igd2l0aCBhbiBlZGl0IHBhcnQgYW5kIHRoZSBmaWd1cmUgdGhhdCBuZWVkcyB0byBiZSBleHBhbmRlZCBhbmQgY29sbGFwc2VkCi0vLwotcHVibGljIGNsYXNzIEludGVyYWN0b3JIZWxwZXIgaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbmVlZFRvUGVyZm9ybURlZmF1bHRFeHBhbnNpb24gPSB0cnVlOwotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZWRpdFBhcnQ7ICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJbnRlcmFjdG9yIGludGVyYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIElFeHBhbmRhYmxlIGV4cGFuZGFibGU7Ci0KLSAgcHVibGljIEludGVyYWN0b3JIZWxwZXIoRWRpdFBhcnQgZWRpdFBhcnQsIEludGVyYWN0b3IgaW50ZXJhY3RvciwgSUV4cGFuZGFibGUgZXhwYW5kYWJsZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5lZGl0UGFydCA9IGVkaXRQYXJ0OwotICAgIHRoaXMuaW50ZXJhY3RvciA9IGludGVyYWN0b3I7Ci0gICAgdGhpcy5leHBhbmRhYmxlID0gZXhwYW5kYWJsZTsKLSAgICBpbnRlcmFjdG9yLmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7Ci0gICAgZXhwYW5kYWJsZS5zZXRFeHBhbmRlZChpbnRlcmFjdG9yLmlzRXhwYW5kZWQoKSk7Ci0gIH0gICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGlzRXhwYW5kZWQpCi0gIHsKLSAgICBpbnRlcmFjdG9yLnNldEV4cGFuZGVkKGlzRXhwYW5kZWQpOwotICAgIGludGVyYWN0b3JFeHBhbnNpb25DaGFuZ2VkKGlzRXhwYW5kZWQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBpbnRlcmFjdG9yRXhwYW5zaW9uQ2hhbmdlZChib29sZWFuIGlzSW50ZXJhY3RvckV4cGFuZGVkKQotICB7IAotICAgIGV4cGFuZGFibGUuc2V0RXhwYW5kZWQoaXNJbnRlcmFjdG9yRXhwYW5kZWQpOwotICAgIGV4cGFuZGFibGUuc2V0VmlzaWJsZShpc0ludGVyYWN0b3JFeHBhbmRlZCk7Ci0KLSAgICBlZGl0UGFydC5yZWZyZXNoKCk7Ci0KLSAgICBFZGl0UGFydCByb290ID0gZWRpdFBhcnQuZ2V0Um9vdCgpOwotICAgIGlmIChyb290IGluc3RhbmNlb2YgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgSUZpZ3VyZSByb290RmlndXJlID0gKChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KXJvb3QpLmdldEZpZ3VyZSgpOwotICAgICAgaW52YWxpZGF0ZUFsbChyb290RmlndXJlKTsKLSAgICAgIHJvb3RGaWd1cmUudmFsaWRhdGUoKTsKLSAgICAgIHJvb3RGaWd1cmUucmVwYWludCgpOwotICAgIH0gICAgICAKLSAgfQotCi0gICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgaW52YWxpZGF0ZUFsbChJRmlndXJlIGZpZ3VyZSkKLSAgewotICAgIGZpZ3VyZS5pbnZhbGlkYXRlKCk7ICAgCi0gICAgTGF5b3V0TWFuYWdlciBtYW5hZ2VyID0gZmlndXJlLmdldExheW91dE1hbmFnZXIoKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIG1hbmFnZXIuaW52YWxpZGF0ZSgpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIGludmFsaWRhdGVBbGwoY2hpbGQpOwotICAgIH0KLSAgfSAKLSAgICAgCi0KLSAgLy8gaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyCi0gIC8vCi0gIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2tlZChNb3VzZUV2ZW50IG1lKSAKLSAgeyAgICAgIAotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IG1lKQotICB7ICAgICAgCi0gICAgYm9vbGVhbiBuZXdFeHBhbnNpb25TdGF0ZSA9ICFpbnRlcmFjdG9yLmlzRXhwYW5kZWQoKTsKLSAgICBpbnRlcmFjdG9yLnNldEV4cGFuZGVkKG5ld0V4cGFuc2lvblN0YXRlKTsKLSAgICBpbnRlcmFjdG9yRXhwYW5zaW9uQ2hhbmdlZChuZXdFeHBhbnNpb25TdGF0ZSk7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IG1lKSAgCi0gIHsgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cGFydHMvTXVsdGlDb250ZW50UGFuZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cGFydHMvTXVsdGlDb250ZW50UGFuZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NmEyMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZWRpdHBhcnRzL011bHRpQ29udGVudFBhbmVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC4qOyAKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLio7ICAgCi0gICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpQ29udGVudFBhbmVFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIElGaWd1cmVbXSBjb250ZW50UGFuZXM7Ci0gIHByb3RlY3RlZCBpbnRbXSBjb250ZW50UGFuZUluZGV4QWRqdXN0bWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIElGaWd1cmVbXSBpbml0Q29udGVudFBhbmVzKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0gICAgCi0KLSAgcHJvdGVjdGVkIGludCBnZXRDb250ZW50UGFuZShPYmplY3QgbW9kZWwpCi0gIHsgIAotICAgIHJldHVybiAwOwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCBMaXN0IHNvcnRCeUNvbnRlbnRQYW5lKExpc3QgbGlzdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0gIAotCi0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0RmlndXJlKElGaWd1cmUgZmlndXJlKQotICB7Ci0JICBzdXBlci5zZXRGaWd1cmUoZmlndXJlKTsKLSAgICBjb250ZW50UGFuZXMgPSBpbml0Q29udGVudFBhbmVzKCk7ICAgCi0gICAgaWYgKGNvbnRlbnRQYW5lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbnRlbnRQYW5lSW5kZXhBZGp1c3RtZW50ID0gbmV3IGludFtjb250ZW50UGFuZXMubGVuZ3RoXTsKLSAgICB9Ci0gIH0gICAgICAgIAotICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250ZW50UGFuZUluZm9JbmRleEFkanVzdG1lbnQoTGlzdCBsaXN0KQotICB7IAotICAgIGludCBpbmRleCA9IDA7ICAKLSAgICBpbnQgbGlzdFNpemUgPSBsaXN0LnNpemUoKTsKLQotICAgIGZvciAoaW50ICBqID0gMDsgaiA8IGNvbnRlbnRQYW5lcy5sZW5ndGg7IGorKykKLSAgICB7IAotICAgICAgY29udGVudFBhbmVJbmRleEFkanVzdG1lbnRbal0gPSBpbmRleDsKLSAgICAgIHdoaWxlIChpbmRleCA8IGxpc3RTaXplKQotICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgIE9iamVjdCBtb2RlbCA9IGxpc3QuZ2V0KGluZGV4KTsKLSAgICAgICAgaWYgKGdldENvbnRlbnRQYW5lKG1vZGVsKSAhPSBqKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbmRleCsrOwotICAgICAgfQotICAgIH0KLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbigpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoY29udGVudFBhbmVzICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBzb3J0ZWRMaXN0ID0gc29ydEJ5Q29udGVudFBhbmUoZ2V0TW9kZWxDaGlsZHJlbigpKTsKLSAgICAgIHVwZGF0ZUNvbnRlbnRQYW5lSW5mb0luZGV4QWRqdXN0bWVudChzb3J0ZWRMaXN0KTsKLSAgICB9Ci0gICAgc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgaWYgKGNvbnRlbnRQYW5lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBqID0gZ2V0Q29udGVudFBhbmUoY2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpKTsKLSAgICAgIGlmIChjb250ZW50UGFuZUluZGV4QWRqdXN0bWVudC5sZW5ndGggPiBqKQotICAgICAgewotICAgICAgICBpbnQgYWRqdXN0ZWRJbmRleCA9IGluZGV4IC0gY29udGVudFBhbmVJbmRleEFkanVzdG1lbnRbal07Ci0gICAgICAgIGlmIChhZGp1c3RlZEluZGV4ID49IDApCi0gICAgICAgIHsKLSAgCSAgICAgIElGaWd1cmUgY2hpbGQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KWNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpOwotICAJICAgICAgY29udGVudFBhbmVzW2pdLmFkZChjaGlsZCwgYWRqdXN0ZWRJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICBlbHNlCi0gICAgewotICAgICAgc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgaW5kZXgpOwotICAgIH0KLSAgfQotCi0gIAotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChjb250ZW50UGFuZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaiA9IGdldENvbnRlbnRQYW5lKGNoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKChHcmFwaGljYWxFZGl0UGFydCljaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKTsKLSAgICAgIGNvbnRlbnRQYW5lc1tqXS5yZW1vdmUoY2hpbGQpOyAgCi0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVvcmRlckNoaWxkKEVkaXRQYXJ0IGVkaXRwYXJ0LCBpbnQgaW5kZXgpCi0gIHsKLSAgICByZW1vdmVDaGlsZFZpc3VhbChlZGl0cGFydCk7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0gICAgY2hpbGRyZW4ucmVtb3ZlKGVkaXRwYXJ0KTsKLSAgICBjaGlsZHJlbi5hZGQoaW5kZXgsIGVkaXRwYXJ0KTsKLSAgICBhZGRDaGlsZFZpc3VhbChlZGl0cGFydCwgaW5kZXgpOwotICB9Ci19ICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cG9saWNpZXMvSURpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZWRpdHBvbGljaWVzL0lEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhODRlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cG9saWNpZXMvSURpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cG9saWNpZXM7Ci0gICAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZQoteyAgICAgICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoQ2VsbEVkaXRvciBjZWxsRWRpdG9yKTsgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwb2xpY2llcy9UZXh0Q2VsbEVkaXRvck1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwb2xpY2llcy9UZXh0Q2VsbEVkaXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjNjgwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cG9saWNpZXMvVGV4dENlbGxFZGl0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwb2xpY2llczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRleHRDZWxsRWRpdG9yTWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIGltcGxlbWVudHMgSURpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZQotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIFRleHRDZWxsRWRpdG9yTWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsCUxhYmVsIGxhYmVsKQotICB7Ci0JICBzdXBlcihzb3VyY2UsIFRleHRDZWxsRWRpdG9yLmNsYXNzLCBuZXcgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihsYWJlbCkpOwotICAgIHRoaXMubGFiZWwgPSBsYWJlbDsgICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAJU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSBsYWJlbC5nZXRUZXh0KCk7Ci0gIAlnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0gIAlUZXh0IHRleHQgPSAoVGV4dClnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotICAJdGV4dC5zZXRGb250KGxhYmVsLmdldEZvbnQoKSk7Ci0gICAgdGV4dC5zZXRGb3JlZ3JvdW5kKGxhYmVsLmdldEZvcmVncm91bmRDb2xvcigpKTsKLSAgICB0ZXh0LnNldEJhY2tncm91bmQobGFiZWwuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotICAJdGV4dC5zZWxlY3RBbGwoKTsKLSAgfQkgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGVyZm9ybU1vZGlmeShTdHJpbmcgdmFsdWUpOwotICAgIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVybmFsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvcgotICB7Ci0gICAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotCi0gICAgcHVibGljIEludGVybmFsQ2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpCi0gICAgewotICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgIH0gICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIAotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IChUZXh0KWNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOyAgCi0JICAgIFBvaW50IHNlbCA9IHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JICAgIFBvaW50IHByZWYgPSB0ZXh0LmNvbXB1dGVTaXplKC0xLCAtMSk7Ci0JICAgIFJlY3RhbmdsZSByZWN0ID0gbGFiZWwuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkgICAgbGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkgICAgdGV4dC5zZXRCb3VuZHMocmVjdC54LTQsIHJlY3QueS0xLCBwcmVmLngrMSwgcHJlZi55KzEpOwkKLQkgICAgdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JICAgIHRleHQuc2V0U2VsZWN0aW9uKHNlbCk7IAotICAgIH0KLSAgfSAgICAKLQotICAvLyBpbXBsZW1lbnRzIERpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZQotICAvLyAKLSAgcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoQ2VsbEVkaXRvciBjZWxsRWRpdG9yKQotICB7Ci0gICAgcGVyZm9ybU1vZGlmeSgoU3RyaW5nKWNlbGxFZGl0b3IuZ2V0VmFsdWUoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0NlbnRlckxheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9DZW50ZXJMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3YzNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0NlbnRlckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC4qOyAKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuKjsgCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLQotLyoqCi0gKiBGaWd1cmVzIHVzaW5nIHRoZSBTdGFja0xheW91dCBhcyB0aGVpciBsYXlvdXQgbWFuYWdlciBoYXZlCi0gKiB0aGVpciBjaGlsZHJlbiBwbGFjZWQgb24gdG9wIG9mIG9uZSBhbm90aGVyLiBPcmRlciBvZiAKLSAqIHBsYWNlbWVudCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2hpbGRyZW4KLSAqIHdlcmUgYWRkZWQsIGZpcnN0IGNoaWxkIGFkZGVkIHBsYWNlZCBvbiB0aGUgYm90dG9tLgotICovCi1wdWJsaWMgY2xhc3MgQ2VudGVyTGF5b3V0CWV4dGVuZHMgQWJzdHJhY3RMYXlvdXQKLXsgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMSUdOTUVOVF9UT1AgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTElHTk1FTlRfQ0VOVEVSID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxJR05NRU5UX0JPVFRPTSA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGludCBzcGFjaW5nOwotICBwcm90ZWN0ZWQgaW50IHZlcnRpY2FsQWxpZ25tZW50ID0gQUxJR05NRU5UX0NFTlRFUjsKLSAgCi0gIHB1YmxpYyBDZW50ZXJMYXlvdXQoKXt9Ci0gIHB1YmxpYyBDZW50ZXJMYXlvdXQoaW50IHNwYWNpbmcpeyB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOyB9Ci0gIAotIAotICAvKioKLSAgICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGlucHV0IGNvbnRhaW5lci4KLSAgICogVGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCBvZiB0aGUgY29udGFpbmVyLCBhcyBhbGwKLSAgICogb3RoZXIgY2hpbGRyZW4gZml0IGludG8gdGhpcyBzaXplLgotICAgKgotICAgKiBAcGFyYW0gZmlndXJlICBDb250YWluZXIgZmlndXJlIGZvciB3aGljaCBwcmVmZXJyZWQgc2l6ZSBpcyByZXF1aXJlZC4KLSAgICogQHJldHVybiAgVGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBpbnB1dCBmaWd1cmUuCi0gICAqIEBzaW5jZSAyLjAKLSAgICovCi0vLyAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgZmlndXJlKQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAJRGltZW5zaW9uIGQgPSBjYWxjdWxhdGVQcmVmZXJyZWRDbGllbnRBcmVhU2l6ZShmaWd1cmUpOwotLy8gIAlkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwKLS8vICAJICAgICAgICAgZmlndXJlLmdldEluc2V0cygpLmdldEhlaWdodCgpKTsKLSAgICBkLmV4cGFuZCh3aWR0aCwgaGVpZ2h0KTsKLSAgCWQudW5pb24oZ2V0Qm9yZGVyUHJlZmVycmVkU2l6ZShmaWd1cmUpKTsKLSAgCXJldHVybiBkOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKElGaWd1cmUgZmlndXJlKQotICB7Ci0gIAlEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgCUxpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLSAgCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAJCUlGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0gICAgICBkLmhlaWdodCArPSBjaGlsZFNpemUuaGVpZ2h0OwotICAgICAgZC53aWR0aCA9IE1hdGgubWF4KGNoaWxkU2l6ZS53aWR0aCwgZC53aWR0aCk7Ci0gIAl9CSAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsgICAgICAgCi0gICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDApCi0gICAgewotICAgICAgZC5oZWlnaHQgKz0gc3BhY2luZyAqIGNoaWxkcmVuLnNpemUoKSAtIDE7Ci0gICAgfQotICAJcmV0dXJuIGQ7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZCBieSB0aGUgaW5wdXQgY29udGFpbmVyLgotICAgKiBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbAotICAgKiBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzIHNpemUuCi0gICAqLwotICAvLyBUT0RPIEdFRiBQT1JUCi0gIHB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAJRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKCk7Ci0gIAlMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gIAlJRmlndXJlIGNoaWxkOwotICAJZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAJCWNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotICAJCWQudW5pb24oY2hpbGQuZ2V0TWluaW11bVNpemUoKSk7Ci0gIAl9Ci0gIAlkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwgZmlndXJlLmdldEluc2V0cygpLmdldEhlaWdodCgpKTsKLSAgCXJldHVybiBkOwotICB9Ci0gIC8vIFRPRE8gR0VGIFBPUlQKLSAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKElGaWd1cmUgZmlndXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsKLSAgCXJldHVybiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKGZpZ3VyZSwgZmlndXJlLmdldEluc2V0cygpLmdldFdpZHRoKCksIGZpZ3VyZS5nZXRJbnNldHMoKS5nZXRIZWlnaHQoKSk7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBmaWd1cmUpCi0gIHsKLSAgCVJlY3RhbmdsZSByID0gZmlndXJlLmdldENsaWVudEFyZWEoKTsKLSAgCUxpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAKLSAgICBEaW1lbnNpb24gcHJlZmVycmVkQ2xpZW50QXJlYVNpemUgPSBjYWxjdWxhdGVQcmVmZXJyZWRDbGllbnRBcmVhU2l6ZShmaWd1cmUpOwotICAKLSAgICBpbnQgeCA9IHIueCArIChyLndpZHRoIC0gcHJlZmVycmVkQ2xpZW50QXJlYVNpemUud2lkdGgpIC8gMjsKLSAgICBpbnQgeSA9IDA7Ci0gIAotICAgIHN3aXRjaCAoZ2V0VmVydGljYWxBbGlnbm1lbnQoKSkKLSAgICB7Ci0gICAgICBjYXNlIEFMSUdOTUVOVF9UT1AgOiAgCi0gICAgICB7Ci0gICAgICAgIHkgPSByLnk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBBTElHTk1FTlRfQ0VOVEVSIDoKLSAgICAgIHsKLSAgICAgICAgeSA9IHIueSArIChyLmhlaWdodCAtIHByZWZlcnJlZENsaWVudEFyZWFTaXplLmhlaWdodCkgLyAyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQUxJR05NRU5UX0JPVFRPTSA6Ci0gICAgICB7Ci0gICAgICAgIHkgPSByLnkgKyAoci5oZWlnaHQgLSBwcmVmZXJyZWRDbGllbnRBcmVhU2l6ZS5oZWlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAJZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gIAkJSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWkubmV4dCgpOwotICAgICAgRGltZW5zaW9uIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgCQljaGlsZC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSh4LCB5LCBjaGlsZFNpemUud2lkdGgsIGNoaWxkU2l6ZS5oZWlnaHQpKTsKLSAgICAgIHkgKz0gY2hpbGRTaXplLmhlaWdodCArIHNwYWNpbmc7Ci0gIAl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gdmVydGljYWxBbGlnbm1lbnQgVGhlIHZlcnRpY2FsQWxpZ25tZW50IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZlcnRpY2FsQWxpZ25tZW50KGludCB2ZXJ0aWNhbEFsaWdubWVudCkKLSAgewotICAgIHRoaXMudmVydGljYWxBbGlnbm1lbnQgPSB2ZXJ0aWNhbEFsaWdubWVudDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGludCBnZXRWZXJ0aWNhbEFsaWdubWVudCgpCi0gIHsKLSAgICByZXR1cm4gdmVydGljYWxBbGlnbm1lbnQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0lHcmFwaE5vZGVGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUdyYXBoTm9kZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTUyOWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUdyYXBoTm9kZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLio7IAotaW1wb3J0IGphdmEudXRpbC4qOyAKLQotcHVibGljIGludGVyZmFjZSBJR3JhcGhOb2RlRmlndXJlIGV4dGVuZHMgSUZpZ3VyZQoteyAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQX0NPTk5FQ1RJT04gPSAxOyAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTl9DT05ORUNUSU9OID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9DT05ORUNUSU9OID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfQ09OTkVDVElPTiA9IDQ7Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0U2VsZWN0aW9uRmlndXJlKCk7Ci0gIHB1YmxpYyBJRmlndXJlIGdldENvbm5lY3Rpb25GaWd1cmUoKTsKLSAgcHVibGljIExpc3QgZ2V0Q29ubmVjdGVkRmlndXJlcyhpbnQgdHlwZSk7Ci0gIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblR5cGUoKTsgICAgICAKLSAgcHVibGljIHZvaWQgYWRkQ29ubmVjdGVkRmlndXJlKElHcmFwaE5vZGVGaWd1cmUgZmlndXJlKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlQ29ubmVjdGVkRmlndXJlKElHcmFwaE5vZGVGaWd1cmUgZmlndXJlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0ludGVyYWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSW50ZXJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWYxOTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSW50ZXJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLio7IAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS4qOyAKLQotLyoqCi0gKiBJbnRlcmFjdG9yIHRoZSArLy0gY29udHJvbCBjb21tb25seSBmb3VuZCBpbiB0cmVlcwotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJhY3RvciBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZQotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cGFuZGVkOwotCi0gIHB1YmxpYyBJbnRlcmFjdG9yKCkKLSAgewotICAgIHN1cGVyKCk7IAotICAgIHNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig5LCA5KSk7ICAgICAgICAgICAgICAgCi0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKGJvb2xlYW4gaXNFeHBhbmRlZCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5pc0V4cGFuZGVkID0gaXNFeHBhbmRlZDsKLSAgICByZXBhaW50KCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGVkKCkKLSAgewotICAgIHJldHVybiBpc0V4cGFuZGVkOwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBnKQotICB7Ci0gICAgc3VwZXIuZmlsbFNoYXBlKGcpOwotICAgIFJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgbXggPSByLnggKyByLndpZHRoIC8gMjsKLSAgICBpbnQgbXkgPSByLnkgKyByLmhlaWdodCAvIDI7ICAgIAotICAgIGludCBzID0gMjsgICAgICAgCi0gICAgZy5kcmF3TGluZShyLnggKyBzLCBteSwgci54ICsgci53aWR0aCAtIHMgLSAxLCBteSk7IAotICAgIGlmICghaXNFeHBhbmRlZCkKLSAgICB7Ci0gICAgICBnLmRyYXdMaW5lKG14LCByLnkgKyBzLCBteCwgci55ICsgci5oZWlnaHQgLSBzIC0xKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYmNiMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9Sb3VuZGVkTGluZUJvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLio7IAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS4qOyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLXB1YmxpYyBjbGFzcyBSb3VuZGVkTGluZUJvcmRlciBleHRlbmRzIExpbmVCb3JkZXIKLXsgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGludCBhcmNMZW5ndGg7ICAgCi0gIHByb3RlY3RlZCBpbnQgbGluZVN0eWxlID0gR3JhcGhpY3MuTElORV9TT0xJRDsKLQotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoQ29sb3IgYywgaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoKQotICB7Ci0JICBzdXBlcihjLCB3aWR0aCk7ICAgICAKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgfQotCi0gIHB1YmxpYyBSb3VuZGVkTGluZUJvcmRlcihpbnQgd2lkdGgsIGludCBhcmNMZW5ndGgpCi0gIHsKLQkgIHN1cGVyKHdpZHRoKTsgICAgIAotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICB9Ci0gIAotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoQ29sb3IgYywgaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoLCBpbnQgbGluZVN0eWxlKQotICB7Ci0gICAgc3VwZXIoYywgd2lkdGgpOwotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICAgIHRoaXMubGluZVN0eWxlID0gbGluZVN0eWxlOwotICB9Ci0KLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCwgaW50IGxpbmVTdHlsZSkKLSAgewotICAgIHN1cGVyKHdpZHRoKTsKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgICB0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBncmFwaGljcywgSW5zZXRzIGluc2V0cykKLSAgewotCSAgdGVtcFJlY3Quc2V0Qm91bmRzKGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKSk7Ci0gICAgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLSAgICBDb2xvciBjb2xvciA9IGdldENvbG9yKCk7Ci0gIAlpZiAod2lkdGglMiA9PSAxKQotICAgIHsKLQkJICB0ZW1wUmVjdC53aWR0aC0tOwotCQkgIHRlbXBSZWN0LmhlaWdodC0tOwotCSAgfQotCSAgdGVtcFJlY3Quc2hyaW5rKHdpZHRoLzIsd2lkdGgvMik7Ci0JICBncmFwaGljcy5zZXRMaW5lV2lkdGgod2lkdGgpOwotICAgIGdyYXBoaWNzLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotCSAgaWYgKGNvbG9yICE9IG51bGwpCi0JCSAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQkgIGdyYXBoaWNzLmRyYXdSb3VuZFJlY3RhbmdsZSh0ZW1wUmVjdCwgYXJjTGVuZ3RoLCBhcmNMZW5ndGgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9GaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0ZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODYxZGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0ZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SYW5nZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1wdWJsaWMgY2xhc3MgRmlndXJlQ2FudmFzS2V5Ym9hcmRIYW5kbGVyIGV4dGVuZHMgS2V5QWRhcHRlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIX1NDUk9MTF9JTkNSRU1FTlQgPSA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWX1NDUk9MTF9JTkNSRU1FTlQgPSAzMDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBGaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLSAgewotICAgIFdpZGdldCB3ID0gZS53aWRnZXQ7Ci0gICAgaWYgKHcgaW5zdGFuY2VvZiBGaWd1cmVDYW52YXMpCi0gICAgewotICAgICAgcHJvY2Vzc0tleShlLmtleUNvZGUsIChGaWd1cmVDYW52YXMpdyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NLZXkoaW50IGtleUNvZGUsIEZpZ3VyZUNhbnZhcyBmaWd1cmVDYW52YXMpCi0gIHsKLSAgICBzd2l0Y2ggKGtleUNvZGUpCi0gICAgewotICAgICAgY2FzZSBTV1QuQVJST1dfRE9XTiA6Ci0gICAgICAgIHNjcm9sbFZlcnRpY2FsKGZpZ3VyZUNhbnZhcywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1dULkFSUk9XX1VQIDoKLSAgICAgICAgc2Nyb2xsVmVydGljYWwoZmlndXJlQ2FudmFzLCB0cnVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNXVC5BUlJPV19MRUZUIDoKLSAgICAgICAgc2Nyb2xsSG9yaXpvbnRhbChmaWd1cmVDYW52YXMsIHRydWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1dULkFSUk9XX1JJR0hUIDoKLSAgICAgICAgc2Nyb2xsSG9yaXpvbnRhbChmaWd1cmVDYW52YXMsIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNXVC5QQUdFX1VQIDoKLSAgICAgICAgc2Nyb2xsUGFnZShmaWd1cmVDYW52YXMsIHRydWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1dULlBBR0VfRE9XTiA6Ci0gICAgICAgIHNjcm9sbFBhZ2UoZmlndXJlQ2FudmFzLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50IHZlcmlmeVNjcm9sbEJhck9mZnNldChSYW5nZU1vZGVsIG1vZGVsLCBpbnQgdmFsdWUpCi0gIHsKLSAgICB2YWx1ZSA9IE1hdGgubWF4KG1vZGVsLmdldE1pbmltdW0oKSwgdmFsdWUpOwotICAgIHJldHVybiBNYXRoLm1pbihtb2RlbC5nZXRNYXhpbXVtKCkgLSBtb2RlbC5nZXRFeHRlbnQoKSwgdmFsdWUpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNjcm9sbFZlcnRpY2FsKEZpZ3VyZUNhbnZhcyBmaWd1cmVDYW52YXMsIGJvb2xlYW4gdXApCi0gIHsKLSAgICBQb2ludCBsb2NhdGlvbiA9IGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgIGludCB2T2Zmc2V0ID0gdXAgPyAtVl9TQ1JPTExfSU5DUkVNRU5UIDogVl9TQ1JPTExfSU5DUkVNRU5UOwotICAgIGludCB4ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldEhvcml6b250YWxSYW5nZU1vZGVsKCksIGxvY2F0aW9uLngpOwotICAgIGludCB5ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZlcnRpY2FsUmFuZ2VNb2RlbCgpLCBsb2NhdGlvbi55ICsgdk9mZnNldCk7Ci0gICAgZmlndXJlQ2FudmFzLnNjcm9sbFNtb290aFRvKHgsIHkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNjcm9sbEhvcml6b250YWwoRmlndXJlQ2FudmFzIGZpZ3VyZUNhbnZhcywgYm9vbGVhbiBsZWZ0KQotICB7Ci0gICAgUG9pbnQgbG9jYXRpb24gPSBmaWd1cmVDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWaWV3TG9jYXRpb24oKTsKLSAgICBpbnQgaE9mZnNldCA9IGxlZnQgPyAtSF9TQ1JPTExfSU5DUkVNRU5UIDogSF9TQ1JPTExfSU5DUkVNRU5UOwotICAgIGludCB4ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldEhvcml6b250YWxSYW5nZU1vZGVsKCksIGxvY2F0aW9uLnggKyBoT2Zmc2V0KTsKLSAgICBpbnQgeSA9IHZlcmlmeVNjcm9sbEJhck9mZnNldChmaWd1cmVDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWZXJ0aWNhbFJhbmdlTW9kZWwoKSwgbG9jYXRpb24ueSk7Ci0gICAgZmlndXJlQ2FudmFzLnNjcm9sbFNtb290aFRvKHgsIHkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNjcm9sbFBhZ2UoRmlndXJlQ2FudmFzIGZpZ3VyZUNhbnZhcywgYm9vbGVhbiB1cCkKLSAgewotICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gZmlndXJlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLSAgICBpbnQgaW5jcmVtZW50ID0gdXAgPyAtY2xpZW50QXJlYS5oZWlnaHQgOiBjbGllbnRBcmVhLmhlaWdodDsKLSAgICBQb2ludCBsb2NhdGlvbiA9IGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgIGludCB4ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldEhvcml6b250YWxSYW5nZU1vZGVsKCksIGxvY2F0aW9uLngpOwotICAgIGludCB5ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZlcnRpY2FsUmFuZ2VNb2RlbCgpLCBsb2NhdGlvbi55ICsgaW5jcmVtZW50KTsKLSAgICBmaWd1cmVDYW52YXMuc2Nyb2xsU21vb3RoVG8oeCwgeSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoVmlld1Rvb2xCYXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoVmlld1Rvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlYzJlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9HcmFwaFZpZXdUb29sQmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotCi0gCi1wdWJsaWMgY2xhc3MgR3JhcGhWaWV3VG9vbEJhciBleHRlbmRzIFZpZXdGb3JtCi17Ci0gICAgVG9vbEJhciBncmFwaFRvb2xCYXI7ICAvLyB0aGUgdG9vbGJhciBhdCB0aGUgdG9wIG9mIHRoZSBncmFwaCB2aWV3Ci0gICAgLy9Ub29sSXRlbSB0b29sSXRlbTsgICAvLyB0aGUgdmlldyB0b29sIGl0ZW0KLSAgICBDb21wb3NpdGUgZnJhbWVCYXI7ICAvLyBUaGUgY29tcG9zaXRlIHRoYXQgY29udGFpbnMgdGhlIHRvb2xiYXIKLSAgICBXU0RMRWRpdG9yIGVkaXRvcjsgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIFRvb2xJdGVtIHNob3dCaW5kaW5nc0J1dHRvbjsgICAvLyB0aGUgdmlldyB0b29sIGl0ZW0gICAKLSAgICBUb29sSXRlbSBiYWNrQnV0dG9uOwotCi0gICAgcHVibGljIEdyYXBoVmlld1Rvb2xCYXIoV1NETEVkaXRvciB3c2RsRWRpdG9yLCBDb21wb3NpdGUgYywgaW50IHN0eWxlKQotICAgIHsKLSAgICAgIHN1cGVyKGMsIHN0eWxlKTsKLSAgICAgIHRoaXMuZWRpdG9yID0gd3NkbEVkaXRvcjsKLSAgICAgIGZyYW1lQmFyID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAvKgotICAgICAgQ0xhYmVsIGxhYmVsID0gbmV3IENMYWJlbChmcmFtZUJhciwgU1dULk5PTkUpOwotICAgICAgbGFiZWwuc2V0VGV4dCgiVmlldyA6Iik7Ci0gICAgICAqLwotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0IGZyYW1lTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dCgpOwotICAgICAgZnJhbWVMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICBmcmFtZUxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgICBmcmFtZUxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICBmcmFtZUxheW91dC5tYXJnaW5IZWlnaHQgPSAwOyAgICAgCi0KLSAgICAgIGZyYW1lQmFyLnNldExheW91dChmcmFtZUxheW91dCk7Ci0gICAgICAKLSAgICAgIGdyYXBoVG9vbEJhciA9IG5ldyBUb29sQmFyKGZyYW1lQmFyLCBTV1QuRkxBVCk7Ci0gICAgICBncmFwaFRvb2xCYXIuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX01ORU1PTklDKQotICAgICAgICAgICBlLmRvaXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICAgICAgICAgIAotCi0gICAgICBiYWNrQnV0dG9uID0gbmV3IFRvb2xJdGVtKGdyYXBoVG9vbEJhciwgU1dULlBVU0gpOwotICAgICAgYmFja0J1dHRvbi5zZXRJbWFnZShXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2JhY2suZ2lmIikpOwotICAgICAgLy8gYmFja0J1dHRvbi5zZXRUb29sVGlwVGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9CQUNLX1RPIiwgIkRlZmluaXRpb24iKSk7Ci0gICAgICBiYWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JBQ0siKSk7Ci0gICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgYmFja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdG9yLmdldEdyYXBoVmlld2VyKCkuc2V0SW5wdXQoZWRpdG9yLmdldERlZmluaXRpb24oKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gY29tbW9uIHRoaXMgdXAgd2l0aCB4c2RlZGl0b3IncyBCYWNrQWN0aW9uIGNvZGUKLSAgICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICBib29sZWFuIGZsYWcgPSB0cnVlOwotICAgICAgICAgICAgd2hpbGUgKGZsYWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIExpc3QgbGlzdCA9IHhzZFNjaGVtYS5nZXRSZWZlcmVuY2luZ0RpcmVjdGl2ZXMoKTsKLSAgICAgICAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSB4c2RTY2hlbWFEaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKWxpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIGlmICh4c2RTY2hlbWFEaXJlY3RpdmUuZ2V0U2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4c2RTY2hlbWEgPSB4c2RTY2hlbWFEaXJlY3RpdmUuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmbGFnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRJbnB1dCh4c2RTY2hlbWEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdG9yLmdldEdyYXBoVmlld2VyKCkuc2V0SW5wdXQoZWRpdG9yLmdldERlZmluaXRpb24oKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsgCi0KLSAgICAgIC8vIGhhY2sgdG8gbWFrZSB0aGUgYnV0dG9uIGxvb2sgbGlrZSBhIHRvZ2dsZSBidXR0b24uICBTV1QuVE9HR0xFIGlzIG5vdCBhbiBhbGxvd2VkIHN0eWxlCi0gICAgICAvLyBmb3IgYSBUb29sSXRlbSwgYnV0IFNXVC5SQURJTyBpcy4gIFNXVC5SQURJTyBtYWtlcyBpdCBsb29rIGxpa2UgYSB0b2dnbGUuLi4uLi4uCi0gICAgICBzaG93QmluZGluZ3NCdXR0b24gPSBuZXcgVG9vbEl0ZW0oZ3JhcGhUb29sQmFyLCBTV1QuUkFESU8pOwotICAgICAgc2hvd0JpbmRpbmdzQnV0dG9uLnNldEltYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvaGlkZWJpbmRpbmcuZ2lmIikpOwotICAgICAgc2hvd0JpbmRpbmdzQnV0dG9uLnNldFRvb2xUaXBUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0hJREVfQklORElOR1MiKSk7IAotICAgICAgc2hvd0JpbmRpbmdzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgewotICAgICAgCXByaXZhdGUgYm9vbGVhbiBjdXJyZW50bHlTZWxlY3RlZCA9IGZhbHNlOwotICAgICAgCQotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgVmlld01vZGUgdm0gPSBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRWaWV3TW9kZSgoRGVmaW5pdGlvbillZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgICB2bS5zZXRCaW5kaW5nVmlzaWJsZSghdm0uaXNCaW5kaW5nVmlzaWJsZSgpKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBoYWNrIHRvIG1ha2UgdGhlIGJ1dHRvbiBsb29rIGxpa2UgYSB0b2dnbGUgYnV0dG9uCi0gICAgICAgICAgVG9vbEl0ZW0gaXRlbSA9IChUb29sSXRlbSkgZS53aWRnZXQ7Ci0gICAgICAgICAgaWYgKGN1cnJlbnRseVNlbGVjdGVkKSB7Ci0gICAgICAgICAgCWl0ZW0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAJY3VycmVudGx5U2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgCWN1cnJlbnRseVNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOyAKLQotICAgICAgc2V0VG9wTGVmdChmcmFtZUJhcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEJhY2tCdXR0b25FbmFibGVkKGJvb2xlYW4gc3RhdGUpCi0gICAgewotICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0KLSAgICAKLS8vICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUhvdmVySGVscChPYmplY3Qgb2JqZWN0KQotLy8gICAgewotLy8gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotLy8gICAgICB7Ci0vLyAgICAgICAgYmFja0J1dHRvbi5zZXRUb29sVGlwVGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9CQUNLX1RPIiwgIkRlZmluaXRpb24iKSk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0vLyAgICAgIHsKLS8vICAgICAgICBiYWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JBQ0tfVE8iLCAiWE1MIFNjaGVtYSIpKTsKLS8vICAgICAgfQotLy8gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoaWNzQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9HcmFwaGljc0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTcwZWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoaWNzQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQSBjb2xsZWN0aW9uIG9mIGNvbG9yIGFuZCBmb250IHJlbGF0ZWQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoaWNzQ29uc3RhbnRzIAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGdyb3VwQm9yZGVyQ29sb3IgICAgICAgID0gbmV3IENvbG9yKG51bGwsIDExOCwgMTM0LCAxNjQpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGdyb3VwSGVhZGVyQ29sb3IgICAgICAgID0gbmV3IENvbG9yKG51bGwsIDIzMiwgMjQwLCAyNDgpOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgZWxlbWVudEJvcmRlckNvbG9yICAgICAgPSBuZXcgQ29sb3IobnVsbCwgMTIwLCAxNTIsIDE4NCk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgZWxlbWVudEJhY2tncm91bmRDb2xvciAgPSBuZXcgQ29sb3IobnVsbCwgMjMyLCAyNDAsIDI0OCk7ICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBlbGVtZW50TGFiZWxDb2xvciAgICAgICA9IG5ldyBDb2xvcihudWxsLCAgODAsIDEwMiwgMTQ0KTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciByZWFkT25seUJvcmRlckNvbG9yICAgICA9IG5ldyBDb2xvcihudWxsLCAxNjQsIDE2NCwgMTY0KTsgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgcmVkICAgICAgICAgICAgICAgICAgICAgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAgIDAsICAgMCk7IAotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgcmVhZE9ubHlCYWNrZ3JvdW5kQ29sb3IgPSBDb2xvckNvbnN0YW50cy53aGl0ZTsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbnQgIHNtYWxsQm9sZEZvbnQgICAgICAgICAgID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJUYWhvbWEiLCA4LCBTV1QuQk9MRCk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9udCAgbWVkaXVtRm9udCAgICAgICAgICAgICAgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgIlRhaG9tYSIsIDEwLCBTV1QuTk9ORSk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9udCAgbWVkaXVtQm9sZEZvbnQgICAgICAgICAgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgIlRhaG9tYSIsIDEwLCBTV1QuQk9MRCk7IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL1ZpZXdNb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9WaWV3TW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc1ZGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL1ZpZXdNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBWaWV3TW9kZSAKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklORElORyAgICAgPSAgIDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0UgICAgID0gICAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUX1RZUEUgICA9ICAgMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRSAgICAgPSAgIDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVTICAgICAgID0gICA1OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfREVTQ1JJUFRJT04gICAgID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQklORElORyIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0RFU0NSSVBUSU9OICAgICA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX01FU1NBR0UiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9UWVBFX0RFU0NSSVBUSU9OICAgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QT1JUVFlQRSIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0RFU0NSSVBUSU9OICAgICA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1NFUlZJQ0UiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRVNfREVTQ1JJUFRJT04gICAgICAgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UWVBFUyIpOwotCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCaW5kaW5nVmlzaWJsZSA9IHRydWU7Ci0gIHByb3RlY3RlZCBpbnQgbW9kZSA9IFNFUlZJQ0U7Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICBwdWJsaWMgVmlld01vZGUoKQotICB7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nVmlzaWJsZShib29sZWFuIGlzVmlzaWJsZSkKLSAgewotICAgIGlmIChpc0JpbmRpbmdWaXNpYmxlICE9IGlzVmlzaWJsZSkKLSAgICB7Ci0gICAgICBpc0JpbmRpbmdWaXNpYmxlID0gaXNWaXNpYmxlOwotICAgICAgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbigpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQmluZGluZ1Zpc2libGUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGlzQmluZGluZ1Zpc2libGU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBnZXRNb2RlRm9yRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7ICAgICAgICAgICAgICAgCi0gICAgaW50IHJlc3VsdCA9IFNFUlZJQ0U7Ci0gICAgaWYgKGRlc2NyaXB0aW9uLmVxdWFscyhCSU5ESU5HX0RFU0NSSVBUSU9OKSkKLSAgICB7ICAgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSBCSU5ESU5HOyAKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVzY3JpcHRpb24uZXF1YWxzKE1FU1NBR0VfREVTQ1JJUFRJT04pKQotICAgIHsgICAgICAgIAotICAgICAgcmVzdWx0ID0gTUVTU0FHRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVzY3JpcHRpb24uZXF1YWxzKFBPUlRfVFlQRV9ERVNDUklQVElPTikpCi0gICAgeyAKLSAgICAgIHJlc3VsdCA9IFBPUlRfVFlQRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVzY3JpcHRpb24uZXF1YWxzKFNFUlZJQ0VfREVTQ1JJUFRJT04pKQotICAgIHsgICAgCi0gICAgICByZXN1bHQgPSBTRVJWSUNFOwotICAgIH0KLSAgICBlbHNlIGlmIChkZXNjcmlwdGlvbi5lcXVhbHMoVFlQRVNfREVTQ1JJUFRJT04pKQotICAgIHsgIAotICAgICAgcmVzdWx0ID0gVFlQRVM7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25Gb3JNb2RlKGludCBtb2RlKQotICB7ICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IFNFUlZJQ0VfREVTQ1JJUFRJT047Ci0gICAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICAgIGNhc2UgQklORElORyA6Ci0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBCSU5ESU5HX0RFU0NSSVBUSU9OOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTUVTU0FHRSA6IAotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gTUVTU0FHRV9ERVNDUklQVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFBPUlRfVFlQRSA6IAotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gUE9SVF9UWVBFX0RFU0NSSVBUSU9OOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgU0VSVklDRSA6IAotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gU0VSVklDRV9ERVNDUklQVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFRZUEVTIDogIAotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gVFlQRVNfREVTQ1JJUFRJT047Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGludGVyZmFjZSBMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgdmlld01vZGVDaGFuZ2VkKFZpZXdNb2RlIG1vZGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSkKLSAgewotICAgIHRoaXMubW9kZSA9IG1vZGU7Ci0gICAgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TW9kZShTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICB0aGlzLm1vZGUgPSBnZXRNb2RlRm9yRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgIGZpcmVDaGFuZ2VOb3RpZmljYXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TW9kZSgpCi0gIHsKLSAgICByZXR1cm4gbW9kZTsKLSAgfSAKLQotICBwdWJsaWMgU3RyaW5nIGdldE1vZGVEZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVzY3JpcHRpb25Gb3JNb2RlKG1vZGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBpZiAoIWxpc3RlbmVyTGlzdC5jb250YWlucyhsaXN0ZW5lcikpCi0gICAgeyAKLSAgICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICAgIH0gIAotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbigpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBMaXN0ZW5lciBsaXN0ZW5lciA9IChMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnZpZXdNb2RlQ2hhbmdlZCh0aGlzKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9XU0RMQ29tcG9uZW50Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9XU0RMQ29tcG9uZW50Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjZkMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvV1NETENvbXBvbmVudFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLlNlbGVjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNlbnRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuQ29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLklDb25uZWN0aW9uUmVuZGVyaW5nVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgV1NETENvbXBvbmVudFZpZXdlciBleHRlbmRzIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBpbXBsZW1lbnRzIElDb25uZWN0aW9uUmVuZGVyaW5nVmlld2VyCi17Ci0gIHByb3RlY3RlZCBFZGl0RG9tYWluIGVkaXREb21haW47Ci0gIHByb3RlY3RlZCBXU0RMRWRpdG9yIGVkaXRvcjsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBtZW51U2VsZWN0aW9uUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgY29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0OwotICBwcm90ZWN0ZWQgQ29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZSBjb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZDsKLQotICBwdWJsaWMgV1NETENvbXBvbmVudFZpZXdlcihXU0RMRWRpdG9yIGVkaXRvciwgSVNlbGVjdGlvblByb3ZpZGVyIG1lbnVTZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gICAgdGhpcy5tZW51U2VsZWN0aW9uUHJvdmlkZXIgPSBtZW51U2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQoYm9vbGVhbiBpc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZCkKLSAgewotICAgIHRoaXMuaXNQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQgPSBpc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlc2VydmVFeHBhbnNpb25FbmFibGVkKCkKLSAgewotICAgIHJldHVybiBpc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZDsKLSAgfQotCi0gIHB1YmxpYyBDb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlIGdldENvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIHJldHVybiBjb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBjb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuc2V0SW5wdXQob2JqZWN0KTsKLSAgICAKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRCYWNrQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRCYWNrQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gdG9kby4uIHJldmlzaXQgdGhpcyB0byB1bmRlcnN0YW5kIHdoeSB3ZSBkb24ndCBnZXQgYSBzZXQgaW5wdXQKLSAgICAvLyB3aGVuIGRyaWxsaW5nIGRvd24gaW50byBhIHNjaGVtYSBlbGVtZW50IG9yIHR5cGUKLSAgICAvLwotICAgIGludCBsYXlvdXRBbGlnbm1lbnQgPSAob2JqZWN0IGluc3RhbmNlb2YgRGVmaW5pdGlvbikgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VudGVyTGF5b3V0LkFMSUdOTUVOVF9UT1AgOgotICAgICAgICAgICAgICAgICAgICAgICAgICBDZW50ZXJMYXlvdXQuQUxJR05NRU5UX0NFTlRFUjsKLSAgICAKLSAgICBTY2FsYWJsZVJvb3RFZGl0UGFydCBncmFwaGljYWxSb290RWRpdFBhcnQgPSAoU2NhbGFibGVSb290RWRpdFBhcnQpZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0gICAgQ2VudGVyTGF5b3V0IGNlbnRlckxheW91dCA9IChDZW50ZXJMYXlvdXQpZ3JhcGhpY2FsUm9vdEVkaXRQYXJ0LmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpLmdldExheW91dE1hbmFnZXIoKTsKLSAgICBjZW50ZXJMYXlvdXQuc2V0VmVydGljYWxBbGlnbm1lbnQobGF5b3V0QWxpZ25tZW50KTsKLSAgfQotCi0gIC8vcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKE9iamVjdCBvYmplY3QpCi0gIC8veyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8vfQotCi0gIHByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKCkKLSAgewotICAgIHN1cGVyLmhvb2tDb250cm9sKCk7Ci0KLSAgICBnZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0KLSAgICBlZGl0RG9tYWluID0gbmV3IERlZmF1bHRFZGl0RG9tYWluKG51bGwpOwotICAgICgoRGVmYXVsdEVkaXREb21haW4pZWRpdERvbWFpbikuc2V0RGVmYXVsdFRvb2wobmV3IFNlbGVjdGlvblRvb2woKSk7Ci0gICAgZWRpdERvbWFpbi5sb2FkRGVmYXVsdFRvb2woKTsKLSAgICBlZGl0RG9tYWluLmFkZFZpZXdlcih0aGlzKTsKLQotICAgIGNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCA9IG5ldyBDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQoKTsKLQotICAgIEtleUFkYXB0ZXIga2V5TGlzdGVuZXIgPSBuZXcgS2V5QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkKLSAgICAgIHsgICAJCi0gICAgICAgIGlmIChlLmtleUNvZGUgPT0gU1dULkYzKQotICAgICAgICB7Ci0gICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgICAgICAgICB7Ci0JCQkgIE9wZW5PblNlbGVjdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgT3Blbk9uU2VsZWN0aW9uSGVscGVyKGVkaXRvci5nZXREZWZpbml0aW9uKCkpOwotICAgICAgICAgICAgICBoZWxwZXIub3BlbkVkaXRvcigoRU9iamVjdClvYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBnZXRDb250cm9sKCkuYWRkS2V5TGlzdGVuZXIoa2V5TGlzdGVuZXIpOwotCi0gICAgc2V0Q29udGVudHMoY29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0KTsKLSAgICAvL2dldEZpZ3VyZUNhbnZhcygpLmFkZEtleUxpc3RlbmVyKG5ldyBGaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIoZWRpdG9yKSk7Ci0gICAgZ2V0Um9vdEVkaXRQYXJ0KCkuYWN0aXZhdGUoKTsKLQotICAgIGNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydC5zZXRJbnB1dChlZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLQotICAgIFNjYWxhYmxlUm9vdEVkaXRQYXJ0IGdyYXBoaWNhbFJvb3RFZGl0UGFydCA9IChTY2FsYWJsZVJvb3RFZGl0UGFydClnZXRSb290RWRpdFBhcnQoKTsKLQotICAgIC8vIHNldCB0aGUgbGF5b3V0IGZvciB0aGUgcHJpbWFyeSBsYXllciBzbyB0aGF0IHRoZSBjaGlsZHJlbiBhcmUgYWx3YXlzIGNlbnRlcmVkCi0gICAgLy8KLSAgICBDZW50ZXJMYXlvdXQgY2VudGVyTGF5b3V0ID0gbmV3IENlbnRlckxheW91dCgpOwotICAgIGNlbnRlckxheW91dC5zZXRWZXJ0aWNhbEFsaWdubWVudChDZW50ZXJMYXlvdXQuQUxJR05NRU5UX1RPUCk7Ci0gICAgZ3JhcGhpY2FsUm9vdEVkaXRQYXJ0LmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpLnNldExheW91dE1hbmFnZXIoY2VudGVyTGF5b3V0KTsgLy9uZXcgQ29udGFpbmVyTGF5b3V0KCkpOy8vCi0KLSAgICBzZXRDb250ZXh0TWVudShuZXcgSW50ZXJuYWxDb250ZXh0TWVudVByb3ZpZGVyKHRoaXMsIGVkaXRvcikpOwotCi0gICAgLy8gYWRkIHRoZSBDb25uZWN0aW9uRmlndXJlIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBkcmF3aW5nIGFsbCBvZiB0aGUgbGluZXMgaW4gdGhlIHZpZXcKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSUZpZ3VyZSBmaWd1cmUgPSBncmFwaGljYWxSb290RWRpdFBhcnQuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUik7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCi0gICAgZmluYWwgTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyIGNvbm5lY3Rpb25SZW5kZXJpbmdIZWxwZXIgPSBuZXcgTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyKHRoaXMpOwotCi0gICAgY29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZSA9IG5ldyBDb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlKGdyYXBoaWNhbFJvb3RFZGl0UGFydC5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKSkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLmZpbGxTaGFwZShncmFwaGljcyk7Ci0gICAgICAgIGNvbm5lY3Rpb25SZW5kZXJpbmdIZWxwZXIuZmlsbFNoYXBlSGVscGVyKGdyYXBoaWNzKTsKLSAgICAgIH0KLSAgICB9OwotICAgIGZpZ3VyZS5hZGQoY29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZSk7Ci0gICAgZmlndXJlLnZhbGlkYXRlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWRpdG9yIGdldFdTRExFZGl0b3IoKSB7Ci0gIAlyZXR1cm4gZWRpdG9yOwotICB9Ci0KLSAgcHVibGljIGNsYXNzIEludGVybmFsQ29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIENvbnRleHRNZW51UHJvdmlkZXIKLSAgewotICAgIHByb3RlY3RlZCBFZGl0UGFydFZpZXdlciB2aWV3ZXI7Ci0gICAgcHJvdGVjdGVkIEV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IgZXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvcjsKLQotICAgIHB1YmxpYyBJbnRlcm5hbENvbnRleHRNZW51UHJvdmlkZXIoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBXU0RMRWRpdG9yIGVkaXRvcikKLSAgICB7Ci0gICAgICBzdXBlcih2aWV3ZXIpOwotICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICBleHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yID0gbmV3IEV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IoZWRpdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IGdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0gICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClsaXN0LmdldCgwKTsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLSAgICAgICAgLy9pZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQcm9wZXJ0eUVkaXRQYXJ0KQotICAgICAgICAvL3sKLSAgICAgICAgLy8gIG9iamVjdCA9ICgoUHJvcGVydHlFZGl0UGFydCllZGl0UGFydCkuZ2V0T3duZXJNb2RlbCgpOwotICAgICAgICAvL30gICAgICAgICAgICAgICAKLQotICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSBudWxsOwotICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGUgPSAoTm9kZSlvYmplY3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGUgPSAoKFdTRExFbGVtZW50KW9iamVjdCkuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgICAgICAgewotICAgICAgICAgICAgbm9kZSA9ICgoV1NETEdyb3VwT2JqZWN0KW9iamVjdCkuZ2V0RGVmaW5pdGlvbigpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvci5jb250cmlidXRlTWVudUFjdGlvbnMobWVudSwgbm9kZSwgb2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvV1NETEdyYXBoVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9XU0RMR3JhcGhWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzZjU0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9XU0RMR3JhcGhWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkNvcHlHbG9iYWxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5EZWxldGVXU0RMQW5kWFNEQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuUGFzdGVHbG9iYWxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuR3JvdXBFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuVHJlZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETEdyYXBoVmlld2VyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQ29udHJvbCBjb21wb25lbnRWaWV3ZXJDb250cm9sOyAKLSAgcHJvdGVjdGVkIFdTRExDb21wb25lbnRWaWV3ZXIgY29tcG9uZW50Vmlld2VyOwotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOyAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBXU0RMRWRpdG9yIGVkaXRvcjsgIAotICBwcm90ZWN0ZWQgSW50ZXJuYWxTZWxlY3Rpb25BZGFwdGVyIGludGVybmFsU2VsZWN0aW9uQWRhcHRlciA9IG5ldyBJbnRlcm5hbFNlbGVjdGlvbkFkYXB0ZXIoKTsKLQotICBHcmFwaFZpZXdUb29sQmFyIGZvcm07ICAvLyBUb29sIGJhciB2aWV3IGZvcm0KLSAgCi0gIHB1YmxpYyBXU0RMR3JhcGhWaWV3ZXIoV1NETEVkaXRvciBlZGl0b3IpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOyAgICAgICAgICAgICAgICAgCi0gIH0gICAgCi0KLSAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOyAgICAgICAgICAgICAgCi0gIH0KLQotICBwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIGdldFNlbGVjdGlvblByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBpbnRlcm5hbFNlbGVjdGlvbkFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb25lbnRWaWV3ZXIgPSBuZXcgV1NETENvbXBvbmVudFZpZXdlcihlZGl0b3IsIG51bGwpOwotCi0gICAgY29tcG9uZW50Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihpbnRlcm5hbFNlbGVjdGlvbkFkYXB0ZXIpOwotICAgIGludGVybmFsU2VsZWN0aW9uQWRhcHRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0KLSAgICBmb3JtID0gbmV3IEdyYXBoVmlld1Rvb2xCYXIoZWRpdG9yLCBwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgIGNvbXBvbmVudFZpZXdlckNvbnRyb2wgPSBjb21wb25lbnRWaWV3ZXIuY3JlYXRlQ29udHJvbChmb3JtKTsKLSAgICBmb3JtLnNldENvbnRlbnQoY29tcG9uZW50Vmlld2VyQ29udHJvbCk7Ci0KLSAgICBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBjb21wb25lbnRWaWV3ZXJDb250cm9sLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotICAgIAlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuREVMKSB7Ci0gICAgCQkJTGlzdCBzZWxlY3Rpb25zID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKSkudG9MaXN0KCk7Ci0gICAgICAgCQkJRGVsZXRlV1NETEFuZFhTREFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgRGVsZXRlV1NETEFuZFhTREFjdGlvbihzZWxlY3Rpb25zLCBlZGl0b3IuZ2V0RGVmaW5pdGlvbigpLmdldEVsZW1lbnQoKSwgZWRpdG9yKTsKLSAgICAgICAJCQlkZWxldGVBY3Rpb24ucnVuKCk7Ci0gICAgCQl9Ci0gICAgCX0gICAgCQotICAgIH0pOwotICAgIAotICAgIHJldHVybiBjb21wb25lbnRWaWV3ZXJDb250cm9sOyAKLSAgfQotCi0gIHB1YmxpYyBXU0RMQ29tcG9uZW50Vmlld2VyIGdldENvbXBvbmVudFZpZXdlcigpCi0gIHsKLSAgICByZXR1cm4gY29tcG9uZW50Vmlld2VyOwotICB9Ci0KLQotICBOb2RlIGlucHV0Tm9kZTsgICAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBjb21wb25lbnRWaWV3ZXIuc2V0SW5wdXQob2JqZWN0KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QmFja0J1dHRvbkVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkKLSAgewotICAgIGZvcm0uc2V0QmFja0J1dHRvbkVuYWJsZWQoc3RhdGUpOwotICB9Ci0KLSAgLy9wcm90ZWN0ZWQgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iamVjdCkKLSAgLy99ICAgICAgICAgICAgCi0KLSAgICAKLSAgLy8gdGhpcyBpcyBjYWxsZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcyBpbiB0aGUgc2VsZWN0aW9uIG1hbmFnZXIKLSAgLy8KLQotCi0gIAotICBwcm90ZWN0ZWQgT2JqZWN0IGdldElucHV0Q29tcG9uZW50Rm9yTm9kZShOb2RlIG5vZGUpICAgCi0gIHsKLSAgICAvLyBUT0RPLi4uIGxvZ2ljIHRvIGdldCBXU0RMRWxlbWVudCBvciBvdGhlciBvYmplY3QgKGUuZy4gWFNEIG9yIGV4dGVuc2lvbiBmb3IgdGhlIE5vZGUpCi0gICAgLy8gVE9ETy4uLiBjb25zaWRlciBjYXNlIHdoZXJlIHRoZSBtb2RlbCBpcyBzaW1wbHkgYSBjaHVuayBvZiBET00KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAgCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uQ29tcG9uZW50Rm9yTm9kZShOb2RlIG5vZGUpICAgCi0gIHsKLSAgICAvLyBUT0RPLi4uIGxvZ2ljIHRvIGdldCBXU0RMRWxlbWVudCBvciBvdGhlciBvYmplY3QgKGUuZy4gWFNEIG9yIGV4dGVuc2lvbiBmb3IgdGhlIE5vZGUpCi0gICAgLy8gVE9ETy4uLiBjb25zaWRlciBjYXNlIHdoZXJlIHRoZSBtb2RlbCBpcyBzaW1wbHkgYSBjaHVuayBvZiBET00KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAKLQotICBwcm90ZWN0ZWQgY2xhc3MgSW50ZXJuYWxTZWxlY3Rpb25BZGFwdGVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KQotICAgIHsgICAgICAgICAgICAKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KQotICAgICAgeyAgICAgICAKLSAgICAgICAgLy8gZml4IGZvciBkZWZlY3QgNDI5NCAuLi4gdGhpcyB0ZXN0IHByZXZlbnRzIHNlbGVjdGlvbiBmcm9tIGNoYW5naW5nCi0gICAgICAgIC8vIHdoZW4gYSBjb21wb25lbnQgaXMgcmVuYW1lZCB3aGljaCBpbmRpcmVjdGx5IGNhdXNlcyBpdCB0byBiZSByZW1vdmVkIGFuZAotICAgICAgICAvLyByZS1hZGRlZCBmcm9tIHRoZSAnc29ydGVkJyBsaXN0Ci0gICAgICAgIC8vCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KW9iamVjdDsKLSAgICAgICAgICByZXN1bHQgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgCi0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsgCi0gICAgfSAgCi0gIH0KLSAgICAKLSAgLy8gdGhpcyBnZXRzIGNhbGxlZCB3aGVuIHRoZSBzZWxlY3Rpb24gY2hhbmdlcyB3aXRoaW4gdGhlIHNlbGVjdGlvbiBtYW5hZ2VyCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSAKLSAgeyAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJXU0RMR3JhcGhWaWV3ZXIuc2VsZWN0aW9uQ2hhbmdlZCggIiArIGV2ZW50LmdldFNvdXJjZSgpICsgIikiKTsKLSAgCQotICAJIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbk9iamVjdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gc2VsZWN0aW9uT2JqZWN0LmdldEZpcnN0RWxlbWVudCgpOwotICAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgewotICAgICAJRWxlbWVudCBub2RlID0gKChXU0RMRWxlbWVudCkgbW9kZWxPYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgIGJvb2xlYW4gaXNFZGl0YWJsZSA9IChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpOwotICAgICAgICAgCi0gICAgIAlBY3Rpb24gY29weUFjdGlvbiA9IG5ldyBDb3B5R2xvYmFsQWN0aW9uKChXU0RMRWxlbWVudCkgbW9kZWxPYmplY3QsIGVkaXRvcik7Ci0gICAgIAlBY3Rpb24gcGFzdGVBY3Rpb24gPSBuZXcgUGFzdGVHbG9iYWxBY3Rpb24oKFdTRExFbGVtZW50KSBtb2RlbE9iamVjdCwgZWRpdG9yKTsKLSAJCQotIAkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotIAkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLCBjb3B5QWN0aW9uKTsKLSAJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksIHBhc3RlQWN0aW9uKTsKLSAJCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotIAkJCi0gCQlpZiAoIWlzRWRpdGFibGUpIHsKLSAJCQljb3B5QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotIAkJCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotIAkJfQotICAgICB9Ci0KLSAgICBpZiAoZXZlbnQuZ2V0U291cmNlKCkgIT0gaW50ZXJuYWxTZWxlY3Rpb25BZGFwdGVyICYmIGV2ZW50LmdldFNvdXJjZSgpICE9ICgoV1NETFRleHRFZGl0b3IpZWRpdG9yLmdldFRleHRFZGl0b3IoKSkuZ2V0SW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcigpKQotICAgIHsgICAKLSAgICAgIGJvb2xlYW4gaXNFbXB0eVNlbGVjdGlvblJlcXVpcmVkID0gdHJ1ZTsKLSAgICAgIGlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIE9iamVjdCBtb2RlbCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQoY29tcG9uZW50Vmlld2VyLmdldFJvb3RFZGl0UGFydCgpLCBtb2RlbCk7Ci0gICAgICAgICAgaWYgKGVkaXRQYXJ0ID09IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGVkaXRQYXJ0ID0gZXhwYW5kVG9SZXZlYWwoY29tcG9uZW50Vmlld2VyLmdldFJvb3RFZGl0UGFydCgpLCBtb2RlbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlZGl0UGFydCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAJaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIHsKLSAgICAgICAgICAJCW1vZGVsID0gZ2V0VG9wTGV2ZWxDb21wb25lbnQoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBtb2RlbCk7Ci0gICAgICAgICAgCQkKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwKLQkJCQkJbW9kZWwgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gfHwKLQkJCQkJbW9kZWwgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB8fAotCQkJCQltb2RlbCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkgewotCQkJCQkJY29tcG9uZW50Vmlld2VyLnNldElucHV0KG1vZGVsKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgCWVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEVsZW1lbnQgfHwgbW9kZWwgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpIHsKLSAgICAgICAgICAJCS8vIFdlIG5lZWQgdG8gc3dpdGNoIHRoZSBvdXRwdXQgdG8gRGVmaW5pdGlvbgotICAgICAgICAgIAkJY29tcG9uZW50Vmlld2VyLnNldElucHV0KGVkaXRvci5nZXREZWZpbml0aW9uKCkpOwotICAgICAgICAgIAkJZWRpdFBhcnQgPSBnZXRFZGl0UGFydChjb21wb25lbnRWaWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCksIG1vZGVsKTsKLSAgICAgICAgICAJCWlmIChlZGl0UGFydCA9PSBudWxsKQotICAgICAgICAgIAkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAJCQllZGl0UGFydCA9IGV4cGFuZFRvUmV2ZWFsKGNvbXBvbmVudFZpZXdlci5nZXRSb290RWRpdFBhcnQoKSwgbW9kZWwpOwotICAgICAgICAgIAkJfQotICAgICAgICAgIAl9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGJhZCBoYWNrIHRvIGNvbnZlcnQgeHNkIGVkaXRvciBjYXRlZ29yeSB0byB4c2Qgb2JqZWN0Ci0gICAgICAgICAgICAgIC8vIHNlZSBhbHNvIFdTRExUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZQotICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldE5vZGVGb3JPYmplY3QobW9kZWwpOwotICAgICAgICAgICAgICBPYmplY3QgbyA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChlZGl0b3IuZ2V0RGVmaW5pdGlvbigpLCAoRWxlbWVudClub2RlKTsKLSAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSAoKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW8pLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgIGNvbXBvbmVudFZpZXdlci5zZXRJbnB1dChvYmopOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzRW1wdHlTZWxlY3Rpb25SZXF1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgY29tcG9uZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0UGFydCkpOwotICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXcoZWRpdFBhcnQpOwotICAgICAgICAgIH0gICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGlzRW1wdHlTZWxlY3Rpb25SZXF1aXJlZCkKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRUb3BMZXZlbENvbXBvbmVudChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwcmV2ID0gY29tcG9uZW50OwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbnRhaW5lciA9IGNvbXBvbmVudDsKLSAgICB3aGlsZSAoIGNvbnRhaW5lciAhPSBudWxsICYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgWFNEU2NoZW1hKSkKLSAgICB7Ci0gICAgICBwcmV2ID0gY29udGFpbmVyOyAgICAgCi0gICAgICBjb250YWluZXIgPSBjb250YWluZXIuZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotICAgIHJldHVybiBjb250YWluZXIgIT0gbnVsbCA/IHByZXYgOiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGdldEVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBPYmplY3QgbW9kZWwpICAKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgPT0gbW9kZWwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7ICAgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRFZGl0UGFydCgoRWRpdFBhcnQpaS5uZXh0KCksIG1vZGVsKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIEVkaXRQYXJ0IGV4cGFuZFRvUmV2ZWFsKEVkaXRQYXJ0IGVkaXRQYXJ0LCBPYmplY3QgbW9kZWwpCi0gIHsgICAKLSAgICAvLyBoZXJlIHdlIGNyZWF0ZSB0aGUgcGFyZW50IGxpc3QKLSAgICAvLwotICAgIExpc3QgcGFyZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKE9iamVjdCBvID0gbW9kZWw7IG8gIT0gbnVsbDsgbyA9IGdldFBhcmVudChvKSkKLSAgICB7Ci0gICAgICBwYXJlbnRMaXN0LmFkZCgwLCBvKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gZXhwYW5kVG9SZXZlYWxIZWxwZXIoZWRpdFBhcnQsIHBhcmVudExpc3QsIDApOyAgICAKLSAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgIAotCi0KLSAgcHVibGljIEVkaXRQYXJ0IGV4cGFuZFRvUmV2ZWFsSGVscGVyKEVkaXRQYXJ0IGVkaXRQYXJ0LCBMaXN0IHBhcmVudExpc3QsIGludCBpbmRleCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpbnQgcGFyZW50TGlzdFNpemUgPSAgcGFyZW50TGlzdC5zaXplKCk7Ci0gICAgT2JqZWN0IG1vZGVsID0gaW5kZXggPCBwYXJlbnRMaXN0U2l6ZSA/IHBhcmVudExpc3QuZ2V0KGluZGV4KSA6IG51bGw7Ci0gICAgaWYgKG1vZGVsICE9IG51bGwgJiYgZWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7IAotICAgICAgLy8gc2VhcmNoIGVkaXRwYXJ0IGFuZCBpdHMgZGVzY2VuZGFudHMgdG8gZmluZCBhIG1hdGNoIGZvciB0aGlzIG1vZGVsIG9iamVjdAotICAgICAgLy8KLSAgICAgIHJlc3VsdCA9IGdldEVkaXRQYXJ0KGVkaXRQYXJ0LCBtb2RlbCk7ICAKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRFZGl0UGFydCgiICsgaW5kZXggKyAiLCAiICsgbW9kZWwgKyAiKSA9ICIgKyByZXN1bHQpOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaW5kZXggPCAocGFyZW50TGlzdFNpemUgLSAxKSkKLSAgICAgIHsKLSAgICAgICAgLy8gd2UndmUgZm91bmQgdGhlIGVkaXRQYXJ0IGZvciB0aGUgaXRlbSBpbiB0aGUgcGFyZW50TGlzdCAKLSAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBpdGVtIAotICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgVHJlZU5vZGVFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgICgoVHJlZU5vZGVFZGl0UGFydClyZXN1bHQpLnNldEV4cGFuZGVkKHRydWUpOwotICAgICAgICB9ICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gZXhwYW5kVG9SZXZlYWxIZWxwZXIocmVzdWx0LCBwYXJlbnRMaXN0LCBpbmRleCArIDEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgCi0gICAgCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBtb2RlbCkKLSAgeyAKLSAgICBPYmplY3QgcGFyZW50ID0gbnVsbDsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgIHsKLSAgICAgIHBhcmVudCA9ICgoRU9iamVjdCltb2RlbCkuZUNvbnRhaW5lcigpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfSAgICAgCi0KLQotICBwdWJsaWMgdm9pZCBzY3JvbGxJbnRvVmlldyhFZGl0UGFydCBlZGl0UGFydCkKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBHcm91cEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQgPSAoR3JvdXBFZGl0UGFydClwYXJlbnQ7Ci0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2Nyb2xsVG9SZXZlYWxFZGl0UGFydChlZGl0UGFydCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9BYnN0cmFjdENvbm5lY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQWJzdHJhY3RDb25uZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjc5ODM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9BYnN0cmFjdENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFN3aXRjaDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIEFic3RyYWN0Q29ubmVjdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJQ29ubmVjdGlvbk1hbmFnZXIKLXsgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEFHQVRFX0ZPUldBUkQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QQUdBVEVfQkFDSyAgICA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVEVEICAgICAgICAgID0gMjsKLQotICBwcm90ZWN0ZWQgR3JvdXBFZGl0UGFydCBncm91cEVkaXRQYXJ0OwotCi0gIHB1YmxpYyBBYnN0cmFjdENvbm5lY3Rpb25NYW5hZ2VyKEdyb3VwRWRpdFBhcnQgZ3JvdXBFZGl0UGFydCkKLSAgewotICAgIHRoaXMuZ3JvdXBFZGl0UGFydCA9IGdyb3VwRWRpdFBhcnQ7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgV1NETFN3aXRjaCBjcmVhdGVTd2l0Y2goaW50IHNlbGVjdGlvblR5cGUpCi0gIHsKLSAgICByZXR1cm4gbmV3IFdTRExTd2l0Y2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BhZ2F0ZUZvcndhcmQoT2JqZWN0IG1vZGVsKQotICB7ICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7Ci0gICAgICBXU0RMU3dpdGNoIHRoZVN3aXRjaCA9IGNyZWF0ZVN3aXRjaChQUk9QQUdBVEVfRk9SV0FSRCk7Ci0gICAgICB0aGVTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpbW9kZWwpOyAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2Nyb2xsVG9SZXZlYWxJbnB1dENvbm5lY3Rpb24oKTsKLSAgICB9ICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZW1vdmVDb25uZWN0aW9ucygpOwotICAgIH0KLSAgICBwcm9wYWdhdGVGb3J3YXJkVG9OZXh0KG1vZGVsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BhZ2F0ZUJhY2soT2JqZWN0IG1vZGVsKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFdTRExTd2l0Y2ggdGhlU3dpdGNoID0gY3JlYXRlU3dpdGNoKFBST1BBR0FURV9CQUNLKTsKLSAgICAgIHRoZVN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCltb2RlbCk7ICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNjcm9sbFRvUmV2ZWFsT3V0cHV0Q29ubmVjdGlvbigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlQ29ubmVjdGlvbnMoKTsKLSAgICB9Ci0gICAgcHJvcGFnYXRlQmFja1RvUHJldmlvdXMobW9kZWwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRNb2RlbE9iamVjdChPYmplY3QgbW9kZWwpCi0gIHsgIAotCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpCi0JewotICAgIAlOb2RlIG5vZGUgPSAoTm9kZSltb2RlbDsKLQkJLy9EZWZpbml0aW9uIGRlZmluaXRpb24gPSBncm91cEVkaXRQYXJ0LmdldERlZmluaXRpb24oKTsKLSAgICAgICAgd2hpbGUobm9kZSAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAKLSAgICAJICBpZiAoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgIAkgIHsKLSAgICAJCWJyZWFrOwotICAgIAkgIH0gIAotICAgIAkgIGVsc2UKLSAgICAJICB7Ci0gICAgCSAgCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAJICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgIAltb2RlbCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudCggZ3JvdXBFZGl0UGFydC5nZXREZWZpbml0aW9uKCksIChFbGVtZW50KW5vZGUpOwotICAgICAgICB9ICAKLQl9Ci0JICAJCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgewotICAgICAgV1NETFN3aXRjaCB0aGVTd2l0Y2ggPSBjcmVhdGVTd2l0Y2goU0VMRUNURUQpOwotICAgICAgdGhlU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KW1vZGVsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgcmVtb3ZlQ29ubmVjdGlvbnMoKTsKLSAgICB9Ci0gICAgcHJvcGFnYXRlRm9yd2FyZFRvTmV4dChtb2RlbCk7Ci0gICAgcHJvcGFnYXRlQmFja1RvUHJldmlvdXMobW9kZWwpOwotICB9IAotCi0gCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbm5lY3Rpb25zKCkKLSAgewotICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KG51bGwpOwotICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gIH0KLSAgICAgCi0gIHByb3RlY3RlZCB2b2lkIHByb3BhZ2F0ZUZvcndhcmRUb05leHQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgR3JvdXBFZGl0UGFydCBncm91cCA9IGdyb3VwRWRpdFBhcnQuZ2V0TmV4dCgpOwotICAgIGlmIChncm91cCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlciA9IGdyb3VwLmdldENvbm5lY3Rpb25NYW5hZ2VyKCk7Ci0gICAgICBpZiAoY29ubmVjdGlvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbk1hbmFnZXIucHJvcGFnYXRlRm9yd2FyZChtb2RlbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJvcGFnYXRlQmFja1RvUHJldmlvdXMoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgR3JvdXBFZGl0UGFydCBncm91cCA9IGdyb3VwRWRpdFBhcnQuZ2V0UHJldmlvdXMoKTsKLSAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29ubmVjdGlvbk1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXIgPSBncm91cC5nZXRDb25uZWN0aW9uTWFuYWdlcigpOwotICAgICAgaWYgKGNvbm5lY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyLnByb3BhZ2F0ZUJhY2sobW9kZWwpOwotICAgICAgfQotICAgIH0KLSAgfSAgCi0KLSAgcHJvdGVjdGVkIEJpbmRpbmcgZ2V0RW5jbG9zaW5nQmluZGluZyhFT2JqZWN0IG9iamVjdCkKLSAgeyAKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBudWxsOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nKQotICAgIHsgICAgIAotICAgICAgYmluZGluZyA9IChCaW5kaW5nKW9iamVjdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ09wZXJhdGlvbikKLSAgICB7ICAgICAKLSAgICAgIGJpbmRpbmcgPSAoQmluZGluZylvYmplY3QuZUNvbnRhaW5lcigpOwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQgfHwKLSAgICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0IHx8Ci0gICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ0ZhdWx0KQotICAgIHsKLSAgICAgIGJpbmRpbmcgPSAoQmluZGluZylvYmplY3QuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJpbmRpbmc7Ci0gIH0gICAKLQotICBwcm90ZWN0ZWQgUG9ydFR5cGUgZ2V0RW5jbG9zaW5nUG9ydFR5cGUoRU9iamVjdCBvYmplY3QpCi0gIHsgCi0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBudWxsOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgeyAgICAgCi0gICAgICBwb3J0VHlwZSA9IChQb3J0VHlwZSlvYmplY3QuZUNvbnRhaW5lcigpOwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dCB8fAotICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIE91dHB1dCB8fAotICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAJCi0gICAgICBwb3J0VHlwZSA9IG9iamVjdC5lQ29udGFpbmVyKCkgIT0gbnVsbCA/IChQb3J0VHlwZSlvYmplY3QuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKSA6IG51bGw7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkKLSAgICB7Ci0gICAgICBwb3J0VHlwZSA9IChQb3J0VHlwZSlvYmplY3Q7CQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHBvcnRUeXBlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgT3BlcmF0aW9uIGdldEVuY2xvc2luZ09wZXJhdGlvbihFT2JqZWN0IG9iamVjdCkKLSAgeyAKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKQotICAgIHsgICAgIAotICAgICAgb3BlcmF0aW9uID0gKE9wZXJhdGlvbilvYmplY3Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElucHV0IHx8Ci0gICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0IHx8Ci0gICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgRmF1bHQpCi0gICAgewotICAgICAgb3BlcmF0aW9uID0gKE9wZXJhdGlvbilvYmplY3QuZUNvbnRhaW5lcigpOwotICAgIH0gCSAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gb3BlcmF0aW9uOwotICB9IAotCQotICBwcm90ZWN0ZWQgRU9iamVjdCBnZXRNZXNzYWdlUmVmZXJlbmNlKEVPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgCi0gICAgcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dCB8fAotICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0IHx8Ci0gICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBGYXVsdCkgPyBvYmplY3QgOiBudWxsOyAgCi0gIH0JCi19ICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQmluZGluZ3NHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQmluZGluZ3NHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjU3ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0JpbmRpbmdzR3JvdXBDb25uZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFN3aXRjaDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgQmluZGluZ3NHcm91cENvbm5lY3Rpb25NYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uTWFuYWdlcgoteyAKLSAgcHVibGljIEJpbmRpbmdzR3JvdXBDb25uZWN0aW9uTWFuYWdlcihHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBzdXBlcihncm91cEVkaXRQYXJ0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgCi0gIGNsYXNzIEludGVybmFsV1NETFN3aXRjaCBleHRlbmRzIFdTRExTd2l0Y2gKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGdyb3VwRWRpdFBhcnQuZ2V0RGVmaW5pdGlvbigpKTsKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChiaW5kaW5nKTsgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoYmluZGluZyk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgCi0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCkKLSAgICB7ICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nRmF1bHQpKTsgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ0ZhdWx0KSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nRmF1bHQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdJbnB1dCkpOyAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nSW5wdXQpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGJpbmRpbmdJbnB1dCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0KLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nT3BlcmF0aW9uKSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ09wZXJhdGlvbikpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0KLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0KQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdPdXRwdXQpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nT3V0cHV0KSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nT3V0cHV0KTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUZhdWx0KEZhdWx0IGZhdWx0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaGFuZGxlSW50ZXJmYWNlSGVscGVyKGZhdWx0KTsgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gCi0gICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gICAgeyAKLSAgICAgICAgICAgICAgICAKLSAgICAgIGhhbmRsZUludGVyZmFjZUhlbHBlcihpbnB1dCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgIAotICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pIAotICAgIHsgICAgICAKLSAgICAgIGhhbmRsZUludGVyZmFjZUhlbHBlcihvcGVyYXRpb24pOyAgICAgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0KLSAgICAgICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgICB7ICAKLSAgICAgIGhhbmRsZUludGVyZmFjZUhlbHBlcihvdXRwdXQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlUG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaGFuZGxlSW50ZXJmYWNlSGVscGVyKHBvcnRUeXBlKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgCi0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgcG9ydCkKLSAgICB7ICAgICAgICAgIAotICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRFQmluZGluZygpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoYmluZGluZyk7IAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGJpbmRpbmcpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChudWxsKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgIAotICAgIAotICAgIHByb3RlY3RlZCBCaW5kaW5nIGdldFByZXZpb3VzTWF0Y2hpbmdCaW5kaW5nKFBvcnRUeXBlIHBvcnRUeXBlKQotICAgIHsKLSAgICAgIEJpbmRpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgIE9iamVjdCBwcmV2aW91c0NvbnRleHQgPSBncm91cEVkaXRQYXJ0LmdldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCgpOwotICAgICAgaWYgKHByZXZpb3VzQ29udGV4dCA9PSBudWxsKSAgICAgIAotICAgICAgewotICAgICAgICBwcmV2aW91c0NvbnRleHQgPSBncm91cEVkaXRQYXJ0LmdldEVtcGhhc2l6ZWRNb2RlbE9iamVjdCgpOwotICAgICAgfQotICAgICAgaWYgKHByZXZpb3VzQ29udGV4dCBpbnN0YW5jZW9mIEVPYmplY3QpIAotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBnZXRFbmNsb3NpbmdCaW5kaW5nKChFT2JqZWN0KXByZXZpb3VzQ29udGV4dCk7Ci0gICAgICAgIGlmIChiaW5kaW5nLmdldEVQb3J0VHlwZSgpID09IHBvcnRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gYmluZGluZzsgIAotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgICAgCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVJbnRlcmZhY2VIZWxwZXIoRU9iamVjdCBpbnRlcmZhY2VPYmplY3QpCi0gICAgeyAgIAotICAgICAgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gZ2V0RW5jbG9zaW5nUG9ydFR5cGUoaW50ZXJmYWNlT2JqZWN0KTsKLSAgICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgIGJpbmRpbmcgPSBnZXRQcmV2aW91c01hdGNoaW5nQmluZGluZyhwb3J0VHlwZSk7ICAgICAKLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKLSAgICAgICAgeyAgICAgIAotICAgICAgICAgIExpc3QgbGlzdCA9IHV0aWwuZ2V0QmluZGluZ3MocG9ydFR5cGUpOwotICAgICAgICAgIGJpbmRpbmcgPSBsaXN0LnNpemUoKSA+IDAgPyAoQmluZGluZylsaXN0LmdldCgwKSA6IG51bGw7ICAKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoYmluZGluZyk7ICAgCi0gICAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nKTsgICAgIAotICAgICAgICAgIEVPYmplY3QgYmluZGluZ09iamVjdCA9IHV0aWwuZ2V0QmluZGluZ09iamVjdChpbnRlcmZhY2VPYmplY3QsIGJpbmRpbmcpOwotICAgICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGJpbmRpbmdPYmplY3QpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgICAgewotICAgICAgICBkZWZhdWx0Q2FzZShudWxsKTsKLSAgICAgIH0KLSAgICB9ICAgCi0gIH0gICAgCi0gICAgCi0gIHByb3RlY3RlZCBXU0RMU3dpdGNoIGNyZWF0ZVN3aXRjaChpbnQgc2VsZWN0aW9uVHlwZSkKLSAgewotICAgIHJldHVybiBuZXcgSW50ZXJuYWxXU0RMU3dpdGNoKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKE9iamVjdCBtb2RlbCkKLSAgeyAgIAotICAgIHN1cGVyLnByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKGdyb3VwRWRpdFBhcnQuZ2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoKSk7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Db21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Db21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlMDg2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQ29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cGFydHMuQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbnRhaW5lckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci0gICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQKLXsgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBNRVNTQUdFX1BMQUNFX0hPTERFUiA9ICJNRVNTQUdFX1BMQUNFX0hPTERFUiI7Ci0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7IAotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBuZXdJbnB1dCkKLSAgewotICAgIGlucHV0ID0gbmV3SW5wdXQ7ICAKLSAgICBzZXRNb2RlbChpbnB1dCk7Ci0gICAgcmVmcmVzaENoaWxkcmVuKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgUGFuZWwgcGFuZWwgPSBuZXcgUGFuZWwoKTsKLSAgICBwYW5lbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzMCwgMzAsIDMwLCAzMCkpOwotICAgIC8vcGFuZWwuc2V0QmFja2dyb3VuZENvbG9yKEdyYXBoaWNzQ29uc3RhbnRzLnJlZCk7Ci0gICAgCi0gICAgQ29udGFpbmVyTGF5b3V0IGxheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKTsKLSAgICBsYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgcGFuZWwuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotICAgIHJldHVybiBwYW5lbDsKLSAgfSAKLSAgIAotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVDaGlsZChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsID09IE1FU1NBR0VfUExBQ0VfSE9MREVSKQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IE5vdEF2YWlsYWJsZU1lc3NhZ2VFZGl0UGFydCgpOwotICAgICAgZWRpdFBhcnQuc2V0TW9kZWwobW9kZWwpOwotICAgIH0gCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVkaXRQYXJ0KHRoaXMsIG1vZGVsKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9ICAKLSAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7ICAgCi0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdC5hZGQoaW5wdXQpOwotICAgIH0gICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQuYWRkKE1FU1NBR0VfUExBQ0VfSE9MREVSKTsKLSAgICB9ICAgICAgIAotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHByb3BlcnR5ID09IE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSkKLSAgICB7Ci0gICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkgPT0gTW9kZWxBZGFwdGVyLkRFVEFJTF9QUk9QRVJUWSkKLSAgICB7IAotICAgICAgcmVmcmVzaFZpc3VhbHMoKTsgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgfQotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RlZmluaXRpb25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RlZmluaXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRkODMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9EZWZpbml0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Sb3VuZGVkTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5PcGVuT25TZWxlY3Rpb25IZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Db250YWluZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkZpbGxMYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBEZWZpbml0aW9uRWRpdFBhcnQgZXh0ZW5kcyBXU0RMRWRpdFBhcnQgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIC8vLCBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0gIHByb3RlY3RlZCBDb250YWluZXJGaWd1cmUgb3V0bGluZWQ7Ci0KLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSByaWdodENvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIHRvcENvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIG1pZGRsZUNvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIGJvdHRvbUNvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFID0gIlNFTEVDVEVEX0VESVRfUEFSVF9SRUZFUkVOQ0UiOwotCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgZ2V0Vmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICB9Ci0gIC8qKiAKLSAgICogQXBhcnQgZnJvbSB0aGUgZGVhY3RpdmF0aW9uIGRvbmUgaW4gc3VwZXIsIHRoZSBzb3VyY2UKLSAgICogYW5kIHRhcmdldCBjb25uZWN0aW9ucyBhcmUgZGVhY3RpdmF0ZWQsIGFuZCB0aGUgdmlzdWFsCi0gICAqIHBhcnQgb2YgdGhlIHRoaXMgaXMgcmVtb3ZlZC4KLSAgICoKLSAgICogQHNlZSAjYWN0aXZhdGUoKSAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgZ2V0Vmlld2VyKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlW10gaW5pdENvbnRlbnRQYW5lcygpCi0gIHsKLSAgICBJRmlndXJlW10gY29udGVudFBhbmVzID0gbmV3IElGaWd1cmVbNF07Ci0gICAgY29udGVudFBhbmVzWzBdID0gcmlnaHRDb250ZW50UGFuZTsKLSAgICBjb250ZW50UGFuZXNbMV0gPSB0b3BDb250ZW50UGFuZTsKLSAgICBjb250ZW50UGFuZXNbMl0gPSBtaWRkbGVDb250ZW50UGFuZTsKLSAgICBjb250ZW50UGFuZXNbM10gPSBib3R0b21Db250ZW50UGFuZTsKLSAgICByZXR1cm4gY29udGVudFBhbmVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBnZXRDb250ZW50UGFuZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLQotICAgIGlmIChtb2RlbCA9PSBTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgIHsKLSAgICAgIFdTRExHcm91cE9iamVjdCBncm91cE9iamVjdCA9IChXU0RMR3JvdXBPYmplY3QpbW9kZWw7Ci0gICAgICBzd2l0Y2ggKGdyb3VwT2JqZWN0LmdldFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuSU1QT1JUU19HUk9VUCA6Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlRZUEVTX0dST1VQIDoKLSAgICAgICAgICAvL2Nhc2UgV1NETEdyb3VwT2JqZWN0LkVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkJJTkRJTkdTX0dST1VQIDoKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuTUVTU0FHRVNfR1JPVVAgOgotICAgICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5QT1JUX1RZUEVTX0dST1VQIDoKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuU0VSVklDRVNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBudWxsOwotICAgIGlmIChtb2RlbCA9PSBTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFKQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IFBhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQoKTsKLSAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIGVkaXRQYXJ0LnNldFBhcmVudCh0aGlzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gc3VwZXIuY3JlYXRlQ2hpbGQobW9kZWwpOwotICAgIH0KLSAgICByZXR1cm4gZWRpdFBhcnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgQ29udGFpbmVyRmlndXJlIG91dGVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIENvbnRhaW5lckxheW91dCBhbmNob3JlZExheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBpbnQgYWxpZ25GaWd1cmUoSUZpZ3VyZSBwYXJlbnQsIElGaWd1cmUgY2hpbGQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoY2hpbGQgPT0gb3V0bGluZWQpID8gMCA6IC0xOwotICAgICAgfQotICAgIH07Ci0gICAgb3V0ZXIuc2V0TGF5b3V0TWFuYWdlcihhbmNob3JlZExheW91dCk7Ci0gICAgLyoKLSAgICBDb250YWluZXJGaWd1cmUgb3V0ZXIgPSBuZXcgQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUodGhpcykKLSAgICB7Ci0gICAgICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkUGFydEVkaXRQYXJ0ICE9IG51bGwgPyBzZWxlY3RlZFBhcnRFZGl0UGFydC5nZXRGaWd1cmUoKSA6IHRoaXM7Ci0gICAgICB9ICAgICAgICAgICAgICAgCi0gICAgfTsqLwotICAgIG91dGVyLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwodHJ1ZSk7Ci0gICAgLy9vdXRlci5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCAyMCwgMCwgMCkpOwotCi0gICAgb3V0bGluZWQgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgb3V0ZXIuYWRkKG91dGxpbmVkKTsKLSAgICAvL291dGxpbmVkLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIG91dGxpbmVkLnNldExheW91dE1hbmFnZXIobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgb3V0bGluZWQuc2V0Qm9yZGVyKG5ldyBSb3VuZGVkTGluZUJvcmRlcigxLCA2KSk7Ci0gICAgb3V0bGluZWQuc2V0Rm9yZWdyb3VuZENvbG9yKGdyb3VwQm9yZGVyQ29sb3IpOwotCi0gICAgQ29udGFpbmVyRmlndXJlIHJpZ2h0UGFuZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICByaWdodFBhbmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgMCwgMCwgMzAwKSk7Ci0gICAgcmlnaHRQYW5lLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIG91dGVyLmFkZChyaWdodFBhbmUpOwotCi0gICAgLy9SZWN0YW5nbGVGaWd1cmUgc3BhY2VyID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotICAgIC8vcmlnaHRQYW5lLmFkZChzcGFjZXIpOwotICAgIC8vc3BhY2VyLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig0NTAsIDIwMCkpOwotCi0gICAgcmlnaHRDb250ZW50UGFuZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICByaWdodFBhbmUuYWRkKHJpZ2h0Q29udGVudFBhbmUpOwotICAgIHJpZ2h0Q29udGVudFBhbmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMTUsIDIwLCAxNSwgMTUpKTsKLQotICAgIENvbnRhaW5lckZpZ3VyZSBsYWJlbEhvbGRlciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBvdXRsaW5lZC5hZGQobGFiZWxIb2xkZXIpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgICBsYWJlbEhvbGRlci5hZGQobGFiZWwpOwotICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDIsIDUsIDAsIDUpKTsKLSAgICBsYWJlbC5zZXRGb250KG1lZGl1bUZvbnQpOwotICAgIGxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfREVGSU5JVElPTiIpKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCi0gICAgdG9wQ29udGVudFBhbmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgb3V0bGluZWQuYWRkKHRvcENvbnRlbnRQYW5lKTsKLQotICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDE1KTsKLSAgICBmaWxsTGF5b3V0LnNldEhvcml6b250YWwodHJ1ZSk7Ci0gICAgdG9wQ29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcihmaWxsTGF5b3V0KTsKLSAgICB0b3BDb250ZW50UGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigxMCwgMTAsIDEwLCAxMCkpOwotCi0gICAgbWlkZGxlQ29udGVudFBhbmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgb3V0bGluZWQuYWRkKG1pZGRsZUNvbnRlbnRQYW5lKTsKLSAgICBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoMTUpOwotICAgIGZpbGxMYXlvdXQuc2V0SG9yaXpvbnRhbCh0cnVlKTsKLSAgICBtaWRkbGVDb250ZW50UGFuZS5zZXRMYXlvdXRNYW5hZ2VyKGZpbGxMYXlvdXQpOwotICAgIG1pZGRsZUNvbnRlbnRQYW5lLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsIDEwLCAxMCwgMTApKTsKLQotICAgIGJvdHRvbUNvbnRlbnRQYW5lID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIG91dGxpbmVkLmFkZChib3R0b21Db250ZW50UGFuZSk7Ci0gICAgYm90dG9tQ29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBib3R0b21Db250ZW50UGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCAxMCwgMTAsIDEwKSk7Ci0KLSAgICByZXR1cm4gb3V0ZXI7Ci0gIH0KLQotICAvL3B1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgLy97Ci0gIC8vICByZXR1cm4gY29udGVudFBhbmU7Ci0gIC8vfSAgIAotICBwdWJsaWMgUGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydCBnZXRQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KCkKLSAgewotICAgIFBhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgIGlmIChlZGl0UGFydC5nZXRNb2RlbCgpID09IFNFTEVDVEVEX0VESVRfUEFSVF9SRUZFUkVOQ0UpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBHcm91cEVkaXRQYXJ0IGdldEdyb3VwRWRpdFBhcnQoaW50IHR5cGUpCi0gIHsKLSAgICBHcm91cEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgR3JvdXBFZGl0UGFydCBncm91cEVkaXRQYXJ0ID0gKEdyb3VwRWRpdFBhcnQpbzsKLSAgICAgICAgaWYgKGdyb3VwRWRpdFBhcnQuZ2V0VHlwZSgpID09IHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBncm91cEVkaXRQYXJ0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFKTsKLSAgICBsaXN0LmFkZEFsbChzdXBlci5nZXRNb2RlbENoaWxkcmVuKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlT3BlblJlcXVlc3QoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICBHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQgPSBudWxsOwotICAgIGlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgSW1wb3J0KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbilnZXRNb2RlbCgpOwotICAgICAgT3Blbk9uU2VsZWN0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBPcGVuT25TZWxlY3Rpb25IZWxwZXIoZGVmaW5pdGlvbik7Ci0gICAgICBoZWxwZXIub3BlbkVkaXRvcih0aGVJbXBvcnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSAoRWRpdFBhcnQpZWRpdFBhcnQuZ2V0UGFyZW50KCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBHcm91cEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXBFZGl0UGFydCA9IChHcm91cEVkaXRQYXJ0KXBhcmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZ3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBHcm91cEVkaXRQYXJ0IG5leHRHcm91cEVkaXRQYXJ0ID0gZ3JvdXBFZGl0UGFydC5nZXROZXh0KCk7Ci0gICAgICAgIGlmIChuZXh0R3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5leHRHcm91cEVkaXRQYXJ0LmlucHV0Q29ubmVjdGlvbiBpbnN0YW5jZW9mIFRyZWVOb2RlRWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChUcmVlTm9kZUVkaXRQYXJ0KSAobmV4dEdyb3VwRWRpdFBhcnQuaW5wdXRDb25uZWN0aW9uKSkuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEdyb3VwRWRpdFBhcnQgcHJldkdyb3VwRWRpdFBhcnQgPSBncm91cEVkaXRQYXJ0LmdldFByZXZpb3VzKCk7Ci0gICAgICAgIGlmIChwcmV2R3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHByZXZHcm91cEVkaXRQYXJ0Lm91dHB1dENvbm5lY3Rpb24gaW5zdGFuY2VvZiBUcmVlTm9kZUVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoVHJlZU5vZGVFZGl0UGFydCkgKHByZXZHcm91cEVkaXRQYXJ0Lm91dHB1dENvbm5lY3Rpb24pKS5zZXRFeHBhbmRlZCh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHVwZGF0ZUNvbm5lY3Rpb25zKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICB1cGRhdGVDb25uZWN0aW9ucygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlQ29ubmVjdGlvbnMoKQotICB7Ci0gICAgLy8gdG9kbyAgICAgICAgIAotICAgIGlmIChpc0FjdGl2ZSgpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBmaW5hbCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQgPSBnZXRTZWxlY3RlZEVkaXRQYXJ0KGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgR3JvdXBFZGl0UGFydCBncm91cCA9IGdldENvbnRhaW5pbmdHcm91cChzZWxlY3RlZEVkaXRQYXJ0KTsKLSAgICAgICAgaWYgKGdyb3VwICE9IG51bGwgJiYgZ3JvdXAuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXAuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3RlZE1vZGVsT2JqZWN0KHNlbGVjdGVkRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIWlzQW5jZXN0b3IoZ2V0UGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydCgpLCBzZWxlY3RlZEVkaXRQYXJ0KSkKLSAgICAgICAgewotICAgICAgICAgIGdyb3VwID0gZ2V0R3JvdXBFZGl0UGFydChXU0RMR3JvdXBPYmplY3QuUE9SVF9UWVBFU19HUk9VUCk7Ci0gICAgICAgICAgZ3JvdXAuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3RlZE1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgZ2V0Q29udGFpbmluZ0dyb3VwKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICBHcm91cEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEdyb3VwRWRpdFBhcnQpcGFyZW50OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBHcm91cEVkaXRQYXJ0IGdldE5leHRHcm91cEVkaXRQYXJ0KEdyb3VwRWRpdFBhcnQgZ3JvdXBFZGl0UGFydCkKLSAgewotICAgIEdyb3VwRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBHcm91cEVkaXRQYXJ0IHByZXYgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIEdyb3VwRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIEdyb3VwRWRpdFBhcnQgZWRpdFBhcnQgPSAoR3JvdXBFZGl0UGFydClvOwotICAgICAgICBpZiAocHJldiA9PSBncm91cEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldiA9IGVkaXRQYXJ0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgZ2V0UHJldmlvdXNHcm91cEVkaXRQYXJ0KEdyb3VwRWRpdFBhcnQgZ3JvdXBFZGl0UGFydCkKLSAgewotICAgIEdyb3VwRWRpdFBhcnQgcHJldiA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgR3JvdXBFZGl0UGFydCBlZGl0UGFydCA9IChHcm91cEVkaXRQYXJ0KW87Ci0gICAgICAgIGlmIChlZGl0UGFydCA9PSBncm91cEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldiA9IGVkaXRQYXJ0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJldjsKLSAgfQotCi0gIHByb3RlY3RlZCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldFNlbGVjdGVkRWRpdFBhcnQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBPYmplY3QgZmlyc3QgPSBzLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgZWRpdFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClmaXJzdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaENoaWxkcmVuKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIHVwZGF0ZUNvbm5lY3Rpb25zKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0FuY2VzdG9yKEVkaXRQYXJ0IGFuY2VzdG9yLCBFZGl0UGFydCBjaGlsZCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKGFuY2VzdG9yICE9IG51bGwgJiYgY2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEVkaXRQYXJ0IGVkaXRQYXJ0ID0gY2hpbGQ7IGVkaXRQYXJ0ICE9IG51bGw7IGVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlZGl0UGFydCA9PSBhbmNlc3RvcikKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9EcmlsbERvd25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RyaWxsRG93bkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjA3YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RyaWxsRG93bkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETENvbXBvbmVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgRHJpbGxEb3duRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBMYWJlbCBkcmlsbERvd25CdXR0b25MYWJlbDsgCi0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENvbnRhaW5lckZpZ3VyZSBmaWd1cmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7ICAKLSAgICBkcmlsbERvd25CdXR0b25MYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIGRyaWxsRG93bkJ1dHRvbkxhYmVsLnNldEljb24oV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9mb3J3YXJkLmdpZiIpKTsKLSAgICBmaWd1cmUuYWRkKGRyaWxsRG93bkJ1dHRvbkxhYmVsKTsKLSAgICBsYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIGxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVU5LTk9XTiIpKTsKLSAgICAKLS8vICBldmlsIGhhY2sgdG8gcHJvdmlkZSB1bmRlcmxpbmVzCi0gICAgYm9vbGVhbiBpc0xpbnV4ID0gamF2YS5pby5GaWxlLnNlcGFyYXRvci5lcXVhbHMoIi8iKTsKLSAgICBpZiAoIWlzTGludXgpCi0gICAgewotICAgICAgRm9udCB1bmRlcmxpbmVGb250ID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJUYWhvbWEiLCA4LCBTV1QuTk9ORSk7IAotICAgICAgRm9udERhdGEgb2xkRGF0YSA9IHVuZGVybGluZUZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLSAgICAgIEZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKG9sZERhdGEuZ2V0TmFtZSgpLCBvbGREYXRhLmdldEhlaWdodCgpLCBTV1QuTk9ORSk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETy4uLiBjbGVhbiB0aGlzIGF3ZnVsIGNvZGUgdXAuLi4gd2Ugc2VlbSB0byBiZSBsZWFraW5nIGhlcmUgdG9vCi0gICAgICAgIC8vIHdlIGNhbid0IGNhbGwgdGhpcyBkaXJlY3RseSBzaW5jZSB0aGUgbWV0aG9kcyBhcmUgT1MgZGVwZW5kYW50Ci0gICAgICAgIC8vIGZvbnREYXRhLmRhdGEubGZVbmRlcmxpbmUgPSAxCi0gICAgICAgIC8vIHNvIGluc3RlYWQgd2UgdXNlIHJlZmxlY3Rpb24KLSAgICAgICAgT2JqZWN0IGRhdGEgPSBmb250RGF0YS5nZXRDbGFzcygpLmdldEZpZWxkKCJkYXRhIikuZ2V0KGZvbnREYXRhKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkYXRhIiArIGRhdGEuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIGRhdGEuZ2V0Q2xhc3MoKS5nZXRGaWVsZCgibGZVbmRlcmxpbmUiKS5zZXRCeXRlKGRhdGEsIChieXRlKTEpOwotICAgICAgICBGb250IGZvbnQgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgZm9udERhdGEpOwotICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7ICAgIAotICAgICAgfQotICAgIH0KLSAgICBmaWd1cmUuYWRkKGxhYmVsKTsKLSAgICAKLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAgIAotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgCi0gIHsKLSAgCURyaWxsRG93bkVkaXRQYXJ0U2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgcG9saWN5ID0gbmV3IERyaWxsRG93bkVkaXRQYXJ0U2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3koKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBwb2xpY3kpOyAgICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAKLQkgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCB8fAotICAgICAgICByZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICB7Ci0gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChoaXRUZXN0KGRyaWxsRG93bkJ1dHRvbkxhYmVsLCBwKSB8fCBoaXRUZXN0KGxhYmVsLCBwKSkKLSAgICAgICAgewotICAJCSAgICBwZXJmb3JtRHJpbGxEb3duQWN0aW9uKCk7Ci0gICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfSAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkgCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7ICAgCi0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0gCi0KLSAgcHVibGljIGJvb2xlYW4gaGl0VGVzdChJRmlndXJlIHRhcmdldCwgUG9pbnQgbG9jYXRpb24pCi0gIHsKLSAgICBSZWN0YW5nbGUgYiA9IHRhcmdldC5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgdGFyZ2V0LnRyYW5zbGF0ZVRvQWJzb2x1dGUoYik7ICAKLSAgICByZXR1cm4gYi5jb250YWlucyhsb2NhdGlvbik7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EcmlsbERvd25BY3Rpb24oKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgICgoV1NETENvbXBvbmVudFZpZXdlcilnZXRWaWV3ZXIoKSkuc2V0SW5wdXQoZ2V0TW9kZWwoKSk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIERyaWxsRG93bkVkaXRQYXJ0U2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgZXh0ZW5kcyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSB7Ci0gIAkgcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpCi0gIAkgIHsgICAgICAgICAgICAgIAotICAJICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCSAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsgIAotICAJICAKLSAgCSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkKLSAgCSAgICB7Ci0gIAkgICAgICBHcmFwaGljYWxFZGl0UGFydCBncmFwaGljYWxFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydDsKLSAgCSAgICAgIElGaWd1cmUgZmlndXJlID0gZ3JhcGhpY2FsRWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0KLSAgCSAgICAgIE1vdmVIYW5kbGVMb2NhdG9yIGxvYyA9IG5ldyBNb3ZlSGFuZGxlTG9jYXRvcihmaWd1cmUpOyAgICAKLSAgCSAgICAgIE1vdmVIYW5kbGUgbW92ZUhhbmRsZSA9IG5ldyBNb3ZlSGFuZGxlKGdyYXBoaWNhbEVkaXRQYXJ0LCBsb2MpOyAgICAgCi0gIAkgICAgICBsaXN0LmFkZChtb3ZlSGFuZGxlKTsKLSAgCSAgICB9Ci0KLSAgCSAgICByZXR1cm4gbGlzdDsKLSAgCSAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0V4dGVuc2libGVFZGl0UGFydEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9FeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYWFmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0V4dGVuc2libGVFZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnlbXSBlZGl0UGFydEZhY3RvcmllczsKLQotICBwcm90ZWN0ZWQgc3RhdGljIEV4dGVuc2libGVFZGl0UGFydEZhY3RvcnkgaW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgCi0gICAgICBpbnN0YW5jZSA9IG5ldyBFeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeSgpCi0gIHsKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCi0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uRURJVF9QQVJUX0ZBQ1RPUlkpOyAKLSAgICBlZGl0UGFydEZhY3RvcmllcyA9IG5ldyBFZGl0UGFydEZhY3RvcnlbZXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZWRpdFBhcnRGYWN0b3JpZXNbaV0gPSAoRWRpdFBhcnRGYWN0b3J5KWV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uRURJVF9QQVJUX0ZBQ1RPUlksIG51bGwpOwotICAgIH0KLSAgfSAgICAgICAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBnZXRBcHBsaWNhYmxlRWRpdFBhcnRGYWN0b3J5KE9iamVjdCBvYmplY3QpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEVkaXRQYXJ0RmFjdG9yeSByZXN1bHQgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uc1tpXS5pc0FwcGxpY2FibGUob2JqZWN0KSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICA9IGVkaXRQYXJ0RmFjdG9yaWVzW2ldOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAJYm9vbGVhbiBiID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLSAgcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IHBhcmVudCwgT2JqZWN0IG1vZGVsKQotICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSA9IGdldEFwcGxpY2FibGVFZGl0UGFydEZhY3RvcnkobW9kZWwpOwotICAgIGlmIChmYWN0b3J5ICE9IG51bGwpICAgCi0gICAgewotICAgICAgcmVzdWx0ID0gZmFjdG9yeS5jcmVhdGVFZGl0UGFydChwYXJlbnQsIG1vZGVsKTsKLSAgICB9ICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFVua25vd25PYmplY3RFZGl0UGFydCgpOwotICAgICAgcmVzdWx0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIHJlc3VsdC5zZXRQYXJlbnQocGFyZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Hcm91cEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvR3JvdXBFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI2ZWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Hcm91cEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TY3JvbGxQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5WaWV3cG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVmlld3BvcnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuUm91bmRlZExpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETENvbXBvbmVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbnRhaW5lckZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5GaWxsTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgR3JvdXBFZGl0UGFydCBleHRlbmRzIFdTRExFZGl0UGFydAotewotICBwcm90ZWN0ZWQgU2Nyb2xsUGFuZSBzY3JvbGxwYW5lOwotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgcHJvdGVjdGVkIE9iamVjdCBlbXBoYXNpemVkTW9kZWxPYmplY3Q7Ci0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3Q7Ci0gIHByb3RlY3RlZCBPYmplY3Qgb3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0OwotCi0gIHB1YmxpYyBXU0RMVHJlZU5vZGVFZGl0UGFydCBlbXBoYXNpemVkRWRpdFBhcnQ7Ci0gIHB1YmxpYyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGlucHV0Q29ubmVjdGlvbjsKLSAgcHVibGljIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgb3V0cHV0Q29ubmVjdGlvbjsKLQotICBwdWJsaWMgR3JvdXBFZGl0UGFydCBuZXh0R3JvdXBFZGl0UGFydDsKLSAgcHVibGljIElDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlcjsKLQotICBwcm90ZWN0ZWQgSW50ZXJuYWxGaWd1cmVMaXN0ZW5lciBmaWd1cmVMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbEZpZ3VyZUxpc3RlbmVyKCk7Ci0KLSAgY2xhc3MgSW50ZXJuYWxGaWd1cmVMaXN0ZW5lciBpbXBsZW1lbnRzIEZpZ3VyZUxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBmaWd1cmVNb3ZlZChJRmlndXJlIHNvdXJjZSkKLSAgICB7Ci0gICAgICBTY2FsYWJsZVJvb3RFZGl0UGFydCByb290ID0gKFNjYWxhYmxlUm9vdEVkaXRQYXJ0KWdldFZpZXdlcigpLmdldFJvb3RFZGl0UGFydCgpOwotICAgICAgcm9vdC5nZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKS5yZXBhaW50KCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIGVtcGhhc2l6ZWRNb2RlbE9iamVjdDsKLSAgfQotCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuICgoV1NETEdyb3VwT2JqZWN0KWdldE1vZGVsKCkpLmdldERlZmluaXRpb24oKTsKLSAgfQotCi0gIC8vcHJvdGVjdGVkIHZvaWQgc2V0RW1waGFzaXplZE9iamVjdChFZGl0UGFydCBlZGl0UGFydCkKLSAgLy97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8vICBVbmtub3duT2JqZWN0RWRpdFBhcnQgZXAgPSBudWxsOwotICAvLyAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgVW5rbm93bk9iamVjdEVkaXRQYXJ0KQotICAvLyAgewotICAvLyAgIGVwID0gKFVua25vd25PYmplY3RFZGl0UGFydCllZGl0UGFydDsKLSAgLy8gIH0KLSAgLy8KLSAgLy8gIGlmIChlbXBoYXNpemVkRWRpdFBhcnQgIT0gbnVsbCkKLSAgLy8gIHsKLSAgLy8gICAgZW1waGFzaXplZEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWQoZmFsc2UpOwotICAvLyAgfQotICAvLyAgaWYgKGVwICE9IG51bGwpCi0gIC8vICB7Ci0gIC8vICAgIGVtcGhhc2l6ZWRFZGl0UGFydCA9IGVwOwotICAvLyAgICBlbXBoYXNpemVkRWRpdFBhcnQuc2V0RW1waGFzaXplZCh0cnVlKTsKLSAgLy8gIH0KLSAgLy99ICAKLQotICBwdWJsaWMgdm9pZCBzZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgZW1waGFzaXplZE1vZGVsT2JqZWN0ID0gbW9kZWw7Ci0KLSAgICBpZiAoZW1waGFzaXplZEVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgZW1waGFzaXplZEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWQoZmFsc2UpOwotICAgIH0KLQotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0TWF0Y2hpbmdDaGlsZEVkaXRQYXJ0KG1vZGVsKTsKLSAgICBlbXBoYXNpemVkRWRpdFBhcnQgPSAoZWRpdFBhcnQgaW5zdGFuY2VvZiBXU0RMVHJlZU5vZGVFZGl0UGFydCkgPyAoV1NETFRyZWVOb2RlRWRpdFBhcnQpZWRpdFBhcnQgOiBudWxsOwotCi0gICAgaWYgKGVtcGhhc2l6ZWRFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGVtcGhhc2l6ZWRFZGl0UGFydC5zZXRFbXBoYXNpemVkKHRydWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNjcm9sbFRvUmV2ZWFsRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIHNjcm9sbFRvRWRpdFBhcnQoKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNjcm9sbFRvUmV2ZWFsSW5wdXRDb25uZWN0aW9uKCkKLSAgewotICAgIGlmIChpbnB1dENvbm5lY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzY3JvbGxUb0VkaXRQYXJ0KGlucHV0Q29ubmVjdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2Nyb2xsVG9SZXZlYWxPdXRwdXRDb25uZWN0aW9uKCkKLSAgewotICAgIGlmIChvdXRwdXRDb25uZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgc2Nyb2xsVG9FZGl0UGFydChvdXRwdXRDb25uZWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBpbnB1dENvbm5lY3Rpb24gPSBnZXRNYXRjaGluZ0NoaWxkRWRpdFBhcnQobW9kZWwpOwotICAgIGlucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0ID0gbW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBpbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBvdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgb3V0cHV0Q29ubmVjdGlvbiA9IGdldE1hdGNoaW5nQ2hpbGRFZGl0UGFydChtb2RlbCk7Ci0gICAgb3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0ID0gbW9kZWw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb25uZWN0aW9uTWFuYWdlcigpCi0gIHsKLSAgICBzd2l0Y2ggKGdldFR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5NRVNTQUdFU19HUk9VUCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBjb25uZWN0aW9uTWFuYWdlciA9IG5ldyBNZXNzYWdlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIodGhpcyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlNFUlZJQ0VTX0dST1VQIDoKLSAgICAgICAgewotICAgICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IFNlcnZpY2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlcih0aGlzKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuQklORElOR1NfR1JPVVAgOgotICAgICAgICB7Ci0gICAgICAgICAgY29ubmVjdGlvbk1hbmFnZXIgPSBuZXcgQmluZGluZ3NHcm91cENvbm5lY3Rpb25NYW5hZ2VyKHRoaXMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5QT1JUX1RZUEVTX0dST1VQIDoKLSAgICAgICAgewotICAgICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IFBvcnRUeXBlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIodGhpcyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSUNvbm5lY3Rpb25NYW5hZ2VyIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBjb25uZWN0aW9uTWFuYWdlcjsKLSAgfQotCi0gIHB1YmxpYyBDb250YWluZXJGaWd1cmUgb3V0ZXJQYW5lOwotCi0gIHB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBjcmVhdGVDb25uZWN0aW9uTWFuYWdlcigpOwotCi0gICAgb3V0ZXJQYW5lID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIG91dGVyUGFuZS5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKDEsIDYpKTsKLSAgICBvdXRlclBhbmUuc2V0Rm9yZWdyb3VuZENvbG9yKGdyb3VwQm9yZGVyQ29sb3IpOwotCi0gICAgQ29udGFpbmVyRmlndXJlIHIgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgLy9yLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbig0LCA0KSk7ICAgCi0gICAgci5zZXRPdXRsaW5lKGZhbHNlKTsKLSAgICByLnNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24oMCwgMCkpOwotCi0gICAgci5zZXRGaWxsKHRydWUpOwotCi0gICAgci5zZXRCYWNrZ3JvdW5kQ29sb3IoZ3JvdXBIZWFkZXJDb2xvcik7Ci0gICAgb3V0ZXJQYW5lLmFkZChyKTsKLQotICAgIC8vQ29udGFpbmVyRmlndXJlIGxhYmVsSG9sZGVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy9sYWJlbEhvbGRlci5hZGQobGFiZWwpOwotICAgIGxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBsYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigyLCA0LCAyLCA0KSk7Ci0gICAgci5hZGQobGFiZWwpOyAvL0hvbGRlcik7Ci0KLSAgICBSZWN0YW5nbGVGaWd1cmUgbGluZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLSAgICBsaW5lLnNldFByZWZlcnJlZFNpemUoMjAsIDEpOwotICAgIG91dGVyUGFuZS5hZGQobGluZSk7Ci0KLSAgICBpbnQgbWluSGVpZ2h0ID0gMjUwOwotICAgIHN3aXRjaCAoZ2V0VHlwZSgpKQotICAgIHsKLSAgICAJY2FzZSBXU0RMR3JvdXBPYmplY3QuSU1QT1JUU19HUk9VUCA6Ci0JCWNhc2UgV1NETEdyb3VwT2JqZWN0LlRZUEVTX0dST1VQIDoKLQkJewotCQkJbWluSGVpZ2h0ID0gNTA7Ci0JCQlicmVhazsJCi0JCX0KLQkJY2FzZSBXU0RMR3JvdXBPYmplY3QuRVhURU5TSUJJTElUWV9FTEVNRU5UU19HUk9VUCA6Ci0JCXsKLQkJCW1pbkhlaWdodCA9IDE1MDsKLQkJCWJyZWFrOwotCQl9Ci0gICAgfQotCi0JZmluYWwgaW50IHRoZU1pbkhlaWdodCA9IG1pbkhlaWdodDsKLSAgICBGaWxsTGF5b3V0IG91dGVyTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgICAgewotICAgICAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmNhbGN1bGF0ZVByZWZlcnJlZFNpemUocGFyZW50LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgZC51bmlvbihuZXcgRGltZW5zaW9uKDEwMCwgdGhlTWluSGVpZ2h0KSk7Ci0gICAgICAgIHJldHVybiBkOwotICAgICAgfQotICAgIH07Ci0gICAgb3V0ZXJMYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgLy9sYXlvdXQuc2V0U3BhY2luZyg1KTsKLSAgICBvdXRlclBhbmUuc2V0TGF5b3V0TWFuYWdlcihvdXRlckxheW91dCk7Ci0KLSAgICBzY3JvbGxwYW5lID0gbmV3IFNjcm9sbFBhbmUoKTsKLSAgICBzY3JvbGxwYW5lLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgc2Nyb2xscGFuZS5zZXRWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkoU2Nyb2xsUGFuZS5BVVRPTUFUSUMpOyAvL1Njcm9sbFBhbmUuQUxXQVlTKTsKLSAgICBvdXRlclBhbmUuYWRkKHNjcm9sbHBhbmUpOwotCi0gICAgQ29udGFpbmVyRmlndXJlIHBhbmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgcGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig1LCA4LCA1LCA4KSk7Ci0gICAgQ29udGFpbmVyTGF5b3V0IGxheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKTsKLSAgICBsYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgbGF5b3V0LnNldFNwYWNpbmcoMCk7Ci0gICAgcGFuZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0KLSAgICBWaWV3cG9ydCB2aWV3cG9ydCA9IG5ldyBWaWV3cG9ydCgpOwotICAgIHZpZXdwb3J0LnNldENvbnRlbnRzVHJhY2tzSGVpZ2h0KHRydWUpOwotICAgIFZpZXdwb3J0TGF5b3V0IHZpZXdwb3J0TGF5b3V0ID0gbmV3IFZpZXdwb3J0TGF5b3V0KCkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICAgIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5jYWxjdWxhdGVQcmVmZXJyZWRTaXplKHBhcmVudCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGQuaGVpZ2h0ID0gTWF0aC5taW4oZC5oZWlnaHQsIHRoZU1pbkhlaWdodCAtIDI1KTsgLy9nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICB9Ci0gICAgfTsKLSAgICB2aWV3cG9ydC5zZXRMYXlvdXRNYW5hZ2VyKHZpZXdwb3J0TGF5b3V0KTsKLQotICAgIHNjcm9sbHBhbmUuc2V0Vmlld3BvcnQodmlld3BvcnQpOwotICAgIHNjcm9sbHBhbmUuc2V0Q29udGVudHMocGFuZSk7Ci0gICAgcGFuZS5hZGRGaWd1cmVMaXN0ZW5lcihmaWd1cmVMaXN0ZW5lcik7Ci0KLSAgICByZXR1cm4gb3V0ZXJQYW5lOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBnZXRNb2RlbEFkYXB0ZXIoZ2V0TW9kZWwoKSk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsYWJlbC5zZXRUZXh0KChTdHJpbmcpYWRhcHRlci5nZXRQcm9wZXJ0eShnZXRNb2RlbCgpLCBNb2RlbEFkYXB0ZXIuTEFCRUxfUFJPUEVSVFkpKTsKLSAgICAgIC8vbGFiZWwuc2V0SWNvbigoSW1hZ2UpYWRhcHRlci5nZXRQcm9wZXJ0eShnZXRNb2RlbCgpLCBNb2RlbEFkYXB0ZXIuSU1BR0VfUFJPUEVSVFkpKTsKLSAgICB9Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBzY3JvbGxwYW5lLmdldENvbnRlbnRzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzY3JvbGxUb0VkaXRQYXJ0KGZpbmFsIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQpCi0gIHsKLSAgICBSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBzY3JvbGxUb0VkaXRQYXJ0SGVscGVyKHRhcmdldEVkaXRQYXJ0KTsKLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhyKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNjcm9sbFRvRWRpdFBhcnRIZWxwZXIoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCkKLSAgewotICAgIGlmICh0YXJnZXRFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIFJlY3RhbmdsZSByMSA9IHRhcmdldEVkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotICAgICAgUmVjdGFuZ2xlIHIyID0gZ2V0Q29udGVudFBhbmUoKS5nZXRCb3VuZHMoKTsKLSAgICAgIHNjcm9sbHBhbmUuc2Nyb2xsVmVydGljYWxUbygocjEueSAtIHIyLnkpIC0gc2Nyb2xscGFuZS5nZXRCb3VuZHMoKS5oZWlnaHQgLyAyKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRNYXRjaGluZ0NoaWxkRWRpdFBhcnQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldERlZmluaXRpb24oKTsKLSAgICBmb3IgKE9iamVjdCBvID0gbW9kZWw7IG8gIT0gbnVsbCAmJiAhKG8gaW5zdGFuY2VvZiBEZWZpbml0aW9uKTsgbyA9IGdldFBhcmVudChvKSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgwLCBvKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldE1hdGNoaW5nQ2hpbGRFZGl0UGFydCh0aGlzLCBsaXN0LCAwLCB0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBtb2RlbCkKLSAgewotICAgIE9iamVjdCBwYXJlbnQgPSBudWxsOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgewotICAgICAgcGFyZW50ID0gKChFT2JqZWN0KW1vZGVsKS5lQ29udGFpbmVyKCk7Ci0gICAgfQotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRNYXRjaGluZ0NoaWxkRWRpdFBhcnQoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCwgTGlzdCBsaXN0LCBpbnQgaW5kZXgsIGJvb2xlYW4gZ2V0VW5leHBhbmRlZFBhcmVudCkKLSAgewotICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVzdWx0ID0gKGdldFVuZXhwYW5kZWRQYXJlbnQgJiYgZWRpdFBhcnQgIT0gdGhpcykgPyBlZGl0UGFydCA6IG51bGw7Ci0gICAgT2JqZWN0IG1vZGVsID0gbGlzdC5zaXplKCkgPiBpbmRleCA/IGxpc3QuZ2V0KGluZGV4KSA6IG51bGw7Ci0gICAgaWYgKG1vZGVsICE9IG51bGwgJiYgZWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBjaGlsZCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICBpZiAoY2hpbGQuZ2V0TW9kZWwoKSA9PSBtb2RlbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGNoaWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRleCsrOwotICAgICAgaWYgKGluZGV4IDwgbGlzdC5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldE1hdGNoaW5nQ2hpbGRFZGl0UGFydChyZXN1bHQsIGxpc3QsIGluZGV4LCBnZXRVbmV4cGFuZGVkUGFyZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gKChXU0RMR3JvdXBPYmplY3QpZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotICB9Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgZ2V0TmV4dCgpCi0gIHsKLSAgICByZXR1cm4gKChEZWZpbml0aW9uRWRpdFBhcnQpZ2V0UGFyZW50KCkpLmdldE5leHRHcm91cEVkaXRQYXJ0KHRoaXMpOwotICB9Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgZ2V0UHJldmlvdXMoKQotICB7Ci0gICAgcmV0dXJuICgoRGVmaW5pdGlvbkVkaXRQYXJ0KWdldFBhcmVudCgpKS5nZXRQcmV2aW91c0dyb3VwRWRpdFBhcnQodGhpcyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3JlZnJlc2hDaGlsZHJlbigpCi0gIHsKLSAgICBpbnQgaTsKLSAgICBFZGl0UGFydCBlZGl0UGFydDsKLSAgICBPYmplY3QgbW9kZWw7Ci0KLSAgICBNYXAgbW9kZWxUb0VkaXRQYXJ0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IChFZGl0UGFydCljaGlsZHJlbi5nZXQoaSk7Ci0gICAgICBtb2RlbFRvRWRpdFBhcnQucHV0KGVkaXRQYXJ0LmdldE1vZGVsKCksIGVkaXRQYXJ0KTsKLSAgICB9Ci0KLSAgICBMaXN0IG1vZGVsT2JqZWN0cyA9IGdldE1vZGVsQ2hpbGRyZW4oKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBtb2RlbE9iamVjdHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgbW9kZWwgPSBtb2RlbE9iamVjdHMuZ2V0KGkpOwotCi0gICAgICAvL0RvIGEgcXVpY2sgY2hlY2sgdG8gc2VlIGlmIGVkaXRQYXJ0W2ldID09IG1vZGVsW2ldCi0gICAgICBpZiAoaSA8IGNoaWxkcmVuLnNpemUoKSkKLSAgICAgIHsKLSAgICAgICAgZWRpdFBhcnQgPSAoRWRpdFBhcnQpY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICBPYmplY3QgZWRpdFBhcnRNb2RlbCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gICAgICAgIGlmIChlZGl0UGFydE1vZGVsID09IG1vZGVsKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZWRpdFBhcnRNb2RlbC5nZXRDbGFzcygpID09IG1vZGVsLmdldENsYXNzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtb2RlbFRvRWRpdFBhcnQucmVtb3ZlKGVkaXRQYXJ0TW9kZWwpOwotCi0gICAgICAgICAgaWYgKGlzQWN0aXZlKCkpCi0gICAgICAgICAgICBlZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0KLSAgICAgICAgICBlZGl0UGFydC5zZXRNb2RlbChtb2RlbCk7Ci0KLSAgICAgICAgICBpZiAoaXNBY3RpdmUoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZGl0UGFydC5hY3RpdmF0ZSgpOwotICAgICAgICAgICAgZWRpdFBhcnQucmVmcmVzaCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvL0xvb2sgdG8gc2VlIGlmIHRoZSBFZGl0UGFydCBpcyBhbHJlYWR5IGFyb3VuZCBidXQgaW4gdGhlIHdyb25nIGxvY2F0aW9uCi0gICAgICBlZGl0UGFydCA9IChFZGl0UGFydCltb2RlbFRvRWRpdFBhcnQuZ2V0KG1vZGVsKTsKLQotICAgICAgaWYgKGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgIHJlb3JkZXJDaGlsZChlZGl0UGFydCwgaSk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vQW4gZWRpdHBhcnQgZm9yIHRoaXMgbW9kZWwgZG9lc24ndCBleGlzdCB5ZXQuICBDcmVhdGUgYW5kIGluc2VydCBvbmUuCi0gICAgICAgIGVkaXRQYXJ0ID0gY3JlYXRlQ2hpbGQobW9kZWwpOwotICAgICAgICBhZGRDaGlsZChlZGl0UGFydCwgaSk7Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgdHJhc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yICg7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICAgIHRyYXNoLmFkZChjaGlsZHJlbi5nZXQoaSkpOwotICAgIGZvciAoaSA9IDA7IGkgPCB0cmFzaC5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBFZGl0UGFydCBlcCA9IChFZGl0UGFydCl0cmFzaC5nZXQoaSk7Ci0gICAgICByZW1vdmVDaGlsZChlcCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaENoaWxkcmVuKCkKLSAgewotICAgIGJvb2xlYW4gcmV1c2VDaGlsZHJlbiA9IGZhbHNlOwotICAgIGlmIChnZXRWaWV3ZXIoKSBpbnN0YW5jZW9mIFdTRExDb21wb25lbnRWaWV3ZXIpCi0gICAgewotICAgICAgV1NETENvbXBvbmVudFZpZXdlciB3c2RsQ29tcG9uZW50Vmlld2VyID0gKFdTRExDb21wb25lbnRWaWV3ZXIpZ2V0Vmlld2VyKCk7Ci0gICAgICByZXVzZUNoaWxkcmVuID0gd3NkbENvbXBvbmVudFZpZXdlci5pc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZCgpOwotICAgIH0KLQotICAgIGlmIChyZXVzZUNoaWxkcmVuKQotICAgIHsKLSAgICAgIF9yZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9JQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9JQ29ubmVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQwZDBhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvSUNvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLQotcHVibGljIGludGVyZmFjZSBJQ29ubmVjdGlvbk1hbmFnZXIKLXsgCi0gIHB1YmxpYyB2b2lkIHByb3BhZ2F0ZUZvcndhcmQoT2JqZWN0IG1vZGVsKTsKLSAgcHVibGljIHZvaWQgcHJvcGFnYXRlQmFjayhPYmplY3QgbW9kZWwpOwotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZE1vZGVsT2JqZWN0KE9iamVjdCBtb2RlbCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0lGZWVkYmFja0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9JRmVlZGJhY2tIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YWMyYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0lGZWVkYmFja0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKTsKLX0gICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9NZXNzYWdlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9NZXNzYWdlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1ZTk1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTWVzc2FnZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFN3aXRjaDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uTWFuYWdlcgoteyAKLSAgcHVibGljIE1lc3NhZ2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlcihHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBzdXBlcihncm91cEVkaXRQYXJ0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAKLSAgY2xhc3MgSW50ZXJuYWxXU0RMU3dpdGNoIGV4dGVuZHMgV1NETFN3aXRjaAotICB7ICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgZmF1bHQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGZhdWx0LmdldEVNZXNzYWdlKCkpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChmYXVsdC5nZXRFTWVzc2FnZSgpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEZpcnN0UGFydChmYXVsdC5nZXRFTWVzc2FnZSgpKSk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gCi0gICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gICAgeyAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGlucHV0LmdldEVNZXNzYWdlKCkpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChpbnB1dC5nZXRFTWVzc2FnZSgpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEZpcnN0UGFydChpbnB1dC5nZXRFTWVzc2FnZSgpKSk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgIAotCi0gICAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gICAgeyAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChtZXNzYWdlKTsgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChtZXNzYWdlKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEZpcnN0UGFydChtZXNzYWdlKSk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gICAgeyAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChvdXRwdXQuZ2V0RU1lc3NhZ2UoKSk7ICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3Qob3V0cHV0LmdldEVNZXNzYWdlKCkpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZ2V0Rmlyc3RQYXJ0KG91dHB1dC5nZXRFTWVzc2FnZSgpKSk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZVBhcnQoUGFydCBwYXJ0KQotICAgIHsgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocGFydC5lQ29udGFpbmVyKCkpOyAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBhcnQuZUNvbnRhaW5lcigpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBhcnQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9IAotICAgICAgCi0gICAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgCi0KLSAgICBwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gc3VwZXIuZG9Td2l0Y2godGhlRU9iamVjdCk7Ci0gICAgICAoKERlZmluaXRpb25FZGl0UGFydClncm91cEVkaXRQYXJ0LmdldFBhcmVudCgpKS5nZXRQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KCkuc2V0SW5wdXQoZ3JvdXBFZGl0UGFydC5nZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoKSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBXU0RMU3dpdGNoIGNyZWF0ZVN3aXRjaChpbnQgc2VsZWN0aW9uVHlwZSkKLSAgewotICAgIHJldHVybiBuZXcgSW50ZXJuYWxXU0RMU3dpdGNoKCk7Ci0gIH0gICAKLQotICBwcm90ZWN0ZWQgUGFydCBnZXRGaXJzdFBhcnQoTWVzc2FnZSBtZXNzYWdlKQotICB7ICAgICAgICAgICAKLSAgICBQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7ICAgIAotICAgICAgTGlzdCBwYXJ0cyA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCk7Ci0gICAgICByZXN1bHQgPSAocGFydHMuc2l6ZSgpID4gMCkgPyAoUGFydClwYXJ0cy5nZXQoMCkgOiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwcm9wYWdhdGVCYWNrVG9QcmV2aW91cyhPYmplY3QgbW9kZWwpCi0gIHsgIAkKLSAgCW1vZGVsID0gKG1vZGVsIGluc3RhbmNlb2YgUGFydCkgPygoUGFydCltb2RlbCkuZUNvbnRhaW5lcigpIDogbW9kZWw7IAotICAgIHN1cGVyLnByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKG1vZGVsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Ob3RBdmFpbGFibGVNZXNzYWdlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Ob3RBdmFpbGFibGVNZXNzYWdlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0YTUwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTm90QXZhaWxhYmxlTWVzc2FnZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIE5vdEF2YWlsYWJsZU1lc3NhZ2VFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgCi17ICAgICAgICAgICAgCi0gIHB1YmxpYyBOb3RBdmFpbGFibGVNZXNzYWdlRWRpdFBhcnQoKQotICB7Ci0gIH0gICAKLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVklFV19OT1RfQVZBSUxBQkxFIikpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfSAgICAKLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgCi0gIHsgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfSAgICAKLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAgCi0gIH0gICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvUGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1BhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQwMjkzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvUGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgUGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydCBleHRlbmRzIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgoteyAKLSAgcHJvdGVjdGVkIE9iamVjdCBpbnB1dDsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENvbnRhaW5lckZpZ3VyZSBvdXRlciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsgCi0gICAgcmV0dXJuIG91dGVyOwotICB9IAotCi0gIHByb3RlY3RlZCB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGlucHV0LCB0aGlzKTsKLQkgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGRlZmluaXRpb24sIHRoaXMpOwotICAgIH0KLSAgICBpbnB1dCA9IG9iamVjdDsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRNb2RlbEFkYXB0ZXJMaXN0ZW5lcihpbnB1dCwgdGhpcyk7Ci0JICBkZWZpbml0aW9uID0gZ2V0UGFyZW50KCkgIT0gbnVsbCA/IChEZWZpbml0aW9uKWdldFBhcmVudCgpLmdldE1vZGVsKCkgOiBudWxsOwotICAgICAgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoZGVmaW5pdGlvbiwgdGhpcyk7Ci0gICAgfQotICAgIHJlZnJlc2goKTsKLSAgICBnZXRGaWd1cmUoKS5yZXBhaW50KCk7Ci0gIH0KLSAgCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIAotCSAgeyAgICAgICAKLQkJICBpZiAoaW5wdXQgIT0gbnVsbCkKLQkJICB7IAkKLQkgICAgICAgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGlucHV0LCB0aGlzKTsKLQkgICAgICAgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGRlZmluaXRpb24sIHRoaXMpOwotCQkgIH0gIAotCQkJc3VwZXIuZGVhY3RpdmF0ZSgpOyAKLQkJfSAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7IAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWlucHV0OwotICAgICAgT2JqZWN0IGNvbXBvbmVudCA9IHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE8uLi4gaSdtIHB1bGxpbmcgYSBmYXN0IG9uZSBoZXJlLi4uLiB3ZSBzaG91bGQgY2FsbCB0aGUgZXh0ZW5zaW9uCi0gICAgICAgIC8vIHRvIHNlZSBpZiBoZSB3YW50cyB0byBzaG93IGEgY2hpbGQgaGVyZQotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVGhpcyBpcyBiZWZvcmUgdGhlIG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbCBtb2RlbAotICAgICAgICAvLyB3aGVyZSBpdCBoYW5kbGVkIERPTSBub2RlcwotICAgICAgICAvLyBjb21wb25lbnQgPSBwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gcGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgaWYgKGVkICE9IG51bGwgJiYgZWQuZ2V0Q29udGFpbmVyKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGVkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci0gICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIAotICB7Ci0gIH0gICAgICAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkgCi0gIHsKLSAgICByZXR1cm4gZ2V0RWRpdFBhcnRGYWN0b3J5KCkuY3JlYXRlRWRpdFBhcnQodGhpcywgbW9kZWwpOwotICB9IAotCi0gIHByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBFeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIHJlZnJlc2hDaGlsZHJlbigpOwotICB9ICAKLQotICBwcm90ZWN0ZWQgTW9kZWxBZGFwdGVyIGdldE1vZGVsQWRhcHRlcihPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICByZXR1cm4gV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZ2V0QWRhcHRlcihtb2RlbE9iamVjdCk7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0TW9kZWxBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0gIAotCi19ICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1BvcnRUeXBlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Qb3J0VHlwZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMzQxOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1BvcnRUeXBlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExTd2l0Y2g7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIFBvcnRUeXBlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25NYW5hZ2VyCi17IAotICBwdWJsaWMgUG9ydFR5cGVzR3JvdXBDb25uZWN0aW9uTWFuYWdlcihHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBzdXBlcihncm91cEVkaXRQYXJ0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgCi0gIGNsYXNzIEludGVybmFsV1NETFN3aXRjaCBleHRlbmRzIFdTRExTd2l0Y2gKLSAgeyAgICAgICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNCaW5kaW5nR3JvdXBTaG93aW5nKCkKLSAgICB7Ci0gICAgICBHcm91cEVkaXRQYXJ0IHByZXZHcm91cEVkaXRQYXJ0ID0gZ3JvdXBFZGl0UGFydC5nZXRQcmV2aW91cygpOwotICAgICAgcmV0dXJuIHByZXZHcm91cEVkaXRQYXJ0ICAhPSBudWxsICYmIHByZXZHcm91cEVkaXRQYXJ0LmdldFR5cGUoKSA9PSBXU0RMR3JvdXBPYmplY3QuQklORElOR1NfR1JPVVA7Ci0gICAgfSAKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgT2JqZWN0IHBvcnRUeXBlID0gZ2V0UG9ydFR5cGVGb3JCaW5kaW5nT2JqZWN0KGJpbmRpbmcpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocG9ydFR5cGUpOyAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChwb3J0VHlwZSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgCi0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0UG9ydFR5cGVGb3JCaW5kaW5nT2JqZWN0KGJpbmRpbmdGYXVsdCkpOwotICAgICAgRmF1bHQgZmF1bHQgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVGYXVsdChiaW5kaW5nRmF1bHQpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChmYXVsdCk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChmYXVsdCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gCi0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkKLSAgICB7ICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0UG9ydFR5cGVGb3JCaW5kaW5nT2JqZWN0KGJpbmRpbmdJbnB1dCkpOyAKLSAgICAgIElucHV0IGlucHV0ID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlSW5wdXQoYmluZGluZ0lucHV0KTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoaW5wdXQpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoaW5wdXQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGdldFBvcnRUeXBlRm9yQmluZGluZ09iamVjdChiaW5kaW5nT3BlcmF0aW9uKSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZU9wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGdldFBvcnRUeXBlRm9yQmluZGluZ09iamVjdChiaW5kaW5nT3V0cHV0KSk7Ci0gICAgICBPdXRwdXQgb3V0cHV0ID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlT3V0cHV0KGJpbmRpbmdPdXRwdXQpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChvdXRwdXQpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3Qob3V0cHV0KTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUZhdWx0KEZhdWx0IGZhdWx0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShmYXVsdCkpOyAgIAotICAgICAgaWYgKGlzQmluZGluZ0dyb3VwU2hvd2luZygpKQotICAgICAgewotICAgICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGZhdWx0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShmYXVsdCkpOwotICAgICAgfQotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZmF1bHQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9IAotICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUlucHV0KElucHV0IGlucHV0KQotICAgIHsgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShpbnB1dCkpOyAgIAotICAgICAgaWYgKGlzQmluZGluZ0dyb3VwU2hvd2luZygpKQotICAgICAgewotICAgICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGlucHV0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShpbnB1dCkpOwotICAgICAgfQotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoaW5wdXQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAKLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkKLSAgICB7Ci0gICAgICBPYmplY3QgcHJldmlvdXNDb250ZXh0ID0gZ3JvdXBFZGl0UGFydC5nZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoKTsKLSAgICAgIGlmIChwcmV2aW91c0NvbnRleHQgPT0gbnVsbCkgICAgICAKLSAgICAgIHsKLSAgICAgICAgcHJldmlvdXNDb250ZXh0ID0gZ3JvdXBFZGl0UGFydC5nZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgRU9iamVjdCBtZXNzYWdlUmVmZXJlbmNlID0gbnVsbDsgICAgICAKLSAgICAgIGlmIChwcmV2aW91c0NvbnRleHQgPT0gbnVsbCB8fCBwcmV2aW91c0NvbnRleHQgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgICAgewotICAgICAgbWVzc2FnZVJlZmVyZW5jZSA9IGdldE1lc3NhZ2VSZWZlcmVuY2UobWVzc2FnZSwgKEVPYmplY3QpcHJldmlvdXNDb250ZXh0KTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1lc3NhZ2VSZWZlcmVuY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZG9Td2l0Y2gobWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICBkZWZhdWx0Q2FzZShudWxsKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgCi0gICAgICAgICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikgCi0gICAgeyAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nUG9ydFR5cGUob3BlcmF0aW9uKSk7Ci0gICAgICBpZiAoaXNCaW5kaW5nR3JvdXBTaG93aW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3Qob3BlcmF0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShvcGVyYXRpb24pKTsKLSAgICAgIH0KLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOyAgICAgIAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0gICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gICAgeyAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShvdXRwdXQpKTsgICAKLSAgICAgIGlmIChpc0JpbmRpbmdHcm91cFNob3dpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChvdXRwdXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ1BvcnRUeXBlKG91dHB1dCkpOwotICAgICAgfQotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3Qob3V0cHV0KTsgIAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlUG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gICAgeyAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KHBvcnRUeXBlKTsgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBvcnRUeXBlKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZVBvcnQoUG9ydCBwb3J0KQotICAgIHsgICAgICAgICAgCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcgIT0gbnVsbCA/IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCkgOiBudWxsOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocG9ydFR5cGUpOyAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBvcnRUeXBlKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChudWxsKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBXU0RMU3dpdGNoIGNyZWF0ZVN3aXRjaChpbnQgc2VsZWN0aW9uVHlwZSkKLSAgewotICAgIHJldHVybiBuZXcgSW50ZXJuYWxXU0RMU3dpdGNoKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgUG9ydFR5cGUgZ2V0UG9ydFR5cGVGb3JCaW5kaW5nT2JqZWN0KEVPYmplY3Qgb2JqZWN0KQotICB7IAotICAgIEJpbmRpbmcgYmluZGluZyA9IGdldEVuY2xvc2luZ0JpbmRpbmcob2JqZWN0KTsKLSAgICByZXR1cm4gYmluZGluZy5nZXRFUG9ydFR5cGUoKTsKLSAgfSAgIAotICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHByb3BhZ2F0ZUZvcndhcmQoT2JqZWN0IG1vZGVsKQotICB7IAotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIFdTRExTd2l0Y2ggdGhlU3dpdGNoID0gY3JlYXRlU3dpdGNoKFBST1BBR0FURV9GT1JXQVJEKTsKLSAgICAgIHRoZVN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCltb2RlbCk7ICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zY3JvbGxUb1JldmVhbElucHV0Q29ubmVjdGlvbigpOwotICAgIH0gICAgICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZUNvbm5lY3Rpb25zKCk7Ci0gICAgfQotCi0gICAgT2JqZWN0IG8gPSBncm91cEVkaXRQYXJ0LmdldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCgpOwotICAgIHByb3BhZ2F0ZUZvcndhcmRUb05leHQobyAhPSBudWxsID8gbyA6IG1vZGVsKTsgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKE9iamVjdCBtb2RlbCkKLSAgewotICAgIG1vZGVsID0gKG1vZGVsIGluc3RhbmNlb2YgTWVzc2FnZSkgPyBncm91cEVkaXRQYXJ0LmdldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KCkgOiBtb2RlbDsgCi0gICAgc3VwZXIucHJvcGFnYXRlQmFja1RvUHJldmlvdXMobW9kZWwpOwotICB9IAotICAKLQotICBwcm90ZWN0ZWQgTWVzc2FnZSBnZXRSZWZlcmVuY2VkTWVzc2FnZShFT2JqZWN0IG8pCi0gIHsgICAgICAKLSAgICBNZXNzYWdlIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBJbnB1dCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKElucHV0KW8pLmdldEVNZXNzYWdlKCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIE91dHB1dCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKE91dHB1dClvKS5nZXRFTWVzc2FnZSgpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKEZhdWx0KW8pLmdldEVNZXNzYWdlKCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzTWF0Y2hpbmdNZXNzYWdlUmVmZXJlbmNlKEVPYmplY3QgbWVzc2FnZVJlZmVyZW5jZSwgTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgTWVzc2FnZSBtID0gZ2V0UmVmZXJlbmNlZE1lc3NhZ2UobWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgcmV0dXJuIChtICE9IG51bGwpICYmIChtID09IG1lc3NhZ2VSZWZlcmVuY2UpOwotICB9Ci0gIAotICBwdWJsaWMgRU9iamVjdCBnZXRNZXNzYWdlUmVmZXJlbmNlKE1lc3NhZ2UgbWVzc2FnZSwgRU9iamVjdCBwcmV2Q29udGV4dCkKLSAgewotICAgIEVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgUG9ydFR5cGUgcHJldlBvcnRUeXBlID0gZ2V0RW5jbG9zaW5nUG9ydFR5cGUocHJldkNvbnRleHQpOwotICAgIE9wZXJhdGlvbiBwcmV2T3BlcmF0aW9uID0gZ2V0RW5jbG9zaW5nT3BlcmF0aW9uKHByZXZDb250ZXh0KTsgIAotICAgIEVPYmplY3QgcHJldk1lc3NhZ2VSZWZlcmVuY2UgPSBnZXRNZXNzYWdlUmVmZXJlbmNlKHByZXZDb250ZXh0KTsKLSAgICAKLSAgICBpZiAocHJldlBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0TWVzc2FnZVJlZmVyZW5jZShtZXNzYWdlLCBwcmV2UG9ydFR5cGUsIHByZXZPcGVyYXRpb24sIHByZXZNZXNzYWdlUmVmZXJlbmNlKTsgIAotICAgIH0gICAKLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgeyAgICAKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdyb3VwRWRpdFBhcnQuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1dGlsLmdldFBvcnRUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKWkubmV4dCgpOyAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IGdldE1lc3NhZ2VSZWZlcmVuY2UobWVzc2FnZSwgcG9ydFR5cGUsIG51bGwsIG51bGwpOyAgCi0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgRU9iamVjdCBnZXRNZXNzYWdlUmVmZXJlbmNlKE1lc3NhZ2UgbWVzc2FnZSwgUG9ydFR5cGUgcG9ydFR5cGUsIE9wZXJhdGlvbiBwcmV2T3BlcmF0aW9uLCBFT2JqZWN0IHByZXZNZXNzYWdlUmVmZXJlbmNlKQotICB7Ci0gICAgRU9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChwcmV2TWVzc2FnZVJlZmVyZW5jZSAhPSBudWxsICYmIGlzTWF0Y2hpbmdNZXNzYWdlUmVmZXJlbmNlKHByZXZNZXNzYWdlUmVmZXJlbmNlLCBtZXNzYWdlKSkgCi0gICAgewotICAgICAgcmVzdWx0ID0gcHJldk1lc3NhZ2VSZWZlcmVuY2U7Ci0gICAgfQotICAgICAgCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIHByZXZPcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBnZXRNZXNzYWdlUmVmZXJlbmNlKG1lc3NhZ2UsIHByZXZPcGVyYXRpb24pOyAgICAgICAKLSAgICB9Ci0gICAgICAgICAgICAKLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7IAotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgcmVzdWx0ID0gZ2V0TWVzc2FnZVJlZmVyZW5jZShtZXNzYWdlLCBvcGVyYXRpb24pOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsgICAgCi0gIH0gCi0gIAotICBwdWJsaWMgRU9iamVjdCBnZXRNZXNzYWdlUmVmZXJlbmNlKE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIEVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLSAgICBPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKTsgCi0gICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0TWVzc2FnZSgpID09IG1lc3NhZ2UpCi0gICAgewotICAgICAgcmVzdWx0ID0gaW5wdXQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5nZXRNZXNzYWdlKCkgPT0gbWVzc2FnZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBvdXRwdXQ7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvcGVyYXRpb24uZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRmF1bHQgZmF1bHQgPSAoRmF1bHQpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChmYXVsdC5nZXRNZXNzYWdlKCkgPT0gbWVzc2FnZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGZhdWx0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsgICAgICAgIAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1NlcnZpY2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1NlcnZpY2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWNiNjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9TZXJ2aWNlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExTd2l0Y2g7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIFNlcnZpY2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbk1hbmFnZXIKLXsgICAKLSAgcHVibGljIFNlcnZpY2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlcihHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBzdXBlcihncm91cEVkaXRQYXJ0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAotICBwcm90ZWN0ZWQgY2xhc3MgSW50ZXJuYWxXU0RMU3dpdGNoIGV4dGVuZHMgV1NETFN3aXRjaAotICB7Ci0gICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIGhhbmRsZUJpbmRpbmdIZWxwZXIoYmluZGluZyk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgICAgICAKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICAgIHsgICAgCi0gICAgICBoYW5kbGVCaW5kaW5nSGVscGVyKGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ0ZhdWx0KSk7IAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkKLSAgICB7ICAgIAotICAgICAgaGFuZGxlQmluZGluZ0hlbHBlcihnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdJbnB1dCkpOyAKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBoYW5kbGVCaW5kaW5nSGVscGVyKGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ09wZXJhdGlvbikpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgaGFuZGxlQmluZGluZ0hlbHBlcihnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdPdXRwdXQpKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgIAotCi0gICAgcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgZmF1bHQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGhhbmRsZVBvcnRUeXBlSGVscGVyKGdldEVuY2xvc2luZ1BvcnRUeXBlKGZhdWx0KSk7ICAgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gCi0gICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gICAgeyAgICAgICAKLSAgICAgIGhhbmRsZVBvcnRUeXBlSGVscGVyKGdldEVuY2xvc2luZ1BvcnRUeXBlKGlucHV0KSk7ICAgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgIAotICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pIAotICAgIHsgICAgICAKLSAgICAgIGhhbmRsZVBvcnRUeXBlSGVscGVyKGdldEVuY2xvc2luZ1BvcnRUeXBlKG9wZXJhdGlvbikpOyAgICAKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb3V0cHV0KQotICAgIHsgIAotICAgICAgaGFuZGxlUG9ydFR5cGVIZWxwZXIoZ2V0RW5jbG9zaW5nUG9ydFR5cGUob3V0cHV0KSk7ICAgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gIAotCi0gICAJcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IHBvcnQpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChwb3J0KTsgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QocG9ydCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAKLQotICAgCXB1YmxpYyBPYmplY3QgY2FzZVBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICAgIHsgICAgICAgICAgIAotICAgICAgaGFuZGxlUG9ydFR5cGVIZWxwZXIocG9ydFR5cGUpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgICAgIAotICAgICAgICAKLSAgIAlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgICAgICAgCi0KLSAgICAvLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVBvcnRUeXBlSGVscGVyKFBvcnRUeXBlIHBvcnRUeXBlKQotICAgIHsgICAgICAgCi0gICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkKLSAgICAgIHsgCi0gICAgICAgIFBvcnQgcG9ydCA9IG51bGw7ICAgCi0gICAgICAgIE9iamVjdCBwcmV2aW91c0NvbnRleHQgPSBncm91cEVkaXRQYXJ0LmdldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCgpOwotICAgICAgICBpZiAocHJldmlvdXNDb250ZXh0ID09IG51bGwpICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICBwcmV2aW91c0NvbnRleHQgPSBncm91cEVkaXRQYXJ0LmdldEVtcGhhc2l6ZWRNb2RlbE9iamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmV2aW91c0NvbnRleHQgaW5zdGFuY2VvZiBQb3J0KQotICAgICAgICB7Ci0gICAgICAgICAgUG9ydCBwcmV2aW91c1BvcnQgPSAoUG9ydClwcmV2aW91c0NvbnRleHQ7Ci0gICAgICAgICAgaWYgKHByZXZpb3VzUG9ydC5nZXRFQmluZGluZygpICE9IG51bGwgJiYgcHJldmlvdXNQb3J0LmdldEVCaW5kaW5nKCkuZ2V0RVBvcnRUeXBlKCkgPT0gcG9ydFR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9ydCA9IHByZXZpb3VzUG9ydDsKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgaWYgKHBvcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGdyb3VwRWRpdFBhcnQuZ2V0RGVmaW5pdGlvbigpKTsgICAgICAgICAgIAotICAgICAgICAgIExpc3QgbGlzdCA9IHV0aWwuZ2V0UG9ydHNGb3JQb3J0VHlwZShwb3J0VHlwZSk7ICAgICAgICAgIAotICAgICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9ydCA9IChQb3J0KWxpc3QuZ2V0KDApOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocG9ydCk7ICAgICAKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QocG9ydCk7Ci0gICAgICB9IAotICAgIH0gICAKLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUJpbmRpbmdIZWxwZXIoQmluZGluZyBiaW5kaW5nKQotICAgIHsgICAgICAgCi0gICAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChncm91cEVkaXRQYXJ0LmdldERlZmluaXRpb24oKSk7Ci0gICAgICAgIExpc3QgbGlzdCA9IHV0aWwuZ2V0UG9ydHNGb3JCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICBQb3J0IHBvcnQgPSBudWxsOwotICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcG9ydCA9IChQb3J0KWxpc3QuZ2V0KDApOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocG9ydCk7ICAgICAKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QocG9ydCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFdTRExTd2l0Y2ggY3JlYXRlU3dpdGNoKGludCBzZWxlY3Rpb25UeXBlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBJbnRlcm5hbFdTRExTd2l0Y2goKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9UcmVlTm9kZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvVHJlZU5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc5OWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9UcmVlTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZWRpdHBhcnRzLkludGVyYWN0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbnRhaW5lckZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5HcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5XU0RMQ29tcG9uZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5XU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuVHJlZU5vZGVDb250ZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyZWVOb2RlRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGltcGxlbWVudHMgTW9kZWxBZGFwdGVyTGlzdGVuZXIsIEdyYXBoaWNzQ29uc3RhbnRzLCBJRmVlZGJhY2tIYW5kbGVyCi17Ci0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsMjsKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBsYWJlbEhvbGRlciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgcHJvdGVjdGVkIFRyZWVOb2RlQ29udGVudEZpZ3VyZSBjb250ZW50RmlndXJlOwotICBwcm90ZWN0ZWQgSW50ZXJhY3RvckhlbHBlciBpbnRlcmFjdG9ySGVscGVyOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHkgPSBmYWxzZTsKLQotICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpCi0gIHsKLSAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKGdldE1vZGVsKCksIHRoaXMpOwotICAgIC8vdmlld2VyID0gZ2V0Vmlld2VyKCk7Ci0gIH0KLQotICBpbnQgcmVtb3ZlTm90aWZ5Q291bnQgPSAwOwotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmeSgpCi0gIHsKLSAgICByZW1vdmVOb3RpZnlDb3VudCsrOwotICAgIGlmIChyZW1vdmVOb3RpZnlDb3VudCA9PSAxKQotICAgIHsKLSAgICAgIHN1cGVyLnJlbW92ZU5vdGlmeSgpOwotICAgIH0KLSAgfQotCi0gIC8qKiAKLSAgICogQXBhcnQgZnJvbSB0aGUgZGVhY3RpdmF0aW9uIGRvbmUgaW4gc3VwZXIsIHRoZSBzb3VyY2UKLSAgICogYW5kIHRhcmdldCBjb25uZWN0aW9ucyBhcmUgZGVhY3RpdmF0ZWQsIGFuZCB0aGUgdmlzdWFsCi0gICAqIHBhcnQgb2YgdGhlIHRoaXMgaXMgcmVtb3ZlZC4KLSAgICoKLSAgICogQHNlZSAjYWN0aXZhdGUoKSAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgcmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIoZ2V0TW9kZWwoKSwgdGhpcyk7Ci0gICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIC8vU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHBvbGljeSA9IG5ldyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwoKTsKLSAgICAvL2luc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHBvbGljeSk7Ci0KLSAgICBTZWxlY3Rpb25FZGl0UG9saWN5IGZlZWRCYWNrU2VsZWN0aW9uRWRpdFBvbGljeSA9IG5ldyBXU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgZmVlZEJhY2tTZWxlY3Rpb25FZGl0UG9saWN5KTsKLSAgfQotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVDaGlsZChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWRpdFBhcnRGYWN0b3J5KCkuY3JlYXRlRWRpdFBhcnQodGhpcywgbW9kZWwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGlmIChwcm9wZXJ0eSA9PSBNb2RlbEFkYXB0ZXIuQ0hJTERSRU5fUFJPUEVSVFkpCi0gICAgewotICAgICAgcmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5ID09IE1vZGVsQWRhcHRlci5ERVRBSUxfUFJPUEVSVFkpCi0gICAgewotICAgICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlZnJlc2hDaGlsZHJlbigpOwotICAgICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgY3JlYXRlQ29udGVudEZpZ3VyZSgpOwotICAgIGNyZWF0ZUZpZ3VyZUNvbnRlbnQoKTsKLSAgICByZXR1cm4gY29udGVudEZpZ3VyZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRGaWd1cmUoKQotICB7Ci0gICAgY29udGVudEZpZ3VyZSA9IG5ldyBUcmVlTm9kZUNvbnRlbnRGaWd1cmUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZ3VyZUNvbnRlbnQoKQotICB7Ci0gICAgLy8gYWRkIGEgYml0IG9mIHNwYWNlIGJldHdlZW4gdGhlIGludGVyYWN0b3IgYW5kIGljb24KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBSZWN0YW5nbGVGaWd1cmUgc3BhY2UgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0gICAgc3BhY2Uuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgc3BhY2Uuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDMsIDMpKTsKLSAgICBjb250ZW50RmlndXJlLmdldEljb25BcmVhKCkuYWRkKHNwYWNlKTsKLQotICAgIGxhYmVsSG9sZGVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIGxhYmVsSG9sZGVyLnNldEZpbGwodHJ1ZSk7Ci0gICAgY29udGVudEZpZ3VyZS5nZXRJY29uQXJlYSgpLmFkZChsYWJlbEhvbGRlcik7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9VTktOT1dOX09CSkVDVCIpKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIGxhYmVsSG9sZGVyLmFkZChsYWJlbCk7Ci0KLSAgICBpbnRlcmFjdG9ySGVscGVyID0gbmV3IEludGVyYWN0b3JIZWxwZXIodGhpcywgY29udGVudEZpZ3VyZS5nZXRJbnRlcmFjdG9yKCksIGNvbnRlbnRGaWd1cmUuZ2V0SW5uZXJDb250ZW50QXJlYSgpKTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBjb250ZW50RmlndXJlLmdldElubmVyQ29udGVudEFyZWEoKTsKLSAgfQotCi0gIHB1YmxpYyBDb2xvciBjb21wdXRlTGFiZWxDb2xvcigpCi0gIHsKLSAgICBDb2xvciBjb2xvciA9IENvbG9yQ29uc3RhbnRzLmJsYWNrOwotICAgIGlmIChpc1NlbGVjdGVkKQotICAgIHsKLSAgICAgIGNvbG9yID0gQ29sb3JDb25zdGFudHMud2hpdGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29sb3IgPSBDb2xvckNvbnN0YW50cy5ncmF5OwotICAgIH0KLSAgICByZXR1cm4gY29sb3I7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihnZXRNb2RlbCgpKTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlzUmVhZE9ubHkgPSBCb29sZWFuLlRSVUUuZXF1YWxzKGFkYXB0ZXIuZ2V0UHJvcGVydHkoZ2V0TW9kZWwoKSwgImlzUmVhZE9ubHkiKSk7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoY29tcHV0ZUxhYmVsQ29sb3IoKSk7Ci0gICAgICBsYWJlbC5zZXRUZXh0KChTdHJpbmcpYWRhcHRlci5nZXRQcm9wZXJ0eShnZXRNb2RlbCgpLCBNb2RlbEFkYXB0ZXIuTEFCRUxfUFJPUEVSVFkpKTsKLSAgICAgIGxhYmVsLnNldEljb24oKEltYWdlKWFkYXB0ZXIuZ2V0UHJvcGVydHkoZ2V0TW9kZWwoKSwgTW9kZWxBZGFwdGVyLklNQUdFX1BST1BFUlRZKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1VOS05PV05fTk9ERSIpICsgZ2V0TW9kZWwoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9yZWZyZXNoQ2hpbGRyZW4oKQotICB7Ci0gICAgaW50IGk7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0gICAgT2JqZWN0IG1vZGVsOwotCi0gICAgTWFwIG1vZGVsVG9FZGl0UGFydCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZWRpdFBhcnQgPSAoRWRpdFBhcnQpY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgbW9kZWxUb0VkaXRQYXJ0LnB1dChlZGl0UGFydC5nZXRNb2RlbCgpLCBlZGl0UGFydCk7Ci0gICAgfQotCi0gICAgTGlzdCBtb2RlbE9iamVjdHMgPSBnZXRNb2RlbENoaWxkcmVuKCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbW9kZWxPYmplY3RzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIG1vZGVsID0gbW9kZWxPYmplY3RzLmdldChpKTsKLQotICAgICAgLy9EbyBhIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiBlZGl0UGFydFtpXSA9PSBtb2RlbFtpXQotICAgICAgaWYgKGkgPCBjaGlsZHJlbi5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgIGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWNoaWxkcmVuLmdldChpKTsKLSAgICAgICAgT2JqZWN0IGVkaXRQYXJ0TW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgICBpZiAoZWRpdFBhcnRNb2RlbCA9PSBtb2RlbCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGVkaXRQYXJ0TW9kZWwuZ2V0Q2xhc3MoKSA9PSBtb2RlbC5nZXRDbGFzcygpKQotICAgICAgICB7Ci0gICAgICAgICAgbW9kZWxUb0VkaXRQYXJ0LnJlbW92ZShlZGl0UGFydE1vZGVsKTsKLQotICAgICAgICAgIGlmIChpc0FjdGl2ZSgpKQotICAgICAgICAgICAgZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCi0gICAgICAgICAgZWRpdFBhcnQuc2V0TW9kZWwobW9kZWwpOwotCi0gICAgICAgICAgaWYgKGlzQWN0aXZlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdFBhcnQuYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIGVkaXRQYXJ0LnJlZnJlc2goKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy9Mb29rIHRvIHNlZSBpZiB0aGUgRWRpdFBhcnQgaXMgYWxyZWFkeSBhcm91bmQgYnV0IGluIHRoZSB3cm9uZyBsb2NhdGlvbgotICAgICAgZWRpdFBhcnQgPSAoRWRpdFBhcnQpbW9kZWxUb0VkaXRQYXJ0LmdldChtb2RlbCk7Ci0KLSAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgICByZW9yZGVyQ2hpbGQoZWRpdFBhcnQsIGkpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL0FuIGVkaXRwYXJ0IGZvciB0aGlzIG1vZGVsIGRvZXNuJ3QgZXhpc3QgeWV0LiAgQ3JlYXRlIGFuZCBpbnNlcnQgb25lLgotICAgICAgICBlZGl0UGFydCA9IGNyZWF0ZUNoaWxkKG1vZGVsKTsKLSAgICAgICAgYWRkQ2hpbGQoZWRpdFBhcnQsIGkpOwotICAgICAgfQotICAgIH0KLSAgICBMaXN0IHRyYXNoID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgICB0cmFzaC5hZGQoY2hpbGRyZW4uZ2V0KGkpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdHJhc2guc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgRWRpdFBhcnQgZXAgPSAoRWRpdFBhcnQpdHJhc2guZ2V0KGkpOwotICAgICAgcmVtb3ZlQ2hpbGQoZXApOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbigpCi0gIHsKLQotICAgIGJvb2xlYW4gcmV1c2VDaGlsZHJlbiA9IGZhbHNlOwotICAgIGlmIChnZXRWaWV3ZXIoKSBpbnN0YW5jZW9mIFdTRExDb21wb25lbnRWaWV3ZXIpCi0gICAgewotICAgICAgV1NETENvbXBvbmVudFZpZXdlciB3c2RsQ29tcG9uZW50Vmlld2VyID0gKFdTRExDb21wb25lbnRWaWV3ZXIpZ2V0Vmlld2VyKCk7Ci0gICAgICByZXVzZUNoaWxkcmVuID0gd3NkbENvbXBvbmVudFZpZXdlci5pc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZCgpOwotICAgIH0KLQotICAgIGlmIChyZXVzZUNoaWxkcmVuKQotICAgIHsKLSAgICAgIF9yZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIH0KLQotICAgIGNvbnRlbnRGaWd1cmUuZ2V0SW50ZXJhY3RvcigpLnNldFZpc2libGUoaGFzQ2hpbGRyZW4oKSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiBjb250ZW50RmlndXJlLmdldEludGVyYWN0b3IoKS5pc0V4cGFuZGVkKCkgPyBnZXRNb2RlbENoaWxkcmVuSGVscGVyKCkgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbkhlbHBlcigpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihnZXRNb2RlbCgpKTsKLSAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gKExpc3QpbW9kZWxBZGFwdGVyLmdldFByb3BlcnR5KGdldE1vZGVsKCksIE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0TW9kZWxDaGlsZHJlbkhlbHBlcigpLnNpemUoKSA+IDA7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgTW9kZWxBZGFwdGVyIGdldE1vZGVsQWRhcHRlcihPYmplY3QgbW9kZWwpOwotCi0gIHByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBFeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRNb2RlbEFkYXB0ZXJMaXN0ZW5lcihPYmplY3QgbW9kZWxPYmplY3QsIE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBnZXRNb2RlbEFkYXB0ZXIobW9kZWxPYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0TW9kZWxBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIGlzU2VsZWN0ZWQgPSB0cnVlOwotICAgIGxhYmVsSG9sZGVyLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbXB1dGVMYWJlbENvbG9yKCkpOwotICAgIGxhYmVsSG9sZGVyLnNldEZpbGwodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gICAgbGFiZWxIb2xkZXIuc2V0QmFja2dyb3VuZENvbG9yKG51bGwpOwotICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihjb21wdXRlTGFiZWxDb2xvcigpKTsKLSAgICBsYWJlbEhvbGRlci5zZXRGaWxsKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRXhwYW5kZWQoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRGaWd1cmUuZ2V0SW50ZXJhY3RvcigpLmlzRXhwYW5kZWQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKGJvb2xlYW4gYXJnKQotICB7Ci0gICAgaW50ZXJhY3RvckhlbHBlci5zZXRFeHBhbmRlZChhcmcpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1Vua25vd25PYmplY3RFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1Vua25vd25PYmplY3RFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzU0ZmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Vbmtub3duT2JqZWN0RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIFVua25vd25PYmplY3RFZGl0UGFydCBleHRlbmRzIFRyZWVOb2RlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlciBnZXRNb2RlbEFkYXB0ZXIoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODg3MmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XU0RMRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZWRpdHBhcnRzLk11bHRpQ29udGVudFBhbmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5HcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5XU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETEVkaXRQYXJ0IGV4dGVuZHMgTXVsdGlDb250ZW50UGFuZUVkaXRQYXJ0IGltcGxlbWVudHMgTW9kZWxBZGFwdGVyTGlzdGVuZXIsIEdyYXBoaWNzQ29uc3RhbnRzCi17Ci0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSA8Y29kZT5FZGl0UGFydDwvY29kZT4gYnkgc2V0dGluZyB0aGUKLQkgKiBhcHByb3ByaWF0ZSBmbGFncywgYW5kIGFjdGl2YXRpbmcgaXRzIGNoaWxkcmVuLgotCSAqIGFjdGl2YXRpb24gc2lnbmFscyB0byB0aGUgRWRpdFBhcnQgdGhhdCBpcyBzaG91bGQgc3RhcnQgb2JzZXJ2aW5nCi0JICogaXQncyBtb2RlbCwgYW5kIHRoYXQgaXMgc2hvdWxkIHN1cHBvcnQgZWRpdGluZyBhdCB0aGlzIHRpbWUuCi0JICogQW4gRWRpdFBhcnQgd2lsbCBoYXZlIGEgcGFyZW50IHByaW9yIHRvIGFjdGl2aWF0aW9uLgotCSAqIEBzZWUgI2RlYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgCi0gIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsgICAgICAgICAKLSAgICBhZGRNb2RlbEFkYXB0ZXJMaXN0ZW5lcihnZXRNb2RlbCgpLCB0aGlzKTsgICAKLQl9Ci0JLyoqIAotCSAqIEFwYXJ0IGZyb20gdGhlIGRlYWN0aXZhdGlvbiBkb25lIGluIHN1cGVyLCB0aGUgc291cmNlCi0JICogYW5kIHRhcmdldCBjb25uZWN0aW9ucyBhcmUgZGVhY3RpdmF0ZWQsIGFuZCB0aGUgdmlzdWFsCi0JICogcGFydCBvZiB0aGUgdGhpcyBpcyByZW1vdmVkLgotCSAqCi0JICogQHNlZSAjYWN0aXZhdGUoKSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGdldE1vZGVsKCksIHRoaXMpOyAKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOyAKLQl9ICAgCi0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIAotICB7Ci0gICAgU2VsZWN0aW9uRWRpdFBvbGljeSBwb2xpY3kgPSBuZXcgU2VsZWN0aW9uRWRpdFBvbGljeSgpCi0gICAgeyAgICAgICAgCi0gICAgICBwcm90ZWN0ZWQgIHZvaWQgaGlkZVNlbGVjdGlvbigpIAotICAgICAgewotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikKLSAgICAgICAgewotICAgICAgICAgICgoSUZlZWRiYWNrSGFuZGxlcillZGl0UGFydCkucmVtb3ZlRmVlZGJhY2soKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwcm90ZWN0ZWQgIHZvaWQgc2hvd1NlbGVjdGlvbigpICAKLSAgICAgIHsgCi0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKWVkaXRQYXJ0KS5hZGRGZWVkYmFjaygpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgIAotICAgIH07Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgcG9saWN5KTsgICAgICAgICAgIAotICB9ICAKLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKSAKLSAgewotICAgIHJldHVybiBnZXRFZGl0UGFydEZhY3RvcnkoKS5jcmVhdGVFZGl0UGFydCh0aGlzLCBtb2RlbCk7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHByb3BlcnR5ID09IE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSkKLSAgICB7Ci0gICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkgPT0gTW9kZWxBZGFwdGVyLkRFVEFJTF9QUk9QRVJUWSkKLSAgICB7IAotICAgICAgcmVmcmVzaFZpc3VhbHMoKTsgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgfQotICB9ICAKLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgCi0gIHsgICAKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihnZXRNb2RlbCgpKTsKLSAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gKExpc3QpbW9kZWxBZGFwdGVyLmdldFByb3BlcnR5KGdldE1vZGVsKCksIE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIEV4dGVuc2libGVFZGl0UGFydEZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLSAgfSAKLQotICBwcm90ZWN0ZWQgTW9kZWxBZGFwdGVyIGdldE1vZGVsQWRhcHRlcihPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICAvLyBUT0RPIDogcG9ydCBjaGVjawotICAgIHJldHVybiBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLS8vICAgIHJldHVybiBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LkVjb3JlVXRpbC5nZXRBZGFwdGVyKGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5lQWRhcHRlcnMoKSxtb2RlbE9iamVjdCk7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0TW9kZWxBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0gIAotCi0gIHB1YmxpYyBib29sZWFuIGhpdFRlc3QoSUZpZ3VyZSB0YXJnZXQsIFBvaW50IGxvY2F0aW9uKQotICB7Ci0gICAgUmVjdGFuZ2xlIGIgPSB0YXJnZXQuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgIHRhcmdldC50cmFuc2xhdGVUb0Fic29sdXRlKGIpOyAgCi0gICAgcmV0dXJuIGIuY29udGFpbnMobG9jYXRpb24pOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExFZGl0UGFydEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XU0RMRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OGNhMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExFZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMU3dpdGNoOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5Ci17IAotICBwcm90ZWN0ZWQgc3RhdGljIFdTRExFZGl0UGFydEZhY3RvcnkgaW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgV1NETEVkaXRQYXJ0RmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBXU0RMRWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAgICAgICAgICAKLQotCi0gIHB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChmaW5hbCBFZGl0UGFydCBwYXJlbnQsIE9iamVjdCBtb2RlbCkKLSAgeyAgICAgICAgICAgICAKLSAgICAgIFdTRExTd2l0Y2ggd3NkbFN3aXRjaCA9IG5ldyBXU0RMU3dpdGNoKCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gbmV3IFdTRExUcmVlTm9kZUVkaXRQYXJ0KCk7Ci0JICAgICAgfSAgIAotICAgICAgIAotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIG5ldyBEZWZpbml0aW9uRWRpdFBhcnQoKTsKLQkgICAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgICAgfTsgICAKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KXdzZGxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpbW9kZWwpOyAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IEdyb3VwRWRpdFBhcnQoKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIGlmIChlZGl0UGFydCAhPSBudWxsKSAgIAotICAgIHsKLSAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIGVkaXRQYXJ0LnNldFBhcmVudChwYXJlbnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgIAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYW4ndCBjcmVhdGUgZWRpdFBhcnQgZm9yICIgKyBtb2RlbCk7Ci0gICAgICBUaHJlYWQuZHVtcFN0YWNrKCk7Ci0gICAgfQotICAgIHJldHVybiBlZGl0UGFydDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XU0RMVHJlZU5vZGVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExUcmVlTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YzkzMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExUcmVlTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRHJhZ1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5XU0RMRHJhZ0FuZERyb3BFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5XU0RMR3JhcGhOb2RlRHJhZ1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLldTRExTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5UcmVlTm9kZUNvbnRlbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotCi1wdWJsaWMgY2xhc3MgV1NETFRyZWVOb2RlRWRpdFBhcnQgZXh0ZW5kcyBUcmVlTm9kZUVkaXRQYXJ0Ci17IAotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWwyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXBoYXNpemVkID0gZmFsc2U7ICAKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGVtcGhhc2lzQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMjM4LCAyMzgsIDIzOCk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sb3IgbGFiZWwyRm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKG51bGwsIDgyLCA4MiwgMTU4KTsgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGxhYmVsMkZvcmVncm91bmRDb2xvclNlbGVjdGVkID0gbmV3IENvbG9yKG51bGwsIDE4MiwgMTgyLCAyNTUpOwotCi0gIHByb3RlY3RlZCBNb2RlbEFkYXB0ZXIgZ2V0TW9kZWxBZGFwdGVyKE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIHJldHVybiBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRGaWd1cmUoKQotICB7Ci0JY29udGVudEZpZ3VyZSA9IG5ldyBUcmVlTm9kZUNvbnRlbnRGaWd1cmUoKQotCXsKLQkgIHB1YmxpYyBJRmlndXJlIGdldENvbm5lY3Rpb25GaWd1cmUoKQotCSAgeyAgCQotICAJICAgIHJldHVybiBpc1RvcExldmVsKCkgPyBvdXRsaW5lZEFyZWEgOiBpY29uQXJlYTsKLQkgIH0gICAJICAKLQl9OyAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1RvcExldmVsKCkKLSAgewotICAgIHJldHVybiBnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEdyb3VwRWRpdFBhcnQ7Ci0gIH0KLQkKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlndXJlQ29udGVudCgpCi0gIHsgICAgICAgICAgICAgICAgICAKLSAgICBzdXBlci5jcmVhdGVGaWd1cmVDb250ZW50KCk7Ci0gICAgICAKLSAgICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFBhcnQpCi0gICAgewotICAgICAgbGFiZWwyID0gbmV3IExhYmVsKCk7Ci0gICAgICBsYWJlbEhvbGRlci5hZGQobGFiZWwyKTsKLSAgICAgIGxhYmVsMi5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCA1LCAwLCAwKSk7Ci0gICAgICBsYWJlbDIuc2V0Rm9yZWdyb3VuZENvbG9yKGxhYmVsMkZvcmVncm91bmRDb2xvcik7Ci0gICAgfQotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgc2V0RW1waGFzaXplZChib29sZWFuIGlzRW1waGFzaXplZCkKLSAgewotICAgIHRoaXMuaXNFbXBoYXNpemVkID0gaXNFbXBoYXNpemVkOwotICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVtcGhhc2lzKCkKLSAgewotICAgIGJvb2xlYW4gaXNFbXBoYXNpc1Nob3dpbmcgPSBpc0VtcGhhc2l6ZWQgJiYgKCFpc1NlbGVjdGVkIHx8IGdldE1vZGVsQ2hpbGRyZW4oKS5zaXplKCkgPiAwKTsKLSAgICBpZiAoaXNFbXBoYXNpc1Nob3dpbmcpCi0gICAgeyAgICAgICAgICAgICAgCi0gICAgICBjb250ZW50RmlndXJlLmdldE91dGxpbmVkQXJlYSgpLnNldEJhY2tncm91bmRDb2xvcihlbXBoYXNpc0NvbG9yKTsgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgY29udGVudEZpZ3VyZS5nZXRPdXRsaW5lZEFyZWEoKS5zZXRGaWxsKGlzRW1waGFzaXNTaG93aW5nKTsKLSAgICBjb250ZW50RmlndXJlLmdldE91dGxpbmVkQXJlYSgpLnNldE91dGxpbmVkKGlzRW1waGFzaXNTaG93aW5nKTsgICAgCi0gICAgY29udGVudEZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoZWxlbWVudEJvcmRlckNvbG9yKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgeyAgIAotICAgIHVwZGF0ZUVtcGhhc2lzKCk7Ci0KLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgCi0gICAgaWYgKGxhYmVsMiAhPSBudWxsKQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWdldE1vZGVsKCk7Ci0JICAvL1N0cmluZyBsYWJlbCA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuaXNUeXBlKHBhcnQpID8gInR5cGUiIDogImVsZW1lbnQiOwotCSAgU3RyaW5nIHZhbHVlID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRQYXJ0UmVmZXJlbmNlVmFsdWUocGFydCk7ICAKLSAgICAgIGxhYmVsMi5zZXRUZXh0KCIoIiArIHZhbHVlICsgIikiKTsKLSAgICB9Ci0gIH0gICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgIAotICAgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IChFZGl0UGFydClnZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIERlZmluaXRpb25FZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgICgoRGVmaW5pdGlvbkVkaXRQYXJ0KXBhcmVudCkuaGFuZGxlT3BlblJlcXVlc3QodGhpcyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIC8vZWxzZSBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQpCi0gICAgLy97ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vICBwZXJmb3JtRGlyZWN0RWRpdCgpOwotICAgIC8vfQotICB9ICAgICAKLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsgICAgCi0gICAgc3VwZXIuYWRkRmVlZGJhY2soKTsKLSAgICBpZiAobGFiZWwyICE9IG51bGwpICAgICAgICAKLSAgICB7Ci0gICAgICBsYWJlbDIuc2V0Rm9yZWdyb3VuZENvbG9yKGxhYmVsMkZvcmVncm91bmRDb2xvclNlbGVjdGVkKTsKLSAgICB9ICAgIAotICAgIHVwZGF0ZUVtcGhhc2lzKCk7Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsgCi0gICAgc3VwZXIucmVtb3ZlRmVlZGJhY2soKTsKLSAgICBpZiAobGFiZWwyICE9IG51bGwpICAgICAgICAKLSAgICB7Ci0gICAgICBsYWJlbDIuc2V0Rm9yZWdyb3VuZENvbG9yKGxhYmVsMkZvcmVncm91bmRDb2xvcik7Ci0gICAgfQotICAgIHVwZGF0ZUVtcGhhc2lzKCk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsgCi0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBuZXcgV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsIG5ldyBXU0RMRHJhZ0FuZERyb3BFZGl0UG9saWN5KGdldFZpZXdlcigpLCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSkpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KTsKLSAgfSAgCi0gIAotICBXU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotCi0gIHB1YmxpYyBJRmlndXJlIGdldFNlbGVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RmlndXJlKCk7Ci0gIH0KLQotICBwdWJsaWMgRHJhZ1RyYWNrZXIgZ2V0RHJhZ1RyYWNrZXIoUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgcmV0dXJuIG5ldyBXU0RMR3JhcGhOb2RlRHJhZ1RyYWNrZXIoKEVkaXRQYXJ0KXRoaXMpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0VkaXRVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvRWRpdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliY2IzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvRWRpdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnJlY29uY2lsZXIuV1NETFRvRE9NRWxlbWVudFV0aWw7Ci0KLQotcHVibGljIGNsYXNzIEVkaXRVdGlsCi17Ci0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQb3NzaWJsZVByb3BlcnR5VmFsdWVzKE9iamVjdCBtb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgUG9ydCkKLSAgICB7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydCltb2RlbDsgICAKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKHBvcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgIGxpc3QgPSB1dGlsLmdldEJpbmRpbmdOYW1lcygpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpbW9kZWw7ICAgCi0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChiaW5kaW5nLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICBsaXN0ID0gdXRpbC5nZXRQb3J0VHlwZU5hbWVzKCk7Ci0gICAgfSAgICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFBhcnQpCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpbW9kZWw7ICAgIAotICAgICAgYm9vbGVhbiBpc1R5cGUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmlzVHlwZShwYXJ0KTsKLSAgICAgIGxpc3QgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldENvbXBvbmVudE5hbWVMaXN0KHBhcnQsIGlzVHlwZSk7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElucHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsgCi0gICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCltb2RlbDsgICAKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKHdzZGxFbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICBsaXN0ID0gdXRpbC5nZXRNZXNzYWdlTmFtZXMoKTsKLSAgICB9IAotCi0gICAgaWYgKGxpc3QgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBsaXN0LmFkZCgiQSIpOwotICAgICAgbGlzdC5hZGQoIkIiKTsKLSAgICAgIGxpc3QuYWRkKCJDIik7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgUGFydCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBQYXJ0IHBhcnQgPSAoUGFydCltb2RlbDsgCi0gICAgICBib29sZWFuIGlzVHlwZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuaXNUeXBlKHBhcnQpOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UocGFydCwgaXNUeXBlLCB2YWx1ZSk7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFBvcnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImJpbmRpbmciLCB2YWx1ZSk7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgeyAKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoV1NETEVsZW1lbnQpbW9kZWwpLmdldEVsZW1lbnQoKTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgdmFsdWUpOwotICAgIH0gCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJbnB1dCB8fAotICAgICAgICAgICAgIG1vZGVsIGluc3RhbmNlb2YgT3V0cHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7IAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiLCB2YWx1ZSk7Ci0gICAgfSAKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IG1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7IAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgUGFydCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFdTRExFbGVtZW50KW1vZGVsKS5nZXRFbGVtZW50KCk7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShwcm9wZXJ0eU5hbWUpOwotICAgIH0gCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBQb3J0KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoV1NETEVsZW1lbnQpbW9kZWwpLmdldEVsZW1lbnQoKTsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJiaW5kaW5nIik7Ci0gICAgfSAgIAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQmluZGluZykKLSAgICB7IAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLSAgICB9ICAgCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJbnB1dCB8fAotICAgICAgICAgICAgIG1vZGVsIGluc3RhbmNlb2YgT3V0cHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7IAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiKTsKLSAgICB9ICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWUoT2JqZWN0IG1vZGVsLCBTdHJpbmcgdmFsdWUpCi0gIHsgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB2YWx1ZSk7Ci0gICAgfSAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvTmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvTmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTk5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL05hbWVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cG9saWNpZXMuVGV4dENlbGxFZGl0b3JNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgTmFtZURpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgVGV4dENlbGxFZGl0b3JNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBPYmplY3QgbW9kZWw7Ci0KLSAgcHVibGljIE5hbWVEaXJlY3RFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsLCBPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihzb3VyY2UsIGxhYmVsKTsgIAotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1Nb2RpZnkoZmluYWwgU3RyaW5nIHZhbHVlKQotICB7ICAgICAgICAgIAotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgU21hcnRSZW5hbWVBY3Rpb24obW9kZWwsIHZhbHVlKSk7Ci0gIH0gICAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETERyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmYjkzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETERyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuQ29weVdTRExFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuV1NETERyYWdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5XU0RMRHJhZ1Jlb3JkZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5XU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLldTRExUcmVlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgV1NETERyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgLy9BYnN0cmFjdENvbW1hbmQKLXsgCi0gIHByb3RlY3RlZCBFZGl0UGFydFZpZXdlciB2aWV3ZXI7ICAgIAotICBwcm90ZWN0ZWQgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0OwotICBwcm90ZWN0ZWQgUG9pbnQgbG9jYXRpb247Ci0gIHByb3RlY3RlZCBXU0RMRHJhZ0FjdGlvbiBkcmFnQWN0aW9uOyAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRXhlY3V0ZSA9IGZhbHNlOwotCi0gIHB1YmxpYyBXU0RMRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gIAlib29sZWFuIGNvbnN0cnVjdG9yID0gZmFsc2U7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7ICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotCi0gICAgbG9jYXRpb24gPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7ICAgCi0gICAgRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSB2aWV3ZXIuZmluZE9iamVjdEF0KGxvY2F0aW9uKTsgCi0KLSAgICAvLyBPbmx5IHN1cHBvcnQgZHJhZyBhbmQgZHJvcCBmb3IgV1NETFRyZWVOb2RlRWRpdFBhcnQKLSAgCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFdTRExUcmVlTm9kZUVkaXRQYXJ0KSB7Ci0gIAkJV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIHRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gIAkJaWYgKHdzZGxFbGVtZW50LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0gIAkJCSgoR3JhcGhpY2FsRWRpdFBhcnQpdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvY2F0aW9uKTsKLSAgCQkJUmVjdGFuZ2xlIHRhcmdldFJlY3RhbmdsZTsgCi0gIAkJCVdTRExUcmVlTm9kZUVkaXRQYXJ0IHRhcmdldFBhcmVudEVkaXRQYXJ0OwotICAJCQlXU0RMVHJlZU5vZGVFZGl0UGFydCBtb3ZpbmdDaGlsZEVkaXRQYXJ0OwotICAJCQlWZWN0b3IgZHJhZ0FjdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgCQkJaWYgKHJlcXVlc3QuZ2V0VHlwZSgpLmVxdWFscyhSZXF1ZXN0Q29uc3RhbnRzLlJFUV9BREQpKSAgeyAvLyBUaGlzIHJlYWxseSBzaG91bGRuJ3QgYmUgUkVRX0FERC4uLi4KLSAgCQkJCUxpc3QgbGlzdCA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0gIAkJCQlpZiAobGlzdC5zaXplKCkgPD0gMCkgewotICAJCQkJCWNhbkV4ZWN1dGUgPSBmYWxzZTsKLSAgCQkJCQlyZXR1cm47Ci0gIAkJCQl9Ci0gICAgICAgICAgICAKLSAgCQkJCS8vIEdyYWJiaW5nIHRoZSBmaXN0IHNlbGVjdGlvbgotICAJCQkJbW92aW5nQ2hpbGRFZGl0UGFydCA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0gIAkJCQlPYmplY3QgbW9kZWwgPSBtb3ZpbmdDaGlsZEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gIAkJCQlFZGl0UGFydCBwb2ludGVyRWRpdFBhcnQgPSB2aWV3ZXIuZmluZE9iamVjdEF0KGxvY2F0aW9uKTsKLSAKLSAgCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElucHV0IHx8IG1vZGVsIGluc3RhbmNlb2YgT3V0cHV0KSB7Ci0gIAkJCQkJZHJhZ0FjdGlvbnMuYWRkKG5ldyBXU0RMRHJhZ1Jlb3JkZXJBY3Rpb24obW92aW5nQ2hpbGRFZGl0UGFydCwgcG9pbnRlckVkaXRQYXJ0LCBnZXRQb2ludGVyTG9jYXRpb24obG9jYXRpb24pKSk7Ci0gIAkJCQkJZHJhZ0FjdGlvbnMuYWRkKG5ldyBXU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb24obW92aW5nQ2hpbGRFZGl0UGFydCwgcG9pbnRlckVkaXRQYXJ0LCBsb2NhdGlvbikpOwotICAJCQkJfQotICAJCQkJZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gIAkJCQkJZHJhZ0FjdGlvbnMuYWRkKG5ldyBXU0RMRHJhZ1Jlb3JkZXJBY3Rpb24obW92aW5nQ2hpbGRFZGl0UGFydCwgcG9pbnRlckVkaXRQYXJ0LCBnZXRQb2ludGVyTG9jYXRpb24obG9jYXRpb24pKSk7ICAgICAKLSAgCQkJCX0KLSAgCQkJCWVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgRmF1bHQpIHsKLSAgCQkJCQlkcmFnQWN0aW9ucy5hZGQobmV3IFdTRExEcmFnU2V0TWVzc2FnZUFjdGlvbihtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBwb2ludGVyRWRpdFBhcnQsIGxvY2F0aW9uKSk7Ci0gIAkJCQl9ICAgICAgICAgICAgCi0gIAkJCX0KLSAgCQkJZWxzZSBpZiAocmVxdWVzdC5nZXRUeXBlKCkuZXF1YWxzKFJlcXVlc3RDb25zdGFudHMuUkVRX0NMT05FKSkgewotICAJCQkJTGlzdCBsaXN0ID0gcmVxdWVzdC5nZXRFZGl0UGFydHMoKTsKLSAgCQkJCWlmIChsaXN0LnNpemUoKSA+IDApCi0gIAkJCQl7Ci0gIAkJCQkJLy8gR3JhYmJpbmcgdGhlIGZpc3Qgc2VsZWN0aW9uCi0gIAkJCQkJbW92aW5nQ2hpbGRFZGl0UGFydCA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgCi0gIAkJCQkJZHJhZ0FjdGlvbnMuYWRkKG5ldyBDb3B5V1NETEVsZW1lbnRBY3Rpb24odmlld2VyLAotICAgICAgICAgICAgIAkJCQkJCQkJCQkJICAoV1NETEVsZW1lbnQpIG1vdmluZ0NoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKSwKLSAgICAgICAgICAgICAJCQkJCQkJCQkJICAgICAgKFdTRExFbGVtZW50KSB0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpLAotCQkJCQkJCQkJCQkJCQkgIG51bGwpKTsKLSAgCQkJCX0KLSAgCQkJfQotICAgICAgICAKLSAgCQkJSXRlcmF0b3IgaXQgPSBkcmFnQWN0aW9ucy5pdGVyYXRvcigpOwotICAJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gIAkJCQlkcmFnQWN0aW9uID0gKFdTRExEcmFnQWN0aW9uKSBpdC5uZXh0KCk7Ci0gIAkJCQljYW5FeGVjdXRlID0gZHJhZ0FjdGlvbi5jYW5FeGVjdXRlKCk7Ci0gIAkJCQlpZiAoY2FuRXhlY3V0ZSkKLSAgCQkJCQlicmVhazsKLSAgCQkJfQotICAJCX0KLSAgCX0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0gIHsgCi0gICAgcmV0dXJuIGNhbkV4ZWN1dGU7Ci0gIH0gICAgIAotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICBpZiAoY2FuRXhlY3V0ZSkKLSAgICB7IAotICAgICAgZHJhZ0FjdGlvbi5ydW4oKTsgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRGZWVkYmFja0ZpZ3VyZSgpIHsKLSAgCWlmIChkcmFnQWN0aW9uICE9IG51bGwpIHsKLSAgCQlyZXR1cm4gZHJhZ0FjdGlvbi5nZXRGZWVkYmFja0ZpZ3VyZSgpOwotICAJfQotICAJZWxzZSB7Ci0gIAkJcmV0dXJuIG51bGw7Ci0gIAl9Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24KLSAgICovCi0gIHByaXZhdGUgUG9pbnQgZ2V0UG9pbnRlckxvY2F0aW9uKFBvaW50IG9yaWdQb2ludGVyTG9jYXRpb24pIHsKLSAgCSBQb2ludCBjb21wZW5zYXRlZExvY2F0aW9uID0gb3JpZ1BvaW50ZXJMb2NhdGlvbjsKLSAgCSBGaWd1cmVDYW52YXMgZmlndXJlQ2FudmFzID0gKEZpZ3VyZUNhbnZhcykgdmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgaW50IHlPZmZzZXQgPSBmaWd1cmVDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWZXJ0aWNhbFJhbmdlTW9kZWwoKS5nZXRWYWx1ZSgpOwotICAgICBjb21wZW5zYXRlZExvY2F0aW9uLnkgPSBjb21wZW5zYXRlZExvY2F0aW9uLnkgKyB5T2Zmc2V0OwotICAgICAKLSAgICAgcmV0dXJuIGNvbXBlbnNhdGVkTG9jYXRpb247Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETERyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExEcmFnQW5kRHJvcEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkZGRiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETERyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRHJhZ0FuZERyb3BFZGl0UG9saWN5IGV4dGVuZHMgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxFZGl0UG9saWN5Ci17IAotICBwcm90ZWN0ZWQgRWRpdFBhcnRWaWV3ZXIgdmlld2VyOyAgICAKLSAgcHJvdGVjdGVkIFdTRExTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci0KLSAgcHVibGljIFdTRExEcmFnQW5kRHJvcEVkaXRQb2xpY3koRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBXU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KQotICB7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgdGhpcy5zZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSA9IHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKQotICB7Ci0JICByZXR1cm4gdHJ1ZTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotICBwdWJsaWMgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBXU0RMRHJhZ0FuZERyb3BDb21tYW5kIGNvbW1hbmQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENoYW5nZUJvdW5kc1JlcXVlc3QpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBXU0RMRHJhZ0FuZERyb3BDb21tYW5kKHZpZXdlciwgKENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdCk7ICAKLSAgICAgIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5LnNldERyYWdBbmREcm9wQ29tbWFuZChjb21tYW5kKTsKLSAgICB9IAotICAgIHJldHVybiBjb21tYW5kOyAgICAgICAgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExHcmFwaE5vZGVEcmFnVHJhY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExHcmFwaE5vZGVEcmFnVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODJiOTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9XU0RMR3JhcGhOb2RlRHJhZ1RyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnRWRpdFBhcnRzVHJhY2tlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgV1NETEdyYXBoTm9kZURyYWdUcmFja2VyIGV4dGVuZHMgRHJhZ0VkaXRQYXJ0c1RyYWNrZXIgCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZWRpdFBhcnQ7IAotICAgICAgICAgICAKLSAgcHVibGljIFdTRExHcmFwaE5vZGVEcmFnVHJhY2tlcihFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHN1cGVyKGVkaXRQYXJ0KTsKLSAgICB0aGlzLmVkaXRQYXJ0ID0gZWRpdFBhcnQ7Ci0gIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDb21tYW5kIGdldENvbW1hbmQoKSAKLSAgeyAKLQkgIFJlcXVlc3QgcmVxdWVzdCA9IGdldFRhcmdldFJlcXVlc3QoKTsKLSAgICByZXR1cm4gZWRpdFBhcnQuZ2V0Q29tbWFuZChyZXF1ZXN0KTsgCi0gIH0KLX0gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzOGQ5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLklGZWVkYmFja0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLldTRExUcmVlTm9kZUVkaXRQYXJ0OwotCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbAlleHRlbmRzIFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5Ci17Ci0gIHByb3RlY3RlZCBJRmlndXJlIGZlZWRiYWNrOwotICBwcm90ZWN0ZWQgUmVjdGFuZ2xlIG9yaWdpbmFsTG9jYXRpb247Ci0gIHByb3RlY3RlZCBXU0RMRHJhZ0FuZERyb3BDb21tYW5kIGRyYWdBbmREcm9wQ29tbWFuZDsKLQotICBwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkKLSAgeyAgICAgICAgICAgICAgCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOyAgCi0KLSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkKLSAgICB7Ci0gICAgICBHcmFwaGljYWxFZGl0UGFydCBncmFwaGljYWxFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydDsKLSAgICAgIElGaWd1cmUgZmlndXJlID0gKGdyYXBoaWNhbEVkaXRQYXJ0IGluc3RhbmNlb2YgV1NETFRyZWVOb2RlRWRpdFBhcnQpID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoV1NETFRyZWVOb2RlRWRpdFBhcnQpZ3JhcGhpY2FsRWRpdFBhcnQpLmdldFNlbGVjdGlvbkZpZ3VyZSgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY2FsRWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0gICAKLSAgICAgIE1vdmVIYW5kbGVMb2NhdG9yIGxvYyA9IG5ldyBNb3ZlSGFuZGxlTG9jYXRvcihmaWd1cmUpOyAgICAKLSAgICAgIE1vdmVIYW5kbGUgbW92ZUhhbmRsZSA9IG5ldyBNb3ZlSGFuZGxlKGdyYXBoaWNhbEVkaXRQYXJ0LCBsb2MpOyAgICAgCi0gICAgICBsaXN0LmFkZChtb3ZlSGFuZGxlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbGlzdDsKLSAgfSAgIAotICAKLQotICBwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkgIGlmIChSRVFfTU9WRS5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKQotICAgIHsgIAotCQkgIHJlc3VsdCA9IGZhbHNlOyAvLyByZXR1cm4gZmFsc2UgdG8gZGlzYWJsZSBtb3ZlIGZvciBub3cgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JICAgIHJlc3VsdCA9IHN1cGVyLnVuZGVyc3RhbmRzUmVxdWVzdChyZXF1ZXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLQotICBwdWJsaWMgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG51bGw7ICAKLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIHNldERyYWdBbmREcm9wQ29tbWFuZChXU0RMRHJhZ0FuZERyb3BDb21tYW5kIGRyYWdBbmREcm9wQ29tbWFuZCkKLSAgewotICAgIHRoaXMuZHJhZ0FuZERyb3BDb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kOwotICB9Ci0KLSAgcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGdldE1vdmVDb21tYW5kKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgCi0gIHsKLQkgIENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxID0gbmV3IENoYW5nZUJvdW5kc1JlcXVlc3QoUkVRX01PVkVfQ0hJTERSRU4pOwotCSAgcmVxLnNldEVkaXRQYXJ0cyhnZXRIb3N0KCkpOwotCQotCSAgcmVxLnNldE1vdmVEZWx0YShyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkgIHJlcS5zZXRTaXplRGVsdGEocmVxdWVzdC5nZXRTaXplRGVsdGEoKSk7Ci0JICByZXEuc2V0TG9jYXRpb24ocmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQotCSAgcmV0dXJuIGdldEhvc3QoKS5nZXRQYXJlbnQoKS5nZXRDb21tYW5kKHJlcSk7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAJZXJhc2VDaGFuZ2VCb3VuZHNGZWVkYmFjayhudWxsKTsKLSAgCQotICAJaWYgKGRyYWdBbmREcm9wQ29tbWFuZCAhPSBudWxsICYmIGRyYWdBbmREcm9wQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkgIGlmIChSRVFfTU9WRS5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpIHx8IFJFUV9BREQuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotCQkgIHNob3dNb3ZlQ2hhbmdlQm91bmRzRmVlZGJhY2soKENoYW5nZUJvdW5kc1JlcXVlc3QpIHJlcXVlc3QpOwotCSAgfQotCSAgZWxzZSBpZiAoUkVRX0NMT05FLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpIHsKLQkgIAkgIHNob3dDb3B5Q2hhbmdlQm91bmRzRmVlZGJhY2soKENoYW5nZUJvdW5kc1JlcXVlc3QpIHJlcXVlc3QpOwotCSAgfQotICAJfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2hvd01vdmVDaGFuZ2VCb3VuZHNGZWVkYmFjayhDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgCWlmIChkcmFnQW5kRHJvcENvbW1hbmQgIT0gbnVsbCAmJiBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0RmVlZGJhY2tGaWd1cmUoKSAhPSBudWxsKSB7Ci0gIAkJZmVlZGJhY2sgPSBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0RmVlZGJhY2tGaWd1cmUoKTsKLSAgCQlhZGRGZWVkYmFjayhmZWVkYmFjayk7Ci0gIAl9Ci0gIH0gICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHNob3dDb3B5Q2hhbmdlQm91bmRzRmVlZGJhY2soQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gIAkvKgotICAJSUZpZ3VyZSBwID0gZ2V0RHJhZ1NvdXJjZUZlZWRiYWNrRmlndXJlKCk7Ci0gIAlSZWN0YW5nbGUgciA9IG9yaWdpbmFsTG9jYXRpb24uZ2V0VHJhbnNsYXRlZChyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLSAgCURpbWVuc2lvbiByZXNpemUgPSByZXF1ZXN0LmdldFNpemVEZWx0YSgpOwotICAJci53aWR0aCArPSByZXNpemUud2lkdGg7Ci0gIAlyLmhlaWdodCs9IHJlc2l6ZS5oZWlnaHQ7Ci0gIAotICAJKChHcmFwaGljYWxFZGl0UGFydClnZXRIb3N0KCkpLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0gIAlwLnRyYW5zbGF0ZVRvUmVsYXRpdmUocik7Ci0gICAgICAgICAgICAgICAgCi0gICAgUmVjdGFuZ2xlIHBCb3VuZHMgPSByLmdldENvcHkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBpZiAoZHJhZ0FuZERyb3BDb21tYW5kICE9IG51bGwgJiYgZHJhZ0FuZERyb3BDb21tYW5kLmNhbkV4ZWN1dGUoKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpbnQgc2l6ZSA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuc2l6ZSgpOwotICAgICAgaWYgKHNpemUgPiAwICYmIHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuZ2V0KHNpemUgLSAxKSA9PSBnZXRIb3N0KCkpCi0gICAgICB7ICAgICAgICAgCi0gICAgICAgIFBvaW50TGlzdCBwb2ludExpc3QgPSBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0Q29ubmVjdGlvblBvaW50cyhyKTsKLSAgICAgICAgaWYgKHBvaW50TGlzdCAhPSBudWxsICYmIHBvaW50TGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcG9seUxpbmUuc2V0UG9pbnRzKHBvaW50TGlzdCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgUG9pbnQgZmlyc3RQb2ludCA9IHBvaW50TGlzdC5nZXRGaXJzdFBvaW50KCk7Ci0gICAgICAgICAgaWYgKGZpcnN0UG9pbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwQm91bmRzID0gcEJvdW5kcy5nZXRVbmlvbihuZXcgUmVjdGFuZ2xlKGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55LCAxLCAxKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHAuc2V0Qm91bmRzKHBCb3VuZHMpOwotICAgIGdob3N0U2hhcGUuc2V0Qm91bmRzKHIpOwotICAJcC52YWxpZGF0ZSgpOwotICAJKi8KLSAgfSAgICAgICAgCi0vKgotICBwcm90ZWN0ZWQgSUZpZ3VyZSBnZXREcmFnU291cmNlRmVlZGJhY2tGaWd1cmUoKSAKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOyAKLSAgICBpZiAoZmVlZGJhY2sgPT0gbnVsbCAmJiBlZGl0UGFydCBpbnN0YW5jZW9mIFdTRExUcmVlTm9kZUVkaXRQYXJ0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFdTRExUcmVlTm9kZUVkaXRQYXJ0IGJhc2VFZGl0UGFydCA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCllZGl0UGFydDsKLSAgICAgIG9yaWdpbmFsTG9jYXRpb24gPSBuZXcgUmVjdGFuZ2xlKGJhc2VFZGl0UGFydC5nZXRTZWxlY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0gICAgICBmZWVkYmFjayA9IGNyZWF0ZURyYWdTb3VyY2VGZWVkYmFja0ZpZ3VyZShiYXNlRWRpdFBhcnQuZ2V0U2VsZWN0aW9uRmlndXJlKCkpOwotCX0KLQlyZXR1cm4gZmVlZGJhY2s7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVEcmFnU291cmNlRmVlZGJhY2tGaWd1cmUoSUZpZ3VyZSBkcmFnZ2VkRmlndXJlKQotICB7ICAJCi0gIAlQb2x5bGluZSBwb2x5TGluZSA9IG5ldyBQb2x5bGluZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICAgIHBvbHlMaW5lLnNldExpbmVTdHlsZShHcmFwaGljcy5MSU5FX0RBU0hET1QpOyAgICAgIAotICAgIHBvbHlMaW5lLnNldExpbmVXaWR0aCgxKTsKLSAgICBhZGRGZWVkYmFjayhwb2x5TGluZSk7Ci0JCQkKLSAgCXJldHVybiBwb2x5TGluZTsKLQl9IAotCSovCi0KLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLQkgIGlmIChmZWVkYmFjayAhPSBudWxsKQotICAgIHsKLQkJICByZW1vdmVGZWVkYmFjayhmZWVkYmFjayk7Ci0JCSAgZmVlZGJhY2sgPSBudWxsOwotCSAgfQotCSAgaGlkZUZvY3VzKCk7Ci0JICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogRXJhc2UgZmVlZGJhY2sgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNlaXZlciBvYmplY3QgaXMgCi0gICAqIGJlaW5nIGRyYWdnZWQuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGRyYWcgaXMKLSAgICogY29tcGxldGVkIG9yIGNhbmNlbGxlZCBvbiB0aGUgcmVjZWl2ZXIgb2JqZWN0LgotICAgKiBAcGFyYW0gZHJhZ1RyYWNrZXIgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRyYWdUcmFja2VyIFRoZSBkcmFnIHRyYWNrZXIgb2YgdGhlIHRvb2wgcGVyZm9ybWluZyB0aGUgZHJhZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGVyYXNlQ2hhbmdlQm91bmRzRmVlZGJhY2soQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSAKLSAgewotCSAgaWYgKGZlZWRiYWNrICE9IG51bGwpIAotICAgIHsJCSAgICAgIAotCQkgIHJlbW92ZUZlZWRiYWNrKGZlZWRiYWNrKTsKLQkgIH0KLQkgIGZlZWRiYWNrID0gbnVsbDsKLQkgIG9yaWdpbmFsTG9jYXRpb24gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEVyYXNlIGZlZWRiYWNrIGluZGljYXRpbmcgdGhhdCB0aGUgcmVjZWl2ZXIgb2JqZWN0IGlzIAotICAgKiBiZWluZyBkcmFnZ2VkLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBkcmFnIGlzCi0gICAqIGNvbXBsZXRlZCBvciBjYW5jZWxsZWQgb24gdGhlIHJlY2VpdmVyIG9iamVjdC4KLSAgICogQHBhcmFtIGRyYWdUcmFja2VyIG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnVHJhY2tlciBUaGUgZHJhZyB0cmFja2VyIG9mIHRoZSB0b29sIHBlcmZvcm1pbmcgdGhlIGRyYWcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsKLSAgICBpZiAoUkVRX01PVkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSB8fCAgUkVRX0FERC5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKQotICAgIHsKLQkJICBlcmFzZUNoYW5nZUJvdW5kc0ZlZWRiYWNrKChDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3QpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRIb3N0KCk7Ci0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikKLSAgICB7Ci0gICAgICAoKElGZWVkYmFja0hhbmRsZXIpZWRpdFBhcnQpLnJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsKLSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgIHsKLSAgICAgICgoSUZlZWRiYWNrSGFuZGxlcillZGl0UGFydCkuYWRkRmVlZGJhY2soKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0V4cGFuZGFibGVHcmFwaE5vZGVDb250ZW50RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0V4cGFuZGFibGVHcmFwaE5vZGVDb250ZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjBkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9FeHBhbmRhYmxlR3JhcGhOb2RlQ29udGVudEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuSW50ZXJhY3RvcjsKLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgCi0KLS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgRXhwYW5kYWJsZUdyYXBoTm9kZUNvbnRlbnRGaWd1cmUgICAgICAgICB8Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgfAotLy8gIHwgICB8IHZlcnRpY2FsR3JvdXAgICAgICAgICAgICAgICAgICB8ICAgICB8Ci0vLyAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKLS8vICB8ICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgfCAgICAgfAotLy8gIHwgICB8IHwgaG9yaXpvbnRhbEdyb3VwICAgICAgICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgfCAgfCAgICAgfAotLy8gIHwgICB8IHwgfCBvdXRsaW5lZEFyZWEgICAgICB8ICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCB8IC0tLS0tLS0tLS0tLS0tLS0tIHwgICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCB8IHwgfFsrXWljb25BcmVhICAgIHwgfCAgICAgfCAgfCAgICAgfAotLy8gIHwgICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8ICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCB8IC0tLS0tLS0tLS0tLS0tLS0tIHwgICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCB8IHwgfCBpbm5lckNvbnRlbnQgIHwgfCAgICAgfCAgfCAgICAgfAotLy8gIHwgICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8ICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgfCAgICAgfAotLy8gIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8Ci0vLyAgfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIHwKLS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUdyYXBoTm9kZUNvbnRlbnRGaWd1cmUgZXh0ZW5kcyBHcmFwaE5vZGVDb250ZW50RmlndXJlCi17ICAgCi0gIHByb3RlY3RlZCBJbnRlcmFjdG9yIGludGVyYWN0b3I7IAotICAvL3Byb3RlY3RlZCBDb250YWluZXJGaWd1cmUgb2NjdXJlbmNlQXJlYTsgIAotIAotICBwdWJsaWMgRXhwYW5kYWJsZUdyYXBoTm9kZUNvbnRlbnRGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsgICAgCi0gIH0gICAgICAKLSAgCi0gIHB1YmxpYyBJbnRlcmFjdG9yIGdldEludGVyYWN0b3IoKQotICB7Ci0gICAgcmV0dXJuIGludGVyYWN0b3I7Ci0gIH0gCi0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWd1cmUoKQotICB7ICAgCi0gICAgLy9jcmVhdGVQcmVjZWVkaW5nU3BhY2UodGhpcyk7ICAgICAgICAgICAKLSAgICBjcmVhdGVWZXJ0aWNhbEdyb3VwKHRoaXMpOwotICAgIGNyZWF0ZU91dGxpbmVkQXJlYSh2ZXJ0aWNhbEdyb3VwKTsgICAKLSAgICBjcmVhdGVJbnRlcmFjdG9yKGljb25BcmVhKTsKLSAgICBpbm5lckNvbnRlbnRBcmVhLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsIDEwLCAwLCAwKSk7Ci0gICAgLy9jcmVhdGVPY2N1cmVuY2VBcmVhKHZlcnRpY2FsR3JvdXApOyAgIAotICB9Ci0gIAotICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJbnRlcmFjdG9yKElGaWd1cmUgcGFyZW50KQotICB7Ci0gICAgaW50ZXJhY3RvciA9IG5ldyBJbnRlcmFjdG9yKCk7Ci0gICAgaW50ZXJhY3Rvci5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCAwLCAwLCA1KSk7Ci0gICAgaW50ZXJhY3Rvci5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIGludGVyYWN0b3Iuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsgCi0gICAgcGFyZW50LmFkZChpbnRlcmFjdG9yKTsKLSAgfSAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJlY2VlZGluZ1NwYWNlKElGaWd1cmUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIGEgc21hbGwgc3BhY2UKLSAgICBSZWN0YW5nbGVGaWd1cmUgc3BhY2UgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0gICAgc3BhY2Uuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgc3BhY2Uuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDEwLCAxMCkpOwotICAgIHBhcmVudC5hZGQoc3BhY2UpOyAgCi0gIH0gIAotICAKLQotICAvL3Byb3RlY3RlZCB2b2lkIGNyZWF0ZU9jY3VyZW5jZUFyZWEoSUZpZ3VyZSBwYXJlbnQpCi0gIC8vewotICAvLyAgb2NjdXJlbmNlQXJlYSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsgICAgICAgICAgICAgCi0gIC8vICBwYXJlbnQuYWRkKG9jY3VyZW5jZUFyZWEpOwotICAvL30gICAgICAgICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvR3JhcGhOb2RlQ29udGVudEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9HcmFwaE5vZGVDb250ZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDAzYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9HcmFwaE5vZGVDb250ZW50RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLklDb25uZWN0ZWRGaWd1cmU7Ci0gICAgICAgICAgICAgIAotCi0vLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBHcmFwaE5vZGVDb250ZW50RmlndXJlICAgICB8Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICB8Ci0vLyAgfCB8IHZlcnRpY2FsIGdyb3VwICAgICAgICB8ICB8Ci0vLyAgfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8ICB8Ci0vLyAgfCB8IHwgb3V0bGluZWQgYXJlYSAgICAgfCB8ICB8Ci0vLyAgfCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0gfCB8ICB8Ci0vLyAgfCB8IHwgfCBpY29uIGFyZWEgICAgIHwgfCB8ICB8Ci0vLyAgfCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0gfCB8ICB8Ci0vLyAgfCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0gfCB8ICB8Ci0vLyAgfCB8IHwgfCBpbm5lciBjb250ZW50IHwgfCB8ICB8Ci0vLyAgfCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0gfCB8ICB8Ci0vLyAgfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8ICB8Ci0vLyAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICB8Ci0vLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBjbGFzcyBHcmFwaE5vZGVDb250ZW50RmlndXJlIGV4dGVuZHMgQ29udGFpbmVyRmlndXJlIGltcGxlbWVudHMgSUNvbm5lY3RlZEZpZ3VyZQoteyAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIHZlcnRpY2FsR3JvdXA7IAotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIG91dGxpbmVkQXJlYTsKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBpY29uQXJlYTsKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBpbm5lckNvbnRlbnRBcmVhOyAKLSAgICAgICAgIAotICBwdWJsaWMgR3JhcGhOb2RlQ29udGVudEZpZ3VyZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjcmVhdGVGaWd1cmUoKTsgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAgCi0gICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlndXJlKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0SG9yaXpvbnRhbCh0cnVlKTsKLSAgICAvL3NldExheW91dE1hbmFnZXIobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgY3JlYXRlVmVydGljYWxHcm91cCh0aGlzKTsKLSAgICBjcmVhdGVPdXRsaW5lZEFyZWEodmVydGljYWxHcm91cCk7IAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVydGljYWxHcm91cChJRmlndXJlIHBhcmVudCkKLSAgewotICAgIHZlcnRpY2FsR3JvdXAgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgdmVydGljYWxHcm91cC5nZXRDb250YWluZXJMYXlvdXQoKS5zZXRIb3Jpem9udGFsKGZhbHNlKTsKLSAgICAvLy92ZXJ0aWNhbEdyb3VwLnNldExheW91dE1hbmFnZXIobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgcGFyZW50LmFkZCh2ZXJ0aWNhbEdyb3VwKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU91dGxpbmVkQXJlYShJRmlndXJlIHBhcmVudCkKLSAgeyAKLSAgICBvdXRsaW5lZEFyZWEgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgLy9vdXRsaW5lZEFyZWEuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBvdXRsaW5lZEFyZWEuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgcGFyZW50LmFkZChvdXRsaW5lZEFyZWEpOyAgICAgIAotICAgICAKLSAgICBpY29uQXJlYSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBpY29uQXJlYS5nZXRDb250YWluZXJMYXlvdXQoKS5zZXRIb3Jpem9udGFsKHRydWUpOwotICAgIG91dGxpbmVkQXJlYS5hZGQoaWNvbkFyZWEpOwotCi0gICAgaW5uZXJDb250ZW50QXJlYSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICAvL2lubmVyQ29udGVudEFyZWEuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBpbm5lckNvbnRlbnRBcmVhLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIG91dGxpbmVkQXJlYS5hZGQoaW5uZXJDb250ZW50QXJlYSk7ICAKLSAgfSAgIAotCi0gIHB1YmxpYyBDb250YWluZXJGaWd1cmUgZ2V0SWNvbkFyZWEoKQotICB7Ci0gICAgcmV0dXJuIGljb25BcmVhOwotICB9Ci0KLSAgcHVibGljIENvbnRhaW5lckZpZ3VyZSBnZXRPdXRsaW5lZEFyZWEoKQotICB7Ci0gICAgcmV0dXJuIG91dGxpbmVkQXJlYTsKLSAgfQotCi0gIHB1YmxpYyBDb250YWluZXJGaWd1cmUgZ2V0SW5uZXJDb250ZW50QXJlYSgpCi0gIHsKLSAgICByZXR1cm4gaW5uZXJDb250ZW50QXJlYTsKLSAgfSAKLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBvdXRsaW5lZEFyZWE7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL015Q29ubmVjdGlvblJlbmRlcmluZ0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9NeUNvbm5lY3Rpb25SZW5kZXJpbmdIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwMDc4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL015Q29ubmVjdGlvblJlbmRlcmluZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuRGVmaW5pdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5Hcm91cEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5QYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5JQ29ubmVjdGVkRmlndXJlOwotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIE15Q29ubmVjdGlvblJlbmRlcmluZ0hlbHBlciAvL2ltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgoteyAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc091dGxpbmVkID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcjsKLQotICBwdWJsaWMgTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyKEVkaXRQYXJ0Vmlld2VyIHZpZXdlcikKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOyAgICAKLSAgICAvL3ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgLy9zZXRGb2N1c1RyYXZlcnNhYmxlKGZhbHNlKTsgCi0gICAgLy9zZXRFbmFibGVkKGZhbHNlKTsgCi0gIH0gICAgICAKLSAgCi0gIC8vcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIAotICAvL3sKLSAgLy99Ci0gICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgZmlsbFNoYXBlSGVscGVyKEdyYXBoaWNzIGdyYXBoaWNzKQotICB7IAotICAgIGRyYXdMaW5lcyhncmFwaGljcywgdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKTsgICAgCi0gIH0KLSAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0Q29ubmVjdGlvbkJvdW5kcyhJRmlndXJlIGZpZ3VyZSkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgUmVjdGFuZ2xlIHIgPSBudWxsOwotICAgIGlmIChmaWd1cmUgaW5zdGFuY2VvZiBJQ29ubmVjdGVkRmlndXJlKQotICAgIHsKLSAgICAgIElDb25uZWN0ZWRGaWd1cmUgY29ubmVjdGVkRmlndXJlID0gKElDb25uZWN0ZWRGaWd1cmUpZmlndXJlOwotICAgICAgciA9IGNvbm5lY3RlZEZpZ3VyZS5nZXRDb25uZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByID0gZmlndXJlLmdldEJvdW5kcygpOwotICAgIH0KLSAgICByZXR1cm4gcjsgCi0gIH0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgZmluYWwgc3RhdGljIGludCBET1RURURfTElORV9IRUlHSFQgPSAyMDsKLSAgcHJvdGVjdGVkIGludCBnZXRDbGlwcGVkWShpbnQgeSwgUmVjdGFuZ2xlIGJvdW5kcykKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChib3VuZHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoeSA8IGJvdW5kcy55KQotICAgICAgewotICAgICAgICB5ID0gYm91bmRzLnk7Ci0gICAgICB9ICAgICAKLSAgICAgIGlmICh5ICA+IChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpKQotICAgICAgewotICAgICAgICB5ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0OyAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIHZvaWQgZHJhd0xpbmUoR3JhcGhpY3MgZ3JhcGhpY3MsIElGaWd1cmUgYSwgSUZpZ3VyZSBiLCBpbnQgbXgsIFJlY3RhbmdsZSBib3VuZHMpCi0gIHsKLSAgICAgICAgUmVjdGFuZ2xlIHIxID0gZ2V0Q29ubmVjdGlvbkJvdW5kcyhhKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIyID0gZ2V0Q29ubmVjdGlvbkJvdW5kcyhiKTsKLSAgICAgICAgaW50IHgxID0gcjEueCArIHIxLndpZHRoOwotICAgICAgICBpbnQgeTEgPSByMS55ICsgcjEuaGVpZ2h0IC8gMjsKLSAgICAgICAgaW50IHgyID0gcjIueCAtIDE7Ci0gICAgICAgIGludCB5MiA9IHIyLnkgKyByMi5oZWlnaHQgLyAyOwotICAgICAgICAgIAotICAgICAgICBpbnQgY2xpcHBlZFkxID0gZ2V0Q2xpcHBlZFkoeTEsIGJvdW5kcyk7Ci0gICAgICAgIGludCBjbGlwcGVkWTIgPSBnZXRDbGlwcGVkWSh5MiwgYm91bmRzKTsKLQotICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCi0gICAgICAgIGlmIChjbGlwcGVkWTEgPT0geTEgfHwgY2xpcHBlZFkyID09IHkyKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBpZiAoY2xpcHBlZFkxID09IHkxKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGRyYXcgaG9yaXpvbnRhbCBsaW5lCi0gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIG14LCB5MSk7IAotICAgICAgICAgIH0KLSAgICAgICAKLSAgICAgICAgICBpZiAoY2xpcHBlZFkyID09IHkyKQotICAgICAgICAgIHsgICAgICAgIAotICAgICAgICAgICAgLy8gZHJhdyBob3Jpem9udGFsIGxpbmUKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKG14LCB5MiwgeDIgLSAxLCB5Mik7ICAgIAotCi0gICAgICAgICAgICAvLyBkcmF3IHRoZSBhcnJvdyBoZWFkCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUoeDIgLSAxLCB5MiwgeDIgLSA0LCB5MiAtIDMpOyAKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHgyIC0gMSwgeTIsIHgyIC0gNCwgeTIgKyAzKTsgCi0gICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgIC8vIGRyYXcgdGhlIHZlcnRpY2FsIGxpbmUgaW5jbHVkaW5nIGRvdHRlZCBlbmRzCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpbnQgbG93Q2xpcHBlZFkgPSBNYXRoLm1pbihjbGlwcGVkWTEsIGNsaXBwZWRZMik7Ci0gICAgICAgICAgaW50IGhpZ2hDbGlwcGVkWSA9IE1hdGgubWF4KGNsaXBwZWRZMSwgY2xpcHBlZFkyKTsKLSAgICAgICAgICBpbnQgbG93WSA9IE1hdGgubWluKHkxLCB5Mik7Ci0gICAgICAgICAgaW50IGhpZ2hZID0gTWF0aC5tYXgoeTEsIHkyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgIGlmIChsb3dZID09IGxvd0NsaXBwZWRZICYmIGhpZ2hZID09IGhpZ2hDbGlwcGVkWSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShteCwgbG93Q2xpcHBlZFksIG14LCBoaWdoQ2xpcHBlZFkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIGludCBkb3R0ZWRMaW5lTGVuZ3RoID0gTWF0aC5taW4oRE9UVEVEX0xJTkVfSEVJR0hULCAoaGlnaFkgLSBsb3dZKS8zKTsKLSAgICAgICAgICAgIGlmIChsb3dZICE9IGxvd0NsaXBwZWRZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9ET1QpOwotICAgICAgICAgICAgICBpbnQgZG90dGVkWSA9IGxvd0NsaXBwZWRZICsgZG90dGVkTGluZUxlbmd0aDsKLSAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUobXgsIGxvd0NsaXBwZWRZLCBteCwgZG90dGVkWSk7IAotICAgICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9TT0xJRCk7Ci0gICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKG14LCBkb3R0ZWRZLCBteCwgaGlnaENsaXBwZWRZKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8vaWYgKGhpZ2hZICE9IGhpZ2hDbGlwcGVkWSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZ3JhcGhpY3Muc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfRE9UKTsKLSAgICAgICAgICAgICAgaW50IGRvdHRlZFkgPSBoaWdoQ2xpcHBlZFkgLSBkb3R0ZWRMaW5lTGVuZ3RoOwotICAgICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShteCwgaGlnaENsaXBwZWRZLCBteCwgZG90dGVkWSk7IAotICAgICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9TT0xJRCk7Ci0gICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKG14LCBkb3R0ZWRZLCBteCwgbG93Q2xpcHBlZFkpOyAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRyYXdMaW5lcyhHcmFwaGljcyBncmFwaGljcywgRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsgCi0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICB7IAotICAgICAgR3JvdXBFZGl0UGFydCBsZWZ0R3JvdXBFZGl0UGFydCA9IChHcm91cEVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgR3JvdXBFZGl0UGFydCByaWdodEdyb3VwRWRpdFBhcnQgPSBsZWZ0R3JvdXBFZGl0UGFydC5nZXROZXh0KCk7Ci0KLSAgICAgIGlmIChsZWZ0R3JvdXBFZGl0UGFydCAhPSBudWxsICYmIHJpZ2h0R3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChsZWZ0R3JvdXBFZGl0UGFydC5vdXRwdXRDb25uZWN0aW9uICE9IG51bGwgJiYgcmlnaHRHcm91cEVkaXRQYXJ0LmlucHV0Q29ubmVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG14ID0gcmlnaHRHcm91cEVkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnggLSA1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgUmVjdGFuZ2xlIGwgPSBsZWZ0R3JvdXBFZGl0UGFydC5vdXRlclBhbmUuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgUmVjdGFuZ2xlIHIgPSBsZWZ0R3JvdXBFZGl0UGFydC5vdXRlclBhbmUuZ2V0Qm91bmRzKCk7Ci0KLSAgICAgICAgICAvLyBoZXJlIHdlIGNvbXB1dGUgdGhlIHVuaW9uIG9mIHRoZSBncm91cCBib3VuZHMuLi4gcmVjdGFuZ2xlLnVuaW9uKCkgZG9lc24ndCBzZWVtIHRvIHdvcmsKLSAgICAgICAgICAvLwotICAgICAgICAgIGludCB1eDEgPSBNYXRoLm1pbihsLngsIHIueCk7IAotICAgICAgICAgIGludCB1eTEgPSBNYXRoLm1pbihsLnksIHIueSk7ICAgICAgIAotICAgICAgICAgIGludCB1eDIgPSBNYXRoLm1heChsLnggKyBsLndpZHRoLCByLnggKyByLndpZHRoKTsKLSAgICAgICAgICBpbnQgdXkyID0gTWF0aC5tYXgobC55ICsgbC5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KTsKLSAgICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gbmV3IFJlY3RhbmdsZSh1eDEsIHV5MSwgdXgyIC0gdXgxLCB1eTIgLSB1eTEpOyAgICAgICAKLSAgICAgICAgICBkcmF3TGluZShncmFwaGljcywgbGVmdEdyb3VwRWRpdFBhcnQub3V0cHV0Q29ubmVjdGlvbi5nZXRGaWd1cmUoKSwgcmlnaHRHcm91cEVkaXRQYXJ0LmlucHV0Q29ubmVjdGlvbi5nZXRGaWd1cmUoKSwgbXgsIGJvdW5kcyk7ICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfSAgCi0gICAgZWxzZSBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KQotICAgIHsKLSAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQgPSAoZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKSA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0LmdldENoaWxkcmVuKCkuZ2V0KDApIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOwotICAgICAgaWYgKGNoaWxkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERlZmluaXRpb25FZGl0UGFydCBkZWYgPSAoRGVmaW5pdGlvbkVkaXRQYXJ0KWVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgICAgICBHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQgPSBkZWYuZ2V0R3JvdXBFZGl0UGFydChXU0RMR3JvdXBPYmplY3QuTUVTU0FHRVNfR1JPVVApOwotICAgICAgICBpZiAoZ3JvdXBFZGl0UGFydCAhPSBudWxsICYmIGdyb3VwRWRpdFBhcnQub3V0cHV0Q29ubmVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG14ID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCAtIDEyOwotICAgICAgICAgIGRyYXdMaW5lKGdyYXBoaWNzLCBncm91cEVkaXRQYXJ0Lm91dHB1dENvbm5lY3Rpb24uZ2V0RmlndXJlKCksIGNoaWxkLmdldEZpZ3VyZSgpLCBteCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgIGRyYXdMaW5lcyhncmFwaGljcywgY2hpbGQpOwotICAgICAgfQotICAgIH0gCi0gIH0gICAgCi19ICAgICAKLQotLyoKLSAgICAvKgotICAgIExpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIGRyYXdMaW5lcyhncmFwaGljcywgY2hpbGQpOyAgICAKLSAgICB9ICovIAotICAgICAgLyogIAotICAgICAgTGlzdCBjb25uZWN0ZWRGaWd1cmVzID0gZ3JhcGhOb2RlRmlndXJlLmdldENvbm5lY3RlZEZpZ3VyZXMoSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlLlJJR0hUX0NPTk5FQ1RJT04pOwotICAgICAgaW50IGNvbm5lY3RlZEZpZ3VyZXNTaXplID0gY29ubmVjdGVkRmlndXJlcy5zaXplKCk7ICAgICAgICAgICAgICAKLQotICAgICAgaWYgKGNvbm5lY3RlZEZpZ3VyZXNTaXplID4gMCkgCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGZpcnN0R3JhcGhOb2RlRmlndXJlID0gKElDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSljb25uZWN0ZWRGaWd1cmVzLmdldCgwKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBncmFwaE5vZGVGaWd1cmUuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLmdldEJvdW5kcygpOyAgICAKLSAgICAgICAgICAKLSAgICAgICAgaW50IHgxID0gci54ICsgci53aWR0aDsKLSAgICAgICAgaW50IHkxID0gci55ICsgci5oZWlnaHQvMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCBzdGFydE9mQ2hpbGRCb3ggPSBmaXJzdEdyYXBoTm9kZUZpZ3VyZS5nZXRDb25uZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLSAgICAgICAgaW50IHgyID0geDEgKyAoc3RhcnRPZkNoaWxkQm94IC0geDEpIC8gMzsKLSAgICAgICAgaW50IHkyID0geTE7Ci0gICAgICAKLSAgICAgICAgaWYgKGNvbm5lY3RlZEZpZ3VyZXNTaXplID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIHN0YXJ0T2ZDaGlsZEJveCwgeTIpOyAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLy8gKGNvbm5lY3RlZEZpZ3VyZXMubGVuZ3RoID4gMSkKLSAgICAgICAgeyAKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIHgyLCB5Mik7Ci0KLSAgICAgICAgICBpbnQgbWluWSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgIGludCBtYXhZID0gLTE7Ci0KLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25uZWN0ZWRGaWd1cmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGNvbm5lY3RlZEZpZ3VyZSA9IChJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgY2hpbGRDb25uZWN0aW9uUmVjdGFuZ2xlID0gY29ubmVjdGVkRmlndXJlLmdldENvbm5lY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIGludCB5ID0gY2hpbGRDb25uZWN0aW9uUmVjdGFuZ2xlLnkgKyBjaGlsZENvbm5lY3Rpb25SZWN0YW5nbGUuaGVpZ2h0IC8gMjsKLSAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTsKLSAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTsKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHgyLCB5LCBjaGlsZENvbm5lY3Rpb25SZWN0YW5nbGUueCwgeSk7Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MiwgbWluWSwgeDIsIG1heFkpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0gICAgICAgICAgICAKLQotICAgIC8vYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdHJ1ZTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICBkcmF3TGluZXMoZ3JhcGhpY3MsIGNoaWxkKTsKLSAgICB9Ci0qLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9UcmVlTm9kZUNvbnRlbnRGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvVHJlZU5vZGVDb250ZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOGI3OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9UcmVlTm9kZUNvbnRlbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBUcmVlTm9kZUNvbnRlbnRGaWd1cmUgZXh0ZW5kcyBFeHBhbmRhYmxlR3JhcGhOb2RlQ29udGVudEZpZ3VyZQoteyAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPdXRsaW5lZEFyZWEoSUZpZ3VyZSBwYXJlbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gICAgc3VwZXIuY3JlYXRlT3V0bGluZWRBcmVhKHBhcmVudCk7Ci0gICAgb3V0bGluZWRBcmVhLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsMiwwLDIpKTsgCi0gIH0gICAgCi0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBvdXRsaW5lZEFyZWE7Ci0gIH0gICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL1dTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL1dTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzNmNlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9tb2RlbC9XU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguVmlld01vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETE1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkKLXsgICAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSB3c2RsR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2U7Ci0KLSAgcHVibGljIHN0YXRpYyBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5IGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKQotICB7ICAgICAgICAgICAgICAgIAotICAgIGlmICh3c2RsR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c2RsR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2UgPSBuZXcgV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gd3NkbEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeUluc3RhbmNlOwotICB9ICAKLSAgCi0gIHByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEdyYXBoQWRhcHRlckZhY3RvcnkoKTsKLSAgfSAgCi0KLSAgLy9wcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVuc2liaWxpdHlFbGVtZW50Q29uc2lkZXJlZENoaWxkKCkKLSAgLy97Ci0gIC8vICByZXR1cm4gZmFsc2U7Ci0gIC8vfQotICAgICAgICAKLQotICAvLyBUaGVyZSBhcmUgbWFueSBhZGFwdGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmYWN0b3J5LiAgRWFjaCBET00gTm9kZSBoYXMgaXRzIG93biBhZGFwdGVyLgotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdTRExBZGFwdGVyRmFjdG9yeUltcGwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlZmluaXRpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyYXBoRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICB9IAotICAgIAotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdBZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyYXBoQmluZGluZ0FkYXB0ZXIoKTsKLSAgICB9IAotCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFydEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgR3JhcGhQYXJ0QWRhcHRlcigpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgLy9wdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0QWRhcHRlcigpCi0gICAgLy97Ci0gICAgLy8gIHJldHVybiBuZXcgR3JhcGhQb3J0QWRhcHRlcigpOwotICAgIC8vfQotCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydFR5cGVBZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyYXBoUG9ydFR5cGVBZGFwdGVyKCk7Ci0gICAgfQotCi0gICAgLy9wdWJsaWMgQWRhcHRlciBjcmVhdGVJbnB1dEFkYXB0ZXIoKQotICAgIC8vewotICAgIC8vICByZXR1cm4gbmV3IEdyYXBoSW5wdXRBZGFwdGVyKCk7Ci0gICAgLy99IAotCi0gICAgLy9wdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRwdXRBZGFwdGVyKCkKLSAgICAvL3sKLSAgICAvLyAgcmV0dXJuIG5ldyBHcmFwaE91dHB1dEFkYXB0ZXIoKTsKLSAgICAvL30gICAKLQotICAgIC8vcHVibGljIEFkYXB0ZXIgY3JlYXRlRmF1bHRBZGFwdGVyKCkKLSAgICAvL3sKLSAgICAvLyAgcmV0dXJuIG5ldyBHcmFwaEZhdWx0QWRhcHRlcigpOwotICAgIC8vfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVUeXBlc0FkYXB0ZXIoKSAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJldHVybiBuZXcgR3JhcGhUeXBlc0FkYXB0ZXIoKTsKLSAgICB9Ci0gIH0gICAgICAKLQotICAgICAgICAKLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBHcmFwaERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgRGVmaW5pdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBWaWV3TW9kZS5MaXN0ZW5lcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBWaWV3TW9kZSB2aWV3TW9kZSA9IG5ldyBWaWV3TW9kZSgpOyAgCi0gCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7ICAgCi0gICAgICB2aWV3TW9kZS5hZGRMaXN0ZW5lcih0aGlzKTsgICAgICAgICAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGxpc3QuYWRkKHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuZ2V0KDApKTsKLSAgICAgIGxpc3QuYWRkKHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuZ2V0KDEpKTsgIAotICAgICAgbGlzdC5hZGQocGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5nZXQoNSkpOwotICAgICAgaWYgKHZpZXdNb2RlLmlzQmluZGluZ1Zpc2libGUoKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQocGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5nZXQoNCkpOwotICAgICAgfSAKLSAgICAgIGxpc3QuYWRkKHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuZ2V0KDMpKTsgIAotICAgICAgbGlzdC5hZGQocGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5nZXQoMikpOyAgCi0gICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzR3JvdXAuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChleHRlbnNpYmlsaXR5RWxlbWVudHNHcm91cCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsgICAgICAKLSAgICB9Ci0KLSAgCi0gICAgcHVibGljIHZvaWQgdmlld01vZGVDaGFuZ2VkKFZpZXdNb2RlIG1vZGUpCi0gICAgewotICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlZEhlbHBlcigpOwotICAgIH0gICAgCi0KLSAgICBwdWJsaWMgVmlld01vZGUgZ2V0Vmlld01vZGUoKQotICAgIHsKLSAgICAgIHJldHVybiB2aWV3TW9kZTsKLSAgICB9ICAgIAotCi0gICAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlckZhY3RvcnkgZ2V0TW9kZWxBZGFwdGVyRmFjdG9yeSgpCi0gICAgewotICAgICAgcmV0dXJuIGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLSAgICB9Ci0gIH0KLQotCi0KLQotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhCaW5kaW5nQWRhcHRlciBleHRlbmRzIEJpbmRpbmdBZGFwdGVyCi0gIHsgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgCi0gICAgICBpZiAoYmluZGluZy5nZXRQb3J0VHlwZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ki8gIAotICB9Ci0gICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhQYXJ0QWRhcHRlciBleHRlbmRzIFBhcnRBZGFwdGVyCi0gIHsgLyogIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgIE9iamVjdCBjb21wb25lbnQgPSBwYXJ0LmdldFR5cGUoKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE8uLi4gaSdtIHB1bGxpbmcgYSBmYXN0IG9uZSBoZXJlLi4uLiB3ZSBzaG91bGQgY2FsbCB0aGUgZXh0ZW5zaW9uCi0gICAgICAgIC8vIHRvIHNlZSBpZiBoZSB3YW50cyB0byBzaG93IGEgY2hpbGQgaGVyZQotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50ID0gcGFydC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSovICAgCi0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIEdyYXBoUG9ydFR5cGVBZGFwdGVyIGV4dGVuZHMgUG9ydFR5cGVBZGFwdGVyCi0gIHsgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImJpbmRpbmdzIikpCi0gICAgICB7ICAgIAotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChwb3J0VHlwZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICByZXN1bHQgPSB1dGlsLmdldEJpbmRpbmdzKHBvcnRUeXBlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkobW9kZWxPYmplY3QsIHByb3BlcnR5TmFtZSk7Ci0gICAgICB9ICAgCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gIAotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIEdyYXBoUG9ydEFkYXB0ZXIgZXh0ZW5kcyBQb3J0QWRhcHRlciBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0gICAgCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylwb3J0LmdldEJpbmRpbmcoKTsKLQotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoYmluZGluZyk7Ci0gICAgICB9Ci0gICAgIAotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gcHJvcGFnYXRlIGNoYW5nZXMgdG8gdGhlIGJpbmRpbmcgb2JqZWN0Ci0gICAgLy8KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQocG9ydCwgbnVsbCk7Ci0gICAgfQotICB9ICAgCi0gICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhJbnB1dEFkYXB0ZXIgZXh0ZW5kcyBJbnB1dEFkYXB0ZXIKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGlmIChpbnB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoaW5wdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAgICAKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsgICAgICAgICAgIAotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYmluZGluZ3MiKSkKLSAgICAgIHsgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGlucHV0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdCA9IHV0aWwuZ2V0QmluZGluZ0lucHV0cyhpbnB1dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KG1vZGVsT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOwotICAgICAgfSAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgCi0gIH0KLQotCi0gIHByb3RlY3RlZCBjbGFzcyBHcmFwaE91dHB1dEFkYXB0ZXIgZXh0ZW5kcyBPdXRwdXRBZGFwdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBpZiAob3V0cHV0LmdldE1lc3NhZ2UoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChvdXRwdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsgICAgICAgICAgIAotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYmluZGluZ3MiKSkKLSAgICAgIHsgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKG91dHB1dC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICByZXN1bHQgPSB1dGlsLmdldEJpbmRpbmdPdXRwdXRzKG91dHB1dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KG1vZGVsT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOwotICAgICAgfSAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhGYXVsdEFkYXB0ZXIgZXh0ZW5kcyBGYXVsdEFkYXB0ZXIKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGlmIChmYXVsdC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsgICAgICAgICAgIAotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYmluZGluZ3MiKSkKLSAgICAgIHsgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGZhdWx0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdCA9IHV0aWwuZ2V0QmluZGluZ0ZhdWx0cyhmYXVsdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KG1vZGVsT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOwotICAgICAgfSAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAKLQotICBwdWJsaWMgY2xhc3MgR3JhcGhUeXBlc0FkYXB0ZXIgZXh0ZW5kcyBUeXBlc0FkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgcyA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudClvOwotICAgICAgICAgIE9iamVjdCBzY2hlbWEgPSBzLmdldFNjaGVtYSgpOwotICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZChzY2hlbWEpOwotICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQobyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotICAvKgotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhCaW5kaW5nQWRhcHRlciBleHRlbmRzIEJpbmRpbmdBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgIAotICAgICAgaWYgKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChiaW5kaW5nLmdldFBvcnRUeXBlKCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAgCi0gIH0qLwotCi0gIC8vIGNvbnZlbmllbmNlIG1ldGhvZHMKLSAgLy8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLS8vICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gRWNvcmVVdGlsLmdldEFkYXB0ZXIoZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmVBZGFwdGVycygpLG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfSAgICAKLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIobW9kZWxPYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICB9IAotCi0gIHB1YmxpYyBzdGF0aWMgVmlld01vZGUgZ2V0Vmlld01vZGUoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgR3JhcGhEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKEdyYXBoRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIoZGVmaW5pdGlvbik7Ci0gICAgcmV0dXJuIGFkYXB0ZXIuZ2V0Vmlld01vZGUoKTsKLSAgfSAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmFjay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMWEyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2JpbmRpbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2JpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2ZTJmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZmU1NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmluZGluZ2hlYWRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDAyZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2NvbXBsZXh0eXBlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9jb21wbGV4dHlwZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdmODUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2NvbXBsZXh0eXBlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9lbGVtZW50X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9lbGVtZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZWxlbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZXJyb3JfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZXJyb3JfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2Vycm9yX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZhdWx0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjI4MTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9maWxlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTdhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmxkcl9lbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mbGRyX2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxYzEzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mbGRyX2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZvcndhcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjY5OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9oaWRlYmluZGluZy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9oaWRlYmluZGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDZjZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaGlkZWJpbmRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cGFkZHJlc3Nfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBhZGRyZXNzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjBjMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cGFkZHJlc3Nfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBiaW5kaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwYmluZGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI4ZWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBiaW5kaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwb3BlcmF0aW9uX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwb3BlcmF0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDA0MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cG9wZXJhdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybGVuY29kZWRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHB1cmxlbmNvZGVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNTA1MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybGVuY29kZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHB1cmxyZXBsYWNlbWVudF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybHJlcGxhY2VtZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzU4N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybHJlcGxhY2VtZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ltcG9ydF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzI3NWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ltcG9ydF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaW1wb3J0aGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRoZWFkZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwMGNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2lucHV0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbnB1dF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTZiMzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2lucHV0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9tZXNzYWdlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9tZXNzYWdlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2U0ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZWhlYWRlcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZWhlYWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmE3MTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL21lc3NhZ2VoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL25hbWVzcGFjZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlM2YyNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9uYW1lc3BhY2VkZWNsX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9uYW1lc3BhY2VkZWNsX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzlkMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlZGVjbF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmV3X3dzZGxfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL25ld193c2RsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDg3YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmV3X3dzZGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL29wZXJhdGlvbl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MThhMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vcGVyYXRpb25iaW5kaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vcGVyYXRpb25iaW5kaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzg2YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uYmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X25vLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF9uby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YjlmOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X25vLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDkxOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vdXRwdXRfeWVzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF95ZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF95ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcGFnZV9iYW5uZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcGFnZV9iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJjMGIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhZ2VfYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhcnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhcnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxOWRmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wYXJ0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTQ5OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydHR5cGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnR0eXBlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzI1Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydHR5cGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnR0eXBlaGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0dHlwZWhlYWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZjYzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnR0eXBlaGVhZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRjbXBseHBsdHlwX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRjbXBseHBsdHlwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiODY2NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0Y21wbHhwbHR5cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0ZWxlbXRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BydGVsZW10X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmQxMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0ZWxlbXRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BydHNtcGx0eXBfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BydHNtcGx0eXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmYzdjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRzbXBsdHlwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zZXJ2aWNlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zZXJ2aWNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTZiM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2VydmljZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2VydmljZWhlYWRlcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2VydmljZWhlYWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQ4MTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NlcnZpY2VoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NpbXBsZXR5cGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NpbXBsZXR5cGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1ZGJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zaW1wbGV0eXBlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDI2ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGFkZHJlc3Nfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhZGRyZXNzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODBiYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGFkZHJlc3Nfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhdHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhdHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiMzY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYXR0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYmluZGluZ19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZjZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJvZHlfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBib2R5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZDAxYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJvZHlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBmYXVsdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGZhdWx0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NmIxZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MmVhM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGhlYWRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGhlYWRlcmZhdWx0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyZmF1bHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwZTE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyZmF1bHRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBvcGVyYXRpb25fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBvcGVyYXRpb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMTkxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2Fwb3BlcmF0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy90eXBlc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdHlwZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNmY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy90eXBlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3dzZGxfZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvd3NkbF9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjFmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvd3NkbF9maWxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2RfZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMveHNkX2ZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkY2ZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2RfZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMveHNkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkY2ZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTNlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsQWRhcHRlcgoteyAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRFJFTl9QUk9QRVJUWSA9ICJDSElMRFJFTl9QUk9QRVJUWSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX1BST1BFUlRZID0gIkxBQkVMX1BST1BFUlRZIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfUFJPUEVSVFkgPSAiSU1BR0VfUFJPUEVSVFkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfUFJPUEVSVFkgPSAiREVUQUlMX1BST1BFUlRZIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTW9kZWxBZGFwdGVyTGlzdGVuZXIgbCk7Ci0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKTsgCi0gIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGIwZGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxBZGFwdGVyRmFjdG9yeQotewotICBwdWJsaWMgTW9kZWxBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IG8pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlckxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tb2RlbC9Nb2RlbEFkYXB0ZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNlODUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsQWRhcHRlckxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tb2RlbC9XU0RMR3JvdXBPYmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL1dTRExHcm91cE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM0M2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL1dTRExHcm91cE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotCi0KLSAgCi0vLyBOb3RlIHRoYXQgdGhlIFRZUEVTX0dST1VQIGdyb3VwIGlzIGp1c3QgYSBwbGFjZSBob2xkZXIuICBJZiB0aGUgVHlwZXMgb2JlamN0IGFjdHVhbGx5IGV4aXN0cyAKLS8vIGZvciB0aGUgcm9vdCBXU0RMIGRvY3VtZW50LCBpdCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGlzIG1vZGVsIGdyb3VwCi0vLwotcHVibGljIGNsYXNzIFdTRExHcm91cE9iamVjdCBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBPUlRTX0dST1VQID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRVNfR1JPVVAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFU19HUk9VUCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlRfVFlQRVNfR1JPVVAgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5ESU5HU19HUk9VUCA9IDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVTX0dST1VQID0gNjsgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTlNJQklMSVRZX0VMRU1FTlRTX0dST1VQID0gNzsKLSAgICAgICAgIAotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcm90ZWN0ZWQgaW50IHR5cGU7ICAgICAgIAotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBNb2RlbEFkYXB0ZXJGYWN0b3J5IG1vZGVsQWRhcHRlckZhY3Rvcnk7Ci0KLSAgcHVibGljIFdTRExHcm91cE9iamVjdChEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCB0eXBlKQotICB7Ci0gICAgdGhpcyhkZWZpbml0aW9uLCB0eXBlLCBudWxsKTsKLSAgfSAgCi0KLSAgcHVibGljIFdTRExHcm91cE9iamVjdChEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCB0eXBlLCBNb2RlbEFkYXB0ZXJGYWN0b3J5IG1vZGVsQWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudHlwZSA9IHR5cGU7ICAgICAgICAKLSAgICB0aGlzLm1vZGVsQWRhcHRlckZhY3RvcnkgPSBtb2RlbEFkYXB0ZXJGYWN0b3J5OwotICB9Ci0gICAgIAotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRQYXJlbnQoKQotICB7Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0gICAgICAgICAgICAgICAKLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9ICAgICAgICAgICAgICAgCi0KLQotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgeyAgICAgICAgICAgIAotICAgIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgSU1QT1JUU19HUk9VUCA6Ci0gICAgICB7ICAgICAgICAgICAKLSAgICAgICAgbmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0ZPTERFUl9JTVBPUlRTIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBNRVNTQUdFU19HUk9VUCA6Ci0gICAgICB7ICAgIAotICAgICAgICBuYW1lID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRk9MREVSX01FU1NBR0VTIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFNFUlZJQ0VTX0dST1VQIDoKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0ZPTERFUl9TRVJWSUNFUyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBCSU5ESU5HU19HUk9VUCA6Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBuYW1lID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRk9MREVSX0JJTkRJTkdTIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgIAotICAgICAgY2FzZSBQT1JUX1RZUEVTX0dST1VQIDoKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG5hbWUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9GT0xERVJfUE9SVFRZUEVTIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICAgIGNhc2UgVFlQRVNfR1JPVVAgOgotICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgbmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0ZPTERFUl9UWVBFUyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfSAKLSAgICAgIGNhc2UgRVhURU5TSUJJTElUWV9FTEVNRU5UU19HUk9VUDoKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0ZPTERFUl9FWFRFTlNJQklMSVRZX0VMRU1FTlRTIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgcmV0dXJuIG5hbWU7Ci0gIH0gICAgCi0gICAgICAgICAKLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7ICAgICAgICAgICAgICAgIAotICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgICAgY2FzZSBJTVBPUlRTX0dST1VQIDoKLSAgICAgIHsgICAgCi0gICAgICAgIGltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9pbXBvcnRoZWFkZXJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBNRVNTQUdFU19HUk9VUCA6Ci0gICAgICB7ICAgIAotICAgICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvbWVzc2FnZWhlYWRlcl9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFNFUlZJQ0VTX0dST1VQIDoKLSAgICAgIHsKLSAgICAgICAgaW1hZ2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL3NlcnZpY2VoZWFkZXJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBQT1JUX1RZUEVTX0dST1VQIDoKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9wb3J0dHlwZWhlYWRlcl9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJJTkRJTkdTX0dST1VQIDoKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0gICAgCi0gICAgICBjYXNlIFRZUEVTX0dST1VQIDoKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy90eXBlc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IAotICAgICAgY2FzZSBFWFRFTlNJQklMSVRZX0VMRU1FTlRTX0dST1VQOgotICAgICAgewotICAgICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvZmxkcl9lbC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAKLSAgICByZXR1cm4gaW1hZ2U7Ci0gIH0gICAKLQotCi0gIC8vIGltcGxlbWVudCBNb2RlbEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgaWYgKCFsaXN0ZW5lckxpc3QuY29udGFpbnMobGlzdGVuZXIpKQotICAgIHsKLSAgICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICAgIH0KLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0gCi0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgeyAgICAgICAKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDSElMRFJFTl9QUk9QRVJUWSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0Q2hpbGRyZW4oKTsgICAgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExBQkVMX1BST1BFUlRZKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBnZXRMYWJlbCgpOyAgICAgIAotICAgIH0gICAgCi0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTUFHRV9QUk9QRVJUWSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0SW1hZ2UoKTsgICAgICAKLSAgICB9ICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyAgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKE9iamVjdCBub3RpZmllciwgU3RyaW5nIHByb3BlcnR5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0IC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyID0gKE1vZGVsQWRhcHRlckxpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKG5vdGlmaWVyLCBwcm9wZXJ0eSk7Ci0gICAgfQotICB9IAotICAgCi0KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgICAgICAgCi0gICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0gICAgc3dpdGNoIChnZXRUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuSU1QT1JUU19HUk9VUCA6IAotICAgICAgeyAgIAotICAgICAgICBsaXN0ID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0Lk1FU1NBR0VTX0dST1VQIDogCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IHNvcnRNZXNzYWdlcyh1dGlsLmdldE1lc3NhZ2VzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IHV0aWwuZ2V0TWVzc2FnZXMoKTsKLSAgICAgICAgfSAgCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuU0VSVklDRVNfR1JPVVAgOiAKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IHV0aWwuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5QT1JUX1RZUEVTX0dST1VQIDogCi0gICAgICB7ICAgICAgIAotICAgICAgICBsaXN0ID0gdXRpbC5nZXRQb3J0VHlwZXMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5CSU5ESU5HU19HUk9VUCA6IAotICAgICAgewotICAgICAgICBsaXN0ID0gdXRpbC5nZXRCaW5kaW5ncygpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlRZUEVTX0dST1VQIDogCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE9iamVjdCB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IChMaXN0KW1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcih0eXBlcykuZ2V0UHJvcGVydHkodHlwZXMsIE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgICAKLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVA6Ci0gICAgICB7Ci0gICAgICAgIGxpc3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50Tm9kZXMoZGVmaW5pdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGluaXRpYWxTb3J0KExpc3QgaW5wdXRMaXN0KSB7Ci0gIAlMaXN0IG1lc3NhZ2VHcm91cHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAlJdGVyYXRvciBpdGVyYXRvciA9IGlucHV0TGlzdC5pdGVyYXRvcigpOwotICAJCi0gIAl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gIAkJTWVzc2FnZSBuZXdNZXNzYWdlID0gKE1lc3NhZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLSAgCQkKLSAgCQlib29sZWFuIG1lc3NhZ2VBZGRlZCA9IGZhbHNlOwotICAJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtZXNzYWdlR3JvdXBzLnNpemUoKTsgaW5kZXgrKykgewotICAJCQlNZXNzYWdlR3JvdXAgbWVzc2FnZUl0ZW0gPSAoTWVzc2FnZUdyb3VwKSBtZXNzYWdlR3JvdXBzLmdldChpbmRleCk7Ci0gIAkJCQotICAJCQlpZihtZXNzYWdlSXRlbS5hZGRNZXNzYWdlKG5ld01lc3NhZ2UpKSB7Ci0gIAkJCQltZXNzYWdlQWRkZWQgPSB0cnVlOwotICAJCQkJYnJlYWs7Ci0gIAkJCX0KLSAgCQl9Ci0gIAkJCi0gIAkJLy8gRG8gd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgTWVzc2FnZUdyb3VwIG9iamVjdD8KLSAgCQlpZiAoIW1lc3NhZ2VBZGRlZCkgewotICAJCQlNZXNzYWdlR3JvdXAgbXNHcm91cCA9IG5ldyBNZXNzYWdlR3JvdXAobmV3TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQkJCW1zR3JvdXAuYWRkTWVzc2FnZShuZXdNZXNzYWdlKTsKLSAgCQkJbWVzc2FnZUdyb3Vwcy5hZGQobXNHcm91cCk7Ci0gIAkJfQotICAJfQotCi0gIAlyZXR1cm4gbWVzc2FnZUdyb3VwczsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGJ1aWxkTWVzc2FnZUxpc3QoTGlzdCBsaXN0KSB7Ci0gIAlMaXN0IHNvcnRlZE1lc3NhZ2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAJCi0gIAlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgCQlNZXNzYWdlR3JvdXAgbUdyb3VwID0gKE1lc3NhZ2VHcm91cCkgaXRlcmF0b3IubmV4dCgpOwotICAJCXNvcnRlZE1lc3NhZ2VMaXN0LmFkZEFsbChtR3JvdXAuZ2V0TWVzc2FnZXMoKSk7Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBzb3J0ZWRNZXNzYWdlTGlzdDsKLSAgfQotCi0gIHByaXZhdGUgTGlzdCBzb3J0TWVzc2FnZXMoTGlzdCBpbnB1dExpc3QpIHsKLSAgCUxpc3Qgc29ydGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCXNvcnRlZExpc3QuYWRkQWxsKGlucHV0TGlzdCk7Ci0gIAkKLSAgCS8vIEdldCBhIHNvcnRlZCBsaXN0IG9mIE1lc3NhZ2VHcm91cHMKLSAgCXNvcnRlZExpc3QgPSBpbml0aWFsU29ydChpbnB1dExpc3QpOwotCi0gIAlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZExpc3QsIG5ldyBDb21wYXJhdG9yKCkgewotICAJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAJCQlTdHJpbmcgbmFtZTEgPSAoKE1lc3NhZ2VHcm91cCkgbzEpLmdldEJhc2VOYW1lKCk7Ci0gIAkJCVN0cmluZyBuYW1lMiA9ICgoTWVzc2FnZUdyb3VwKSBvMikuZ2V0QmFzZU5hbWUoKTsKLSAgCQkJCi0gIAkJCXJldHVybiBuYW1lMS5jb21wYXJlVG9JZ25vcmVDYXNlKG5hbWUyKTsKLSAgICAgIAl9ICAJCi0gIAl9KTsKLSAgCQotICAJc29ydGVkTGlzdCA9IGJ1aWxkTWVzc2FnZUxpc3Qoc29ydGVkTGlzdCk7Ci0gIAlyZXR1cm4gc29ydGVkTGlzdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBNZXNzYWdlR3JvdXAgewotICAJcHJpdmF0ZSBTdHJpbmcgYmFzZU5hbWU7Ci0gIAlwcml2YXRlIFZlY3RvciBtZXNzYWdlczsKLSAgCQotICAJcHVibGljIE1lc3NhZ2VHcm91cChTdHJpbmcgbmFtZSkgewotICAJCXRoaXMuYmFzZU5hbWUgPSBjb21wdXRlQmFzZU5hbWUobmFtZSk7Ci0gIAkJbWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBib29sZWFuIGFkZE1lc3NhZ2UoTWVzc2FnZSBuZXdNZXNzYWdlKSB7Ci0gIAkJLy8gZG8gY2hlY2sgaWYgaXQgYmVsb25ncyBoZXJlPy4uLi4uLgotICAJCVN0cmluZyBuZXdNZXNzYWdlQmFzZU5hbWUgPSBjb21wdXRlQmFzZU5hbWUobmV3TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgCQkKLSAgCQlpZiAobmV3TWVzc2FnZUJhc2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoZ2V0QmFzZU5hbWUoKSkpIHsKLSAgCQkJYWRkVG9Tb3J0ZWRMaXN0KG5ld01lc3NhZ2UpOwotICAJCQkKLSAgCQkJcmV0dXJuIHRydWU7Ci0gIAkJfQotICAJCQotICAJCXJldHVybiBmYWxzZTsKLSAgCX0KLSAgCQotICAJcHVibGljIFZlY3RvciBnZXRNZXNzYWdlcygpIHsKLSAgCQlyZXR1cm4gbWVzc2FnZXM7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0gIAkJcmV0dXJuIGJhc2VOYW1lOwotICAJfQotICAJCi0gIAlwcml2YXRlIGludCBnZXRGaXJzdEluc3RhbmNlKFN0cmluZyBzdWJTdHJpbmcpIHsKLSAgCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gIAkJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBtZXNzYWdlcy5nZXQoaW5kZXgpOwotICAJCQlTdHJpbmcgbWVzc2FnZU5hbWUgPSBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gIAkJCQotICAJCQlpZiAobWVzc2FnZU5hbWUuaW5kZXhPZihzdWJTdHJpbmcsIDEpID4gMCkgewotICAJCQkJcmV0dXJuIGluZGV4OwotICAJCQl9Ci0gIAkJfQotICAJCSAgCQkKLSAgCQlyZXR1cm4gLTE7Ci0gIAl9Ci0gIAkKLSAgCXByaXZhdGUgdm9pZCBhZGRUb1NvcnRlZExpc3QoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gIAkJLy8gV2UgbmVlZCB0byBhZGQgdGhlIG5ldyBNZXNzYWdlIGluIHRoZSByaWdodCBwb3NpdGlvbgotICAJCWludCBpbmRleCA9IC0xOwotICAJCVN0cmluZyBuYW1lID0gbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAJCWlmIChuYW1lLmluZGV4T2YoIlJlcXVlc3QiLCAxKSA+IDApIHsKLSAgCQkJLy8gQWRkIGFmdGVyIGZpcnN0IGluc3RhbmNlIG9mICdSZXNwb25zZScKLSAgCQkJaW5kZXggPSBnZXRGaXJzdEluc3RhbmNlKCJSZXNwb25zZSIpOwotICAJCX0KLSAgCQllbHNlIGlmIChuYW1lLmluZGV4T2YoIlJlc3BvbnNlIiwgMSkgPiAwKSB7Ci0gIAkJCS8vIEFkZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiAnUmVxdWVzdCcKLSAgCQkJaW5kZXggPSBnZXRGaXJzdEluc3RhbmNlKCJSZXF1ZXN0Iik7Ci0gIAkJCWlmIChpbmRleCA+PSAwKQotICAJCQkJaW5kZXgrKzsKLSAgCQl9Ci0gIAkJCi0gIAkJaWYgKGluZGV4ID49IDApIHsKLSAgCQkJbWVzc2FnZXMuYWRkKGluZGV4LCBtZXNzYWdlKTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkJCW1lc3NhZ2VzLmFkZChtZXNzYWdlKTsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVCYXNlTmFtZShTdHJpbmcgbmFtZSkgewotICAJCWludCByZXNSZXFJbmRleCA9IG5hbWUuaW5kZXhPZigiUmVxdWVzdCIsIDEpOwotICAJCWludCByZXNSZXFMZW5ndGg7Ci0gIAkJaWYgKHJlc1JlcUluZGV4ID09IC0xKSB7Ci0gIAkJCXJlc1JlcUluZGV4ID0gbmFtZS5pbmRleE9mKCJSZXNwb25zZSIsIDEpOwotICAJCQlyZXNSZXFMZW5ndGggPSAiUmVzcG9uc2UiLmxlbmd0aCgpOwotICAJCX0KLSAgCQllbHNlIHsKLSAgCQkJcmVzUmVxTGVuZ3RoID0gIlJlcXVlc3QiLmxlbmd0aCgpOwotICAJCX0KLSAgCQkJCQotICAJCS8vIERpZCB3ZSBldmVuIGZpbmQgYSBSZXF1ZXN0L1Jlc3BvbnNlIGluIGJvdGggc3RyaW5ncz8KLSAgCQlpZiAocmVzUmVxSW5kZXggIT0gLTEpIHsKLSAgCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIHJlc1JlcUluZGV4KSArIG5hbWUuc3Vic3RyaW5nKHJlc1JlcUluZGV4ICsgcmVzUmVxTGVuZ3RoLCBuYW1lLmxlbmd0aCgpKTsKLSAgCQl9Ci0gIAkJZWxzZSB7ICAJCQotICAJCQlyZXR1cm4gbmFtZTsKLSAgCQl9Ci0gIAl9Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL1dTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tb2RlbC9XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTJiZDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL1dTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWw7Ci0gICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSVRyZWVDaGlsZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5PcGVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFN3aXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckZhY3RvcnkKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5IHdzZGxNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2U7Ci0KLSAgcHVibGljIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkKLSAgewotICAgIGFkYXB0ZXJGYWN0b3J5ID0gY3JlYXRlQWRhcHRlckZhY3RvcnkoKTsKLSAgfSAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVuc2liaWxpdHlFbGVtZW50Q29uc2lkZXJlZENoaWxkKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZW5zaWJsaXR5RWxlbWVudENoaWxkcmVuKExpc3QgbGlzdCwgRXh0ZW5zaWJsZUVsZW1lbnQgZXh0ZW5zaWJsZUVsZW1lbnQpCi0gIHsKLSAgICBpZiAoaXNFeHRlbnNpYmlsaXR5RWxlbWVudENvbnNpZGVyZWRDaGlsZCgpKQotICAgIHsKLSAgICAgIC8vbGlzdC5hZGRBbGwoV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudE5vZGVzKGV4dGVuc2libGVFbGVtZW50KSk7Ci0gICAgICBsaXN0LmFkZEFsbChXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50Tm9kZXMoZXh0ZW5zaWJsZUVsZW1lbnQpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5IGdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBpZiAod3NkbE1vZGVsQWRhcHRlckZhY3RvcnlJbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHdzZGxNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2UgPSBuZXcgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzZGxNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2U7Ci0gIH0gIAotICAgIAotCi0gIHByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFdTRExBZGFwdGVyRmFjdG9yeUltcGwoKTsKLSAgfSAgICAgICAgICAgIAotCi0KLSAgcHVibGljIE1vZGVsQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBvKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgICAgICAgICAgICAgICAgICAgICAKLSAgICB7Ci0gICAgICBhZGFwdGVyID0gKE1vZGVsQWRhcHRlcilhZGFwdGVyRmFjdG9yeS5hZGFwdCgoV1NETEVsZW1lbnQpbywgYWRhcHRlckZhY3RvcnkpOwotICAgIH0KLSAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgIHsgICAgICAgICAgIAotICAgICAgYWRhcHRlciA9IChXU0RMR3JvdXBPYmplY3QpbzsKLSAgICB9Ci0gICAgcmV0dXJuIGFkYXB0ZXI7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAvLwotICAvLwotICAvLwotICBwdWJsaWMgY2xhc3MgV1NETEFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgV1NETFN3aXRjaCB3c2RsU3dpdGNoID0gbmV3IFdTRExTd2l0Y2goKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKTsKLQkgICAgICB9ICAgCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nQWRhcHRlcigpOwotCSAgICAgIH0gCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nRmF1bHRBZGFwdGVyKCk7Ci0JICAgICAgfSAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0KQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdJbnB1dEFkYXB0ZXIoKTsKLQkgICAgICB9IAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ091dHB1dEFkYXB0ZXIoKTsKLQkgICAgICB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIoKTsKLQkgICAgICB9IAotIAotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZURlZmluaXRpb25BZGFwdGVyKCk7Ci0JICAgICAgfSAgICAgICAgICAgCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VGYXVsdChGYXVsdCBmYXVsdCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVGYXVsdEFkYXB0ZXIoKTsKLQkgICAgICB9IAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlSW1wb3J0KEltcG9ydCBpKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUltcG9ydEFkYXB0ZXIoKTsKLQkgICAgICB9IAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlSW5wdXRBZGFwdGVyKCk7Ci0JICAgICAgfSAJCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVPdXRwdXRBZGFwdGVyKCk7Ci0JICAgICAgfSAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCk7Ci0JICAgICAgfSAgICAgICAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZU9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbkFkYXB0ZXIoKTsKLQkgICAgICB9IAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlUGFydChQYXJ0IHBhcnQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlUGFydEFkYXB0ZXIoKTsKLQkgICAgICB9ICAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZVBvcnQoUG9ydCBwb3J0KQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZVBvcnRBZGFwdGVyKCk7Ci0JICAgICAgfSAgCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVQb3J0VHlwZUFkYXB0ZXIoKTsKLQkgICAgICB9ICAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZVNlcnZpY2VBZGFwdGVyKCk7Ci0JICAgICAgfSAgCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VUeXBlcyhUeXBlcyB0eXBlcykKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlc0FkYXB0ZXIoKTsKLQkgICAgICB9IAotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCB1ZWUpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgICAgICB9Ci0gICAgICB9OyAgIAotCi0gICAgICBPYmplY3QgbyA9IHdzZGxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQotICAgICAgQWRhcHRlciByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgICAgewotICAgICAgICByZXN1bHQgID0gKEFkYXB0ZXIpbzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZGlkIG5vdCBjcmVhdGUgYWRhcHRlciBmb3IgdGFyZ2V0IDogIiArIHRhcmdldCk7Ci0gICAgICAgIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFdTRExFbGVtZW50QWRhcHRlcigpOwotICAgIH0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ0FkYXB0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQmluZGluZ0FkYXB0ZXIoKTsKLSAgICB9ICAgCi0KLSAJICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nRmF1bHRBZGFwdGVyKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJldHVybiBuZXcgQmluZGluZ0ZhdWx0QWRhcHRlcigpOwotICAgIH0gICAgICAgICAgIAotCi0gCSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ0lucHV0QWRhcHRlcigpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICByZXR1cm4gbmV3IEJpbmRpbmdJbnB1dEFkYXB0ZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nT3V0cHV0QWRhcHRlcigpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT3V0cHV0QWRhcHRlcigpOwotCSAgfSAKLSAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpCi0gICAgeyAgICAgCi0gICAgICByZXR1cm4gbmV3IEJpbmRpbmdPcGVyYXRpb25BZGFwdGVyKCk7Ci0gICAgfQotICAgICAgICAgIAotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVmaW5pdGlvbkFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBEZWZpbml0aW9uQWRhcHRlcigpOwotCSAgfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVGYXVsdEFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBGYXVsdEFkYXB0ZXIoKTsKLQkgIH0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW1wb3J0QWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IEltcG9ydEFkYXB0ZXIoKTsKLQkgIH0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlSW5wdXRBZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgSW5wdXRBZGFwdGVyKCk7Ci0JICB9Ci0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgTWVzc2FnZUFkYXB0ZXIoKTsKLQkgIH0KLQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVPcGVyYXRpb25BZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgT3BlcmF0aW9uQWRhcHRlcigpOwotCSAgfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRwdXRBZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgT3V0cHV0QWRhcHRlcigpOwotCSAgfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYXJ0QWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IFBhcnRBZGFwdGVyKCk7Ci0JICB9Ci0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRBZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgUG9ydEFkYXB0ZXIoKTsKLQkgIH0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydFR5cGVBZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgUG9ydFR5cGVBZGFwdGVyKCk7Ci0JICB9Ci0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VBZGFwdGVyKCkgCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0JCSAgcmV0dXJuIG5ldyBTZXJ2aWNlQWRhcHRlcigpOwotCSAgfSAKLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlVHlwZXNBZGFwdGVyKCkgCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0JCSAgcmV0dXJuIG5ldyBUeXBlc0FkYXB0ZXIoKTsKLQkgIH0gCi0gICAgCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgfQotICAgIAotICAgIC8vIGNvbnZlbmllbmNlIG1ldGhvZAotICAgIC8vCi0gICAgcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0KQotICAgIHsKLSAgICAgIHJldHVybiBhZGFwdCh0YXJnZXQsIHRoaXMpOwotICAgIH0KLSAgfQotICAgIAotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgV1NETEVsZW1lbnRBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXIKLSAgeyAgIAotICAgIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCi0gICAgcHVibGljIFdTRExFbGVtZW50QWRhcHRlcigpCi0gICAgewotICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBhZGFwdGVyRmFjdG9yeTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICBpZiAoIWxpc3RlbmVyTGlzdC5jb250YWlucyhsaXN0ZW5lcikpCi0gICAgICB7Ci0gICAgICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICAgICAgfSAgCi0gICAgfSAgCi0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICBpZiAobGlzdGVuZXJMaXN0LmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgICB9Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG5vdGlmaWVyLCBTdHJpbmcgcHJvcGVydHkpCi0gICAgeyAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgbGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsgICAgICAgICAgICAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIgPSAoTW9kZWxBZGFwdGVyTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgIGxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChnZXRUYXJnZXQoKSwgcHJvcGVydHkpOwotICAgICAgfQotICAgIH0gICAKLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAobXNnLmdldEV2ZW50VHlwZSgpICE9IE5vdGlmaWNhdGlvbi5SRVNPTFZFKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQobXNnLmdldE5vdGlmaWVyKCksIG51bGwpOwotICAgICAgfQotICAgIH0gIAotCi0gICAgICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENISUxEUkVOX1BST1BFUlRZKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q2hpbGRyZW4oKTsgICAgICAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMQUJFTF9QUk9QRVJUWSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldExhYmVsKCk7ICAgICAgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU1BR0VfUFJPUEVSVFkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRJbWFnZSgpOwotICAgICAgfSAKLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImV4dGVuc2liaWxpdHlFbGVtZW50cyIpKQotICAgICAgeyAKLSAgICAgICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJsZUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50Tm9kZXMoKEV4dGVuc2libGVFbGVtZW50KW1vZGVsT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgfSAKLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImlzUmVhZE9ubHkiKSkKLSAgICAgIHsKLSAgICAgIAlFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QodGFyZ2V0KTsgCi0gICAgIAkgIHJlc3VsdCA9IChlbGVtZW50IGluc3RhbmNlb2YgSURPTU5vZGUpID8gQm9vbGVhbi5GQUxTRSA6IEJvb2xlYW4uVFJVRTsgICAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gCi0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gInRvZG8iOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gICAgICAgICAgICAgICAgICAgICAKLSAgCi0KLSAgcHJvdGVjdGVkIGNsYXNzIEJpbmRpbmdBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEJpbmRpbmcgYmluZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMuYmluZGluZyA9IChCaW5kaW5nKW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAgICAgICAgCi0gICAgICBhZGRFeHRlbnNpYmxpdHlFbGVtZW50Q2hpbGRyZW4obGlzdCwgYmluZGluZyk7Ci0gICAgICBMaXN0IG9wZXJhdGlvbnNMaXN0ID0gYmluZGluZy5nZXRFQmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICAgIExpc3QgdGVtcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB0ZW1wTGlzdC5hZGRBbGwob3BlcmF0aW9uc0xpc3QpOwotICAgICAgCi0gICAgICBDb2xsZWN0aW9ucy5zb3J0KHRlbXBMaXN0LCBuZXcgQ29tcGFyYXRvcigpIHsKLSAgICAJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgCQlTdHJpbmcgczEgPSAoKEJpbmRpbmdPcGVyYXRpb24pIG8xKS5nZXROYW1lKCk7Ci0gICAgCQlTdHJpbmcgczIgPSAoKEJpbmRpbmdPcGVyYXRpb24pIG8yKS5nZXROYW1lKCk7Ci0gICAgCQkKLSAgICAJCWlmIChzMSA9PSBudWxsKSB7Ci0gICAgCQkJczEgPSAiIjsKLSAgICAJCX0KLSAgICAJCWlmIChzMiA9PSBudWxsKSB7Ci0gICAgCQkJczIgPSAiIjsKLSAgICAJCX0KLSAgICAJCQotICAgIAkJYm9vbGVhbiBib28gPSB0cnVlOwotICAgICAgCQlyZXR1cm4gczEuY29tcGFyZVRvSWdub3JlQ2FzZShzMik7Ci0gICAgICAJfQotICAgICAgfSk7Ci0gICAgICAKLSAgICAgIGxpc3QuYWRkQWxsKHRlbXBMaXN0KTsKLSAgICAgIAotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAgICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9iaW5kaW5nX29iai5naWYiKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAgCi0gICAgCi0KLSAgcHJvdGVjdGVkIGNsYXNzIEJpbmRpbmdGYXVsdEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMuYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdCluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgCi0gICAgICBhZGRFeHRlbnNpYmxpdHlFbGVtZW50Q2hpbGRyZW4obGlzdCwgYmluZGluZ0ZhdWx0KTsKLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0gICAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gYmluZGluZ0ZhdWx0LmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2ZhdWx0X29iai5naWYiKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0gIH0gCi0KLQotICBwcm90ZWN0ZWQgY2xhc3MgQmluZGluZ0lucHV0QWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0OwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5iaW5kaW5nSW5wdXQgPSAoQmluZGluZ0lucHV0KW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAKLSAgICAgIGFkZEV4dGVuc2libGl0eUVsZW1lbnRDaGlsZHJlbihsaXN0LCBiaW5kaW5nSW5wdXQpOwotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAgICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiAiaW5wdXQiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvaW5wdXRfb2JqLmdpZiIpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAKLQotIAotICBwcm90ZWN0ZWQgY2xhc3MgQmluZGluZ091dHB1dEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0OwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5iaW5kaW5nT3V0cHV0ID0gKEJpbmRpbmdPdXRwdXQpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIAotICAgICAgYWRkRXh0ZW5zaWJsaXR5RWxlbWVudENoaWxkcmVuKGxpc3QsIGJpbmRpbmdPdXRwdXQpOwotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAgICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiAib3V0cHV0IjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL291dHB1dF9vYmouZ2lmIik7Ci0gICAgfSAgICAKLSAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgY2xhc3MgQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5iaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAKLSAgICAgIGFkZEV4dGVuc2libGl0eUVsZW1lbnRDaGlsZHJlbihsaXN0LCBiaW5kaW5nT3BlcmF0aW9uKTsgCi0KLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkpOwotICAgICAgfQotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgbGlzdC5hZGRBbGwoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL29wZXJhdGlvbmJpbmRpbmdfb2JqLmdpZiIpOwotICAgIH0gICAgICAgICAgICAgICAKLSAgfSAgCi0KLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIGNsYXNzIERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyIGltcGxlbWVudHMgTW9kZWxBZGFwdGVyTGlzdGVuZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBwZXJtYW5lbnRXU0RMR3JvdXBPYmplY3RMaXN0OwotICAgIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgICBwcm90ZWN0ZWQgV1NETEdyb3VwT2JqZWN0IHR5cGVzR3JvdXA7Ci0gICAgcHJvdGVjdGVkIFdTRExHcm91cE9iamVjdCBleHRlbnNpYmlsaXR5RWxlbWVudHNHcm91cDsKLSAgICBwcm90ZWN0ZWQgVHlwZXMgdHlwZXM7IAotICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKW5ld1RhcmdldDsKLSAgICAgCi0gICAgICAvLyB0aGlzIGdyb3VwIGlzIGFkZGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIGNoaWxkIGxpc3QgZHluYW1pY2FsbHkKLSAgICAgIC8vIGRlcGVuZGFudCBvbiB0aGUgcHJlc2VuY2Ugb2YgYW4gJ2FjdHVhbCcgdHlwZXMgZWxlbWVudAotICAgICAgLy8KLSAgICAgIHR5cGVzR3JvdXAgPSBuZXcgV1NETEdyb3VwT2JqZWN0KGRlZmluaXRpb24sIFdTRExHcm91cE9iamVjdC5UWVBFU19HUk9VUCwgZ2V0TW9kZWxBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vIHRoZXNlIGdyb3VwcyBhbHdheXMgZXhpc3QgaW4gdGhlIGNoaWxkIGxpc3QgICAgICAKLSAgICAgIC8vCi0gICAgICBwZXJtYW5lbnRXU0RMR3JvdXBPYmplY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAKLSAgICAgIHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuYWRkKG5ldyBXU0RMR3JvdXBPYmplY3QoZGVmaW5pdGlvbiwgV1NETEdyb3VwT2JqZWN0LklNUE9SVFNfR1JPVVApKTsKLSAgICAgIHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuYWRkKHR5cGVzR3JvdXApOyAgCi0gICAgICBwZXJtYW5lbnRXU0RMR3JvdXBPYmplY3RMaXN0LmFkZChuZXcgV1NETEdyb3VwT2JqZWN0KGRlZmluaXRpb24sIFdTRExHcm91cE9iamVjdC5NRVNTQUdFU19HUk9VUCkpOwotICAgICAgcGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5hZGQobmV3IFdTRExHcm91cE9iamVjdChkZWZpbml0aW9uLCBXU0RMR3JvdXBPYmplY3QuUE9SVF9UWVBFU19HUk9VUCkpOwotICAgICAgcGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5hZGQobmV3IFdTRExHcm91cE9iamVjdChkZWZpbml0aW9uLCBXU0RMR3JvdXBPYmplY3QuQklORElOR1NfR1JPVVApKTsKLSAgICAgIHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuYWRkKG5ldyBXU0RMR3JvdXBPYmplY3QoZGVmaW5pdGlvbiwgV1NETEdyb3VwT2JqZWN0LlNFUlZJQ0VTX0dST1VQKSk7Ci0gICAgICAvLyB3ZSBvbmx5IGFkZCB0aGlzIGdyb3VwIHdoZW4gaXQgaGFzIGNvbnRlbnQKLSAgICAgIC8vCi0gICAgICBleHRlbnNpYmlsaXR5RWxlbWVudHNHcm91cCA9IG5ldyBXU0RMR3JvdXBPYmplY3QoZGVmaW5pdGlvbiwgV1NETEdyb3VwT2JqZWN0LkVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVApOwotCi0gICAgICB1cGRhdGVUeXBlcygpOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgbGlzdC5hZGRBbGwocGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdCk7ICAgCi0gICAgICAvL2lmIChleHRlbnNpYmlsaXR5RWxlbWVudHNHcm91cC5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApCi0gICAgICAvL3sKLSAgICAgIGxpc3QuYWRkKGV4dGVuc2liaWxpdHlFbGVtZW50c0dyb3VwKTsKLSAgICAgIC8vfQotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKQotICAgIHsgICAgIAotICAgICAgaWYgKG1zZy5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uUkVTT0xWRSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdXBkYXRlVHlwZXMoKTsKLSAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlZEhlbHBlcigpOyAgIAotICAgICAgfQotICAgIH0gICAgICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlVHlwZXMoKQotICAgIHsKLSAgICAgIGlmICh0eXBlcyAhPSBkZWZpbml0aW9uLmdldEVUeXBlcygpKQotICAgICAgewotICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKHR5cGVzLCB0aGlzKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLSAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhZGRNb2RlbEFkYXB0ZXJMaXN0ZW5lcih0eXBlcywgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRIZWxwZXIoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQoZ2V0VGFyZ2V0KCksIG51bGwpOwotCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihpLm5leHQoKSk7Ci0gICAgICAgIGFkYXB0ZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChhZGFwdGVyLCBudWxsKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9IAotCi0gICAgLy8gcHJvcGFnYXRlIGNoYW5nZXMgdG8gJ3R5cGVzJyBvYmplY3QKLSAgICAvLwotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgdHlwZXNHcm91cC5maXJlUHJvcGVydHlDaGFuZ2VkKHR5cGVzR3JvdXAsIHByb3BlcnR5KTsKLSAgICB9IAotCi0gICAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlckZhY3RvcnkgZ2V0TW9kZWxBZGFwdGVyRmFjdG9yeSgpCi0gICAgewotICAgICAgcmV0dXJuIGdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuIGRlZmluaXRpb24uZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0KLSAKLQotICBwcm90ZWN0ZWQgY2xhc3MgRmF1bHRBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEZhdWx0IGZhdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLmZhdWx0ID0gKEZhdWx0KW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2ZhdWx0X29iai5naWYiKTsKLSAgICB9ICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBmYXVsdC5nZXROYW1lKCk7Ci0gICAgfSAgICAgICAgICAgICAgIAotICB9ICAgCi0gICAgICAKLQotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgSW1wb3J0QWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBJbXBvcnQgdGhlSW1wb3J0OwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy50aGVJbXBvcnQgPSAoSW1wb3J0KW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9pbXBvcnRfb2JqLmdpZiIpOwotICAgIH0gICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IHRoZUltcG9ydC5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgCXJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX05PX0lNUE9SVF9TUEVDSUZJRUQiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgICAgICAgICAgICAgIAotICB9IAotCi0KLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIGNsYXNzIElucHV0QWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBJbnB1dCBpbnB1dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMuaW5wdXQgPSAoSW5wdXQpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2lucHV0X29iai5naWYiKTsKLSAgICB9ICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiAiaW5wdXQiOwotICAgIH0gICAgICAgICAgICAgICAKLSAgfSAgICAKLQotICAgCi0gCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBjbGFzcyBNZXNzYWdlQWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLm1lc3NhZ2UgPSAoTWVzc2FnZSluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGxpc3QuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICBpZiAobWVzc2FnZS5nZXRRTmFtZSgpID09IG51bGwpIHJldHVybiAiIjsgLy8gcmV2aXNpdC4uLml0IHNob3VsZG4ndCBiZSBudWxsIAotICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL21lc3NhZ2Vfb2JqLmdpZiIpOwotICAgIH0KLSAgfQotCi0KLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIGNsYXNzIE91dHB1dEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgT3V0cHV0IG91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMub3V0cHV0ID0gKE91dHB1dCluZXdUYXJnZXQ7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiAib3V0cHV0IjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL291dHB1dF9vYmouZ2lmIik7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gIAotCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBjbGFzcyBPcGVyYXRpb25BZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIE9wZXJhdGlvbiBvcGVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLm9wZXJhdGlvbiA9IChPcGVyYXRpb24pbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLSAgICAgIE91dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0RU91dHB1dCgpOwotICAgICAgCi0gICAgICBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSAoKE9wZXJhdGlvbkltcGwpIG9wZXJhdGlvbikuZ2V0U3R5bGUoKTsKLSAgICAgIGlmIChvcGVyYXRpb25UeXBlICE9IG51bGwpIHsKLSAgICAgIAlpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFKSAmJiBpbnB1dCAhPSBudWxsICYmIG91dHB1dCAhPSBudWxsKSB7Ci0gICAgICAJCS8vIElucHV0LCBPdXRwdXQKLSAgICAgIAkJbGlzdC5hZGQoaW5wdXQpOwotICAgICAgCQlsaXN0LmFkZChvdXRwdXQpOwotICAgICAgCX0KLSAgICAgIAllbHNlIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpICYmIGlucHV0ICE9IG51bGwgJiYgb3V0cHV0ICE9IG51bGwpIHsKLSAgICAgIAkJLy8gT3V0cHV0LCBJbnB1dAotICAgICAgCQlsaXN0LmFkZChvdXRwdXQpOwotICAgICAgCQlsaXN0LmFkZChpbnB1dCk7Ci0gICAgICAJfQotICAgICAgCWVsc2UgaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuT05FX1dBWSkgJiYgaW5wdXQgIT0gbnVsbCkgewotICAgICAgCQkvLyBJbnB1dAotICAgICAgCQlsaXN0LmFkZChpbnB1dCk7Ci0gICAgICAJfQotICAgICAgCWVsc2UgaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuTk9USUZJQ0FUSU9OKSAmJiBvdXRwdXQgIT0gbnVsbCkgewotICAgICAgCQkvL091dHB1dAotICAgICAgCQlsaXN0LmFkZChvdXRwdXQpOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGxpc3QuYWRkQWxsKG9wZXJhdGlvbi5nZXRGYXVsdHMoKS52YWx1ZXMoKSk7Ci0gICAgICAKLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICAgIAotCXByaXZhdGUgaW50IGdldE5vZGVJbmRleChOb2RlTGlzdCBub2RlTGlzdCwgTm9kZSBub2RlKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlIChpbmRleCA8IG5vZGVMaXN0LmdldExlbmd0aCgpICYmICEobm9kZUxpc3QuaXRlbShpbmRleCkuZXF1YWxzKG5vZGUpKSkgewotCQkJaW5kZXgrKzsKLQkJfQotCQkKLQkJaWYgKGluZGV4ID49IG5vZGVMaXN0LmdldExlbmd0aCgpKSB7Ci0JCQlpbmRleCA9IC0xOwotCQl9Ci0JCQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gb3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL29wZXJhdGlvbl9vYmouZ2lmIik7Ci0gICAgfSAgICAgICAgICAgICAgIAotICB9ICAKLSAgIAotCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBjbGFzcyBQYXJ0QWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBQYXJ0IHBhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLnBhcnQgPSAoUGFydCluZXdUYXJnZXQ7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsKLSAgICAgIHJldHVybiBwYXJ0LmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL3BhcnRfb2JqLmdpZiIpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAKLQotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgUG9ydEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBQb3J0IHBvcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLnBvcnQgPSAoUG9ydCluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBwb3J0LmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvcG9ydF9vYmouZ2lmIik7Ci0gICAgfSAgICAKLQotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudE5vZGVzKHBvcnQpOyAgCi0gICAgfQotICAgIC8vIHByb3BhZ2F0ZSBjaGFuZ2VzIHRvIHRoZSBiaW5kaW5nIG9iamVjdAotICAgIC8vCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBmaXJlUHJvcGVydHlDaGFuZ2VkKHBvcnQsIHByb3BlcnR5KTsKLSAgICB9Ci0gIH0gCi0gICAgIAotICBwcm90ZWN0ZWQgY2xhc3MgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlciBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCB1ZWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLnVlZSA9IChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSB1ZWUuZ2V0RWxlbWVudCgpOwotCi0gICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gZ2V0RXh0ZW5zaWJpbGl0eUxhYmVsUHJvdmlkZXIobm9kZSk7Ci0gICAgICBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBsYWJlbFByb3ZpZGVyLmdldFRleHQobm9kZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgSW1hZ2UgaW1hZ2UgPSBudWxsOwotICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHVlZS5nZXRFbGVtZW50KCk7Ci0KLSAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBnZXRFeHRlbnNpYmlsaXR5TGFiZWxQcm92aWRlcihub2RlKTsKLSAgICAgIGlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGltYWdlID0gbGFiZWxQcm92aWRlci5nZXRJbWFnZShub2RlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGltYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9lbGVtZW50X29iai5naWYiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBpbWFnZTsKLSAgICB9ICAgIAotCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IG51bGw7Ci0gICAgICAvL05vZGUgbm9kZSA9IChOb2RlKSB1ZWUuZ2V0RWxlbWVudCgpOwotICAgICAgLy9JVHJlZUNoaWxkUHJvdmlkZXIgY2hpbGRQcm92aWRlciA9IGdldEV4dGVuc2liaWxpdHlDb250ZW50UHJvdmlkZXIobm9kZSk7Ci0gICAgICAvLyBUQkQgLSBEaXNjdXNzIHdpdGggQ3JhaWcgd2h5IHdlIHdvdWxkIG5lZWQgY2hpbGRQcm92aWRlcgotICAgICAgLy9pZiAoY2hpbGRQcm92aWRlciAhPSBudWxsKQotICAgICAgLy97Ci0gICAgICAvLyAgT2JqZWN0W10gYXJyYXkgPSBjaGlsZFByb3ZpZGVyLmdldENoaWxkcmVuKG5vZGUpOwotICAgICAgLy8gIGxpc3QgPSBBcnJheXMuYXNMaXN0KGFycmF5KTsKLSAgICAgIC8vfQotICAgICAgLy9lbHNlCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSB1ZWUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBsaXN0OyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQodWVlLCBwcm9wZXJ0eSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBnZXRFeHRlbnNpYmlsaXR5TGFiZWxQcm92aWRlcihOb2RlIG5vZGUpCi0gICAgewotICAgICAgSUxhYmVsUHJvdmlkZXIgcmVzdWx0ID0gbnVsbDsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeSgpLmdldExhYmVsUHJvdmlkZXIobmFtZXNwYWNlVVJJKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJVHJlZUNoaWxkUHJvdmlkZXIgZ2V0RXh0ZW5zaWJpbGl0eUNvbnRlbnRQcm92aWRlcihOb2RlIG5vZGUpCi0gICAgewotICAgICAgSVRyZWVDaGlsZFByb3ZpZGVyIHJlc3VsdCA9IG51bGw7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gbm9kZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkoKS5nZXRDb250ZW50UHJvdmlkZXIobmFtZXNwYWNlVVJJKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0gCi0KLQotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgUG9ydFR5cGVBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIFBvcnRUeXBlIHBvcnRUeXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5wb3J0VHlwZSA9IChQb3J0VHlwZSluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGxpc3QuYWRkQWxsKHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKSk7Ci0gICAgICAKLSAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgbmV3IENvbXBhcmF0b3IoKQotICAgICAgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbzFOYW1lID0gKChPcGVyYXRpb24pIG8xKS5nZXROYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIG8yTmFtZSA9ICgoT3BlcmF0aW9uKSBvMikuZ2V0TmFtZSgpOwotICAgICAgICAgIGlmIChvMU5hbWUgPT0gbnVsbCkgbzFOYW1lID0gIiI7Ci0gICAgICAgICAgaWYgKG8yTmFtZSA9PSBudWxsKSBvMk5hbWUgPSAiIjsKLSAgICAgICAgICByZXR1cm4gKG8xTmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKG8yTmFtZSkpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIHJldHVybiBsaXN0OyAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuIHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9wb3J0dHlwZV9vYmouZ2lmIik7Ci0gICAgfQotICB9IAotICAgICAKLQotICBwcm90ZWN0ZWQgY2xhc3MgU2VydmljZUFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgU2VydmljZSBzZXJ2aWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5zZXJ2aWNlID0gKFNlcnZpY2UpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChzZXJ2aWNlLmdldEVQb3J0cygpKTsKLSAgICAgIHJldHVybiBsaXN0OyAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL3NlcnZpY2Vfb2JqLmdpZiIpOwotICAgIH0gICAKLSAgfSAKLSAgICAgCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHB1YmxpYyBjbGFzcyBUeXBlc0FkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgewotICAgIHByb3RlY3RlZCBUeXBlcyB0eXBlczsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLnR5cGVzID0gKFR5cGVzKW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgCi0gICAgICBsaXN0LmFkZEFsbChXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50Tm9kZXModHlwZXMpKTsKLSAgICAgIHJldHVybiBsaXN0OyAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuICJUeXBlcyI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy90eXBlc19vYmouZ2lmIik7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gVE9ETzogcG9ydCBjaGVjawotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0V1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLS8vICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gRWNvcmVVdGlsLmdldEFkYXB0ZXIoZ2V0V1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKS5lQWRhcHRlcnMoKSxtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0gICAgCi0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZ2V0QWRhcHRlcihtb2RlbE9iamVjdCk7Ci0vLyAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IEVjb3JlVXRpbC5nZXRBZGFwdGVyKGdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZUFkYXB0ZXJzKCksbW9kZWxPYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICB9ICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbnNlZGl0L0VkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9uc2VkaXQvRWRpdE5hbWVzcGFjZXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjYzUwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9uc2VkaXQvRWRpdE5hbWVzcGFjZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0TmFtZXNwYWNlc0RpYWxvZyBleHRlbmRzIERpYWxvZwotewotICBwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0gIHByb3RlY3RlZCBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nIGVkaXRXU0RMTmFtZXNwYWNlc0NvbnRyb2w7Ci0gIHByb3RlY3RlZCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uOwotICAvLyAgcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotICAvLyAgcHJvdGVjdGVkIFN0cmluZyBlcnJvck1lc3NhZ2U7ICAKLQotICAvL3Byb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQotICBwdWJsaWMgRWRpdE5hbWVzcGFjZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElQYXRoIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyB0aXRsZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgTGlzdCBuYW1lc3BhY2VMaXN0KQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0gICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgdGhpcy5uYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKQotICB7Ci0gICAgY3JlYXRlKCk7Ci0gICAgZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLSAgICBzZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICByZXR1cm4gb3BlbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgZWRpdFdTRExOYW1lc3BhY2VzQ29udHJvbCA9IG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nKGRpYWxvZ0FyZWEsIHJlc291cmNlTG9jYXRpb24pOwotICAgIGVkaXRXU0RMTmFtZXNwYWNlc0NvbnRyb2wuc2V0TmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotICAgIGVkaXRXU0RMTmFtZXNwYWNlc0NvbnRyb2wuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICByZXR1cm4gZGlhbG9nQXJlYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgewotICAgIHVwZGF0ZUVycm9yTWVzc2FnZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoKQotICB7Ci0gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0gICAgLyoKLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotICAgIGlmIChuYW1lLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKG5hbWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZXJyb3JNZXNzYWdlID0gIiI7Ci0gICAgfSovCi0KLSAgICAvL2Vycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7Ci0gICAgb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgIHsKLSAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGVkaXRXU0RMTmFtZXNwYWNlc0NvbnRyb2wuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9FeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL0V4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjYTY0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL0V4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJTGFiZWxQcm92aWRlcgotewotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIHRyZWVDb250ZW50UHJvdmlkZXJFeHRlbnNpb25zOwotICBwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXJbXSB0cmVlQ29udGVudFByb3ZpZGVyczsKLQotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGxhYmVsUHJvdmlkZXJFeHRlbnNpb25zOwotICBwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXJbXSBsYWJlbFByb3ZpZGVyczsKLQotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIE9iamVjdFtdIEVNUFRZX0FSUkFZID0ge307Ci0KLSAgcHVibGljIEV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIoV1NETEVkaXRvciB3c2RsRWRpdG9yKQotICB7Ci0gICAgV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSgpOyAKLQotICAgIHRyZWVDb250ZW50UHJvdmlkZXJFeHRlbnNpb25zID0gcmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoV1NETEVkaXRvckV4dGVuc2lvbi5PVVRMSU5FX1RSRUVfQ09OVEVOVF9QUk9WSURFUik7IAotICAgIHRyZWVDb250ZW50UHJvdmlkZXJzID0gbmV3IElUcmVlQ29udGVudFByb3ZpZGVyW3RyZWVDb250ZW50UHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aF07IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUNvbnRlbnRQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdHJlZUNvbnRlbnRQcm92aWRlcnNbaV0gPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpdHJlZUNvbnRlbnRQcm92aWRlckV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uT1VUTElORV9UUkVFX0NPTlRFTlRfUFJPVklERVIsIHdzZGxFZGl0b3IpOwotICAgIH0KLQotICAgIGxhYmVsUHJvdmlkZXJFeHRlbnNpb25zID0gcmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoV1NETEVkaXRvckV4dGVuc2lvbi5PVVRMSU5FX0xBQkVMX1BST1ZJREVSKTsgCi0gICAgbGFiZWxQcm92aWRlcnMgPSBuZXcgSUxhYmVsUHJvdmlkZXJbbGFiZWxQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoXTsgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbFByb3ZpZGVyRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsYWJlbFByb3ZpZGVyc1tpXSA9IChJTGFiZWxQcm92aWRlcilsYWJlbFByb3ZpZGVyRXh0ZW5zaW9uc1tpXS5jcmVhdGVFeHRlbnNpb25PYmplY3QoV1NETEVkaXRvckV4dGVuc2lvbi5PVVRMSU5FX0xBQkVMX1BST1ZJREVSLCB3c2RsRWRpdG9yKTsKLSAgICB9Ci0gIH0KLSAgICAgIAotICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0QXBwbGljYWJsZVRyZWVDb250ZW50UHJvdmlkZXIoT2JqZWN0IG9iamVjdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUNvbnRlbnRQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHRyZWVDb250ZW50UHJvdmlkZXJFeHRlbnNpb25zW2ldLmlzQXBwbGljYWJsZShvYmplY3QpKQotICAgICAgewotICAgICAgICBwcm92aWRlciA9IHRyZWVDb250ZW50UHJvdmlkZXJzW2ldOwotICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm92aWRlcjsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGdldEFwcGxpY2FibGVMYWJlbFByb3ZpZGVyKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBJTGFiZWxQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbFByb3ZpZGVyRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobGFiZWxQcm92aWRlckV4dGVuc2lvbnNbaV0uaXNBcHBsaWNhYmxlKG9iamVjdCkpCi0gICAgICB7Ci0gICAgICAgIHByb3ZpZGVyID0gbGFiZWxQcm92aWRlcnNbaV07Ci0gICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb3ZpZGVyOwotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlcgotICAvLwotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIAotICB7IAotICAgIElUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0QXBwbGljYWJsZVRyZWVDb250ZW50UHJvdmlkZXIocGFyZW50RWxlbWVudCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnRzICIgKyBwcm92aWRlcik7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KSA6IEVNUFRZX0FSUkFZOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBJVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGdldEFwcGxpY2FibGVUcmVlQ29udGVudFByb3ZpZGVyKGVsZW1lbnQpOwotICAgIHJldHVybiBwcm92aWRlciAhPSBudWxsID8gcHJvdmlkZXIuZ2V0UGFyZW50KGVsZW1lbnQpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlVHJlZUNvbnRlbnRQcm92aWRlcihlbGVtZW50KTsKLSAgICByZXR1cm4gcHJvdmlkZXIgIT0gbnVsbCA/IHByb3ZpZGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpIDogZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBJVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGdldEFwcGxpY2FibGVUcmVlQ29udGVudFByb3ZpZGVyKGlucHV0RWxlbWVudCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnRzICIgKyBwcm92aWRlcik7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpIDogRU1QVFlfQVJSQVk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgIAotICB7Ci0gICAgLy8gVE9ETy4uLiBjYWxsIGRpc3Bvc2UgZGlzcG9zZSB0aGUgY3JlYXRlZCBsYWJlbCBhbmQgY29udGVudCBwcm92aWRlcnMKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUNvbnRlbnRQcm92aWRlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdHJlZUNvbnRlbnRQcm92aWRlcnNbaV0uaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgIAotCi0gIC8vIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgIAotICAvLwotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIAotICB7IAotICAgIElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0QXBwbGljYWJsZUxhYmVsUHJvdmlkZXIoZWxlbWVudCk7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5nZXRJbWFnZShlbGVtZW50KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpICAKLSAgeyAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOyAgICAgICAKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIElMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0QXBwbGljYWJsZUxhYmVsUHJvdmlkZXIoZWxlbWVudCk7Ci0gICAgICByZXN1bHQgPSBwcm92aWRlciAhPSBudWxsID8gcHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KSA6IChlbGVtZW50LnRvU3RyaW5nKCkgKyAibm9Qcm92aWRlckZvckNsYXNzPSIgKyBlbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSAKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIAotICB7ICAgICAgICAgICAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9IVFRQTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9IVFRQTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGUxOGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvSFRUUExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgSFRUUExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERFJFU1MgICAgICAgICA9ICJhZGRyZXNzIjsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQklORElORyAgICAgICAgID0gImJpbmRpbmciOwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBPUEVSQVRJT04gICAgICAgPSAib3BlcmF0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX0VOQ09ERUQgICAgID0gInVybEVuY29kZWQiOwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBVUkxfUkVQTEFDRU1FTlQgPSAidXJsUmVwbGFjZW1lbnQiOwotCi0gIHByb3RlY3RlZCBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBIVFRQTGFiZWxQcm92aWRlcigpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIG1hcC5wdXQoQUREUkVTUywgImljb25zL2h0dHBhZGRyZXNzX29iai5naWYiKTsKLSAgICBtYXAucHV0KEJJTkRJTkcsICJpY29ucy9odHRwYmluZGluZ19vYmouZ2lmIik7Ci0gICAgbWFwLnB1dChPUEVSQVRJT04sICJpY29ucy9odHRwb3BlcmF0aW9uX29iai5naWYiKTsgICAgCi0gICAgbWFwLnB1dChVUkxfRU5DT0RFRCwgImljb25zL2h0dHB1cmxlbmNvZGVkX29iai5naWYiKTsKLSAgICBtYXAucHV0KFVSTF9SRVBMQUNFTUVOVCwgImljb25zL2h0dHB1cmxyZXBsYWNlbWVudF9vYmouZ2lmIik7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgCi0gIHsgICAgCi0gICAgTm9kZSBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgIFN0cmluZyBpbWFnZU5hbWUgPSAoU3RyaW5nKW1hcC5nZXQobm9kZS5nZXRMb2NhbE5hbWUoKSk7ICAgICAgIAotICAgIHJldHVybiBpbWFnZU5hbWUgIT0gbnVsbCA/IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZU5hbWUpIDogbnVsbDsgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSAgCi0gIHsKLSAgICBOb2RlIG5vZGUgPSAoTm9kZSlvYmplY3Q7Ci0gICAgcmV0dXJuIG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvTW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL01vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY4YWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvTW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIsIE1vZGVsQWRhcHRlckxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotICBwcm90ZWN0ZWQgTW9kZWxBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotICBwdWJsaWMgTW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyKE1vZGVsQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsgIAotICB9Ci0gICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2hMaXN0ZW5lcihPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKG9iamVjdCk7Ci0vLyBUT0RPOiBwb3J0IGNoZWNrCi0vLyAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IEVjb3JlVXRpbC5nZXRBZGFwdGVyKGFkYXB0ZXJGYWN0b3J5LmVBZGFwdGVycygpLG9iamVjdCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLmFkZExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgfSAKLQotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7ICAgICAgICAgICAgIAotICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikKLSAgICAgIHsKLSAgICAgICAgKChTdHJ1Y3R1cmVkVmlld2VyKXZpZXdlcikucmVmcmVzaChvYmplY3QpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgICAgCi0gICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudE9iamVjdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBhdHRhY2hMaXN0ZW5lcihwYXJlbnRPYmplY3QpOwotCi0gICAgTGlzdCBsaXN0ID0gbnVsbDsKLS8vIFRPRE86IHBvcnQgY2hlY2sgICAgCi0gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocGFyZW50T2JqZWN0KTsKLS8vICAgIE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBFY29yZVV0aWwuZ2V0QWRhcHRlcihhZGFwdGVyRmFjdG9yeS5lQWRhcHRlcnMoKSxwYXJlbnRPYmplY3QpOwotICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0ID0gKExpc3QpbW9kZWxBZGFwdGVyLmdldFByb3BlcnR5KHBhcmVudE9iamVjdCwgTW9kZWxBZGFwdGVyLkNISUxEUkVOX1BST1BFUlRZKTsgICAgIAotICAgIH0KLSAgICBsaXN0ID0gIGxpc3QgIT0gbnVsbCA/IGxpc3QgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLSAgICByZXR1cm4gY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwOyAgIAotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgewotICAgIHJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsgCi0gICAgdmlld2VyID0gbnVsbDsKLSAgfQotICAKLSAgLyoKLSAgICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICB7ICAgICAgICAgICAgICAgCi0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gIH0gICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL01vZGVsQWRhcHRlckxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvTW9kZWxBZGFwdGVyTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjBjNzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvTW9kZWxBZGFwdGVyTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lOwotICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJGYWN0b3J5OwotCi0KLQotcHVibGljIGNsYXNzIE1vZGVsQWRhcHRlckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBNb2RlbEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0gIHB1YmxpYyBNb2RlbEFkYXB0ZXJMYWJlbFByb3ZpZGVyKE1vZGVsQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLSAgfQotCi0gCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgSW1hZ2UgcmVzdWx0ID0gbnVsbDsgICAgICAgICAgIAotLy8gVE9ETzogcG9ydCBjaGVjawotICAgIE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKG9iamVjdCk7Ci0vLyAgICBNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gRWNvcmVVdGlsLmdldEFkYXB0ZXIoYWRhcHRlckZhY3RvcnkuZUFkYXB0ZXJzKCksb2JqZWN0KTsKLSAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gKEltYWdlKW1vZGVsQWRhcHRlci5nZXRQcm9wZXJ0eShvYmplY3QsIE1vZGVsQWRhcHRlci5JTUFHRV9QUk9QRVJUWSk7ICAgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAgIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOyAgICAgICAgICAgICAgIAotLy8gVE9ETzogcG9ydCBjaGVjawotICAgIE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKG9iamVjdCk7Ci0vLyAgICBNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gRWNvcmVVdGlsLmdldEFkYXB0ZXIoYWRhcHRlckZhY3RvcnkuZUFkYXB0ZXJzKCksb2JqZWN0KTsKLSAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSAoU3RyaW5nKW1vZGVsQWRhcHRlci5nZXRQcm9wZXJ0eShvYmplY3QsIE1vZGVsQWRhcHRlci5MQUJFTF9QUk9QRVJUWSk7ICAgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL1NPQVBMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL1NPQVBMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTFhZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9TT0FQTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgU09BUExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREUkVTUyAgICAgID0gImFkZHJlc3MiOwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBCT0RZICAgICAgICAgPSAiYm9keSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEJJTkRJTkcgICAgICA9ICJiaW5kaW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkFVTFQgICAgICAgID0gImZhdWx0IjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSEVBREVSICAgICAgID0gImhlYWRlciI7IAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBIRUFERVJfRkFVTFQgPSAiaGVhZGVyZmF1bHQiOyAKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1BFUkFUSU9OICAgID0gIm9wZXJhdGlvbiI7Ci0KLSAgcHJvdGVjdGVkIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIFNPQVBMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIG1hcC5wdXQoQUREUkVTUywgImljb25zL3NvYXBhZGRyZXNzX29iai5naWYiKTsKLSAgICBtYXAucHV0KEJJTkRJTkcsICJpY29ucy9zb2FwYmluZGluZ19vYmouZ2lmIik7Ci0gICAgbWFwLnB1dChCT0RZLCAiaWNvbnMvc29hcGJvZHlfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoRkFVTFQsICJpY29ucy9zb2FwZmF1bHRfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoSEVBREVSLCAiaWNvbnMvc29hcGhlYWRlcl9vYmouZ2lmIik7Ci0gICAgbWFwLnB1dChIRUFERVJfRkFVTFQsICJpY29ucy9zb2FwaGVhZGVyZmF1bHRfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoT1BFUkFUSU9OLCAiaWNvbnMvc29hcG9wZXJhdGlvbl9vYmouZ2lmIik7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgCi0gIHsgICAgCi0gICAgTm9kZSBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgIFN0cmluZyBpbWFnZU5hbWUgPSAoU3RyaW5nKW1hcC5nZXQobm9kZS5nZXRMb2NhbE5hbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIShub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpOyAgCi0JICByZXR1cm4gaW1hZ2VOYW1lICE9IG51bGwgPyBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VOYW1lKSA6IG51bGw7IAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgIAotICB7Ci0gICAgTm9kZSBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgIHJldHVybiBub2RlLmdldE5vZGVOYW1lKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL1dTRExDb250ZW50T3V0bGluZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvV1NETENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2QyZmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvV1NETENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLldTRExNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5PcGVuT25TZWxlY3Rpb25IZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIFdTRExDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvciB3c2RsRWRpdG9yOwotCXByb3RlY3RlZCBpbnQgbGV2ZWwgPSAwOyAgCi0gIHByb3RlY3RlZCBPYmplY3QgbW9kZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLSAgcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBXU0RMU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLSAgcHJvdGVjdGVkIFRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB0cmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgICAgIAotICBwdWJsaWMgV1NETENvbnRlbnRPdXRsaW5lUGFnZShXU0RMRWRpdG9yIHdzZGxFZGl0b3IpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLndzZGxFZGl0b3IgPSB3c2RsRWRpdG9yOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50UHJvdmlkZXIoSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLSAgewotICAgIHRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0gIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLy8gZXhwb3NlCi0gIHB1YmxpYyBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldFRyZWVWaWV3ZXIoKTsKLSAgfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOyAgICAgICAgICAgICAgICAgCi0KLQkJZ2V0VHJlZVZpZXdlcigpLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQlnZXRUcmVlVmlld2VyKCkuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuc2V0SW5wdXQobW9kZWwpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgS2V5QWRhcHRlciBrZXlMaXN0ZW5lciA9IG5ldyBLZXlBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKQotICAgICAgeyAgIAkKLSAgICAgICAgaWYgKGUua2V5Q29kZSA9PSBTV1QuRjMpCi0gICAgICAgIHsKLSAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvbk1hbmFnZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICAgICAgICAgIHsKLQkJCSAgT3Blbk9uU2VsZWN0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBPcGVuT25TZWxlY3Rpb25IZWxwZXIod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkpOwotICAgICAgICAgICAgICBoZWxwZXIub3BlbkVkaXRvcigoRU9iamVjdClvYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgZ2V0VHJlZVZpZXdlcigpLmdldFRyZWUoKS5hZGRLZXlMaXN0ZW5lcihrZXlMaXN0ZW5lcik7Ci0KLSAgICBNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiI3BvcHVwIik7Ly8kTk9OLU5MUy0xJAotICAgIG1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLSAgICBNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0gICAgCi0gICAgV1NETE1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXIgPSBuZXcgV1NETE1lbnVMaXN0ZW5lcih3c2RsRWRpdG9yLCB3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ly8sIChYU0RUZXh0RWRpdG9yKWZUZXh0RWRpdG9yKTsKLSAgICBtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQotICAgIHNldFNlbGVjdGlvbk1hbmFnZXIod3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotCX0KLQotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBtb2RlbCA9IG9iamVjdDsKLSAgfQotCi0JCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kVG9MZXZlbChpbnQgaSkgCi0gIHsKLQkJbGV2ZWwgPSBpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCB2YWx1ZSkgCi0gIHsKLQkJZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KHZhbHVlKTsKLQkgCWdldFRyZWVWaWV3ZXIoKS5leHBhbmRUb0xldmVsKGxldmVsKTsKLQl9ICAKLQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbk1hbmFnZXIoV1NETFNlbGVjdGlvbk1hbmFnZXIgbmV3U2VsZWN0aW9uTWFuYWdlcikKLSAgeyAKLSAgICBUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7Ci0KLSAgICAvLyBkaXNjb25uZWN0IGZyb20gb2xkIG9uZQotICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBzZWxlY3Rpb25NYW5hZ2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOyAgCi0gICAgICB0cmVlVmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLQotICAgIHNlbGVjdGlvbk1hbmFnZXIgPSBuZXdTZWxlY3Rpb25NYW5hZ2VyOwotCi0gICAgLy8gY29ubmVjdCB0byBuZXcgb25lCi0gICAgaWYgKHNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25NYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOyAgCi0gICAgICB0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLSAgfSAgICAKLQotICBjbGFzcyBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgIAotICAgIHsgICAgICAgICAKLSAgICAgIGlmIChldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpICE9IGdldFRyZWVWaWV3ZXIoKSkKLSAgICAgIHsKLSAgICAgICAgZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotCi0gIGNsYXNzIFRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSAgCi0gICAgeyAKLSAgICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgICAgIE9iamVjdCBvID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgICAgLy8gVE9ETyAuLi4gCi0gICAgICAgICAgLy8gd2UgbmVlZCB0byBpbXBsZW1lbnQgYSBzZWxlY3Rpb25NYW5hZ2VyTWFwcGluZyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAvLyBzbyB0aGF0IGV4dGVuc2lvbnMgY2FuIHNwZWNpZnkgaG93IHRoZXknZCBsaWtlIHRvIG1hcCB2aWV3IG9iamVjdHMgCi0gICAgICAgICAgLy8gdG8gc2VsZWN0aW9uIG9iamVjdHMKLSAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRWxlbWVudCkKLS8vICAgICAgICAgIHsgIAotLy8gICAgICAgICAgICB0cnkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIE9iamVjdCBtb2RlbE9iamVjdCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudCh3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKSwgKEVsZW1lbnQpbyk7Ci0vLyAgICAgICAgICAgICAgaWYgKG1vZGVsT2JqZWN0ICE9IG51bGwgJiYgIShtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgbyA9IG1vZGVsT2JqZWN0OwotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3Rpb25NYW5hZ2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvKSwgZ2V0VHJlZVZpZXdlcigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlbGVjdGlvbk1hbmFnZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCksIGdldFRyZWVWaWV3ZXIoKSk7Ci0gICAgICAgICAgfSAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4OGVlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5XU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZWN0aW9uIGltcGxlbWVudHMgSVNlY3Rpb24sIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLQlwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBXU0RMRWxlbWVudCBlbGVtZW50OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotICBwcm90ZWN0ZWQgaW50IHJpZ2h0TWFyZ2luU3BhY2U7Ci0gIHByb3RlY3RlZCBpbnQgdGFibGVNaW5pbXVtV2lkdGggPSA1MDsKLQkKLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0gIHsKLSAgICBjcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmdldFdpZGdldEZhY3RvcnkoKSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgYUZhY3RvcnkpCi0gIHsKLQkJdGhpcy5mYWN0b3J5ID0gYUZhY3Rvcnk7Ci0gICAgR0MgZ2MgPSBuZXcgR0MocGFyZW50KTsKLSAgICBQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KCIgIC4uLiAgIik7IC8vJE5PTi1OTFMtMSQKLSAgICByaWdodE1hcmdpblNwYWNlID0gZXh0ZW50Lng7Ci0gICAgZ2MuZGlzcG9zZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCU9iamVjdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotCQl7Ci0JCSAgdGhpcy5lbGVtZW50ID0gKFdTRExFbGVtZW50KWlucHV0OwotICAgICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRBZGFwdGVyKGlucHV0KTsKLSAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlzUmVhZE9ubHkgPSBCb29sZWFuLlRSVUUuZXF1YWxzKGFkYXB0ZXIuZ2V0UHJvcGVydHkoaW5wdXQsICJpc1JlYWRPbmx5IikpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0JCX0KLQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0JCXsKLQkJICB0aGlzLmVsZW1lbnQgPSAoKFdTRExHcm91cE9iamVjdClpbnB1dCkuZ2V0RGVmaW5pdGlvbigpOwotCQl9Ci0JCXJlZnJlc2goKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jYWJvdXRUb0JlU2hvd24oKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWJvdXRUb0JlU2hvd24oKQotICB7Ci0JCXJlZnJlc2goKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jYWJvdXRUb0JlSGlkZGVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFib3V0VG9CZUhpZGRlbigpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jZGlzcG9zZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNnZXRNaW5pbXVtSGVpZ2h0KCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TWluaW11bUhlaWdodCgpCi0gIHsKLSAgICByZXR1cm4gU1dULkRFRkFVTFQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gIAotCS8qKgotCSAqIEdldCB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICogQHJldHVybiB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICovCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpCi0JewotICAgIHJlZnJlc2goKTsKLQl9Ci0KLQkKLSAgcHVibGljIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAge30KLSAgCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAge30KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJgotICAgICAgICBnZXRFbGVtZW50KCkgIT0gbnVsbCAmJgotICAgICAgICAhaXNJbkRvSGFuZGxlKSAKLSAgICB7Ci0gICAgICBpc0luRG9IYW5kbGUgPSB0cnVlOwotICAgICAgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0gICAgICBpc0luRG9IYW5kbGUgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmCi0gICAgICAgIGdldEVsZW1lbnQoKSAhPSBudWxsICYmCi0gICAgICAgICFpc0luRG9IYW5kbGUpIAotICAgIHsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICBkb1dpZGdldFNlbGVjdGVkKGUpOwotICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBib29sZWFuIGxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLSAgICogQHJldHVybiB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyRW5hYmxlZCgpIAotICB7Ci0gICAgcmV0dXJuIGxpc3RlbmVyRW5hYmxlZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIGxpc3RlbmVyRW5hYmxlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyRW5hYmxlZChib29sZWFuICB2KSAKLSAgewotICAgIHRoaXMubGlzdGVuZXJFbmFibGVkID0gdjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgIWlzSW5Eb0hhbmRsZSkgCi0gICAgewotICAgICAgaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLSAgICAgIHN0YXJ0RGVsYXllZEV2ZW50KGV2ZW50KTsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgIH0gLy8gZW5kIG9mIGlmICgpCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIERlbGF5ZWRFdmVudCBkZWxheWVkVGFzazsKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHN0YXJ0RGVsYXllZEV2ZW50KEV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZGVsYXllZFRhc2sgPT0gbnVsbCB8fAotICAgICAgZGVsYXllZFRhc2suZ2V0RXZlbnQoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIGRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLGRlbGF5ZWRUYXNrKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEV2ZW50IGRlbGF5ZWRFdmVudCA9IGRlbGF5ZWRUYXNrLmdldEV2ZW50KCk7Ci0gICAgICAKLSAgICAgIGlmIChlLndpZGdldCA9PSBkZWxheWVkRXZlbnQud2lkZ2V0ICYmCi0gICAgICAgIGUudHlwZSA9PSBkZWxheWVkRXZlbnQudHlwZSkKLSAgICAgIHsKLSAgICAgICAgLy8gc2FtZSBldmVudCwganVzdCBkaWZmZXJlbnQgZGF0YSwgZGVsYXkgbmV3IGV2ZW50Ci0gICAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KG51bGwpOwotICAgICAgfQotICAgICAgZGVsYXllZFRhc2sgPSBuZXcgRGVsYXllZEV2ZW50KCk7Ci0gICAgICBkZWxheWVkVGFzay5zZXRFdmVudChlKTsKLSAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnRpbWVyRXhlYyg1MDAsZGVsYXllZFRhc2spOwotICAgIH0KLSAgfQotICAKLSAgY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUKLSAgewotICAgIHByb3RlY3RlZCBFdmVudCBldmVudDsKLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgUnVubmFibGUjcnVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGlmIChldmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpc0luRG9IYW5kbGUgPSB0cnVlOwotICAgICAgICBkb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgICAgIGV2ZW50ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZXZlbnQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgRXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRXZlbnQgZ2V0RXZlbnQoKQotICAgIHsKLSAgICAgIHJldHVybiBldmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBldmVudC4KLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50KEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIHRoaXMuZXZlbnQgPSBldmVudDsKLSAgICB9Ci0KLSAgfQotCi0gIGJvb2xlYW4gaXNJbkRvSGFuZGxlOwotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBvZiBpc0luRG9IYW5kbGUuCi0gICAqIEByZXR1cm4gdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJbkRvSGFuZGxlKCkgCi0gIHsKLSAgICByZXR1cm4gaXNJbkRvSGFuZGxlOwotICB9Ci0KLSAgCi0gIHN0YXRpYyBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOwotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCi0gICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0gIH0KLQotICBzdGF0aWMgcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7IAotICAgIElTdGF0dXNMaW5lTWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpZWRpdG9yUGFydC5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLSAgICAgIHJlc3VsdCA9IGNvbnRyaWJ1dG9yLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgRG9jdW1lbnRJbXBsIGdldERvY3VtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJldHVybiAoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKFN0cmluZyBkZXNjcmlwdGlvbiwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgZ2V0RG9jdW1lbnQoZWxlbWVudCkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBkZXNjcmlwdGlvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0gICAgCi0gICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMjQ3MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yIGltcGxlbWVudHMgSVNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldEZpbHRlcigpCi0gICAqLwotICBwdWJsaWMgSVR5cGVNYXBwZXIgZ2V0RmlsdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChXU0RMRWxlbWVudC5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRBZnRlclNlY3Rpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBZnRlclNlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Eb2N1bWVudGF0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2ZlMWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Eb2N1bWVudGF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuQWRkRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERvY3VtZW50YXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQotCVRleHQgZG9jVGV4dDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkKLQl7Ci0JICBzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJCi0JCWRvY1RleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTVVMVEkgfCBTV1QuTk9ORSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7IC8vJE5PTi1OTFMtMSQKLSAgICBkb2NUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOyAgCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkb2NUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICBpZiAoZG9jVGV4dC5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkgIGRvY1RleHQuc2V0VGV4dCgiIik7Ci0JICBpZiAoZ2V0RWxlbWVudCgpICE9IG51bGwpCi0JICB7Ci0JICAgIEVsZW1lbnQgZG9jTm9kZSA9IGdldEVsZW1lbnQoKS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCSAgICBpZiAoZG9jTm9kZSAhPSBudWxsKQotCSAgICB7Ci0gICAgICAgIE5vZGUgdGV4dE5vZGUgPSBkb2NOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgaWYgKHRleHROb2RlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgZG9jVmFsdWUgPSB0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICBpZiAoZG9jVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkb2NUZXh0LnNldFRleHQoZG9jVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCSAgICB9Ci0JICB9Ci0JICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0JewotCSAgaWYgKGV2ZW50LndpZGdldCA9PSBkb2NUZXh0KQotCSAgewotCSAgICBTdHJpbmcgdmFsdWUgPSBkb2NUZXh0LmdldFRleHQoKTsKLQkgICAgaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgRWxlbWVudCBkb2NOb2RlID0gZ2V0RWxlbWVudCgpLmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JICAgICAgaWYgKGRvY05vZGUgIT0gbnVsbCkKLQkgICAgICB7Ci0gICAgICAgICAgTm9kZSB0ZXh0Tm9kZSA9IGRvY05vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgIGlmICh0ZXh0Tm9kZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRleHROb2RlLnNldE5vZGVWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY05vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0IG5ld1RleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwotICAgICAgICAgICAgICBkb2NOb2RlLmFwcGVuZENoaWxkKG5ld1RleHROb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0JICAgICAgfQotCSAgICAgIGVsc2UKLQkgICAgICB7Ci0JICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oZWxlbWVudCwgZWxlbWVudC5nZXRQcmVmaXgoKSwgImRvY3VtZW50YXRpb24iLCBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgRWxlbWVudCBuZXdEb2N1bWVudGF0aW9uID0gYWN0aW9uLmdldE5ld0VsZW1lbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG5ld0RvY3VtZW50YXRpb24uZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQgbmV3VGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7Ci0gICAgICAgICAgbmV3RG9jdW1lbnRhdGlvbi5hcHBlbmRDaGlsZChuZXdUZXh0Tm9kZSk7Ci0gICAgICAgICAgZ2V0RWxlbWVudCgpLnNldERvY3VtZW50YXRpb25FbGVtZW50KG5ld0RvY3VtZW50YXRpb24pOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRhdGlvblNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRhdGlvblNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwN2EzODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50YXRpb25TZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudGF0aW9uU2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yIGltcGxlbWVudHMgSVNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudGF0aW9uU2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWN0aW9uLmRvY3VtZW50YXRpb24iOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbiBnZXRTZWN0aW9uQ2xhc3MoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBuZXcgRG9jdW1lbnRhdGlvblNlY3Rpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmRvY3VtZW50YXRpb24iOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0V4dGVuc2liaWxpdHlFbGVtZW50U2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FeHRlbnNpYmlsaXR5RWxlbWVudFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MmVlYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0V4dGVuc2liaWxpdHlFbGVtZW50U2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIEV4dGVuc2liaWxpdHlFbGVtZW50U2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yIGltcGxlbWVudHMgSVNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudFNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWN0aW9uLmV4dGVuc2liaWxpdHllbGVtZW50IjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbmV3IEV4dGVuc2libGl0eUVsZW1lbnRTZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldEFmdGVyU2VjdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFmdGVyU2VjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0V4dGVuc2libGl0eUVsZW1lbnRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRXh0ZW5zaWJsaXR5RWxlbWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2NDZlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRXh0ZW5zaWJsaXR5RWxlbWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLkV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0cy5BdHRyaWJ1dGVzVGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxpdHlFbGVtZW50U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyCi17Ci0gIEV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyIHZpZXdlcjsKLSAgcHJvdGVjdGVkIEF0dHJpYnV0ZXNUYWJsZSBhdHRyaWJ1dGVzVGFibGU7Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQotCQljb21wb3NpdGUgPQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkKLS8vCQl2aWV3ZXIgPSBuZXcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIoY29tcG9zaXRlLCBnZXRBY3RpdmVFZGl0b3IoKSwgdHJ1ZSk7Ci0JCWF0dHJpYnV0ZXNUYWJsZSA9IG5ldyBBdHRyaWJ1dGVzVGFibGUoZ2V0QWN0aXZlRWRpdG9yKCksIGNvbXBvc2l0ZSk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlhdHRyaWJ1dGVzVGFibGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0vLwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQkKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpKQotICAgIHsKLSAgICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9ICAKLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgYXR0cmlidXRlc1RhYmxlLnNldElucHV0KGdldEVsZW1lbnQoKS5nZXRFbGVtZW50KCkpOwotCi0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsgCi0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgeyAgICAgICAgICAgCi0gICAgICAgIGlmICghYXR0cmlidXRlc1RhYmxlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyaWJ1dGVzVGFibGUucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsgICAgICAgICAgICAgICAKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0lQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0lQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYxZTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JUHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyIAotewotICAvL3B1YmxpYyB2b2lkIGluaXQoSUVkaXRvclBhcnQgZWRpdG9yKTsgIAotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoSUVkaXRvclBhcnQgZWRpdG9yLCBFbGVtZW50IG93bmVyRWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0ltcG9ydFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JbXBvcnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTVkOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0ltcG9ydFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmRpYWxvZ3MuU2VsZWN0U2luZ2xlRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5YTUxRdWlja1NjYW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEltcG9ydFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZXNwYWNlVGV4dCwgcHJlZml4VGV4dCwgbG9jYXRpb25UZXh0OwotICBwcml2YXRlIFN0cmluZyBvbGRQcmVmaXhWYWx1ZTsKLSAgQnV0dG9uIGJ1dHRvbjsKLSAgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhOwotCi0JCW5hbWVzcGFjZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQluYW1lc3BhY2VUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLS8vCQluYW1lc3BhY2VUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCW5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDTGFiZWwgbmFtZXNwYWNlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkFNRVNQQUNFIikpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVzcGFjZVRleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZXNwYWNlVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCW5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcHJlZml4VGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJcHJlZml4VGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXByZWZpeFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lc3BhY2VUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDTGFiZWwgcHJlZml4TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUFJFRklYIikpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJlZml4VGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCXByZWZpeExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbG9jYXRpb25UZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYXRpb25UZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLS8vCQlsb2NhdGlvblRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJQ0xhYmVsIGxvY2F0aW9uTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTE9DQVRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobG9jYXRpb25UZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxvY2F0aW9uVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIGJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0gICAgYnV0dG9uLnNldEltYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlICsgMik7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChsb2NhdGlvblRleHQsIDAsIFNXVC5DRU5URVIpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChidXR0b24sIDApOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLSAgICBsb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0JICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOyAgCi0JICBPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotICAgIGJvb2xlYW4gcmVmcmVzaFByZWZpeFRleHQgPSB0cnVlOwotICAgIGJvb2xlYW4gcmVmcmVzaExvY2F0aW9uVGV4dCA9IHRydWU7Ci0gICAgYm9vbGVhbiByZWZyZXNoTmFtZXNwYWNlVGV4dCA9IHRydWU7Ci0gICAgaWYgKHByZWZpeFRleHQuaXNGb2N1c0NvbnRyb2woKSkKLSAgICB7Ci0gICAgICByZWZyZXNoUHJlZml4VGV4dCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobG9jYXRpb25UZXh0LmlzRm9jdXNDb250cm9sKCkpCi0gICAgewotICAgICAgcmVmcmVzaExvY2F0aW9uVGV4dCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobmFtZXNwYWNlVGV4dC5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJlZnJlc2hOYW1lc3BhY2VUZXh0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChyZWZyZXNoUHJlZml4VGV4dCkKLSAgICB7Ci0gICAgICBwcmVmaXhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGlmIChyZWZyZXNoTG9jYXRpb25UZXh0KQotICAgIHsKLSAgICAgIGxvY2F0aW9uVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBpZiAocmVmcmVzaE5hbWVzcGFjZVRleHQpCi0gICAgewotICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQkgIGlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnQpCi0JICB7Ci0JICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoSW1wb3J0KW9iaikuZ2V0RWxlbWVudCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHJlZnJlc2hMb2NhdGlvblRleHQpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvblZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgCSAgICBsb2NhdGlvblRleHQuc2V0VGV4dChsb2NhdGlvblZhbHVlICE9IG51bGwgPyBsb2NhdGlvblZhbHVlIDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBuYW1lc3BhY2VWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKHJlZnJlc2hOYW1lc3BhY2VUZXh0KQotICAgICAgewotICAgICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQobmFtZXNwYWNlVmFsdWUgIT0gbnVsbCA/IG5hbWVzcGFjZVZhbHVlIDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChyZWZyZXNoUHJlZml4VGV4dCkKLSAgICAgIHsKLSAgCSAgICBTdHJpbmcgcHJlZml4ID0gKChJbXBvcnQpb2JqKS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0UHJlZml4KG5hbWVzcGFjZVZhbHVlKTsKLSAgCSAgICBwcmVmaXhUZXh0LnNldFRleHQocHJlZml4ICE9IG51bGwgPyBwcmVmaXggOiAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQkgIH0KLQlvbGRQcmVmaXhWYWx1ZSA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOwotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JICAgIGlmIChldmVudC53aWRnZXQgPT0gcHJlZml4VGV4dCAmJiBsb2NhdGlvblRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCAmJiBuYW1lc3BhY2VUZXh0LmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsgICAgCQotCSAgICAJT2JqZWN0IGlucHV0ID0gZ2V0RWxlbWVudCgpOwotCSAgICAgICAgSW1wb3J0IGltcG9ydE9iaiA9IChJbXBvcnQpaW5wdXQ7Ci0JICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGltcG9ydEVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoaW1wb3J0T2JqKTsKLQkgICAgICAgIE1hcCBuYW1lc3BhY2VzTWFwID0gaW1wb3J0T2JqLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXROYW1lc3BhY2VzKCk7Ci0KLQkgICAgICAgIGlmIChuYW1lc3BhY2VzTWFwLmNvbnRhaW5zS2V5KHByZWZpeFRleHQuZ2V0VGV4dCgpKSkgewotCSAgICAgICAgCS8vIFdlIHNob3VsZCBhZGQgZXJyb3IgbWVzc2FnZXMuLi4uLi4uLi4KLQkgLy8gICAgICAgICAgIHNldEVycm9yTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfRVJST1JfTEFCRUxfUFJFRklYX0VYSVNUUyIpKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgewotCSAgICAgICAgICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBpbXBvcnRPYmouZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVsZW1lbnQoKTsKLQkgICAgICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zOiIrb2xkUHJlZml4VmFsdWUpOwotCSAgICAgICAgICAgIGRlZmluaXRpb25FbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeFRleHQuZ2V0VGV4dCgpLCBuYW1lc3BhY2VUZXh0LmdldFRleHQoKSk7Ci0KLS8vCSAgICAgICAgICAgIGNsZWFyRXJyb3JNZXNzYWdlKCk7Ci0JICAgICAgICAgICAgb2xkUHJlZml4VmFsdWUgPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLQkgICAgICAgIH0KLQkgICAgfQotCX0KLQkKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBidXR0b24pCi0gICAgewotICAgICAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBPYmplY3QgaW5wdXQgPSBnZXRFbGVtZW50KCk7Ci0gICAgICAgIAotICAgICAgICAgICByZXNvdXJjZVNldCA9ICgob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpaW5wdXQpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0KLSAgICAgICAgICAgV1NETEVkaXRvciBlZGl0b3IgPSAoV1NETEVkaXRvcillZGl0b3JQYXJ0OwotICAgICAgICAgICBJRmlsZSBjdXJyZW50V1NETEZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9yLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgIFNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVEaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCBudWxsLCB0cnVlKTsKLSAgICAgICAgICAgU3RyaW5nIFtdIGZpbHRlcnMgPSB7ICJ4c2QiLCAid3NkbCIgfTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICBJRmlsZSBbXSBleGNsdWRlZEZpbGVzID0geyBjdXJyZW50V1NETEZpbGUgfTsKLSAgICAgICAgICAgCi0gICAgICAgICAgIGRpYWxvZy5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlcnMsIGV4Y2x1ZGVkRmlsZXMpOwotICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU0VMRUNUIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9TRUxFQ1RfRklMRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERVNDUklQVElPTl9TRUxFQ1RfV1NETF9PUl9YU0QiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgaW50IHJjID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBJRmlsZSBzZWxlY3RlZEZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgLy9pZiAoc2VsZWN0ZWRGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLmVxdWFscyhjdXJyZW50V1NETEZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpKQotICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgIC8vICBTeXN0ZW0ub3V0LnByaW50bG4oIlNBTUUgRklMRToiICsgY3VycmVudFdTRExGaWxlLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgIC8vfQotCi0gICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlUmVsYXRpdmVVUkkoc2VsZWN0ZWRGaWxlLCBjdXJyZW50V1NETEZpbGUsIHRydWUpOwotCi0gICAgICAgICAgICAgSW1wb3J0IGltcG9ydE9iaiA9IChJbXBvcnQpaW5wdXQ7Ci0gICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBpbXBvcnRFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGltcG9ydE9iaik7Ci0gICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaW1wb3J0T2JqLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgICAgICAgICAgIAotICAgICAgICAgICAgIFN0cmluZyBpbXBvcnRUYXJnZXROYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlUHJlZml4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgCi0gICAgIAkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHNlbGVjdGVkRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOyAgICAgIAotCi0gICAgIAkJLy8gbm90ZSB0aGF0IHRoZSBnZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEgd29ya3MgZm9yIGJvdGggc2NoZW1hIGFuZCB3c2RsIGZpbGVzCi0gICAgIAkJLy8gSSBzaG91bGQgY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgY29udmVuaWVuY2UgbWV0aG9kCi0gICAgICAgICAgICAgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlID0gIFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEodXJpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHVuaXF1ZVByZWZpeCA9IGdldFVuaXF1ZVByZWZpeChkZWZpbml0aW9uLCB1cmkuZmlsZUV4dGVuc2lvbigpKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHVuaXF1ZVByZWZpeCA9IHByZWZpeDsgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgaWYgKGltcG9ydFRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgKGltcG9ydFRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIGltcG9ydFRhcmdldE5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuOyAgLy8gd2hhdCB0byBkbyB3aXRoIG5vIG5hbWVzcGFjZSBkb2NzPwotICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiLCBpbXBvcnRUYXJnZXROYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyB1bmlxdWVQcmVmaXgsIGltcG9ydFRhcmdldE5hbWVzcGFjZSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChpbXBvcnRUYXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgIGxvY2F0aW9uVGV4dC5zZXRUZXh0KGxvY2F0aW9uKTsKLSAgICAgICAgICAgICBwcmVmaXhUZXh0LnNldFRleHQodW5pcXVlUHJlZml4KTsKLSAgICAgICAgICAgfQotCi0gICAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLQkKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZVByZWZpeChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBpbml0UHJlZml4KQotICB7Ci0gICAgU3RyaW5nIHVuaXF1ZVByZWZpeDsKLSAgICBNYXAgbWFwID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7Ci0KLSAgICBpZiAoZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UoaW5pdFByZWZpeCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB1bmlxdWVQcmVmaXggPSBpbml0UHJlZml4OwotICAgIH0KLSAgICBlbHNlIC8vIGlmIHVzZWQsIHRoZW4gdHJ5IHRvIGNyZWF0ZSBhIHVuaXF1ZSBvbmUKLSAgICB7Ci0gICAgICBTdHJpbmcgdGVtcFByZWZpeCA9IGluaXRQcmVmaXg7Ci0gICAgICBpbnQgaSA9IDE7Ci0gICAgICB3aGlsZShtYXAuY29udGFpbnNLZXkodGVtcFByZWZpeCArIGkpKQotICAgICAgewotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgICB1bmlxdWVQcmVmaXggPSB0ZW1wUHJlZml4ICsgaTsKLSAgICB9Ci0gICAgcmV0dXJuIHVuaXF1ZVByZWZpeDsgICAgCi0gIH0gCi0gIAotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JbXBvcnRTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0ltcG9ydFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNmE3MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0ltcG9ydFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLQotcHVibGljIGNsYXNzIEltcG9ydFNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICBJbXBvcnRTZWN0aW9uIGltcG9ydFNlY3Rpb247Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBJbXBvcnRTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGltcG9ydFNlY3Rpb24gPSBuZXcgSW1wb3J0U2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24uaW1wb3J0IjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoSW1wb3J0LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBpbXBvcnRTZWN0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaW1wb3J0U2VjdGlvbi5zZXRFZGl0b3JQYXJ0KHBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSk7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbXBvcnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5uYW1lIjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjUyM2YyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgTmFtZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLQotCVRleHQgbmFtZVRleHQ7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCWNvbXBvc2l0ZSA9CWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhOwotCQkKLQotCQluYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUUiKSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgaWYgKG5hbWVUZXh0LmlzRm9jdXNDb250cm9sKCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCSAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkgIGlmIChnZXRFbGVtZW50KCkgIT0gbnVsbCkKLQkgIHsKLQkgICAgaWYgKGdldEVsZW1lbnQoKS5nZXRFbGVtZW50KCkhPSBudWxsKQotCSAgICB7Ci0JICAgICAgU3RyaW5nIG5hbWUgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JICAgICAgaWYgKG5hbWU9PW51bGwpIG5hbWU9IiI7Ci0JICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLQkgICAgfQotCSAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0JCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQgJiYgIW5hbWVUZXh0LmlzRGlzcG9zZWQoKSkgewotICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIE9iamVjdCB3c2RsRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBEZWZpbml0aW9uKSB7Ci0gICAgICAgIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgd3NkbEVsZW1lbnQ7Ci0gICAgICAgIAlTdHJpbmcgdXJpID0gZGVmaW5pdGlvbi5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAJZGVmaW5pdGlvbi5zZXRRTmFtZShuZXcgUU5hbWUodXJpLCBuZXdWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgU2VydmljZSkgeyAgICAgICAgCi0gICAgICAgIAlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgd3NkbEVsZW1lbnQ7Ci0gICAgICAgIAlTdHJpbmcgdXJpID0gc2VydmljZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOyAKLSAgICAgICAgCXNlcnZpY2Uuc2V0UU5hbWUobmV3IFFOYW1lKHVyaSwgbmV3VmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIFBvcnQpIHsKLSAgICAgICAgCW5ldyBTbWFydFJlbmFtZUFjdGlvbih3c2RsRWxlbWVudCwgbmV3VmFsdWUpLnJ1bigpOwotLy8gICAgICAgIAkoKFBvcnQpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsKLSAgICAgICAgCUJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSB3c2RsRWxlbWVudDsKLSAgICAgICAgCVN0cmluZyB1cmkgPSBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIAliaW5kaW5nLnNldFFOYW1lKG5ldyBRTmFtZSh1cmksIG5ld1ZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uKSB7Ci0gICAgICAgIAkJKChCaW5kaW5nT3BlcmF0aW9uKSB3c2RsRWxlbWVudCkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpIHsKLSAgICAgICAgCWlmKCgoQmluZGluZ0lucHV0KSB3c2RsRWxlbWVudCkuZ2V0TmFtZSgpID09IG51bGwgJiYgbmV3VmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAJCXJldHVybjsKLSAgICAgICAgCQotICAgICAgICAJKChCaW5kaW5nSW5wdXQpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQpIHsKLSAgICAgICAgCWlmICgoKEJpbmRpbmdPdXRwdXQpIHdzZGxFbGVtZW50KS5nZXROYW1lKCkgPT0gbnVsbCAmJiBuZXdWYWx1ZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIAkJcmV0dXJuOwotICAgICAgICAJCi0gICAgICAgIAkoKEJpbmRpbmdPdXRwdXQpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkgewotICAgICAgICAJKChCaW5kaW5nRmF1bHQpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0gICAgICAgIAlQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgd3NkbEVsZW1lbnQ7Ci0gICAgICAgIAlTdHJpbmcgdXJpID0gcG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgCXBvcnRUeXBlLnNldFFOYW1lKG5ldyBRTmFtZSh1cmksIG5ld1ZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgICAgICAgCW5ldyBTbWFydFJlbmFtZUFjdGlvbih3c2RsRWxlbWVudCwgbmV3VmFsdWUpLnJ1bigpOwotLy8gICAgICAgIAkoKE9wZXJhdGlvbikgd3NkbEVsZW1lbnQpLnNldE5hbWUobmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZVJlZmVyZW5jZSkgewotICAgICAgICAJaWYgKCgoTWVzc2FnZVJlZmVyZW5jZSkgd3NkbEVsZW1lbnQpLmdldE5hbWUoKSA9PSBudWxsICYmIG5ld1ZhbHVlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQlyZXR1cm47Ci0gICAgICAgIAkKLSAgICAgICAgCW5ldyBTbWFydFJlbmFtZUFjdGlvbih3c2RsRWxlbWVudCwgbmV3VmFsdWUpLnJ1bigpOwotLy8gICAgICAgIAkoKE1lc3NhZ2VSZWZlcmVuY2UpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2UpIHsKLS8qCi0gICAgICAgIAlNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgd3NkbEVsZW1lbnQ7Ci0gICAgICAgIAlTdHJpbmcgdXJpID0gbWVzc2FnZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAJbWVzc2FnZS5zZXRRTmFtZShuZXcgUU5hbWUodXJpLCBuZXdWYWx1ZSkpOwotICAgICAgICAJKi8KLSAgICAgICAgCW5ldyBTbWFydFJlbmFtZUFjdGlvbih3c2RsRWxlbWVudCwgbmV3VmFsdWUpLnJ1bigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgUGFydCkgewotLy8gICAgICAgIAkoKFBhcnQpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgCW5ldyBTbWFydFJlbmFtZUFjdGlvbih3c2RsRWxlbWVudCwgbmV3VmFsdWUpLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOTA4NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE5hbWVTZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIE5hbWVTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24ubmFtZSI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFdTRExFbGVtZW50LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBuZXcgTmFtZVNlY3Rpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNhcHBsaWVzVG8ob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQgJiYgCi0gICAgICAgICAgIShvYmplY3QgaW5zdGFuY2VvZiBFeHRlbnNpYmlsaXR5RWxlbWVudCkgJiYKLSAgICAgICAgICAhKG9iamVjdCBpbnN0YW5jZW9mIEltcG9ydCkpCi0gICAgICB7Ci0gICAgICAJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSB7Ci0gICAgICAJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpIG9iamVjdCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgCQlpZiAoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkgIT0gbnVsbCAmJiAhKG9iamVjdCBpbnN0YW5jZW9mIERlZmluaXRpb24pKSB7Ci0gICAgICAJCQlyZXR1cm4gdHJ1ZTsKLSAgICAgIAkJfQotICAgICAgCQkKLSAgICAgIAkJcmV0dXJuIGZhbHNlOwotICAgICAgCX0KLSAgICAgIAkvKgotICAgICAgCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkgewotICAgICAgCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExHcm91cE9iamVjdCkgb2JqZWN0KS5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAJCWlmIChkZWZpbml0aW9uLmdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAJCQlyZXR1cm4gdHJ1ZTsKLSAgICAgIAkJfQotICAgICAgCQkKLSAgICAgIAkJcmV0dXJuIGZhbHNlOwotICAgICAgCX0KLSAgICAgIAkqLwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVzcGFjZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZDQ4NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVzcGFjZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkVkaXROYW1lc3BhY2VzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5zZWRpdC5Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkubnNlZGl0LkNvbW1vbk5hbWVzcGFjZUluZm9UYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0gIHByb3RlY3RlZCBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nIGVkaXRXU0RMTmFtZXNwYWNlc0NvbnRyb2w7Ci0gIHByb3RlY3RlZCBCdXR0b24gYnV0dG9uOwotICAKLSAgVGV4dCBuYW1lVGV4dDsKLSAgVGV4dCBwcmVmaXhUZXh0OwotICBUZXh0IHRhcmdldE5hbWVzcGFjZVRleHQ7Ci0gIHByb3RlY3RlZCBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUgdGFibGVWaWV3ZXI7Ci0gIHByaXZhdGUgYm9vbGVhbiBoYW5kbGluZ0V2ZW50OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tcG9zaXRlID0JZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQotCQkvLyBuYW1lCi0JCUNMYWJlbCBuYW1lTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkFNRSIpICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotCQluYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBwcmVmaXgKLQkJQ0xhYmVsIHByZWZpeExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BSRUZJWCIpICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVmaXhUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0YXJnZXRuYW1lc3BhY2UKLQkJQ0xhYmVsIHRhcmdldE5hbWVzcGFjZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGFyZ2V0TmFtZXNwYWNlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQWR2YW5jZWQgYnV0dG9uCi0JCWJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9TRUNUSU9OX0FEVkFOQ0VEX0FUVFJJQlVURVMiKSArICIuLi4iLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCQotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8gTGFiZWxzCi0JCS8vIG5hbWUgbGF5b3V0Ci0JCUZvcm1EYXRhIGRhdGFOYW1lTGFiZWwgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YU5hbWVMYWJlbC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhTmFtZUxhYmVsKTsKLQotCQkvLyBwcmVmaXggbGF5b3V0Ci0JCUZvcm1EYXRhIGRhdGFQcmVmaXhMYWJlbCA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhUHJlZml4TGFiZWwubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YVByZWZpeExhYmVsLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLQkJcHJlZml4TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhUHJlZml4TGFiZWwpOwotCi0JCS8vIHRhcmdldE5hbWVzcGFjZUxhYmVsIGxheW91dAotCQlGb3JtRGF0YSBkYXRhdG5zTGFiZWwgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YXRuc0xhYmVsLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgZGF0YXRuc0xhYmVsLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRhcmdldE5hbWVzcGFjZVRleHQsIDApOwotCQlkYXRhdG5zTGFiZWwudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRhcmdldE5hbWVzcGFjZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQl0YXJnZXROYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGF0bnNMYWJlbCk7Ci0JCQotCi0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLyBUZXh0IEZpZWxkcwotCQkvLyBuYW1lIHRleHQgZmllbGQKLQkJRm9ybURhdGEgZGF0YU5hbWVUZXh0ID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGFOYW1lVGV4dC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDExNSk7Ci0JCWRhdGFOYW1lVGV4dC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGFOYW1lVGV4dC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YU5hbWVUZXh0KTsKLQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gcHJlZml4IHRleHQgZmllbGQKLQkJRm9ybURhdGEgZGF0YVByZWZpeFRleHQgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YVByZWZpeFRleHQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMTUpOwotCQlkYXRhUHJlZml4VGV4dC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGFQcmVmaXhUZXh0LnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lVGV4dCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlwcmVmaXhUZXh0LnNldExheW91dERhdGEoZGF0YVByZWZpeFRleHQpOwotCQlwcmVmaXhUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIHRhcmdldG5hbWVzcGFjZSB0ZXh0IGZpZWxkCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDExNSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXRhcmdldE5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFyZ2V0TmFtZXNwYWNlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJCi0JCS8vIEFkdmFuY2VkIGJ1dHRvbiBsYXlvdXQKLQkJRm9ybURhdGEgZGF0YUJ1dHRvbiA9IG5ldyBGb3JtRGF0YSgpOwotLy8JCWRhdGFCdXR0b24ubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlICsgMik7Ci0JCWRhdGFCdXR0b24ucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhQnV0dG9uLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXJnZXROYW1lc3BhY2VUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0vLwkJZGF0YUJ1dHRvbi50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFyZ2V0TmFtZXNwYWNlVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGFCdXR0b24pOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLQl7Ci0JCWhhbmRsaW5nRXZlbnQgPSB0cnVlOwotCSAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkgewotCSAgCU9iamVjdCBvYmogPSBnZXRFbGVtZW50KCk7Ci0JICAJaWYgKG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb24pIHsKLQkgIAkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIG9iajsKLQkgIAkJU3RyaW5nIHVyaSA9IGRlZmluaXRpb24uZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQkgIAkJZGVmaW5pdGlvbi5zZXRRTmFtZShuZXcgUU5hbWUodXJpLCBuYW1lVGV4dC5nZXRUZXh0KCkpKTsKLQkgIAl9Ci0JICB9Ci0JICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gcHJlZml4VGV4dCkgewotCSAgCU9iamVjdCBvYmogPSBnZXRFbGVtZW50KCk7Ci0JICAJaWYgKG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb24pIHsKLQkgIAkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIG9iajsKLQkgIAkJU3RyaW5nIHVyaSA9IGRlZmluaXRpb24uZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQotCSAgCQlFbGVtZW50IGVsZW1lbnQgPSBkZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLQkgIAkJCi0JICAJCS8vIFJlbW92ZSB0aGUgb2xkIHByZWZpeAotCSAgCQlTdHJpbmcgb2xkUHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JICAJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiK29sZFByZWZpeCk7IAotCSAgCQkKLQkgIAkJLy8gU2V0IHRoZSBuZXcgcHJlZml4Ci0JICAJICAJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXhUZXh0LmdldFRleHQoKSwgZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JICAJfQotCSAgfQotCSAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHRhcmdldE5hbWVzcGFjZVRleHQpCi0JICB7Ci0JCSAgT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoKTsKLQkJICBpZiAob2JqIGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLQkJICB7Ci0JCSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbilvYmo7Ci0JCSAgICBTdHJpbmcgbmV3VmFsdWUgPSB0YXJnZXROYW1lc3BhY2VUZXh0LmdldFRleHQoKTsKLQkJICAgIFN0cmluZyBwcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJICAgIGRlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld1ZhbHVlKTsKLQkJICAgIGRlZmluaXRpb24uZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwgbmV3VmFsdWUpOwotCQkgIH0KLQkgIH0KLQkgIGhhbmRsaW5nRXZlbnQgPSBmYWxzZTsJCQotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgaWYgKHRhcmdldE5hbWVzcGFjZVRleHQuaXNGb2N1c0NvbnRyb2woKSB8fCBoYW5kbGluZ0V2ZW50KQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0JICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOyAgCi0JICBPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotCSAgaWYgKG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0JICB7Ci0JICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKW9iajsKLQkgICAgU3RyaW5nIHRhcmdldE5TID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkgICAgCi0JCS8vIHNldCB0YXJnZXRuYW1lc3BhY2UgZmllbGQgYW5kIHByZWZpeCBmaWVsZAotCSAgICBpZiAodGFyZ2V0TlMgIT0gbnVsbCkKLQkgICAgewotCSAgICAJdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KHRhcmdldE5TKTsKLQkgICAgCQotCSAgICAJRWxlbWVudCBlbGVtZW50ID0gZGVmaW5pdGlvbi5nZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KHRhcmdldE5TKTsKLSAgICAgICAgaWYgKG5ld1ByZWZpeCA9PSBudWxsKSBuZXdQcmVmaXggPSAiIjsKLSAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY29kZQotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gIAkgICAgCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5nZXRMZW5ndGgoKTsgaW5kZXgrKykgewotICAJICAgIAkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuaXRlbShpbmRleCk7Ci0gIAkgICAgCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotICAJICAgIAkJU3RyaW5nIG5vZGVOYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOwotICAJICAgIAkJU3RyaW5nIG5zVmFsdWUgPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotICAJICAgIAkJaWYgKG5zVmFsdWUuZXF1YWxzKHRhcmdldE5TKSkgewotICAJICAgIAkJCWlmIChub2RlTmFtZS5pbmRleE9mKCI6IikgIT0gLTEpIHsKLSAgCSAgICAJCQkJU3RyaW5nIHhtbG5zU3RyaW5nID0gbm9kZU5hbWUuc3Vic3RyaW5nKDAsIG5vZGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gIAkgICAgCQkJCQotICAJICAgIAkJCQlpZiAoeG1sbnNTdHJpbmcuZXF1YWxzKCJ4bWxucyIpKSB7Ci0gIAkgICAgCSAgICAJCQluZXdQcmVmaXggPSBhdHRyLmdldExvY2FsTmFtZSgpOwotICAJICAgIAkgICAgCQkJYnJlYWs7Ci0gIAkgICAgCQkJCX0KLSAgCSAgICAJCQl9Ci0gIAkgICAgCQl9Ci0gIAkgICAgCX0KLSAgICAgICAgfQotCSAgICAJcHJlZml4VGV4dC5zZXRUZXh0KG5ld1ByZWZpeCk7ICAgICAKLQkgICAgfQotCSAgfQotCSAgCi0JICAvLyBzZXQgbmFtZSBmaWVsZAotCSAgaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsKQotCSAgewotCSAgICBpZiAoZ2V0RWxlbWVudCgpLmdldEVsZW1lbnQoKSE9IG51bGwpCi0JICAgIHsKLQkgICAgICBTdHJpbmcgbmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgICBpZiAobmFtZT09bnVsbCkgbmFtZT0iIjsKLQkgICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotCSAgICB9Ci0JICB9Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJ1dHRvbikKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKW9iajsKLSAgICAgICAgRWRpdE5hbWVzcGFjZXNBY3Rpb24gYWN0aW9uID0gbmV3IEVkaXROYW1lc3BhY2VzQWN0aW9uKGRlZmluaXRpb24pOwotICAgICAgCWFjdGlvbi5ydW4oKTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjU5MzU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIE5hbWVzcGFjZVNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5uYW1lc3BhY2UiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChXU0RMR3JvdXBPYmplY3QuY2xhc3MpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbiBnZXRTZWN0aW9uQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBOYW1lc3BhY2VTZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICAgIHsKLSAgICAgIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExHcm91cE9iamVjdCkgb2JqZWN0KS5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAJaWYgKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpICE9IG51bGwpIHsKLSAgICAgIAkJcmV0dXJuIHRydWU7Ci0gICAgICAJfQotICAgICAgCQotICAgICAgCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24pIHsKLSAgICAgIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgb2JqZWN0OwotICAgICAgCWlmIChkZWZpbml0aW9uLmdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAJCXJldHVybiB0cnVlOwotICAgICAgCX0KLSAgICAgIAkKLSAgICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldEFmdGVyU2VjdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFmdGVyU2VjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9QYXJ0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhcnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTM2YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhcnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MuSW52b2tlU2V0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgUGFydFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgQ0NvbWJvIGNvbXBvbmVudE5hbWVDb21ibzsKLQlDQ29tYm8gcmVmZXJlbmNlS2luZENvbWJvOwotICBDTGFiZWwgY29tcG9uZW50TmFtZUxhYmVsOwotICBCdXR0b24gYnV0dG9uOwotICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KQotCXsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5KQotICAgIHsgIAotICAgICAgaWYgKGV2ZW50LndpZGdldCA9PSByZWZlcmVuY2VLaW5kQ29tYm8pCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNUeXBlID0gcmVmZXJlbmNlS2luZENvbWJvLmdldFRleHQoKS5lcXVhbHMoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZSgoUGFydClnZXRFbGVtZW50KCksIGlzVHlwZSwgbnVsbCk7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICAgIH0gCi0gICAgfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tcG9zaXRlID0JZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJRm9ybURhdGEgZGF0YTsKLQotCQlyZWZlcmVuY2VLaW5kQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0JCXJlZmVyZW5jZUtpbmRDb21iby5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQlyZWZlcmVuY2VLaW5kQ29tYm8uYWRkKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmVmZXJlbmNlS2luZENvbWJvLmFkZChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0KLQkJQ0xhYmVsIHZhbHVlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUkVGRVJFTkNFX0tJTkQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVmZXJlbmNlS2luZENvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHJlZmVyZW5jZUtpbmRDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCXZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgY29tcG9uZW50TmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tcG9uZW50TmFtZUNvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvbmVudE5hbWVDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCWNvbXBvbmVudE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLSAgICBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotICAgIGJ1dHRvbi5zZXRJbWFnZShXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSArIDIpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvbmVudE5hbWVDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgcmVmZXJlbmNlS2luZENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYnV0dG9uLCAwKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChyZWZlcmVuY2VLaW5kQ29tYm8sICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJlZmVyZW5jZUtpbmRDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCSAgcmVmZXJlbmNlS2luZENvbWJvLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQlpZiAoKChQYXJ0KWdldEVsZW1lbnQoKSkuZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotCQl7Ci0JCSAgcmVmZXJlbmNlS2luZENvbWJvLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJewotCQkgIHJlZmVyZW5jZUtpbmRDb21iby5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLSAgICB0cnkKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydClnZXRFbGVtZW50KCk7Ci0gICAgICBib29sZWFuIGlzVHlwZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuaXNUeXBlKHBhcnQpOwotICAgICAgU3RyaW5nIHZhbHVlID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRQYXJ0Q29tcG9uZW50UmVmZXJlbmNlKHBhcnQpOwotCi0gICAgICAvLyB1cGRhdGUgdGhlIGNvbWJvLWJveCBjb250ZW50Ci0gICAgICAvLwotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnJlbW92ZUFsbCgpOyAKLSAgICAgIExpc3QgY29tcExpc3QgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldENvbXBvbmVudE5hbWVMaXN0KHBhcnQsIGlzVHlwZSk7Ci0gICAgICBpZiAoY29tcExpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICBjb21wTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZCgoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gCi0gICAgICAKLSAgICAgIGlmIChpc1R5cGUpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZWZlcmVuY2VLaW5kQ29tYm8uc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbXBvbmVudE5hbWVMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1RZUEUiKSArICI6Iik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgIGJ1dHRvbi5zZXRSZWZlcmVuY2VLaW5kKCJ0eXBlIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlZmVyZW5jZUtpbmRDb21iby5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbXBvbmVudE5hbWVMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSArICI6Iik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLS8vICAgICAgICBidXR0b24uc2V0UmVmZXJlbmNlS2luZCgiZWxlbWVudCIpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyAgICAgIGJ1dHRvbi5zZXRJbnB1dChpbnB1dCk7Ci0vLyAgICAgIGJ1dHRvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gIAkJcmVmZXJlbmNlS2luZENvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIH0KLQl9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBQYXJ0IHBhcnQgPSAoUGFydClnZXRFbGVtZW50KCk7Ci0gICAgYm9vbGVhbiBpc1R5cGUgPSByZWZlcmVuY2VLaW5kQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBpc1R5cGUsIGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCkpOwotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBidXR0b24pCi0gICAgewotICAgICAgICBJbnZva2VTZXREaWFsb2cgZGlhbG9nID0gbmV3IEludm9rZVNldERpYWxvZygpOwotICAgICAgICAgIAotICAgICAgICBpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgUGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgZGlhbG9nLnNldFJlZmVyZW5jZUtpbmQocmVmZXJlbmNlS2luZENvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGlhbG9nLnNldFJlZmVyZW5jZUtpbmQocmVmZXJlbmNlS2luZENvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgIGRpYWxvZy5ydW4oZ2V0RWxlbWVudCgpLCBlZGl0b3JQYXJ0KTsKLSAgICAgICAgCi0gICAgICAgIFdTRExFZGl0b3IgZWRpdG9yID0gKFdTRExFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICAgIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldEVsZW1lbnQoKSkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhcnRTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhcnRTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGIxMzFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9QYXJ0U2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLQotCi1wdWJsaWMgY2xhc3MgUGFydFNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICBQYXJ0U2VjdGlvbiBwYXJ0U2VjdGlvbjsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFBhcnRTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHBhcnRTZWN0aW9uID0gbmV3IFBhcnRTZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5wYXJ0IjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoUGFydC5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gcGFydFNlY3Rpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBwYXJ0U2VjdGlvbi5zZXRFZGl0b3JQYXJ0KHBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSk7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJ0KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEFmdGVyU2VjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24ubmFtZSI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1JlZmVyZW5jZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9SZWZlcmVuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxM2ViMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1JlZmVyZW5jZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MuSW52b2tlU2V0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcm90ZWN0ZWQgQ0NvbWJvIGNvbXBvbmVudE5hbWVDb21ibzsgCi0gIHByb3RlY3RlZCBDb21wb25lbnROYW1lQ29tYm9IZWxwZXIgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyOwotICBCdXR0b24gYnV0dG9uOwotICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotICBDTGFiZWwgbWVzc2FnZUxhYmVsOwotICAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLSAgICAKLSAgICBtZXNzYWdlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTUVTU0FHRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotICAgIGJ1dHRvbi5zZXRJbWFnZShXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tcG9uZW50TmFtZUNvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvbmVudE5hbWVDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSArIDIpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tcG9uZW50TmFtZUNvbWJvLCAwLCBTV1QuQ0VOVEVSKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYnV0dG9uLCAwKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQkgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7ICAKLQkgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkgIE9iamVjdCBvYmogPSBnZXRFbGVtZW50KCk7Ci0JICBpZiAob2JqIGluc3RhbmNlb2YgTWVzc2FnZVJlZmVyZW5jZSkKLQkgIHsKLQkgICAgbWVzc2FnZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTUVTU0FHRSIpKTsgLy8kTk9OLU5MUy0xJAotCSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIgPSBuZXcgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyKGNvbXBvbmVudE5hbWVDb21ibykKLQkgICAgewotCSAgICAgIHByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCkKLQkgICAgICB7Ci0JICAgICAgICByZXR1cm4gdXRpbC5nZXRNZXNzYWdlTmFtZXMoKTsKLQkgICAgICB9Ci0KLQkgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQotCSAgICAgIHsKLQkgICAgICAgIHJldHVybiBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFOwotCSAgICAgIH0KLQkgICAgfTsKLQotCSAgfQotCSAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQmluZGluZykKLQkgIHsKLQkgICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyID0gbmV3IENvbXBvbmVudE5hbWVDb21ib0hlbHBlcihjb21wb25lbnROYW1lQ29tYm8pCi0JICAgIHsKLQkgICAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwpCi0JICAgICAgewotCSAgICAgICAgcmV0dXJuIHV0aWwuZ2V0UG9ydFR5cGVOYW1lcygpOwotCSAgICAgIH0KLQotCSAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpCi0JICAgICAgewotCSAgICAgICAgcmV0dXJuIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEU7Ci0JICAgICAgfQotCSAgICB9OwotCi0JICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BPUlRUWVBFIikpOyAvLyROT04tTkxTLTEkCi0JICB9Ci0JICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQb3J0KQotCSAgewotCSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIgPSBuZXcgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyKGNvbXBvbmVudE5hbWVDb21ibykKLQkgICAgewotCSAgICAgIHByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCkKLQkgICAgICB7Ci0JICAgICAgICByZXR1cm4gdXRpbC5nZXRCaW5kaW5nTmFtZXMoKTsKLQkgICAgICB9Ci0KLQkgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQotCSAgICAgIHsKLQkgICAgICAgIHJldHVybiBXU0RMQ29uc3RhbnRzLkJJTkRJTkdfQVRUUklCVVRFOwotCSAgICAgIH0KLQkgICAgfTsKLQkgICAgbWVzc2FnZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQklORElORyIpKTsgLy8kTk9OLU5MUy0xJAotCSAgfQotCSAgCi0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLnVwZGF0ZShnZXRFbGVtZW50KCkpOwotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYnV0dG9uKQotICAgIHsKLSAgICAgICAgSW52b2tlU2V0RGlhbG9nIGRpYWxvZyA9IG5ldyBJbnZva2VTZXREaWFsb2coKTsKLSAgICAgICAgZGlhbG9nLnJ1bihnZXRFbGVtZW50KCksIGVkaXRvclBhcnQpOwotICAgICAgICAKLSAgICAgICAgV1NETEVkaXRvciBlZGl0b3IgPSAoV1NETEVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0RWxlbWVudCgpKSk7Ci0gICAgfQotICB9Ci0JCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLmhhbmRsZUV2ZW50SGVscGVyKGdldEVsZW1lbnQoKS5nZXRFbGVtZW50KCksIGV2ZW50KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9SZWZlcmVuY2VTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI2YmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9SZWZlcmVuY2VTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci0KLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZVNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICBSZWZlcmVuY2VTZWN0aW9uIHJlZmVyZW5jZVNlY3Rpb247Ci0gIAotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLnJlZmVyZW5jZVNlY3Rpb24gPSBuZXcgUmVmZXJlbmNlU2VjdGlvbigpOyAKLSAgfQotCi0KLSAgLyoqCi0gICAqIAotICAgKi8KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5yZWZlcmVuY2UiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChNZXNzYWdlUmVmZXJlbmNlLmNsYXNzKTsKLSAgICBsaXN0LmFkZChCaW5kaW5nLmNsYXNzKTsKLSAgICBsaXN0LmFkZChQb3J0LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiByZWZlcmVuY2VTZWN0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgcmVmZXJlbmNlU2VjdGlvbi5zZXRFZGl0b3JQYXJ0KHBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSk7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlUmVmZXJlbmNlIHx8IG9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmcgfHwgb2JqZWN0IGluc3RhbmNlb2YgUG9ydCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5uYW1lIjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVGV4dENoYW5nZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1RleHRDaGFuZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0ZWQxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVGV4dENoYW5nZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRleHRDaGFuZ2VIZWxwZXIgbm90aWZpZXMgdGhlIGxpc3RuZXIgb2YgdGV4dCBsaWZlY3ljbGUgZXZlbnRzIAotICogb24gYmVoYWxmIG9mIHRoZSB3aWRnZXQocykgaXQgbGlzdGVucyB0by4gCi0gKiAKLSAqIEBhdXRob3IgQW50aG9ueSBIdW50ZXIgCi0gKiA8YSBocmVmPSJtYWlsdG86YW50aG9ueWhAY2EuaWJtLmNvbSI+YW50aG9ueWhAY2EuaWJtLmNvbTwvYT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRleHRDaGFuZ2VIZWxwZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG5vblVzZXJDaGFuZ2U7Ci0KLQkvKioKLQkgKiBNYXJrcyB0aGUgc3RhcnQgb2YgYSBwcm9ncmFtbWF0aWMgY2hhbmdlIHRvIHRoZSB3aWRnZXQgY29udGVudHMuCi0JICogQ2xpZW50cyBtdXN0IGNhbGwgc3RhcnROb25Vc2VyQ2hhbmdlKCkgYmVmb3JlIGRpcmVjdGx5IHNldHRpbmcgCi0JICogdGhlIHdpZGdldCBjb250ZW50cyB0byBhdm9pZCB1bndhbnRlZCBsaWZlY3ljbGUgZXZlbnRzLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgcHJvZ3JhbW1hdGljIGNoYW5nZSBpcyAKLQkgKiBhbHJlYWR5IGluIHByb2dyZXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0Tm9uVXNlckNoYW5nZSgpIHsKLQkJaWYgKG5vblVzZXJDaGFuZ2UpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ3ZSBhbHJlYWR5IHN0YXJ0ZWQgYSBub24gdXNlciBjaGFuZ2UiKTsvLyROT04tTkxTLTEkCi0JCW5vblVzZXJDaGFuZ2UgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENsaWVudHMgd2hvIGNhbGwgc3RhcnROb25Vc2VyQ2hhbmdlKCkgc2hvdWxkIGNhbGwgCi0JICogZmluaXNoTm9uVXNlckNoYW5nZSgpIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdGhlIGNoYW5nZSBpcyBkb25lLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vIGNoYW5nZSBpcyBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2hOb25Vc2VyQ2hhbmdlKCkgewotCQlpZiAoIW5vblVzZXJDaGFuZ2UpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ3ZSBhcmUgbm90IGluIGEgbm9uIHVzZXIgY2hhbmdlIik7Ly8kTk9OLU5MUy0xJAotCQlub25Vc2VyQ2hhbmdlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGEgcHJvZ3JhbW1hdGljIGNoYW5nZSBpcyBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vblVzZXJDaGFuZ2UoKSB7Ci0JCXJldHVybiBub25Vc2VyQ2hhbmdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5LZXlEb3duIDoKLQkJCQlpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5DUikKLQkJCQkJdGV4dENoYW5nZWQoKENvbnRyb2wpZXZlbnQud2lkZ2V0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULkZvY3VzT3V0IDoKLQkJCQl0ZXh0Q2hhbmdlZCgoQ29udHJvbClldmVudC53aWRnZXQpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWJzdHJhY3QgbWV0aG9kIG5vdGlmaWVkIHdoZW4gYSB0ZXh0IGZpZWxkIGhhcyBiZWVuIGNoYW5nZWQuCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0ZXh0Q2hhbmdlZChDb250cm9sIGNvbnRyb2wpOwotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoaXMgaGVscGVyIHdpdGggdGhlIGdpdmVuIGNvbnRyb2wgdG8gbGlzdGVuIGZvciBldmVudHMKLQkgKiB3aGljaCBpbmRpY2F0ZSB0aGF0IGEgY2hhbmdlIGlzIGluIHByb2dyZXNzIChvciBkb25lKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydExpc3RlbmluZ1RvKENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgdGhpcyk7Ci0JCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoaXMgaGVscGVyIHdpdGggdGhlIGdpdmVuIGNvbnRyb2wgdG8gbGlzdGVuIGZvciB0aGUKLQkgKiBFbnRlciBrZXkuICBXaGVuIEVudGVyIGlzIHByZXNzZWQsIHRoZSBjaGFuZ2UgaXMgY29uc2lkZXJlZCBkb25lIAotCSAqICh0aGlzIGlzIG9ubHkgYXBwcm9wcmlhdGUgZm9yIHNpbmdsZS1saW5lIFRleHQgd2lkZ2V0cykuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdGb3JFbnRlcihDb250cm9sIGNvbnRyb2wpIHsKLQkJLy8gTk9URTogS2V5RG93biByYXRoZXIgdGhhbiBLZXlVcCwgYmVjYXVzZSBvZiBzaW1pbGFyIHVzYWdlIGluIENDb21iby4gCi0JCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULktleURvd24sIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFVucmVnaXN0ZXJzIHRoaXMgaGVscGVyIGZyb20gYSBjb250cm9sIHByZXZpb3VzbHkgcGFzc2VkIHRvCi0JICogc3RhcnRMaXN0ZW5pbmdUbygpIGFuZC9vciBzdGFydExpc3RlbmluZ0ZvckVudGVyKCkuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZ1RvKENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Gb2N1c091dCwgdGhpcyk7Ci0JCWNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JCWNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULktleURvd24sIHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YmZkZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLQlwcml2YXRlIFdTRExUeXBlTWFwcGVyIHR5cGVNYXBwZXI7Ci0JCi0gIHByb3RlY3RlZCBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gbGFiZWxQcm92aWRlckV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBMYWJlbFByb3ZpZGVyW10gbGFiZWxQcm92aWRlcnM7Ci0gIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFdTRExMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdHlwZU1hcHBlciA9IG5ldyBXU0RMVHlwZU1hcHBlcigpOwotICAgIGVkaXRvclBhcnQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsgCi0gICAgbGFiZWxQcm92aWRlckV4dGVuc2lvbnMgPSByZWdpc3RyeS5nZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucyhXU0RMRWRpdG9yRXh0ZW5zaW9uLk9VVExJTkVfTEFCRUxfUFJPVklERVIpOyAKLSAgICBsYWJlbFByb3ZpZGVycyA9IG5ldyBMYWJlbFByb3ZpZGVyW2xhYmVsUHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aF07IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgbGFiZWxQcm92aWRlcnNbaV0gPSAoTGFiZWxQcm92aWRlcilsYWJlbFByb3ZpZGVyRXh0ZW5zaW9uc1tpXS5jcmVhdGVFeHRlbnNpb25PYmplY3QoV1NETEVkaXRvckV4dGVuc2lvbi5PVVRMSU5FX0xBQkVMX1BST1ZJREVSLCAoV1NETEVkaXRvcillZGl0b3JQYXJ0KTsKLSAgICB9Ci0gIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KQotCXsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0gICAgSW1hZ2UgcmVzdWx0ID0gbnVsbDsgICAgICAgICAgIAotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3RlZCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbilvYmplY3QpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgc2VsZWN0ZWQgID0gdHlwZU1hcHBlci5yZW1hcE9iamVjdChzZWxlY3RlZCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBsYWJlbFByb3ZpZGVyc1tpXS5nZXRJbWFnZShzZWxlY3RlZCk7Ci0gICAgICAgIGlmIChyZXN1bHQhPW51bGwpCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotLy8gICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihzZWxlY3RlZCk7Ci0vLyAgICAgICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHJlc3VsdCA9IChJbWFnZSltb2RlbEFkYXB0ZXIuZ2V0UHJvcGVydHkoc2VsZWN0ZWQsIE1vZGVsQWRhcHRlci5JTUFHRV9QUk9QRVJUWSk7ICAgICAKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KQotCXsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiAiTm8gaXRlbXMgc2VsZWN0ZWQiOy8vJE5PTi1OTFMtMSQKLQkJfQotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIE9iamVjdCBzZWxlY3RlZCA9IG51bGw7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgc2VsZWN0ZWQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIHNlbGVjdGVkICA9IHR5cGVNYXBwZXIucmVtYXBPYmplY3Qoc2VsZWN0ZWQpOwotICAgICAgCi0gICAgICAvLyBPdmVycmlkZSBvdXRsaW5lIHByb3ZpZGVyJ3MgZ2V0VGV4dCBmb3IgV1NETEVsZW1lbnRzCi0gICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgIHsKLSAgICAgIAlpZiAoKChXU0RMRWxlbWVudClzZWxlY3RlZCkuZ2V0RWxlbWVudCgpID09IG51bGwpIHsKLSAgICAgIAkJcmV0dXJuICIiOwotICAgICAgCX0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gICAgICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZ2V0QWRhcHRlcihzZWxlY3RlZCk7Ci0gICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpc1JlYWRPbmx5ID0gQm9vbGVhbi5UUlVFLmVxdWFscyhhZGFwdGVyLmdldFByb3BlcnR5KHNlbGVjdGVkLCAiaXNSZWFkT25seSIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNSZWFkT25seSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICgoV1NETEVsZW1lbnQpc2VsZWN0ZWQpLmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKSArICIgKCIgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9SRUFEX09OTFkiKSArICIpIjsgICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gKChXU0RMRWxlbWVudClzZWxlY3RlZCkuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICAvLyBPdmVycmlkZSBmb3IgWFNEIENvbXBvbmVudHMKLSAgICAgICAKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZCkuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZCkuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWQpLmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKSArICIgKCIgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9SRUFEX09OTFkiKSArICIpIjsgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAiKCIgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9SRUFEX09OTFkiKSArICIpIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICAvLyBvdGhlcndpc2UgZ2V0IGl0IGZyb20gdGhlIGV4dGVuc2lvbnMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxQcm92aWRlcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGxhYmVsUHJvdmlkZXJzW2ldLmdldFRleHQoc2VsZWN0ZWQpOwotICAgICAgICBpZiAocmVzdWx0IT1udWxsKQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikKLSAgICB7Ci0gICAgfQotICAgIAotCi0gICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgYSBtdWx0aXBsZSBvYmplY3Qgc2VsZWN0aW9uIGhhcyBiZWVuIHBhc3NlZCB0byB0aGUgCi0JICogbGFiZWwgcHJvdmlkZXIuIElmIHRoZSBvYmplY3RzIGlzIGEgSVN0cnVjdHVyZWRTZWxlY3Rpb24sIHNlZSBpZiAKLQkgKiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHNlbGVjdGlvbiBhcmUgdGhlIHNhbWUgYW5kIGlmIHNvLCB3ZSB3YW50Ci0JICogdG8gcHJvdmlkZSBsYWJlbHMgZm9yIHRoZSBjb21tb24gc2VsZWN0ZWQgZWxlbWVudC4KLQkgKiBAcGFyYW0gb2JqZWN0cyBhIHNpbmdsZSBvYmplY3Qgb3IgYSBJU3RydWN0dXJlZFNlbGVjdGlvbi4KLQkgKiBAcGFyYW0gbXVsdGlwbGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgdHJ1ZSBpZiB0aGVyZSBpcyBtdWx0aXBsZQotCSAqIHVuZXF1YWwgc2VsZWN0ZWQgZWxlbWVudHMgaW4gYSBJU3RydWN0dXJlZFNlbGVjdGlvbi4KLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgdG8gZ2V0IGxhYmVscyBmb3IuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0T2JqZWN0KE9iamVjdCBvYmplY3RzLCBib29sZWFuIG11bHRpcGxlW10pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChvYmplY3RzKTsKLQkJT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vV1NETFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2QxNjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyRXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyW10gcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyczsKLQotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGxhYmVsUHJvdmlkZXJFeHRlbnNpb25zOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSB7fTsKLSAgCi0gIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFdTRExTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgLy8gVE9ETyBDaGVjayB0aGlzCi0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIjZ2V0U2VjdGlvbkRlc2NyaXB0b3JzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbkRlc2NyaXB0b3JbXSBnZXRTZWN0aW9uRGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIAotICAgIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsgCi0KLSAgICBwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJFeHRlbnNpb25zID0gcmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoV1NETEVkaXRvckV4dGVuc2lvbi5QUk9QRVJUWV9TRUNUSU9OX0RFU0NSSVBUT1JfUFJPVklERVIpOyAKLSAgICBwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJzID0gbmV3IElTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyW3Byb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoXTsgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcnNbaV0gPSAoSVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIpcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyRXh0ZW5zaW9uc1tpXS5jcmVhdGVFeHRlbnNpb25PYmplY3QoV1NETEVkaXRvckV4dGVuc2lvbi5QUk9QRVJUWV9TRUNUSU9OX0RFU0NSSVBUT1JfUFJPVklERVIsIChXU0RMRWRpdG9yKWVkaXRvclBhcnQpOwotICAgICAgCi0gICAgICBJU2VjdGlvbkRlc2NyaXB0b3IgW10gZXh0ZW5zaW9uU2VjdGlvbkRlc2NyaXB0b3JzID0gcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyc1tpXS5nZXRTZWN0aW9uRGVzY3JpcHRvcnMoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0ZW5zaW9uU2VjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChleHRlbnNpb25TZWN0aW9uRGVzY3JpcHRvcnNbal0pOwotICAgICAgfQotICAgIH0KLQotICAgIAotICAgIGxpc3QuYWRkKG5ldyBOYW1lU2VjdGlvbkRlc2NyaXB0b3IoKSk7Ci0gICAgbGlzdC5hZGQobmV3IFBhcnRTZWN0aW9uRGVzY3JpcHRvcigpKTsKLSAgICBsaXN0LmFkZChuZXcgRG9jdW1lbnRhdGlvblNlY3Rpb25EZXNjcmlwdG9yKCkpOwotICAgIGxpc3QuYWRkKG5ldyBSZWZlcmVuY2VTZWN0aW9uRGVzY3JpcHRvcigpKTsKLSAgICBsaXN0LmFkZChuZXcgTmFtZXNwYWNlU2VjdGlvbkRlc2NyaXB0b3IoKSk7Ci0gICAgbGlzdC5hZGQobmV3IEV4dGVuc2liaWxpdHlFbGVtZW50U2VjdGlvbkRlc2NyaXB0b3IoKSk7Ci0gICAgbGlzdC5hZGQobmV3IEltcG9ydFNlY3Rpb25EZXNjcmlwdG9yKCkpOwotICAgIAotCQlJU2VjdGlvbkRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBJU2VjdGlvbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCSAgbGlzdC50b0FycmF5KGRlc2NyaXB0b3JzKTsKLQotICAgIHJldHVybiBkZXNjcmlwdG9yczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTZiNjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXcuZXZlbnRzLklOb2RlU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3LmV2ZW50cy5Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETFNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJTm9kZVNlbGVjdGlvbkxpc3RlbmVyLCBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotewotICBwcml2YXRlIFdTRExTZWxlY3Rpb25NYW5hZ2VyIGZWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyOwotICBwcml2YXRlIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJpdmF0ZSBPYmplY3QgY3VycmVudE9iamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IKLSAgICovCi0gIHB1YmxpYyBXU0RMVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UoSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciwgV1NETEVkaXRvciBlZGl0b3IpCi0gIHsKLSAgICBzdXBlcih0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKTsKLSAgICB0aGlzLndzZGxFZGl0b3IgPSBlZGl0b3I7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAJd3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpKSk7Ci0gIH0KLSAgCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uTWFuYWdlcihXU0RMU2VsZWN0aW9uTWFuYWdlciB2aWV3ZXJTZWxlY3Rpb25NYW5hZ2VyKSB7Ci0JCS8vIGRpc2Nvbm5lY3QgZnJvbSBvbGQgb25lCi0JCWlmIChmVmlld2VyU2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlmVmlld2VyU2VsZWN0aW9uTWFuYWdlciA9IHZpZXdlclNlbGVjdGlvbk1hbmFnZXI7Ci0KLQkJLy8gY29ubmVjdCB0byBuZXcgb25lCi0JCWlmIChmVmlld2VyU2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uTWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JewotCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZChnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkgICAgLy9zdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpLCBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0gIAotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgLy8gb3ZlcnJpZGUgZm9yIGNhdGVnb3J5Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICAgIGlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBPYmplY3Qgb2JqID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgTm9kZSBub2RlID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXROb2RlRm9yT2JqZWN0KG9iaik7Ci0gICAgICAgIE9iamVjdCBvID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpLCAoRWxlbWVudClub2RlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGJhZCBoYWNrIHRvIGdldCBzY2hlbWEgZnJvbSBjYXRlZ29yeQotICAgICAgICAvLyB1bnRpbCB3ZSBwcm92aWRlIGEgYmV0dGVyIG1lY2hhbmlzbSAoc2VsZWN0aW9uIG1hbmFnZXIgZXh0ZW5zaW9uKQotICAgICAgICAvLyBzZWUgYWxzbyBXU0RMR3JhcGhWaWV3ZXIKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIG9iaiA9ICgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgfSAKLSAgICAgIAkKLSAgICAgICAgYXR0YWNoTGlzdGVuZXIobyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHN1cGVyLnNlbGVjdGlvbkNoYW5nZWQod3NkbEVkaXRvci5nZXRFZGl0b3JQYXJ0KCksIHNlbGVjdGlvbik7ICAgLy8gZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOyAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoTGlzdGVuZXIoT2JqZWN0IG9iamVjdCkKLSAgewotICAJV1NETE1vZGVsQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpOwotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihvYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgIAkvLyByZW1vdmUgbGlzdGVuZXIgZnJvbSB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBvYmplY3QKLSAgICAJcmVtb3ZlTGlzdGVuZXIoY3VycmVudE9iamVjdCk7Ci0gICAgCQotICAgIAkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIG5ld2x5IHNlbGVjdGVkIG9iamVjdAotICAgIAlhZGFwdGVyLmFkZExpc3RlbmVyKHRoaXMpOwotICAgIAljdXJyZW50T2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLSAgfSAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUxpc3RlbmVyKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgCVdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gV1NETE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0V1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIob2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjdXJyZW50T2JqZWN0ID0gbnVsbDsKLSAgICB9Ci0gIH0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkaXNjb25uZWN0IGZyb20gdGhlIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIKLQkJaWYgKGZWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQkKLQkJLy8gZGlzY29ubmVjdCBsaXN0ZW5lciBmcm9tIHRoZSBjdXJyZW50IG9iamVjdAotCQlpZiAoY3VycmVudE9iamVjdCAhPSBudWxsKSB7Ci0JCQlyZW1vdmVMaXN0ZW5lcihjdXJyZW50T2JqZWN0KTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0uc3NlLmVkaXRvci52aWV3LmV2ZW50cy5JTm9kZVNlbGVjdGlvbkxpc3RlbmVyI25vZGVTZWxlY3Rpb25DaGFuZ2VkKGNvbS5pYm0uc3NlLmVkaXRvci52aWV3LmV2ZW50cy5Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgbm9kZVNlbGVjdGlvbkNoYW5nZWQoTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gIAlpZiAoZ2V0Q3VycmVudFRhYigpICE9IG51bGwpIHsKLSAgCQlyZWZyZXNoKCk7Ci0gIAl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMVHlwZU1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExUeXBlTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZWQwNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExUeXBlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMVHlwZU1hcHBlciBpbXBsZW1lbnRzIElUeXBlTWFwcGVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVR5cGVNYXBwZXIjcmVtYXBUeXBlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLSAgICovCi0gIHB1YmxpYyBDbGFzcyByZW1hcFR5cGUoT2JqZWN0IG9iamVjdCwgQ2xhc3MgZWZmZWN0aXZlVHlwZSkKLSAgewotCQlDbGFzcyB0eXBlID0gZWZmZWN0aXZlVHlwZTsKLQkJCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpIHsKLQkJCXR5cGUgPSAoKFdTRExHcm91cE9iamVjdCkgb2JqZWN0KS5nZXREZWZpbml0aW9uKCkuZ2V0Q2xhc3MoKTsKLQkJfQotCi0JCXJldHVybiB0eXBlOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IHJlbWFwT2JqZWN0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBPYmplY3QgdHlwZSA9IG9iamVjdDsKLSAgICAKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgIHsKLSAgICAgIHR5cGUgPSAoKFdTRExHcm91cE9iamVjdCkgb2JqZWN0KS5nZXREZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiB0eXBlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL0V4dGVuc2libGVOb2RlUmVjb25jaWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVjb25jaWxlci9FeHRlbnNpYmxlTm9kZVJlY29uY2lsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhMDc1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL0V4dGVuc2libGVOb2RlUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSU5vZGVSZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLS8vIFRPRE8uLiB3ZSBzaG91bGQgcHJvYmFibHkgYmUga2V5aW5nIG9mZiBvZiB0aGUgbm9kZSdzIHFuYW1lIChwZXJoYXBzIHN1cHBvcnRpbmcgJ251bGwnIGFzIGEgd2lsZCBjYXJkIGZvciBsb2NhbCBuYW1lcykgCi0vLyBpbiBvcmRlciB0byBjb21wdXRlIGFuIGFwcGxpY2FibGUgcmVjb25jaWxlcgotLy8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlTm9kZVJlY29uY2lsZXIKLXsgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBJTm9kZVJlY29uY2lsZXJbXSByZWNvbmNpbGVyczsKLQotICBwdWJsaWMgRXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uTk9ERV9SRUNPTkNJTEVSKTsgCi0gICAgcmVjb25jaWxlcnMgPSBuZXcgSU5vZGVSZWNvbmNpbGVyW2V4dGVuc2lvbnMubGVuZ3RoXTsgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHJlY29uY2lsZXJzW2ldID0gKElOb2RlUmVjb25jaWxlcilleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk5PREVfUkVDT05DSUxFUiwgbnVsbCk7Ci0gICAgfQotICB9ICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIElOb2RlUmVjb25jaWxlciBnZXRBcHBsaWNhYmxlTm9kZVJlY29uY2lsZXIoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIElOb2RlUmVjb25jaWxlciByZWNvbmNpbGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0uaXNBcHBsaWNhYmxlKG9iamVjdCkpCi0gICAgICB7Ci0gICAgICAgIHJlY29uY2lsZXIgPSByZWNvbmNpbGVyc1tpXTsKLSAgICAgICAgaWYgKHJlY29uY2lsZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWNvbmNpbGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChPYmplY3QgbW9kZWxPYmplY3QsIEVsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpICAgICAgICAgICAgIAotICB7Ci0gICAgSU5vZGVSZWNvbmNpbGVyIHJlY29uY2lsZXIgPSBnZXRBcHBsaWNhYmxlTm9kZVJlY29uY2lsZXIobW9kZWxPYmplY3QpOwotICAgIGlmIChyZWNvbmNpbGVyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJlY29uY2lsZXIubm90aWZ5Q2hhbmdlZChtb2RlbE9iamVjdCwgZWxlbWVudCwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlY29uY2lsZXIvU0VERG9jdW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL1NFRERvY3VtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTAxM2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlY29uY2lsZXIvU0VERG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyOyAgICAKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBTRUREb2N1bWVudEFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsgICAKLSAgcHJvdGVjdGVkIEV4dGVuc2libGVOb2RlUmVjb25jaWxlciBleHRlbnNpYmxlTm9kZVJlY29uY2lsZXI7Ci0gIAotICBwdWJsaWMgU0VERG9jdW1lbnRBZGFwdGVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgeyAgICAgICAgICAgCi0gICAgdGhpcy5kb2N1bWVudCA9IChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgPyAoKElET01Nb2RlbCltb2RlbCkuZ2V0RG9jdW1lbnQoKSA6IG51bGw7ICAgICAKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMuZXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyID0gbmV3IEV4dGVuc2libGVOb2RlUmVjb25jaWxlcigpOwotICAgIG5ldyBNeURvY3VtZW50QWRhcHRlcihkb2N1bWVudCk7Ci0gIH0gIAotIAotCi0gIGNsYXNzIE15RG9jdW1lbnRBZGFwdGVyIGV4dGVuZHMgRG9jdW1lbnRBZGFwdGVyCi0gIHsKLS8vICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRGVmaW5pdGlvbiA9IHRydWU7Ci0gICAgCi0gICAgTXlEb2N1bWVudEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgewotICAgICAgc3VwZXIoZG9jdW1lbnQpOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQpCi0gICAgICB7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBhZGFwdCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0KLSAgICAgICAgICAvLyBTZWUgQnVnIDUzNjYKLSAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN5bmMgdXAgdGhlIE1vZGVsIGFuZCB0aGUgRE9NCi0gICAgICAgICAgRWxlbWVudCBuZXdEb2N1bWVudEVsZW1lbnQgPSAoRWxlbWVudCluZXdWYWx1ZTsKLSAgICAgICAgICBTdHJpbmcgd3NkbFByZWZpeCA9IG5ld0RvY3VtZW50RWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgICAgICBpZiAod3NkbFByZWZpeCA9PSBudWxsKSB3c2RsUHJlZml4ID0gIiI7Ci0gICAgICAgICAgU3RyaW5nIG5zID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2Uod3NkbFByZWZpeCk7Ci0gICAgICAgICAgaWYgKG5zICE9IG51bGwgJiYgbnMuZXF1YWxzKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKQotICAgICAgICAgICAgICYmIG5ld0RvY3VtZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5ERUZJTklUSU9OX0VMRU1FTlRfVEFHKSkgLy8gJiYKLSAgICAgICAgICAgICAvLyAhaXNWYWxpZERlZmluaXRpb24pCi0gICAgICAgICAgewotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKiBTZXR0aW5nIG5ldyBkZWZpbml0aW9uIik7Ci0gICAgICAgICAgICBkZWZpbml0aW9uLnNldEVsZW1lbnQobmV3RG9jdW1lbnRFbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgCi0gICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gd2UgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHJlY29uY2lsaW5nIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYnkgb25lIG9mIHRoZXNlIG5vdGlmaWNhdGlvbnMgCi0gICAgICAgIC8vIChBREQgYW5kIFJFTU9WRSBub3RpZmljYXRpb25zIGFyZSBvbWl0dGVkKQotICAgICAgICAvLwotICAgICAgICBjYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFOiAKLSAgICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEOgotICAgICAgICBjYXNlIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEOgotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChub3RpZmllciBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVjb25jaWxlTW9kZWxPYmplY3RGb3JFbGVtZW50KChFbGVtZW50KW5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChub3RpZmllciBpbnN0YW5jZW9mIERvY3VtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KW5vdGlmaWVyOwotICAgICAgICAgICAgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IG51bGw7ICAgICAgICAgIAotCi0gICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgICAgICAgICAgICBpZiAoV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShlbGVtZW50KSA9PSBXU0RMQ29uc3RhbnRzLkRFRklOSVRJT04pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETy4uLiByZXZpc2l0IGRlZmluaXRpb24ucmVtb3ZlQWxsQ29udGVudCgpIGFuZCB3aG8gc2hvdWxkIGNhbGwgdGhpcz8KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBpc1ZhbGlkRGVmaW5pdGlvbiA9IHRydWU7Ci0vLyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWQUxJRCBERUZJTklUSU9OIEVMRU1FTlQiKTsKLSAgICAgICAgICAgICAgKChEZWZpbml0aW9uSW1wbClkZWZpbml0aW9uKS5lbGVtZW50Q2hhbmdlZChkZWZpbml0aW9uRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJTlZBTElEIERFRklOSVRJT04gRUxFTUVOVCIpOwotLy8gICAgICAgICAgICAgIGlzVmFsaWREZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbENvbnRlbnQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGVNb2RlbE9iamVjdEZvckVsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoZGVmaW5pdGlvbiwgZWxlbWVudCk7ICAKLSAgICAgIGlmIChtb2RlbE9iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgZWUgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKW1vZGVsT2JqZWN0OwotICAgICAgICAgICgoWFNEU2NoZW1hSW1wbCllZS5nZXRTY2hlbWEoKSkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICAgICAgZWUuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7ICAgICAgICAgICAgCi0gICAgICAgIH0JCQotICAgICAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgICgoV1NETEVsZW1lbnRJbXBsKW1vZGVsT2JqZWN0KS5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgKChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbE9iamVjdCkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICAgICAgZXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyLm5vdGlmeUNoYW5nZWQobW9kZWxPYmplY3QsIGVsZW1lbnQsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7ICAgICAKLSAgICAgICAgfQotICAgICAgfSAJICAKLSAgICB9ICAgCi0gIH0KLSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLy8gQW4gYWJzdHJhY3QgYWRhcHRlciB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgY2hpbGRyZW4gb2YgYSBuZXcgTm9kZSBhcmUgYWxzbyBhZGFwdGVkCi0gIC8vCi0gIGFic3RyYWN0IGNsYXNzIERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlcgotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgewotICAgICAgKChJTm9kZU5vdGlmaWVyKWRvY3VtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotCi0gICAgICBmb3IgKE5vZGUgY2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICBhZGFwdCgoRWxlbWVudCljaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIAotICAgIHB1YmxpYyB2b2lkIGFkYXB0KEVsZW1lbnQgZWxlbWVudCkKLSAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKElOb2RlTm90aWZpZXIpZWxlbWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKHRoaXMpID09IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgICgoSU5vZGVOb3RpZmllcillbGVtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotICAgICAgICAKLSAgICAgICAgICBmb3IgKE5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhZGFwdCgoRWxlbWVudCljaGlsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSB0aGlzOwotICAgIH0KLSAgCi0gICAgYWJzdHJhY3QgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCk7ICAKLSAgfQotfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC90eXBlc3lzdGVtL0V4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3R5cGVzeXN0ZW0vRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDZkZjc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3R5cGVzeXN0ZW0vRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50eXBlc3lzdGVtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVHlwZVN5c3RlbVByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gZXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElUeXBlU3lzdGVtUHJvdmlkZXJbXSB0eXBlU3lzdGVtUHJvdmlkZXJzOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSB7fTsKLQotICBwdWJsaWMgRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlcihXU0RMRWRpdG9yIHdzZGxFZGl0b3IpCi0gIHsKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCi0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uVFlQRV9TWVNURU1fUFJPVklERVIpOyAKLSAgICB0eXBlU3lzdGVtUHJvdmlkZXJzID0gbmV3IElUeXBlU3lzdGVtUHJvdmlkZXJbZXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdHlwZVN5c3RlbVByb3ZpZGVyc1tpXSA9IChJVHlwZVN5c3RlbVByb3ZpZGVyKWV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uVFlQRV9TWVNURU1fUFJPVklERVIsIHdzZGxFZGl0b3IpOwotICAgIH0KLSAgfSAgICAgICAgICAKLSAgICAgICAgCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVR5cGVOYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCB0eXBlTmFtZUNhdGVnb3J5KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVN5c3RlbVByb3ZpZGVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsaXN0LmFkZEFsbCh0eXBlU3lzdGVtUHJvdmlkZXJzW2ldLmdldEF2YWlsYWJsZVR5cGVOYW1lcyhkZWZpbml0aW9uLCB0eXBlTmFtZUNhdGVnb3J5KSk7Ci0gICAgfSAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUeXBlcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFhTRFNjaGVtYSBzY2hlbWEsIGludCB0eXBlTmFtZUNhdGVnb3J5KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVN5c3RlbVByb3ZpZGVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsaXN0LmFkZEFsbCh0eXBlU3lzdGVtUHJvdmlkZXJzW2ldLmdldEF2YWlsYWJsZVR5cGVzKGRlZmluaXRpb24sIHNjaGVtYSwgdHlwZU5hbWVDYXRlZ29yeSkpOwotICAgIH0gICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUVsZW1lbnROYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlU3lzdGVtUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGxpc3QuYWRkQWxsKHR5cGVTeXN0ZW1Qcm92aWRlcnNbaV0uZ2V0QXZhaWxhYmxlRWxlbWVudE5hbWVzKGRlZmluaXRpb24pKTsKLSAgICB9ICAgICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Q2F0ZWdvcnlGb3JUeXBlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgewotICAgIGludCByZXN1bHQgPSBVTktOT1dOX1RZUEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlU3lzdGVtUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHR5cGVTeXN0ZW1Qcm92aWRlcnNbaV0uZ2V0Q2F0ZWdvcnlGb3JUeXBlTmFtZShkZWZpbml0aW9uLCB0eXBlTmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IFVOS05PV05fVFlQRSkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldFByZWZpeGVkTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gIAkgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVTeXN0ZW1Qcm92aWRlcnMubGVuZ3RoOyBpKyspCi0gICAgIHsKLSAgICAgICBsaXN0LmFkZEFsbCh0eXBlU3lzdGVtUHJvdmlkZXJzW2ldLmdldFByZWZpeGVkTmFtZXMoZGVmaW5pdGlvbiwgbmFtZXNwYWNlLCBsb2NhbE5hbWUpKTsKLSAgICAgfSAgICAgCi0gICAgIHJldHVybiBsaXN0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRSZWZlcmVuY2VVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudFJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkMzE5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudFJlZmVyZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuSW1wb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENvbXBvbmVudFJlZmVyZW5jZVV0aWwKLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gcm9vdERlZmluaXRpb247Ci0KLSAgcHVibGljIENvbXBvbmVudFJlZmVyZW5jZVV0aWwoRGVmaW5pdGlvbiByb290RGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMucm9vdERlZmluaXRpb24gPSByb290RGVmaW5pdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0VxdWFsKFN0cmluZyBhLCBTdHJpbmcgYikKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKGEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBhLmVxdWFscyhiKSB8fCAoYS5sZW5ndGgoKSA9PSAwICYmIGIgPT0gbnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoYiA9PSBudWxsIHx8IGIubGVuZ3RoKCkgPT0gMCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNFcXVhbElucHV0TmFtZShPcGVyYXRpb24gb3BlcmF0aW9uLCBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIElucHV0IG9wZXJhdGlvbklucHV0ID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpOwotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nT3BlcmF0aW9uSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKTsKLQotICAgIGlmIChvcGVyYXRpb25JbnB1dCAhPSBudWxsICYmIGJpbmRpbmdPcGVyYXRpb25JbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzRXF1YWwob3BlcmF0aW9uSW5wdXQuZ2V0TmFtZSgpLCBiaW5kaW5nT3BlcmF0aW9uSW5wdXQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob3BlcmF0aW9uSW5wdXQgPT0gbnVsbCAmJiBiaW5kaW5nT3BlcmF0aW9uSW5wdXQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRXF1YWxPdXRwdXROYW1lKE9wZXJhdGlvbiBvcGVyYXRpb24sIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgT3V0cHV0IG9wZXJhdGlvbk91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3BlcmF0aW9uT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpOwotCi0gICAgaWYgKG9wZXJhdGlvbk91dHB1dCAhPSBudWxsICYmIGJpbmRpbmdPcGVyYXRpb25PdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpc0VxdWFsKG9wZXJhdGlvbk91dHB1dC5nZXROYW1lKCksIGJpbmRpbmdPcGVyYXRpb25PdXRwdXQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob3BlcmF0aW9uT3V0cHV0ID09IG51bGwgJiYgYmluZGluZ09wZXJhdGlvbk91dHB1dCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZ0JpbmRpbmcoT3BlcmF0aW9uIG9wZXJhdGlvbiwgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIGlzRXF1YWwob3BlcmF0aW9uLmdldE5hbWUoKSwgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpICYmIGlzRXF1YWxJbnB1dE5hbWUob3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uKSAmJiBpc0VxdWFsT3V0cHV0TmFtZShvcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb24pOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UG9ydHNGb3JQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTZXJ2aWNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGoubmV4dCgpOwotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZy5nZXRFUG9ydFR5cGUoKSA9PSBwb3J0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHBvcnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UG9ydHNGb3JCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTZXJ2aWNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGoubmV4dCgpOwotICAgICAgICBpZiAocG9ydC5nZXRFQmluZGluZygpID09IGJpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChwb3J0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdPcGVyYXRpb25zKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotCi0gICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGdldEVuY2xvc2luZ1BvcnRUeXBlKG9wZXJhdGlvbik7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRCaW5kaW5ncyhwb3J0VHlwZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24ob3BlcmF0aW9uLCBiaW5kaW5nKTsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gZ2V0QmluZGluZ09wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uLCBCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgai5uZXh0KCk7Ci0gICAgICBpZiAoaXNNYXRjaGluZ0JpbmRpbmcob3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ0lucHV0IGdldEJpbmRpbmdJbnB1dChJbnB1dCBpbnB1dCwgQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZ2V0QmluZGluZ09wZXJhdGlvbigoT3BlcmF0aW9uKSBpbnB1dC5lQ29udGFpbmVyKCksIGJpbmRpbmcpOwotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uICE9IG51bGwgPyBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ091dHB1dCBnZXRCaW5kaW5nT3V0cHV0KE91dHB1dCBvdXRwdXQsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24oKE9wZXJhdGlvbikgb3V0cHV0LmVDb250YWluZXIoKSwgYmluZGluZyk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCA/IGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ0ZhdWx0IGdldEJpbmRpbmdGYXVsdChGYXVsdCBmYXVsdCwgQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgQmluZGluZ0ZhdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLSAgICBpZiAoZmF1bHROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZ2V0QmluZGluZ09wZXJhdGlvbigoT3BlcmF0aW9uKSBmYXVsdC5lQ29udGFpbmVyKCksIGJpbmRpbmcpOwotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEJpbmRpbmdGYXVsdCkgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHQoZmF1bHROYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBFT2JqZWN0IGdldEJpbmRpbmdPYmplY3QoRU9iamVjdCBpbnRlcmZhY2VPYmplY3QsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIEVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgSW5wdXQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0QmluZGluZ0lucHV0KChJbnB1dCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEJpbmRpbmdPdXRwdXQoKE91dHB1dCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgRmF1bHQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0QmluZGluZ0ZhdWx0KChGYXVsdCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEJpbmRpbmdPcGVyYXRpb24oKE9wZXJhdGlvbikgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgUG9ydFR5cGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gYmluZGluZzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdJbnB1dHMoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBvcGVyYXRpb25zID0gZ2V0QmluZGluZ09wZXJhdGlvbnMoKE9wZXJhdGlvbikgaW5wdXQuZUNvbnRhaW5lcigpKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvcGVyYXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5nT3V0cHV0cyhPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvdXRwdXQuZUNvbnRhaW5lcigpOwotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IG9wZXJhdGlvbnMgPSBnZXRCaW5kaW5nT3BlcmF0aW9ucyhvcGVyYXRpb24pOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5nRmF1bHRzKEZhdWx0IGZhdWx0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBmYXVsdE5hbWUgPSBmYXVsdC5nZXROYW1lKCk7Ci0gICAgaWYgKGZhdWx0TmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBmYXVsdC5lQ29udGFpbmVyKCk7Ci0gICAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IGdldEJpbmRpbmdPcGVyYXRpb25zKG9wZXJhdGlvbik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdGYXVsdChmYXVsdE5hbWUpOwotICAgICAgICAgIGlmIChiaW5kaW5nRmF1bHQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZChiaW5kaW5nRmF1bHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCBQb3J0VHlwZSBnZXRFbmNsb3NpbmdQb3J0VHlwZShPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIChQb3J0VHlwZSkgb3BlcmF0aW9uLmVDb250YWluZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdzKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICByZXR1cm4gZ2V0QmluZGluZ3MoZ2V0RW5jbG9zaW5nUG9ydFR5cGUob3BlcmF0aW9uKSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5ncyhQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBkZWZpbml0aW9uLmdldEJpbmRpbmdzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgai5uZXh0KCk7Ci0gICAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsIHx8IGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSA9PSBwb3J0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ3NXaXRob3V0T3BlcmF0aW9uKFBvcnRUeXBlIHBvcnRUeXBlLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBiaW5kaW5ncyA9IGdldEJpbmRpbmdzKHBvcnRUeXBlKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGkubmV4dCgpOwotICAgICAgICBib29sZWFuIGhhc05hbWUgPSBmYWxzZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBqLm5leHQoKTsKLSAgICAgICAgICBpZiAob3BlcmF0aW9uTmFtZS5lcXVhbHMoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhc05hbWUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghaGFzTmFtZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hZGQoYmluZGluZyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdzKCkKLSAgewotICAgIHJldHVybiBnZXRCaW5kaW5ncygoUG9ydFR5cGUpIG51bGwpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ05hbWVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRCaW5kaW5ncygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKGJpbmRpbmcuZ2V0UU5hbWUoKSkpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFBvcnRUeXBlTmFtZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGRlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgai5uZXh0KCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKGdldFByZWZpeGVkTmFtZXMocG9ydFR5cGUuZ2V0UU5hbWUoKSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFNlcnZpY2VzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChkZWZpbml0aW9uLmdldEVTZXJ2aWNlcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRQb3J0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RVBvcnRUeXBlcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSk7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChkZWZpbml0aW9uLmdldEVUeXBlcygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldE1lc3NhZ2VOYW1lcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gZGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIGoubmV4dCgpOwotICAgICAgICBsaXN0LmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKG1lc3NhZ2UuZ2V0UU5hbWUoKSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldERlZmluaXRpb25zKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBhZGREZWZpbml0aW9uKHJvb3REZWZpbml0aW9uLCBsaXN0KTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAtLSB3ZSBzaG91bGQgYWx3YXlzIHVzZSBnZXRQcmVmaXhlZE5hbWVzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeGVkTmFtZShRTmFtZSBxbmFtZSkKLSAgewotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gcm9vdERlZmluaXRpb24uZ2V0UHJlZml4KHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IHByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFByZWZpeGVkTmFtZXMoUU5hbWUgcW5hbWUpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTWFwIG1hcCA9IHJvb3REZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpIG1hcC5nZXQocHJlZml4KTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsICYmIG5hbWVzcGFjZS5lcXVhbHMocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUgPSBwcmVmaXgubGVuZ3RoKCkgPiAwID8gcHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgIGxpc3QuYWRkKG5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIExpc3QgbGlzdCkKLSAgewotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoZGVmaW5pdGlvbik7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBJbXBvcnRJbXBsIHRoZUltcG9ydCA9IChJbXBvcnRJbXBsKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKHRoZUltcG9ydC5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwgJiYgIXRoZUltcG9ydC5nZXRMb2NhdGlvblVSSSgpLmVuZHNXaXRoKCJ4c2QiKSkKLSAgICAgICAgewotICAgICAgICAgIHRoZUltcG9ydC5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsJIAotICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0ZWREZWZpbml0aW9uID0gKERlZmluaXRpb24pIHRoZUltcG9ydC5nZXRFRGVmaW5pdGlvbigpOwotICAgICAgICAgIGlmIChpbXBvcnRlZERlZmluaXRpb24gIT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhpbXBvcnRlZERlZmluaXRpb24pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZERlZmluaXRpb24oaW1wb3J0ZWREZWZpbml0aW9uLCBsaXN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0VHlwZVJlZmVyZW5jZShCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBvcnRUeXBlUmVmZXJlbmNlKEJpbmRpbmcgYmluZGluZywgU3RyaW5nIHBvcnRUeXBlKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGJpbmRpbmcpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBwb3J0VHlwZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmluZGluZ1JlZmVyZW5jZShQb3J0IHBvcnQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocG9ydCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiYmluZGluZyIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRQb3J0VHlwZVJlZmVyZW5jZVFOYW1lKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIFFOYW1lIHJlc3VsdCA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gYmluZGluZy5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgU3RyaW5nIHByZWZpeGVkTmFtZSA9IGdldFBvcnRUeXBlUmVmZXJlbmNlKGJpbmRpbmcpOwotICAgIGlmIChwcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yVXRpbC5jcmVhdGVRTmFtZShkZWZpbml0aW9uLCBwcmVmaXhlZE5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRCaW5kaW5nUmVmZXJlbmNlUU5hbWUoUG9ydCBwb3J0KQotICB7Ci0gICAgUU5hbWUgcmVzdWx0ID0gbnVsbDsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBwb3J0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gZ2V0QmluZGluZ1JlZmVyZW5jZShwb3J0KTsKLSAgICBpZiAocHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclV0aWwuY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgcHJlZml4ZWROYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZWZlcmVuY2UoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZUhlbHBlcihpbnB1dCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVmZXJlbmNlKE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZUhlbHBlcihvdXRwdXQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlZmVyZW5jZShGYXVsdCBmYXVsdCkKLSAgewotICAgIHJldHVybiBnZXRNZXNzYWdlUmVmZXJlbmNlSGVscGVyKGZhdWx0KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKElucHV0IGlucHV0KQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZUhlbHBlcihpbnB1dCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZShPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZUhlbHBlcihvdXRwdXQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRNZXNzYWdlUmVmZXJlbmNlUU5hbWUoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lSGVscGVyKGZhdWx0KTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZWZlcmVuY2VIZWxwZXIoV1NETEVsZW1lbnQgbykKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvKTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJtZXNzYWdlIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZUhlbHBlcihXU0RMRWxlbWVudCBvKQotICB7Ci0gICAgUU5hbWUgcmVzdWx0ID0gbnVsbDsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBvLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gZ2V0TWVzc2FnZVJlZmVyZW5jZUhlbHBlcihvKTsKLSAgICBpZiAocHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclV0aWwuY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgcHJlZml4ZWROYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVQb3J0VHlwZVJlZmVyZW5jZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICBRTmFtZSBxbmFtZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0UG9ydFR5cGVSZWZlcmVuY2VRTmFtZShiaW5kaW5nKTsKLQotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSAocW5hbWUgIT0gbnVsbCkgPyAoUG9ydFR5cGUpIGRlZmluaXRpb24uZ2V0UG9ydFR5cGUocW5hbWUpIDogbnVsbDsKLQotICAgICAgaWYgKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSAhPSBwb3J0VHlwZSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5zZXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUJpbmRpbmdSZWZlcmVuY2VzKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGkubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBqLm5leHQoKTsKLSAgICAgICAgUU5hbWUgcW5hbWUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldEJpbmRpbmdSZWZlcmVuY2VRTmFtZShwb3J0KTsKLQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAocW5hbWUgIT0gbnVsbCkgPyAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKSA6IG51bGw7Ci0KLSAgICAgICAgaWYgKHBvcnQuZ2V0QmluZGluZygpICE9IGJpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBwb3J0LnNldEJpbmRpbmcoYmluZGluZyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlTWVzc2FnZVJlZmVyZW5jZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgLy8gZm9yIGVhY2ggcG9ydCB0eXBlCi0gICAgLy8KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldFBvcnRUeXBlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgaS5uZXh0KCk7Ci0KLSAgICAgIC8vIGZvciBlYWNoIG9wZXJhdGlvbgotICAgICAgLy8KLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgai5uZXh0KCk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIElucHV0Ci0gICAgICAgIC8vCi0gICAgICAgIElucHV0IGlucHV0ID0gKElucHV0KSBvcGVyYXRpb24uZ2V0SW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxbmFtZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKGlucHV0KTsKLSAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAocW5hbWUgIT0gbnVsbCkgPyAoTWVzc2FnZSkgZGVmaW5pdGlvbi5nZXRNZXNzYWdlKHFuYW1lKSA6IG51bGw7Ci0gICAgICAgICAgaWYgKGlucHV0LmdldE1lc3NhZ2UoKSAhPSBtZXNzYWdlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIE91dHB1dAotICAgICAgICAvLwotICAgICAgICBPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCkgb3BlcmF0aW9uLmdldE91dHB1dCgpOwotICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxbmFtZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKG91dHB1dCk7Ci0gICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKHFuYW1lICE9IG51bGwpID8gKE1lc3NhZ2UpIGRlZmluaXRpb24uZ2V0TWVzc2FnZShxbmFtZSkgOiBudWxsOwotICAgICAgICAgIGlmIChvdXRwdXQuZ2V0TWVzc2FnZSgpICE9IG1lc3NhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIEZhdWx0cwotICAgICAgICAvLwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGsgPSBvcGVyYXRpb24uZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGsuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBrLm5leHQoKTsKLQotICAgICAgICAgIFFOYW1lIHFuYW1lID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRNZXNzYWdlUmVmZXJlbmNlUU5hbWUoZmF1bHQpOwotICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChxbmFtZSAhPSBudWxsKSA/IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2UocW5hbWUpIDogbnVsbDsKLSAgICAgICAgICBpZiAoZmF1bHQuZ2V0TWVzc2FnZSgpICE9IG1lc3NhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgZmF1bHQuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlU2NoZW1hUmVmZXJlbmNlcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVNZXNzYWdlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBtZXNzYWdlLmdldEVQYXJ0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGoubmV4dCgpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocGFydCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFdTRExFbGVtZW50SW1wbClwYXJ0KS5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uIGdldE9wZXJhdGlvbihQb3J0VHlwZSBwb3J0VHlwZSwgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgT3BlcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKGlzTWF0Y2hpbmdCaW5kaW5nKG9wZXJhdGlvbiwgYmluZGluZ09wZXJhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG9wZXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlT3BlcmF0aW9uUmVmZXJlbmNlKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBjb21wdXRlT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOwotICAgIGlmIChvcGVyYXRpb24gIT0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKSkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KGJvb2xlYW4gaXNUeXBlKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIElUeXBlU3lzdGVtUHJvdmlkZXIgdHlwZVN5c3RlbVByb3ZpZGVyID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlU3lzdGVtUHJvdmlkZXIocm9vdERlZmluaXRpb24pOwotICAgIGlmICh0eXBlU3lzdGVtUHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpc1R5cGUgPyB0eXBlU3lzdGVtUHJvdmlkZXIuZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKHJvb3REZWZpbml0aW9uLCAwKSA6IHR5cGVTeXN0ZW1Qcm92aWRlci5nZXRBdmFpbGFibGVFbGVtZW50TmFtZXMocm9vdERlZmluaXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KFBhcnQgcGFydCwgYm9vbGVhbiBpc1R5cGUpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gcGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgSVR5cGVTeXN0ZW1Qcm92aWRlciB0eXBlU3lzdGVtUHJvdmlkZXIgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVTeXN0ZW1Qcm92aWRlcihkZWZpbml0aW9uKTsKLSAgICBpZiAodHlwZVN5c3RlbVByb3ZpZGVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gaXNUeXBlID8gdHlwZVN5c3RlbVByb3ZpZGVyLmdldEF2YWlsYWJsZVR5cGVOYW1lcyhkZWZpbml0aW9uLCAwKSA6IHR5cGVTeXN0ZW1Qcm92aWRlci5nZXRBdmFpbGFibGVFbGVtZW50TmFtZXMoZGVmaW5pdGlvbik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUeXBlKFBhcnQgcGFydCkKLSAgewotICAgIC8vRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHBhcnQpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IHBhcnQuZ2V0RWxlbWVudCgpOwotICAgIHJldHVybiAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcnRDb21wb25lbnRSZWZlcmVuY2UoUGFydCBwYXJ0KQotICB7Ci0gICAgLy9FbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocGFydCk7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gcGFydC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZWxlbWVudCIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBvbmVudFJlZmVyZW5jZShQYXJ0IHBhcnQsIGJvb2xlYW4gaXNUeXBlLCBTdHJpbmcgY29tcG9uZW50TmFtZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChwYXJ0KTsKLSAgICBTdHJpbmcgbmV3QXR0cmlidXRlID0gaXNUeXBlID8gInR5cGUiIDogImVsZW1lbnQiOwotICAgIFN0cmluZyBvbGRBdHRyaWJ1dGUgPSBpc1R5cGUgPyAiZWxlbWVudCIgOiAidHlwZSI7Ci0gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUob2xkQXR0cmlidXRlKTsKLQotICAgIFN0cmluZyB2YWx1ZSA9IGNvbXBvbmVudE5hbWUgIT0gbnVsbCA/IGNvbXBvbmVudE5hbWUgOiBlbGVtZW50LmdldEF0dHJpYnV0ZShuZXdBdHRyaWJ1dGUpOwotCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGlzVHlwZSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHhzZFByZWZpeCA9IHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLlhTRF9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgdmFsdWUgPSAic3RyaW5nIjsKLSAgICAgICAgaWYgKHhzZFByZWZpeCAhPSBudWxsICYmIHhzZFByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IHhzZFByZWZpeCArICI6IiArIHZhbHVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IGdldENvbXBvbmVudE5hbWVMaXN0KHBhcnQsIGlzVHlwZSk7Ci0gICAgICAgIHZhbHVlID0gbGlzdC5zaXplKCkgPiAwID8gKFN0cmluZykgbGlzdC5nZXQoMCkgOiAic29tZS1lbGVtZW50LW5hbWUiOwotICAgICAgfQotICAgIH0KLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuZXdBdHRyaWJ1dGUsIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uIGNvbXB1dGVPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgT3BlcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdPcGVyYXRpb24uZUNvbnRhaW5lcigpOwotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBiaW5kaW5nLmdldFBvcnRUeXBlKCk7Ci0gICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0T3BlcmF0aW9uKHBvcnRUeXBlLCBiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSW5wdXQgY29tcHV0ZUlucHV0KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQpCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gY29tcHV0ZU9wZXJhdGlvbigoQmluZGluZ09wZXJhdGlvbikgYmluZGluZ0lucHV0LmVDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbiAhPSBudWxsID8gb3BlcmF0aW9uLmdldEVJbnB1dCgpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgT3V0cHV0IGNvbXB1dGVPdXRwdXQoQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0KQotICB7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGNvbXB1dGVPcGVyYXRpb24oKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPdXRwdXQuZUNvbnRhaW5lcigpKTsKLSAgICByZXR1cm4gb3BlcmF0aW9uICE9IG51bGwgPyBvcGVyYXRpb24uZ2V0RU91dHB1dCgpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgRmF1bHQgY29tcHV0ZUZhdWx0KEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQpCi0gIHsKLSAgICBGYXVsdCByZXN1bHQgPSBudWxsOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBjb21wdXRlT3BlcmF0aW9uKChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nRmF1bHQuZUNvbnRhaW5lcigpKTsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGZhdWx0TmFtZSAhPSBudWxsICYmIGZhdWx0TmFtZS5lcXVhbHMoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBmYXVsdDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFydFJlZmVyZW5jZVZhbHVlKFBhcnQgcGFydCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChwYXJ0KTsKLSAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikpCi0gICAgICB7ICAgICAgCQkKLSAgICAgICAgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICAgIHsgIAotICAgICAgICB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJlbGVtZW50Iik7Ci0gICAgICB9ICAgICAgICAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiOwotICB9Ci0KLSAgcHVibGljIE9wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkNvbnRlbnQpCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLSAgICBOb2RlIHBhcmVudCA9IGJpbmRpbmdPcGVyYXRpb25Db250ZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KHJvb3REZWZpbml0aW9uLCAoRWxlbWVudCkgcGFyZW50KTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uKQotICAgICAgewotICAgICAgICBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oKEJpbmRpbmdPcGVyYXRpb24pIG9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLQotICBwdWJsaWMgTWVzc2FnZSBnZXRCaW5kaW5nT3BlcmF0aW9uSW5wdXRNZXNzYWdlKEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkNvbnRlbnQpCi0gIHsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBnZXRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb25Db250ZW50KTsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgcHVibGljIE1lc3NhZ2UgZ2V0QmluZGluZ09wZXJhdGlvbk91dHB1dE1lc3NhZ2UoRWxlbWVudCBiaW5kaW5nT3BlcmF0aW9uQ29udGVudCkKLSAgewotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbkNvbnRlbnQpOwotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKTsKLSAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZSA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVSZWxhdGl2ZVVSSShJRmlsZSByZWZlcmVuY2VkTG9jYXRpb24sIElGaWxlIGJhc2VMb2NhdGlvbiwgYm9vbGVhbiBlbmFibGVJRVN0eWxlUmVmZXJlbmNlcykKLSAgewotICAgIC8vIFRPRE8uLi4gd2UgbmVlZCBzb21lIGV4dGVuc2lvbiB0byBhbGxvdyBJRSBmb2xrcyB0byBwbHVnaW4gbG9naWMgdG8gY3JlYXRlIGFuICdJRScgc3R5bGUgcGF0aAotICAgIC8vIFRPRE8uLi4gY29uc2lkZXIgdXNpbmcgVVJJIGNsYXNzIGluIEVNRiAKLSAgICByZXR1cm4gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKHJlZmVyZW5jZWRMb2NhdGlvbi5nZXRMb2NhdGlvbigpLCBiYXNlTG9jYXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVSZWxhdGl2ZVVSSShTdHJpbmcgcmVmZXJlbmNlZExvY2F0aW9uLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBib29sZWFuIGVuYWJsZUlFU3R5bGVSZWZlcmVuY2VzKQotICB7Ci0gICAgLy8gVE9ETy4uLiB3ZSBuZWVkIHNvbWUgZXh0ZW5zaW9uIHRvIGFsbG93IElFIGZvbGtzIHRvIHBsdWdpbiBsb2dpYyB0byBjcmVhdGUgYW4gJ0lFJyBzdHlsZSBwYXRoCi0gICAgLy8gVE9ETy4uLiBjb25zaWRlciB1c2luZyBVUkkgY2xhc3MgaW4gRU1GIAotICAgIHJldHVybiBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkocmVmZXJlbmNlZExvY2F0aW9uLCBiYXNlTG9jYXRpb24pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NyZWF0ZVdTRExFbGVtZW50SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NyZWF0ZVdTRExFbGVtZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGUyNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9DcmVhdGVXU0RMRWxlbWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRCaW5kaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRGYXVsdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkSW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE1lc3NhZ2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE9wZXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQYXJ0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQb3J0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQb3J0VHlwZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkU2VydmljZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuTWVzc2FnZVJlZmVyZW5jZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENyZWF0ZVdTRExFbGVtZW50SGVscGVyIHsKLQkvLyBDb25zdGFudHMgdXNlZCBmb3IgZ2V0dGluZyBQYXJ0IGluZm9ybWF0aW9uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9JTkZPX0VMRU1FTlRfREVDTEFSQVRJT04gPSAiRUxFTUVOVF9ERUNMQVJBVElPTiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9JTkZPX1RZUEVfREVGSU5JVElPTiAgICAgPSAiVFlQRV9ERUZJTklUSU9OIjsKLQotCS8vIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHNob3VsZCBiZSBzZXQgaWYgYSBuYW1lIG90aGVyIHRoYW4gdGhlIGNvbXB1dGVkIG5hbWUgaXMgdG8gYmUgdXNlZC4KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcG9ydE5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmRpbmdOYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwb3J0VHlwZU5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlucHV0TmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0cHV0TmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmF1bHROYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXNzYWdlTmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFydE5hbWUgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gUEFSVF9JTkZPX1RZUEVfREVGSU5JVElPTjsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQ1JFQVRFX0RPV05fVE9fUEFSVCA9IHRydWU7Ci0JCQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjcmVhdGVzIHRoZSAnc3BlY2lmaWVkJyAoYnkgY2FsbGluZyBhIGNlcnRhaW4gbWV0aG9kKSBXU0RMRWxlbWVudAotICogYW5kIGl0J3MgJ2NoaWxkcmVuJyBhbGwgdGhlIHdheSB0byB0aGUgUG9ydFR5cGUgbGV2ZWwuCi0gKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZpY2UgY3JlYXRlU2VydmljZShEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJaWYgKHNlcnZpY2VOYW1lID09IG51bGwgfHwgc2VydmljZU5hbWUudHJpbSgpLmVxdWFscygiIikpCi0JCQlzZXJ2aWNlTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlU2VydmljZU5hbWUoZGVmaW5pdGlvbik7CQkKLQkJCi0JCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLnBvcnRUeXBlTmFtZSA9IHNlcnZpY2VOYW1lOwotCQkKLQkgICAgQWRkU2VydmljZUNvbW1hbmQgYWRkU2VydmljZSA9IG5ldyBBZGRTZXJ2aWNlQ29tbWFuZChkZWZpbml0aW9uLCBzZXJ2aWNlTmFtZSwgZmFsc2UpOwotCSAgICBhZGRTZXJ2aWNlLnJ1bigpOwotCSAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgYWRkU2VydmljZS5nZXRXU0RMRWxlbWVudCgpOwotCSAgICBQb3J0IHBvcnQgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVQb3J0KHNlcnZpY2UpOwotICAJCQotCSAgICByZXR1cm4gc2VydmljZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBQb3J0IGNyZWF0ZVBvcnQoU2VydmljZSBzZXJ2aWNlKSB7Ci0JCWlmIChwb3J0TmFtZSA9PSBudWxsIHx8IHBvcnROYW1lLnRyaW0oKS5lcXVhbHMoIiIpKQotCQkJcG9ydE5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZVBvcnROYW1lKHNlcnZpY2UsIG51bGwpOwotCQkKLQkgICAgQWRkUG9ydENvbW1hbmQgYWRkUG9ydCA9IG5ldyBBZGRQb3J0Q29tbWFuZChzZXJ2aWNlLCBwb3J0TmFtZSk7Ci0JICAgIGFkZFBvcnQucnVuKCk7Ci0JICAgIFBvcnQgcG9ydCA9IChQb3J0KSBhZGRQb3J0LmdldFdTRExFbGVtZW50KCk7Ci0JCUJpbmRpbmcgYmluZGluZyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZUJpbmRpbmcocG9ydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIHBvcnQpOwotCi0JCXBvcnQuc2V0QmluZGluZyhiaW5kaW5nKTsKLQkJCi0JICAgIHJldHVybiBwb3J0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJpbmRpbmcgY3JlYXRlQmluZGluZyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFBvcnQgcG9ydCkgewotCQliaW5kaW5nTmFtZSA9IHBvcnQuZ2V0TmFtZSgpOwotCQlpZiAoYmluZGluZ05hbWUgPT0gbnVsbCB8fCBiaW5kaW5nTmFtZS50cmltKCkuZXF1YWxzKCIiKSkKLQkJCWJpbmRpbmdOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVCaW5kaW5nTmFtZShkZWZpbml0aW9uLCBudWxsKTsKLQkJCi0JCUFkZEJpbmRpbmdDb21tYW5kIGFkZEJpbmRpbmcgPSBuZXcgQWRkQmluZGluZ0NvbW1hbmQoZGVmaW5pdGlvbiwgYmluZGluZ05hbWUpOwotCQlhZGRCaW5kaW5nLnJ1bigpOwotCQlCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYWRkQmluZGluZy5nZXRXU0RMRWxlbWVudCgpOwotCQlQb3J0VHlwZSBwb3J0VHlwZSA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZVBvcnRUeXBlKGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLQotCQliaW5kaW5nLnNldFBvcnRUeXBlKHBvcnRUeXBlKTsKLQkJCi0JCXJldHVybiBiaW5kaW5nOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFBvcnRUeXBlIGNyZWF0ZVBvcnRUeXBlKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotCQlpZiAocG9ydFR5cGVOYW1lID09IG51bGwgfHwgcG9ydFR5cGVOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKQotCQkJcG9ydFR5cGVOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVQb3J0VHlwZU5hbWUoZGVmaW5pdGlvbiwgIlBvcnRUeXBlIik7Ci0JCQotCQlBZGRQb3J0VHlwZUNvbW1hbmQgYWRkUG9ydFR5cGVDb21tYW5kID0gbmV3IEFkZFBvcnRUeXBlQ29tbWFuZChkZWZpbml0aW9uLCBwb3J0VHlwZU5hbWUpOwotCQlhZGRQb3J0VHlwZUNvbW1hbmQucnVuKCk7Ci0JCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBhZGRQb3J0VHlwZUNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKTsKLQotCQlpZiAoQ1JFQVRFX0RPV05fVE9fUEFSVCkgewotCQkJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlT3BlcmF0aW9uKHBvcnRUeXBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIHBvcnRUeXBlOwotCX0KLQotCQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjcmVhdGVzIHRoZSAnc3BlY2lmaWVkJyAoYnkgY2FsbGluZyBhIGNlcnRhaW4gbWV0aG9kKSBXU0RMRWxlbWVudAotICogYW5kIGl0J3MgJ2NoaWxkcmVuJyBhbGwgdGhlIHdheSB0byB0aGUgUGFydCBsZXZlbC4KLSAqLwkKLSAgCXB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbihQb3J0VHlwZSBwb3J0VHlwZSkgewotICAJCWlmIChvcGVyYXRpb25OYW1lID09IG51bGwgfHwgb3BlcmF0aW9uTmFtZS50cmltKCkuZXF1YWxzKCIiKSkKLSAgCQkJb3BlcmF0aW9uTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlT3BlcmF0aW9uTmFtZShwb3J0VHlwZSk7Ci0gIAkJCi0gIAkJRGVmaW5pdGlvbiBkZWYgPSBwb3J0VHlwZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7CQotCQlBZGRPcGVyYXRpb25Db21tYW5kIGFjdGlvbiA9IG5ldyBBZGRPcGVyYXRpb25Db21tYW5kKHBvcnRUeXBlLCBvcGVyYXRpb25OYW1lKTsKLQkJYWN0aW9uLnJ1bigpOwotCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7Ci0gIAkJT3V0cHV0IG91dHB1dCA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU91dHB1dChwb3J0VHlwZSwgb3BlcmF0aW9uKTsKLQkJSW5wdXQgaW5wdXQgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVJbnB1dChwb3J0VHlwZSwgb3BlcmF0aW9uLCBudWxsKTsKLQotLy8gIAkJKChQb3J0VHlwZUltcGwpIHBvcnRUeXBlKS51cGRhdGVFbGVtZW50KGZhbHNlKTsKLSAgIAkJcmV0dXJuIG9wZXJhdGlvbjsKLSAgCX0KLQotICAJcHVibGljIHN0YXRpYyBJbnB1dCBjcmVhdGVJbnB1dChQb3J0VHlwZSBwb3J0VHlwZSwgT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIGlucHV0TmFtZSkgewotICAJCWlmIChpbnB1dE5hbWUgPT0gbnVsbCB8fCBpbnB1dE5hbWUudHJpbSgpLmVxdWFscygiIikpCi0gIAkgIAkJaW5wdXROYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVJbnB1dE5hbWUocG9ydFR5cGUsIG9wZXJhdGlvbi5nZXROYW1lKCksICIiKTsKLSAgCQkKLSAgCQlEZWZpbml0aW9uIGRlZiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gIAkJQWRkSW5wdXRDb21tYW5kIGFjdGlvbiA9IG5ldyBBZGRJbnB1dENvbW1hbmQob3BlcmF0aW9uLCBpbnB1dE5hbWUpOwotICAJCWFjdGlvbi5ydW4oKTsKLSAgCQlJbnB1dCBpbnB1dCA9IChJbnB1dCkgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7IAotICAJCU1lc3NhZ2UgbWVzcyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU1lc3NhZ2UoaW5wdXQpOwotICAJCWlucHV0LnNldE1lc3NhZ2UobWVzcyk7Ci0gIAkJCSAgCQkKLSAgCQlyZXR1cm4gaW5wdXQ7Ci0gIAl9Ci0gIAkJCSAgCQotICAJcHVibGljIHN0YXRpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KFBvcnRUeXBlIHBvcnRUeXBlLCBPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gIAkJaWYgKG91dHB1dE5hbWUgPT0gbnVsbCB8fCBvdXRwdXROYW1lLnRyaW0oKS5lcXVhbHMoIiIpKQotICAJICAJCW91dHB1dE5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU91dHB1dE5hbWUocG9ydFR5cGUsIG9wZXJhdGlvbi5nZXROYW1lKCksICIiKTsKLSAgCQkKLSAgCQlEZWZpbml0aW9uIGRlZiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gIAkJQWRkT3V0cHV0Q29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkT3V0cHV0Q29tbWFuZChvcGVyYXRpb24sIG91dHB1dE5hbWUpOwotICAJCWFjdGlvbi5ydW4oKTsKLSAgCQlPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCkgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7Ci0gIAkJTWVzc2FnZSBtZXNzID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlTWVzc2FnZShvdXRwdXQpOwotICAJCW91dHB1dC5zZXRNZXNzYWdlKG1lc3MpOwkKLSAgCQkJICAJCQotICAJCXJldHVybiBvdXRwdXQ7Ci0gIAl9Ci0gIAkJCSAgCQotICAJcHVibGljIHN0YXRpYyBGYXVsdCBjcmVhdGVGYXVsdChPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gIAkJaWYgKGZhdWx0TmFtZSA9PSBudWxsIHx8IGZhdWx0TmFtZS50cmltKCkuZXF1YWxzKCIiKSkgCi0JICAJCWZhdWx0TmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlRmF1bHROYW1lKG9wZXJhdGlvbik7Ci0gIAkJCi0gIAkJRGVmaW5pdGlvbiBkZWYgPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAJCUFkZEZhdWx0Q29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkRmF1bHRDb21tYW5kKG9wZXJhdGlvbiwgZmF1bHROYW1lKTsKLSAgCQlhY3Rpb24ucnVuKCk7Ci0gIAkJRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGFjdGlvbi5nZXRXU0RMRWxlbWVudCgpOwotICAJCU1lc3NhZ2UgbWVzcyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU1lc3NhZ2UoZmF1bHQpOwotICAJCWZhdWx0LnNldE1lc3NhZ2UobWVzcyk7Ci0gIAkJIAkJCi0gIAkJcmV0dXJuIGZhdWx0OwotICAJfQotICAJCQkgIAkKLSAgCXB1YmxpYyBzdGF0aWMgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKE1lc3NhZ2VSZWZlcmVuY2UgaW9mKSB7Ci0gIAkJaWYgKG1lc3NhZ2VOYW1lID09IG51bGwgfHwgbWVzc2FnZU5hbWUudHJpbSgpLmVxdWFscygiIikpCi0gIAkgIAkJbWVzc2FnZU5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGlvZi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGlvZik7Ci0vLwkgIAkJbWVzc2FnZU5hbWUgPSBOYW1lVXRpbC5idWlsZE1lc3NhZ2VOYW1lKGlvZi5nZXROYW1lKCkpOwotICAJCQotICAJCURlZmluaXRpb24gZGVmID0gaW9mLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgCQlBZGRNZXNzYWdlQ29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmLCBtZXNzYWdlTmFtZSk7Ci0gIAkJYWN0aW9uLnJ1bigpOwotICAJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLSAgCQlQYXJ0IHBhcnQgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVQYXJ0KG1lc3NhZ2UpOwotICAJCUVsZW1lbnQgcGFyZW50Tm9kZSA9IG1lc3NhZ2UuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgCi0gICAgICB7Ci0JCSAgICAvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgRm9ybWF0UHJvY2Vzc29yWE1MIGZvcm1hdFByb2Nlc3NvclhNTCA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKXBhcmVudE5vZGUpOwotICAgICAgfQotICAJCQotICAJCW1lc3NhZ2VOYW1lID0gbnVsbDsKLSAgCQlyZXR1cm4gbWVzc2FnZTsKLSAgCX0KLSAgCQkJICAJCi0gIAlwdWJsaWMgc3RhdGljIFBhcnQgY3JlYXRlUGFydChNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgCQlEZWZpbml0aW9uIGRlZiA9IG1lc3NhZ2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAJCVN0cmluZyBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVQYXJ0TmFtZShtZXNzYWdlLCBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAJCUFkZFBhcnRDb21tYW5kIGFjdGlvbiA9IG51bGw7Ci0gIAkJCi0gIAkJaWYgKFBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID09IFBBUlRfSU5GT19UWVBFX0RFRklOSVRJT04pIHsKLSAgCQkJYWN0aW9uID0gbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsIG5hbWUsIFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciLCB0cnVlKTsKLSAgCQl9Ci0gIAkJZWxzZSBpZiAoUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPT0gUEFSVF9JTkZPX0VMRU1FTlRfREVDTEFSQVRJT04pIHsgIAkJCQotICAJCQkvL2FjdGlvbiA9IG5ldyBBZGRQYXJ0Q29tbWFuZChtZXNzYWdlLCBuYW1lLCBXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAic3RyaW5nIiwgdHJ1ZSk7Ci0gIAkJCVN0cmluZyBlbGVtZW50TmFtZSA9IGdldE5ld05hbWVIZWxwZXIobmFtZSwgZGVmLCBmYWxzZSk7Ci0gIAkJCUFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQgZWxlbWVudEFjdGlvbiA9IG5ldyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKGRlZiwgZWxlbWVudE5hbWUpOwotICAJCQllbGVtZW50QWN0aW9uLnJ1bigpOwotICAJCQlhY3Rpb24gPSBuZXcgQWRkUGFydENvbW1hbmQobWVzc2FnZSwgbmFtZSwgZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpLCBlbGVtZW50TmFtZSwgZmFsc2UpOwotICAJCX0KLQotICAJCWFjdGlvbi5ydW4oKTsKLSAgCQkKLSAgCQlyZXR1cm4gKFBhcnQpIGFjdGlvbi5nZXRXU0RMRWxlbWVudCgpOwotICAJfQkKLQotICAJLyoKLSAgCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIGEgbmFtZSBmb3IgYW4gRWxlbWVudAotICAJICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld05hbWVIZWxwZXIoU3RyaW5nIGJhc2UsIERlZmluaXRpb24gZGVmLCBib29sZWFuIGlzVHlwZSkKLSAgICB7IAotICAgICAgU3RyaW5nIG5hbWUgPSBiYXNlOyAgICAKLSAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgIC8vIFVnbHkuLi4uICBSZWRvIHRoaXMuLi4KLSAgICAgIC8vIEdldCBhIGxpc3Qgb2YgRWxlbWVudHMuLi4KLSAgICAgIExpc3QgZWxlbWVudExpc3QgPSBudWxsOwotICAgICAgaWYgKGRlZi5nZXRFVHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgICAJTGlzdCB4c2RzTGlzdCA9IGRlZi5nZXRFVHlwZXMoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAJaWYgKHhzZHNMaXN0ICE9IG51bGwpIHsKLSAgICAgIAkJSXRlcmF0b3IgeHNkc0l0ZXJhdG9yID0geHNkc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgIAkJWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkRWxlbWVudCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgeHNkc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgIAkJWFNEU2NoZW1hIHNjaGVtYSA9IHhzZEVsZW1lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICAJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgICAgCQkJZWxlbWVudExpc3QgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgICAgCQl9Ci0gICAgICAJfQotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZWxlbWVudExpc3QgIT0gbnVsbCkgewotICAgICAgCWludCBpbmRleCA9IDA7Ci0gICAgICAJd2hpbGUgKGluZGV4IDwgZWxlbWVudExpc3Quc2l6ZSgpKSB7Ci0gICAgICAJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50TGlzdC5nZXQoaW5kZXgpOwotICAgICAgCQkKLSAgICAgIAkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnREZWNsYXJhdGlvbi5nZXROYW1lKCkpKSB7Ci0gICAgICAJCQljb3VudCsrOwotICAgICAgCQkJbmFtZSA9IG5hbWUgKyBjb3VudDsKLSAgICAgIAkJCWluZGV4ID0gMDsKLSAgICAgIAkJfQotICAgICAgCQllbHNlIHsKLSAgICAgIAkJCWluZGV4Kys7Ci0gICAgICAJCX0KLSAgICAgIAl9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAJLyoKLSAgCSAqIFJldHVybiB0aGUgdHlwZSBvZiBQYXJ0IHRoaXMgV1NETEVsZW1lbnQgc2hvdWxkIGhhdmUgKEVsZW1lbnQgdnMgVHlwZSkuICBUbyBkZXRlcm1pbmUgdGhpcywgd2UgZmlsdGVyIHVwIHRvIHRoZSAncGFyZW50JyBQb3J0VHlwZQotICAJICogYW5kIGdvIGRvd24gdG8gdGhlIGZpcnN0IFBhcnQgd2UgZW5jb3VudGVyIGFuZCBjaGVjayB0aGUgdHlwZSBpdCBoYXMuICBJZiB0aGlzIGZhaWxzLCBkZWZhdWx0IHRvIFR5cGUuCi0gIAkgKi8KLSAgCSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFydEluZm8oV1NETEVsZW1lbnQgZWxlbWVudCkgewotICAJICAJU3RyaW5nIHBhcnRJbmZvID0gbnVsbDsKLSAgCSAgCQotICAJICAJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQb3J0VHlwZSkgewotICAJICAJCXBhcnRJbmZvID0gZ2V0UGFydEluZm8oKFBvcnRUeXBlKSBlbGVtZW50KTsKLSAgCSAgCX0KLSAgCSAgCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgCSAgCQlwYXJ0SW5mbyA9IGdldFBhcnRJbmZvKCgoV1NETEVsZW1lbnRJbXBsKSBlbGVtZW50KS5nZXRDb250YWluZXIoKSk7Ci0gIAkgIAl9Ci0gIAkgIAllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZVJlZmVyZW5jZUltcGwpIHsKLSAgCSAgCQlwYXJ0SW5mbyA9IGdldFBhcnRJbmZvKCgoV1NETEVsZW1lbnRJbXBsKSBlbGVtZW50KS5nZXRDb250YWluZXIoKSk7Ci0gIAkgIAl9Ci0KLSAgCSAgCWlmIChwYXJ0SW5mbyA9PSBudWxsKSB7Ci0gIAkgIAkJcGFydEluZm8gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX0lORk9fVFlQRV9ERUZJTklUSU9OOwotICAJICAJfQotICAJICAJCi0gIAkgIAlyZXR1cm4gcGFydEluZm87ICAJCi0gIAkgIH0KLSAgCSAgCi0gIAkgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYXJ0SW5mbyhQb3J0VHlwZSBwb3J0VHlwZSkgewotICAJICAJU3RyaW5nIHBhcnRJbmZvID0gbnVsbDsKLSAgCSAgCQotICAJICAJaWYgKHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKSAhPSBudWxsKSB7Ci0gIAkgIAkJSXRlcmF0b3Igb3BlcmF0aW9uSXQgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgCSAgCQl3aGlsZSAob3BlcmF0aW9uSXQuaGFzTmV4dCgpKSB7Ci0gIAkgIAkJCU9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIG9wZXJhdGlvbkl0Lm5leHQoKTsKLQotICAJICAJCQlpZiAob3AuZ2V0RUlucHV0KCkgIT0gbnVsbCkgewotICAJICAJCQkJcGFydEluZm8gPSBnZXRNZXNzYWdlUmVmUGFydEluZm8oKE1lc3NhZ2VSZWZlcmVuY2VJbXBsKSBvcC5nZXRFSW5wdXQoKSk7Ci0gIAkgIAkJCX0KLSAgCSAgCQotICAJICAJCQlpZiAocGFydEluZm8gPT0gbnVsbCAmJiBvcC5nZXRFT3V0cHV0KCkgIT0gbnVsbCkgewotICAJICAJCQkJcGFydEluZm8gPSBnZXRNZXNzYWdlUmVmUGFydEluZm8oKE1lc3NhZ2VSZWZlcmVuY2VJbXBsKSBvcC5nZXRFT3V0cHV0KCkpOwotICAJICAJCQl9Ci0gIAkgIAkKLSAgCSAgCQkJaWYgKG9wLmdldEVGYXVsdHMoKSAhPSBudWxsKSB7Ci0gIAkgIAkJCQlJdGVyYXRvciBmYXVsdEl0ID0gb3AuZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7Ci0gIAkgIAkJCQl3aGlsZSAocGFydEluZm8gPT0gbnVsbCAmJiBmYXVsdEl0Lmhhc05leHQoKSkgewotICAJICAJCQkJCUZhdWx0IGZhdWx0ID0gKEZhdWx0KSBmYXVsdEl0Lm5leHQoKTsKLSAgCSAgCQkJCQlwYXJ0SW5mbyA9IGdldE1lc3NhZ2VSZWZQYXJ0SW5mbygoTWVzc2FnZVJlZmVyZW5jZUltcGwpIGZhdWx0KTsKLSAgCSAgCQkJCX0KLSAgCSAgCQkJfQotICAJICAJICAJICAJCi0gIAkgIAkJCWlmIChwYXJ0SW5mbyAhPSBudWxsKQotICAJICAJCQkJYnJlYWs7Ci0gIAkgIAkJfQotICAJICAJfQotCi0gIAkgIAlyZXR1cm4gcGFydEluZm87Ci0gIAkgIH0KLSAgCSAgCi0gIAkgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVmUGFydEluZm8oTWVzc2FnZVJlZmVyZW5jZUltcGwgaW9mKSB7Ci0gIAkgIAlTdHJpbmcgcGFydEluZm8gPSBudWxsOwotICAJICAJCi0gIAkgIAlpZiAoaW9mLmdldEVNZXNzYWdlKCkgIT0gbnVsbCAmJiBpb2YuZ2V0RU1lc3NhZ2UoKS5nZXRFUGFydHMoKSAhPSBudWxsKSB7Ci0gIAkgIAkJSXRlcmF0b3IgcGFydEl0ID0gaW9mLmdldEVNZXNzYWdlKCkuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgCSAgCQotICAJICAJCXdoaWxlIChwYXJ0SW5mbyA9PSBudWxsICYmIHBhcnRJdC5oYXNOZXh0KCkpIHsKLSAgCSAgCQkJUGFydCBwYXJ0ID0gKFBhcnQpIHBhcnRJdC5uZXh0KCk7Ci0gIAkgIAkJCi0gIAkgIAkJCWlmIChwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAJICAJCQkJcGFydEluZm8gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX0lORk9fVFlQRV9ERUZJTklUSU9OOwotICAJICAJCQl9Ci0gIAkgIAkJCWVsc2UgaWYgKHBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCkgewotICAJICAJCQkJcGFydEluZm8gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX0lORk9fRUxFTUVOVF9ERUNMQVJBVElPTjsKLSAgCSAgCQkJfQotICAJICAJCX0KLSAgCSAgCX0KLSAgCSAgCQotICAJICAJcmV0dXJuIHBhcnRJbmZvOwotICAJICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL05hbWVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL05hbWVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzhjOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9OYW1lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgTmFtZVV0aWwKLXsKLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIGZhdWx0IGluIHRoZSBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZUZhdWx0TmFtZShPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gIAlyZXR1cm4gYnVpbGRVbmlxdWVGYXVsdE5hbWUob3BlcmF0aW9uLCAiTmV3RmF1bHQiKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVGYXVsdE5hbWUoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIGJhc2VOYW1lKSB7Ci0gIAlpZiAoYmFzZU5hbWUgPT0gbnVsbCkKLSAgCQliYXNlTmFtZSA9ICJOZXdGYXVsdCI7Ci0gIAkKLSAgCUxpc3QgbmFtZXMgPSBnZXRVc2VkRmF1bHROYW1lcyhvcGVyYXRpb24pOwotCi0gICAgLy8gTm93IHNlYXJjaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGFuIHVudXNlZCBuYW1lCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBpbnB1dCBpbiB0aGUgcG9ydFR5cGUuICBSZXR1cm5lZCBuYW1lIHdpbGwgYmUgb2YgdGhlIGZvcm06Ci0gICAqIDxvcGVyYXRpb25OYW1lPiArIDxlbmRpbmc+IFsrIHVuaXF1ZSBJbnRlZ2VyXQotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVJbnB1dE5hbWUoUG9ydFR5cGUgcG9ydFR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBTdHJpbmcgZW5kaW5nKQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIFN0cmluZyBjYW5kaWRhdGUgPSBvcGVyYXRpb25OYW1lICsgZW5kaW5nOwotCi0gICAgaW50IGkgPSAwOwotCi0gICAgLy8gbG9vcCB1bnRpbCB3ZSBmaW5kIGEgdW5pcXVlIG5hbWUgKHRoZSBuYW1lIHdpbGwgY29uc2lzdCBvZiB0aGUgb3BlcmF0aW9uTmFtZSArIGVuZGluZyArIGFuIGludGVnZXIpCi0gICAgd2hpbGUgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBib29sZWFuIHVuaXF1ZSA9IHRydWU7Ci0KLSAgICAgIC8vIGRldGVybWluZSBpZiB0aGlzIGNvbWJpbmF0aW9uIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGN1cnJlbnQgcG9ydHR5cGUKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKSAmJiB1bmlxdWU7KQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gY3VycmVudCA9IChPcGVyYXRpb24pIGl0Lm5leHQoKTsKLSAgICAgICAgLy8gVE9ETyA6IHBvcnQgY2hlY2sKLSAgICAgICAgLy8gb2xkICBpZihjdXJyZW50LmlzU2V0RUlucHV0KCkgJiYgY3VycmVudC5nZXRFSW5wdXQoKS5pc1NldE5hbWUoKSkgewotICAgICAgICBpZiAoY3VycmVudC5nZXRFSW5wdXQoKSAhPSBudWxsICYmIGN1cnJlbnQuZ2V0RUlucHV0KCkuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3VycmVudC5nZXRFSW5wdXQoKS5nZXROYW1lKCkuZXF1YWxzKGNhbmRpZGF0ZSkpCi0gICAgICAgICAgICB1bmlxdWUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHVuaXF1ZSkKLSAgICAgICAgbmFtZSA9IGNhbmRpZGF0ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgY2FuZGlkYXRlID0gb3BlcmF0aW9uTmFtZSArIGVuZGluZyArIGk7Ci0gICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIG1lc3NhZ2UgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gICAgaWYgKGJhc2VOYW1lID09IG51bGwpCi0gICAgewotICAgICAgYmFzZU5hbWUgPSAiTmV3TWVzc2FnZSI7Ci0gICAgfQotCi0gICAgTGlzdCBuYW1lcyA9IGdldFVzZWRNZXNzYWdlTmFtZXMoZGVmaW5pdGlvbik7Ci0KLSAgICAvLyBOb3cgc2VhcmNoIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYW4gdW51c2VkIG5hbWUKLSAgICByZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgbmFtZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIG9wZXJhdGlvbiBpbiB0aGUgcG9ydCB0eXBlLgotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVPcGVyYXRpb25OYW1lKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gIAlyZXR1cm4gYnVpbGRVbmlxdWVPcGVyYXRpb25OYW1lKHBvcnRUeXBlLCAiTmV3T3BlcmF0aW9uIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlT3BlcmF0aW9uTmFtZShQb3J0VHlwZSBwb3J0VHlwZSwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gIAlpZiAoYmFzZU5hbWUgPT0gbnVsbCkgewotICAJCWJhc2VOYW1lID0gIk5ld09wZXJhdGlvbiI7Ci0gIAl9Ci0KLSAgCUxpc3QgbmFtZXMgPSBnZXRVc2VkT3BlcmF0aW9uTmFtZXMocG9ydFR5cGUpOwotCi0gICAgLy8gTm93IHNlYXJjaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGFuIHVudXNlZCBuYW1lCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBvdXRwdXQgaW4gdGhlIHBvcnRUeXBlLiAgUmV0dXJuZWQgbmFtZSB3aWxsIGJlIG9mIHRoZSBmb3JtOgotICAgKiA8b3BlcmF0aW9uTmFtZT4gKyA8ZW5kaW5nPiBbKyB1bmlxdWUgSW50ZWdlcl0KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlT3V0cHV0TmFtZShQb3J0VHlwZSBwb3J0VHlwZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIFN0cmluZyBlbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgU3RyaW5nIGNhbmRpZGF0ZSA9IG9wZXJhdGlvbk5hbWUgKyBlbmRpbmc7Ci0KLSAgICBpbnQgaSA9IDA7Ci0KLSAgICAvLyBsb29wIHVudGlsIHdlIGZpbmQgYSB1bmlxdWUgbmFtZSAodGhlIG5hbWUgd2lsbCBjb25zaXN0IG9mIHRoZSBvcGVyYXRpb25OYW1lICsgZW5kaW5nICsgYW4gaW50ZWdlcikKLSAgICB3aGlsZSAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdW5pcXVlID0gdHJ1ZTsKLQotICAgICAgLy8gZGV0ZXJtaW5lIGlmIHRoaXMgY29tYmluYXRpb24gaXMgdW5pcXVlIHdpdGhpbiB0aGUgY3VycmVudCBwb3J0dHlwZQkJCQotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpICYmIHVuaXF1ZTspCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBjdXJyZW50ID0gKE9wZXJhdGlvbikgaXQubmV4dCgpOwotICAgICAgICAvLyBUT0RPOiBwb3J0IGNoZWNrCi0gICAgICAgIC8vIG9sZAkJCQlpZihjdXJyZW50LmlzU2V0RU91dHB1dCgpICYmIGN1cnJlbnQuZ2V0RU91dHB1dCgpLmlzU2V0TmFtZSgpKSB7Ci0gICAgICAgIGlmIChjdXJyZW50LmdldEVPdXRwdXQoKSAhPSBudWxsICYmIGN1cnJlbnQuZ2V0RU91dHB1dCgpLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN1cnJlbnQuZ2V0RU91dHB1dCgpLmdldE5hbWUoKS5lcXVhbHMoY2FuZGlkYXRlKSkKLSAgICAgICAgICAgIHVuaXF1ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAodW5pcXVlKQotICAgICAgICBuYW1lID0gY2FuZGlkYXRlOwotICAgICAgZWxzZQotICAgICAgICBjYW5kaWRhdGUgPSBvcGVyYXRpb25OYW1lICsgZW5kaW5nICsgaTsKLSAgICAgIGkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgbmFtZSB3aGljaCBpcyBub3QgdXNlZCBieSBhbnkgb3RoZXIgcGFydCBpbiB0aGUgbWVzc2FnZS4KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlUGFydE5hbWUoTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gIAlMaXN0IG5hbWVzID0gZ2V0VXNlZFBhcnROYW1lcyhtZXNzYWdlKTsKLQotICAgIC8vIE5vdyBzZWFyY2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCBhbiB1bnVzZWQgbmFtZQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKCJOZXdQYXJ0IiwgbmFtZXMpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVBhcnROYW1lKE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gIAlpZiAoYmFzZU5hbWUgPT0gbnVsbCkKLSAgCXsKLSAgCQliYXNlTmFtZSA9ICJOZXdQYXJ0IjsKLSAgCX0KLSAgCQotICAJTGlzdCBuYW1lcyA9IGdldFVzZWRQYXJ0TmFtZXMobWVzc2FnZSk7Ci0KLSAgICAvLyBOb3cgc2VhcmNoIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYW4gdW51c2VkIG5hbWUKLSAgICByZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgbmFtZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIHBvcnQgdHlwZSBpbiB0aGUgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlUG9ydFR5cGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gICAgaWYgKGJhc2VOYW1lID09IG51bGwpCi0gICAgewotICAgICAgYmFzZU5hbWUgPSAiTmV3UG9ydFR5cGUiOwotICAgIH0KLQotICAgIExpc3QgbmFtZXMgPSBnZXRVc2VkUG9ydFR5cGVOYW1lcyhkZWZpbml0aW9uKTsKLQotICAgIC8vIE5vdyBzZWFyY2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCBhbiB1bnVzZWQgbmFtZQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKGJhc2VOYW1lLCBuYW1lcyk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVOYW1lSGVscGVyKFN0cmluZyBiYXNlTmFtZSwgTGlzdCBuYW1lcykKLSAgewotICAgIGludCBpID0gMDsKLQotICAgIFN0cmluZyBuYW1lID0gYmFzZU5hbWU7Ci0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgaWYgKCFuYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpKys7Ci0gICAgICBuYW1lID0gYmFzZU5hbWUgKyBpOwotICAgIH0KLQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIHNlcnZpY2UgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVNlcnZpY2VOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAJTGlzdCBuYW1lcyA9IGdldFVzZWRTZXJ2aWNlTmFtZXMoZGVmaW5pdGlvbik7Ci0KLSAgICAvLyBOb3cgc2VhcmNoIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYW4gdW51c2VkIG5hbWUKLSAgICByZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcigiTmV3U2VydmljZSIsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBiaW5kaW5nIGluIHRoZSBkZWZpbml0aW9uLgotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVCaW5kaW5nTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBiYXNlTmFtZSkKLSAgewotICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGJhc2VOYW1lID0gIk5ld0JpbmRpbmciOwotICAgIH0KLQotICAgIExpc3QgbmFtZXMgPSBnZXRVc2VkQmluZGluZ05hbWVzKGRlZmluaXRpb24pOwotCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlUHJlZml4KERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGJhc2VQcmVmaXgpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gYmFzZVByZWZpeDsKLSAgICBmb3IgKGludCBpID0gMTsgZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UocHJlZml4KSAhPSBudWxsOyBpKyspCi0gICAgewotICAgICAgcHJlZml4ID0gYmFzZVByZWZpeCArIGk7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVBvcnROYW1lKFNlcnZpY2Ugc2VydmljZSwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gICAgaWYgKGJhc2VOYW1lID09IG51bGwpCi0gICAgewotICAgICAgYmFzZU5hbWUgPSAiTmV3UG9ydCI7Ci0gICAgfQotICAKLSAgICBMaXN0IG5hbWVzID0gZ2V0VXNlZFBvcnROYW1lcyhzZXJ2aWNlKTsKLSAgICAKLQlyZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgbmFtZXMpOwotICB9Ci0JCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBNZXNzYWdlUmVmZXJlbmNlIG1lc3NSZWYpCi0gIHsgICAKLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgaWYgKG1lc3NSZWYgaW5zdGFuY2VvZiBJbnB1dCkKLSAgICB7Ci0gICAgICBuYW1lID0gY3JlYXRlT3BlcmF0aW9uTmFtZShtZXNzUmVmLCAiUmVxdWVzdCIpOyAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAobWVzc1JlZiBpbnN0YW5jZW9mIE91dHB1dCkKLSAgICB7Ci0gICAgICBuYW1lID0gY3JlYXRlT3BlcmF0aW9uTmFtZShtZXNzUmVmLCAiUmVzcG9uc2UiKTsgCi0gICAgfQotICAgIGVsc2UgaWYgKG1lc3NSZWYgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyBmYXVsdE5hbWUgPSAoKEZhdWx0KSBtZXNzUmVmKS5nZXROYW1lKCk7Ci0gICAgICBpZiAoZmF1bHROYW1lID09IG51bGwgfHwgZmF1bHROYW1lLmxlbmd0aCgpID09IDApCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGZhdWx0TmFtZSA9ICJGYXVsdCI7Ci0gICAgICB9Ci0gICAgICBuYW1lID0gY3JlYXRlT3BlcmF0aW9uTmFtZShtZXNzUmVmLCBmYXVsdE5hbWUpOyAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICByZXR1cm4gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCBuYW1lKTsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkRmF1bHROYW1lcyhPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpLm5leHQoKTsKLSAgICAgIG5hbWVzLmFkZChmYXVsdC5nZXROYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0VXNlZE9wZXJhdGlvbk5hbWVzKFBvcnRUeXBlIHBvcnRUeXBlKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgbmFtZXMuYWRkKG9wLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuYW1lczsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRQYXJ0TmFtZXMoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpLm5leHQoKTsKLSAgICAgIG5hbWVzLmFkZChwYXJ0LmdldE5hbWUoKSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkUG9ydFR5cGVOYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgICBBcnJheUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBpLm5leHQoKTsKLSAgICAgIC8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICAgIC8vCQkJaWYgKHBvcnRUeXBlLmlzU2V0UU5hbWUoKSkKLSAgICAgIGlmIChwb3J0VHlwZS5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzLmFkZChwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICAgIAotICB9Ci0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkU2VydmljZU5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgIC8vIEZpcnN0IGJ1aWxkIGEgbGlzdCBvZiBuYW1lcyBhbHJlYWR5IHVzZWQKLSAgICBBcnJheUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFU2VydmljZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGkubmV4dCgpOwotICAgICAgLy8gVE9ETzogcG9ydCBjaGVjawotICAgICAgLy8gCQlpZihzZXJ2aWNlLmlzU2V0UU5hbWUoKSkKLSAgICAgIGlmIChzZXJ2aWNlLmdldFFOYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgbmFtZXMuYWRkKHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuYW1lczsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRNZXNzYWdlTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RU1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE1lc3NhZ2UgbXNnID0gKE1lc3NhZ2UpIGkubmV4dCgpOwotICAgICAgLy8gVE9ETzogcG9ydCBjaGVjawotICAgICAgaWYgKG1zZy5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgICAgIC8vCQkJaWYobXNnLmlzU2V0UU5hbWUoKSkKLSAgICAgICAgbmFtZXMuYWRkKG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRCaW5kaW5nTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBpLm5leHQoKTsKLSAgICAgIC8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICAgIC8vCQkJaWYgKGJpbmRpbmcuaXNTZXRRTmFtZSgpKQotICAgICAgaWYgKGJpbmRpbmcuZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lcy5hZGQoYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRQb3J0TmFtZXMoU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgLy8gRmlyc3QgYnVpbGQgYSBsaXN0IG9mIG5hbWVzIGFscmVhZHkgdXNlZAotICAgIEFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgaS5uZXh0KCk7Ci0KLSAgICAgIGlmIChwb3J0LmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lcy5hZGQocG9ydC5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVPcGVyYXRpb25OYW1lKE9iamVjdCBvYmplY3QsIFN0cmluZyBzdWZmaXgpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICB7Ci0gICAgICBFT2JqZWN0IHBhcmVudCA9ICgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICgoT3BlcmF0aW9uKXBhcmVudCkuZ2V0TmFtZSgpOwotICAgICAgfQotICAgIH0gCi0gICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCArPSBzdWZmaXg7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvTm9kZUFzc29jaWF0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9Ob2RlQXNzb2NpYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNWU5NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9Ob2RlQXNzb2NpYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgTm9kZUFzc29jaWF0aW9uTWFuYWdlcgoteyAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25bXSBleHRlbnNpb25zOwotICBwcm90ZWN0ZWQgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyW10gcHJvdmlkZXJzOwotCi0gIHB1YmxpYyBOb2RlQXNzb2NpYXRpb25NYW5hZ2VyKCkKLSAgeyAgICAgICAgICAgICAKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uTk9ERV9BU1NPQ0lBVElPTl9QUk9WSURFUik7IAotICAgIHByb3ZpZGVycyA9IG5ldyBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXJbZXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcHJvdmlkZXJzW2ldID0gKElOb2RlQXNzb2NpYXRpb25Qcm92aWRlcilleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk5PREVfQVNTT0NJQVRJT05fUFJPVklERVIsIG51bGwpOwotICAgIH0KLSAgfSAgICAgICAgCi0KLSAgcHJvdGVjdGVkIElOb2RlQXNzb2NpYXRpb25Qcm92aWRlciBnZXRBcHBpY2FibGVQcm92aWRlcihPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0uaXNBcHBsaWNhYmxlKG9iamVjdCkpCi0gICAgICB7Ci0gICAgICAgIHByb3ZpZGVyID0gcHJvdmlkZXJzW2ldOwotICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm92aWRlcjsKLSAgfQotICAgICAgICAKLQotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0Rm9yTm9kZShPYmplY3Qgcm9vdE9iamVjdCwgRWxlbWVudCB0YXJnZXROb2RlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgY3VycmVudEluZGV4ID0gMDsKLQotICAgIEVsZW1lbnRbXSBlbGVtZW50Q2hhaW4gPSBnZXRQYXJlbnRFbGVtZW50Q2hhaW4oKEVsZW1lbnQpdGFyZ2V0Tm9kZSk7Ci0KLSAgICBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIgcCA9IGdldEFwcGljYWJsZVByb3ZpZGVyKHJvb3RPYmplY3QpOwotICAgIGlmIChwICE9IG51bGwpCi0gICAgewotICAgICAgTm9kZSByb290T2JqZWN0Tm9kZSA9IHAuZ2V0Tm9kZShyb290T2JqZWN0KTsKLQotICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCA8IGVsZW1lbnRDaGFpbi5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZSA9IGVsZW1lbnRDaGFpbltjdXJyZW50SW5kZXhdOwotICAgICAgICBpZiAoZSA9PSByb290T2JqZWN0Tm9kZSkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICBjdXJyZW50SW5kZXgrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50SW5kZXgrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgICAgCi0gICAgT2JqZWN0IGN1cnJlbnRPYmplY3QgPSByb290T2JqZWN0OyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGludCBlbmRbXSA9IG5ldyBpbnRbMV07Ci0KLSAgICB3aGlsZSAoY3VycmVudEluZGV4IDwgZWxlbWVudENoYWluLmxlbmd0aCkKLSAgICB7ICAgICAgICAgICAgICAgCi0gICAgICBwID0gZ2V0QXBwaWNhYmxlUHJvdmlkZXIoY3VycmVudE9iamVjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAocCAhPSBudWxsKQotICAgICAgewotICAgICAgICBlbmRbMF0gPSBlbGVtZW50Q2hhaW4ubGVuZ3RoOwotICAgICAgICBjdXJyZW50T2JqZWN0ID0gcC5nZXRNb2RlbE9iamVjdChjdXJyZW50T2JqZWN0LCBlbGVtZW50Q2hhaW4sIGN1cnJlbnRJbmRleCwgZW5kKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjdXJyZW50T2JqZWN0ID09IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gZmFpbHVyZQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGN1cnJlbnRJbmRleCA9IE1hdGgubWF4KGVuZFswXSwgY3VycmVudEluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgCi0gICAgICAgIGJyZWFrOwotICAgICAgfSAKLSAgICB9ICAgICAKLQotICAgIHJldHVybiAoY3VycmVudEluZGV4ID09IGVsZW1lbnRDaGFpbi5sZW5ndGgpID8gY3VycmVudE9iamVjdCA6IG51bGw7Ci0gIH0gIAotICAgICAgICAgICAKLQotICBwdWJsaWMgTm9kZSBnZXROb2RlKE9iamVjdCBtb2RlbE9iamVjdCkKLSAgeyAgICAgICAgICAKLSAgICBOb2RlIHJlc3VsdCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChOb2RlKW1vZGVsT2JqZWN0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyIHAgPSBnZXRBcHBpY2FibGVQcm92aWRlcihtb2RlbE9iamVjdCk7ICAgICAgICAgICAgICAgCi0gICAgICBpZiAocCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwLmdldE5vZGUobW9kZWxPYmplY3QpOwotICAgICAgfQotICAgIH0gICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi0KLSAgcHJvdGVjdGVkIEVsZW1lbnRbXSBnZXRQYXJlbnRFbGVtZW50Q2hhaW4oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHdoaWxlIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoMCwgZWxlbWVudCk7Ci0gICAgICBOb2RlIG5vZGUgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgIGVsZW1lbnQgPSAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgPyAoRWxlbWVudClub2RlIDogbnVsbDsgICAgCi0gICAgfSAgICAgICAgICAgICAgICAKLQotICAgIGludCBsaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgIEVsZW1lbnRbXSByZXN1bHQgPSBuZXcgRWxlbWVudFtsaXN0U2l6ZV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHJlc3VsdFtpXSA9IChFbGVtZW50KWxpc3QuZ2V0KGkpOwotICAgIH0gICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL09wZW5PblNlbGVjdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjVkMmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkltcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFN3aXRjaDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgT3Blbk9uU2VsZWN0aW9uSGVscGVyIGV4dGVuZHMgV1NETFN3aXRjaAotewotICBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIEF0dHIgYXR0ciA9IG51bGw7Ci0gIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLSAgcHVibGljIE9wZW5PblNlbGVjdGlvbkhlbHBlcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgb3BlbkVkaXRvcihFT2JqZWN0IGVPYmplY3QpCi0gIHsKLSAgICBTdHJpbmdbXSBhcnJheSA9IGNvbXB1dGVTcGVjaWZpY2F0aW9uKGVPYmplY3QpOwotICAgIGlmIChhcnJheSAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wZW5FZGl0b3IoYXJyYXlbMF0sIGFycmF5WzFdKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBvcGVuRWRpdG9yKE5vZGUgbm9kZSkKLSAgewotICAgIFN0cmluZ1tdIGFycmF5ID0gY29tcHV0ZVNwZWNpZmljYXRpb24obm9kZSk7Ci0gICAgaWYgKGFycmF5ICE9IG51bGwpCi0gICAgewotICAgICAgb3BlbkVkaXRvcihhcnJheVswXSwgYXJyYXlbMV0pOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIG9wZW5FZGl0b3IoU3RyaW5nIHJlc291cmNlLCBTdHJpbmcgc3BlYykKLSAgewotICAgIFN0cmluZyBwYXR0ZXJuID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7Ci0gICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2Uuc3RhcnRzV2l0aChwYXR0ZXJuKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgocmVzb3VyY2Uuc3Vic3RyaW5nKHBhdHRlcm4ubGVuZ3RoKCkpKTsKLSAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQotICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCAmJgotICAgICAgICAgICAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCkuZXF1YWxzKGZpbGUpKQotICAgICAgICB7ICAKLQkJCSAgICBJTmF2aWdhdGlvbkxvY2F0aW9uIGN1cnJlbnQgPSB3b3JrYmVuY2hQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5KCkuZ2V0Q3VycmVudExvY2F0aW9uKCk7Ci0gICAgICAgIAl3b3JrYmVuY2hQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5KCkubWFya0xvY2F0aW9uKGVkaXRvclBhcnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZS5lbmRzV2l0aCgieHNkIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVkaXRvclBhcnQgPSB3b3JrYmVuY2hQYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgV1NETEVkaXRvclBsdWdpbi5YU0RfRURJVE9SX0lEKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBhbHJlYWR5IGluIHRoZSB3c2RsZWRpdG9yCi0JCQkgICAgICAgIGVkaXRvclBhcnQgPSAgd29ya2JlbmNoUGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSksIGVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGluaXRFeCkKLSAJCQkJCXsKLSAJCQkJCX0KLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRoZUNsYXNzID0gZWRpdG9yUGFydC5nZXRDbGFzcygpOwotICAgICAgICBDbGFzc1tdIG1ldGhvZEFyZ3MgPSB7IFN0cmluZy5jbGFzcyB9OwotICAgICAgICBNZXRob2QgbWV0aG9kID0gdGhlQ2xhc3MuZ2V0TWV0aG9kKCJvcGVuT25TZWxlY3Rpb24iLCBtZXRob2RBcmdzKTsKLSAgICAgICAgT2JqZWN0IGFyZ3NbXSA9IHsgc3BlYyB9OwotICAgICAgICBtZXRob2QuaW52b2tlKGVkaXRvclBhcnQsIGFyZ3MpOwotICAgICAgICB3b3JrYmVuY2hQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5KCkubWFya0xvY2F0aW9uKGVkaXRvclBhcnQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBjb21wdXRlU3BlY2lmaWNhdGlvbihFT2JqZWN0IGVPYmplY3QpCi0gIHsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotICAgIE9iamVjdCByZWZlcmVuY2VkT2JqZWN0ID0gZG9Td2l0Y2goZU9iamVjdCk7Ci0gICAgaWYgKHJlZmVyZW5jZWRPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgIHsKLSAgICAgIEVPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSAoRU9iamVjdClyZWZlcmVuY2VkT2JqZWN0OwotICAgICAgaWYgKHJlZmVyZW5jZWRFT2JqZWN0ICE9IGVPYmplY3QgfHwgCi0gICAgICAgICByZWZlcmVuY2VkRU9iamVjdC5lUmVzb3VyY2UoKSAhPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpKQotICAgICAgeyAgICAgICAgCi0gICAgICAKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gcmVmZXJlbmNlZEVPYmplY3QuZVJlc291cmNlKCk7Ci0gICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgcmVzdWx0WzBdID0gcmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLSAgICAgICAgcmVzdWx0WzFdID0gcmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQocmVmZXJlbmNlZEVPYmplY3QpOwotICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGNvbXB1dGVTcGVjaWZpY2F0aW9uKE5vZGUgbm9kZSkKLSAgewotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgIGF0dHIgPSAoQXR0cilub2RlOwotICAgICAgICAgIGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgZWxlbWVudCA9IChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSA/IChFbGVtZW50KXBhcmVudCA6IG51bGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KGRlZmluaXRpb24sIGVsZW1lbnQpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGNvbXB1dGVTcGVjaWZpY2F0aW9uKChFT2JqZWN0KW9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBiaW5kaW5nOwotICAgIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlUGFydChQYXJ0IHBhcnQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gcGFydDsKLSAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgPT0gZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSBwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCA/IChPYmplY3QpcGFydC5nZXRUeXBlRGVmaW5pdGlvbigpIDogKE9iamVjdClwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBvcnQoUG9ydCBwb3J0KQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IHBvcnQ7Ci0gICAgaWYgKGlzTWF0Y2hpbmdBdHRyaWJ1dGUoV1NETENvbnN0YW50cy5CSU5ESU5HX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gcG9ydC5nZXRFQmluZGluZygpOwotCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBmYXVsdDsKLSAgICBpZiAoaXNNYXRjaGluZ0F0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBmYXVsdC5nZXRNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VJbnB1dChJbnB1dCBpbnB1dCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBpbnB1dDsKLSAgICBpZiAoaXNNYXRjaGluZ0F0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpbnB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBvdXRwdXQ7Ci0KLSAgICBpZiAoaXNNYXRjaGluZ0F0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBvdXRwdXQuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlSW1wb3J0KEltcG9ydCB0aGVJbXBvcnQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gdGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRoZUltcG9ydC5nZXRFU2NoZW1hKCk7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIE5lZWQgdG8gcmVzb2x2ZSBpbXBvcnRzIGJlY2F1c2UgdGhlIG1vZGVsIGRvZXNuJ3QgYXV0b21hdGljYWxseQotICAgICAgICAvLyBkbyBpdCBmb3IgdXMKLSAgICAgICAgKChJbXBvcnRJbXBsKXRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICAgIHJlc3VsdCA9IHRoZUltcG9ydC5nZXRFU2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgewotICAgIHJldHVybiB3c2RsRWxlbWVudDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc01hdGNoaW5nQXR0cmlidXRlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiBhdHRyICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKGF0dHIuZ2V0TmFtZSgpKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1JlZmVyZW5jZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvUmVmZXJlbmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVjYmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvUmVmZXJlbmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLSAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExTd2l0Y2g7Ci0KLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZU1hbmFnZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZXJuYWxBZGFwdGVyRmFjdG9yeSBpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5ID0gbmV3IEludGVybmFsQWRhcHRlckZhY3RvcnkoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBiaW5kaW5nc0NoYW5nZWQoIE9wZXJhdGlvbiBvcGVyYXRpb24pOwotICB9ICAgICAKLQotICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGFwdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgaW50ZXJuYWxBZGFwdGVyRmFjdG9yeS5hZGFwdChkZWZpbml0aW9uKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpaS5uZXh0KCk7Ci0gICAgICBpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5LmFkYXB0QmluZGluZyhiaW5kaW5nKTsKLSAgICB9Ci0gIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQmluZGluZ0xpc3RlbmVyKE9wZXJhdGlvbiBvcGVyYXRpb24sIExpc3RlbmVyIGxpc3RlbmVyKQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBPcGVyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoT3BlcmF0aW9uQWRhcHRlcilpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9wZXJhdGlvbik7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsgCi0gICAgfQotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQmluZGluZ0xpc3RlbmVyKE9wZXJhdGlvbiBvcGVyYXRpb24sIExpc3RlbmVyIGxpc3RlbmVyKQotICB7IAotICAgIE9wZXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChPcGVyYXRpb25BZGFwdGVyKWludGVybmFsQWRhcHRlckZhY3RvcnkuYWRhcHQob3BlcmF0aW9uKTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOyAKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmlyZU5vdGlmaWNhdGlvbkZvclBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgLy8gZ2V0IHRoZSBhZGFwdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBhbmQgbm90aWZ5IGxpc3RlbmVycwotICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgIGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JPcGVyYXRpb24oKE9wZXJhdGlvbilpLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmlyZU5vdGlmaWNhdGlvbkZvck9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChPcGVyYXRpb25BZGFwdGVyKWludGVybmFsQWRhcHRlckZhY3RvcnkuYWRhcHQob3BlcmF0aW9uKTsKLSAgICAgIGFkYXB0ZXIuZmlyZUJpbmRpbmdzQ2hhbmdlZCgpOwotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi0gIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBXU0RMU3dpdGNoIHdzZGxTd2l0Y2ggPSBuZXcgV1NETFN3aXRjaCgpCi0gICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdBZGFwdGVyKCk7Ci0JICAgICAgfQotCi0gCSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ0ZhdWx0QWRhcHRlcigpOwotICAgICAgICB9ICAgCi0KLQkgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpOwotCSAgICAgIH0gCi0gICAKLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uQWRhcHRlcigpOwotCSAgICAgIH0gIAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlT3BlcmF0aW9uQWRhcHRlcigpOwotCSAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICB9OyAgIAotCi0gICAgICBPYmplY3QgbyA9IHdzZGxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQotICAgICAgQWRhcHRlciByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgICAgewotICAgICAgICByZXN1bHQgID0gKEFkYXB0ZXIpbzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZGlkIG5vdCBjcmVhdGUgYWRhcHRlciBmb3IgdGFyZ2V0IDogIiArIHRhcmdldCk7Ci0gICAgICAgIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlQWRhcHRlcigiICsgdGFyZ2V0ICsgIikgIiArIHJlc3VsdCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ0FkYXB0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQmluZGluZ0FkYXB0ZXIoKTsKLSAgICB9ICAgICAgICAKLQotIAkgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdGYXVsdEFkYXB0ZXIoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nRmF1bHRBZGFwdGVyKCk7Ci0gICAgfSAgICAgCi0KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpCi0gICAgeyAgICAgCi0gICAgICByZXR1cm4gbmV3IEJpbmRpbmdPcGVyYXRpb25BZGFwdGVyKCk7Ci0gICAgfSAgICAgIAotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWZpbml0aW9uQWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IERlZmluaXRpb25BZGFwdGVyKCk7Ci0JICB9IAotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVPcGVyYXRpb25BZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgT3BlcmF0aW9uQWRhcHRlcigpOwotCSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQpCi0gICAgewotICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsID8gYWRhcHQodGFyZ2V0LCBpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5KSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRhcHRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgICAgIAotICAgIHsKLSAgICAgIGFkYXB0KGJpbmRpbmcpOyAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24paS5uZXh0KCk7Ci0gICAgICAgIGFkYXB0KGJpbmRpbmdPcGVyYXRpb24pOyAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdClqLm5leHQoKTsKLSAgICAgICAgICBhZGFwdChiaW5kaW5nRmF1bHQpOyAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgfSAgCi0gIAotCi0gIHByb3RlY3RlZCBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQmFzZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbAotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5OwotICAgIH0gICAKLQotICAgIHB1YmxpYyBXU0RMUGFja2FnZSBnZXRQYWNrYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgfQotCi0gICAgCi0gIC8vIERlZmluaXRpb25BZGFwdGVyCi0gIC8vCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlcgotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSA9PSBnZXRQYWNrYWdlKCkuZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0gICAgICAgIHN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREOgotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGhhbmRsZUFkZCgoQmluZGluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBuZXdWYWx1ZXMgPSAoKENvbGxlY3Rpb24pbmV3VmFsdWUpLml0ZXJhdG9yKCk7ICBuZXdWYWx1ZXMuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZUFkZCgoQmluZGluZyluZXdWYWx1ZXMubmV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9ICAgIAotICAgIH0gICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkKEJpbmRpbmcgYmluZGluZykKLSAgICB7ICAKLSAgICAgIGludGVybmFsQWRhcHRlckZhY3RvcnkuYWRhcHRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICB9ICAgICAKLSAgICAgICAgICAKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQmluZGluZ0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlcgotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7IAotICAgICAgaWYgKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSA9PSBnZXRQYWNrYWdlKCkuZ2V0QmluZGluZ19FUG9ydFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gZmlyZU5vdGlmY2F0aW9uIGZvciBhbGwgb2YgdGhlIG9wZXJhdGlvbiBvZiB0aGUgb2xkIGFuZCBuZXcgcG9ydFR5cGUKLSAgICAgICAgZmlyZU5vdGlmaWNhdGlvbkZvclBvcnRUeXBlKChQb3J0VHlwZSltc2cuZ2V0TmV3VmFsdWUoKSk7Ci0gICAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JQb3J0VHlwZSgoUG9ydFR5cGUpbXNnLmdldE9sZFZhbHVlKCkpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZSBpZiAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpID09IGdldFBhY2thZ2UoKS5nZXRCaW5kaW5nX0VCaW5kaW5nT3BlcmF0aW9ucygpKQotICAgICAgewotICAgICAgICAvLyBmaXJlTm90aWZjYXRpb24gZm9yIGFsbCBvcGVyYXRpb25zIHRoYXQgd2VyZSBhZGRlZCBvciByZW1vdmVkCi0gICAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IG1zZy5nZXROZXdWYWx1ZSgpOwotICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLSAgICAgICAgc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBoYW5kbGVBZGQoKEJpbmRpbmdPcGVyYXRpb24pbmV3VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbmV3VmFsdWVzID0gKChDb2xsZWN0aW9uKW5ld1ZhbHVlKS5pdGVyYXRvcigpOyAgbmV3VmFsdWVzLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBoYW5kbGVBZGQoKEJpbmRpbmdPcGVyYXRpb24pbmV3VmFsdWVzLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAgICAgIAotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGhhbmRsZVJlbW92ZSgoQmluZGluZ09wZXJhdGlvbilvbGRWYWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBvbGRWYWx1ZXMgPSAoKENvbGxlY3Rpb24pb2xkVmFsdWUpLml0ZXJhdG9yKCk7ICBvbGRWYWx1ZXMuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZVJlbW92ZSgoQmluZGluZ09wZXJhdGlvbilvbGRWYWx1ZXMubmV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfSAgICAKLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZChCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgewotICAgICAgaW50ZXJuYWxBZGFwdGVyRmFjdG9yeS5hZGFwdChiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmaXJlTm90aWZpY2F0aW9uRm9yT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgfSAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgIH0KLSAgICB9ICAgCi0gIH0gICAgICAgCi0gIAotCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCaW5kaW5nT3BlcmF0aW9uQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKWdldFRhcmdldCgpOwotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZU9wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICB9ICAgICAgICAgICAgICAgIAotICB9Ci0gIAotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQmluZGluZ0ZhdWx0QWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KWdldFRhcmdldCgpOwotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pYmluZGluZ0ZhdWx0LmVDb250YWluZXIoKTsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmaXJlTm90aWZpY2F0aW9uRm9yT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgfSAgICAgICAgICAgICAgICAKLSAgfSAKLSAgCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBPcGVyYXRpb25BZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgCi0gIHsgICAgIAotICAgIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gICAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIHZvaWQgZmlyZUJpbmRpbmdzQ2hhbmdlZCgpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKWdldFRhcmdldCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTGlzdGVuZXIgbGlzdGVuZXIgPSAoTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgIGxpc3RlbmVyLmJpbmRpbmdzQ2hhbmdlZChvcGVyYXRpb24pOwotICAgICAgfQotICAgIH0gICAgICAgICAKLSAgfSAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMWZkYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBoZWxwIHN5bmNyb25pemUgc2VsZWN0aW9ucyBiZXR3ZWVuIHR3byBtb2RlbHMuCi0vLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbGVjdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLXsgCi0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBldmVudFNvdXJjZTsKLQotICBwdWJsaWMgdm9pZCBzZXRFdmVudFNvdXJjZShJU2VsZWN0aW9uUHJvdmlkZXIgZXZlbnRTb3VyY2UpCi0gIHsKLSAgICB0aGlzLmV2ZW50U291cmNlID0gZXZlbnRTb3VyY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSAKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9ICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSAKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb247Ci0gIH0gICAgCi0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHNwZWNpYWxpemVkIHRvIHJldHVybiB0aGUgY29ycmVjdCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgJ290aGVyJyBtb2RlbAotICAgKi8KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3RGb3JPdGhlck1vZGVsKE9iamVjdCBvYmplY3QpOwotCi0gICAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIG1vZGVsU2VsZWN0aW9uKSAgCi0gIHsgCi0gICAgTGlzdCBvdGhlck1vZGVsT2JqZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAobW9kZWxTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKW1vZGVsU2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBpLm5leHQoKTsgCi0gICAgICAgIE9iamVjdCBvdGhlck1vZGVsT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChtb2RlbE9iamVjdCk7ICAgICAgIAotICAgICAgICBpZiAob3RoZXJNb2RlbE9iamVjdCAhPSBudWxsKQotICAgICAgICB7IAotICAgICAgICAgIG90aGVyTW9kZWxPYmplY3RMaXN0LmFkZChvdGhlck1vZGVsT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAKLSAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5vZGVTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvdGhlck1vZGVsT2JqZWN0TGlzdCk7Ci0gICAgc2VsZWN0aW9uID0gbm9kZVNlbGVjdGlvbjsKLSAgICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KGV2ZW50U291cmNlICE9IG51bGwgPyBldmVudFNvdXJjZSA6IHRoaXMsIG5vZGVTZWxlY3Rpb24pOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9WYWxpZGF0ZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9WYWxpZGF0ZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhjNzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvVmFsaWRhdGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZUhlbHBlcgotewotICAvLyBYTUwgTGFuZyBjYW4gaGF2ZSBtYW55IGRpZmZlcmVudCB2YWxpZCBmb3JtYXRzCi0gIC8vIDEpIHh4ICAgICAgaWUuIGVuLCBmciwgZGUKLSAgLy8gMikgeHgteHggICBpZS4gZW4tVVMsIGVuLUZSCi0gIC8vIDMpIEkteHggICAgaWUuIEktZW4KLSAgLy8gNCkgWC14eCAgICBpZS4gWC1lbgotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1hNTExhbmcoU3RyaW5nIGxhbmcpCi0gIHsKLSAgICBpZiAobGFuZy5sZW5ndGgoKSA9PSAwKSAKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIGlmIChsYW5nLmxlbmd0aCgpID09IDEpIAotICAgIHsKLSAgICAgIGNoYXIgY2gwID0gbGFuZy5jaGFyQXQoMCk7Ci0gICAgICBpZiAoKGNoMCA+PSAnYScgJiYgY2gwIDw9ICd6JykgfHwgKGNoMCA+PSAnQScgJiYgY2gwIDw9ICdaJykpCi0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fTEFOR19UT09fU0hPUlQiKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfQ0hBUiIpICsgY2gwICsgCi0gICAgICAgIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfTkFNRV9JTlZBTElEX0NIQVJfRU5EIik7ICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBpbnQgb2Zmc2V0OwotCi0gICAgY2hhciBjaDAgPSBsYW5nLmNoYXJBdCgwKTsKLSAgICBpZiAobGFuZy5jaGFyQXQoMSkgPT0gJy0nKSAKLSAgICB7Ci0gICAgICBpZiAoY2gwID09ICdpJyB8fCBjaDAgPT0gJ0knIHx8IGNoMCA9PSAneCcgfHwgY2gwID09ICdYJykgCi0gICAgICAgIG9mZnNldCA9IDE7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fTkFNRV9JTlZBTElEX0NIQVIiKSArIGNoMCArIAotICAgICAgICBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY2hhciBjaDEgPSBsYW5nLmNoYXJBdCgxKTsKLSAgICAgIGlmICgoY2gwID49ICdhJyAmJiBjaDAgPD0gJ3onKSB8fCAoY2gwID49ICdBJyAmJiBjaDAgPD0gJ1onKSkKLSAgICAgICAgaWYgKChjaDEgPj0gJ2EnICYmIGNoMSA8PSAneicpIHx8IChjaDEgPj0gJ0EnICYmIGNoMSA8PSAnWicpKQotICAgICAgICAgIG9mZnNldCA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaDEgKyAKLSAgICAgICAgICBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCIpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaDAgKyAKLSAgICAgICAgVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQiKTsKLSAgICB9Ci0KLSAgICBpZiAobGFuZy5sZW5ndGgoKSA+IG9mZnNldCkgCi0gICAgewotICAgICAgY2hhciBjaCA9IGxhbmcuY2hhckF0KG9mZnNldCsrKTsKLSAgICAgIGlmIChjaCAhPSAnLScpIAotICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX0hZUEhFTl9ORUVERUQiKSArIEludGVnZXIudG9TdHJpbmcob2Zmc2V0LTEpOyAgICAgICAgCi0gICAgICBlbHNlIAotICAgICAgewotICAgICAgICB3aGlsZSAodHJ1ZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2ggPT0gJy0nKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGFuZy5sZW5ndGgoKSA9PSBvZmZzZXQpIAotICAgICAgICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX0hZUEhFTl9FTkRJTkciKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY2ggPSBsYW5nLmNoYXJBdChvZmZzZXQrKyk7Ci0gICAgICAgICAgICBpZiAoKGNoIDwgJ2EnIHx8IGNoID4gJ3onKSAmJiAoY2ggPCAnQScgfHwgY2ggPiAnWicpKSAKLSAgICAgICAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfQ0hBUiIpICsgY2ggKyAKLSAgICAgICAgICAgICAgVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxhbmcubGVuZ3RoKCkgPT0gb2Zmc2V0KQotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgaWYgKChjaCA8ICdhJyB8fCBjaCA+ICd6JykgJiYgKGNoIDwgJ0EnIHx8IGNoID4gJ1onKSkgCi0gICAgICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaCArIAotICAgICAgICAgICAgVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQiKTsgICAgICAgICAgICAgCi0gICAgICAgICAgZWxzZSBpZiAobGFuZy5sZW5ndGgoKSA9PSBvZmZzZXQpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICBjaCA9IGxhbmcuY2hhckF0KG9mZnNldCsrKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBtaW4gdmFsdWUgaXMgY29ycmVjdC4KLSAgICogQSBtaW5pbXVtIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCA8IG1heFZhbHVlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBpc1ZhbGlkTWluVmFsdWUoU3RyaW5nIG1pblZhbHVlLCBTdHJpbmcgbWF4VmFsdWUpCi0gIHsKLSAgICBpbnQgbWluOwotCi0gICAgaWYgKG1pblZhbHVlID09IG51bGwgfHwgbWluVmFsdWUuZXF1YWxzKCIiKSkKLSAgICB7Ci0gICAgICAvLyBOb3RoaW5nIHRvIGNoZWNrCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBtaW4gPSBJbnRlZ2VyLnBhcnNlSW50KG1pblZhbHVlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9FUlJPUl9NSU5fTk9UX1BPU0lUSVZFIik7Ci0gICAgfQotCi0gICAgaWYgKG1pbiA8IDApIAotICAgIHsKLSAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX0VSUk9SX01JTl9OT1RfUE9TSVRJVkUiKTsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpbnQgbWF4ID0gSW50ZWdlci5wYXJzZUludChtYXhWYWx1ZSk7Ci0gICAgICBpZiAobWluID4gbWF4KSAKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfRVJST1JfTUlOX1ZBTFVFIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgLy8gTWF4IGlzIG5vdCBhY2N1cmF0ZS4gRG9uJ3QgY29tcGFyZSBpdC4KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYXggdmFsdWUgaXMgY29ycmVjdC4KLSAgICogQSBtYXhpbXVtIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCA+IG1pblZhbHVlCi0gICAqCi0gICAqIEl0IGNhbiBhbHNvIGJlIHNldCB0aGUgc3RyaW5nICJ1bmJvdW5kZWQiCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBpc1ZhbGlkTWF4VmFsdWUoU3RyaW5nIG1heFZhbHVlLCBTdHJpbmcgbWluVmFsdWUpCi0gIHsKLSAgICBpbnQgbWF4OwotCi0gICAgaWYgKG1heFZhbHVlID09IG51bGwgfHwgbWF4VmFsdWUuZXF1YWxzKCIiKSkgCi0gICAgewotICAgICAgLy8gTm90aGluZyB0byBjaGVjawotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgaWYgKG1heFZhbHVlLmVxdWFscygidW5ib3VuZGVkIikpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgbWF4ID0gSW50ZWdlci5wYXJzZUludChtYXhWYWx1ZSk7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfRVJST1JfTUFYX05PVF9QT1NJVElWRSIpOwotICAgIH0KLQotICAgIGlmIChtYXggPCAwKSAKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9FUlJPUl9NQVhfTk9UX1BPU0lUSVZFIik7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IG1pbiA9IEludGVnZXIucGFyc2VJbnQobWluVmFsdWUpOwotICAgICAgaWYgKG1heCA8IG1pbikgCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX0VSUk9SX01BWF9WQUxVRSIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIC8vIE1pbiBpcyBub3QgYWNjdXJhdGUuIERvbid0IGNvbXBhcmUgaXQuCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBuYW1lIGNvbmZvcm1zIHRvIHRoZSBYTUwgc3BlYwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tYTUxOYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIGFsbG93RW50aXR5UmVmKQotICB7Ci0gICAgaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0gICAgY2hhciBjaGFyYWN0ZXI7Ci0KLSAgICBpZiAobGVuZ3RoID09IDApIAotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9XQVJOX05BTUVfTVVTVF9DT05UQUlOX0FUX0xFQVNUX09ORV9DSEFSIik7Ci0gICAgfQotICAgIAotICAgIGlmIChuYW1lLmluZGV4T2YoIiAiKSA+PSAwKQotICAgIHsKLSAgICAgIHJldHVybihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9XQVJOX05BTUVfSEFTX1NQQUNFIikpOwotICAgIH0KLQotICAgIGludCBpbmRleCA9IDA7Ci0gICAgaWYgKGxlbmd0aCA+IDAgJiYKLSAgICAgICAgbmFtZS5jaGFyQXQoMCkgPT0gJyUnKQotICAgIHsKLSAgICAgIGlmIChhbGxvd0VudGl0eVJlZikgCi0gICAgICB7Ci0gICAgICAgIC8vIHNraXAgb3ZlciB0aGUgZmlyc3QgY2hhcmFjdGVyIAotICAgICAgICBpbmRleCsrOwotICAgICAgfSAvLyBlbmQgb2YgaWYgKCkKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1dBUk5fTkFNRV9JTlZBTElEX0ZJUlNUIik7Ci0gICAgICB9IC8vIGVuZCBvZiBlbHNlCi0gICAgfQotICAgIAotICAgIGZvcig7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGNoYXJhY3RlciA9IG5hbWUuY2hhckF0KGluZGV4KTsKLQotICAgICAgaWYoaW5kZXggPT0gMCkKLSAgICAgIHsKLSAgICAgICAgaWYoICFpc1hNTE5hbWVTdGFydChjaGFyYWN0ZXIpICkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9GSVJTVCIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmKCFpc1hNTE5hbWVDaGFyKGNoYXJhY3RlcikpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKGluZGV4ID09IGxlbmd0aCAtIDEpICYmIC8vY2hlY2sgaWYgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgJzsnCi0gICAgICAgICAgICAgIGFsbG93RW50aXR5UmVmICYmCi0gICAgICAgICAgICAgIGNoYXJhY3RlciA9PSAnOycpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gd2UncmUgc3RpbGwgb2sgdGhlbgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfSAvLyBlbmQgb2YgaWYgKCkKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaGFyYWN0ZXIgKyAKLSAgICAgICAgICAgIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCIpOwotICAgICAgICAgIH0gLy8gZW5kIG9mIGVsc2UKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgbmFtZSBjb25mb3JtcyB0byB0aGUgWE1MIHNwZWMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrWE1MTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBjaGVja1hNTE5hbWUobmFtZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIGlzWE1MTmFtZVN0YXJ0Ci0gICAqKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1hNTE5hbWVTdGFydChjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChjaCA9PSAnXycgfHwgY2ggPT0gJzonIHx8IENoYXJhY3Rlci5pc0xldHRlcihjaCkgKTsKLSAgfQotCi0gIC8qKgotICAgKiBpc1hNTE5hbWVDaGFyCi0gICAqKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1hNTE5hbWVDaGFyKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnLScgfHwgY2ggPT0gJ18nIHx8IGNoID09ICc6Jyk7Ci0gIH0KLQotICAvKioKLSAgICogaXNYTUxQcmVmaXhTdGFydAotICAgKiovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxQcmVmaXhTdGFydChjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChjaCA9PSAnXycgfHwgQ2hhcmFjdGVyLmlzTGV0dGVyKGNoKSApOwotICB9Ci0KLSAgLyoqCi0gICAqIGlzWE1MUHJlZml4Q2hhcgotICAgKiovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxQcmVmaXhDaGFyKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnLScgfHwgY2ggPT0gJ18nKTsKLSAgfQotCi0gIC8qKgotICAgKiBwYXJzZUVsZW1lbnRUZXh0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUVsZW1lbnRUZXh0KFN0cmluZyB0ZXh0KQotICB7Ci0gICAgaWYgKHRleHQuaW5kZXhPZignPCcpICE9IC0xIHx8IHRleHQuaW5kZXhPZignPicpICE9IC0xKQotICAgIHsKLSAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fRUxFTUVOVF9JTlZBTElEX0NIQVIiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc2VBdHRyaWJ1dGVWYWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUuaW5kZXhPZignIicpICE9IC0xIHx8IHZhbHVlLmluZGV4T2YoJzwnKSAhPSAtMSB8fCB2YWx1ZS5pbmRleE9mKCc+JykgIT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9BVFRSSUJVVEVfSU5WQUxJRF9DSEFSIik7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc2VBREFUQVNlY3Rpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlQ0RBVEFTZWN0aW9uKFN0cmluZyBzZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlY3Rpb24uaW5kZXhPZigiXV0+IikgIT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9DREFUQV9JTlZBTElEX1NUUklORyIpOwotCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIHBhcnNlUHJvY2Vzc2lpbmdJbnN0cnVjdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EYXRhKFN0cmluZyBkYXRhKQotICB7Ci0gICAgaWYgKGRhdGEuaW5kZXhPZigiPz4iKSAhPSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX1BST0NFU1NJTkdfSU5WQUxJRF9TVFJJTkciKTsKLQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBwYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvblRhcmdldAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25UYXJnZXQoU3RyaW5nIHRhcmdldCkKLSAgewotICAgIGlmICh0YXJnZXQubGVuZ3RoKCkgPT0gMyAmJiAodGFyZ2V0LmluZGV4T2YoIlhNTCIpICE9IC0xIHx8IHRhcmdldC5pbmRleE9mKCJYTWwiKSAhPSAtMSB8fCB0YXJnZXQuaW5kZXhPZigiWG1MIikgIT0gLTEgfHwKLSAgICAgICAgdGFyZ2V0LmluZGV4T2YoInhNTCIpICE9IC0xIHx8IHRhcmdldC5pbmRleE9mKCJYbWwiKSAhPSAtMSB8fCB0YXJnZXQuaW5kZXhPZigieE1sIikgIT0gLTEgfHwKLSAgICAgICAgdGFyZ2V0LmluZGV4T2YoInhtTCIpICE9IC0xIHx8IHRhcmdldC5pbmRleE9mKCJ4bWwiKSAhPSAtMSkpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9QUk9DRVNTSU5HX1RBUkdFVF9JTlZBTElEX1NUUklORyIpOwotCi0gICAgfQotICAgIHJldHVybiBjaGVja1hNTE5hbWUodGFyZ2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBwYXJzQ29tbWVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VDb21tZW50KFN0cmluZyBjb21tZW50KQotICB7Ci0gICAgaWYgKGNvbW1lbnQuaW5kZXhPZigiLS0iKSAhPSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX0NPTU1FTlRfSU5WQUxJRF9TVFJJTkciKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgcHJlZml4IGNvbmZvcm1zIHRvIHRoZSBYTUwgc3BlYwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tYTUxQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgewotICAgIGludCBsZW5ndGggPSBwcmVmaXgubGVuZ3RoKCk7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBjaGFyIGNoYXJhY3RlcjsKLSAgICAKLSAgICBpZiAocHJlZml4LmluZGV4T2YoIiAiKSA+PSAwKQotICAgIHsKLSAgICAgIHJldHVybihVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fUFJFRklYX0hBU19TUEFDRSIpKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGNoYXJhY3RlciA9IHByZWZpeC5jaGFyQXQoaW5kZXgpOwotCi0gICAgICBpZighaXNYTUxQcmVmaXhDaGFyKGNoYXJhY3RlcikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKCJfV0FSTl9QUkVGSVhfSU5WQUxJRF9DSEFSIiwgU3RyaW5nLnZhbHVlT2YoY2hhcmFjdGVyKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMRWRpdG9yVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODIxYjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETEVkaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSVR5cGVTeXN0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETEVkaXRvclV0aWwgZXh0ZW5kcyBXU0RMQ29uc3RhbnRzCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgV1NETEVkaXRvclV0aWwgaW5zdGFuY2U7Ci0gIHByb3RlY3RlZCBOb2RlQXNzb2NpYXRpb25NYW5hZ2VyIG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIgPSBuZXcgTm9kZUFzc29jaWF0aW9uTWFuYWdlcigpOwotCi0gIHByb3RlY3RlZCBIYXNoTWFwIGVsZW1lbnROYW1lVG9UeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICBwdWJsaWMgc3RhdGljIFdTRExFZGl0b3JVdGlsIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IFdTRExFZGl0b3JVdGlsKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMRWRpdG9yVXRpbCgpCi0gIHsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoQklORElOR19FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoQklORElORykpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChERUZJTklUSU9OX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihERUZJTklUSU9OKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKERPQ1VNRU5UQVRJT04pKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoRkFVTFRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKEZBVUxUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KElNUE9SVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoSU1QT1JUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KElOUFVUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihJTlBVVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChNRVNTQUdFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihNRVNTQUdFKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KE9QRVJBVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoT1BFUkFUSU9OKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KE9VVFBVVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoT1VUUFVUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFBBUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFBBUlQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoUE9SVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoUE9SVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChQT1JUX1RZUEVfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFBPUlRfVFlQRSkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChTRVJWSUNFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihTRVJWSUNFKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFRZUEVTX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihUWVBFUykpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRXU0RMVHlwZShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0KLSAgICBJbnRlZ2VyIGludGVnZXIgPSAoSW50ZWdlcillbGVtZW50TmFtZVRvVHlwZU1hcC5nZXQoZWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgaWYgKGludGVnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpbnRlZ2VyLmludFZhbHVlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRQYXJlbnRFbGVtZW50Q2hhaW4oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHdoaWxlIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoMCwgZWxlbWVudCk7Ci0gICAgICBOb2RlIG5vZGUgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgIGVsZW1lbnQgPSAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgPyAoRWxlbWVudClub2RlIDogbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBFbGVtZW50IHRhcmdldEVsZW1lbnQpCi0gIHsKLSAgICBPYmplY3QgbyA9IG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIuZ2V0TW9kZWxPYmplY3RGb3JOb2RlKGRlZmluaXRpb24sIHRhcmdldEVsZW1lbnQpOwotICAgIHJldHVybiBvOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEZvck9iamVjdChPYmplY3QgbykKLSAgewotICAgIHJldHVybiAoKG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50KW8pLmdldEVsZW1lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldE5vZGVGb3JPYmplY3QoT2JqZWN0IG8pCi0gIHsKLSAgICByZXR1cm4gbm9kZUFzc29jaWF0aW9uTWFuYWdlci5nZXROb2RlKG8pOwotICB9Ci0KLSAgLy8gUHJvdmlkZSBhIG1hcHBpbmcgYmV0d2VlbiBEZWZpbml0aW9ucyBhbmQgSVR5cGVTeXN0ZW1Qcm92aWRlcnMKLSAgcHJpdmF0ZSBIYXNodGFibGUgdHlwZVN5c3RlbVByb3ZpZGVycyA9IG5ldyBIYXNodGFibGUoKTsKLSAgCi0gIHB1YmxpYyBJVHlwZVN5c3RlbVByb3ZpZGVyIGdldFR5cGVTeXN0ZW1Qcm92aWRlcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICByZXR1cm4gKElUeXBlU3lzdGVtUHJvdmlkZXIpdHlwZVN5c3RlbVByb3ZpZGVycy5nZXQoZGVmaW5pdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUeXBlU3lzdGVtUHJvdmlkZXIoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBJVHlwZVN5c3RlbVByb3ZpZGVyIHR5cGVTeXN0ZW1Qcm92aWRlcikKLSAgewotICAgIHR5cGVTeXN0ZW1Qcm92aWRlcnMucHV0KGRlZmluaXRpb24sdHlwZVN5c3RlbVByb3ZpZGVyKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgUU5hbWUgY3JlYXRlUU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgcHJlZml4ZWROYW1lKQotICB7Ci0gICAgUU5hbWUgcW5hbWUgPSBudWxsOwotICAgIGlmIChwcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSBwcmVmaXhlZE5hbWUuaW5kZXhPZigiOiIpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IChpbmRleCA9PSAtMSkgPyBudWxsIDogcHJlZml4ZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICBpZiAocHJlZml4ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZShwcmVmaXgpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gcHJlZml4ZWROYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgIHFuYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcW5hbWU7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudE5vZGVzKEV4dGVuc2libGVFbGVtZW50IGV4dGVuc2libGVFbGVtZW50KQotICB7Ci0gICAgLy8gRm9yIFR5cGVzLCBJIG5lZWQgdG8gZ2V0IGFsbCB0aGUgc2NoZW1hcwotICAgIGlmIChleHRlbnNpYmxlRWxlbWVudCBpbnN0YW5jZW9mIFR5cGVzKQotICAgIHsKLSAgICAgIFR5cGVzIHhzZEVFID0gKFR5cGVzKWV4dGVuc2libGVFbGVtZW50OwotICAgICAgcmV0dXJuIHhzZEVFLmdldFNjaGVtYXMoKTsKLSAgICB9Ci0gICAgLyoKLSAgICBMaXN0IGNoaWxkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IGdldEVsZW1lbnRGb3JPYmplY3QoZXh0ZW5zaWJsZUVsZW1lbnQpOwotICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwpCi0gICAgewotCi0gICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkTGlzdC5hZGQobm9kZUxpc3QuaXRlbShpKSk7Ci0gICAgICB9Ci0gICAgICBIYXNoTWFwIGV4dGVuc2libGVFbGVtZW50VGFibGUgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudEZvck9iamVjdChleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBleHRlbnNpYmxlRWxlbWVudFRhYmxlLnB1dChlbGVtZW50LCBlbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGV4dGVuc2libGVFbGVtZW50VGFibGUuZ2V0KG8pID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGlsZExpc3Q7Ci0gICAgKi8KLSAgICByZXR1cm4gZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICB9Ci0KLSAgLyoKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgJ2NoaWxkcmVuJyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IG1vZGVsIChXU0RMRWxlbWVudCkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0TW9kZWxHcmFwaFZpZXdDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0gIAlMaXN0IGNoaWxkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCQotICAJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0gIAkJUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpIG9iamVjdDsKLSAgICAgICAgY2hpbGRMaXN0LmFkZEFsbChwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkpOwotICAJfQotICAJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gIAkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIG9iamVjdDsKLSAgCQkKLSAgCQlpZiAob3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLSAgCQkJY2hpbGRMaXN0LmFkZChvcGVyYXRpb24uZ2V0RUlucHV0KCkpOwotICAJCX0KLSAgCQlpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKSB7Ci0gIAkJCWNoaWxkTGlzdC5hZGQob3BlcmF0aW9uLmdldEVPdXRwdXQoKSk7Ci0gIAkJfQotICAJCWNoaWxkTGlzdC5hZGRBbGwob3BlcmF0aW9uLmdldEZhdWx0cygpLnZhbHVlcygpKTsKLSAgCX0KLSAgCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2VSZWZlcmVuY2UpIHsKLSAgCQlNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2UgPSAoTWVzc2FnZVJlZmVyZW5jZSkgb2JqZWN0OwotICAJCWNoaWxkTGlzdC5hZGQobWVzc2FnZVJlZmVyZW5jZS5nZXRFTWVzc2FnZSgpKTsKLSAgCX0gIAkKLSAgCQotICAJcmV0dXJuIGNoaWxkTGlzdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjk2MzBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExNb2RlbExvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgcHJvdGVjdGVkIEN1c3RvbVdTRExNb2RlbExvY2F0b3IgY3VzdG9tV1NETE1vZGVsTG9jYXRvciA9IG5ldyBDdXN0b21XU0RMTW9kZWxMb2NhdG9yKCk7Ci0gIAotICBjbGFzcyBDdXN0b21XU0RMTW9kZWxMb2NhdG9yIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBXU0RMTW9kZWxMb2NhdG9yCi0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICAgIHsKLSAgICAgIHJldHVybiBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBuYW1lc3BhY2UsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gIH0KLQotICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICB7Ci0gICAgcmV0dXJuIGN1c3RvbVdTRExNb2RlbExvY2F0b3I7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExOb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiYjUzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExOb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOyAgICAgIAotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklOb2RlQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RDb21wb25lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFdTRExOb2RlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElOb2RlQXNzb2NpYXRpb25Qcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoT2JqZWN0IHBhcmVudE1vZGVsT2JqZWN0LCBFbGVtZW50W10gZWxlbWVudENoYWluLCBpbnQgc3RhcnQsIGludFtdIGVuZCkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IGN1cnJlbnRPYmplY3QgPSBwYXJlbnRNb2RlbE9iamVjdDsKLSAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbGVtZW50Q2hhaW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBnZXRNb2RlbE9iamVjdEhlbHBlcihjdXJyZW50T2JqZWN0LCBlbGVtZW50Q2hhaW5baV0pOwotICAgICAgaWYgKG8gPT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICBlbmRbMF0gPSBpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICBjdXJyZW50T2JqZWN0ID0gbzsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGN1cnJlbnRPYmplY3QgIT0gcGFyZW50TW9kZWxPYmplY3QgPyBjdXJyZW50T2JqZWN0IDogbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZShPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgIHJldHVybiAoKFdTRExFbGVtZW50SW1wbCltb2RlbE9iamVjdCkuZ2V0RWxlbWVudCgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0gICAgICAKLSAgcHJvdGVjdGVkIE9iamVjdCBnZXRNb2RlbE9iamVjdEhlbHBlcihPYmplY3QgcGFyZW50T2JqZWN0LCBFbGVtZW50IGVsZW1lbnROb2RlKQotICB7ICAgICAgICAgIAotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBjaGlsZENvbXBvbmVudExpc3QgPSAoKFdTRExFbGVtZW50SW1wbCkgcGFyZW50T2JqZWN0KS5nZXRNb2RlbE9iamVjdHMocGFyZW50T2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRDb21wb25lbnRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJT2JqZWN0IG8gPSBpLm5leHQoKTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLSAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgV1NETEVsZW1lbnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudCA9ICgoV1NETEVsZW1lbnRJbXBsKW8pLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQ29tcG9uZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQgPSAoKFhTRENvbXBvbmVudEltcGwpbykuZ2V0RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLQkJCWlmIChlbGVtZW50ID09IGVsZW1lbnROb2RlKQotCQkJewotCQkJCXJlc3VsdCA9IG87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLSAgfQotfSAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETFByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGVmNjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi1wdWJsaWMgY2xhc3MgV1NETFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLSAgcHVibGljIFdTRExQcmVmZXJlbmNlUGFnZSgpCi0gIHsKLSAgICBzdXBlcihGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlLkZMQVQpOwotICAgIHNldFByZWZlcmVuY2VTdG9yZShXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkKLSAgewotICAgIENvbXBvc2l0ZSBwYXJlbnQgPSBnZXRGaWVsZEVkaXRvclBhcmVudCgpOwotCUdyaWRMYXlvdXQgcGFyZW50TGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlwYXJlbnRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCXBhcmVudC5zZXRMYXlvdXQocGFyZW50TGF5b3V0KTsKLQkKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksIHNvbWUgY29udGV4dCBpZCBoZXJlKTsgCi0KLQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZ3JvdXAuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QUkVGX1BBR0VfQ1JFQVRJTkdfRklMRVMiKSk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OVUxMKTsKLSAgICBHcmlkRGF0YSBkYXRhMSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGExLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhMS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhMSk7Ci0JCi0gICAgU3RyaW5nRmllbGRFZGl0b3IgdGFyZ2V0TmFtZXNwYWNlID0gbmV3IFN0cmluZ0ZpZWxkRWRpdG9yKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UiKSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfUFJFRl9QQUdFX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSIpLCBjb21wb3NpdGUpOyAvLyBFeHRlcm5hbGl6ZQotICAgIEdyaWRMYXlvdXQgY29tcG9zaXRlTGF5b3V0ID0gKEdyaWRMYXlvdXQpY29tcG9zaXRlLmdldExheW91dCgpOwotICAgIGNvbXBvc2l0ZUxheW91dC5tYXJnaW5XaWR0aCA9IDU7ICAgLy8gRGVmYXVsdCB2YWx1ZQotICAgIGNvbXBvc2l0ZUxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBhZGRGaWVsZCh0YXJnZXROYW1lc3BhY2UpOwotICAgIHRhcmdldE5hbWVzcGFjZS5zZXRGb2N1cygpOwotCi0KLSAgICAvKiBEbyB3ZSBuZWVkIHRoaXMgcHJlZmVyZW5jZSBiZWxvdz8gIElmIHNvLCBjaGFuZ2UgV1NETEVkaXRvclBsdWdpbi5qYXZhIGFuZCB1c2UgdGhpcyBwcmVmZXJlbmNlIGluOgotICAgICAgIEh0dHBDb250ZW50R2VuZXJhdG9yLmphdmEKLSAgICAgICBTb2FwQ29udGVudEdlbmVyYXRvci5qYXZhCi0gICAgICAgU29hcFBvcnRPcHRpb25zUGFnZS5qYXZhCi0gICAgKi8KLS8vICAgIEh0dHBQb3J0T3B0aW9uc1BhZ2UuamF2YSAgICBTdHJpbmdGaWVsZEVkaXRvciBsb2NhdGlvbiA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcigiRGVmdWFsdCBMb2NhdGlvbjoiLCAiRGVmYXVsdCBMb2NhdGlvbjoiLCBlZGl0b3JHcm91cDEpOyAvLyBFeHRlcm5hbGl6ZQotLy8gICAgYWRkRmllbGQobG9jYXRpb24pOyAgICAKLSAgICAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETFJlc291cmNlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMUmVzb3VyY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMjZhMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMUmVzb3VyY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETE1vZGVsTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMUmVzb3VyY2VVdGlsCi17Ci0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlV1NETFJlc291cmNlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB1cmkpCi0gIHsKLSAgICBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCByZXNvdXJjZUZhY3RvcnkgPSBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKTsKLSAgICBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlRmFjdG9yeS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSkpOwotICAgIHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0gICAgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGVmaW5pdGlvbik7Ci0gICAgcmVzb3VyY2Uuc2V0TW9kaWZpZWQoZmFsc2UpOwotICAgIHJldHVybiByZXNvdXJjZTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBEZWZpbml0aW9uIGxvb2t1cEFuZExvYWREZWZpbml0aW9uKFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBTdHJpbmcgdXJpKSB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotICAJdHJ5IHsKLSAgCSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkodXJpKSk7Ci0gICAgIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh1cmkpKTsKLSAgICAgcmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0gIAl9Ci0gIAljYXRjaChFeGNlcHRpb24gZSkge30KLSAgICAKLSAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbiA9IHBhcnNlKHJlc291cmNlU2V0LCB1cmkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgT2JqZWN0IG8gPSByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKSA+IDAgPyByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKSA6IG51bGw7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgbzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci19Ci0KLSAgcHVibGljIHN0YXRpYyBEZWZpbml0aW9uIGxvb2t1cE9yQ3JlYXRlRGVmaW5pdGlvbihSZXNvdXJjZVNldCByZXNvdXJjZVNldCwgU3RyaW5nIHVyaSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSksIGZhbHNlKTsKLSAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbiA9IHBhcnNlKHJlc291cmNlU2V0LCB1cmkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgT2JqZWN0IG8gPSByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKSA+IDAgPyByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKSA6IG51bGw7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgbzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gY3JlYXRlRGVmaW5pdGlvbihSZXNvdXJjZVNldCByZXNvdXJjZVNldCwgSUZpbGUgZmlsZSwgRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikuc2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKGZhbHNlKTsKLSAgICBTdHJpbmcgYmFzZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS50b1N0cmluZygpOwotICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGJhc2VVUkkpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbi5zZXRFbGVtZW50KGVsZW1lbnQpOyAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgV1NETFJlc291cmNlVXRpbC5jcmVhdGVXU0RMUmVzb3VyY2UocmVzb3VyY2VTZXQsIGRlZmluaXRpb24sIGJhc2VVUkkpOwotICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikucmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsgICAgCi0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gcGFyc2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQsIFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgIENsYXNzTG9hZGVyIHByZXZDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihXU0RMUmVzb3VyY2VVdGlsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotLy8gICAgICBET01QYXJzZXIgYnVpbGRlciA9IG5ldyBET01QYXJzZXIoKTsKLS8vICAgICAgYnVpbGRlci5wYXJzZSh1cmkpOwotLy8gICAgICBkb2N1bWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgIAotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKHVyaSk7Ci0gICAgICAKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZDbGFzc0xvYWRlcik7Ci0gICAgfQotCi0gICAgZGVmaW5pdGlvbiA9ICgob3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlLmVOU19VUkkpKS5nZXRXU0RMRmFjdG9yeSgpLmNyZWF0ZURlZmluaXRpb24oKTsKLSAgICBkZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSSh1cmkpOwotICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbi5zZXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBXU0RMUmVzb3VyY2VVdGlsLmNyZWF0ZVdTRExSZXNvdXJjZShyZXNvdXJjZVNldCwgZGVmaW5pdGlvbiwgdXJpKTsKLSAgICAoKERlZmluaXRpb25JbXBsKWRlZmluaXRpb24pLnJlY29uY2lsZVJlZmVyZW5jZXModHJ1ZSk7Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVsb2FkRGlyZWN0aXZlcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBSZXNvdXJjZSByb290UmVzb3VyY2UgPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpOwotICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcm9vdFJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgaWYgKHJlc291cmNlICE9IHJvb3RSZXNvdXJjZSkKLSAgICAgIHsKLSAgICAgICAgLy8gIFRPRE8uLi4gY29uc2lkZXIgdW5sb2FkaW5nIHRoZSByZXNvdXJjZXMgIAkKLSAgICAgICAgLy8gIHJlc291cmNlLnVubG9hZCgpOwkJICAgICAgCi0gICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJlbG9hZERpcmVjdGl2ZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZWxvYWREaXJlY3RpdmVWaXNpdG9yKCk7Ci0gICAgdmlzaXRvci52aXNpdERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgUmVsb2FkRGlyZWN0aXZlVmlzaXRvcgotICB7Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgdGhlSW1wb3J0KQotICAgIHsKLSAgICAgIC8vIGZvcmNlIHRoZSBpbXBvcnQgdG8gcmVsb2FkCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QodGhlSW1wb3J0KTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgICgoV1NETEVsZW1lbnRJbXBsKXRoZUltcG9ydCkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RTY2hlbWFEaXJlY3RpdmUoWFNEU2NoZW1hRGlyZWN0aXZlIGRpcmVjdGl2ZSkKLSAgICB7Ci0gICAgICAvLyBmb3JjZSB0aGUgc2NoZW1hIGRpcmVjdGl2ZSB0byByZWxvYWQKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRpcmVjdGl2ZS5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBkaXJlY3RpdmUuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0SW1wb3J0KChJbXBvcnQpIGkubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICB7Ci0KLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBvOwotICAgICAgICAgICAgICBpZiAoZS5nZXRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlzaXRTY2hlbWEoZS5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTRFNjaGVtYURpcmVjdGl2ZSgoWFNEU2NoZW1hRGlyZWN0aXZlKSBvKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbFVSSVJlc29sdmVyIGltcGxlbWVudHMgV1NETE1vZGVsTG9jYXRvcgotICB7Ci0gICAgLy9JZFJlc29sdmVyIGlkUmVzb2x2ZXIgPSBuZXcgSWRSZXNvbHZlckltcGwobnVsbCwgdHJ1ZSk7Ci0gICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5VUklSZXNvbHZlciByZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0KLSAgICBJbnRlcm5hbFVSSVJlc29sdmVyKCkKLSAgICB7ICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICAgIHsKLSAgICAgIFN0cmluZyByZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZSwgbG9jYXRpb24pOwotCi0gICAgICAvLyBoZXJlJ3MgYW4gdWdseSBoYWNrLi4uIFBsYXRmb3JtLnJlc29sdmUoKSByZXR1cm5zIFdpbmRvd3MgZmlsZXMgd2l0aCB0aGUgcGF0dGVybiAiZmlsZTpEOi9oZWxsby54c2QiCi0gICAgICAvLyBidXQgRU1GJ3MgVVJJIGNsYXNzIGV4cGVjdHMgYSBwYXR0ZXJuIGxpa2UgdGhpcyAiZmlsZTovLy9EOi9oZWxsby54c2QiCi0gICAgICAvLyAgICAgICAgCi0gICAgICBpZiAocmVzb2x2ZWRMb2NhdGlvbiAhPSBudWxsKQotICAgICAgewotCQlTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6IjsgICAgICAJCi0gICAgICAgIGlmIChyZXNvbHZlZExvY2F0aW9uLnN0YXJ0c1dpdGgoZmlsZVByb3RvY29sKSAmJiAhcmVzb2x2ZWRMb2NhdGlvbi5zdGFydHNXaXRoKGZpbGVQcm90b2NvbCArICIvIikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZWRMb2NhdGlvbi5zdWJzdHJpbmcoZmlsZVByb3RvY29sLmxlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXNvbHZlZExvY2F0aW9uID0gVVJJSGVscGVyLmFkZEltcGxpZWRGaWxlUHJvdG9jb2wocmVzb2x2ZWRMb2NhdGlvbik7Ci0gICAgICB9Ci0gICAgICAvLyBlbmQgdWdseSBoYWNrCi0gICAgICByZXR1cm4gcmVzb2x2ZWRMb2NhdGlvbjsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hNTFF1aWNrU2Nhbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9YTUxRdWlja1NjYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzMzhiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hNTFF1aWNrU2Nhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxRdWlja1NjYW4KLXsgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLSAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgIHJlc3VsdCA9IFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEoaW5wdXRTdHJlYW0pOyAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgICAgICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKElucHV0U3RyZWFtIGlucHV0KQotICB7ICAKLSAgICBUYXJnZXROYW1lc3BhY2VVUklDb250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZVVSSUNvbnRlbnRIYW5kbGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihYTUxRdWlja1NjYW4uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgLy8gTGluZSBiZWxvdyBpcyBhIGhhY2sgdG8gZ2V0IFhNTFJlYWRlciB3b3JraW5nCi0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAJWE1MUmVhZGVyIHJlYWRlciA9IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKLSAgICAJcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotICAgIAlyZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7ICAgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2Q2xhc3NMb2FkZXIpOwotICAgIH0KLSAgICByZXR1cm4gaGFuZGxlci50YXJnZXROYW1lc3BhY2VVUkk7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlVVJJQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgotICB7ICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVVJJOwotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsgICAgICAgICAgICAKLSAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKCJzY2hlbWEiKSB8fCBsb2NhbE5hbWUuZXF1YWxzKCJkZWZpbml0aW9ucyIpKQotICAgICAgeyAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgbkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyaWJ1dGVzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSkuZXF1YWxzKCJ0YXJnZXROYW1lc3BhY2UiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VVUkkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvLyB0b2RvIHRoZXJlJ3MgYSBpY2Ugd2F5IHRvIGRvIHRoaXMgSSdtIHN1cmUgICAgCi0gICAgICAvLyBoZXJlIEkgaW50ZW50aWFsbHkgY2F1c2UgYW4gZXhjZXB0aW9uLi4uIAotICAgICAgU3RyaW5nIHggPSBudWxsOwotICAgICAgeC5sZW5ndGgoKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiOWFlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsIHNjaGVtYUxvY2F0b3IgPSBuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlci5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBzY2hlbWFMb2NhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2NmM0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcgotewotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVNjaGVtYUxvY2F0aW9uKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBzY2hlbWFMb2NhdGlvblVSSSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7ICAgICAgCi0gICAgICBTdHJpbmcgcmVzdWx0ID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlVVJJLCBzY2hlbWFMb2NhdGlvblVSSSk7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgIAlyZXN1bHQgPSBuYW1lc3BhY2VVUkk7Ci0gICAgICB9Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgIAlyZXN1bHQgPSAiIjsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0b3IuY2xhc3M7Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZUhlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvRmxhdFBhZ2VIZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxYWRhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZUhlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotCi1wdWJsaWMgY2xhc3MgRmxhdFBhZ2VIZWFkZXIgZXh0ZW5kcyBDYW52YXMgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAKLXsKLQlwcml2YXRlIEltYWdlIGJhY2tncm91bmRJbWFnZTsgIAotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBJbWFnZSBidXR0b25JbWFnZTsKLQlwcml2YXRlIENvbG9yIGltYWdlQmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgQ29sb3IgdGV4dEZvcmVncm91bmRDb2xvcjsKLQlwcml2YXRlIGludCB0ZXh0SE1hcmdpbiA9IDEwOwotCXByaXZhdGUgaW50IHRleHRWTWFyZ2luID0gNTsKLQlwcml2YXRlIEZvbnQgaGVhZGVyRm9udDsKLQlwcml2YXRlIGludCB3aWR0aEhpbnQ7Ci0KLQlwcml2YXRlIExpc3QgbGlzdGVuZXJzOwotCXByaXZhdGUgaW50IGJ1dHRvbkltYWdlWDsKLQlwcml2YXRlIGludCBidXR0b25JbWFnZVk7Ci0JCi0gIC8vIFVzYWdlOiAKLSAgLy8gICAgU2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuRmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUZsYXRQYWdlSGVhZGVyKCkgCi0gIC8vICAgIG1ldGhvZHMuCi0gIC8vCi0gIC8vICBFeCkKLSAgLy8gIENvbXBvc2l0ZSBwYXJlbnQgPSAuLi4gOwotICAvLyAgSW1hZ2UgaW1hZ2UgPSAuLi4gOwotICAvLyAgTGF5b3V0IGxheW91dCA9IC4uLiA7Ci0gIC8vICBTdHJpbmcgdGl0bGUgPSAuLi4gOwotICAvLyAgV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gLi4uIDsKLSAgLy8KLSAgLy8gIGhlYWRlciA9IG5ldyBGbGF0UGFnZUhlYWRlcihwYXJlbnQsU1dULk5PTkUpOwotICAvLyAgaGVhZGVyLnNldExheW91dChsYXlvdXQpOwotICAvLyAgaGVhZGVyLnNldEJhY2tncm91bmRJbWFnZShpbWFnZSk7Ci0gIC8vICBoZWFkZXIuc2V0VGV4dCh0aXRsZSk7Ci0gIC8vICBDb21wb3NpdGUgZm9ybVBhcmVudCA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGhlYWRlcik7Ci0gIC8vICAKLSAgLy8gIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAvLyAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gIC8vICBmb3JtUGFyZW50LnNldExheW91dChnbCk7Ci0gIC8vICBmb3JtUGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAvLwotCXB1YmxpYyBGbGF0UGFnZUhlYWRlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIAotICB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkKLQkJLy8gVGhlIGRlZmF1bHQgaW1hZ2UgYmFja2dyb3VuZCBjb2xvciBpcyB3aGl0ZQotCQkvLyBUaGUgZGVmYXVsdCB0ZXh0IGZvcmVrZ3JvdW5kIGNvbG9yIGlzIGJsYWNrCi0JCWltYWdlQmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpOwotCQl0ZXh0Rm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKG51bGwsIDAsIDAsIDApOwotCQlzZXRCYWNrZ3JvdW5kKGltYWdlQmFja2dyb3VuZENvbG9yKTsKLQkJCi0JCS8vIFRoZSBkZWZhdWx0IHRleHQgZm9udCBpcyBIZWFkZXIgZm9udAotCQloZWFkZXJGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpOwotCQkKLQkJLy8gTmVlZCB0byBkaXNwb3NlIHRoZSBDb2xvcgotCQlhZGREaXNwb3NlTGlzdGVuZXIKLSAgICAgIChuZXcgRGlzcG9zZUxpc3RlbmVyKCkgCi0gICAgICAgIHsKLQkJCSAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgCi0gICAgICAgICAgewotCQkJCSAgICBGbGF0UGFnZUhlYWRlci50aGlzLndpZGdldERpc3Bvc2VkKGUpOwotCQkJICAgIH0KLQkJICAgIH0gCi0gICAgICApOwotCQkgCi0JCS8vIG5lZWQgdG8gcGFpbnQKLQkJYWRkUGFpbnRMaXN0ZW5lcgotICAgICAgKG5ldyBQYWludExpc3RlbmVyKCkgCi0gICAgICAgIHsKLQkJCSAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSAKLSAgICAgICAgICB7Ci0JCQkgICAgICBGbGF0UGFnZUhlYWRlci50aGlzLnBhaW50Q29udHJvbChlKTsKLQkJCSAgICB9Ci0JCSAgICB9Ci0gICAgICApOwotCi0JCS8vIGNyZWF0ZSBhIGxpc3Qgb2YgbGlzdGVuZXJzCi0JCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBhZGQgYSBtb3VzZSBsaXN0ZW5lcgotCQl0aGlzLmFkZE1vdXNlTGlzdGVuZXIKLSAgICAgIChuZXcgTW91c2VBZGFwdGVyKCkgCi0gICAgICAgIHsKLQkJCSAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgCi0gICAgICAgICAgewotCQkJCSAgICBoYW5kbGVNb3VzZURvd24oZXZlbnQpOwotCQkJICAgIH0KLQkJICAgIH0KLSAgICAgICk7CQotCQkKLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JfSAgCi0KLQkvLyBDb21wdXRlIHNpemUgb2YgdGhlIHdpZGdldAotCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSAKLSAgewotCQl3aWR0aEhpbnQgPSB3SGludDsKLQkJaW50IHdpZHRoID0gZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCQlpbnQgaGVpZ2h0ID0gMDsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSAhPSBudWxsKSAKLSAgICB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gYmFja2dyb3VuZEltYWdlLmdldEJvdW5kcygpOwotCQkJaGVpZ2h0ID0gYm91bmRzLmhlaWdodDsKLQkJfQotCQlpZiAodGV4dCAhPSBudWxsKSAKLSAgICB7Ci0JCQlHQyBnYyA9IG5ldyBHQyh0aGlzKTsKLQkJCWludCB0ZXh0V2lkdGggPSBnZXRUZXh0V2lkdGgoZ2MpOwotCQkJaW50IHRleHRIZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KGdjKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCWhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgdGV4dEhlaWdodCk7Ci0JCX0KLQkJaWYgKGJ1dHRvbkltYWdlICE9IG51bGwpIAotICAgIHsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uSW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlpZiAoaGVpZ2h0IDwgYm91bmRzLmhlaWdodCkKLQkJCQloZWlnaHQgPSBib3VuZHMuaGVpZ2h0OwotCQl9Ci0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkgd2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKSBoZWlnaHQgPSBoSGludDsgICAgICAgICAgCi0JCXJldHVybiBuZXcgUG9pbnQod2lkdGggKyAyLCBoZWlnaHQgKyAyKTsgICAgIAotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSAKLSAgewotCQlHQyBnYyA9IGUuZ2M7Ci0JCWludCBoZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KGdjKTsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSAhPSBudWxsKSAKLSAgICB7Ci0JCQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBiYWNrZ3JvdW5kSW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlpbnQgeSA9IDA7Ci0JCQlpbnQgeCA9IDA7Ci0KLQkJCWlmIChpbWFnZUJhY2tncm91bmRDb2xvciAhPSBudWxsKSAKLSAgICAgIHsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGltYWdlQmFja2dyb3VuZENvbG9yKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGltYWdlQm91bmRzLndpZHRoLCBpbWFnZUJvdW5kcy5oZWlnaHQpOwotCQkJfQotCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpPT1mYWxzZSkgCi0gICAgICB7Ci0JCQkJZ2MuZHJhd0ltYWdlKGJhY2tncm91bmRJbWFnZSwgeCwgeSk7Ci0JCQl9Ci0JCQlpZiAodGV4dEZvcmVncm91bmRDb2xvciAhPSBudWxsKQotCQkJCWdjLnNldEZvcmVncm91bmQodGV4dEZvcmVncm91bmRDb2xvcik7Ci0JCQlnYy5zZXRGb250KGhlYWRlckZvbnQpOwotLy8JCQlnYy5zZXRGb250KGdldEZvbnQoKSk7CQotCQkJZ2MuZHJhd1RleHQodGV4dCwgdGV4dEhNYXJnaW4sIHRleHRWTWFyZ2luLCB0cnVlKTsKLQkJCWlmIChidXR0b25JbWFnZSAhPSBudWxsKSAKLSAgICAgIHsKLQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVJlY3RhbmdsZSBidXR0b25Cb3VuZHMgPSBidXR0b25JbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgcCA9IHBhcmVudEJvdW5kcy54ICsgcGFyZW50Qm91bmRzLndpZHRoOwotCQkJCWJ1dHRvbkltYWdlWCA9IHAgLSBidXR0b25Cb3VuZHMud2lkdGggLSA0OwotCQkJCWJ1dHRvbkltYWdlWSA9IDQ7Ci0JCQkJZ2MuZHJhd0ltYWdlKGJ1dHRvbkltYWdlLCBidXR0b25JbWFnZVgsIGJ1dHRvbkltYWdlWSk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotICAgICAgIAotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSAKLSAgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSAKLSAgewotCQlpZiAoYnV0dG9uSW1hZ2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gY2hla2MgaWYgdGhlIEJ1dHRvbiBpbWFnZSBpcyBjbGlja2VkCi0JCWludCB4ID0gZXZlbnQueDsKLQkJaW50IHkgPSBldmVudC55OwotCQlpZiAoeCA8IGJ1dHRvbkltYWdlWCB8fCB4ID4gYnV0dG9uSW1hZ2VYICsgYnV0dG9uSW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGgpIAotICAgIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoeSA8IGJ1dHRvbkltYWdlWSB8fCB5ID4gYnV0dG9uSW1hZ2VZICsgYnV0dG9uSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAKLSAgICB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWludCBzaXplID0gbGlzdGVuZXJzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIAotICAgIHsKLQkJCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKFNlbGVjdGlvbkxpc3RlbmVyKWxpc3RlbmVycy5nZXQoaSk7Ci0JCQlsaXN0ZW5lci53aWRnZXRTZWxlY3RlZChudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgCi0gIHsKLQkJaWYgKGltYWdlQmFja2dyb3VuZENvbG9yICE9IG51bGwpIGltYWdlQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJaWYgKHRleHRGb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgdGV4dEZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCWlmIChiYWNrZ3JvdW5kSW1hZ2UgIT0gbnVsbCkgYmFja2dyb3VuZEltYWdlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLy8gZ2V0dGVycyBhbmQgc2V0dGVycwotCXB1YmxpYyBJbWFnZSBnZXRCYWNrZ3JvdW5kSW1hZ2UoKSAKLSAgewotCQlyZXR1cm4gYmFja2dyb3VuZEltYWdlOwotCX0KLSAgICAgIAotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRJbWFnZShJbWFnZSBiYWNrZ3JvdW5kSW1hZ2UpIAotICB7Ci0JCXRoaXMuYmFja2dyb3VuZEltYWdlID0gYmFja2dyb3VuZEltYWdlOwotCQlyZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0QnV0dG9uSW1hZ2UoKSAKLSAgewotCQlyZXR1cm4gYnV0dG9uSW1hZ2U7Ci0JfQotICAgICAgCi0JcHVibGljIHZvaWQgc2V0QnV0dG9uSW1hZ2UoSW1hZ2UgYnV0dG9uSW1hZ2UpIAotICB7Ci0JCXRoaXMuYnV0dG9uSW1hZ2UgPSBidXR0b25JbWFnZTsKLQkJcmVkcmF3KCk7Ci0JfQotICAgICAgCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgCi0gIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotICAgICAgCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgCi0gIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJcmVkcmF3KCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0VGV4dEhNYXJnaW4oKSAKLSAgewotCQlyZXR1cm4gdGV4dEhNYXJnaW47Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRleHRITWFyZ2luKGludCB0ZXh0SE1hcmdpbikgCi0gIHsKLQkJdGhpcy50ZXh0SE1hcmdpbiA9IHRleHRITWFyZ2luOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFRleHRWTWFyZ2luKCkgCi0gIHsKLQkJcmV0dXJuIHRleHRWTWFyZ2luOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXh0Vk1hcmdpbihpbnQgdGV4dFZNYXJnaW4pIAotICB7Ci0JCXRoaXMudGV4dFZNYXJnaW4gPSB0ZXh0Vk1hcmdpbjsKLQl9Ci0JCi0JcHVibGljIENvbG9yIGdldEltYWdlQmFja2dyb3VuZENvbG9yKCkgCi0gIHsKLQkJcmV0dXJuIGltYWdlQmFja2dyb3VuZENvbG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbWFnZUJhY2tncm91bmRDb2xvcihDb2xvciBpbWFnZUJhY2tncm91bmRDb2xvcikgCi0gIHsKLQkJaWYgKGltYWdlQmFja2dyb3VuZENvbG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuaW1hZ2VCYWNrZ3JvdW5kQ29sb3IgPSBpbWFnZUJhY2tncm91bmRDb2xvcjsKLQkJcmVkcmF3KCk7Ci0JfQotCQotCXB1YmxpYyBDb2xvciBnZXRUZXh0Rm9yZWdyb3VuZENvbG9yKCkgCi0gIHsKLQkJcmV0dXJuIHRleHRGb3JlZ3JvdW5kQ29sb3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRleHRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgdGV4dEZvcmVncm91bmRDb2xvcikgCi0gIHsKLQkJaWYgKHRleHRGb3JlZ3JvdW5kQ29sb3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy50ZXh0Rm9yZWdyb3VuZENvbG9yID0gdGV4dEZvcmVncm91bmRDb2xvcjsKLQkJcmVkcmF3KCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dEhlaWdodChHQyBnYykgCi0gIHsKLQkJaW50IGltYWdlSGVpZ2h0ID0gMDsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSE9IG51bGwgJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpPT1mYWxzZSkgCi0gICAgewotCQkJaW1hZ2VIZWlnaHQgPSBiYWNrZ3JvdW5kSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQl9Ci0JCWdjLnNldEZvbnQoaGVhZGVyRm9udCk7Ci0vLwkJZ2Muc2V0Rm9udChnZXRGb250KCkpOwotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWludCBmb250SGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0KCk7Ci0JCWludCBoZWlnaHQgPSAgZm9udEhlaWdodCArIHRleHRWTWFyZ2luICsgdGV4dFZNYXJnaW47Ci0JCXJldHVybiBNYXRoLm1heChoZWlnaHQsIGltYWdlSGVpZ2h0KTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRUZXh0V2lkdGgoR0MgZ2MpIAotICB7Ci0JCWludCBpbWFnZVdpZHRoID0gMDsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSE9IG51bGwgJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpPT1mYWxzZSkgCi0gICAgewotCQkJaW1hZ2VXaWR0aCA9IGJhY2tncm91bmRJbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJfQotCQlnYy5zZXRGb250KGhlYWRlckZvbnQpOwotLy8JCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlpbnQgZm9udFdpZHRoID0gZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCgpICsgNTsKLQkJaW50IHdpZHRoID0gIGZvbnRXaWR0aCAqIHRleHQubGVuZ3RoKCkgKyB0ZXh0SE1hcmdpbiArIHRleHRITWFyZ2luOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGgsIGltYWdlV2lkdGgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSAKLSAgewotLy8JCVdpZGdldCBzb3VyY2UgPSBlLndpZGdldDsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIAotICB7Ci0JCWlmKGV2ZW50LmdldFByb3BlcnR5KCkgPT0gSkZhY2VSZXNvdXJjZXMuSEVBREVSX0ZPTlQgJiYgdGhpcy5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpCi0JCXsKLQkJCWhlYWRlckZvbnQgPSBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoSkZhY2VSZXNvdXJjZXMuSEVBREVSX0ZPTlQpOwotCQkJdGhpcy5sYXlvdXQodHJ1ZSk7Ci0JCQl0aGlzLnJlZHJhdygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvRmxhdFBhZ2VTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4YzMyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuZmxhdHVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8vcHVibGljIGFic3RyYWN0IGNsYXNzIEZvcm1TZWN0aW9uIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIElNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmxhdFBhZ2VTZWN0aW9uIGV4dGVuZHMgVmlld0Zvcm0gaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OID0gMTsKLS8vCXByaXZhdGUgUERFRm9ybVBhZ2UgZm9ybVBhZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgaGVhZGVyQ29sb3JLZXkgPSBXaWRnZXRGYWN0b3J5LkRFRkFVTFRfSEVBREVSX0NPTE9SOwotCXByaXZhdGUgU3RyaW5nIGhlYWRlclRleHQ7Ci0JcHJpdmF0ZSBDb250cm9sIGNsaWVudDsKLQlwcm90ZWN0ZWQgTGFiZWwgaGVhZGVyOwotCXByb3RlY3RlZCBDb250cm9sIHNlcGFyYXRvcjsKLS8vCXByaXZhdGUgU2VjdGlvbkNoYW5nZU1hbmFnZXIgc2VjdGlvbk1hbmFnZXI7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBkaXJ0eTsKLQlwcm90ZWN0ZWQgTGFiZWwgZGVzY3JpcHRpb25MYWJlbDsKLQlwcml2YXRlIFRvZ2dsZUNvbnRyb2wgdG9nZ2xlOwotCXByaXZhdGUgYm9vbGVhbiByZWFkT25seTsKLQlwcml2YXRlIGJvb2xlYW4gdGl0bGVBc0h5cGVybGluazsKLQlwcml2YXRlIGJvb2xlYW4gYWRkU2VwYXJhdG9yPXRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGRlc2NyaXB0aW9uUGFpbnRlZD10cnVlOwotCXByaXZhdGUgYm9vbGVhbiBoZWFkZXJQYWludGVkPXRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbGxhcHNhYmxlPWZhbHNlOwotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRyb2w7Ci0JCi0JCi0vKgotICogVGhpcyBpcyBhIHNwZWNpYWwgbGF5b3V0IGZvciB0aGUgc2VjdGlvbi4gQm90aCB0aGUKLSAqIGhlYWRlciBhbmQgdGhlIGRlc2NyaXB0aW9uIGxhYmVscyB3aWxsIHdyYXAgYW5kCi0gKiB0aGV5IHdpbGwgdXNlIGNsaWVudCdzIHNpemUgdG8gY2FsY3VsYXRlIG5lZWRlZAotICogaGVpZ2h0LiBUaGlzIGtpbmQgb2YgYmVoYXZpb3VyIGlzIG5vdCBwb3NzaWJsZQotICogd2l0aCBzdG9jayBncmlkIGxheW91dC4KLSAqLwotY2xhc3MgU2VjdGlvbkxheW91dCBleHRlbmRzIExheW91dCB7Ci0JaW50IHZzcGFjaW5nID0gMzsKLQlpbnQgc2VwSGVpZ2h0ID0gMjsKLQotCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoKSB7Ci0JCWludCB3aWR0aCA9IDA7Ci0JCWludCBoZWlnaHQgPSAwOwotCQlpbnQgY3dpZHRoID0gMDsKLQkJaW50IGNvbGxhcHNlZEhlaWdodCA9IDA7Ci0JCi0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkKLQkJICAgd2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJaGVpZ2h0ID0gaEhpbnQ7Ci0KLQkJY3dpZHRoID0gd2lkdGg7Ci0JCQkJCi0JCWlmIChjbGllbnQgIT0gbnVsbCkgewotCQkJUG9pbnQgY3NpemUgPSBjbGllbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0JCQlpZiAod2lkdGggPT0gMCkgewotCQkJCXdpZHRoID0gY3NpemUueDsKLQkJCQljd2lkdGggPSB3aWR0aDsKLQkJCX0KLQkJCWlmIChoZWlnaHQ9PTApIGhlaWdodCA9IGNzaXplLnk7Ci0JCX0KLQkJCi0JCVBvaW50IHRvZ2dsZVNpemUgPSBudWxsOwotCQkKLQkJaWYgKGNvbGxhcHNhYmxlICYmIHRvZ2dsZSE9bnVsbCkgCi0JCSAgICB0b2dnbGVTaXplID0gdG9nZ2xlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOwotCQkKLQkJaWYgKGhIaW50PT0gU1dULkRFRkFVTFQgJiYgaGVhZGVyUGFpbnRlZCAmJiBoZWFkZXIhPW51bGwpIHsKLQkJCWludCBod2lkdGggPSBjd2lkdGg7Ci0JCQlpZiAodG9nZ2xlU2l6ZSE9bnVsbCkKLQkJCSAgIGh3aWR0aCA9IGN3aWR0aCAtIHRvZ2dsZVNpemUueCAtIDU7Ci0JCQlQb2ludCBoc2l6ZSA9IGhlYWRlci5jb21wdXRlU2l6ZShod2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0JCQloZWlnaHQgKz0gaHNpemUueTsKLQkJCWNvbGxhcHNlZEhlaWdodCA9IGhzaXplLnk7Ci0JCQloZWlnaHQgKz0gdnNwYWNpbmc7Ci0JCX0KLQkJCi0JCWlmIChoSGludD09U1dULkRFRkFVTFQgJiYgYWRkU2VwYXJhdG9yKSB7Ci0JCQloZWlnaHQgKz0gc2VwSGVpZ2h0OwotCQkJaGVpZ2h0ICs9IHZzcGFjaW5nOwotCQkJY29sbGFwc2VkSGVpZ2h0ICs9IHZzcGFjaW5nICsgc2VwSGVpZ2h0OwotCQl9Ci0JCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCAmJiBkZXNjcmlwdGlvblBhaW50ZWQgJiYgZGVzY3JpcHRpb25MYWJlbCE9bnVsbCkgewotCQkJUG9pbnQgZHNpemUgPSBkZXNjcmlwdGlvbkxhYmVsLmNvbXB1dGVTaXplKGN3aWR0aCwgU1dULkRFRkFVTFQsIGZsdXNoKTsKLQkJCWhlaWdodCArPSBkc2l6ZS55OwotCQkJaGVpZ2h0ICs9IHZzcGFjaW5nOwotCQl9Ci0JCWlmICh0b2dnbGUhPW51bGwgJiYgdG9nZ2xlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvLyBjb2xsYXBzZWQgc3RhdGUKLQkJCWhlaWdodCA9IGNvbGxhcHNlZEhlaWdodDsKLQkJfQotCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBmbHVzaCkgewotCQlpbnQgd2lkdGggPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCQlpbnQgaGVpZ2h0ID0gcGFyZW50LmdldENsaWVudEFyZWEoKS5oZWlnaHQ7Ci0JCWludCB5ID0gMDsKLQkJUG9pbnQgdG9nZ2xlU2l6ZT1udWxsOwotCQkKLQkJaWYgKGNvbGxhcHNhYmxlKSB7Ci0JCQl0b2dnbGVTaXplID0gdG9nZ2xlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOwotCQl9Ci0KLQkJaWYgKGhlYWRlclBhaW50ZWQgJiYgaGVhZGVyIT1udWxsKSB7Ci0JCQlQb2ludCBoc2l6ZTsKLQkJCQotCQkJaWYgKHRpdGxlQXNIeXBlcmxpbmspIHsKLQkJCQloc2l6ZSA9IGhlYWRlci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoKTsKLQkJCQloZWFkZXIuc2V0Qm91bmRzKDAsIHksIGhzaXplLngsIGhzaXplLnkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IGF2YWlsYWJsZVdpZHRoID0gd2lkdGg7Ci0JCQkJaWYgKHRvZ2dsZVNpemUhPW51bGwpCi0JCQkJICAgYXZhaWxhYmxlV2lkdGggPSB3aWR0aCAtIHRvZ2dsZVNpemUueCAtIDU7Ci0JCQkJaHNpemUgPSBoZWFkZXIuY29tcHV0ZVNpemUoYXZhaWxhYmxlV2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0KLSAgICAgICAgaW50IGh4ID0gMDsKLQkJICAgCWlmICh0b2dnbGUhPW51bGwpIHsKLQkgICAJCQlpbnQgdHkgPSB5ICsgaHNpemUueSAtIHRvZ2dsZVNpemUueTsgLy8gKyB2c3BhY2luZzsKLQkJICAgCSAgdG9nZ2xlLnNldEJvdW5kcygwLCB0eSwgdG9nZ2xlU2l6ZS54LCB0b2dnbGVTaXplLnkpOwotICAgICAgICAgIGh4ID0gdG9nZ2xlU2l6ZS54OwotCQkgICAJfQotCQkJICBoZWFkZXIuc2V0Qm91bmRzKGh4LCB5LCBhdmFpbGFibGVXaWR0aCwgaHNpemUueSk7Ci0JCQl9Ci0JCQl5ICs9IGhzaXplLnkgKyB2c3BhY2luZzsKLQkJfQotCQlpZiAoYWRkU2VwYXJhdG9yICYmIHNlcGFyYXRvciE9bnVsbCkgewotCQkJc2VwYXJhdG9yLnNldEJvdW5kcygwLCB5LCB3aWR0aCwgMik7Ci0JCQl5ICs9IHNlcEhlaWdodCArIHZzcGFjaW5nOwotCQl9Ci0JCWlmICh0b2dnbGUhPW51bGwgJiYgdG9nZ2xlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGRlc2NyaXB0aW9uUGFpbnRlZCAmJiBkZXNjcmlwdGlvbkxhYmVsIT1udWxsKSB7Ci0JCQlQb2ludCBkc2l6ZSA9IGRlc2NyaXB0aW9uTGFiZWwuY29tcHV0ZVNpemUod2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0JCQlkZXNjcmlwdGlvbkxhYmVsLnNldEJvdW5kcygwLCB5LCB3aWR0aCwgZHNpemUueSk7Ci0JCQl5ICs9IGRzaXplLnkgKyB2c3BhY2luZzsKLQkJfQotCQlpZiAoY2xpZW50IT1udWxsKSB7Ci0JCQljbGllbnQuc2V0Qm91bmRzKDAsIHksIHdpZHRoLCBoZWlnaHQgLSB5KTsKLQkJfQotCX0KLX0KLQkKLQkKLXB1YmxpYyBGbGF0UGFnZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCS8vIERlc2NyaXB0aW9uIGNhdXNlcyBwcm9ibGVtcyByZSB3b3JkIHdyYXBwaW5nCi0JLy8gYW5kIGNhdXNlcyBiYWQgbGF5b3V0IGluIHNjaGVtYSBhbmQKLQkvLyBjb21wb25lbnQgZWRpdG9ycyB3aGVuIGluIE1vdGlmIC0gdHVybmluZyBvZmYKLQkKLQlzdXBlcihwYXJlbnQsIFNXVC5GTEFUKTsKLQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpKSB7Ci0JCWRlc2NyaXB0aW9uUGFpbnRlZCA9IGZhbHNlOwotCX0KLQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLX0KLXB1YmxpYyB2b2lkIGNvbW1pdENoYW5nZXMoYm9vbGVhbiBvblNhdmUpIHsKLX0KLXB1YmxpYyBhYnN0cmFjdCBDb21wb3NpdGUgY3JlYXRlQ2xpZW50KENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3RvcnkgZmFjdG9yeSk7Ci1wdWJsaWMgZmluYWwgQ29udHJvbCBjcmVhdGVDb250cm9sKAotCUNvbXBvc2l0ZSBwYXJlbnQsCi0JV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JQ29tcG9zaXRlIHNlY3Rpb24gPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCVNlY3Rpb25MYXlvdXQgc2xheW91dCA9IG5ldyBTZWN0aW9uTGF5b3V0KCk7Ci0Jc2VjdGlvbi5zZXRMYXlvdXQoc2xheW91dCk7Ci0Jc2VjdGlvbi5zZXREYXRhKHRoaXMpOwotCi0JR3JpZERhdGEgZ2Q7Ci0JaWYgKGhlYWRlclBhaW50ZWQpIHsKLQkJQ29sb3IgaGVhZGVyQ29sb3IgPSBmYWN0b3J5LmdldENvbG9yKGdldEhlYWRlckNvbG9yS2V5KCkpOwotCQloZWFkZXIgPSBmYWN0b3J5LmNyZWF0ZUhlYWRpbmdMYWJlbChzZWN0aW9uLCBnZXRIZWFkZXJUZXh0KCksIGhlYWRlckNvbG9yLCBTV1QuV1JBUCk7Ci0JCWlmICh0aXRsZUFzSHlwZXJsaW5rKSB7Ci0JCQlmYWN0b3J5LnR1cm5JbnRvSHlwZXJsaW5rKGhlYWRlciwgbmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChDb250cm9sIGxhYmVsKSB7Ci0JCQkJCXRpdGxlQWN0aXZhdGVkKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGNvbGxhcHNhYmxlKSB7Ci0JCQl0b2dnbGUgPSBuZXcgVG9nZ2xlQ29udHJvbChzZWN0aW9uLCBTV1QuTlVMTCk7Ci0JCQl0b2dnbGUuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJCXRvZ2dsZS5zZXRBY3RpdmVEZWNvcmF0aW9uQ29sb3IoZmFjdG9yeS5nZXRIeXBlcmxpbmtDb2xvcigpKTsKLQkJCXRvZ2dsZS5zZXREZWNvcmF0aW9uQ29sb3IoZmFjdG9yeS5nZXRDb2xvcihXaWRnZXRGYWN0b3J5LkNPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IpKTsKLQkJCXRvZ2dsZS5zZXRBY3RpdmVDdXJzb3IoZmFjdG9yeS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7Ci0JCQl0b2dnbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkKLQkJCQkJYm9vbGVhbiBjb2xsYXBzZWQgPSB0b2dnbGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCXJlZmxvdygpOwotCQkJCQlpZiAoZGVzY3JpcHRpb25MYWJlbCE9bnVsbCkKLQkJCQkJCWRlc2NyaXB0aW9uTGFiZWwuc2V0VmlzaWJsZSghY29sbGFwc2VkKTsKLQkJCQkJaWYgKGNsaWVudCE9bnVsbCkKLQkJCQkJCWNsaWVudC5zZXRWaXNpYmxlKCFjb2xsYXBzZWQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0KLQlpZiAoYWRkU2VwYXJhdG9yKSB7Ci0gICAgICAgIC8vc2VwYXJhdG9yID0gZmFjdG9yeS5jcmVhdGVTZXBhcmF0b3Ioc2VjdGlvbiwgU1dULkhPUklaT05UQUwpOwotCQlzZXBhcmF0b3IgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsKLQl9Ci0JCi0JaWYgKGRlc2NyaXB0aW9uUGFpbnRlZCAmJiBkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCWRlc2NyaXB0aW9uTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHNlY3Rpb24sIGRlc2NyaXB0aW9uLCBTV1QuV1JBUCk7Ci0JfQotCWNsaWVudCA9IGNyZWF0ZUNsaWVudChzZWN0aW9uLCBmYWN0b3J5KTsKLQlzZWN0aW9uLnNldERhdGEodGhpcyk7Ci0JY29udHJvbCA9IHNlY3Rpb247Ci0JcmV0dXJuIHNlY3Rpb247Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJlZmxvdygpIHsKLQljb250cm9sLmxheW91dCh0cnVlKTsKLQljb250cm9sLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQotICBXaWRnZXQgZ3JhbmRQYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpLmdldFBhcmVudCgpOwotICBpZiAoZ3JhbmRQYXJlbnQgIT0gbnVsbCAmJiBncmFuZFBhcmVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLQkgICgoQ29tcG9zaXRlKWdyYW5kUGFyZW50KS5sYXlvdXQodHJ1ZSk7Ci0vKgotCVNlY3Rpb25Gb3JtIGZvcm0gPSBmb3JtUGFnZS5nZXRGb3JtKCk7Ci0JaWYgKGZvcm0gaW5zdGFuY2VvZiBTY3JvbGxhYmxlU2VjdGlvbkZvcm0pIHsKLQkJKChTY3JvbGxhYmxlU2VjdGlvbkZvcm0pZm9ybSkudXBkYXRlU2Nyb2xsQmFycygpOwotCX0KLSovCi19Ci0KLXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQlyZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIGxhYmVsLCBmYWN0b3J5LCAxKTsKLX0KLXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBXaWRnZXRGYWN0b3J5IGZhY3RvcnksIGludCBzcGFuKSB7Ci0JZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsKTsKLQlUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCAiIik7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlnZC5ob3Jpem9udGFsU3Bhbj1zcGFuOwotCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcmV0dXJuIHRleHQ7Ci19Ci1wcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3RvcnkgZmFjdG9yeSwgaW50IHNwYW4pIHsKLQlUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCAiIik7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlnZC5ob3Jpem9udGFsU3Bhbj1zcGFuOwotCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcmV0dXJuIHRleHQ7Ci19Ci1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCUpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCXN1cGVyLmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyB2b2lkIGRvR2xvYmFsQWN0aW9uKFN0cmluZyBhY3Rpb25JZCkge30KLXB1YmxpYyB2b2lkIGV4cGFuZFRvKE9iamVjdCBvYmplY3QpIHt9Ci0vKgotcHVibGljIGZpbmFsIHZvaWQgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbihpbnQgY2hhbmdlVHlwZSwgT2JqZWN0IGNoYW5nZU9iamVjdCkgewotCWlmIChzZWN0aW9uTWFuYWdlciA9PSBudWxsKQotCQlyZXR1cm47Ci0Jc2VjdGlvbk1hbmFnZXIuZGlzcGF0Y2hOb3RpZmljYXRpb24odGhpcywgY2hhbmdlVHlwZSwgY2hhbmdlT2JqZWN0KTsKLX0KLXB1YmxpYyBmaW5hbCB2b2lkIGZpcmVTZWxlY3Rpb25Ob3RpZmljYXRpb24oT2JqZWN0IGNoYW5nZU9iamVjdCkgewotCWZpcmVDaGFuZ2VOb3RpZmljYXRpb24oU0VMRUNUSU9OLCBjaGFuZ2VPYmplY3QpOwotfQotKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBkZXNjcmlwdGlvbjsKLX0KLS8qCi1wdWJsaWMgUERFRm9ybVBhZ2UgZ2V0Rm9ybVBhZ2UoKSB7Ci0JcmV0dXJuIGZvcm1QYWdlOwotfQotKi8KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZGVyQ29sb3JLZXkoKSB7Ci0JcmV0dXJuIGhlYWRlckNvbG9yS2V5OwotfQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZGVyVGV4dCgpIHsKLQlyZXR1cm4gaGVhZGVyVGV4dDsKLX0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IGlucHV0KSB7fQotCi1wdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCXJldHVybiBkaXJ0eTsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQlyZXR1cm4gcmVhZE9ubHk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc1RpdGxlQXNIeXBlcmxpbmsoKSB7Ci0JcmV0dXJuIHRpdGxlQXNIeXBlcmxpbms7Ci19Ci0vKgotcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElNb2RlbENoYW5nZWRFdmVudCBlKSB7Ci19Ci0qLwotcHVibGljIHZvaWQgc2VjdGlvbkNoYW5nZWQoRmxhdFBhZ2VTZWN0aW9uIHNvdXJjZSwgaW50IGNoYW5nZVR5cGUsIE9iamVjdCBjaGFuZ2VPYmplY3QpIHt9Ci1wdWJsaWMgdm9pZCBzZXRBZGRTZXBhcmF0b3IoYm9vbGVhbiBuZXdBZGRTZXBhcmF0b3IpIHsKLQlhZGRTZXBhcmF0b3IgPSBuZXdBZGRTZXBhcmF0b3I7Ci19Ci0KLQotcHJpdmF0ZSBTdHJpbmcgdHJpbU5ld0xpbmVzKFN0cmluZyB0ZXh0KSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaT0wOyBpPHRleHQubGVuZ3RoKCk7IGkrKykgewotCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsKLQkJaWYgKGM9PSdcbicpCi0JCSAgIGJ1ZmYuYXBwZW5kKCcgJyk7Ci0JCWVsc2UKLQkJICAgYnVmZi5hcHBlbmQoYyk7Ci0JfQotCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Ci19Ci0JCi1wdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihqYXZhLmxhbmcuU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JLy8gd2Ugd2lsbCB0cmltIHRoZSBuZXcgbGluZXMgc28gdGhhdCB3ZSBjYW4KLQkvLyB1c2UgbGF5b3V0LWJhc2VkIHdvcmQgd3JhcHBpbmcgaW5zdGVhZAotCS8vIG9mIGhhcmQtY29kZWQgb25lCi0JZGVzY3JpcHRpb24gPSB0cmltTmV3TGluZXMobmV3RGVzY3JpcHRpb24pOwotCS8vZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQlpZiAoZGVzY3JpcHRpb25MYWJlbCE9bnVsbCkgZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KG5ld0Rlc2NyaXB0aW9uKTsKLX0KLXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uUGFpbnRlZChib29sZWFuIG5ld0Rlc2NyaXB0aW9uUGFpbnRlZCkgewotCWRlc2NyaXB0aW9uUGFpbnRlZCA9IG5ld0Rlc2NyaXB0aW9uUGFpbnRlZDsKLX0KLXB1YmxpYyB2b2lkIHNldERpcnR5KGJvb2xlYW4gbmV3RGlydHkpIHsKLQlkaXJ0eSA9IG5ld0RpcnR5OwotfQotLyoKLXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotfQotKi8KLXB1YmxpYyB2b2lkIHNldEhlYWRlckNvbG9yS2V5KGphdmEubGFuZy5TdHJpbmcgbmV3SGVhZGVyQ29sb3JLZXkpIHsKLQloZWFkZXJDb2xvcktleSA9IG5ld0hlYWRlckNvbG9yS2V5OwotfQotcHVibGljIHZvaWQgc2V0SGVhZGVyUGFpbnRlZChib29sZWFuIG5ld0hlYWRlclBhaW50ZWQpIHsKLQloZWFkZXJQYWludGVkID0gbmV3SGVhZGVyUGFpbnRlZDsKLX0KLXB1YmxpYyB2b2lkIHNldEhlYWRlclRleHQoamF2YS5sYW5nLlN0cmluZyBuZXdIZWFkZXJUZXh0KSB7Ci0JaGVhZGVyVGV4dCA9IG5ld0hlYWRlclRleHQ7Ci0JaWYgKGhlYWRlciE9bnVsbCkgaGVhZGVyLnNldFRleHQoaGVhZGVyVGV4dCk7Ci19Ci0vKgotdm9pZCBzZXRNYW5hZ2VyKFNlY3Rpb25DaGFuZ2VNYW5hZ2VyIG1hbmFnZXIpIHsKLQl0aGlzLnNlY3Rpb25NYW5hZ2VyID0gbWFuYWdlcjsKLX0KLSovCi1wdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIG5ld1JlYWRPbmx5KSB7Ci0JcmVhZE9ubHkgPSBuZXdSZWFkT25seTsKLX0KLXB1YmxpYyB2b2lkIHNldFRpdGxlQXNIeXBlcmxpbmsoYm9vbGVhbiBuZXdUaXRsZUFzSHlwZXJsaW5rKSB7Ci0JdGl0bGVBc0h5cGVybGluayA9IG5ld1RpdGxlQXNIeXBlcmxpbms7Ci19Ci1wdWJsaWMgdm9pZCB0aXRsZUFjdGl2YXRlZCgpIHsKLX0KLS8qCi1wdWJsaWMgdm9pZCB1cGRhdGUoKSB7fQotKi8KLQotcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBhcmcwKSB7Ci0JaWYgKGNvbnRyb2whPW51bGwgJiYgaGVhZGVyIT1udWxsKSB7Ci0JICBpZiAoIWhlYWRlci5pc0Rpc3Bvc2VkKCkpCi0JCWhlYWRlci5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0JICBpZiAoIWNvbnRyb2wuaXNEaXNwb3NlZCgpKQotCQljb250cm9sLmxheW91dCh0cnVlKTsKLQl9Ci19Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbGxhcHNhYmxlLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb2xsYXBzYWJsZSgpIHsKLQkJcmV0dXJuIGNvbGxhcHNhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbGxhcHNhYmxlLgotCSAqIEBwYXJhbSBjb2xsYXBzYWJsZSBUaGUgY29sbGFwc2FibGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sbGFwc2FibGUoYm9vbGVhbiBjb2xsYXBzYWJsZSkgewotCQl0aGlzLmNvbGxhcHNhYmxlID0gY29sbGFwc2FibGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTJiYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSHlwZXJsaW5rQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLmZsYXR1aTsKLQotcHVibGljIGNsYXNzIEh5cGVybGlua0FkYXB0ZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXJ7Ci0KLXB1YmxpYyBIeXBlcmxpbmtBZGFwdGVyKCkgewotICAgIHN1cGVyKCk7Ci19Ci1wdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgbGlua0xhYmVsKSB7fQotcHVibGljIHZvaWQgbGlua0VudGVyZWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCBsaW5rTGFiZWwpIHt9Ci1wdWJsaWMgdm9pZCBsaW5rRXhpdGVkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgbGlua0xhYmVsKSB7fQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDNjMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSHlwZXJsaW5rSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLXB1YmxpYyBjbGFzcyBIeXBlcmxpbmtIYW5kbGVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lciwgTW91c2VUcmFja0xpc3RlbmVyLCBQYWludExpc3RlbmVyIHsKLQotICAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FX05FVkVSID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFUkxJTkVfUk9MTE9WRVIgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9BTFdBWVMgPSAzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ3Vyc29yIGh5cGVybGlua0N1cnNvcjsKLSAgICBwcml2YXRlIHN0YXRpYyBDdXJzb3IgYnVzeUN1cnNvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaHlwZXJsaW5rQ3Vyc29yVXNlZD10cnVlOwotICAgIHByaXZhdGUgaW50IGh5cGVybGlua1VuZGVybGluZU1vZGU9VU5ERVJMSU5FX0FMV0FZUzsKLSAgICBwcml2YXRlIENvbG9yIGJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kOwotICAgIHByaXZhdGUgQ29sb3IgYWN0aXZlQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIENvbG9yIGFjdGl2ZUZvcmVncm91bmQ7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgaHlwZXJsaW5rTGlzdGVuZXJzOwotICAgIHByaXZhdGUgQ29udHJvbCBsYXN0TGluazsKLQotcHVibGljIEh5cGVybGlua0hhbmRsZXIoKSB7Ci0gICAgaHlwZXJsaW5rTGlzdGVuZXJzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGlmIChoeXBlcmxpbmtDdXJzb3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBoeXBlcmxpbmtDdXJzb3IgPSBuZXcgQ3Vyc29yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBTV1QuQ1VSU09SX0hBTkQpOwotICAgICAgYnVzeUN1cnNvciA9IG5ldyBDdXJzb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIFNXVC5DVVJTT1JfV0FJVCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICBoeXBlcmxpbmtDdXJzb3IuZGlzcG9zZSgpOwotICAgIGJ1c3lDdXJzb3IuZGlzcG9zZSgpOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBnZXRBY3RpdmVCYWNrZ3JvdW5kKCkgewotICAgIHJldHVybiBhY3RpdmVCYWNrZ3JvdW5kOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBnZXRBY3RpdmVGb3JlZ3JvdW5kKCkgewotICAgIHJldHVybiBhY3RpdmVGb3JlZ3JvdW5kOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBnZXRCYWNrZ3JvdW5kKCkgewotICAgIHJldHVybiBiYWNrZ3JvdW5kOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3IgZ2V0QnVzeUN1cnNvcigpIHsKLSAgICByZXR1cm4gYnVzeUN1cnNvcjsKLX0KLXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsKLSAgICByZXR1cm4gZm9yZWdyb3VuZDsKLX0KLXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yIGdldEh5cGVybGlua0N1cnNvcigpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rQ3Vyc29yOwotfQotcHVibGljIGludCBnZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCkgewotICAgIHJldHVybiBoeXBlcmxpbmtVbmRlcmxpbmVNb2RlOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgZ2V0TGFzdExpbmsoKSB7Ci0gICAgcmV0dXJuIGxhc3RMaW5rOwotfQotcHVibGljIGJvb2xlYW4gaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkgewotICAgIHJldHVybiBoeXBlcmxpbmtDdXJzb3JVc2VkOwotfQotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotICAgICAgICB9Ci1wdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0gICAgaWYgKGUuYnV0dG9uID09IDEpCi0gICAgICAgIHJldHVybjsKLSAgICBsYXN0TGluayA9IChDb250cm9sKWUud2lkZ2V0OwotfQotcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgZS53aWRnZXQ7Ci0gICAgaWYgKGlzSHlwZXJsaW5rQ3Vyc29yVXNlZCgpKQotICAgICAgICBjb250cm9sLnNldEN1cnNvcihoeXBlcmxpbmtDdXJzb3IpOwotICAgIGlmIChhY3RpdmVCYWNrZ3JvdW5kICE9IG51bGwpCi0gICAgICAgIGNvbnRyb2wuc2V0QmFja2dyb3VuZChhY3RpdmVCYWNrZ3JvdW5kKTsKLSAgICBpZiAoYWN0aXZlRm9yZWdyb3VuZCAhPSBudWxsKQotICAgICAgICBjb250cm9sLnNldEZvcmVncm91bmQoYWN0aXZlRm9yZWdyb3VuZCk7Ci0gICAgaWYgKGh5cGVybGlua1VuZGVybGluZU1vZGU9PVVOREVSTElORV9ST0xMT1ZFUikgdW5kZXJsaW5lKGNvbnRyb2wsIHRydWUpOyAgICAKLQotICAgIElIeXBlcmxpbmtMaXN0ZW5lciBhY3Rpb24gPQotICAgICAgICAoSUh5cGVybGlua0xpc3RlbmVyKSBoeXBlcmxpbmtMaXN0ZW5lcnMuZ2V0KGNvbnRyb2wpOwotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgYWN0aW9uLmxpbmtFbnRlcmVkKGNvbnRyb2wpOwotfQotcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgewotICAgIENvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBlLndpZGdldDsKLSAgICBpZiAoaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkpCi0gICAgICAgIGNvbnRyb2wuc2V0Q3Vyc29yKG51bGwpOwotICAgIGlmIChoeXBlcmxpbmtVbmRlcmxpbmVNb2RlPT1VTkRFUkxJTkVfUk9MTE9WRVIpCi0gICAgICAgIHVuZGVybGluZShjb250cm9sLCBmYWxzZSk7Ci0gICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkKLSAgICAgICAgY29udHJvbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotICAgIGlmIChmb3JlZ3JvdW5kICE9IG51bGwpCi0gICAgICAgIGNvbnRyb2wuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLSAgICBJSHlwZXJsaW5rTGlzdGVuZXIgYWN0aW9uID0KLSAgICAgICAgKElIeXBlcmxpbmtMaXN0ZW5lcikgaHlwZXJsaW5rTGlzdGVuZXJzLmdldChjb250cm9sKTsKLSAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgIGFjdGlvbi5saW5rRXhpdGVkKGNvbnRyb2wpOwotfQotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgewotICAgICAgICB9Ci1wdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotICAgIGlmIChlLmJ1dHRvbiAhPSAxKQotICAgICAgICByZXR1cm47Ci0gICAgSUh5cGVybGlua0xpc3RlbmVyIGFjdGlvbiA9Ci0gICAgICAgIChJSHlwZXJsaW5rTGlzdGVuZXIpIGh5cGVybGlua0xpc3RlbmVycy5nZXQoZS53aWRnZXQpOwotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICBDb250cm9sIGMgPSAoQ29udHJvbCkgZS53aWRnZXQ7Ci0gICAgICAgIGMuc2V0Q3Vyc29yKGJ1c3lDdXJzb3IpOwotICAgICAgICBhY3Rpb24ubGlua0FjdGl2YXRlZChjKTsKLSAgICAgICAgaWYgKCFjLmlzRGlzcG9zZWQoKSkgCi0gICAgICAgICAgIGMuc2V0Q3Vyc29yKGlzSHlwZXJsaW5rQ3Vyc29yVXNlZCgpP2h5cGVybGlua0N1cnNvcjpudWxsKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0gICAgQ29udHJvbCBsYWJlbCA9IChDb250cm9sKSBlLndpZGdldDsKLSAgICBpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfQUxXQVlTKQotICAgICAgICBIeXBlcmxpbmtIYW5kbGVyLnVuZGVybGluZShsYWJlbCwgdHJ1ZSk7Ci19Ci1wdWJsaWMgdm9pZCByZWdpc3Rlckh5cGVybGluayhDb250cm9sIGNvbnRyb2wsIElIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpCi0gICAgICAgIGNvbnRyb2wuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLSAgICBpZiAoZm9yZWdyb3VuZCAhPSBudWxsKQotICAgICAgICBjb250cm9sLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0gICAgY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOwotICAgIGNvbnRyb2wuYWRkTW91c2VUcmFja0xpc3RlbmVyKHRoaXMpOwotICAgIGlmIChoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID09IFVOREVSTElORV9BTFdBWVMpCi0gICAgICAgIGNvbnRyb2wuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICBoeXBlcmxpbmtMaXN0ZW5lcnMucHV0KGNvbnRyb2wsIGxpc3RlbmVyKTsKLSAgICByZW1vdmVEaXNwb3NlZExpbmtzKCk7Ci19Ci1wcml2YXRlIHZvaWQgcmVtb3ZlRGlzcG9zZWRMaW5rcygpIHsKLSAgICBmb3IgKEVudW1lcmF0aW9uIGtleXMgPSBoeXBlcmxpbmtMaXN0ZW5lcnMua2V5cygpOyBrZXlzLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbClrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChjb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgaHlwZXJsaW5rTGlzdGVuZXJzLnJlbW92ZShjb250cm9sKTsKLSAgICAgICAgfQotICAgIH0KLX0KLXB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIGh5cGVybGlua0xpc3RlbmVycy5jbGVhcigpOwotfQotcHVibGljIHZvaWQgc2V0QWN0aXZlQmFja2dyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3QWN0aXZlQmFja2dyb3VuZCkgewotICAgIGFjdGl2ZUJhY2tncm91bmQgPSBuZXdBY3RpdmVCYWNrZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0QWN0aXZlRm9yZWdyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3QWN0aXZlRm9yZWdyb3VuZCkgewotICAgIGFjdGl2ZUZvcmVncm91bmQgPSBuZXdBY3RpdmVGb3JlZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3QmFja2dyb3VuZCkgewotICAgIGJhY2tncm91bmQgPSBuZXdCYWNrZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3Rm9yZWdyb3VuZCkgewotICAgIGZvcmVncm91bmQgPSBuZXdGb3JlZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQ3Vyc29yVXNlZChib29sZWFuIG5ld0h5cGVybGlua0N1cnNvclVzZWQpIHsKLSAgICBoeXBlcmxpbmtDdXJzb3JVc2VkID0gbmV3SHlwZXJsaW5rQ3Vyc29yVXNlZDsKLX0KLXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1VuZGVybGluZU1vZGUoaW50IG5ld0h5cGVybGlua1VuZGVybGluZU1vZGUpIHsKLSAgICBoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID0gbmV3SHlwZXJsaW5rVW5kZXJsaW5lTW9kZTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlcmxpbmUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGluc2lkZSkgewotICAgIGlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbCkpCi0gICAgICAgIHJldHVybjsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLSAgICBSZWN0YW5nbGUgYm91bmRzID0gY29udHJvbC5nZXRCb3VuZHMoKTsKLSAgICBHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotICAgIENvbG9yIGNvbG9yID0gaW5zaWRlPyBjb250cm9sLmdldEZvcmVncm91bmQoKSA6IGNvbnRyb2wuZ2V0QmFja2dyb3VuZCgpOwotICAgIGdjLnNldEZvcmVncm91bmQoY29sb3IpOwotICAgIGludCB5ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0OwotICAgIGdjLmRyYXdMaW5lKGJvdW5kcy54LCB5LCBib3VuZHMueCtib3VuZHMud2lkdGgsIHkpOwotICAgIGdjLmRpc3Bvc2UoKTsKLX0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvZmxhdHVpL0lIeXBlcmxpbmtMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSUh5cGVybGlua0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZGZiYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSUh5cGVybGlua0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuZmxhdHVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotcHVibGljIGludGVyZmFjZSBJSHlwZXJsaW5rTGlzdGVuZXIgewotCi0gIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rTGFiZWwpOwotICBwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChDb250cm9sIGxpbmtMYWJlbCk7Ci0gIHB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoQ29udHJvbCBsaW5rTGFiZWwpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9Ub2dnbGVDb250cm9sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9Ub2dnbGVDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MmNmMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvVG9nZ2xlQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHlwZWRMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFRvZ2dsZUNvbnRyb2wgZXh0ZW5kcyBDYW52YXMgewotICBwcml2YXRlIGJvb2xlYW4gZkNvbGxhcHNlZDsKLSAgcHJpdmF0ZSBDb2xvciBmRGVjb3JhdGlvbkNvbG9yOwotICBwcml2YXRlIENvbG9yIGZBY3RpdmVDb2xvcjsKLSAgcHJpdmF0ZSBDdXJzb3IgZkFjdGl2ZUN1cnNvcjsKLSAgcHJpdmF0ZSBib29sZWFuIGZIYXNGb2N1czsKLSAgcHJpdmF0ZSBib29sZWFuIGZIb3ZlciA9IGZhbHNlOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFSR0lOX1dJRFRIID0gMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9IRUlHSFQgPSAyOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVCA9IDg7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEVYUEFOREVEX1BPSU5UUyA9IHsgMCwgMiwgOCwgMiwgNCwgNiB9OyAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ09MTEFQU0VEX1BPSU5UUyA9IHsgMiwgMCwgMiwgOCwgNiwgNCB9OyAKLSAgcHJpdmF0ZSBpbnQgZk11bHRpcGxpZXIgPSAyOwotICBwcml2YXRlIGludCBmSGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7ICAKLQotICAvKiBhY2Nlc3NpYmlsaXR5ICovCi0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb247Ci0KLSAgcHVibGljIFRvZ2dsZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgaW5pdEFjY2Vzc2libGUoKTsKLQotICAgIGFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0gICAgICAgIHBhaW50KGUpOwotICAgICAgfQotICAgIH0pOwotICAgIGFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24pOwotICAgICAgfQotICAgIH0pOwotICAgIGFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgIGlmIChlLmNoYXJhY3RlciA9PSAnXHInIHx8IGUuY2hhcmFjdGVyID09ICcgJykgewotICAgICAgICAgIC8vIEFjdGl2YXRpb24KLSAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBhZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgaWYgKGUuZGV0YWlsICE9IFNXVC5UUkFWRVJTRV9SRVRVUk4pCi0gICAgICAgICAgZS5kb2l0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBhZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgewotICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgIGlmICghZkhhc0ZvY3VzKSB7Ci0gICAgICAgICAgZkhhc0ZvY3VzID0gdHJ1ZTsKLSAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotICAgICAgICBpZiAoZkhhc0ZvY3VzKSB7Ci0gICAgICAgICAgZkhhc0ZvY3VzID0gZmFsc2U7Ci0gICAgICAgICAgcmVkcmF3KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICBmQ29sbGFwc2VkID0gIWZDb2xsYXBzZWQ7Ci0gICAgICAgIHJlZHJhdygpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgYWRkTW91c2VUcmFja0xpc3RlbmVyKG5ldyBNb3VzZVRyYWNrQWRhcHRlcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgIGZIb3ZlciA9IHRydWU7Ci0gICAgICAgIGlmIChmQWN0aXZlQ3Vyc29yICE9IG51bGwpCi0gICAgICAgICAgc2V0Q3Vyc29yKGZBY3RpdmVDdXJzb3IpOwotICAgICAgICByZWRyYXcoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgZkhvdmVyID0gZmFsc2U7Ci0gICAgICAgIGlmIChmQWN0aXZlQ3Vyc29yICE9IG51bGwpCi0gICAgICAgICAgc2V0Q3Vyc29yKG51bGwpOwotICAgICAgICByZWRyYXcoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgY2hlY2tXaWRnZXQoKTsKLSAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgIGFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBUeXBlZExpc3RlbmVyKGxpc3RlbmVyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWNvcmF0aW9uQ29sb3IoQ29sb3IgZGVjb3JhdGlvbkNvbG9yKSB7Ci0gICAgdGhpcy5mRGVjb3JhdGlvbkNvbG9yID0gZGVjb3JhdGlvbkNvbG9yOwotICB9Ci0KLSAgcHVibGljIENvbG9yIGdldERlY29yYXRpb25Db2xvcigpIHsKLSAgICByZXR1cm4gZkRlY29yYXRpb25Db2xvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZURlY29yYXRpb25Db2xvcihDb2xvciBhY3RpdmVDb2xvcikgewotICAgIHRoaXMuZkFjdGl2ZUNvbG9yID0gYWN0aXZlQ29sb3I7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICByZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVDdXJzb3IoQ3Vyc29yIGFjdGl2ZUN1cnNvcikgewotICAgIHRoaXMuZkFjdGl2ZUN1cnNvciA9IGFjdGl2ZUN1cnNvcjsKLSAgfQotCi0gIHB1YmxpYyBDb2xvciBnZXRBY3RpdmVEZWNvcmF0aW9uQ29sb3IoKSB7Ci0gICAgcmV0dXJuIGZBY3RpdmVDb2xvcjsKLSAgfQotCi0gIHB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0KLSAgICByZXR1cm4gbmV3IFBvaW50KCh3SGludCAhPSBTV1QuREVGQVVMVCA/IHdIaW50IDogZkhlaWdodCArIDIgKiBNQVJHSU5fV0lEVEgpLCAoaEhpbnQgIT0gU1dULkRFRkFVTFQgPyBoSGludCA6IGZIZWlnaHQgKyAyICogTUFSR0lOX0hFSUdIVCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7Ci0gICAgR0MgZ2MgPSBlLmdjOwotICAgIFBvaW50IHNpemUgPSBnZXRTaXplKCk7Ci0gICAgZ2Muc2V0Rm9udChnZXRGb250KCkpOwotICAgIHBhaW50KGdjKTsKLSAgICBpZiAoZkhhc0ZvY3VzKSB7Ci0gICAgICBnYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0gICAgICBnYy5kcmF3Rm9jdXMoMCwgMCwgc2l6ZS54LCBzaXplLnkpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgU2VsZWN0YWJsZUNvbnRyb2wjcGFpbnQoR0MpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwYWludChHQyBnYykgewotICAgIGlmIChmSG92ZXIgJiYgZkFjdGl2ZUNvbG9yICE9IG51bGwpCi0gICAgICBnYy5zZXRCYWNrZ3JvdW5kKGZBY3RpdmVDb2xvcik7Ci0gICAgZWxzZSBpZiAoZkRlY29yYXRpb25Db2xvciAhPSBudWxsKQotICAgICAgZ2Muc2V0QmFja2dyb3VuZChmRGVjb3JhdGlvbkNvbG9yKTsKLSAgICBlbHNlCi0gICAgICBnYy5zZXRCYWNrZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0gICAgUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsKLSAgICBnYy5maWxsUG9seWdvbih0cmFuc2xhdGUoKGZDb2xsYXBzZWQgPyBDT0xMQVBTRURfUE9JTlRTIDogRVhQQU5ERURfUE9JTlRTKSwgKChzaXplLnggLSBmSGVpZ2h0KSAvIDIpLCAoKHNpemUueSAtIGZIZWlnaHQpIC8gMikpKTsKLSAgICBnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0gIH0KLQotICBwcml2YXRlIGludFtdIHRyYW5zbGF0ZShpbnRbXSBkYXRhLCBpbnQgeCwgaW50IHkpIHsKLSAgICBpbnRbXSB0YXJnZXQgPSBuZXcgaW50W2RhdGEubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgIHRhcmdldFtpXSA9IGRhdGFbaV0qZkhlaWdodC9ERUZBVUxUX0hFSUdIVCArIHg7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgdGFyZ2V0W2ldID0gZGF0YVtpXSpmSGVpZ2h0L0RFRkFVTFRfSEVJR0hUICsgeTsKLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCB5KSB7Ci0gICAgZkhlaWdodCA9IHk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBldmVudFR5cGUpIHsKLSAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgIGV2ZW50LnR5cGUgPSBldmVudFR5cGU7Ci0gICAgZXZlbnQud2lkZ2V0ID0gdGhpczsKLSAgICBub3RpZnlMaXN0ZW5lcnMoZXZlbnRUeXBlLCBldmVudCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGZDb2xsYXBzZWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oYm9vbGVhbiBzZWxlY3Rpb24pIHsKLSAgICB0aGlzLmZDb2xsYXBzZWQgPSBzZWxlY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdEFjY2Vzc2libGUoKSB7Ci0gICAgZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgICAgZS5yZXN1bHQgPSBmTmFtZTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZ2V0RGVzY3JpcHRpb24oQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgICAgZS5yZXN1bHQgPSBmRGVzY3JpcHRpb247Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBnZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzKCk7Ci0gICAgICAgIFBvaW50IHB0ID0gdG9EaXNwbGF5KG5ldyBQb2ludChsb2NhdGlvbi54LCBsb2NhdGlvbi55KSk7Ci0gICAgICAgIGUueCA9IHB0Lng7Ci0gICAgICAgIGUueSA9IHB0Lnk7Ci0gICAgICAgIGUud2lkdGggPSBsb2NhdGlvbi53aWR0aDsKLSAgICAgICAgZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgIGUuZGV0YWlsID0gMDsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgZS5kZXRhaWwgPSBBQ0MuUk9MRV9UUkVFOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgZS5kZXRhaWwgPSBmQ29sbGFwc2VkID8gQUNDLlNUQVRFX0NPTExBUFNFRCA6IEFDQy5TVEFURV9FWFBBTkRFRDsKLSAgICAgIH0KLQotICAgIH0pOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvZmxhdHVpL1dpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvZmxhdHVpL1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4ZmU2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9XaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLmZsYXR1aTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgV2lkZ2V0RmFjdG9yeSB7CQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0hFQURFUl9DT0xPUiA9ICJfX2RlZmF1bHRfX2hlYWRlcl9fIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQkFDS0dST1VORCA9ICJfX2JnIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQk9SREVSID0gIl9fYm9yZGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQ09NUE9TSVRFX1NFUEFSQVRPUiA9ICJfX2NvbXBTZXAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9IWVBFUkxJTks9Il9faHlwZXJsaW5rIjsKLSAgICAKLSAgcHJpdmF0ZSBIYXNodGFibGUgY29sb3JSZWdpc3RyeSA9IG5ldyBIYXNodGFibGUoKTsKLSAgcHJpdmF0ZSBDb2xvciBiYWNrZ3JvdW5kQ29sb3I7Ci0gIHByaXZhdGUgQ29sb3IgY2xpZW50QXJlYUNvbG9yOwotICBwcml2YXRlIEtleUxpc3RlbmVyIGRlbGV0ZUxpc3RlbmVyOwotICBwcml2YXRlIENvbG9yIGZvcmVncm91bmRDb2xvcjsKLSAgcHJpdmF0ZSBDb2xvciBmUmVhZE9ubHlDb2xvcjsKLSAgcHJpdmF0ZSBEaXNwbGF5IGZEaXNwbGF5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1JERVJfU1RZTEUgPSBTV1QuTk9ORTsKLSAgcHJpdmF0ZSBCb3JkZXJQYWludGVyIGJvcmRlclBhaW50ZXI7Ci0gIHByaXZhdGUgQ29sb3IgYm9yZGVyQ29sb3I7Ci0gIHByaXZhdGUgSHlwZXJsaW5rSGFuZGxlciBoeXBlcmxpbmtIYW5kbGVyOwotICBwcml2YXRlIHN0YXRpYyBJbWFnZSBmQmFubmVyOwotICAKLQotICBjbGFzcyBCb3JkZXJQYWludGVyIGltcGxlbWVudHMgUGFpbnRMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ29udHJvbCBjID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgLy9pZiAoYy5pc0VuYWJsZWQoKT09ZmFsc2UpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgVGV4dAotICAgICAgICAgICAgICAgICAgICB8fCBjIGluc3RhbmNlb2YgQ2FudmFzCi0gICAgICAgICAgICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBDQ29tYm8pIHsKLSAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGIgPSBjLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgICAgICBHQyBnYyA9IGV2ZW50LmdjOwotICAgICAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGMuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDIsIGIueSAtIDIsIGIud2lkdGggKyAzLCBiLmhlaWdodCArIDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjIGluc3RhbmNlb2YgVGFibGUKLSAgICAgICAgICAgICAgICAgICAgfHwgYyBpbnN0YW5jZW9mIFRyZWUKLSAgICAgICAgICAgICAgICAgICAgfHwgYyBpbnN0YW5jZW9mIFRhYmxlVHJlZSkgewotICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgYiA9IGMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIEdDIGdjID0gZXZlbnQuZ2M7Ci0gICAgICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IpOwotICAgICAgICAgICAgICAgICAgICAvL2djLmRyYXdSZWN0YW5nbGUoYi54IC0gMiwgYi55IC0gMiwgYi53aWR0aCArIDMsIGIuaGVpZ2h0ICsgMyk7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmRyYXdSZWN0YW5nbGUoYi54LTEsIGIueS0xLCBiLndpZHRoKzIsIGIuaGVpZ2h0KzIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi1wdWJsaWMgV2lkZ2V0RmFjdG9yeSgpIHsKLSAJZkRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLSAgICBpbml0aWFsaXplKCk7Ci19Ci0KLXB1YmxpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLSAgICBpbnQgZmxhdFN0eWxlID0gQk9SREVSX1NUWUxFID09IFNXVC5CT1JERVIgPyBTV1QuTlVMTCA6IFNXVC5GTEFUOwotICAgIC8vaW50IGZsYXRTdHlsZSA9IFNXVC5OVUxMOwotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgc3R5bGUgfCBmbGF0U3R5bGUpOwotICAgIGJ1dHRvbi5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0gICAgYnV0dG9uLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICBpZiAodGV4dCE9bnVsbCkgYnV0dG9uLnNldFRleHQodGV4dCk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLX0KLXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotfQotcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBzdHlsZSk7Ci0gICAgY29tcG9zaXRlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotfQotcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGVTZXBhcmF0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKGdldENvbG9yKENPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IpKTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotfQotcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuU0hBRE9XX05PTkUpOwotCWdyb3VwLnNldFRleHQodGV4dCk7Ci0gICAgZ3JvdXAuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIGdyb3VwLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQlyZXR1cm4gZ3JvdXA7Ci19Ci1wdWJsaWMgTGFiZWwgY3JlYXRlSGVhZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBDb2xvciBiZykgewotICAgIHJldHVybiBjcmVhdGVIZWFkaW5nTGFiZWwocGFyZW50LCB0ZXh0LCBiZywgU1dULk5PTkUpOwotfQotcHVibGljIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgQ29sb3IgYmcsIGludCBzdHlsZSkgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgc3R5bGUpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgbGFiZWwuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIGxhYmVsLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICBsYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5CQU5ORVJfRk9OVCkpOwotICAgIHJldHVybiBsYWJlbDsKLX0KLXB1YmxpYyBMYWJlbCBjcmVhdGVIeXBlcmxpbmtMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUh5cGVybGlua0xhYmVsKHBhcmVudCwgdGV4dCwgbGlzdGVuZXIsIFNXVC5OVUxMKTsKLX0KLXB1YmxpYyBMYWJlbCBjcmVhdGVIeXBlcmxpbmtMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyLCBpbnQgc3R5bGUpIHsKLSAgICBMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgc3R5bGUpOwotICAgIHR1cm5JbnRvSHlwZXJsaW5rKGxhYmVsLCBsaXN0ZW5lcik7Ci0gICAgcmV0dXJuIGxhYmVsOwotfQotcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgU1dULk5PTkUpOwotfQotcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlKTsKLSAgICBpZiAodGV4dCE9bnVsbCkgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotICAgIHJldHVybiBsYWJlbDsKLX0KLXB1YmxpYyBMYWJlbCBjcmVhdGVTZXBhcmF0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgc3R5bGUpOwotICAgIGxhYmVsLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yKTsKLSAgICByZXR1cm4gbGFiZWw7Ci19Ci1wdWJsaWMgU2Nyb2xsZWRDb21wb3NpdGUgY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUgKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxlZGNvbXBvc2l0ZSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgc2Nyb2xsZWRjb21wb3NpdGUuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIHNjcm9sbGVkY29tcG9zaXRlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICByZXR1cm4gc2Nyb2xsZWRjb21wb3NpdGU7Ci19Ci1wdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBCT1JERVJfU1RZTEUgfCBzdHlsZSk7Ci0gICAgdGFibGUuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIHRhYmxlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICAvL2hvb2tEZWxldGVMaXN0ZW5lcih0YWJsZSk7Ci0gICAgcmV0dXJuIHRhYmxlOwotfQotcHVibGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIHZhbHVlLCBCT1JERVJfU1RZTEUgfCBTV1QuU0lOR0xFKTsKLX0KLXB1YmxpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHZhbHVlLCBpbnQgc3R5bGUpIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIHN0eWxlKTsKLSAgICB0ZXh0LnNldFRleHQodmFsdWUpOwotICAgIHRleHQuc2V0QmFja2dyb3VuZChjbGllbnRBcmVhQ29sb3IpOwotICAgIHRleHQuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotICAgIGlmICgoc3R5bGUgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKQotICAgIAl0ZXh0LnNldEZvcmVncm91bmQoZlJlYWRPbmx5Q29sb3IpOwotICAgIHJldHVybiB0ZXh0OwotfQotcHVibGljIFRyZWUgY3JlYXRlVHJlZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICBUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIEJPUkRFUl9TVFlMRSB8IHN0eWxlKTsKLSAgICB0cmVlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICB0cmVlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICAvL2hvb2tEZWxldGVMaXN0ZW5lcih0cmVlKTsKLSAgICByZXR1cm4gdHJlZTsKLX0KLS8qIAotcHJpdmF0ZSB2b2lkIGRlbGV0ZUtleVByZXNzZWQoV2lkZ2V0IHdpZGdldCkgewotICAgIGlmICghKHdpZGdldCBpbnN0YW5jZW9mIENvbnRyb2wpKSByZXR1cm47Ci0gICAgQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpd2lkZ2V0OwotICAgIGZvciAoQ29udHJvbCBwYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpOwotICAgICAgICBwYXJlbnQgIT0gbnVsbDsKLSAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKSB7Ci0gICAgICAgIGlmIChwYXJlbnQuZ2V0RGF0YSgpIGluc3RhbmNlb2YgRm9ybVNlY3Rpb24pIHsKLSAgICAgICAgICAgIEZvcm1TZWN0aW9uIHNlY3Rpb24gPSAoRm9ybVNlY3Rpb24pIHBhcmVudC5nZXREYXRhKCk7Ci0gICAgICAgICAgICBzZWN0aW9uLmRvR2xvYmFsQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuREVMRVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotKi8KLXB1YmxpYyBWaWV3Rm9ybSBjcmVhdGVWaWV3Rm9ybShDb21wb3NpdGUgcGFyZW50KSB7Ci0JVmlld0Zvcm0gdmlld0Zvcm0gPSBuZXcgVmlld0Zvcm0ocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgdmlld0Zvcm0uc2V0QmFja2dyb3VuZChjbGllbnRBcmVhQ29sb3IpOwotICAgIHZpZXdGb3JtLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICByZXR1cm4gdmlld0Zvcm07Ci19Ci1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIEVudW1lcmF0aW9uIGNvbG9ycz0gY29sb3JSZWdpc3RyeS5lbGVtZW50cygpOwotICAgIHdoaWxlIChjb2xvcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgQ29sb3IgYyA9IChDb2xvciljb2xvcnMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgfQotICAgIGh5cGVybGlua0hhbmRsZXIuZGlzcG9zZSgpOwotICAgIGNvbG9yUmVnaXN0cnk9bnVsbDsKLSAgICBpZiAoZkJhbm5lciAhPSBudWxsKQotICAgIHsKLSAgICAgIGZCYW5uZXIuZGlzcG9zZSgpOwotICAgICAgZkJhbm5lciA9IG51bGw7Ci0gICAgfQotfQotcHVibGljIENvbG9yIGdldEJhY2tncm91bmRDb2xvcigpIHsKLSAgICByZXR1cm4gYmFja2dyb3VuZENvbG9yOwotfQotcHVibGljIEltYWdlIGdldEJhbm5lcigpIHsKLSAgaWYgKGZCYW5uZXIgPT0gbnVsbCkKLSAgewotICAgIHRyeSB7Ci0gICAgICBmQmFubmVyID0gKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ldyBVUkwoKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpKSwgImljb25zXGZvcm1fYmFubmVyLmdpZiIpKSkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRlZCBJbWFnZSEhISEgIik7Ci0gICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uISEhISAiICsgZSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmQmFubmVyOwotfQotcHVibGljIENvbG9yIGdldEJvcmRlckNvbG9yKCkgewotICAgIHJldHVybiBib3JkZXJDb2xvcjsKLX0KLXB1YmxpYyBDdXJzb3IgZ2V0QnVzeUN1cnNvcigpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRCdXN5Q3Vyc29yKCk7Ci19Ci1wdWJsaWMgQ29sb3IgZ2V0Q2xpZW50QXJlYUNvbG9yKCkgewotICAgIHJldHVybiBjbGllbnRBcmVhQ29sb3I7Ci19Ci1wdWJsaWMgQ29sb3IgZ2V0Q29sb3IoU3RyaW5nIGtleSkgewotICAgIHJldHVybiAoQ29sb3IpY29sb3JSZWdpc3RyeS5nZXQoa2V5KTsKLX0KLXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kQ29sb3IoKSB7Ci0gICAgcmV0dXJuIGZvcmVncm91bmRDb2xvcjsKLX0KLXB1YmxpYyBDb2xvciBnZXRIeXBlcmxpbmtDb2xvcigpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRGb3JlZ3JvdW5kKCk7Ci19Ci1wdWJsaWMgQ3Vyc29yIGdldEh5cGVybGlua0N1cnNvcigpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRIeXBlcmxpbmtDdXJzb3IoKTsKLX0KLXB1YmxpYyBDb2xvciBnZXRIeXBlcmxpbmtIb3ZlckNvbG9yKCkgewotICAgIHJldHVybiBoeXBlcmxpbmtIYW5kbGVyLmdldEFjdGl2ZUZvcmVncm91bmQoKTsKLX0KLXB1YmxpYyBpbnQgZ2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSgpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCk7Ci19Ci0vKgotcHVibGljIHZvaWQgaG9va0RlbGV0ZUxpc3RlbmVyKENvbnRyb2wgY29udHJvbCkgewotICAgIGlmIChkZWxldGVMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgIGRlbGV0ZUxpc3RlbmVyID0gbmV3IEtleUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuREVMICYmIGV2ZW50LnN0YXRlTWFzayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUtleVByZXNzZWQoZXZlbnQud2lkZ2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIGNvbnRyb2wuYWRkS2V5TGlzdGVuZXIoZGVsZXRlTGlzdGVuZXIpOwotfQotKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNDb2xvcnMoKQotICB7Ci0gICAgaWYgKGNvbG9yUmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb2xvclJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgcmVnaXN0ZXJDb2xvcihDT0xPUl9CQUNLR1JPVU5ELCAweGZmLCAweGZlLCAweGY5KTsKLSAgICAgIHJlZ2lzdGVyQ29sb3IoQ09MT1JfQk9SREVSLCAxOTUsIDE5MSwgMTc5KTsKLSAgICAgIHJlZ2lzdGVyQ29sb3IoQ09MT1JfQ09NUE9TSVRFX1NFUEFSQVRPUiwgMTUyLCAxNzAsIDIwMyk7Ci0gICAgICByZWdpc3RlckNvbG9yKERFRkFVTFRfSEVBREVSX0NPTE9SLCAweDQ4LCAweDcwLCAweDk4KTsKLSAgICAgIHJlZ2lzdGVyQ29sb3IoQ09MT1JfSFlQRVJMSU5LLCAwLCAwLCAxNTMpOwotICAgIH0KLSAgfQotCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICBjbGllbnRBcmVhQ29sb3IgPSBmRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLSAgICBmUmVhZE9ubHlDb2xvciA9IGZEaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSQVkpOwotICAgIGluaXRTdGF0aWNDb2xvcnMoKTsKLSAgICBiYWNrZ3JvdW5kQ29sb3IgPSBjbGllbnRBcmVhQ29sb3I7Ci0gICAgYm9yZGVyQ29sb3IgPSBnZXRDb2xvcihDT0xPUl9CT1JERVIpOwotICAgIGZvcmVncm91bmRDb2xvciA9IGZEaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotICAgIGh5cGVybGlua0hhbmRsZXIgPSBuZXcgSHlwZXJsaW5rSGFuZGxlcigpOwotICAgIGh5cGVybGlua0hhbmRsZXIuc2V0Rm9yZWdyb3VuZChnZXRDb2xvcihDT0xPUl9IWVBFUkxJTkspKTsKLSAgICBoeXBlcmxpbmtIYW5kbGVyLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLX0KLXB1YmxpYyB2b2lkIHBhaW50Qm9yZGVyc0ZvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgaWYgKEJPUkRFUl9TVFlMRSA9PSBTV1QuQk9SREVSKSByZXR1cm47Ci0gICAgaWYgKGJvcmRlclBhaW50ZXI9PW51bGwpIGJvcmRlclBhaW50ZXIgPSBuZXcgQm9yZGVyUGFpbnRlcigpOwotICAgIHBhcmVudC5hZGRQYWludExpc3RlbmVyKGJvcmRlclBhaW50ZXIpOwotfQotcHVibGljIENvbG9yIHJlZ2lzdGVyQ29sb3IoU3RyaW5nIGtleSwgaW50IHIsIGludCBnLCBpbnQgYikgewotICAgIENvbG9yIGMgPSBuZXcgQ29sb3IoZkRpc3BsYXksIHIsIGcsIGIpOwotICAgIGNvbG9yUmVnaXN0cnkucHV0KGtleSwgYyk7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldENsaWVudEFyZWFDb2xvcihDb2xvciBjb2xvcikKLXsKLSAgY2xpZW50QXJlYUNvbG9yID0gY29sb3I7Ci0gIGJhY2tncm91bmRDb2xvciA9IGNsaWVudEFyZWFDb2xvcjsKLX0KLQotcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQ29sb3IoQ29sb3IgY29sb3IpIHsKLSAgICBoeXBlcmxpbmtIYW5kbGVyLnNldEZvcmVncm91bmQoY29sb3IpOwotfQotcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rSG92ZXJDb2xvcihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgaG92ZXJDb2xvcikgewotICAgIGh5cGVybGlua0hhbmRsZXIuc2V0QWN0aXZlRm9yZWdyb3VuZChob3ZlckNvbG9yKTsKLX0KLXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1VuZGVybGluZU1vZGUoaW50IG5ld0h5cGVybGlua1VuZGVybGluZU1vZGUpIHsKLSAgICBoeXBlcmxpbmtIYW5kbGVyLnNldEh5cGVybGlua1VuZGVybGluZU1vZGUobmV3SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSk7Ci19Ci1wdWJsaWMgdm9pZCB0dXJuSW50b0h5cGVybGluayhDb250cm9sIGNvbnRyb2wsIElIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGh5cGVybGlua0hhbmRsZXIucmVnaXN0ZXJIeXBlcmxpbmsoY29udHJvbCwgbGlzdGVuZXIpOwotfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9CYXNlRGVzaWduV2luZG93LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL3VpL0Jhc2VEZXNpZ25XaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3MTk4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL3VpL0Jhc2VEZXNpZ25XaW5kb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5VSVBsdWdpbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VEZXNpZ25XaW5kb3cgZXh0ZW5kcyBWaWV3ZXIKLXsKLSAgcHJpdmF0ZSBGb250IGZvbnQ7Ci0KLSAgcHJvdGVjdGVkIFNjcm9sbGVkQ29tcG9zaXRlIG1haW5VSUNvbXBvbmVudDsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sc0NvbnRhaW5lcjsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwYWdlQ29tcGxldGUgPSB0cnVlOwotICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OwotCi0gIHByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmU7Ci0KLSAgcHVibGljIEJhc2VEZXNpZ25XaW5kb3coSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmUpCi0gIHsKLSAgICB0aGlzLnN0YXR1c0xpbmUgPSBzdGF0dXNMaW5lOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0U3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZSkKLSAgewotICAgIHRoaXMuc3RhdHVzTGluZSA9IHN0YXR1c0xpbmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGdldFN0YXR1c0xpbmUoKQotICB7Ci0gICAgaWYgKHN0YXR1c0xpbmUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL3N0YXR1c0xpbmUgPSBXb3JrYmVuY2hVdGlsaXR5LmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0KLSAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpZWRpdG9yUGFydC5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLSAgICAgICAgc3RhdHVzTGluZSA9IGNvbnRyaWJ1dG9yLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiBzdGF0dXNMaW5lOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBpZiAodGhpcy5pbnB1dCAhPSBpbnB1dCkgCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKCIiKTsKLSAgICB9Ci0gICAgCi0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICB9Ci0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIHJldmVhbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBBIGRlc2lnbiB2aWV3IHRoYXQgaGFzIGEgbWFpbiBhcmVhIGZvciBjb250cm9scywgYW5kIGEgbWVzc2FnZSBsaW5lIGF0Ci0gICAqIHRoZSBib3R0b20KLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURlc2lnblBhbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpCi0gIHsKLSAgICBHcmlkRGF0YSBnZDsKLQotICAgIC8vIENyZWF0ZSB0aGUgbWFpbiBVSSBjb250YWluZXIKLSAgICBtYWluVUlDb21wb25lbnQ9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkKLSAgICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgaWYgKHZpc2libGUgPT0gZmFsc2UgJiYgIWN1cnJlbnRNZXNzYWdlLmVxdWFscygiIikpCi0gICAgICAgIHsKLSAgICAgICAgICBzaG93TWVzc2FnZUluU3RhdHVzTGluZSh2aXNpYmxlID09IHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLQotLy8gICAgbWFpblVJQ29tcG9uZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgY29udHJvbHNDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKG1haW5VSUNvbXBvbmVudCwgU1dULk5PTkUpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBjb250cm9sc0NvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbnRyb2xzQ29udGFpbmVyLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgLy8gVE9ETzogUmVtb3ZlIGFib3ZlIGxpbmUgYW5kIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIHR3byB3aGVuIFhTREVkaXRvciB2aWV3cwotICAgIC8vIGFyZSByZXdyaXR0ZW4uICBBbHNvIHJlZmVyIGRvIHJlbGF0ZWQgVE9ETyBpbiBEVERFZGl0b3IncyBCYXNlV2luZG93LgotICAgIC8vIEZsYXRWaWV3VXRpbGl0eSBmbGF0Vmlld1V0aWxpdHkgPSBuZXcgRmxhdFZpZXdVdGlsaXR5KCk7Ci0gICAgLy8gY29udHJvbHNDb250YWluZXIgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKG1haW5VSUNvbXBvbmVudCwgbnVtQ29sdW1ucyk7Ci0KLSAgICBtYWluVUlDb21wb25lbnQuc2V0Q29udGVudChjb250cm9sc0NvbnRhaW5lcik7Ci0KLSAgICByZXR1cm4gbWFpblVJQ29tcG9uZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2Nyb2xsQ29tcG9zaXRlKCkKLSAgewotICAgIFBvaW50IHAgPSBjb250cm9sc0NvbnRhaW5lci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgIG1haW5VSUNvbXBvbmVudC5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotICAgIG1haW5VSUNvbXBvbmVudC5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLSAgICBtYWluVUlDb21wb25lbnQuc2V0TWluU2l6ZShwKTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbHNDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xzQ29udGFpbmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbXBsZXRlIHN0YXRlIG9mIHRoZSBwYWdlLgotICAgKiBJZiBmYWxzZSwgdGhlbiBjbGllbnQgaXMgbm90IGFsbG93ZWQgdG8gbW92ZSB0byBuZXh0IHBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBhZ2VDb21wbGV0ZShib29sZWFuIGNvbXBsZXRlKQotICB7Ci0gICAgcGFnZUNvbXBsZXRlPSBjb21wbGV0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBhZ2UgaXMgY29tcGxldGUgb3Igbm90LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKQotICB7Ci0gICAgcmV0dXJuIHBhZ2VDb21wbGV0ZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRNZXNzYWdlID0gIiI7Ci0gIHByb3RlY3RlZCB2b2lkIHNob3dNZXNzYWdlSW5TdGF0dXNMaW5lKGJvb2xlYW4gc2hvdykKLSAgewotICAgIGlmIChnZXRTdGF0dXNMaW5lKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAoc2hvdykgCi0gICAgewotICAgICAgZ2V0U3RhdHVzTGluZSgpLnNldEVycm9yTWVzc2FnZShjdXJyZW50TWVzc2FnZSk7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgZ2V0U3RhdHVzTGluZSgpLnNldEVycm9yTWVzc2FnZSgiIik7Ci0gICAgfQotICAgIAotICAgIAotICAgIGdldFN0YXR1c0xpbmUoKS51cGRhdGUoZmFsc2UpOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgbWVzc2FnZSBsaW5lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgY3VycmVudE1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIGlmIChnZXRTdGF0dXNMaW5lKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRTdGF0dXNMaW5lKCkuc2V0RXJyb3JNZXNzYWdlKGN1cnJlbnRNZXNzYWdlKTsKLSAgICAgIGdldFN0YXR1c0xpbmUoKS51cGRhdGUoZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDbGVhcnMgYSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXJNZXNzYWdlKCkKLSAgewotICAgIGN1cnJlbnRNZXNzYWdlID0gIiI7Ci0gICAgaWYgKGdldFN0YXR1c0xpbmUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGdldFN0YXR1c0xpbmUoKS5zZXRFcnJvck1lc3NhZ2UoY3VycmVudE1lc3NhZ2UpOwotICAgICAgZ2V0U3RhdHVzTGluZSgpLnVwZGF0ZShmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xlYXJFcnJvck1lc3NhZ2UoKQotICB7Ci0gICAgY2xlYXJNZXNzYWdlKCk7Ci0gICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRNZXNzYWdlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvdWkvQm9yZGVyUGFpbnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9Cb3JkZXJQYWludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YmRlYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9Cb3JkZXJQYWludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotCi1wdWJsaWMgY2xhc3MgQm9yZGVyUGFpbnRlciBpbXBsZW1lbnRzIFBhaW50TGlzdGVuZXIKLXsKLSAgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3I7Ci0gIHN0YXRpYyBDb2xvciBib3JkZXJDb2xvcjsKLQotICBwdWJsaWMgQm9yZGVyUGFpbnRlcigpCi0gIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICBpZiAoYm9yZGVyQ29sb3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBib3JkZXJDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMTk1LCAxOTEsIDE3OSk7ICAJCi0gICAgfQotICAgIGJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0gICAgZm9yZWdyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsJCi0gIH0KLQkKLSAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZXZlbnQud2lkZ2V0OwotICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQ29udHJvbCBjID0gY2hpbGRyZW5baV07Ci0gICAgICBpZiAoYy5pc0VuYWJsZWQoKT09ZmFsc2UpCi0gICAgICB7Ci0gICAgICAgIGlmIChjIGluc3RhbmNlb2YgVGV4dAotICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBDYW52YXMKLSAgICAgICAgICB8fCBjIGluc3RhbmNlb2YgTGlzdAotICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBDQ29tYm8pCi0gICAgICAgIHsKLSAgICAgICAgICBSZWN0YW5nbGUgYiA9IGMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgR0MgZ2MgPSBldmVudC5nYzsKLSAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0vLyAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAxKTsKLSAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yKTsKLSAgICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDIsIGIueSAtIDIsIGIud2lkdGggKyAzLCBiLmhlaWdodCArIDMpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKGMgaW5zdGFuY2VvZiBUZXh0Ci0vLyAgICAgICAgfHwgYyBpbnN0YW5jZW9mIENhbnZhcwotICAgICAgICB8fCBjIGluc3RhbmNlb2YgTGlzdAotICAgICAgICB8fCBjIGluc3RhbmNlb2YgQ0NvbWJvKQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgYiA9IGMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIEdDIGdjID0gZXZlbnQuZ2M7Ci0gICAgICAgIGdjLnNldEZvcmVncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAxKTsKLSAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDIsIGIueSAtIDIsIGIud2lkdGggKyAzLCBiLmhlaWdodCArIDMpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYyBpbnN0YW5jZW9mIFRhYmxlCi0gICAgICAgIHx8IGMgaW5zdGFuY2VvZiBUcmVlCi0gICAgICAgIHx8IGMgaW5zdGFuY2VvZiBUYWJsZVRyZWUpIHsKLSAgICAgICAgUmVjdGFuZ2xlIGIgPSBjLmdldEJvdW5kcygpOwotICAgICAgICBHQyBnYyA9IGV2ZW50LmdjOwotICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0gICAgICAgIC8vZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAyLCBiLnkgLSAyLCBiLndpZHRoICsgMywgYi5oZWlnaHQgKyAzKTsKLSAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLngtMSwgYi55LTEsIGIud2lkdGgrMiwgYi5oZWlnaHQrMik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvdWkvRmxhdFZpZXdVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL3VpL0ZsYXRWaWV3VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmI2NjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvdWkvRmxhdFZpZXdVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubWlzYy5Xb3JrYm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWkuRmxhdFBhZ2VIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWkuV2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEZsYXRWaWV3VXRpbGl0eSBpbXBsZW1lbnRzIFBhaW50TGlzdGVuZXIKLXsKLSAgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3I7Ci0gIENvbG9yIGNvbWJvQmFja2dyb3VuZENvbG9yLCBjb21ib0Rpc2FibGVkQ29sb3I7Ci0gIHN0YXRpYyBDb2xvciBib3JkZXJDb2xvcjsKLQotICAvLyBBZGRlZCBmb3IgY3JlYXRlRmxhdFBhZ2VIZWFkZXIoKQotICBwcml2YXRlIGJvb2xlYW4gaGVhZGluZ1Zpc2libGU9dHJ1ZTsKLSAgcHJpdmF0ZSBJbWFnZSBoZWFkaW5nSW1hZ2UgPSBudWxsOwotICBwcml2YXRlIENvbXBvc2l0ZSBoZWFkZXJDb250cm9sID0gbnVsbDsKLSAgcHJpdmF0ZSBpbnQgVElUTEVfVk1BUkdJTiA9IDU7Ci0gIHByaXZhdGUgRmxhdFBhZ2VIZWFkZXIgZmxhdFBhZ2VIZWFkZXIgPSBudWxsOwotCi0gIHByaXZhdGUgS2V5Ym9hcmRIYW5kbGVyIGtleWJvYXJkSGFuZGxlcjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIX1NDUk9MTF9JTkNSRU1FTlQgPSA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWX1NDUk9MTF9JTkNSRU1FTlQgPSA2NDsKLSAgCi0gIC8vIHRoaXMgZGVmYXVsdHMgdG8gdGhlIGZsYXQgc3R5bGUsIGJ1dCB1c2VycyBjYW4gY2hhbmdlIGl0IGlmIHRoZXkgd2lzaAotICBwcml2YXRlIGludCBmbGF0U3R5bGUgPSBTV1QuRkxBVDsKLSAgcHJpdmF0ZSBpbnQgYm9yZGVyID0gMDsKLQotICBwdWJsaWMgRmxhdFZpZXdVdGlsaXR5KCkKLSAgeyAKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICBpZiAoYm9yZGVyQ29sb3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBib3JkZXJDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMTk1LCAxOTEsIDE3OSk7ICAJCi0gICAgfQotICAgIGJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0gICAgZm9yZWdyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLSAgICBjb21ib0JhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0gICAgY29tYm9EaXNhYmxlZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpOwotICAgIGtleWJvYXJkSGFuZGxlciA9IG5ldyBLZXlib2FyZEhhbmRsZXIoKTsKLSAgfQotICAKLSAgcHVibGljIEZsYXRWaWV3VXRpbGl0eShib29sZWFuIGlzRmxhdCkKLSAgewotICAgIHRoaXMoKTsKLSAgICAKLSAgICBzZXRGbGF0KGlzRmxhdCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEZsYXQoYm9vbGVhbiBmbGF0KQotICB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgaWYgKGZsYXQpCi0gICAgewotICAgICAgZmxhdFN0eWxlID0gU1dULkZMQVQ7Ci0gICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotICAgICAgZm9yZWdyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmxhdFN0eWxlID0gMDsKLSAgICAgIGJvcmRlciA9IFNXVC5CT1JERVI7Ci0gICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCk7Ci0gICAgICBmb3JlZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb2xvcihDb250cm9sIGMpCi0gIHsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIGMuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpCi0gIHsKLSAgICBDb250cm9sIGMgPSAoQ29udHJvbCkgZXZlbnQud2lkZ2V0OwotICAgIGlmIChjLmlzRW5hYmxlZCgpPT1mYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoYyBpbnN0YW5jZW9mIFRleHQKLS8vICAgICAgfHwgYyBpbnN0YW5jZW9mIENhbnZhcwotICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBMaXN0Ci0gICAgICAgICAgfHwgYyBpbnN0YW5jZW9mIENDb21ibykKLSAgICAgIHsKLSAgICAgICAgUmVjdGFuZ2xlIGIgPSBjLmdldFBhcmVudCgpLmdldEJvdW5kcygpOwotICAgICAgICBHQyBnYyA9IGV2ZW50LmdjOwotICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0vLyAgICAgIGdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMSwgYi55IC0gMSwgYi53aWR0aCArIDEsIGIuaGVpZ2h0ICsgMSk7Ci0gICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IpOwotLy8gICAgICAgIGdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMiwgYi55IC0gMiwgYi53aWR0aCArIDMsIGIuaGVpZ2h0ICsgMyk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgCi0KLSAgICAvLyBEZWZlY3QgMjUyODkxIDogdGhpcyBjYXVzZXMgc29tZSBtYWpvciBwcm9ibGVtcyBvbiBMaW51eCBHVEsKLSAgICAvLyBUaGlzIGxvb2tzIHJhdGhlciBkb2RneSBpbiBhbnkgY2FzZSBzaW5jZSBhbiBjeWNsaWMgcGFpbnRpbmcgYmVoYXZpb3VyCi0gICAgLy8gaXMgbGlrZWx5IG9jY3VyaW5nIGhlcmUKLSAgICAvL2lmIChjLmdldFBhcmVudCgpICE9IG51bGwpCi0gICAgLy97Ci0gICAgLy8gIGMuZ2V0UGFyZW50KCkucmVkcmF3KCk7Ci0gICAgLy99Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBGb250IGZvbnQ7Ci0KLSAgcHVibGljIHN0YXRpYyBGb250IGdldEZvbnQoKQotICB7Ci0gICAgaWYgKGZvbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb250ID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJtcyBzYW5zIHNlcmlmIiwgOCwgU1dULk5PUk1BTCk7Ci0gICAgfQotICAgIHJldHVybiBmb250OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbnQoRm9udCBuZXdGb250KQotICB7Ci0gICAgZm9udCA9IG5ld0ZvbnQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKQotICB7Ci0gICAgLy8gZGVwcmVjYXRlZC4gIFJlbW92ZSBsYXRlcgotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVTaW1wbGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBzdHlsZSB8IGZsYXRTdHlsZSk7Ci0gICAgY29tcG9zaXRlLnNldEZvbnQoZ2V0Rm9udCgpKTsKLSAgICBzZXRDb2xvcihjb21wb3NpdGUpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FIHwgZmxhdFN0eWxlKTsKLSAgICBjb21wb3NpdGUuc2V0Rm9udChnZXRGb250KCkpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgc2V0Q29sb3IoY29tcG9zaXRlKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotICAgIH0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIGJvb2xlYW4gaG9yaXpvbnRhbEZpbGwpCi0gIHsKLSAgICBpZiAoIWhvcml6b250YWxGaWxsKQotICAgIHsKLSAgICAgIGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIG51bUNvbHVtbnMpOwotICAgIH0KLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUgfCBmbGF0U3R5bGUpOwotICAgIGNvbXBvc2l0ZS5zZXRGb250KGdldEZvbnQoKSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHNldENvbG9yKGNvbXBvc2l0ZSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuYWRkUGFpbnRMaXN0ZW5lcihuZXcgQm9yZGVyUGFpbnRlcigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zLCBib29sZWFuIGhvcml6b250YWxGaWxsLCBib29sZWFuIHZlcnRpY2FsRmlsbCkKLSAgewotICAgIGlmICghaG9yaXpvbnRhbEZpbGwgJiYgIXZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBjcmVhdGVDb21wb3NpdGUocGFyZW50LCBudW1Db2x1bW5zKTsKLSAgICB9Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FIHwgZmxhdFN0eWxlKTsKLSAgICBjb21wb3NpdGUuc2V0Rm9udChnZXRGb250KCkpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHNldENvbG9yKGNvbXBvc2l0ZSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuYWRkUGFpbnRMaXN0ZW5lcihuZXcgQm9yZGVyUGFpbnRlcigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHB1YmxpYyBTYXNoRm9ybSBjcmVhdGVTYXNoRm9ybShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0gIHsKLSAgICBTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIHN0eWxlIHwgZmxhdFN0eWxlKTsKLSAgICBzZXRDb2xvcihzYXNoRm9ybSk7Ci0gICAgcmV0dXJuIHNhc2hGb3JtOwotICB9Ci0KLSAgcHVibGljIFBhZ2VCb29rIGNyZWF0ZVBhZ2VCb29rKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkKLSAgewotICAgIFBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgc3R5bGUgfCBmbGF0U3R5bGUpOwotICAgIHNldENvbG9yKHBhZ2VCb29rKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIHBhZ2VCb29rLmFkZFBhaW50TGlzdGVuZXIobmV3IEJvcmRlclBhaW50ZXIoKSk7Ci0gICAgfQotICAgIHJldHVybiBwYWdlQm9vazsKLSAgfQotCi0gIHB1YmxpYyBXb3JrYm9vayBjcmVhdGVXb3JrYm9vayhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0gIHsKLSAgICBXb3JrYm9vayB3b3JrYm9vayA9IG5ldyBXb3JrYm9vayhwYXJlbnQsIHN0eWxlIHwgZmxhdFN0eWxlKTsKLSAgICBUYWJGb2xkZXIgdGFiRm9sZGVyID0gd29ya2Jvb2suZ2V0VGFiRm9sZGVyKCk7Ci0gICAgdGFiRm9sZGVyLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLS8vIFRPRE8gMy4wOiBQb3J0Ci0vLyAgICBQYWdlQm9vayBwYWdlQm9vayA9IHdvcmtib29rLmdldFBhZ2VCb29rKCk7Ci0vLyAgICBzZXRDb2xvcihwYWdlQm9vayk7Ci0vLyAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotLy8gICAgewotLy8gICAgICBwYWdlQm9vay5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotLy8gICAgfQotICAgIHJldHVybiB3b3JrYm9vazsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBjcmVhdGVIZWFkaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIENvbG9yIGJnKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUhlYWRpbmdMYWJlbChwYXJlbnQsIHRleHQsIGJnLCBTV1QuTk9ORSk7Ci0gIH0KLSAgcHVibGljIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgQ29sb3IgYmcsIGludCBzdHlsZSkgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgc3R5bGUpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgc2V0Q29sb3IobGFiZWwpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotICAgIH0KLSAgICBsYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5CQU5ORVJfRk9OVCkpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBjcmVhdGVIb3Jpem9udGFsRmlsbGVyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQgfCBmbGF0U3R5bGUpOwotICAgIHNldENvbG9yKGxhYmVsKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgbGFiZWxzLgotICAgKi8KLSAgcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIHRleHQpCi0gIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlIHwgZmxhdFN0eWxlKTsKLSAgICBzZXRDb2xvcihsYWJlbCk7Ci0gICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KQotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCB8IGZsYXRTdHlsZSk7Ci0gICAgc2V0Q29sb3IobGFiZWwpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGFsaWdubWVudCkKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQgfCBmbGF0U3R5bGUpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgc2V0Q29sb3IobGFiZWwpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgYnV0dG9ucy4KLSAgICovCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIIHwgZmxhdFN0eWxlKTsKLSAgICBidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0gICAgc2V0Q29sb3IoYnV0dG9uKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBidXR0b24uYWRkS2V5TGlzdGVuZXIoa2V5Ym9hcmRIYW5kbGVyKTsKLQotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICBwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBmbGF0U3R5bGUpOwotICAgIHNldENvbG9yKHRhYmxlKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIHRhYmxlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSByYWRpbyBidXR0b24KLSAgICovCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8gfCBmbGF0U3R5bGUpOwotICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRDb2xvcihidXR0b24pOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGJ1dHRvbi5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBjaGVjayBib3gKLSAgICovCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0sgfCBmbGF0U3R5bGUpOwotICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRDb2xvcihidXR0b24pOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICBwdWJsaWMgQ29tYm8gY3JlYXRlQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHJldHVybiBjcmVhdGVDb21ib0JveChwYXJlbnQsIHRydWUpOwotICB9Ci0KLSAgcHVibGljIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gaXNSZWFkT25seSkKLSAgewotICAgIGludCBzdHlsZSA9IGlzUmVhZE9ubHkgPT0gdHJ1ZSA/IFNXVC5SRUFEX09OTFkgOiBTV1QuRFJPUF9ET1dOOwotCi0gICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgc2V0Q29sb3IoY29tYm8pOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gY29tYm87Ci0gIH0KLQotICBwdWJsaWMgQ0NvbWJvIGNyZWF0ZUNDb21ib0JveChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNDb21ib0JveChwYXJlbnQsIHRydWUpOwotICB9Ci0KLSAgcHVibGljIENDb21ibyBjcmVhdGVDQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgaW50IHN0eWxlID0gaXNSZWFkT25seSA9PSB0cnVlID8gU1dULlJFQURfT05MWSA6IFNXVC5EUk9QX0RPV047Ci0KLSAgICBDQ29tYm8gY29tYm8gPSBuZXcgQ0NvbWJvKHBhcmVudCwgc3R5bGUgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIC8vIHNldENvbG9yKGNvbWJvKTsKLSAgICAvLyBBbHdheXMgdXNlIExpc3QgQmFja2dyb3VuZAotICAgIGNvbWJvLnNldEJhY2tncm91bmQoY29tYm9CYWNrZ3JvdW5kQ29sb3IpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgY29tYm8uYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8qICAgCi0gICAgICAgLy8gRGVmZWN0IDI1Mjg5MSA6IEknbSBub3Qgc3VyZSBpZiB0aGlzIGNvZGUgd2lsbCBhbHNvIGNhdXNlIHByb2JsZW1zIG9uIExpbnV4IEdUSwotICAgICAgIC8vIEJ1dCBzaW5jZSBpdHMgcG90ZW50aWFsbHkgY3ljbGljIC4uLiBJJ20gY29tbWVudGluZyBpdCBvdXQgZm9yIG5vdwotICAgICAgIGNvbWJvLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKQotICAgICAgIHsKLSAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkKLSAgICAgICB7Ci0gICAgICAgQ29udHJvbCBjID0gKENvbnRyb2wpIGV2ZW50LndpZGdldDsKLSAgICAgICBpZiAoYy5pc0VuYWJsZWQoKT09dHJ1ZSkKLSAgICAgICB7Ci0gICAgICAgYy5zZXRCYWNrZ3JvdW5kKGNvbWJvQmFja2dyb3VuZENvbG9yKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICBjLnNldEJhY2tncm91bmQoY29tYm9EaXNhYmxlZENvbG9yKTsgCi0gICAgICAgfQotICAgICAgIGZpbmFsIENvbnRyb2wgY29uID0gYzsKLSAgICAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICB7Ci0gICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICB7Ci0gICAgICAgaWYgKGNvbiAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICBpZiAoIWNvbi5pc0Rpc3Bvc2VkKCkpICAvLyBpdCBnZXRzIGRpc3Bvc2VkCi0gICAgICAgewotICAgICAgIGNvbi5yZWRyYXcoKTsKLSAgICAgICB9Ci0gICAgICAgfQotICAgICAgIH0KLSAgICAgICB9OwotICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgICAgICB9Ci0gICAgICAgfSk7Ki8KLSAgICB9Ci0gICAgcmV0dXJuIGNvbWJvOwotICB9Ci0KLSAgcHVibGljIExpc3QgY3JlYXRlTGlzdEJveChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgsIGJvb2xlYW4gaXNNdWx0aVNlbGVjdCkKLSAgewotICAgIGludCBzdHlsZSA9IGlzTXVsdGlTZWxlY3QgPyBTV1QuTVVMVEkgOiBTV1QuU0lOR0xFOwotICAgIExpc3QgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgc3R5bGUgIHwgZmxhdFN0eWxlIHwgYm9yZGVyKTsKLSAgICBzZXRDb2xvcihsaXN0KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgbGlzdC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGNyZWF0ZUxpc3RCb3goQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoLCBib29sZWFuIGlzTXVsdGlTZWxlY3QsIGJvb2xlYW4gdmVydGljYWxGaWxsKQotICB7Ci0gICAgaW50IHN0eWxlID0gaXNNdWx0aVNlbGVjdCA/IFNXVC5NVUxUSSA6IFNXVC5TSU5HTEU7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBzdHlsZSAgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKGxpc3QpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHZlcnRpY2FsRmlsbDsKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIGxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIGxpc3QuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBjcmVhdGVMaXN0Qm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgc3R5bGUgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKGxpc3QpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgbGlzdC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgZmxhdFN0eWxlIHwgYm9yZGVyKTsKLSAgICBzZXRDb2xvcih0ZXh0KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIHRleHQuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgdGV4dC5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOwotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgc2V0Q29sb3IodGV4dCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIHRleHQuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgdGV4dC5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOwotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IHN0eWxlKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBzdHlsZSB8IFNXVC5TSU5HTEUgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKHRleHQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLSAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICB0ZXh0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIDxjb2RlPmNyZWF0ZVdyYXBwZWRNdWx0aVRleHRGaWVsZDwvY29kZT4gY3JlYXRlcyBhIHdyYXBwZWQgbXVsdGl0ZXh0IGZpZWxkCi0gICAqCi0gICAqIEBwYXJhbSBwYXJlbnQgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSB3aWR0aCBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSBudW1MaW5lcyBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHJlcHJlc2VudGluZyBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBoZWlnaHQKLSAgICogQHBhcmFtIHZlcnRpY2FsRmlsbCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0gICAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiB2YWx1ZQotICAgKi8KLSAgcHVibGljIFRleHQgY3JlYXRlV3JhcHBlZE11bHRpVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IG51bUxpbmVzLCBib29sZWFuIHZlcnRpY2FsRmlsbCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKHRleHQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgaWYgKHZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIH0KLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIEZvbnREYXRhW10gZm9udERhdGEgPSBnZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLSAgICAvLyBoYWNrIGZvciBub3cgd2hlcmUgb24gV2luZG93cywgb25seSAxIGZvbnRkYXRhIGV4aXN0cwotICAgIGRhdGEuaGVpZ2h0SGludCA9IG51bUxpbmVzICogZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCk7Ci0gICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgdGV4dC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gdGV4dDsKLSAgfQotCi0gIHB1YmxpYyBUZXh0IGNyZWF0ZU11bHRpVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8ICBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKHRleHQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgaWYgKHZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIH0KLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIGRhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLSAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICB0ZXh0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIFRleHQgY3JlYXRlTXVsdGlUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8ICBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKHRleHQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgaWYgKHZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIH0KLSAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICB0ZXh0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zLCBTdHJpbmcgdGV4dCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5TSEFET1dfRVRDSEVEX0lOICB8IGZsYXRTdHlsZSk7Ci0gICAgZ3JvdXAuc2V0VGV4dCh0ZXh0KTsKLSAgICBzZXRDb2xvcihncm91cCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGlmICh2ZXJ0aWNhbEZpbGwpCi0gICAgewotICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB9Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBncm91cC5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotICAgIH0KLSAgICByZXR1cm4gZ3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIFN0cmluZyB0ZXh0LCBib29sZWFuIHZlcnRpY2FsRmlsbCwgaW50IGFsaWdubWVudCkKLSAgewotICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19FVENIRURfSU4gfCBmbGF0U3R5bGUpOwotICAgIGdyb3VwLnNldFRleHQodGV4dCk7Ci0gICAgc2V0Q29sb3IoZ3JvdXApOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gYWxpZ25tZW50OwotICAgIGlmICh2ZXJ0aWNhbEZpbGwpCi0gICAgewotICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB9Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBncm91cC5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotICAgIH0KLSAgICByZXR1cm4gZ3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgTGFiZWwgY3JlYXRlVmVydGljYWxGaWxsZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZlcnRpY2FsU3BhbikKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQgfCBmbGF0U3R5bGUpOwotICAgIGxhYmVsLnNldEZvbnQoZ2V0Rm9udCgpKTsKLSAgICBzZXRDb2xvcihsYWJlbCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxTcGFuID0gdmVydGljYWxTcGFuOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotICAvLwotICAvLyBGbGF0UGFnZUhlYWRlcgotICAvLwotCi0gIC8vIFRoaXMgd2lsbCB1c2UgdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBpbWFnZS4KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVGbGF0UGFnZUhlYWRlcgotICAoQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgIFN0cmluZyB0aXRsZSkKLSAgewotICAgIEltYWdlIGJnSW1hZ2UgPSBjcmVhdGVEZWZhdWx0SW1hZ2UoKTsKLSAgICByZXR1cm4gY3JlYXRlRmxhdFBhZ2VIZWFkZXIocGFyZW50LGJnSW1hZ2UsdGl0bGUpOwotICB9Ci0KLSAgLy8gUHJvdmlkZSB5b3VyIG93biBiYWNrZ3JvdW5kIGltYWdlLgotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUZsYXRQYWdlSGVhZGVyCi0gIChDb21wb3NpdGUgcGFyZW50LAotICAgICAgSW1hZ2UgYmdJbWFnZSwKLSAgICAgIFN0cmluZyB0aXRsZSkKLSAgewotICAgIEZsYXRQYWdlSGVhZGVyIGhlYWRlciA9IG5ldyBGbGF0UGFnZUhlYWRlcihwYXJlbnQsU1dULk5PTkUpOwotICAgIGhlYWRlci5zZXRMYXlvdXQobmV3IFBhZ2VMYXlvdXQoKSk7Ci0gICAgaGVhZGVyLnNldEJhY2tncm91bmRJbWFnZShiZ0ltYWdlKTsKLSAgICBoZWFkZXIuc2V0VGV4dCh0aXRsZSk7Ci0gICAgV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IFdpZGdldEZhY3RvcnkoKTsKLSAgICBDb21wb3NpdGUgZm9ybVBhcmVudCA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGhlYWRlcik7Ci0gICAgLy9Db21wb3NpdGUgZm9ybVBhcmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShoZWFkZXIsMSk7Ci0gICAgY3JlYXRlUGFnZUNvbnRlbnQoZm9ybVBhcmVudCk7Ci0gICAgaGVhZGVyQ29udHJvbCA9IGhlYWRlcjsgLy8gdGhpcyBpcyB1c2VkIGluIGdldFRpdGxlSGVpZ2h0KCkKLSAgICByZXR1cm4gZm9ybVBhcmVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZUZsYXRQYWdlSGVhZGVyVGl0bGUoU3RyaW5nIHRpdGxlKQotICB7Ci0gICAgKChGbGF0UGFnZUhlYWRlciloZWFkZXJDb250cm9sKS5zZXRUZXh0KHRpdGxlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVQYWdlQ29udGVudChDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dChsYXlvdXQpOwotICAgIHBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgfQotCi0gIGNsYXNzIFBhZ2VMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgCi0gIHsKLSAgICBwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgCi0gICAgewotICAgICAgaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUICYmIGhIaW50ICE9IFNXVC5ERUZBVUxUKQotICAgICAgICByZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0gICAgICBpbnQgeCA9IDA7Ci0gICAgICBDb250cm9sIGNsaWVudCA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpWzBdOwotICAgICAgUG9pbnQgY3NpemUgPSBjbGllbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKLSAgICAgIGlmIChoZWFkaW5nVmlzaWJsZSkgY3NpemUueSArPSBnZXRUaXRsZUhlaWdodCgpOwotICAgICAgCi0gICAgICByZXR1cm4gY3NpemU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIAotICAgIHsKLSAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLSAgICAgIENvbnRyb2wgY2xpZW50ID0gY29tcG9zaXRlLmdldENoaWxkcmVuKClbMF07Ci0gICAgICBpbnQgdGhlaWdodCA9IGhlYWRpbmdWaXNpYmxlID8gZ2V0VGl0bGVIZWlnaHQoKSA6IDA7Ci0gICAgICBjbGllbnQuc2V0Qm91bmRzKGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55ICsgdGhlaWdodCwgY2xpZW50QXJlYS53aWR0aCwgY2xpZW50QXJlYS5oZWlnaHQgLSB0aGVpZ2h0KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGludCBnZXRUaXRsZUhlaWdodCgpIAotICB7Ci0gICAgaW50IGltYWdlSGVpZ2h0ID0gMDsKLSAgICAvLyBOb3RlIC0gRmluZCBvdXQgd2h5IGhlYWRpbmdJbWFnZSBpcyBhbHdheXMgbnVsbC4KLSAgICBpZiAoaGVhZGluZ0ltYWdlICE9IG51bGwgJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpID09IGZhbHNlKSAKLSAgICAgIGltYWdlSGVpZ2h0ID0gaGVhZGluZ0ltYWdlLmdldEJvdW5kcygpLmhlaWdodDsKLQotICAgIEdDIGdjID0gbmV3IEdDKGhlYWRlckNvbnRyb2wpOwotICAgIGdjLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpKTsKLSAgICBGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0gICAgaW50IGZvbnRIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsKLSAgICBnYy5kaXNwb3NlKCk7Ci0KLSAgICBpbnQgaGVpZ2h0ID0gZm9udEhlaWdodCArIFRJVExFX1ZNQVJHSU4gKyBUSVRMRV9WTUFSR0lOOwotICAgIHJldHVybiBNYXRoLm1heChoZWlnaHQsaW1hZ2VIZWlnaHQpOwotICB9Ci0KLQotICBwcml2YXRlIEltYWdlIGNyZWF0ZURlZmF1bHRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlCi0gICAgKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsCi0gICAgICAgICJpY29ucy9wYWdlX2Jhbm5lci5naWYiKS5jcmVhdGVJbWFnZSgpOwotICB9Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBiYWNrZ3JvdW5kQ29sb3IuCi0gICAqIEByZXR1cm4gQ29sb3IKLSAgICovCi0gIHB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kQ29sb3IoKQotICB7Ci0gICAgcmV0dXJuIGJhY2tncm91bmRDb2xvcjsKLSAgfQotICAKLSAgcHVibGljIGNsYXNzIEtleWJvYXJkSGFuZGxlciBleHRlbmRzIEtleUFkYXB0ZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLSAgICB7Ci0gICAgICBXaWRnZXQgdyA9IGUud2lkZ2V0OwotICAgICAgaWYgKHcgaW5zdGFuY2VvZiBDb250cm9sKQotICAgICAgewotICAgICAgICBwcm9jZXNzS2V5KGUua2V5Q29kZSwgKENvbnRyb2wpIHcpOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzY3JvbGxWZXJ0aWNhbChTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgYm9vbGVhbiB1cCkKLSAgICB7Ci0gICAgICBzY3JvbGwoc2NvbXAsIDAsIHVwID8gLVZfU0NST0xMX0lOQ1JFTUVOVCA6IFZfU0NST0xMX0lOQ1JFTUVOVCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNjcm9sbEhvcml6b250YWwoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAsIGJvb2xlYW4gbGVmdCkKLSAgICB7Ci0gICAgICBzY3JvbGwoc2NvbXAsIGxlZnQgPyAtSF9TQ1JPTExfSU5DUkVNRU5UIDogSF9TQ1JPTExfSU5DUkVNRU5ULCAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2Nyb2xsUGFnZShTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgYm9vbGVhbiB1cCkKLSAgICB7Ci0gICAgICBQb2ludCBvcmlnaW4gPSBzY29tcC5nZXRPcmlnaW4oKTsKLSAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2NvbXAuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgaW50IGluY3JlbWVudCA9IHVwID8gLWNsaWVudEFyZWEuaGVpZ2h0IDogY2xpZW50QXJlYS5oZWlnaHQ7Ci0gICAgICBzY3JvbGwoc2NvbXAsIDAsIGluY3JlbWVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNjcm9sbChTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgaW50IHhvZmZzZXQsIGludCB5b2Zmc2V0KQotICAgIHsKLSAgICAgIFBvaW50IG9yaWdpbiA9IHNjb21wLmdldE9yaWdpbigpOwotICAgICAgUG9pbnQgY29udGVudFNpemUgPSBzY29tcC5nZXRDb250ZW50KCkuZ2V0U2l6ZSgpOwotICAgICAgaW50IHhvcmlnaW4gPSBvcmlnaW4ueCArIHhvZmZzZXQ7Ci0gICAgICBpbnQgeW9yaWdpbiA9IG9yaWdpbi55ICsgeW9mZnNldDsKLSAgICAgIHhvcmlnaW4gPSBNYXRoLm1heCh4b3JpZ2luLCAwKTsKLSAgICAgIHhvcmlnaW4gPSBNYXRoLm1pbih4b3JpZ2luLCBjb250ZW50U2l6ZS54IC0gMSk7Ci0gICAgICB5b3JpZ2luID0gTWF0aC5tYXgoeW9yaWdpbiwgMCk7Ci0gICAgICB5b3JpZ2luID0gTWF0aC5taW4oeW9yaWdpbiwgY29udGVudFNpemUueSAtIDEpOwotICAgICAgc2NvbXAuc2V0T3JpZ2luKHhvcmlnaW4sIHlvcmlnaW4pOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU2Nyb2xsZWRDb21wb3NpdGUgZ2V0U2Nyb2xsZWRDb21wb3NpdGUoQ29udHJvbCBjKQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBwYXJlbnQgPSBjLmdldFBhcmVudCgpOwotICAgICAgCi0gICAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoU2Nyb2xsZWRDb21wb3NpdGUpIHBhcmVudDsKLSAgICAgICAgfQotICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0tleShpbnQga2V5Q29kZSwgQ29udHJvbCBjKQotICAgIHsKLSAgICAgIFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wID0gZ2V0U2Nyb2xsZWRDb21wb3NpdGUoYyk7Ci0gICAgICBpZiAoc2NvbXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChrZXlDb2RlKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgU1dULkFSUk9XX0RPV04gOgotICAgICAgICAgIHNjcm9sbFZlcnRpY2FsKHNjb21wLCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1dULkFSUk9XX1VQIDoKLSAgICAgICAgICBzY3JvbGxWZXJ0aWNhbChzY29tcCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1dULkFSUk9XX0xFRlQgOgotICAgICAgICAgIHNjcm9sbEhvcml6b250YWwoc2NvbXAsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNXVC5BUlJPV19SSUdIVCA6Ci0gICAgICAgICAgc2Nyb2xsSG9yaXpvbnRhbChzY29tcCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNXVC5QQUdFX1VQIDoKLSAgICAgICAgICBzY3JvbGxQYWdlKHNjb21wLCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTV1QuUEFHRV9ET1dOIDoKLSAgICAgICAgICBzY3JvbGxQYWdlKHNjb21wLCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmQzZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC51aS5CYXNlRGVzaWduV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwudWkuQm9yZGVyUGFpbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLnVpLkZsYXRWaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVZpZXdlciBleHRlbmRzIEJhc2VEZXNpZ25XaW5kb3cgaW1wbGVtZW50cyBMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLS8vICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OyAKLQotICAvLyBmb3IgdXNlIGluIHN1YmNsYXNzZXMKLSAgcHJvdGVjdGVkIEZsYXRWaWV3VXRpbGl0eSBmbGF0Vmlld1V0aWxpdHkgPSBuZXcgRmxhdFZpZXdVdGlsaXR5KHRydWUpOwotCi0gIHB1YmxpYyBCYXNlVmlld2VyKElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lKQotICB7Ci0gICAgc3VwZXIoc3RhdHVzTGluZSk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIC8vIGdldHMgY2FsbGVkIG9ubHkgaWYgd2UgY3VycmVudGx5IGFyZSBub3QgaGFuZGxpbmcgYW4gZXZlbnQKLSAgYWJzdHJhY3QgcHVibGljIHZvaWQgZG9TZXRJbnB1dChPYmplY3QgaW5wdXQpOwotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIjc2V0SW5wdXQoT2JqZWN0KQotICAgKi8KLSAgc3RhdGljIE9iamVjdCBvbGRJbnB1dCA9IG51bGw7Ci0gIE1vZGVsQWRhcHRlckxpc3RlbmVyIG9sZE1vZGVsQWRhcHRlckxpc3RlbmVyID0gbnVsbDsKLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0KLSAgICBkb1NldElucHV0KGlucHV0KTsKLS8qCi0gICAgaWYgKCFpc0luRG9IYW5kbGUoKSAmJiAhZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBmaW5hbCBPYmplY3Qgb2JqID0gaW5wdXQ7Ci0gICAgICBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgZG9TZXRJbnB1dChvYmopOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0qLwotICB9Ci0KLQotICBib29sZWFuIGxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLSAgICogQHJldHVybiB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyRW5hYmxlZCgpIAotICB7Ci0gICAgcmV0dXJuIGxpc3RlbmVyRW5hYmxlZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIGxpc3RlbmVyRW5hYmxlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyRW5hYmxlZChib29sZWFuICB2KSAKLSAgewotICAgIHRoaXMubGlzdGVuZXJFbmFibGVkID0gdjsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJgotICAgICAgICBnZXRJbnB1dCgpICE9IG51bGwgJiYKLSAgICAgICAgIWlzSW5Eb0hhbmRsZSkgCi0gICAgewotICAgICAgaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLSAgICAgIHN0YXJ0RGVsYXllZEV2ZW50KGV2ZW50KTsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgIH0gLy8gZW5kIG9mIGlmICgpCi0gIH0KLQotICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KTsKLSAgYWJzdHJhY3QgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQotICBwcm90ZWN0ZWQgRGVsYXllZEV2ZW50IGRlbGF5ZWRUYXNrOwotICAKLSAgcHJvdGVjdGVkIHZvaWQgc3RhcnREZWxheWVkRXZlbnQoRXZlbnQgZSkKLSAgewotICAgIGlmIChkZWxheWVkVGFzayA9PSBudWxsIHx8Ci0gICAgICBkZWxheWVkVGFzay5nZXRFdmVudCgpID09IG51bGwpCi0gICAgewotICAgICAgZGVsYXllZFRhc2sgPSBuZXcgRGVsYXllZEV2ZW50KCk7Ci0gICAgICBkZWxheWVkVGFzay5zZXRFdmVudChlKTsKLSAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnRpbWVyRXhlYyg1MDAsZGVsYXllZFRhc2spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRXZlbnQgZGVsYXllZEV2ZW50ID0gZGVsYXllZFRhc2suZ2V0RXZlbnQoKTsKLSAgICAgIAotICAgICAgaWYgKGUud2lkZ2V0ID09IGRlbGF5ZWRFdmVudC53aWRnZXQgJiYKLSAgICAgICAgZS50eXBlID09IGRlbGF5ZWRFdmVudC50eXBlKQotICAgICAgewotICAgICAgICAvLyBzYW1lIGV2ZW50LCBqdXN0IGRpZmZlcmVudCBkYXRhLCBkZWxheSBuZXcgZXZlbnQKLSAgICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQobnVsbCk7Ci0gICAgICB9Ci0gICAgICBkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLSAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCxkZWxheWVkVGFzayk7Ci0gICAgfQotICB9Ci0gIAotICBjbGFzcyBEZWxheWVkRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZQotICB7Ci0gICAgcHJvdGVjdGVkIEV2ZW50IGV2ZW50OwotICAgIAotICAgIC8qCi0gICAgICogQHNlZSBSdW5uYWJsZSNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgaWYgKGV2ZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICAgIGRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgICAgICBpc0luRG9IYW5kbGUgPSBmYWxzZTsKLSAgICAgICAgZXZlbnQgPSBudWxsOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBldmVudC4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBFdmVudAotICAgICAqLwotICAgIHB1YmxpYyBFdmVudCBnZXRFdmVudCgpCi0gICAgewotICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV2ZW50LgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbnQoRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OwotICAgIH0KLQotICB9Ci0KLQotICBib29sZWFuIGlzSW5Eb0hhbmRsZTsKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotICAgKiBAcmV0dXJuIHZhbHVlIG9mIGlzSW5Eb0hhbmRsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSW5Eb0hhbmRsZSgpIAotICB7Ci0gICAgcmV0dXJuIGlzSW5Eb0hhbmRsZTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgVmlld2VyI2dldENvbnRyb2woKQotICAgKi8KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gbWFpblVJQ29tcG9uZW50OwotICB9Ci0KLQotICAvKgotICAgKiBAc2VlIEJhc2VEZXNpZ25XaW5kb3cjY3JlYXRlRGVzaWduUGFuZShDb21wb3NpdGUsIGludCkKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURlc2lnblBhbmUoQ29tcG9zaXRlIGFyZzAsIGludCBhcmcxKQotICB7Ci0gICAgQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlRGVzaWduUGFuZShhcmcwLCBhcmcxKTsKLSAgICAKLSAgICBDb21wb3NpdGUgY2xpZW50ID0gc3VwZXIuZ2V0Q29udHJvbHNDb250YWluZXIoKTsKLSAgICAKLSAgICBjbGllbnQuYWRkUGFpbnRMaXN0ZW5lcihuZXcgQm9yZGVyUGFpbnRlcigpKTsKLSAgICAKLSAgICBjbGllbnQuc2V0QmFja2dyb3VuZChuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksMjU1LDI1NSwyNTUpKTsKLQotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0KLQotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gcmV2ZWFsKSAKLSAgewotICB9Ci0gICAKLSAgCi0vLyAgcHVibGljIGFic3RyYWN0IENvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0gIHsKLSAgICByZXR1cm4gKE5vZGUpIGdldElucHV0KCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0gIAotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYKLSAgICAgICAgZ2V0SW5wdXQoKSAhPSBudWxsICYmCi0gICAgICAgICFpc0luRG9IYW5kbGUpIAotICAgIHsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChlKTsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYKLSAgICAgICAgZ2V0SW5wdXQoKSAhPSBudWxsICYmCi0gICAgICAgICFpc0luRG9IYW5kbGUpIAotICAgIHsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICBkb1dpZGdldFNlbGVjdGVkKGUpOwotICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Q2hpbGROb2RlKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgY2hpbGROYW1lKQotICB7Ci0gICAgTm9kZUxpc3QgbGlzdCA9IG51bGw7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIH0KLSAgIAotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIFBlcmZvcm1hbmNlIGlzc3VlIHBlcmhhcHM/Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobGlzdC5pdGVtKGkpLmdldExvY2FsTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBwZXJmb3JtQWRkRWxlbWVudChOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHBhcmVudE5vZGUsIG5hbWVzcGFjZU5hbWUsIGxvY2FsTmFtZSk7Ci0gICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOyAgICAgICAKLSAgICAgIGZvcm1hdChwYXJlbnROb2RlKTsKLSAgICAgIHJldHVybiBuZXdFbGVtZW50OwotICAgIH0gIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnROb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGxvY2FsTmFtZSk7Ci0gICAgcmV0dXJuIGVsZW1lbnQ7ICAgCi0gIH0gICAKLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCwgU3RyaW5nIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCB2YWx1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXQoTm9kZSBwYXJlbnROb2RlKQotICB7Ci0gICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgCi0gICAgewotICAgICAgLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBGb3JtYXRQcm9jZXNzb3JYTUwgZm9ybWF0UHJvY2Vzc29yWE1MID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotICAgICAgZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKXBhcmVudE5vZGUpOwotICAgIH0KLSAgfQotICAKLSAgc3RhdGljIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKQotICB7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0KLSAgICByZXR1cm4gZWRpdG9yUGFydDsKLSAgfQotICAKLSAgc3RhdGljIHByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgZ2V0U3RhdHVzTGluZU1hbmFnZXIoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgeyAKLSAgICBJU3RhdHVzTGluZU1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gKEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKWVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0gICAgICByZXN1bHQgPSBjb250cmlidXRvci5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ0lucHV0T3V0cHV0RmF1bHRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ0lucHV0T3V0cHV0RmF1bHRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3ZDM5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0JpbmRpbmdJbnB1dE91dHB1dEZhdWx0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nSW5wdXRPdXRwdXRGYXVsdFZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyIAoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBCaW5kaW5nSW5wdXRPdXRwdXRGYXVsdFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgICAgCi0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsgCi0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX0lOUFVUIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX09VVFBVVCIpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX0ZBVUxUIik7Ci0gICAgfSAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0JpbmRpbmdPcGVyYXRpb25WaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ09wZXJhdGlvblZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTAzMzdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ09wZXJhdGlvblZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nT3BlcmF0aW9uVmlld2VyIGV4dGVuZHMgTmFtZWRDb21wb25lbnRWaWV3ZXIgCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb25WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0JJTkRJTkdfT1BFUkFUSU9OIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ1ZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CaW5kaW5nVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ODUxMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CaW5kaW5nVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzLkNvbXBvbmVudE5hbWVDb21ib0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuSW52b2tlRGlhbG9nQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1ZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyIAoteyAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87ICAgICAgCi0gIHByb3RlY3RlZCBDb21wb25lbnROYW1lQ29tYm9IZWxwZXIgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyOwotICBJbnZva2VEaWFsb2dCdXR0b24gYnV0dG9uOwotCi0gIHB1YmxpYyBCaW5kaW5nVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAgICAKLSAgfSAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkKLSAgewotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HIik7ICAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIucG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24ocGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAKLSAgICBMYWJlbCBwb3J0VHlwZUxhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUE9SVFRZUEUiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDQ29tYm9Cb3goY29tcG9zaXRlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIgPSBuZXcgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyKGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB1dGlsLmdldFBvcnRUeXBlTmFtZXMoKTsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEU7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGJ1dHRvbiA9IG5ldyBJbnZva2VEaWFsb2dCdXR0b24oY29tcG9zaXRlLCBnZXRJbnB1dCgpKTsKLSAgICBidXR0b24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIHN1cGVyLnVwZGF0ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLnVwZGF0ZShpbnB1dCk7Ci0gICAgYnV0dG9uLnNldElucHV0KGlucHV0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUV2ZW50SGVscGVyKEVsZW1lbnQgZWxlbWVudCwgRXZlbnQgZXZlbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzdXBlci5oYW5kbGVFdmVudEhlbHBlcihlbGVtZW50LCBldmVudCk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLmhhbmRsZUV2ZW50SGVscGVyKGVsZW1lbnQsIGV2ZW50KTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRGVmaW5pdGlvblZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9EZWZpbml0aW9uVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2VjZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9EZWZpbml0aW9uVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5FZGl0TmFtZXNwYWNlc0FjdGlvbjsKLQotcHVibGljIGNsYXNzIERlZmluaXRpb25WaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIERlZmluaXRpb25WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7IAotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9ERUZJTklUSU9OIik7IC8vJE5PTi1OTFMtMSQKLSAgfSAgCi0gICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLnBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKHBhcmVudCk7Ci0JICBMYWJlbCBsYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDAsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX05BTUVTUEFDRVMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgCUJ1dHRvbiBidXR0b24gPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlUHVzaEJ1dHRvbihjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VESVRfTkFNRVNQQUNFUyIpKTsKLQkgIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICB7Ci0gICAgCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAJeyAgICAJCQotICAgIAl9Ci0gICAgCQotICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAJewotCQkgIEVkaXROYW1lc3BhY2VzQWN0aW9uIGFjdGlvbiA9IG5ldyBFZGl0TmFtZXNwYWNlc0FjdGlvbigoRGVmaW5pdGlvbilnZXRJbnB1dCgpKTsJCQkJCQotCQkgIGFjdGlvbi5ydW4oKTsJCi0gICAgCX0JCi0gICAgfTsKLSAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAJcmV0dXJuIGNvbXBvc2l0ZTsJCi0gIH0JICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRW1wdHlWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRW1wdHlWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlMjU0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0VtcHR5Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotCi1wdWJsaWMgY2xhc3MgRW1wdHlWaWV3ZXIgZXh0ZW5kcyBCYXNlVmlld2VyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotCi0gIHB1YmxpYyBFbXB0eVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0gIHsKLSAgICBzdXBlcihnZXRTdGF0dXNMaW5lTWFuYWdlcihnZXRBY3RpdmVFZGl0b3IoKSkpOwotICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBjb250cm9sLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgCi0gIH0KLQotICAvKgotICAgKiBAc2VlIEJhc2VXaW5kb3cjZG9IYW5kbGVFdmVudChFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5KQotICAgIHsKLSAgICB9Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzYTE3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuQXR0cmlidXRlc1RhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmlsaXR5RWxlbWVudFZpZXdlciBleHRlbmRzIEJhc2VWaWV3ZXIgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgoteyAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOyAgIAotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsgICAKLSAgcHJvdGVjdGVkIEF0dHJpYnV0ZXNUYWJsZSBhdHRyaWJ1dGVzVGFibGU7Ci0gIGJvb2xlYW4gaXNGb3JUYWJiZWRQcm9wZXJ0aWVzID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKGdldFN0YXR1c0xpbmVNYW5hZ2VyKGVkaXRvclBhcnQpKTsgICAgCi0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsgICAgICAgICAgICAgICAgICAKLQotICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsgICAKLSAgfQotICAKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIGJvb2xlYW4gaXNGb3JUYWJiZWRQcm9wZXJ0aWVzKQotICB7Ci0gICAgc3VwZXIoZ2V0U3RhdHVzTGluZU1hbmFnZXIoZWRpdG9yUGFydCkpOyAgICAKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OyAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuaXNGb3JUYWJiZWRQcm9wZXJ0aWVzID0gaXNGb3JUYWJiZWRQcm9wZXJ0aWVzOwotICAgIGlmIChpc0ZvclRhYmJlZFByb3BlcnRpZXMpCi0gICAgewotICAgICAgY3JlYXRlQ29udHJvbEZvclRhYmJlZFByb3BlcnR5U2hlZXQocGFyZW50KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICB9Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsgCi0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoKFdTRExFbGVtZW50KWlucHV0KS5nZXRFbGVtZW50KCk7Ci0gICAgICByZXN1bHQgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1VOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UIik7IC8vJE5PTi1OTFMtMSQgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAKLSAgCi0gIC8vIFRPRE8uLi4gbW92ZSB0aGlzIG1ldGhvZCBkb3duIHRvIEJhc2VWaWV3ZXIhCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xGb3JUYWJiZWRQcm9wZXJ0eVNoZWV0KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgCi0gICAgYXR0cmlidXRlc1RhYmxlID0gbmV3IEF0dHJpYnV0ZXNUYWJsZShlZGl0b3JQYXJ0LCBwYXJlbnQpOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgCi0gICAgY29udHJvbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxLCB0cnVlKTsgICAKLQkgIGNvbnRyb2wuc2V0QmFja2dyb3VuZCAobmV3IENvbG9yKG51bGwsMjU1LDAsMCkpOwotCSAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotCSAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0JICBnZC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotCSAgCi0gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCljb250cm9sLmdldExheW91dCgpOwotICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVGbGF0UGFnZUhlYWRlcihjb250cm9sLCAiIik7Ci0KLSAgICBDb21wb3NpdGUgYyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoY29udHJvbCwgMSwgdHJ1ZSk7Ci0gICAgR3JpZERhdGEgY0dEPSBuZXcgR3JpZERhdGEoKTsKLSAgICBjR0QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBjR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBjR0QudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgY0dELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotICAgIAotICAgIGMuc2V0TGF5b3V0RGF0YShjR0QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGF0dHJpYnV0ZXNUYWJsZSA9IG5ldyBBdHRyaWJ1dGVzVGFibGUoZWRpdG9yUGFydCwgYyk7Ci0KLSAgICBHcmlkRGF0YSBhdHRyaWJ1dGVzVGFibGVHRD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgYXR0cmlidXRlc1RhYmxlR0QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBhdHRyaWJ1dGVzVGFibGVHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGF0dHJpYnV0ZXNUYWJsZUdELnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGF0dHJpYnV0ZXNUYWJsZUdELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotCi0gICAgYXR0cmlidXRlc1RhYmxlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGF0dHJpYnV0ZXNUYWJsZUdEKTsKLSAgfSAgCi0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfSAKLSAgIAotCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgaWYgKCFpc0ZvclRhYmJlZFByb3BlcnRpZXMpCi0gICAgewotICAgICAgZmxhdFZpZXdVdGlsaXR5LnVwZGF0ZUZsYXRQYWdlSGVhZGVyVGl0bGUoZ2V0SGVhZGluZ1RleHQoKSk7Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgIGF0dHJpYnV0ZXNUYWJsZS5zZXRJbnB1dCgoKFdTRExFbGVtZW50KWlucHV0KS5nZXRFbGVtZW50KCkpOwotIAotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQotICAgIGlmIChvbGRJbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LnJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKG9sZElucHV0LCB0aGlzKTsKLSAgICB9Ci0gICAgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkuYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoaW5wdXQsIHRoaXMpOwotCi0gICAgb2xkSW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgdXBkYXRlKCk7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgeyAKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7ICAgICAgICAgICAKLSAgICAgICAgaWYgKCFhdHRyaWJ1dGVzVGFibGUuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZXNUYWJsZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OyAgICAgICAgICAgICAgIAotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2libGVEZXRhaWxzVmlld2VyUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJsZURldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzYwNTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJsZURldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSURldGFpbHNWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZURldGFpbHNWaWV3ZXJQcm92aWRlciBpbXBsZW1lbnRzIElEZXRhaWxzVmlld2VyUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25bXSBleHRlbnNpb25zOwotICBwcm90ZWN0ZWQgSURldGFpbHNWaWV3ZXJQcm92aWRlcltdIGRldGFpbHNWaWV3ZXJQcm92aWRlcnM7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IHt9OwotCi0gIHB1YmxpYyBFeHRlbnNpYmxlRGV0YWlsc1ZpZXdlclByb3ZpZGVyKFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgeyAgCQotICAgIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsgCi0KLSAgICBleHRlbnNpb25zID0gcmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoV1NETEVkaXRvckV4dGVuc2lvbi5ERVRBSUxTX1ZJRVdFUl9QUk9WSURFUik7IAotICAgIGRldGFpbHNWaWV3ZXJQcm92aWRlcnMgPSBuZXcgSURldGFpbHNWaWV3ZXJQcm92aWRlcltleHRlbnNpb25zLmxlbmd0aF07IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBkZXRhaWxzVmlld2VyUHJvdmlkZXJzW2ldID0gKElEZXRhaWxzVmlld2VyUHJvdmlkZXIpZXh0ZW5zaW9uc1tpXS5jcmVhdGVFeHRlbnNpb25PYmplY3QoV1NETEVkaXRvckV4dGVuc2lvbi5ERVRBSUxTX1ZJRVdFUl9QUk9WSURFUiwgd3NkbEVkaXRvcik7Ci0gICAgfQotICB9ICAgICAgICAgIAotICAgICAgCi0KLSAgcHJvdGVjdGVkIElEZXRhaWxzVmlld2VyUHJvdmlkZXIgZ2V0QXBwbGljYWJsZURldGFpbHNQcm92aWRlcihPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBJRGV0YWlsc1ZpZXdlclByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0uaXNBcHBsaWNhYmxlKG9iamVjdCkpCi0gICAgICB7Ci0gICAgICAgIHByb3ZpZGVyID0gZGV0YWlsc1ZpZXdlclByb3ZpZGVyc1tpXTsKLSAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJvdmlkZXI7Ci0gIH0KLSAgIAotICAKLSAgcHVibGljIE9iamVjdCBnZXRWaWV3ZXJLZXkoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIElEZXRhaWxzVmlld2VyUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlRGV0YWlsc1Byb3ZpZGVyKG9iamVjdCk7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5nZXRWaWV3ZXJLZXkob2JqZWN0KSA6IG51bGw7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoT2JqZWN0IG9iamVjdCwgQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIElEZXRhaWxzVmlld2VyUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlRGV0YWlsc1Byb3ZpZGVyKG9iamVjdCk7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5jcmVhdGVWaWV3ZXIob2JqZWN0LCBwYXJlbnQsIGVkaXRvclBhcnQpIDogbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvSW1wb3J0Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0ltcG9ydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTAyN2RhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvSW1wb3J0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZGlhbG9ncy5TZWxlY3RTaW5nbGVGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLlhNTFF1aWNrU2NhbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEltcG9ydFZpZXdlciBleHRlbmRzIEJhc2VWaWV3ZXIgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotICAKLSAgcHJvdGVjdGVkIFRleHQgbmFtZXNwYWNlVGV4dDsKLSAgcHJvdGVjdGVkIFRleHQgcHJlZml4VGV4dDsKLSAgcHJvdGVjdGVkIFRleHQgbG9jYXRpb25UZXh0OwotICBCdXR0b24gc2VsZWN0QnV0dG9uOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgSW1wb3J0Vmlld2VyLgotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqIEBwYXJhbSBlZGl0b3JQYXJ0Ci0gICAqLwotICBwdWJsaWMgSW1wb3J0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihnZXRTdGF0dXNMaW5lTWFuYWdlcihlZGl0b3JQYXJ0KSk7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgICBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy5OYW1lZENvbXBvbmVudFZpZXdlciNnZXRIZWFkaW5nVGV4dCgpCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkKLSAgewotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9JTVBPUlQiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7IAotICAgIGNvbnRyb2wgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSwgdHJ1ZSk7ICAgICAgICAgICAgICAgICAKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KWNvbnRyb2wuZ2V0TGF5b3V0KCk7Ci0gICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVGbGF0UGFnZUhlYWRlcihjb250cm9sLCBnZXRIZWFkaW5nVGV4dCgpKTsKLQotICAgIENvbXBvc2l0ZSBjID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShjb250cm9sLCAxLCB0cnVlKTsKLQotICAgIExhYmVsIGJvZ3VzID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGMsIDAsICIiKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIAotICAgIGJvZ3VzLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoYywgMiwgdHJ1ZSk7IAotICAgIEdyaWRMYXlvdXQgbGF5b3V0MiA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Mi5tYWtlQ29sdW1uc0VxdWFsV2lkdGggID0gZmFsc2U7Ci0gICAgbGF5b3V0Mi5udW1Db2x1bW5zID0gMzsKLSAgICBsYXlvdXQyLm1hcmdpbkhlaWdodCA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQyKTsKLQotICAgIExhYmVsIG5hbWVzcGFjZUxhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkFNRVNQQUNFIikpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlVGV4dCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVUZXh0RmllbGQoY29tcG9zaXRlKTsKLSAgICBuYW1lc3BhY2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgLy8gcGxhY2UgaG9sZGVyCi0gICAgQ29udHJvbCBjb249IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDAsICIiKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBjb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBMYWJlbCBwcmVmaXhMYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDAsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BSRUZJWCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHByZWZpeFRleHQgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlVGV4dEZpZWxkKGNvbXBvc2l0ZSk7Ci0gICAgcHJlZml4VGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LHRoaXMpOwotICAgIHByZWZpeFRleHQuc2V0RW5hYmxlZChmYWxzZSk7ICAgIAotCi0gICAgLy8gcGxhY2UgaG9sZGVyCi0gICAgQ29udHJvbCBjb24yPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAwLCAiIik7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgY29uMi5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIGxvY2F0aW9uTGFiZWwgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAwLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9MT0NBVElPTiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGxvY2F0aW9uVGV4dCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVUZXh0RmllbGQoY29tcG9zaXRlKTsKLSAgICBsb2NhdGlvblRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICBzZWxlY3RCdXR0b24gPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlUHVzaEJ1dHRvbihjb21wb3NpdGUsICIuLi4iKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHNlbGVjdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBzZWxlY3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7ICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgICAgIAotICAgICAgTm9kZSBub2RlID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXROb2RlRm9yT2JqZWN0KGlucHV0KTsKLSAgICAgIHVwZGF0ZSgpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIGlmIChvbGRJbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkucmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIob2xkSW5wdXQsIHRoaXMpOwotICAgIH0KLQotICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoaW5wdXQsIHRoaXMpOwotICAgIG9sZElucHV0ID0gaW5wdXQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFdmVudEhlbHBlcihFbGVtZW50IGVsZW1lbnQsIEV2ZW50IGV2ZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkKLSAgICB7ICAKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudClpbnB1dCkuZ2V0RWxlbWVudCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZsYXRWaWV3VXRpbGl0eS51cGRhdGVGbGF0UGFnZUhlYWRlclRpdGxlKGdldEhlYWRpbmdUZXh0KCkpOwotICAgIHByZWZpeFRleHQuc2V0VGV4dCgiIik7Ci0gICAgbG9jYXRpb25UZXh0LnNldFRleHQoIiIpOwotICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgbmFtZXNwYWNlVGV4dC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsgICAgCi0gICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsKLSAgICBTdHJpbmcgbG9jYXRpb25WYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsb2NhdGlvbiIpOwotICAgIGxvY2F0aW9uVGV4dC5zZXRUZXh0KGxvY2F0aW9uVmFsdWUgIT0gbnVsbCA/IGxvY2F0aW9uVmFsdWUgOiAiIik7ICAKLQotICAgIFN0cmluZyBuYW1lc3BhY2VWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiKTsKLSAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQobmFtZXNwYWNlVmFsdWUgIT0gbnVsbCA/IG5hbWVzcGFjZVZhbHVlIDogIiIpOwotICAgIAotICAgIFN0cmluZyBwcmVmaXggPSAoKEltcG9ydClpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldFByZWZpeChuYW1lc3BhY2VWYWx1ZSk7Ci0gICAgcHJlZml4VGV4dC5zZXRUZXh0KHByZWZpeCAhPSBudWxsID8gcHJlZml4IDogIiIpOwotICB9Ci0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgQmFzZVdpbmRvdyNkb0hhbmRsZUV2ZW50KEV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotLy8gICAgaWYgKGV2ZW50LndpZGdldCA9PSBwcmVmaXhUZXh0KQotLy8gICAgewotLy8gICAgICBTdHJpbmcgbmV3UHJlZml4ID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0vLyAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTFByZWZpeChuZXdQcmVmaXgpOwotLy8gICAgCi0vLyAgICAgIGlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCB8fCBlcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLS8vICAgICAgewotLy8gICAgICAgIEltcG9ydCBpbXBvcnRPYmogPSAoSW1wb3J0KWlucHV0OwotLy8gICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChpbXBvcnRPYmopOwotLy8gICAgICAgIAotLy8gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGltcG9ydE9iai5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0vLyAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLS8vICAKLS8vICAgICAgICBTdHJpbmcgbnNGcm9tTW9kZWwgPSBpbXBvcnRPYmouZ2V0TmFtZXNwYWNlVVJJKCk7Ci0vLyAgICAgICAgU3RyaW5nIG5zRnJvbURPTSA9IGltcG9ydEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obnNGcm9tTW9kZWwpOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuc0Zyb21ET00pOwotLy8gIAotLy8gICAgICAgIFN0cmluZyBvbGRQcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChuc0Zyb21Nb2RlbCk7Ci0vLyAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiICsgb2xkUHJlZml4KTsKLS8vICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBuZXdQcmVmaXgsIG5zRnJvbU1vZGVsKTsKLS8vICAgICAgfQotLy8gICAgfQotICB9ICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgdXBkYXRlKCk7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBzZWxlY3RCdXR0b24pCi0gICAgewotICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOwotLy8gVE9ETzogcG9ydCBjaGVjawotICAgICAgcmVzb3VyY2VTZXQgPSAoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KWlucHV0KS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCi0gICAgICBXU0RMRWRpdG9yIGVkaXRvciA9IChXU0RMRWRpdG9yKWVkaXRvclBhcnQ7Ci0gICAgICBJRmlsZSBjdXJyZW50V1NETEZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9yLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgIAotICAgICAgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIG51bGwsIHRydWUpOwotICAgICAgU3RyaW5nIFtdIGZpbHRlcnMgPSB7ICJ4c2QiLCAid3NkbCIgfTsKLSAgICAgIElGaWxlIFtdIGV4Y2x1ZGVkRmlsZXMgPSB7IGN1cnJlbnRXU0RMRmlsZSB9OwotICAgICAgCi0gICAgICBkaWFsb2cuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJzLCBleGNsdWRlZEZpbGVzKTsKLSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU0VMRUNUIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBkaWFsb2cuc2V0VGl0bGUoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU0VMRUNUX0ZJTEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0RFU0NSSVBUSU9OX1NFTEVDVF9XU0RMX09SX1hTRCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaW50IHJjID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgIGlmIChyYyA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgICAgewotICAgICAgICBJRmlsZSBzZWxlY3RlZEZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAvL2lmIChzZWxlY3RlZEZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkuZXF1YWxzKGN1cnJlbnRXU0RMRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSkpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgU3lzdGVtLm91dC5wcmludGxuKCJTQU1FIEZJTEU6IiArIGN1cnJlbnRXU0RMRmlsZS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgLy99Ci0KLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlUmVsYXRpdmVVUkkoc2VsZWN0ZWRGaWxlLCBjdXJyZW50V1NETEZpbGUsIHRydWUpOwotCi0gICAgICAgIEltcG9ydCBpbXBvcnRPYmogPSAoSW1wb3J0KWlucHV0OwotICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGltcG9ydEVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoaW1wb3J0T2JqKTsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaW1wb3J0T2JqLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBpbXBvcnRUYXJnZXROYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgdW5pcXVlUHJlZml4ID0gIiI7Ci0gICAgICAKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHNlbGVjdGVkRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOyAgICAgIAotCi0JCS8vIG5vdGUgdGhhdCB0aGUgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hIHdvcmtzIGZvciBib3RoIHNjaGVtYSBhbmQgd3NkbCBmaWxlcwotCQkvLyBJIHNob3VsZCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBjb252ZW5pZW5jZSBtZXRob2QKLSAgICAgICAgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlID0gIFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEodXJpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmVxdWFscygiIikpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmlxdWVQcmVmaXggPSBnZXRVbmlxdWVQcmVmaXgoZGVmaW5pdGlvbiwgdXJpLmZpbGVFeHRlbnNpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdW5pcXVlUHJlZml4ID0gcHJlZml4OyAKLSAgICAgICAgfQotICAgICAgIAotICAgICAgICAKLSAgICAgICAgaWYgKGltcG9ydFRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8Ci0gICAgICAgICAgIChpbXBvcnRUYXJnZXROYW1lc3BhY2UgIT0gbnVsbCAmJiBpbXBvcnRUYXJnZXROYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuOyAgLy8gd2hhdCB0byBkbyB3aXRoIG5vIG5hbWVzcGFjZSBkb2NzPwotICAgICAgICB9Ci0KLSAgICAgICAgaW1wb3J0RWxlbWVudC5zZXRBdHRyaWJ1dGUoImxvY2F0aW9uIiwgbG9jYXRpb24pOwotICAgICAgICBpbXBvcnRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyB1bmlxdWVQcmVmaXgsIGltcG9ydFRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KGltcG9ydFRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIGxvY2F0aW9uVGV4dC5zZXRUZXh0KGxvY2F0aW9uKTsKLSAgICAgICAgcHJlZml4VGV4dC5zZXRUZXh0KHVuaXF1ZVByZWZpeCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlUHJlZml4KERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGluaXRQcmVmaXgpCi0gIHsKLSAgICBTdHJpbmcgdW5pcXVlUHJlZml4OwotICAgIE1hcCBtYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLQotICAgIGlmIChkZWZpbml0aW9uLmdldE5hbWVzcGFjZShpbml0UHJlZml4KSA9PSBudWxsKQotICAgIHsKLSAgICAgIHVuaXF1ZVByZWZpeCA9IGluaXRQcmVmaXg7Ci0gICAgfQotICAgIGVsc2UgLy8gaWYgdXNlZCwgdGhlbiB0cnkgdG8gY3JlYXRlIGEgdW5pcXVlIG9uZQotICAgIHsKLSAgICAgIFN0cmluZyB0ZW1wUHJlZml4ID0gaW5pdFByZWZpeDsKLSAgICAgIGludCBpID0gMTsKLSAgICAgIHdoaWxlKG1hcC5jb250YWluc0tleSh0ZW1wUHJlZml4ICsgaSkpCi0gICAgICB7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICAgIHVuaXF1ZVByZWZpeCA9IHRlbXBQcmVmaXggKyBpOwotICAgIH0KLSAgICByZXR1cm4gdW5pcXVlUHJlZml4OyAgICAKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5wdXRPdXRwdXRGYXVsdFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9JbnB1dE91dHB1dEZhdWx0Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjE1OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9JbnB1dE91dHB1dEZhdWx0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0cy5JbnZva2VEaWFsb2dCdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBJbnB1dE91dHB1dEZhdWx0Vmlld2VyIGV4dGVuZHMgTmFtZWRDb21wb25lbnRWaWV3ZXIgCi17ICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvOyAKLSAgcHJvdGVjdGVkIENvbXBvbmVudE5hbWVDb21ib0hlbHBlciBjb21wb25lbnROYW1lQ29tYm9IZWxwZXI7Ci0gIEludm9rZURpYWxvZ0J1dHRvbiBidXR0b247Ci0KLSAgcHVibGljIElucHV0T3V0cHV0RmF1bHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7IAotICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElucHV0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0lOUFVUIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBPdXRwdXQpCi0gICAgewotICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfT1VUUFVUIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9GQVVMVCIpOyAvLyROT04tTkxTLTEkCi0gICAgfSAgICAgICAgICAgICAgICAgCi0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNPYmplY3RFeHRlbnNpYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5wb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgIAotICAgIExhYmVsIG1lc3NhZ2VMYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDAsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX01FU1NBR0UiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDQ29tYm9Cb3goY29tcG9zaXRlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7ICAgICAgCi0KLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIgPSBuZXcgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyKGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB1dGlsLmdldE1lc3NhZ2VOYW1lcygpOwotICAgICAgfQotCi0gICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQotICAgICAgewotICAgICAgICByZXR1cm4gV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgYnV0dG9uID0gbmV3IEludm9rZURpYWxvZ0J1dHRvbihjb21wb3NpdGUsIGdldElucHV0KCkpOwotICAgIGJ1dHRvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7Ci0gICAgc3VwZXIudXBkYXRlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIudXBkYXRlKGlucHV0KTsKLSAgICBidXR0b24uc2V0SW5wdXQoaW5wdXQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXZlbnRIZWxwZXIoRWxlbWVudCBlbGVtZW50LCBFdmVudCBldmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHN1cGVyLmhhbmRsZUV2ZW50SGVscGVyKGVsZW1lbnQsIGV2ZW50KTsKLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIuaGFuZGxlRXZlbnRIZWxwZXIoZWxlbWVudCwgZXZlbnQpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9NZXNzYWdlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL01lc3NhZ2VWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4ZTBjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL01lc3NhZ2VWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlVmlld2VyIGV4dGVuZHMgTmFtZWRDb21wb25lbnRWaWV3ZXIgCi17ICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBNZXNzYWdlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAgICAKLSAgfSAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkKLSAgeyAKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTUVTU0FHRSIpOyAvLyROT04tTkxTLTEkCi0gIH0gICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvTmFtZWRDb21wb25lbnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvTmFtZWRDb21wb25lbnRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczMDJkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL05hbWVkQ29tcG9uZW50Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlNtYXJ0UmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5hbWVkQ29tcG9uZW50Vmlld2VyIGV4dGVuZHMgQmFzZVZpZXdlciBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZUZpZWxkOyAgCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCi0gIHB1YmxpYyBOYW1lZENvbXBvbmVudFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIoZ2V0U3RhdHVzTGluZU1hbmFnZXIoZWRpdG9yUGFydCkpOyAgICAKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OyAgICAgICAgICAgICAgICAgIAotCi0gICAgY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICB9IAotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKTsgIAotCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAJQ29tcG9zaXRlIGdyb3VwID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIsIHRydWUpOwotIAkKLSAgCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIENvbXBvc2l0ZSBuYW1lRmllbGRDb21wb3NpdGUgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKGdyb3VwLCAyLCB0cnVlKTsKLQkoKEdyaWRMYXlvdXQpbmFtZUZpZWxkQ29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgKChHcmlkTGF5b3V0KW5hbWVGaWVsZENvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luSGVpZ2h0ID0gMDsgCQotCSAKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCAgPSBmYWxzZTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDQ7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQotICAgIG5hbWVGaWVsZENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsgICAgICAKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMTsKLSAgICBnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICBuYW1lRmllbGRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQotICAgIExhYmVsIG5hbWVMYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChuYW1lRmllbGRDb21wb3NpdGUsIDAsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lRmllbGQgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlVGV4dEZpZWxkKG5hbWVGaWVsZENvbXBvc2l0ZSk7ICAKLSAgICBuYW1lRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7ICAKLSAgICAKLSAgICAvLyBwbGFjZSBob2xkZXIKLSAgICBDb250cm9sIGMgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwobmFtZUZpZWxkQ29tcG9zaXRlLCAwLCAiIik7Ci0gICAgYy5zZXRCYWNrZ3JvdW5kKG5ldyBDb2xvcihudWxsLCAwLCAyNTUsIDEwMCkpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdkLmhlaWdodEhpbnQgPSAwOwotICAgIGdkLndpZHRoSGludCA9IDA7Ci0gICAgYy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAJCi0gICAgcmV0dXJuIG5hbWVGaWVsZENvbXBvc2l0ZTsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgCi0JU2FzaEZvcm0gc2FzaEZvcm0gPSBuZXcgU2FzaEZvcm0ocGFyZW50LCBTV1QuQk9SREVSKTsKLQlzYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQljb250cm9sID0gc2FzaEZvcm07Ci0Jc2FzaEZvcm0uc2V0T3JpZW50YXRpb24oU1dULkhPUklaT05UQUwpOwotCQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKHNhc2hGb3JtLCAxLCB0cnVlKTsgICAgICAgIAotCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KWNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLSAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlRmxhdFBhZ2VIZWFkZXIoY29tcG9zaXRlLCBnZXRIZWFkaW5nVGV4dCgpKTsKLSAgICAgICAKLSAgICBwb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihjb21wb3NpdGUpOwotICAgIAotCVRhYmJlZFZpZXdlciB0YWJiZWRWaWV3ZXIgPSBuZXcgVGFiYmVkVmlld2VyKChXU0RMRWRpdG9yKWVkaXRvclBhcnQpOwotCi0JQ29udHJvbCBjID0gdGFiYmVkVmlld2VyLmNyZWF0ZUNvbnRyb2woc2FzaEZvcm0pOwotCWMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7ICAJICAgICAJCi0gIH0KLSAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7ICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgICAgIAotICAgICAgTm9kZSBub2RlID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXROb2RlRm9yT2JqZWN0KGlucHV0KTsKLSAgICAgIHVwZGF0ZSgpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIGlmIChvbGRJbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkucmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIob2xkSW5wdXQsIHRoaXMpOwotICAgIH0KLQotICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoaW5wdXQsIHRoaXMpOwotICAgIG9sZElucHV0ID0gaW5wdXQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudClpbnB1dCkuZ2V0RWxlbWVudCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZmxhdFZpZXdVdGlsaXR5LnVwZGF0ZUZsYXRQYWdlSGVhZGVyVGl0bGUoZ2V0SGVhZGluZ1RleHQoKSk7Ci0KLSAgICBuYW1lRmllbGQuc2V0VGV4dCgiIik7Ci0gICAgU3RyaW5nIG5hbWVWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotICAgIG5hbWVGaWVsZC5zZXRUZXh0KG5hbWVWYWx1ZSAhPSBudWxsID8gbmFtZVZhbHVlIDogIiIpOyAgCi0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkKLSAgewotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBCYXNlV2luZG93I2RvSGFuZGxlRXZlbnQoRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoaW5wdXQpOwotICAgIGhhbmRsZUV2ZW50SGVscGVyKGVsZW1lbnQsIGV2ZW50KTsgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0gICAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXZlbnRIZWxwZXIoRWxlbWVudCBlbGVtZW50LCBFdmVudCBldmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkKLSAgICB7ICAKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZUZpZWxkKQotICAgICAgeyAKLSAgICAgICAgbmV3IFNtYXJ0UmVuYW1lQWN0aW9uKGlucHV0LCBuYW1lRmllbGQuZ2V0VGV4dCgpKS5ydW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkpCi0gICAgewotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICAgIGlmICghY29udHJvbC5pc0Rpc3Bvc2VkKCkpCi0gICAgICB7ICAgICAgCi0gICAgICAgIHVwZGF0ZSgpOwotICAgICAgfSAgCi0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9PcGVyYXRpb25WaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvT3BlcmF0aW9uVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWVhNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9PcGVyYXRpb25WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvblZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyIAoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBPcGVyYXRpb25WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX09QRVJBVElPTiIpOyAgLy8kTk9OLU5MUy0xJAotICB9ICAKLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIucG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24ocGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAKLSAgICBMYWJlbCBwYXJhbWV0ZXJPcmRlckxhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUEFSQU1FVEVSX09SREVSIikpOyAgLy8kTk9OLU5MUy0xJAotICAgIFRleHQgcGFyYW1ldGVyT3JkZXJGaWVsZCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVUZXh0RmllbGQoY29tcG9zaXRlKTsgIAotICAgIHBhcmFtZXRlck9yZGVyRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgLy9idXR0b24uc2V0VGV4dCgiLi4uIik7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1BhcnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUGFydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTk5N2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUGFydFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzLkludm9rZURpYWxvZ0J1dHRvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgUGFydFZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyCi17ICAgCi0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIHJlZmVyZW5jZUtpbmRDb21ibzsgCi0gIHByb3RlY3RlZCBMYWJlbCBjb21wb25lbnROYW1lTGFiZWw7Ci0gIEludm9rZURpYWxvZ0J1dHRvbiBidXR0b247Ci0vLyAgQnV0dG9uIGltcG9ydEJ1dHRvbjsKLSAgCi0KLSAgcHVibGljIFBhcnRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BBUlQiKTsgIC8vJE5PTi1OTFMtMSQKLSAgfSAKLQotICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdEV4dGVuc2libGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5wb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihwYXJlbnQpOwotICAgICAKLSAgICBMYWJlbCBjb21wb25lbnRUeXBlTGFiZWwgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9SRUZFUkVOQ0VfS0lORCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlZmVyZW5jZUtpbmRDb21ibyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDQ29tYm9Cb3goY29tcG9zaXRlKTsKLSAgICByZWZlcmVuY2VLaW5kQ29tYm8uYWRkKCJlbGVtZW50Iik7Ci0gICAgcmVmZXJlbmNlS2luZENvbWJvLmFkZCgidHlwZSIpOwotICAgIHJlZmVyZW5jZUtpbmRDb21iby5zZXRUZXh0KCJ0eXBlIik7Ci0gICAgcmVmZXJlbmNlS2luZENvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0gICAgTGFiZWwgcGggPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiIik7IAotICAgIAotICAgIGNvbXBvbmVudE5hbWVMYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSk7ICAgLy8kTk9OLU5MUy0xJAotCi0gICAgY29tcG9uZW50TmFtZUNvbWJvID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNDb21ib0JveChjb21wb3NpdGUpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBidXR0b24gPSBuZXcgSW52b2tlRGlhbG9nQnV0dG9uKGNvbXBvc2l0ZSwgZ2V0SW5wdXQoKSk7Ci0gICAgCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfSAgCi0gICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWlucHV0OwotICAgICAgYm9vbGVhbiBpc1R5cGUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmlzVHlwZShwYXJ0KTsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0UGFydENvbXBvbmVudFJlZmVyZW5jZShwYXJ0KTsKLQotICAgICAgLy8gdXBkYXRlIHRoZSBjb21iby1ib3ggY29udGVudAotICAgICAgLy8KLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsgCi0gICAgICBMaXN0IGNvbXBMaXN0ID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRDb21wb25lbnROYW1lTGlzdChwYXJ0LCBpc1R5cGUpOwotICAgICAgaWYgKGNvbXBMaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAgY29tcExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoKFN0cmluZylpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICB9IAotICAgICAgCi0gICAgICBpZiAoaXNUeXBlKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVmZXJlbmNlS2luZENvbWJvLnNldFRleHQoInR5cGUiKTsKLSAgICAgICAgY29tcG9uZW50TmFtZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQodmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIiIpOwotICAgICAgICBidXR0b24uc2V0UmVmZXJlbmNlS2luZCgidHlwZSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZWZlcmVuY2VLaW5kQ29tYm8uc2V0VGV4dCgiZWxlbWVudCIpOwotICAgICAgICBjb21wb25lbnROYW1lTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9FTEVNRU5UIikpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dCh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAiIik7Ci0gICAgICAgIGJ1dHRvbi5zZXRSZWZlcmVuY2VLaW5kKCJlbGVtZW50Iik7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGJ1dHRvbi5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICBidXR0b24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotICAgICAgc3VwZXIudXBkYXRlKCk7ICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9ICAgICAgIAotICAgICAgCi0gICAgIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFdmVudEhlbHBlcihFbGVtZW50IGVsZW1lbnQsIEV2ZW50IGV2ZW50KQotICB7ICAKLSAgICBzdXBlci5oYW5kbGVFdmVudEhlbHBlcihlbGVtZW50LCBldmVudCk7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkKLSAgICB7ICAKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gcmVmZXJlbmNlS2luZENvbWJvKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBUT0RPLi4uIEkgaGF2ZSBubyBpZGVhIHdoeSB3ZSBuZWVkIHRvIHVzZSBhIGRlbGF5ZWQgcnVubmFibGUgdG8gZ2V0IAotICAgICAgICAvLyB1cGRhdGluZyB3b3JraW5nIHByb3Blcmx5IC4uLi4gdGhpcyBpcyBzb21ldGhpbmcgd2UgbmVlZCB0byByZXZpc2l0Ci0gICAgICAgIERlbGF5ZWRSZW5hbWVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBEZWxheWVkUmVuYW1lUnVubmFibGUoKFBhcnQpaW5wdXQpOwotICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOyAgCi0gICAgICB9IAotICAgIH0KLSAgfSAgICAgIAotCi0gIHByb3RlY3RlZCBjbGFzcyBEZWxheWVkUmVuYW1lUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBQYXJ0IHBhcnQ7Ci0KLSAgICBEZWxheWVkUmVuYW1lUnVubmFibGUoUGFydCBwYXJ0KQotICAgIHsKLSAgICAgIHRoaXMucGFydCA9IHBhcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgICAgICAgICAgICAgICAgICAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBib29sZWFuIGlzVHlwZSA9IHJlZmVyZW5jZUtpbmRDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJ0eXBlIik7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBpc1R5cGUsIG51bGwpOyAgICAKLSAgICB9Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaW5wdXQ7Ci0gICAgICBib29sZWFuIGlzVHlwZSA9IHJlZmVyZW5jZUtpbmRDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJ0eXBlIik7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBpc1R5cGUsIGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCkpOyAgICAgICAgICAKLSAgICB9Ci0gIH0gCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0VHlwZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0VHlwZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVmZGZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydFR5cGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGVWaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgUG9ydFR5cGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BPUlRUWVBFIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT2JqZWN0RXh0ZW5zaWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1BvcnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2VmY2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0cy5Db21wb25lbnROYW1lQ29tYm9IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzLkludm9rZURpYWxvZ0J1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFBvcnRWaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgIAotICBwcm90ZWN0ZWQgQ0NvbWJvIGNvbXBvbmVudE5hbWVDb21ibzsgICAgIAotICBwcm90ZWN0ZWQgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlcjsKLSAgSW52b2tlRGlhbG9nQnV0dG9uIGJ1dHRvbjsKLQotICBwdWJsaWMgUG9ydFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgICAgCi0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUE9SVCIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIucG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24ocGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAKLSAgICBMYWJlbCBiaW5kaW5nTGFiZWwgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAwLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICBjb21wb25lbnROYW1lQ29tYm8gPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ0NvbWJvQm94KGNvbXBvc2l0ZSk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOyAgIAotCi0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyID0gbmV3IENvbXBvbmVudE5hbWVDb21ib0hlbHBlcihjb21wb25lbnROYW1lQ29tYm8pCi0gICAgewotICAgICAgcHJvdGVjdGVkIExpc3QgZ2V0Q29tcG9uZW50TmFtZUxpc3QoQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsKQotICAgICAgewotICAgICAgICByZXR1cm4gdXRpbC5nZXRCaW5kaW5nTmFtZXMoKTsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFdTRExDb25zdGFudHMuQklORElOR19BVFRSSUJVVEU7Ci0gICAgICB9Ci0gICAgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGJ1dHRvbiA9IG5ldyBJbnZva2VEaWFsb2dCdXR0b24oY29tcG9zaXRlLCBnZXRJbnB1dCgpKTsKLSAgICBidXR0b24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7Ci0gICAgc3VwZXIudXBkYXRlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIudXBkYXRlKGlucHV0KTsKLSAgICBidXR0b24uc2V0SW5wdXQoaW5wdXQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXZlbnRIZWxwZXIoRWxlbWVudCBlbGVtZW50LCBFdmVudCBldmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHN1cGVyLmhhbmRsZUV2ZW50SGVscGVyKGVsZW1lbnQsIGV2ZW50KTsKLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIuaGFuZGxlRXZlbnRIZWxwZXIoZWxlbWVudCwgZXZlbnQpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2aWNlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZpY2VWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiMjNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZpY2VWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyIAoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBTZXJ2aWNlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAgICAKLSAgfSAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkKLSAgewotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9TRVJWSUNFIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvVGFiYmVkVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1RhYmJlZFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGNmMzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvVGFiYmVkVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIFRhYmJlZFZpZXdlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBXU0RMRWRpdG9yIGVkaXRvcjsKLSAgcHJvdGVjdGVkIENUYWJGb2xkZXIgdGFiRm9sZGVyOwotICBwcm90ZWN0ZWQgVGV4dCBkb2N1bWVudGF0aW9uRmllbGQ7Ci0gIHByb3RlY3RlZCBEb2N1bWVudGF0aW9uTGlzdGVuZXIgZG9jdW1lbnRhdGlvbkxpc3RlbmVyOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0ZW5lckVuYWJsZWQ7Ci0KLSAgcHVibGljIFRhYmJlZFZpZXdlcihXU0RMRWRpdG9yIGVkaXRvcikKLSAgewotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAgICAgCi0KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7IAotICAgIHRhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHBhcmVudCwgMCk7Ci0KLSAgICBDVGFiSXRlbSB0YWIgPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0gICAgdGFiLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfRE9DVU1FTlRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkb2N1bWVudGF0aW9uRmllbGQgPSBuZXcgVGV4dCh0YWJGb2xkZXIsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5XUkFQKTsKLSAgICB0YWIuc2V0Q29udHJvbChkb2N1bWVudGF0aW9uRmllbGQpOwotICAgIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24odGFiKTsKLSAgICAKLSAgICBkb2N1bWVudGF0aW9uTGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRhdGlvbkxpc3RlbmVyKCk7Ci0gICAgbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLSAgICBkb2N1bWVudGF0aW9uRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIoZG9jdW1lbnRhdGlvbkxpc3RlbmVyKTsKLSAgICAKLSAgICBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotICAgIHJldHVybiB0YWJGb2xkZXI7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBsaXN0ZW5lckVuYWJsZWQgPSBmYWxzZTsKLSAgICBkb2N1bWVudGF0aW9uTGlzdGVuZXIuc2V0SW5wdXQob2JqZWN0KTsKLSAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0VGV4dCgiIik7Ci0gICAgCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBvbmVudCB8fCAhKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSkKLSAgICB7Ci0gICAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBsaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvYmplY3QpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJkb2N1bWVudGF0aW9uIikpCi0gICAgICB7Ci0gICAgICAgIGRvY3VtZW50YXRpb25GaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBOb2RlIGRvY05vZGUgPSBnZXRDaGlsZE5vZGUoZWxlbWVudCwgZWxlbWVudC5nZXRQcmVmaXgoKSwgImRvY3VtZW50YXRpb24iKTsKLSAgICAgIGlmIChkb2NOb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgdGV4dE5vZGUgPSBkb2NOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgaWYgKHRleHROb2RlICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgU3RyaW5nIHRleHROb2RlVmFsdWUgPSB0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0VGV4dCh0ZXh0Tm9kZVZhbHVlICE9IG51bGwgPyB0ZXh0Tm9kZVZhbHVlIDogIiIpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBsaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotLy8gVGhlcmUgYXBwZWFycyB0byBiZSBhIGRlZmVjdCBpbiB0aGUgbW9kZWwuLi5pdCBkb2Vzbid0IHJldHVybgotLy8gdGhlIGRvY3VtZW50YXRpb25FbGVtZW50IGV2ZW4gdGhvdWdoIGl0IGV4aXN0cwotLy8gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotLy8gICAgewotLy8gICAgICBXU0RMRWxlbWVudCBlbGVtID0gKFdTRExFbGVtZW50KW9iamVjdDsKLS8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlbGVtID0gIiArIGVsZW0pOwotLy8KLS8vICAgICAgaWYgKGVsZW0gIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAgIEVsZW1lbnQgZG9jID0gZWxlbS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9jTm9kZSA9ICIgKyBkb2MpOwotLy8gICAgICAgIGlmIChkb2MgIT0gbnVsbCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBOb2RlIHRleHROb2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLS8vICAgICAgICAgIGlmICh0ZXh0Tm9kZSAhPSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0VGV4dCh0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0gIH0KLSAgIAotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAobyAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXRJbnB1dChvKTsgCi0gICAgICB9Ci0gICAgfQotICB9ICAgCi0KLSAgcHVibGljIE5vZGUgZ2V0Q2hpbGROb2RlKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgY2hpbGROYW1lKQotICB7Ci0gICAgTm9kZUxpc3QgbGlzdCA9IG51bGw7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIH0KLSAgICBTdHJpbmcgdGFyZ2V0TmFtZTsKLSAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICB0YXJnZXROYW1lID0gcHJlZml4ICsgIjoiICsgY2hpbGROYW1lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGFyZ2V0TmFtZSA9IGNoaWxkTmFtZTsKLSAgICB9ICAKLSAgIAotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIFBlcmZvcm1hbmNlIGlzc3VlIHBlcmhhcHM/Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobGlzdC5pdGVtKGkpLmdldE5vZGVOYW1lKCkuZXF1YWxzKHRhcmdldE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLQotCi0gIGNsYXNzIERvY3VtZW50YXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0OwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChsaXN0ZW5lckVuYWJsZWQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvYmplY3QpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBkb2NOb2RlID0gZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIGVsZW1lbnQuZ2V0UHJlZml4KCksICJkb2N1bWVudGF0aW9uIik7Ci0gICAgICAgICAgaWYgKGRvY05vZGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIHRleHROb2RlID0gZG9jTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBpZiAodGV4dE5vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGV4dE5vZGUuc2V0Tm9kZVZhbHVlKGRvY3VtZW50YXRpb25GaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRhdGlvbkZpZWxkLmdldFRleHQoKSAhPSBudWxsICYmIGRvY3VtZW50YXRpb25GaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2NOb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0IG5ld1RleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG9jdW1lbnRhdGlvbkZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgZG9jTm9kZS5hcHBlbmRDaGlsZChuZXdUZXh0Tm9kZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oZWxlbWVudCwgZWxlbWVudC5nZXRQcmVmaXgoKSwgImRvY3VtZW50YXRpb24iLCBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICBFbGVtZW50IG5ld0RvY3VtZW50YXRpb24gPSBhY3Rpb24uZ2V0TmV3RWxlbWVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG5ld0RvY3VtZW50YXRpb24uZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dCBuZXdUZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRvY3VtZW50YXRpb25GaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgbmV3RG9jdW1lbnRhdGlvbi5hcHBlbmRDaGlsZChuZXdUZXh0Tm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0gICAgICAgICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9XU0RMRGV0YWlsc1ZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9XU0RMRGV0YWlsc1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjNhZWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvV1NETERldGFpbHNWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotcHVibGljIGNsYXNzIFdTRExEZXRhaWxzVmlld2VyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3IgZWRpdG9yOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNsaWVudDsgIAotICBwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0gIHByb3RlY3RlZCBFeHRlbnNpYmxlRGV0YWlsc1ZpZXdlclByb3ZpZGVyIGRldGFpbHNWaWV3ZXJQcm92aWRlcjsgIAotICBwcm90ZWN0ZWQgSGFzaE1hcCB2aWV3ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEVNUFRZX1ZJRVdFUl9LRVkgPSAiRU1QVFlfVklFV0VSX0tFWSI7Ci0gIHByb3RlY3RlZCBWaWV3ZXIgZW1wdHlWaWV3ZXI7Ci0KLSAgcHVibGljIFdTRExEZXRhaWxzVmlld2VyKFdTRExFZGl0b3IgZWRpdG9yKQotICB7Ci0gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGRldGFpbHNWaWV3ZXJQcm92aWRlciA9IG5ldyBFeHRlbnNpYmxlRGV0YWlsc1ZpZXdlclByb3ZpZGVyKGVkaXRvcik7ICAgIAotICAgIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICB9Ci0gIAotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjbGllbnQgPSBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIDApOwotCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIGVtcHR5Vmlld2VyID0gbmV3IEVtcHR5Vmlld2VyKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0gICAgdmlld2VyTWFwLnB1dChFTVBUWV9WSUVXRVJfS0VZLCBlbXB0eVZpZXdlcik7Ci0gICAgcGFnZUJvb2suc2hvd1BhZ2UoZW1wdHlWaWV3ZXIuZ2V0Q29udHJvbCgpKTsKLSAgICByZXR1cm4gY2xpZW50OwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgT2JqZWN0IGtleSA9IGRldGFpbHNWaWV3ZXJQcm92aWRlci5nZXRWaWV3ZXJLZXkob2JqZWN0KTsgIAotICAgICAgCi0gICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IEVNUFRZX1ZJRVdFUl9LRVk7Ci0gICAgICB9Ci0gICAgICBWaWV3ZXIgdmlld2VyID0gKFZpZXdlcil2aWV3ZXJNYXAuZ2V0KGtleSk7Ci0gICAgICBpZiAodmlld2VyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IGRldGFpbHNWaWV3ZXJQcm92aWRlci5jcmVhdGVWaWV3ZXIob2JqZWN0LCBwYWdlQm9vaywgZWRpdG9yKTsKLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdmlld2VyTWFwLnB1dChrZXksIHZpZXdlcik7Ci0gICAgICAgICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIE9wZXJhdGlvblZpZXdlcikKLSAgICAgICAgICB7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBzY2hlbWEgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpb2JqZWN0OwotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBzY2hlbWEuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZpZXdlci5zZXRJbnB1dCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmlld2VyLnNldElucHV0KG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2Uodmlld2VyLmdldENvbnRyb2woKSk7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICAgIHsKLSAgICAgIAlvID0gKChXU0RMR3JvdXBPYmplY3QpbykuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgc2V0SW5wdXQobyk7ICAgICAgIAotICAgIH0KLSAgfSAgIAotfQotICAgICAgICAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvV1NETERldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9XU0RMRGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmFmMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9XU0RMRGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JRGV0YWlsc1ZpZXdlclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgV1NETERldGFpbHNWaWV3ZXJQcm92aWRlciBpbXBsZW1lbnRzIElEZXRhaWxzVmlld2VyUHJvdmlkZXIKLXsKLSAgcHVibGljIE9iamVjdCBnZXRWaWV3ZXJLZXkoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyB0b2RvLi4uLiB1c2UgYSBzd2l0Y2gKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJtZXNzYWdlIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJiaW5kaW5nIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJiaW5kaW5nT3BlcmF0aW9uIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgewotICAgICAgcmVzdWx0ID0gIm9wZXJhdGlvbiI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSAiZGVmaW5pdGlvbiI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgUGFydCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAicGFydCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgUG9ydCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAicG9ydCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgSW5wdXQgfHwgCi0gICAgICAgICAgICAgbW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJpbnB1dE91dHB1dEZhdWx0IjsKLSAgICB9ICAgIAotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ0lucHV0IHx8IAotICAgICAgICAgICAgIG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCB8fCAKLSAgICAgICAgICAgICBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkgCi0gICAgewotICAgICAgcmVzdWx0ID0gImJpbmRpbmdJbnB1dE91dHB1dEZhdWx0IjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAicG9ydFR5cGUiOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2UpCi0gICAgewotICAgICAgcmVzdWx0ID0gInNlcnZpY2UiOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJleHRlbnNpYmlsaXR5RWxlbWVudCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgSW1wb3J0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJpbXBvcnQiOyAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJlbXB0eSI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotICBwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihPYmplY3QgbW9kZWxPYmplY3QsIENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBWaWV3ZXIgdmlld2VyID0gbnVsbDsKLSAgICBPYmplY3Qga2V5ID0gZ2V0Vmlld2VyS2V5KG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoa2V5ICE9IG51bGwpICAgICAKLSAgICB7Ci0gICAgICBpZiAoa2V5LmVxdWFscygibWVzc2FnZSIpKQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgTWVzc2FnZVZpZXdlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAKLSAgICAgIH0gCi0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJiaW5kaW5nIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBCaW5kaW5nVmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJkZWZpbml0aW9uIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBEZWZpbml0aW9uVmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygiYmluZGluZ09wZXJhdGlvbiIpKQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgQmluZGluZ09wZXJhdGlvblZpZXdlcihwYXJlbnQsIGVkaXRvclBhcnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygib3BlcmF0aW9uIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBPcGVyYXRpb25WaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtleS5lcXVhbHMoInBhcnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IFBhcnRWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtleS5lcXVhbHMoInBvcnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IFBvcnRWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtleS5lcXVhbHMoImlucHV0T3V0cHV0RmF1bHQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IElucHV0T3V0cHV0RmF1bHRWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgCi0gICAgICB9ICAgIAotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygiYmluZGluZ0lucHV0T3V0cHV0RmF1bHQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IEJpbmRpbmdJbnB1dE91dHB1dEZhdWx0Vmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfSAgICAgICAgCi0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJzZXJ2aWNlIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBTZXJ2aWNlVmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygiZXh0ZW5zaWJpbGl0eUVsZW1lbnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJwb3J0VHlwZSIpKQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgUG9ydFR5cGVWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJpbXBvcnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IEltcG9ydFZpZXdlcihwYXJlbnQsIGVkaXRvclBhcnQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgRW1wdHlWaWV3ZXIocGFyZW50LCAwKTsgCi0gICAgICB9Ci0gICAgfSAgIAotICAgIHJldHVybiB2aWV3ZXI7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQXR0cmlidXRlc1RhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQXR0cmlidXRlc1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjNmZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0F0dHJpYnV0ZXNUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzVGFibGUgZXh0ZW5kcyBUYWJsZVZpZXdlciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QUk9QRVJUWSIpOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVkFMVUUiKTsgLy8kTk9OLU5MUy0xJAotCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotICBwcm90ZWN0ZWQgU3RyaW5nW10gY29sdW1uUHJvcGVydGllcyA9IHtQUk9QRVJUWSwgVkFMVUV9OwotICBwcm90ZWN0ZWQgUHJvcGVydHlUYWJsZVByb3ZpZGVyIHRhYmxlUHJvdmlkZXIgPSBuZXcgUHJvcGVydHlUYWJsZVByb3ZpZGVyKHRoaXMpOwotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciB0ZXh0Q2VsbEVkaXRvcjsKLSAgLy9wcm90ZWN0ZWQgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yIGNvbWJvQ2VsbEVkaXRvcjsKLSAgcHJvdGVjdGVkIElQcm9wZXJ0eVNvdXJjZSBwcm9wZXJ0eVNvdXJjZTsKLSAgCi0KLSAgcHVibGljIEF0dHJpYnV0ZXNUYWJsZShJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgc3VwZXIobmV3IFRhYmxlKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkZMQVQpKTsgICAKLSAgCXRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7ICAgICAgICAgICAgICAgCi0gICAgZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOyAgCi0gICAgCi0gICAgc2V0Q29udGVudFByb3ZpZGVyKHRhYmxlUHJvdmlkZXIpOwotICAgIHNldExhYmVsUHJvdmlkZXIodGFibGVQcm92aWRlcik7Ci0gICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZ2V0VGFibGUoKSwgU1dULk5PTkUsIGkpOwotICAgICAgY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1tpXSk7Ci0gICAgICBjb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICB9ICAgICAgCi0KLSAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsgCi0gICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNDAsIDQwLCB0cnVlKTsKLSAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhKTsKLSAgICAKLSAgICBDb2x1bW5XZWlnaHREYXRhIGRhdGEyID0gbmV3IENvbHVtbldlaWdodERhdGEoODAsIDgwLCB0cnVlKTsKLSAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhMik7ICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIGdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgICAKLSAgICB0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcihnZXRUYWJsZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gCXJlc2V0Q2VsbEVkaXRvcnMoKTsJICAgIAotCi0gICAgc2V0Q2VsbE1vZGlmaWVyKHRoaXMpOyAgICAKLSAgfSAgCi0gICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0gIAkvLyB3ZSBuZWVkIHRvIGhvb2sgdXAgb3VyIG93biBtb3VzZSBsaXN0ZW5lciBmaXJzdAotICAJLy8gc28gdGhhdCB3ZSBjYW4gdXBkYXRlIHRoZSBjZWxsRWRpdG9ycyBiZWZvcmUKLSAgCS8vIHRoZSAnaW50ZXJuYWwnIGxpc3RlbmVyIHRyaWVzIHRvIGdldCBob2xkIG9mIHRoZW0KLQlUYWJsZSB0YWJsZUNvbnRyb2wgPSAoVGFibGUpY29udHJvbDsKLQkgIHRhYmxlQ29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCSAgcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJdXBkYXRlQ2VsbEVkaXRvcnMoKTsKLQkJICB9Ci0JICB9KTsJICAJICAJCi0JICBzdXBlci5ob29rQ29udHJvbChjb250cm9sKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgLy8gSUNlbGxNb2RpZmllcgotICBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJldHVybiBwcm9wZXJ0eS5lcXVhbHMoVkFMVUUpOwotICB9ICAKLQotICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpbnQgY29sdW1uID0gMDsKLSAgICBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMF0pKQotICAgIHsKLSAgICAgIGNvbHVtbiA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzFdKSkKLSAgICB7Ci0gICAgICBjb2x1bW4gPSAxOwotICAgIH0gICAgCi0gICAgcmV0dXJuIHRhYmxlUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlbGVtZW50LCBjb2x1bW4pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgeyAgCi0gIAlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZWxlbWVudDsKLQlJUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IChJUHJvcGVydHlEZXNjcmlwdG9yKWl0ZW0uZ2V0RGF0YSgpOwotCQkKLQkvLyBpZiB0aGUgbmV3IHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGQgdmFsdWUsIHRoZSB1c2VyIGhhcyBvbmx5IGNsaWNrZWQKLQkvLyBvbiB0aGUgY2VsbCBpbiB0aGUgY291cnNlIG9mICdicm93c2luZycgLi4uIHNvIGRvbid0IGVkaXQgdGhlIHZhbHVlCi0JT2JqZWN0IG9sZFZhbHVlID0gZ2V0VmFsdWUocHJvcGVydHlEZXNjcmlwdG9yLCBwcm9wZXJ0eSk7CQotCWlmICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKSAKLQl7CQotCQkvLyB3ZSBhc3N1bWUgdGhlIHZhbHVlIGlzIGVtcHR5IHRoYXQgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVtb3ZlZAotCQkvLyB0b2RvLi4uIHdlIHByb2JhYmx5IG5lZWQgdG8gbG9vayBhdCB0aGlzIGluIG1vcmUgZGV0YWlsCi0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZyl2YWx1ZSkubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJdmFsdWUgPSBudWxsOwotCQl9CQkgIAkKLQkJcHJvcGVydHlTb3VyY2Uuc2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0SWQoKSwgdmFsdWUpOyAgIAotCQlyZWZyZXNoKGl0ZW0uZ2V0RGF0YSgpKTsKLQl9CSAgCQkKLSAgfSAKLSAgIAotICAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNlbGxFZGl0b3JzKCkKLSAgeyAgICAgICAgICAgICAgICAKLQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclsyXTsKLQljZWxsRWRpdG9yc1swXSA9IHRleHRDZWxsRWRpdG9yOwotCWNlbGxFZGl0b3JzWzFdID0gdGV4dENlbGxFZGl0b3I7Ci0KLQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClnZXRJbnB1dCgpOwotICAgICAgCSAKLQlJUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IHByb3BlcnR5U291cmNlLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQlpbnQgaW5kZXggPSBnZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aCkKLQl7Ci0JICBDZWxsRWRpdG9yW10gb2xkQ2VsbEVkaXRvcnMgPSBnZXRDZWxsRWRpdG9ycygpOwotCSAgQ2VsbEVkaXRvciBvbGRDZWxsRWRpdG9yID0gKG9sZENlbGxFZGl0b3JzLmxlbmd0aCA+IDEpID8gb2xkQ2VsbEVkaXRvcnNbMV0gOiBudWxsOwotCSAgaWYgKG9sZENlbGxFZGl0b3IgIT0gbnVsbCAmJiBvbGRDZWxsRWRpdG9yICE9IHRleHRDZWxsRWRpdG9yKQotCSAgewotCSAgIG9sZENlbGxFZGl0b3IuZGVhY3RpdmF0ZSgpOwotCSAgIG9sZENlbGxFZGl0b3IuZGlzcG9zZSgpOwotCSAgfQotCSAgY2VsbEVkaXRvcnNbMV0gPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2luZGV4XS5jcmVhdGVQcm9wZXJ0eUVkaXRvcihnZXRUYWJsZSgpKTsgICAgIAotCX0gIAotCXNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsgICAgIAotICB9Ci0gICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJpbmdBcnJheShMaXN0IGxpc3QpCi0gIHsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICByZXN1bHRbaV0gPSAoU3RyaW5nKWxpc3QuZ2V0KGkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCByZXNldENlbGxFZGl0b3JzKCkKLSAgewotCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzJdOwotCWNlbGxFZGl0b3JzWzBdID0gdGV4dENlbGxFZGl0b3I7Ci0JY2VsbEVkaXRvcnNbMV0gPSB0ZXh0Q2VsbEVkaXRvcjsKLQlzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7ICAKLSAgfQotCi0KLSAgY2xhc3MgUHJvcGVydHlUYWJsZVByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0gICAgUHJvcGVydHlUYWJsZVByb3ZpZGVyKFRhYmxlVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpICAKLSAgICB7Ci0JICByZXNldENlbGxFZGl0b3JzKCk7CQkgICAgCQotICAgICAgaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpCi0gICAgICB7ICAgICAgCi0JICAgICAgcHJvcGVydHlTb3VyY2UgPSBuZXcgRXh0ZW5zaWJsZVByb3BlcnR5U291cmNlKGVkaXRvclBhcnQsIChJRE9NRWxlbWVudCluZXdJbnB1dCk7Ci0gICAgICB9IAotICAgICAgZWxzZSBpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgCXByb3BlcnR5U291cmNlID0gbmV3IFJlYWRPbmx5UHJvcGVydHlTb3VyY2UoZWRpdG9yUGFydCwgKEVsZW1lbnQpbmV3SW5wdXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCXByb3BlcnR5U291cmNlID0gbnVsbDsKLSAgICAgIH0gICAJCi0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9ICAgICAgCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG8sIGludCBjb2x1bW5JbmRleCkgIAotICAgIHsgCi0JICBJUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IChJUHJvcGVydHlEZXNjcmlwdG9yKW87CQotICAgICAgcmV0dXJuIChjb2x1bW5JbmRleCA9PSAwKSA/IHByb3BlcnR5RGVzY3JpcHRvci5nZXRJZCgpLnRvU3RyaW5nKCkgOiBwcm9wZXJ0eVNvdXJjZS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5RGVzY3JpcHRvci5nZXRJZCgpKS50b1N0cmluZygpOwotICAgIH0gIAotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvKQotICAgIHsgICAgICAgICAKLSAgIAkgIE9iamVjdFtdIHJlc3VsdCA9IHByb3BlcnR5U291cmNlLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgIAkgIC8vIEZvciBzb21lIHN0cmFuZ2UgcmVzb24gdGhlIFZpZXdlclNvcnRlciBkb2Vzbid0IHNlZW0gdG8gYmUgd29ya2luZyBmb3IgdGhpcyB0YWJsZQotICAgCSAgLy8gQXMgYSB3b3JrYXJvdW5kIHdlIHNvcnQgdGhlbSBpbiB0aGlzIG1ldGhvZCBiZWZvcmUgcmV0dXJuaW5nIHRoZW0gdG8gdGhlIHZpZXdlcgotICAgCSAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKQotICAgCSAgewotICAgCSAgCUFycmF5cy5zb3J0KHJlc3VsdCwgbmV3IEludGVybmFsQ29tcGFyYXRvcigpKTsKLSAgIAkgIH0KLSAgIAkgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0gIAotICBjbGFzcyBJbnRlcm5hbENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yCi0gIHsKLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGUxLCBPYmplY3QgZTIpIAotCXsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciBwMSA9IChJUHJvcGVydHlEZXNjcmlwdG9yKWUxOwotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHAyID0gKElQcm9wZXJ0eURlc2NyaXB0b3IpZTI7Ci0JCVN0cmluZyBwMU5hbWUgPSBwMS5nZXREaXNwbGF5TmFtZSgpOwotCQlTdHJpbmcgcDJOYW1lID0gcDIuZ2V0RGlzcGxheU5hbWUoKTsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShwMS5nZXREaXNwbGF5TmFtZSgpLCBwMi5nZXREaXNwbGF5TmFtZSgpKTsKLQl9ICAJCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9Db21wb25lbnROYW1lQ29tYm9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9Db21wb25lbnROYW1lQ29tYm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0Y2U1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vLyBBIGNvbnZlbmllbmNlIGNsYXNzCi0vLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudE5hbWVDb21ib0hlbHBlcgoteyAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87Ci0KLSAgcHVibGljIENvbXBvbmVudE5hbWVDb21ib0hlbHBlcihDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvKQotICB7Ci0gICAgdGhpcy5jb21wb25lbnROYW1lQ29tYm8gPSBjb21wb25lbnROYW1lQ29tYm87Ci0gIH0gICAgICAgCi0KLSAgcHVibGljIHZvaWQgdXBkYXRlKE9iamVjdCBpbnB1dCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudClpbnB1dCkuZ2V0RWxlbWVudCgpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICBTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVOYW1lKCkpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiKTsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgY29tcG9uZW50UmVmZXJlbmNlVXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGRlZmluaXRpb24pOwotICAgICAgamF2YS51dGlsLkxpc3QgbGlzdCA9IGdldENvbXBvbmVudE5hbWVMaXN0KGNvbXBvbmVudFJlZmVyZW5jZVV0aWwpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoKFN0cmluZylpdGVyLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9ICAKLQotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudEhlbHBlcihFbGVtZW50IGVsZW1lbnQsIEV2ZW50IGV2ZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkKLSAgICB7ICAKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gY29tcG9uZW50TmFtZUNvbWJvKQotICAgICAgewotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVOYW1lKCksIGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCk7Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0NvbXBvbmVudHNTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQ29tcG9uZW50c1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyMjViZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQ29tcG9uZW50c1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWkuRmxhdFBhZ2VTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuZmxhdHVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC51aS5GbGF0Vmlld1V0aWxpdHk7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRzU2VjdGlvbiBleHRlbmRzIEZsYXRQYWdlU2VjdGlvbgotewotICBwcm90ZWN0ZWQgQ0NvbWJvIG5hbWVzQ29tYm87Ci0gIHByb3RlY3RlZCBCdXR0b24gbmV3QnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uIGltcG9ydEJ1dHRvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLSAgICAKLSAgcHVibGljIENvbXBvbmVudHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIEZsYXRWaWV3VXRpbGl0eSBmbGF0Vmlld1V0aWxpdHksIFN0cmluZyB0aXRsZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzKHBhcmVudCwgdGl0bGUpOwotCi0gICAgV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IFdpZGdldEZhY3RvcnkoKTsKLSAgICBmYWN0b3J5LnNldENsaWVudEFyZWFDb2xvcihmbGF0Vmlld1V0aWxpdHkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCi0gICAgQ29udHJvbCBzZWN0aW9uID0gY3JlYXRlQ29udHJvbCh0aGlzLCBmYWN0b3J5KTsKLSAgICBzZXRDb250ZW50KHNlY3Rpb24pOwotCi0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7ICAgICAgICAKLSAgfQotCi0KLSAgcHVibGljIENvbXBvbmVudHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0aXRsZSkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgc2V0Q29sbGFwc2FibGUodHJ1ZSk7Ci0gICAgc2V0SGVhZGVyVGV4dCh0aXRsZSk7Ci0gICAgc2V0QWRkU2VwYXJhdG9yKHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAgICAgCi0KLSAgcHVibGljIENDb21ibyBnZXROYW1lc0NvbWJvKCkKLSAgewotICAgIHJldHVybiBuYW1lc0NvbWJvOwotICB9Ci0gIAotICBwdWJsaWMgQnV0dG9uIGdldE5ld01lc3NhZ2VCdXR0b24oKQotICB7Ci0gICAgIHJldHVybiBuZXdCdXR0b247Ci0gIH0KLQotICBwdWJsaWMgQnV0dG9uIGdldEltcG9ydE1lc3NhZ2VCdXR0b24oKQotICB7Ci0gICAgIHJldHVybiBpbXBvcnRCdXR0b247Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIEZsYXRQYWdlU2VjdGlvbiNjcmVhdGVDbGllbnQoQ29tcG9zaXRlLCBXaWRnZXRGYWN0b3J5KQotICAgKi8KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDbGllbnQoQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotICB7Ci0gICAgRmxhdFZpZXdVdGlsaXR5IGZsYXRWaWV3VXRpbGl0eSA9IG5ldyBGbGF0Vmlld1V0aWxpdHkodHJ1ZSk7Ci0KLSAgICBDb21wb3NpdGUgY2xpZW50ID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0gICAgbmFtZXNDb21ibyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDQ29tYm9Cb3goY2xpZW50KTsKLSAgICAgICAgICAgICAgICAgIAotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKGNsaWVudCwgMywgdHJ1ZSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gKEdyaWRMYXlvdXQpYnV0dG9uQ29tcG9zaXRlLmdldExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAzOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMzsKLSAgICBncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgCi0gICAgTGFiZWwgZmlsbGVyID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsZXIoYnV0dG9uQ29tcG9zaXRlLCAxKTsKLSAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSlmaWxsZXIuZ2V0TGF5b3V0RGF0YSgpOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIG5ld0J1dHRvbiA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQlVUVE9OX05FVyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGltcG9ydEJ1dHRvbiA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQlVUVE9OX0lNUE9SVCIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcmV0dXJuIGNsaWVudDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvRXh0ZW5zaWJsZVByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvRXh0ZW5zaWJsZVByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjY3MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0V4dGVuc2libGVQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5JUHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlUHJvcGVydHlTb3VyY2UgZXh0ZW5kcyBYTUxQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIKLXsKLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQlwcml2YXRlIElOb2RlTm90aWZpZXIgbm9kZU5vdGlmaWVyOwotCQkJCi0JcHVibGljIEV4dGVuc2libGVQcm9wZXJ0eVNvdXJjZShJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBJTm9kZU5vdGlmaWVyIHRhcmdldCkgCi0JewotCQlzdXBlcih0YXJnZXQpOwotCQl0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotCQl0aGlzLm5vZGVOb3RpZmllciA9IHRhcmdldDsKLSAgCX0KLSAgCQotICAJCi0gIAkgICAgCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIAotCXsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwkJCi0JCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWF0dHJEZWNsLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7Ci0JCWlmIChjbURvY3VtZW50ICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZyBuYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAKLQkJCWlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLQkJCXsKLQkJCQlJUHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIgcHJvdmlkZXIgPSAoSVByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyKVdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5KCkuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpCi0JCQkJewotCQkJCSAgcmVzdWx0ID0gcHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGVkaXRvclBhcnQsIChFbGVtZW50KSBub2RlTm90aWZpZXIsIG5hbWVzcGFjZVVSSSwgYXR0ckRlY2wuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJewotCQkgIHJlc3VsdCA9IHN1cGVyLmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsJCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvSW52b2tlRGlhbG9nQnV0dG9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvSW52b2tlRGlhbG9nQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTkwNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0ludm9rZURpYWxvZ0J1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy5JbnZva2VTZXREaWFsb2c7Ci0KLS8vIGluc3RlYWQgb2YgdXNpbmcgYSBCdXR0b24gZGlyZWN0bHkgKHdoaWNoIGNhdXNlcyBzaXppbmcvbGF5b3V0IHByb2JsZW1zKQotLy8gd2UgdXNlIHRoaXMgY2xhc3MKLXB1YmxpYyBjbGFzcyBJbnZva2VEaWFsb2dCdXR0b24gZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgoteyAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBidXR0b247Ci0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgcHJvdGVjdGVkIFN0cmluZyBraW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBJbnZva2VEaWFsb2dCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IGlucHV0KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0gICAgc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBidXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBnZC5oZWlnaHRIaW50ID0gMTc7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMjQ7Ci0gICAgYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotICAgIGJ1dHRvbi5zZXRUZXh0KCIuLi4iKTsKLSAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIEJ1dHRvbiBnZXRCdXR0b24oKSAKLSAgewotICAgIHJldHVybiBidXR0b247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkKLSAgewotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZUtpbmQoU3RyaW5nIGtpbmQpCi0gIHsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJ1dHRvbikKLSAgICB7Ci0gICAgICBJbnZva2VTZXREaWFsb2cgZGlhbG9nID0gbmV3IEludm9rZVNldERpYWxvZygpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUGFydCkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nLnNldFJlZmVyZW5jZUtpbmQoa2luZCk7Ci0gICAgICB9Ci0gICAgICBkaWFsb2cucnVuKGlucHV0LCBlZGl0b3JQYXJ0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL1JlYWRPbmx5UHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9SZWFkT25seVByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDhjOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL1JlYWRPbmx5UHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICAgIHByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICBwdWJsaWMgUmVhZE9ubHlQcm9wZXJ0eVNvdXJjZShJRWRpdG9yUGFydCBlZGl0UGFydCwgRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTmFtZWROb2RlTWFwIG1hcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBpbnQgbWFwTGVuZ3RoID0gbWFwLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcExlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgbWFwLml0ZW0oaSk7Ci0gICAgICAgICAgICBsaXN0LmFkZChuZXcgUHJvcGVydHlEZXNjcmlwdG9yKGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gICAgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgoU3RyaW5nKSBpZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9CYXNlUmVuYW1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9CYXNlUmVuYW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJkOTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvQmFzZVJlbmFtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUmVuYW1lciBleHRlbmRzIFdTRExWaXNpdG9yCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmV3TmFtZTsKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IGdsb2JhbENvbXBvbmVudDsKLSAgCi0gIHB1YmxpYyBCYXNlUmVuYW1lcihXU0RMRWxlbWVudCBnbG9iYWxDb21wb25lbnQsIFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgc3VwZXIoZ2xvYmFsQ29tcG9uZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgdGhpcy5nbG9iYWxDb21wb25lbnQgPSBnbG9iYWxDb21wb25lbnQ7Ci0gICAgdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROZXdRTmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgcU5hbWUgPSBudWxsOwotICAgIGlmIChuZXdOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2xvYmFsQ29tcG9uZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIHFOYW1lID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICBxTmFtZSArPSAiOiIgKyBuZXdOYW1lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcU5hbWUgPSBuZXdOYW1lOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvQmluZGluZ1JlbmFtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvQmluZGluZ1JlbmFtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1Y2YwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL0JpbmRpbmdSZW5hbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1JlbmFtZXIgZXh0ZW5kcyBCYXNlUmVuYW1lcgotewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEJpbmRpbmdSZW5hbWVyLgotICAgKiBAcGFyYW0gZ2xvYmFsQ29tcG9uZW50Ci0gICAqIEBwYXJhbSBuZXdOYW1lCi0gICAqLwotICBwdWJsaWMgQmluZGluZ1JlbmFtZXIoV1NETEVsZW1lbnQgZ2xvYmFsQ29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIHN1cGVyKGdsb2JhbENvbXBvbmVudCwgbmV3TmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBzdXBlci52aXNpdFBvcnQocG9ydCk7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRFQmluZGluZygpOwotICAgIGlmIChnbG9iYWxDb21wb25lbnQuZXF1YWxzKGJpbmRpbmcpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChwb3J0KTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJiaW5kaW5nIiwgZ2V0TmV3UU5hbWUoKSk7Ci0gICAgfQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9NZXNzYWdlUmVuYW1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9NZXNzYWdlUmVuYW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzBkMjJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvTWVzc2FnZVJlbmFtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VSZW5hbWVyIGV4dGVuZHMgQmFzZVJlbmFtZXIKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBNZXNzYWdlUmVuYW1lci4KLSAgICogQHBhcmFtIGdsb2JhbENvbXBvbmVudAotICAgKiBAcGFyYW0gbmV3TmFtZQotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VSZW5hbWVyKFdTRExFbGVtZW50IGdsb2JhbENvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBzdXBlcihnbG9iYWxDb21wb25lbnQsIG5ld05hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRJbnB1dChJbnB1dCBpbnB1dCkKLSAgewotICAgIHN1cGVyLnZpc2l0SW5wdXQoaW5wdXQpOwotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMobWVzc2FnZSkpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGlucHV0KTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgZ2V0TmV3UU5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIHN1cGVyLnZpc2l0T3V0cHV0KG91dHB1dCk7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gb3V0cHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMob3V0cHV0KSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qob3V0cHV0KTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgZ2V0TmV3UU5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIHN1cGVyLnZpc2l0RmF1bHQoZmF1bHQpOwotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGZhdWx0LmdldEVNZXNzYWdlKCk7Ci0gICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMoZmF1bHQpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChmYXVsdCk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsIGdldE5ld1FOYW1lKCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9Qb3J0VHlwZVJlbmFtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvUG9ydFR5cGVSZW5hbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNGQwMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9Qb3J0VHlwZVJlbmFtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGVSZW5hbWVyIGV4dGVuZHMgQmFzZVJlbmFtZXIKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBQb3J0VHlwZVJlbmFtZXIuCi0gICAqIEBwYXJhbSBnbG9iYWxDb21wb25lbnQKLSAgICogQHBhcmFtIG5ld05hbWUKLSAgICovCi0gIHB1YmxpYyBQb3J0VHlwZVJlbmFtZXIoV1NETEVsZW1lbnQgZ2xvYmFsQ29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIHN1cGVyKGdsb2JhbENvbXBvbmVudCwgbmV3TmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gYmluZGluZy5nZXRFUG9ydFR5cGUoKTsKLQotICAgIGlmIChnbG9iYWxDb21wb25lbnQuZXF1YWxzKHBvcnRUeXBlKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsIGdldE5ld1FOYW1lKCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9XU0RMVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9XU0RMVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjZkNzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvV1NETFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgV1NETFZpc2l0b3IKLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotCi0gIHB1YmxpYyBXU0RMVmlzaXRvcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgdmlzaXREZWZpbml0aW9uKCkKLSAgewotICAgIHZpc2l0QmluZGluZ3MoKTsKLSAgICB2aXNpdE1lc3NhZ2VzKCk7Ci0gICAgdmlzaXRQb3J0VHlwZXMoKTsKLSAgICB2aXNpdFNlcnZpY2VzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEJpbmRpbmdzKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QmluZGluZyhiaW5kaW5nKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdE1lc3NhZ2VzKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWZpbml0aW9uLmdldEVNZXNzYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0TWVzc2FnZShtZXNzYWdlKTsgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBvcnRUeXBlcygpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNlcnZpY2VzKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWZpbml0aW9uLmdldEVTZXJ2aWNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0UG9ydFR5cGUocG9ydFR5cGUpOwotICAgIH0KLQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsgCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7IAotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0QmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCk7Ci0gICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpOyAgICAgICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIElucHV0IGlucHV0ID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpOwotICAgIE91dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0RU91dHB1dCgpOwotICAgIAotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0SW5wdXQoaW5wdXQpOwotICAgIH0KLSAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRPdXRwdXQob3V0cHV0KTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRmF1bHQgZmF1bHQgPSAoRmF1bHQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKGZhdWx0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0RmF1bHQoZmF1bHQpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSBwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRQYXJ0KHBhcnQpOwotICAgIH0KLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXRJbnB1dChJbnB1dCBpbnB1dCkKLSAgewotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0RmF1bHQoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBmYXVsdC5nZXRFTWVzc2FnZSgpOwotICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0gICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdEJpbmRpbmcoYmluZGluZyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0UG9ydChwb3J0KTsKLSAgICB9Ci0gICAgCi0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdDb21wb25lbnREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpZGdldHMvTmV3Q29tcG9uZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTk1YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdDb21wb25lbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIE5ld0NvbXBvbmVudERpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVGaWVsZDsgCi0gIHByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotICBwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0gIHByb3RlY3RlZCBMaXN0IHVzZWROYW1lczsKLQotICBwdWJsaWMgTmV3Q29tcG9uZW50RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSkgCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICBuYW1lID0gZGVmYXVsdE5hbWU7ICAgICAgCi0gICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICB9Ci0gIAotICBwdWJsaWMgTmV3Q29tcG9uZW50RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSwgTGlzdCB1c2VkTmFtZXMpIAotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgbmFtZSA9IGRlZmF1bHROYW1lOyAgICAgIAotICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB0aGlzLnVzZWROYW1lcyA9IHVzZWROYW1lczsKLSAgfQotCi0gIHB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpCi0gIHsKLSAgICBjcmVhdGUoKTsKLSAgICBnZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotICAgIHNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIHJldHVybiBvcGVuKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAgCi0gIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgIG5hbWVGaWVsZC5mb3JjZUZvY3VzKCk7Ci0gICAgbmFtZUZpZWxkLnNlbGVjdEFsbCgpOyAgCi0gICAgdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICBva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfSAgCi0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZ2RGaWxsPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZEZpbGwuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZEZpbGwudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RGaWxsLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkRmlsbCk7Ci0KLSAgICBMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgbmFtZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkFNRSIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgbmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZC53aWR0aEhpbnQgPSAyMDA7Ci0gICAgbmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotICAgIG5hbWVGaWVsZC5zZXRUZXh0KG5hbWUpOwotICAgIG5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotICAgIGNyZWF0ZUV4dGVuZGVkQ29udGVudChkaWFsb2dBcmVhKTsKLQotICAgIC8vIGVycm9yIG1lc3NhZ2UKLSAgICBlcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dCgiZXJyb3IgbWVzc2FnZSBnb2VzIGhlcmUiKTsgICAgICAgICAKLSAgICBHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZDIuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZDIuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZDIud2lkdGhIaW50ID0gMjAwOwotICAgIGVycm9yTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QyKTsgICAgICAgICAgCi0vLyAgICBDb2xvciBjb2xvciA9IG5ldyBDb2xvcihlcnJvck1lc3NhZ2VMYWJlbC5nZXREaXNwbGF5KCksIDIwMCwgMCwgMCk7Ci0vLyAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotICAgIHJldHVybiBkaWFsb2dBcmVhOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0gIH0gICAgICAgIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZShTdHJpbmcgbmFtZSkKLSAgewotICAJaWYgKHVzZWROYW1lcyA9PSBudWxsKQotICAJCXJldHVybiBudWxsOwotICAJCi0gIAlJdGVyYXRvciBpdGVyYXRvciA9IHVzZWROYW1lcy5pdGVyYXRvcigpOwotICAJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKSkgewotICAJCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfV0FSTklOR19EVVBMSUNBVEVfTkFNRV9FWElTVFMiKTsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA+IDApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKG5hbWUpOwotICAgIH0gICAKLSAgICBlbHNlCi0gICAgewotICAgICAgZXJyb3JNZXNzYWdlID0gIiI7Ci0gICAgfSAgCi0gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsKLS8vICAgIG9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSAKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgIHsKLSAgICAgIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL05ld0NvbXBvbmVudFdpdGhDaGlsZERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdDb21wb25lbnRXaXRoQ2hpbGREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1MDkxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL05ld0NvbXBvbmVudFdpdGhDaGlsZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi0KLS8qCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgTmV3Q29tcG9uZW50RGlhbG9nIHRvIGFsbG93IGFkZGl0aW9uYWwgd2lkZ2V0cy4gIE1vcmUKLSAqIHNwZWNpZmljYWxseSwgdGhlICdjcmVhdGUgc3ViLWNvbXBvbmVudHMnIGNoZWNrYm94Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb21wb25lbnRXaXRoQ2hpbGREaWFsb2cgZXh0ZW5kcyBOZXdDb21wb25lbnREaWFsb2cgewotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlTWVzc2FnZUNoZWNrQm94OwotCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVNZXNzYWdlQm9vbGVhbjsKLQotCXB1YmxpYyBOZXdDb21wb25lbnRXaXRoQ2hpbGREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCB0aXRsZSwgZGVmYXVsdE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgTmV3Q29tcG9uZW50V2l0aENoaWxkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSwgTGlzdCB1c2VkTmFtZXMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIHRpdGxlLCBkZWZhdWx0TmFtZSwgdXNlZE5hbWVzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNoaWxkID0gbmV3IENvbXBvc2l0ZSAocGFyZW50LCBTV1QuTk9ORSk7Ci0JICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCSAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkgICAgY2hpbGQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCSAgICBjcmVhdGVNZXNzYWdlQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNoaWxkLCBTV1QuQ0hFQ0spOwotCSAgICBjcmVhdGVNZXNzYWdlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOwotCSAgICBjcmVhdGVNZXNzYWdlQ2hlY2tCb3guc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9DUkVBVEVfTUVTU0FHRV9DSEVDS0JPWF9MQUJFTCIpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVTdWJDb21wb25lbnRzKCkgewotCQlyZXR1cm4gY3JlYXRlTWVzc2FnZUJvb2xlYW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQljcmVhdGVNZXNzYWdlQm9vbGVhbiA9IGNyZWF0ZU1lc3NhZ2VDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3RvY29sQ29tcG9uZW50Q29udHJvbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qcm90b2NvbENvbXBvbmVudENvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiOWEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3RvY29sQ29tcG9uZW50Q29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5BYnN0cmFjdEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLnVpLkNvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQWJzdHJhY3RHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCi0gIHByb3RlY3RlZCBUZXh0IGNvbXBvbmVudE5hbWVGaWVsZDsKLSAgcHJvdGVjdGVkIENvbWJvIHJlZk5hbWVDb21ibzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiByZWZCcm93c2VCdXR0b247Ci0gIHByb3RlY3RlZCBDb21ibyBwcm90b2NvbENvbWJvOwotICBwcm90ZWN0ZWQgQnV0dG9uIG92ZXJ3cml0ZUJ1dHRvbjsKLSAgcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGVtcHR5U2V0dGluZ3NQYWdlOwotICBwcm90ZWN0ZWQgTWFwIHBhZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gIC8vcHJvdGVjdGVkIGJvb2xlYW4gaXNCaW5kaW5nQ29tcG9uZW50ID0gdHJ1ZTsKLSAgLy9wcm90ZWN0ZWQgYm9vbGVhbiBpc05ld0NvbXBvbmVudCA9IHRydWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyByZWZOYW1lOwotCi0gIHByb3RlY3RlZCBTdHJpbmcgVU5TUEVDSUZJRUQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9VTlNQRUNJRklFRCIpOwotICAvL3Byb3RlY3RlZCBCaW5kaW5nR2VuZXJhdG9yIGJpbmRpbmdHZW5lcmF0b3I7Ci0KLSAgcHVibGljIFByb3RvY29sQ29tcG9uZW50Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBBYnN0cmFjdEdlbmVyYXRvciBnZW5lcmF0b3IsIGJvb2xlYW4gc2hvd092ZXJ3cml0ZUJ1dHRvbikKLSAgewotICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotICAgIC8vdGhpcy5pc0JpbmRpbmdDb21wb25lbnQgPSBpc0JpbmRpbmdDb21wb25lbnQ7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBzZXRMYXlvdXQobGF5b3V0KTsKLSAgICBzZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKHRydWUsIDEpKTsKLQotICAgIENvbXBvc2l0ZSBsYWJlbFZhbHVlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgbGFiZWxWYWx1ZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICBsYWJlbFZhbHVlQ29tcG9zaXRlLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEoZmFsc2UsIDEpKTsKLQotICAgIC8vIHJvdyAxCi0gICAgLy8KLSAgICBMYWJlbCBjb21wb25lbnROYW1lTGFiZWwgPSBuZXcgTGFiZWwobGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGNvbXBvbmVudE5hbWVMYWJlbC5zZXRUZXh0KGdldENvbXBvbmVudE5hbWVMYWJlbFRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGNvbXBvbmVudE5hbWVGaWVsZCA9IG5ldyBUZXh0KGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgIEdyaWREYXRhIGdkTmFtZT0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2ROYW1lLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2ROYW1lLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgY29tcG9uZW50TmFtZUZpZWxkLnNldExheW91dERhdGEoZ2ROYW1lKTsKLSAgICBjb21wb25lbnROYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0gICAgLy9jcmVhdGVQbGFjZUhvbGRlcihsYWJlbFZhbHVlQ29tcG9zaXRlKTsKLQotICAgIC8vIHJvdyAyCi0gICAgLy8KLSAgICBMYWJlbCByZWZOYW1lTGFiZWwgPSBuZXcgTGFiZWwobGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHJlZk5hbWVMYWJlbC5zZXRUZXh0KGdldFJlZk5hbWVMYWJlbFRleHQoKSk7IC8vJE5PTi1OTFMtMSQJCi0gICAgcmVmTmFtZUNvbWJvID0gbmV3IENvbWJvKGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotICAgIEdyaWREYXRhIGdkUmVmTmFtZT0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2RSZWZOYW1lLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RSZWZOYW1lLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgcmVmTmFtZUNvbWJvLnNldExheW91dERhdGEoZ2RSZWZOYW1lKTsKLSAgICByZWZOYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvL3JlZkJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24obGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIC8vcmVmQnJvd3NlQnV0dG9uLnNldFRleHQoIiAgLi4uICAiKTsKLSAgICAvL0dyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgLy9nZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgLy9nZC5oZWlnaHRIaW50ID0gMTc7Ci0gICAgLy9nZC53aWR0aEhpbnQgPSAyNDsKLSAgICAvL3JlZkJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAvL3JlZkJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAvL2NyZWF0ZVBsYWNlSG9sZGVyKGxhYmVsVmFsdWVDb21wb3NpdGUpOwotCi0gICAgLy8gcm93IDMKLSAgICAvLwotICAgIExhYmVsIHByb3RvY29sTGFiZWwgPSBuZXcgTGFiZWwobGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHByb3RvY29sTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX1BST1RPQ09MIikpOyAvLyROT04tTkxTLTEkCi0gICAgcHJvdG9jb2xDb21ibyA9IG5ldyBDb21ibyhsYWJlbFZhbHVlQ29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLSAgICBHcmlkRGF0YSBnZFByb3RvY29sPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZFByb3RvY29sLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RQcm90b2NvbC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHByb3RvY29sQ29tYm8uc2V0TGF5b3V0RGF0YShnZFByb3RvY29sKTsKLSAgICBwcm90b2NvbENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIC8vY3JlYXRlUGxhY2VIb2xkZXIobGFiZWxWYWx1ZUNvbXBvc2l0ZSk7Ci0KLSAgICAvLyBvcHRpb25hbCBvdmVyd3JpdGUgYnV0dG9uCi0gICAgLy8KLSAgICBpZiAoc2hvd092ZXJ3cml0ZUJ1dHRvbikKLSAgICB7Ci0gICAgICBvdmVyd3JpdGVCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7Ci0gICAgICBvdmVyd3JpdGVCdXR0b24uc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9DSEVDS0JPWF9PVkVSV1JJVEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvLyBwcm90b2NvbCBzcGVjaWZpYyBzZXR0aW5ncwotICAgIC8vCi0gICAgcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotICAgIEdyaWREYXRhIGdkRmlsbD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2RGaWxsLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RGaWxsLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgZ2RGaWxsLnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkRmlsbC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLSAgICBwYWdlQm9vay5zZXRMYXlvdXREYXRhKGdkRmlsbCk7Ci0KLSAgICBlbXB0eVNldHRpbmdzUGFnZSA9IG5ldyBDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OT05FKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykKLSAgICB7Ci0gICAgICBMYWJlbCBwbGFjZUhvbGRlciA9IG5ldyBMYWJlbChlbXB0eVNldHRpbmdzUGFnZSwgU1dULk5PTkUpOwotICAgIH0KLQotICAgIHVwZGF0ZVBhZ2VCb29rKGdlbmVyYXRvci5nZXRQcm90b2NvbCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXRGaWVsZHMoKQotICB7Ci0gICAgLy8gcHJpbWUgdGhlIGZpZWxkcwotICAgIC8vCi0gICAgY29tcG9uZW50TmFtZUZpZWxkLnNldFRleHQoZ2V0RGVmYXVsdE5hbWUoKSk7Ci0gICAgdXBkYXRlUmVmTmFtZUNvbWJvKCk7Ci0gICAgdXBkYXRlUHJvdG9jb2xDb21ibygpOwotICB9Ci0KLSAgcHVibGljIFRleHQgZ2V0Q29tcG9uZW50TmFtZUZpZWxkKCkKLSAgewotICAgIHJldHVybiBjb21wb25lbnROYW1lRmllbGQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWVMYWJlbFRleHQoKQotICB7Ci0gICAgcmV0dXJuICJOYW1lIjsKLSAgfQotCi0gIHByaXZhdGUgR3JpZERhdGEgY3JlYXRlR3JpZERhdGEoYm9vbGVhbiBib3RoLCBpbnQgc3BhbikKLSAgewotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGJvdGggPyBHcmlkRGF0YS5GSUxMX0JPVEggOiBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLSAgICByZXR1cm4gZ2Q7Ci0gIH0KLQotICBwcml2YXRlIENvbnRyb2wgY3JlYXRlUGxhY2VIb2xkZXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotICBwdWJsaWMgQWJzdHJhY3RHZW5lcmF0b3IgZ2V0R2VuZXJhdG9yKCkKLSAgewotICAgIHJldHVybiBnZW5lcmF0b3I7Ci0gIH0KLQotICAvLyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG92ZXJ3cml0ZUJ1dHRvbiAmJiBvdmVyd3JpdGVCdXR0b24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRHZW5lcmF0b3IoKS5zZXRPdmVyd3JpdGUob3ZlcndyaXRlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHJlZk5hbWVDb21ibykKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSByZWZOYW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIFN0cmluZyByZWZOYW1lID0gcmVmTmFtZUNvbWJvLmdldEl0ZW0oaW5kZXgpOwotICAgICAgZ2V0R2VuZXJhdG9yKCkuc2V0UmVmTmFtZShyZWZOYW1lKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHByb3RvY29sQ29tYm8pCi0gICAgewotICAgICAgaW50IGluZGV4ID0gcHJvdG9jb2xDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgU3RyaW5nIHByb3RvY29sID0gKGluZGV4ICE9IC0xKSA/IHByb3RvY29sQ29tYm8uZ2V0SXRlbShpbmRleCkgOiBudWxsOwotICAgICAgZ2V0R2VuZXJhdG9yKCkuc2V0UHJvdG9jb2wocHJvdG9jb2wpOwotICAgICAgZ2V0R2VuZXJhdG9yKCkuc2V0T3B0aW9ucyhudWxsKTsKLSAgICAgIHVwZGF0ZVBhZ2VCb29rKHByb3RvY29sKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfT1ZFUldSSVRFX0FQUExJQ0FCTEUgPSAiSVNfT1ZFUldSSVRFX0FQUExJQ0FCTEUiOwotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlQm9vayhTdHJpbmcgcHJvdG9jb2wpCi0gIHsKLSAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgcGFnZU1hcC5nZXQocHJvdG9jb2wpOwotICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIG9wdGlvbnNQYWdlID0gY3JlYXRlQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKHByb3RvY29sKTsKLQotICAgICAgICBpZiAob3B0aW9uc1BhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG9wdGlvbnNQYWdlLmluaXQoZ2V0R2VuZXJhdG9yKCkpOwotICAgICAgICAgIGNvbnRyb2wgPSBvcHRpb25zUGFnZS5jcmVhdGVDb250cm9sKHBhZ2VCb29rKTsKLSAgICAgICAgICBjb250cm9sLnNldERhdGEoSVNfT1ZFUldSSVRFX0FQUExJQ0FCTEUsIG5ldyBCb29sZWFuKG9wdGlvbnNQYWdlLmlzT3ZlcndyaXRlQXBwbGljYWJsZSgpKSk7Ci0gICAgICAgICAgcGFnZU1hcC5wdXQocHJvdG9jb2wsIGNvbnRyb2wpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBhZ2VNYXAucHV0KHByb3RvY29sLCBjb250cm9sKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBib29sZWFuIGVuYWJsZU92ZXJ3cml0ZUJ1dHRvbiA9IHRydWU7Ci0gICAgICBpZiAoY29udHJvbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAob3ZlcndyaXRlQnV0dG9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBCb29sZWFuIGRhdGEgPSAoQm9vbGVhbikgY29udHJvbC5nZXREYXRhKElTX09WRVJXUklURV9BUFBMSUNBQkxFKTsKLSAgICAgICAgICBlbmFibGVPdmVyd3JpdGVCdXR0b24gPSBkYXRhID09IG51bGwgfHwgZGF0YS5lcXVhbHMoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotICAgICAgICBwYWdlQm9vay5zaG93UGFnZShjb250cm9sKTsKLSAgICAgICAgcGFnZUJvb2subGF5b3V0KCk7Ci0gICAgICAgIHBhZ2VCb29rLmdldFBhcmVudCgpLmxheW91dCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwYWdlQm9vay5zaG93UGFnZShlbXB0eVNldHRpbmdzUGFnZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvdmVyd3JpdGVCdXR0b24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVuYWJsZU92ZXJ3cml0ZUJ1dHRvbikKLSAgICAgICAgewotICAgICAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZ2VuZXJhdG9yLmdldE92ZXJ3cml0ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBvdmVyd3JpdGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgb3ZlcndyaXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb3RvY29sQ29tYm8oKQotICB7Ci0gICAgcHJvdG9jb2xDb21iby5yZW1vdmVBbGwoKTsKLQotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChVTlNQRUNJRklFRCk7Ci0gICAgbGlzdC5hZGRBbGwoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpLmdldEJpbmRpbmdFeHRlbnNpb25OYW1lcygpKTsKLQotICAgIFN0cmluZyBwcm90b2NvbFRleHQgPSBnZW5lcmF0b3IuZ2V0UHJvdG9jb2woKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyBwcm90b2NvbCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgcHJvdG9jb2xDb21iby5hZGQocHJvdG9jb2wpOwotICAgIH0KLQotICAgIGlmIChwcm90b2NvbFRleHQgPT0gbnVsbCAmJiBwcm90b2NvbENvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICB7Ci0gICAgICBwcm90b2NvbFRleHQgPSBwcm90b2NvbENvbWJvLmdldEl0ZW0oMCk7Ci0gICAgICBnZW5lcmF0b3Iuc2V0UHJvdG9jb2woIVVOU1BFQ0lGSUVELmVxdWFscyhwcm90b2NvbFRleHQpID8gcHJvdG9jb2xUZXh0IDogbnVsbCk7Ci0gICAgfQotICAgIHByb3RvY29sQ29tYm8uc2V0VGV4dChwcm90b2NvbFRleHQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVmTmFtZUNvbWJvKCkKLSAgewotICAgIHJlZk5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQotICAgIHJlZk5hbWVDb21iby5hZGQoVU5TUEVDSUZJRUQpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldFJlZk5hbWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHJlZk5hbWVDb21iby5hZGQoKFN0cmluZykgaS5uZXh0KCkpOwotICAgIH0KLQotICAgIGlmIChyZWZOYW1lQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgIHsKLSAgICAgIFN0cmluZyByZWZUZXh0ID0gZ2VuZXJhdG9yLmdldFJlZk5hbWUoKTsKLSAgICAgIHJlZk5hbWVDb21iby5zZXRUZXh0KHJlZlRleHQgIT0gbnVsbCA/IHJlZlRleHQgOiBVTlNQRUNJRklFRCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICB7Ci0gICAgZ2VuZXJhdG9yLnNldE5hbWUoY29tcG9uZW50TmFtZUZpZWxkLmdldFRleHQoKSk7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRSZWZOYW1lcygpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFJlZk5hbWVMYWJlbFRleHQoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0TmFtZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIGNyZWF0ZUNvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZShTdHJpbmcgcHJvdG9jb2wpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9CaW5kaW5nV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL0JpbmRpbmdXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyNDNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL0JpbmRpbmdXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5BYnN0cmFjdEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLkJpbmRpbmdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWkuQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0cy5Qcm90b2NvbENvbXBvbmVudENvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1dpemFyZCBleHRlbmRzIFdpemFyZAotewotICBwcm90ZWN0ZWQgQmluZGluZ0dlbmVyYXRvciBiaW5kaW5nR2VuZXJhdG9yOwotICBwcm90ZWN0ZWQgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlIHNwZWNpZnlCaW5kaW5nUGFnZTsKLQotICBwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIHByb3RlY3RlZCBpbnQga2luZDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX05FV19CSU5ESU5HID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9SRUdFTkVSQVRFX0JJTkRJTkcgPSAyOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQmluZGluZ1dpemFyZC4KLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nV2l6YXJkKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMoZGVmaW5pdGlvbiwgS0lORF9ORVdfQklORElORyk7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ1dpemFyZChEZWZpbml0aW9uIGRlZmluaXRpb24sIERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgdGhpcyhkZWZpbml0aW9uLCBLSU5EX05FV19CSU5ESU5HKTsKLSAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCaW5kaW5nV2l6YXJkKERlZmluaXRpb24gZGVmaW5pdGlvbiwgaW50IGtpbmQpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgYmluZGluZ0dlbmVyYXRvciA9IG5ldyBCaW5kaW5nR2VuZXJhdG9yKGRlZmluaXRpb24pOwotICAgIHNldFdpbmRvd1RpdGxlKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JJTkRJTkdfV0laQVJEIikpOyAvLyROT04tTkxTLTEkCi0gICAgLy9zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoV1NETEVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL05ld1hNTC5naWYiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nTmFtZShTdHJpbmcgYmluZGluZ05hbWUpCi0gIHsKLSAgICBiaW5kaW5nR2VuZXJhdG9yLnNldE5hbWUoYmluZGluZ05hbWUpOwotCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gYmluZGluZ0dlbmVyYXRvci5nZXREZWZpbml0aW9uKCk7Ci0gICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgYmluZGluZ05hbWUpOwotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBkZWZpbml0aW9uLmdldEJpbmRpbmcocW5hbWUpOwotICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBlZUxpc3QgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGlmIChlZUxpc3Quc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVlTGlzdC5nZXQoMCk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChlZSk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Gb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKLQotICAgICAgICAgIGlmIChleHRlbnNpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiaW5kaW5nR2VuZXJhdG9yLnNldFByb3RvY29sKGV4dGVuc2lvbi5nZXROYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBvcnRUeXBlTmFtZShTdHJpbmcgcG9ydFR5cGVOYW1lKQotICB7Ci0gICAgYmluZGluZ0dlbmVyYXRvci5zZXRQb3J0VHlwZU5hbWUocG9ydFR5cGVOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBCaW5kaW5nR2VuZXJhdG9yIGdldEJpbmRpbmdHZW5lcmF0b3IoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmdHZW5lcmF0b3I7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgd2l6YXJkIHNldHVwIGlzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0dXAoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpCi0gIHsKLSAgICBzcGVjaWZ5QmluZGluZ1BhZ2UgPSBuZXcgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlKCk7Ci0gICAgYWRkUGFnZShzcGVjaWZ5QmluZGluZ1BhZ2UpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IGJpbmRpbmdHZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpOwotICAJYm9vbGVhbiByZWNvcmRpbmdTdGFydGVkID0gZmFsc2U7Ci0gIAlpZiAoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkgPT0gbnVsbCB8fCAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkpIHsKLSAgCQlyZWNvcmRpbmdTdGFydGVkID0gdHJ1ZTsKLSAgCQliZWdpblJlY29yZGluZygpOwotICAJCQotICAJCS8vIENyZWF0ZSB0aGUgRGVmaW5pdGlvbnMgZWxlbWVudCB3aXRoIHByb3BlciBuYW1lc3BhY2UKLSAgCSAgICBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLSAgCSAgICBpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpCi0gIAkgICAgewotICAJICAgIAljaGFyU2V0ID0gIlVURi04IjsKLSAgCSAgICB9Ci0gIAkgICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCAidmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGNoYXJTZXQgKyAiXCIiKSk7Ci0gIAkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgid3NkbDpkZWZpbml0aW9ucyIpOyAgCQkKLSAgCQlkb2N1bWVudC5hcHBlbmRDaGlsZChyb290KTsKLQotICAJCS8vIEFkZCB2YXJpb3VzIG5hbWVzcGFjZSBhdHRyaWJ1dGVzIGhlcmUuIAotICAJCXJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczpzb2FwIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iKTsKLSAgCQlyb290LnNldEF0dHJpYnV0ZSgieG1sbnM6dG5zIiwgZ2V0RGVmYXVsdE5hbWVzcGFjZShkZWZpbml0aW9uKSk7Ci0gIAkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOndzZGwiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iKTsKLSAgCQlyb290LnNldEF0dHJpYnV0ZSgieG1sbnM6eHNkIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gIAkJcm9vdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBnZXRGaWxlTmFtZShkZWZpbml0aW9uKSk7Ci0gIAkJcm9vdC5zZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIGdldERlZmF1bHROYW1lc3BhY2UoZGVmaW5pdGlvbikpOwotCi0gIAkJZGVmaW5pdGlvbi5zZXRFbGVtZW50KHJvb3QpOwkKLSAgCX0KLSAgCQotICAgIGJpbmRpbmdHZW5lcmF0b3IuZ2VuZXJhdGUoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBiaW5kaW5nR2VuZXJhdG9yLmdldE5ld0NvbXBvbmVudCgpOwotICAgICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgZWRpdG9yUGFydC5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGZpbmFsbHkgewotICAgIAlpZiAocmVjb3JkaW5nU3RhcnRlZCkKLSAgICAJCWVuZFJlY29yZGluZygpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UiKSk7Ci0gICAgaWYgKCFuYW1lc3BhY2UuZW5kc1dpdGgoIi8iKSkgewotICAgIAluYW1lc3BhY2UgPSBuYW1lc3BhY2UuY29uY2F0KCIvIik7Ci0gICAgfQotICAgIAotICAgIG5hbWVzcGFjZSArPSBnZXRGaWxlTmFtZShkZWZpbml0aW9uKSArICIvIjsKLQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEZpbGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgIFN0cmluZyBmaWxlTG9jYXRpb24gPSBkZWZpbml0aW9uLmdldExvY2F0aW9uKCk7Ci0gIAlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVMb2NhdGlvbik7Ci0gIAlyZXR1cm4gZmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCkudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKCkgewotICAgIE5vZGUgbm9kZSA9IGRvY3VtZW50OwotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfQklORElORyIpKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGVuZFJlY29yZGluZygpIHsKLSAgICBOb2RlIG5vZGUgPSBkb2N1bWVudDsgCi0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICAoKElET01Ob2RlKW5vZGUpLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOyAgCi0gICAgfQotICB9Ci0KLSAgY2xhc3MgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotICB7Ci0gICAgcHJvdGVjdGVkIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBwcm90b2NvbENvbXBvbmVudENvbnRyb2w7Ci0KLSAgICBwdWJsaWMgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlKCkKLSAgICB7Ci0gICAgICBzdXBlcigiU3BlY2lmeUJpbmRpbmdQYWdlIik7Ci0gICAgICBzZXRUaXRsZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9TUEVDSUZZX0JJTkRJTkdfREVUQUlMUyIpKTsKLSAgICAgIHNldERlc2NyaXB0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1NQRUNJRllfQklORElOR19ERVRBSUxTX0xBQkVMIikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBCaW5kaW5nR2VuZXJhdG9yIGdldEJpbmRpbmdHZW5lcmF0b3IoKQotICAgIHsKLSAgICAgIHJldHVybiAoKEJpbmRpbmdXaXphcmQpIGdldFdpemFyZCgpKS5nZXRCaW5kaW5nR2VuZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBwcm90b2NvbENvbXBvbmVudENvbnRyb2wgPSBuZXcgQmluZGluZ1Byb3RvY29sQ29tcG9uZW50Q29udHJvbChwYXJlbnQsIGJpbmRpbmdHZW5lcmF0b3IsIGtpbmQgPT0gS0lORF9SRUdFTkVSQVRFX0JJTkRJTkcpOwotICAgICAgcHJvdG9jb2xDb21wb25lbnRDb250cm9sLmluaXRGaWVsZHMoKTsKLSAgICAgIHNldENvbnRyb2wocHJvdG9jb2xDb21wb25lbnRDb250cm9sKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIEJpbmRpbmdQcm90b2NvbENvbXBvbmVudENvbnRyb2wgZXh0ZW5kcyBQcm90b2NvbENvbXBvbmVudENvbnRyb2wKLSAgewotICAgIHB1YmxpYyBCaW5kaW5nUHJvdG9jb2xDb21wb25lbnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICB7Ci0gICAgICB0aGlzKHBhcmVudCwgZ2VuZXJhdG9yLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJpbmRpbmdQcm90b2NvbENvbXBvbmVudENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgQWJzdHJhY3RHZW5lcmF0b3IgZ2VuZXJhdG9yLCBib29sZWFuIHNob3dPdmVyd3JpdGVCdXR0b24pCi0gICAgewotICAgICAgc3VwZXIocGFyZW50LCBnZW5lcmF0b3IsIHNob3dPdmVyd3JpdGVCdXR0b24pOwotCi0gICAgICBpZiAoZ2VuZXJhdG9yLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb21wb25lbnROYW1lRmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmTmFtZUxhYmVsVGV4dCgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BPUlRfVFlQRSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFJlZk5hbWVzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZ2VuZXJhdG9yLmdldERlZmluaXRpb24oKSkuZ2V0UG9ydFR5cGVOYW1lcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKQotICAgIHsKLSAgICAgIFN0cmluZyBiaW5kaW5nTmFtZSA9IGdlbmVyYXRvci5nZXROYW1lKCk7Ci0gICAgICByZXR1cm4gYmluZGluZ05hbWUgIT0gbnVsbCA/IGJpbmRpbmdOYW1lIDogTmFtZVV0aWwuYnVpbGRVbmlxdWVCaW5kaW5nTmFtZShnZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIGNyZWF0ZUNvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZShTdHJpbmcgcHJvdG9jb2wpCi0gICAgewotICAgICAgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIG9wdGlvbnNQYWdlID0gbnVsbDsKLSAgICAgIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24gZXh0ZW5zaW9uID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24ocHJvdG9jb2wpOwotICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBvcHRpb25zUGFnZSA9IGV4dGVuc2lvbi5jcmVhdGVCaW5kaW5nQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gb3B0aW9uc1BhZ2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05hbWVzcGFjZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05hbWVzcGFjZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYTg0OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnZpZXdlcnMuTmF2aWdhYmxlVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRpYWxvZ3MuRWRpdE5hbWVzcGFjZUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kaWFsb2dzLlVwZGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkudXRpbC5YTUxDb21tb25SZXNvdXJjZXM7Ci0gCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlVGFibGUgZXh0ZW5kcyBDb21wb3NpdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSSA9IFhNTENvbW1vblJlc291cmNlcy5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfTEFCRUxfUFJFRklYIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NFTEVDVCIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gIHByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IFZlY3RvcigpOwotICBwcm90ZWN0ZWQgTGlzdCBjaGVja2VkTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJvdGVjdGVkIE5hbWVzcGFjZU5hdmlnYWJsZVRhYmxlVmlld2VyIHRhYmxlVmlld2VyOyAgICAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBhZGRCdXR0b247Ci0KLSAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBVcGRhdGVMaXN0ZW5lciB1cGRhdGVMaXN0ZW5lcjsgICAKLSAgcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247ICAKLSAgcHJvdGVjdGVkIGludCB2aXNpYmxlUm93cyA9IC0xOyAgCi0gIHByb3RlY3RlZCBib29sZWFuIGR1bW15Um93c1JlbW92ZWQgPSBmYWxzZTsKLSAgVGFibGUgdGFibGU7Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgIAotICAgIHRoaXMocGFyZW50LCAtMSwgLTEsIC0xKTsKLSAgfSAgICAKLQotICBwdWJsaWMgTmFtZXNwYWNlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzKQotICB7Ci0gICAgdGhpcyhwYXJlbnQsIC0xLCAtMSwgdmlzaWJsZVJvd3MpOwotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50KQotICB7Ci0gICAgdGhpcyhwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgLTEpOwotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgdmlzaWJsZVJvd3MpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzZXRMYXlvdXQoY3JlYXRlR3JpZExheW91dCgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBHcmlkRGF0YSBmaWxsR0Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGZpbGxHRC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGZpbGxHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGZpbGxHRC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBmaWxsR0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0gICAgCi0gICAgc2V0TGF5b3V0RGF0YShmaWxsR0QpOyAgICAgICAgICAgICAKLSAgICAKLSAgICBHcm91cCBuYW1lc3BhY2VJbmZvR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotICAgIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRV9VUklTX1RPX0JFX0lOQ0xVREVEIikpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsgICAKLSAgICBHcmlkRGF0YSBnZCA9IGZpbGxHRDsKLSAgICBpZiAod2lkdGhIaW50ICE9IC0xKQotICAgIHsKLSAgICAgIGdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLSAgICB9ICAgCi0gICAgaWYgKGhlaWdodEhpbnQgIT0gLTEpCi0gICAgewotICAgICAgZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0gICAgfQotICAgIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRMYXlvdXREYXRhKGdkKTsgCi0gICAgLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAobmFtZXNwYWNlSW5mb0dyb3VwLCBuZXcgQ29udHJvbENvbnRleHRDb21wdXRlcihuYW1lc3BhY2VJbmZvR3JvdXAsIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTENfTkFNRVNQQUNFX0dST1VQKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZ1tdIHRpdGxlQXJyYXkgPSB7SU5DTFVERSwgUFJFRklYLCBOQU1FU1BBQ0VfVVJJfTsKLQotICAgIHRhYmxlID0gbmV3IFRhYmxlKG5hbWVzcGFjZUluZm9Hcm91cCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIAotICAgIHRhYmxlLnNldExheW91dERhdGEoZmlsbEdEKTsKLSAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgdGFibGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKQotICAgICAgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0gICAgICAgIGlmIChpdGVtICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRhYmxlRWxlbWVudCBob2xkZXIgPSAoVGFibGVFbGVtZW50KW9iajsKLSAgICAgICAgICAgIFRhYmxlQ29sdW1uIGNvbCA9IHRhYmxlLmdldENvbHVtbigwKTsKLSAgICAgICAgICAgIGlmIChlLnggPCBjb2wuZ2V0V2lkdGgoKSkgLy8gaWYgdGhlIHBvaW50IGZhbGxzIHdpdGhpbiB0aGUgU2VsZWN0IGNvbHVtbiB0aGVuIHBlcmZvcm0gY2hlY2svdW5jaGVjawotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFN0YXRlID0gaG9sZGVyLmdldENoZWNrZWQoKTsKLSAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZS5lcXVhbHMoInRydWUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaG9sZGVyLnNldENoZWNrZWQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBjaGVja2VkTGlzdC5zZXQoaG9sZGVyLmdldEluZGV4KCksICJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50U3RhdGUuZXF1YWxzKCJmYWxzZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgidHJ1ZSIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGNoZWNrZWRMaXN0LnNldChob2xkZXIuZ2V0SW5kZXgoKSwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHRhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgaWYgKHVwZGF0ZUxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0YWJsZVZpZXdlciA9IG5ldyBOYW1lc3BhY2VOYXZpZ2FibGVUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgcHJvdmlkZXIgPSBuZXcgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcigpOwotICAgIHRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7ICAgCi0gICAgdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0gICAgdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyh0aXRsZUFycmF5KTsKLSAgICB0YWJsZVZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50W10gd2lkdGhBcnJheSA9IHsxMCwgMjAsIDUwfTsKLSAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsgIAotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aXRsZUFycmF5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0gICAgICBjb2x1bW4uc2V0VGV4dCh0aXRsZUFycmF5W2ldKTsKLSAgICAgIGNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEod2lkdGhBcnJheVtpXSwgdHJ1ZSkpOwotICAgIH0gICAgICAgICAKLSAgICB0aGlzLnZpc2libGVSb3dzID0gdmlzaWJsZVJvd3M7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlUm93czsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOyAKLSAgICAgIGl0ZW0uc2V0VGV4dCgiIyMjIyMjIyIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHRhYmxlLnNldExheW91dChsYXlvdXQpOyAgCi0gICAgCi0gICAgQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbdGl0bGVBcnJheS5sZW5ndGhdOwotICAgIGNlbGxFZGl0b3JzWzBdID0gbmV3IE5hbWVzcGFjZUluZm9DaGVja2JveENlbGxFZGl0b3IodGFibGUpOwotICAgIGNlbGxFZGl0b3JzWzFdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLSAgICB0YWJsZVZpZXdlci5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0KLS8vICAgIGNyZWF0ZUJ1dHRvbnMobmFtZXNwYWNlSW5mb0dyb3VwKTsgICAgICAgICAgICAKLQotICAgIGluaXRpYWxpemUoKTsgICAgCi0gIH0gICAgCi0KLSAgcHVibGljIHZvaWQgc2V0VXBkYXRlTGlzdGVuZXIoVXBkYXRlTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXIpCi0gIHsKLSAgICB0aGlzLnVwZGF0ZUxpc3RlbmVyID0gdXBkYXRlTGlzdGVuZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IG5hbWVzcGFjZUluZm9MaXN0KQotICB7ICAgIAotICAgIHRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTGlzdDsKLSAgICB1cGRhdGUoKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotICB9ICAKLQotICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VDaGVja2VkTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gY2hlY2tlZExpc3Q7Ci0gIH0gIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETFByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gKChOYW1lc3BhY2VJbmZvKShuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCkpKS5wcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvY2F0aW9uKElQYXRoIHJlc291cmNlTG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIEdyaWRMYXlvdXQgY3JlYXRlR3JpZExheW91dCgpCi0gIHsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgIHJldHVybiBncmlkTGF5b3V0OwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKQotICB7Ci0gICAgLy8gYmV0dGVyIHdheSB0byBkbyB0aGlzLi4uLgotICAgIE5hbWVzcGFjZUluZm8gaW5mbzEgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm8xLnByZWZpeCA9ICJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm8xLnVyaSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzEpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvMiA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgaW5mbzIucHJlZml4ID0gInNvYXAiOyAvLyROT04tTkxTLTEkCi0gICAgaW5mbzIudXJpID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm8yKTsKLSAgICBjaGVja2VkTGlzdC5hZGQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBOYW1lc3BhY2VJbmZvIGluZm8zID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBpbmZvMy5wcmVmaXggPSAiaHR0cCI7ICAvLyROT04tTkxTLTEkCi0gICAgaW5mbzMudXJpID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm8zKTsKLSAgICBjaGVja2VkTGlzdC5hZGQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBOYW1lc3BhY2VJbmZvIGluZm80ID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBpbmZvNC5wcmVmaXggPSAibWltZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbmZvNC51cmkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzQpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzUgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm81LnByZWZpeCA9ICJzb2FwZW5jIjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm81LnVyaSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzUpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzYgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm82LnByZWZpeCA9ICJzb2FwZW52IjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm82LnVyaSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzYpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzcgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm83LnByZWZpeCA9ICJ4c2kiOyAvLyROT04tTkxTLTEkCi0gICAgaW5mbzcudXJpID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvNyk7Ci0gICAgY2hlY2tlZExpc3QuYWRkKCJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvOCA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgaW5mbzgucHJlZml4ID0gInhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbmZvOC51cmkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm84KTsKLSAgICBjaGVja2VkTGlzdC5hZGQoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgIHVwZGF0ZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZERhdGEgaEZpbGxHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGhGaWxsR0QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBoRmlsbEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgCi0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoaEZpbGxHRCk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIAotICAgIEJ1dHRvbiBoaWRkZW5CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGhpZGRlbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBoaWRkZW5CdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgaGlkZGVuQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsgIAotICAgICAgICBpZiAoZS53aWRnZXQgPT0gYWRkQnV0dG9uKQotICAgICAgICB7Ci0gICAgICAgICAgcGVyZm9ybU5ldygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsgICAKLSAgICAKLSAgICAvLyBjcmVhdGUgYSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgdGhyZWUgYnV0dG9ucwotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoaEZpbGxHRCk7Ci0gICAgR3JpZExheW91dCBidXR0b25HcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBidXR0b25HcmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGJ1dHRvbkdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkdyaWRMYXlvdXQpOwotCi0gICAgLy8gYWRkIHRoZSBOZXcgYnV0dG9uCi0gICAgLy8KLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0gICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBhZGRCdXR0b24uc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREIikpOyAvLyROT04tTkxTLTEkCi0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZ2QpOy8vVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1OZXcoKQotICB7Ci0gICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBpbnZva2VEaWFsb2coWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTiIpLCBpbmZvKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IERpYWxvZy5PSykKLSAgICB7Ci0gICAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0gICAgICBjaGVja2VkTGlzdC5hZGQoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKTsKLSAgICB9Ci0gIH0gCi0gICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbykKLSAgewotICAgIFNoZWxsIHNoZWxsID0gWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgICBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2coc2hlbGwsIGluZm8pOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0gICAgZGlhbG9nLm9wZW4oKTsgICAgICAKLSAgICByZXR1cm4gZGlhbG9nOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKQotICB7Ci0gICAgUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0KLSAgICBpZiAodXBkYXRlTGlzdGVuZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICB9Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gZ2V0VGFyZ2V0TmFtZXNwYWNlSW5mbygpCi0gIHsKLSAgICByZXR1cm4gKG5hbWVzcGFjZUluZm9MaXN0ICE9IG51bGwgJiYgbmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpID4gMCkgPyAKLSAgICAgICAgICAgKE5hbWVzcGFjZUluZm8pbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApIDoKLSAgICAgICAgICAgbnVsbDsKLSAgfSAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIHVwZGF0ZUhlbHBlcihuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCB1cGRhdGVIZWxwZXIoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHZpc2libGVSb3dzICE9IC0xICYmICFkdW1teVJvd3NSZW1vdmVkKQotICAgIHsKLS8vICAgICAgZHVtbXlSb3dzUmVtb3ZlZCA9IHRydWU7Ci0vLyAgICAgIHRhYmxlVmlld2VyLmdldFRhYmxlKCkucmVtb3ZlQWxsKCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotICAgIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb0NoZWNrYm94Q2VsbEVkaXRvciBleHRlbmRzIENoZWNrYm94Q2VsbEVkaXRvciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyBOYW1lc3BhY2VJbmZvQ2hlY2tib3hDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgc3VwZXIocGFyZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICAgIHsKLSAgICAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRGb2N1c0NvbnRyb2woKS5yZWRyYXcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSAgIAotICAgIHsgICAgICAKLSAgICAgIGlmICh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9ICAgIAotICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7fQotICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7fQotCi0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyCi0gIHsKLSAgICBwdWJsaWMgTmFtZXNwYWNlSW5mb0NlbGxNb2RpZmllcigpCi0gICAgewotICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKFBSRUZJWCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBpbnQgY29sdW1uID0gMDsKLSAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICB7Ci0gICAgICAgIGNvbHVtbiA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoUFJFRklYKSkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhOQU1FU1BBQ0VfVVJJKSkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uID0gMjsKLSAgICAgIH0KLQotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBwcm92aWRlci5nZXRDb2x1bW5UZXh0KGVsZW1lbnQsIGNvbHVtbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWVsZW1lbnQ7Ci0gICAgICBpZiAoaXRlbSAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFRhYmxlRWxlbWVudCBob2xkZXIgPSAoVGFibGVFbGVtZW50KW9iajsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBob2xkZXIuZ2V0TmFtZXNwYWNlSW5mbygpOwotICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoQm9vbGVhbil2YWx1ZSkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgidHJ1ZSIpOwotICAgICAgICAgICAgICAgIGNoZWNrZWRMaXN0LnNldChob2xkZXIuZ2V0SW5kZXgoKSwgInRydWUiKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgiZmFsc2UiKTsKLSAgICAgICAgICAgICAgICBjaGVja2VkTGlzdC5zZXQoaG9sZGVyLmdldEluZGV4KCksICJmYWxzZSIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhQUkVGSVgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluZm8ucHJlZml4ID0gKChTdHJpbmcpdmFsdWUpLnRyaW0oKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0gICAgICAgICAgaWYgKHVwZGF0ZUxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlTGlzdGVuZXIudXBkYXRlT2NjdXJlZCh0aGlzLCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gICAgICAgICAgfQotCi0vLyAgICAgICAgICBwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgICAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBjbGFzcyBUYWJsZUVsZW1lbnQKLSAgewotICAgIE5hbWVzcGFjZUluZm8gaW5mbzsKLSAgICBpbnQgaW5kZXg7Ci0gICAgU3RyaW5nIGNoZWNrZWQgPSAidHJ1ZSI7Ci0gICAgCi0gICAgVGFibGVFbGVtZW50KE5hbWVzcGFjZUluZm8gaW5mbywgaW50IGluZGV4KQotICAgIHsKLSAgICAgIHRoaXMuaW5mbyA9IGluZm87Ci0gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm8oKQotICAgIHsKLSAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hlY2tlZCgpCi0gICAgewotICAgICAgcmV0dXJuIGNoZWNrZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoU3RyaW5nIGNoZWNrZWQpCi0gICAgewotICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKW5hbWVzcGFjZUluZm9MaXN0LmdldChpKTsKLSAgICAgICAgVGFibGVFbGVtZW50IGhvbGRlciA9IG5ldyBUYWJsZUVsZW1lbnQoaW5mbywgaSk7Ci0gICAgICAgIGhvbGRlci5zZXRDaGVja2VkKChTdHJpbmcpY2hlY2tlZExpc3QuZ2V0KGkpKTsKLSAgICAgICAgdi5hZGQoaG9sZGVyKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2LnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbikKLSAgICB7Ci0gICAgICBUYWJsZUVsZW1lbnQgaG9sZGVyID0gKFRhYmxlRWxlbWVudClvYmplY3Q7Ci0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBob2xkZXIuZ2V0TmFtZXNwYWNlSW5mbygpOwotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBzd2l0Y2ggKGNvbHVtbikKLSAgICAgIHsKLSAgICAgICAgY2FzZSAxOiB7IHJlc3VsdCA9IGluZm8ucHJlZml4OyBicmVhazsgfQotICAgICAgICBjYXNlIDI6IHsgcmVzdWx0ID0gaW5mby51cmk7IGJyZWFrOyB9Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdC50cmltKCkgOiAiIjsKLSAgICAgIGlmIChyZXN1bHQuZXF1YWxzKCIiKSkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgCi0gICAgICAgICAgICByZXN1bHQgPSBYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9OT19OQU1FU1BBQ0VfTkFNRSIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYnJlYWs7IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLS8vICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRQcmVmaXgoKQotLy8gICAgewotLy8gICAgICBTdHJpbmcgZGVmYXVsdFByZWZpeCA9ICJwIjsKLS8vICAgICAgaWYgKG5hbWVzcGFjZUluZm9MaXN0ID09IG51bGwpCi0vLyAgICAgICAgcmV0dXJuIGRlZmF1bHRQcmVmaXg7Ci0vLwotLy8gICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLS8vICAgICAgZm9yIChpbnQgaT0wOyBpPG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKTsgaSsrKQotLy8gICAgICB7Ci0vLyAgICAgICAgTmFtZXNwYWNlSW5mbyBuc2luZm8gPSAoTmFtZXNwYWNlSW5mbyluYW1lc3BhY2VJbmZvTGlzdC5nZXQoaSk7Ci0vLyAgICAgICAgaWYgKG5zaW5mby5wcmVmaXggIT0gbnVsbCkKLS8vICAgICAgICAgIHYuYWRkRWxlbWVudChuc2luZm8ucHJlZml4KTsKLS8vICAgICAgfQotLy8KLS8vICAgICAgaWYgKHYuY29udGFpbnMoZGVmYXVsdFByZWZpeCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBTdHJpbmcgcyA9IGRlZmF1bHRQcmVmaXg7Ci0vLyAgICAgICAgZm9yIChpbnQgaj0wOyB2LmNvbnRhaW5zKHMpOyBqKyspCi0vLyAgICAgICAgewotLy8gICAgICAgICAgcyA9IGRlZmF1bHRQcmVmaXggKyBJbnRlZ2VyLnRvU3RyaW5nKGopOwotLy8gICAgICAgIH0KLS8vICAgICAgICByZXR1cm4gczsKLS8vICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgICAgcmV0dXJuIGRlZmF1bHRQcmVmaXg7Ci0vLyAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKSAgLy8gT3V0cHV0IENvbHVtbgotICAgICAgewotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgVGFibGVFbGVtZW50IGhvbGRlciA9IChUYWJsZUVsZW1lbnQpIG9iamVjdDsKLSAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gaG9sZGVyLmdldENoZWNrZWQoKTsKLSAgICAgICAgICBpZiAocmVzdWx0LmVxdWFscygidHJ1ZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvb3V0cHV0X3llcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvb3V0cHV0X25vLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgTmFtZXNwYWNlTmF2aWdhYmxlVGFibGVWaWV3ZXIgZXh0ZW5kcyBOYXZpZ2FibGVUYWJsZVZpZXdlcgotICB7Ci0gICAgcHVibGljIE5hbWVzcGFjZU5hdmlnYWJsZVRhYmxlVmlld2VyKFRhYmxlIHBhcmVudCkKLSAgICB7Ci0gICAgICBzdXBlcihwYXJlbnQpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdXU0RMV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1dTRExXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMzNjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1dTRExXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5CaW5kaW5nR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNyZWF0ZVdTRExFbGVtZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuRE9NVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE5ld1dTRExXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIFdTRExOZXdGaWxlUGFnZSBuZXdGaWxlUGFnZTsKLQlwcml2YXRlIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2Ugb3B0aW9uc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOZXdXU0RMV2l6YXJkLgotCSAqLwotCXB1YmxpYyBOZXdXU0RMV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSUZpbGUgZmlsZSA9IG5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgewotCQkJY2hhclNldCA9ICJVVEYtOCI7Ci0JCX0KLQotCQlTdHJpbmcgd3NkbFByZWZpeCA9ICJ3c2RsIjsKLQkJVmVjdG9yIG5hbWVzcGFjZXMgPSBvcHRpb25zUGFnZS5nZXROYW1lc3BhY2VJbmZvKCk7Ci0KLQkJU3RyaW5nIHByZWZpeCA9IG9wdGlvbnNQYWdlLmdldFByZWZpeCgpOwotCQlTdHJpbmcgZGVmaW5pdGlvbk5hbWUgPSBvcHRpb25zUGFnZS5nZXREZWZpbml0aW9uTmFtZSgpOwotCi0JCVdTRExGYWN0b3J5SW1wbCBmYWN0b3J5ID0gbmV3IFdTRExGYWN0b3J5SW1wbCgpOwotCQlEZWZpbml0aW9uSW1wbCBkZWZpbml0aW9uID0gKERlZmluaXRpb25JbXBsKSBmYWN0b3J5LmNyZWF0ZURlZmluaXRpb24oKTsKLQotCQlkZWZpbml0aW9uLnNldFRhcmdldE5hbWVzcGFjZShvcHRpb25zUGFnZS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCWRlZmluaXRpb24uc2V0TG9jYXRpb24oZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQlkZWZpbml0aW9uLnNldEVuY29kaW5nKGNoYXJTZXQpOwotCQlkZWZpbml0aW9uLnNldFFOYW1lKG5ldyBRTmFtZSh3c2RsUHJlZml4LCBkZWZpbml0aW9uTmFtZSkpOwotCQlkZWZpbml0aW9uLmFkZE5hbWVzcGFjZShwcmVmaXgsIG9wdGlvbnNQYWdlLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VzLmdldChpKTsKLQotCQkJaWYgKGluZm8ucHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmluaXRpb24uYWRkTmFtZXNwYWNlKGluZm8ucHJlZml4LCBpbmZvLnVyaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkZWZpbml0aW9uLmFkZE5hbWVzcGFjZShudWxsLCBpbmZvLnVyaSk7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJaWYgKG9wdGlvbnNQYWdlLmdldENyZWF0ZVNrZWxldG9uQm9vbGVhbigpKSB7Ci0JCQkJaWYgKG9wdGlvbnNQYWdlLmlzU29hcERvY0xpdGVyYWxQcm90b2NvbCgpKSB7Ci0JCQkJCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9JTkZPX0VMRU1FTlRfREVDTEFSQVRJT047Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX1RZUEVfT1JfREVGSU5JVElPTiA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfSU5GT19UWVBFX0RFRklOSVRJT047Ci0JCQkJfQotCi0JCQkJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuc2VydmljZU5hbWUgPSBkZWZpbml0aW9uTmFtZTsKLQkJCQlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5wb3J0TmFtZSA9IGRlZmluaXRpb25OYW1lICsgb3B0aW9uc1BhZ2UuZ2V0UHJvdG9jb2woKTsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVTZXJ2aWNlKGRlZmluaXRpb24pOwotCQkJCWRlZmluaXRpb24udXBkYXRlRWxlbWVudCh0cnVlKTsKLQotCQkJCS8vIEdlbmVyYXRlIEJpbmRpbmcKLQkJCQlCaW5kaW5nR2VuZXJhdG9yIGJpbmRpbmdHZW5lcmF0b3IgPSBuZXcgQmluZGluZ0dlbmVyYXRvcihkZWZpbml0aW9uKTsKLQkJCQlQb3J0IHBvcnQgPSAoUG9ydCkgc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQliaW5kaW5nR2VuZXJhdG9yLnNldE5hbWUoQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXROYW1lKHBvcnQuZ2V0RUJpbmRpbmcoKSkpOwotCQkJCWJpbmRpbmdHZW5lcmF0b3Iuc2V0UG9ydFR5cGVOYW1lKENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0UG9ydFR5cGVSZWZlcmVuY2UocG9ydC5nZXRFQmluZGluZygpKSk7Ci0JCQkJYmluZGluZ0dlbmVyYXRvci5zZXRQcm90b2NvbChvcHRpb25zUGFnZS5nZXRQcm90b2NvbCgpKTsKLQkJCQliaW5kaW5nR2VuZXJhdG9yLnNldE92ZXJ3cml0ZSh0cnVlKTsKLQkJCQliaW5kaW5nR2VuZXJhdG9yLnNldE9wdGlvbnMob3B0aW9uc1BhZ2UuZ2V0UHJvdG9jb2xPcHRpb25zKCkpOwotCQkJCWJpbmRpbmdHZW5lcmF0b3IuZ2VuZXJhdGUoKTsKLQotCQkJCS8vIEdlbmVyYXRlIGFkZHJlc3MKLQkJCQlTdHJpbmcgYWRkcmVzc05hbWUgPSBvcHRpb25zUGFnZS5nZXRQcm90b2NvbCgpLnRvTG93ZXJDYXNlKCkgKyAiOmFkZHJlc3MiOwotCQkJCU1hcCB0YWJsZSA9IG5ldyBIYXNodGFibGUoMSk7Ci0JCQkJU3RyaW5nIHVyaSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QUkVGX1BBR0VfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFIikpOwotCQkJCXRhYmxlLnB1dCgibG9jYXRpb24iLCB1cmkpOwotCQkJCUFkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQgYWRkRUVDb21tYW5kID0gbmV3IEFkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQocG9ydCwgIiIsIGFkZHJlc3NOYW1lLCB0YWJsZSk7Ci0JCQkJYWRkRUVDb21tYW5kLnJ1bigpOwotCi0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQlXU0RMUmVzb3VyY2VJbXBsLnNlcmlhbGl6ZShvdXRwdXRTdHJlYW0sIGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKSwgY2hhclNldCk7Ci0JCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJCQlkZWZpbml0aW9uLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCQkJV1NETFJlc291cmNlSW1wbCByZXNvdXJjZSA9IChXU0RMUmVzb3VyY2VJbXBsKSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLndzZGwiKSk7Ci0JCQkJcmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGVmaW5pdGlvbik7Ci0JCQkJcmVzb3VyY2Uuc2F2ZShudWxsKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5Db3VsZCBub3Qgd3JpdGUgbmV3IFdTREwgZmlsZSBpbiBXU0RMIFdpemFyZDogIiArIGUpOwotCQl9Ci0KLQkJLyoKLQkJICogaWYgKGZpbGUgIT0gbnVsbCkgeyBmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldwotCQkgKiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbGUpOyBpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsgSVdvcmtiZW5jaAotCQkgKiB3b3JrYmVuY2ggPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7IGZpbmFsCi0JCSAqIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0KLQkJICogd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOyBmaW5hbCBJV29ya2JlbmNoUGFydAotCQkgKiBmb2N1c1BhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsgaWYKLQkJICogKGZvY3VzUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKLQkJICogRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjIChuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJICogKChJU2V0U2VsZWN0aW9uVGFyZ2V0KWZvY3VzUGFydCkuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7IH0gfSk7IH0gfSB9Ci0JCSAqLwotCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotCi0JCS8vIE5lZWQgbmV3IGljb24KLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoV1NETEVkaXRvci5jbGFzcywgImljb25zL25ld193c2RsX3dpei5naWYiKSk7Ci0JCXRoaXMuc2V0V2luZG93VGl0bGUoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfTkVXX1dTRExfRklMRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQluZXdGaWxlUGFnZSA9IG5ldyBXU0RMTmV3RmlsZVBhZ2Uoc2VsZWN0aW9uKTsKLQkJb3B0aW9uc1BhZ2UgPSBuZXcgV1NETE5ld0ZpbGVPcHRpb25zUGFnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9PUFRJT05TIiksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX09QVElPTlMiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhZGRQYWdlKG5ld0ZpbGVQYWdlKTsKLQkJYWRkUGFnZShvcHRpb25zUGFnZSk7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldE5ld0ZpbGVQYXRoKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBuZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlyZXR1cm4gZmlsZU5hbWUgIT0gbnVsbCA/IG5ldyBQYXRoKGZpbGVOYW1lKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAobmV3RmlsZVBhZ2UuaXNQYWdlQ29tcGxldGUoKSAmJiBvcHRpb25zUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoaUZpbGUpLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvciIpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gQjJCR1VJUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJFeGNlcHRpb24KLQkJCQkJCS8vIGVuY291bnRlcmVkIHdoZW4gYXR0ZW1wdGluZyB0byBvcGVuIGZpbGU6ICIgKyBpRmlsZQotCQkJCQkJLy8gKyAiXG5cbiIgKyBleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBBdmFpbGFibGVDb250ZW50Q01WaXNpdG9yIGV4dGVuZHMgQ01WaXNpdG9yIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9BVFRSSUJVVEVTID0gTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfQ0hJTERfTk9ERVMgPSBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTID0gTW9kZWxRdWVyeS5JTkNMVURFX1NFUVVFTkNFX0dST1VQUzsKLQotCQlwdWJsaWMgSGFzaHRhYmxlIGNoaWxkTm9kZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwdWJsaWMgSGFzaHRhYmxlIGF0dHJpYnV0ZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwdWJsaWMgRWxlbWVudCByb290RWxlbWVudDsKLQkJcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RFbGVtZW50RGVjbGFyYXRpb247Ci0JCXB1YmxpYyBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0JCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVTZXF1ZW5jZUdyb3VwczsKLQkJcHVibGljIERPTVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkJcHVibGljIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoRWxlbWVudCByb290RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJdGhpcy5yb290RWxlbWVudCA9IHJvb3RFbGVtZW50OwotCQkJdGhpcy5yb290RWxlbWVudERlY2xhcmF0aW9uID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbjsKLQkJCXZhbGlkYXRvciA9IG5ldyBET01WYWxpZGF0b3IoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KENNTm9kZSBjbU5vZGUpIHsKLQkJCVN0cmluZyBrZXkgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KSBjbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsKLQkJCWlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZXNwYWNlVVJJID0gKFN0cmluZykgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOwotCQkJCWlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotCQkJCQlrZXkgPSAiWyIgKyBuYW1lc3BhY2VVUkkgKyAiXSIgKyBrZXk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGtleTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGNvbXB1dGVBdmFpbGFibGVDb250ZW50KGludCBpbmNsdWRlT3B0aW9ucykgewotCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCWludCBjb250ZW50VHlwZSA9IHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCWluY2x1ZGVTZXF1ZW5jZUdyb3VwcyA9ICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX1NFUVVFTkNFX0dST1VQUykgIT0gMCk7Ci0JCQl2aXNpdENNTm9kZShyb290RWxlbWVudERlY2xhcmF0aW9uKTsKLQotCQkJaWYgKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfQVRUUklCVVRFUykgIT0gMCkgewotCQkJCXYuYWRkQWxsKGF0dHJpYnV0ZVRhYmxlLnZhbHVlcygpKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG5pbGxhYmxlQXR0cmlidXRlID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uaWxsYWJsZSIpOwotCQkJCWlmIChuaWxsYWJsZUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCXYuYWRkKG5pbGxhYmxlQXR0cmlidXRlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX0NISUxEX05PREVTKSAhPSAwKSB7Ci0JCQkJaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8IGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpIHsKLQkJCQkJdi5hZGRBbGwoY2hpbGROb2RlVGFibGUudmFsdWVzKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpIHsKLQkJCQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpIHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsKLQkJCQkJaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJCQl2LmFkZCgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKSB7Ci0JCQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSByb290RWxlbWVudERlY2xhcmF0aW9uLmdldERhdGFUeXBlKCk7Ci0JCQkJCWlmIChkYXRhVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQl2LmFkZChkYXRhVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdjsKLQkJfQotCi0JCS8qCi0JCSAqIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KSB7IFN0cmluZyB1cmkgPQotCQkgKiBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOyBMaXN0IGxpc3QgPQotCQkgKiBnZXRDTURvY3VtZW50TGlzdChyb290RWxlbWVudCwgcm9vdEVsZW1lbnREZWNsYXJhdGlvbiwgdXJpKTsgZm9yCi0JCSAqIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJICogQ01Eb2N1bWVudCBjbWRvY3VtZW50ID0gKENNRG9jdW1lbnQpaXRlcmF0b3IubmV4dCgpOyBpZiAoY21kb2N1bWVudCAhPQotCQkgKiBudWxsKSB7IENNTmFtZWROb2RlTWFwIG1hcCA9IGNtZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsgaW50IHNpemUgPQotCQkgKiBtYXAuZ2V0TGVuZ3RoKCk7IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7IENNTm9kZSBlZCA9Ci0JCSAqIG1hcC5pdGVtKGkpOwotCQkgKiAKLQkJICogY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsgfSB9IH0gfQotCQkgKi8KLQkJcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJCXN1cGVyLnZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhZCk7Ci0JCQlhdHRyaWJ1dGVUYWJsZS5wdXQoYWQuZ2V0Tm9kZU5hbWUoKSwgYWQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCQkJaWYgKGVkID09IHJvb3RFbGVtZW50RGVjbGFyYXRpb24gJiYgIWlzUm9vdFZpc2l0ZWQpIHsKLQkJCQlpc1Jvb3RWaXNpdGVkID0gdHJ1ZTsKLQkJCQlzdXBlci52aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghQm9vbGVhbi5UUlVFLmVxdWFscyhlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKSkpIHsKLQkJCQkJY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsKLQkJCQl9Ci0KLQkJCQlDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwID0gKENNTm9kZUxpc3QpIGVkLmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpOwotCQkJCWlmIChzdWJzdGl0dXRpb25Hcm91cCAhPSBudWxsKSB7Ci0JCQkJCWhhbmRsZVN1YnN0aXR1dGlvbkdyb3VwKHN1YnN0aXR1dGlvbkdyb3VwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdWJzdGl0dXRpb25Hcm91cChDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwKSB7Ci0JCQlpbnQgc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGggPSBzdWJzdGl0dXRpb25Hcm91cC5nZXRMZW5ndGgoKTsKLQkJCWlmIChzdWJzdGl0dXRpb25Hcm91cExlbmd0aCA+IDEpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YnN0aXR1dGlvbkdyb3VwTGVuZ3RoOyBpKyspIHsKLQkJCQkJQ01Ob2RlIGVkID0gc3Vic3RpdHV0aW9uR3JvdXAuaXRlbShpKTsKLQkJCQkJaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgewotCQkJCQkJY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKSB7Ci0JCQlpZiAoaW5jbHVkZVNlcXVlbmNlR3JvdXBzKSB7Ci0JCQkJaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5TRVFVRU5DRSAmJiBncm91cC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPiAxICYmIGluY2x1ZGVzUmVxdWlyZWRDb250ZW50KGdyb3VwKSkgewotCQkJCQljaGlsZE5vZGVUYWJsZS5wdXQoZ3JvdXAsIGdyb3VwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZXNSZXF1aXJlZENvbnRlbnQoQ01Hcm91cCBncm91cCkgewotCQkJTGlzdCBsaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGdyb3VwKTsKLQkJCXJldHVybiBsaXN0LnNpemUoKSA+IDE7Ci0JCX0KLQotCQlwdWJsaWMgRE9NVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJCXJldHVybiB2YWxpZGF0b3I7Ci0JCX0KLQl9IC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaGVyZQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9Qb3J0V2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1BvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlNjlkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1BvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLkFic3RyYWN0R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IuQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLlBvcnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aS5Db250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0cy5Qcm90b2NvbENvbXBvbmVudENvbnRyb2w7Ci0KLXB1YmxpYyBjbGFzcyBQb3J0V2l6YXJkIGV4dGVuZHMgV2l6YXJkCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFNUWUxFX05FV19CSU5ESU5HID0gMTsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU1RZTEVfRVhJU1RJTkdfQklORElORyA9IDEgPDwgMTsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU1RZTEVfREVGQVVMVCA9IFNUWUxFX05FV19CSU5ESU5HIHwgU1RZTEVfRVhJU1RJTkdfQklORElORzsKLQotICBwcm90ZWN0ZWQgUG9ydEdlbmVyYXRvciBwb3J0R2VuZXJhdG9yOwotICBwcm90ZWN0ZWQgUG9ydFdpemFyZE9wdGlvbnNQYWdlIHNwZWNpZnlCaW5kaW5nUGFnZTsKLSAgcHJvdGVjdGVkIGludCBzdHlsZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFBvcnRXaXphcmQuCi0gICAqLwotICBwdWJsaWMgUG9ydFdpemFyZChTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICB0aGlzKHNlcnZpY2UsIDApOwotICB9Ci0KLSAgcHVibGljIFBvcnRXaXphcmQoU2VydmljZSBzZXJ2aWNlLCBpbnQgc3R5bGUpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHBvcnRHZW5lcmF0b3IgPSBuZXcgUG9ydEdlbmVyYXRvcihzZXJ2aWNlKTsKLSAgICBzZXRXaW5kb3dUaXRsZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QT1JUX1dJWkFSRCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIC8vc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9OZXdYTUwuZ2lmIikpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHdpemFyZCBzZXR1cCBpcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldHVwKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0gICAgc3BlY2lmeUJpbmRpbmdQYWdlID0gbmV3IFBvcnRXaXphcmRPcHRpb25zUGFnZShzdHlsZSk7Ci0gICAgYWRkUGFnZShzcGVjaWZ5QmluZGluZ1BhZ2UpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgICBwb3J0R2VuZXJhdG9yLmdlbmVyYXRlKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gcG9ydEdlbmVyYXRvci5nZXROZXdDb21wb25lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNsYXNzIFBvcnRXaXphcmRPcHRpb25zUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLSAgewotCi0gICAgcHJvdGVjdGVkIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBwcm90b2NvbENvbXBvbmVudENvbnRyb2w7Ci0KLSAgICBwdWJsaWMgUG9ydFdpemFyZE9wdGlvbnNQYWdlKGludCBzdHlsZSkKLSAgICB7Ci0gICAgICBzdXBlcigiU3BlY2lmeVBvcnRQYWdlIik7Ci0gICAgICBzZXRUaXRsZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9TUEVDSUZZX1BPUlRfREVUQUlMUyIpKTsKLSAgICAgIHNldERlc2NyaXB0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1NQRUNJRllfUE9SVF9ERVRBSUxTX1RPX0JFX0NSRUFURUQiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFic3RyYWN0R2VuZXJhdG9yIGdldEdlbmVyYXRvcigpCi0gICAgewotICAgICAgcmV0dXJuIHBvcnRHZW5lcmF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBwcm90b2NvbENvbXBvbmVudENvbnRyb2wgPSBuZXcgUG9ydFByb3RvY29sQ29tcG9uZW50Q29udHJvbChwYXJlbnQsIHBvcnRHZW5lcmF0b3IpOwotICAgICAgcHJvdG9jb2xDb21wb25lbnRDb250cm9sLmluaXRGaWVsZHMoKTsKLSAgICAgIHNldENvbnRyb2wocHJvdG9jb2xDb21wb25lbnRDb250cm9sKTsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBQb3J0UHJvdG9jb2xDb21wb25lbnRDb250cm9sIGV4dGVuZHMgUHJvdG9jb2xDb21wb25lbnRDb250cm9sCi0gIHsKLQotICAgIHB1YmxpYyBQb3J0UHJvdG9jb2xDb21wb25lbnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICB7Ci0gICAgICBzdXBlcihwYXJlbnQsIGdlbmVyYXRvciwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmTmFtZUxhYmVsVGV4dCgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JJTkRJTkciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRSZWZOYW1lcygpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKHBvcnRHZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpKS5nZXRCaW5kaW5nTmFtZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBwb3J0R2VuZXJhdG9yLmdldFNlcnZpY2UoKTsKLSAgICAgIHJldHVybiBOYW1lVXRpbC5idWlsZFVuaXF1ZVBvcnROYW1lKHNlcnZpY2UsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UgY3JlYXRlQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKFN0cmluZyBwcm90b2NvbCkKLSAgICB7Ci0gICAgICBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2Ugb3B0aW9uc1BhZ2UgPSBudWxsOwotICAgICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29udGVudEdlbmVyYXRvckV4dGVuc2lvbihwcm90b2NvbCk7Ci0gICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9wdGlvbnNQYWdlID0gZXh0ZW5zaW9uLmNyZWF0ZVBvcnRDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBvcHRpb25zUGFnZTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1dTRExOZXdGaWxlT3B0aW9uc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODQxZmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5WYWxpZGF0ZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRpYWxvZ3MuVXBkYXRlTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTmV3RmlsZU9wdGlvbnNQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBVcGRhdGVMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgdGFyZ2V0TmFtZXNwYWNlVGV4dDsKLSAgcHJvdGVjdGVkIFRleHQgcHJlZml4VGV4dDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUG9ydE9wRmllbGRCb29sZWFuID0gdHJ1ZTsKLSAgCi0gIHByb3RlY3RlZCBQYWdlQm9vayBwcm90b2NvbFBhZ2VCb29rOwotICBwcm90ZWN0ZWQgQ29tYm8gcHJvdG9jb2xDb21ibzsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBzb2FwUGFnZTsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBodHRwUGFnZTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBkb2NMaXRSYWRpbzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBycGNMaXRSYWRpbzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBycGNFbmNSYWRpbzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBodHRwR2V0UmFkaW87Ci0gIHByb3RlY3RlZCBCdXR0b24gaHR0cFBvc3RSYWRpbzsKLSAgCi0vLyAgcHJpdmF0ZSBCaW5kaW5nR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2UuCi0gICAqIEBwYXJhbSBwYWdlTmFtZQotICAgKi8KLSAgcHVibGljIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lKQotICB7Ci0gICAgc3VwZXIocGFnZU5hbWUpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NETE5ld0ZpbGVPcHRpb25zUGFnZS4KLSAgICogQHBhcmFtIHBhZ2VOYW1lCi0gICAqIEBwYXJhbSB0aXRsZQotICAgKiBAcGFyYW0gdGl0bGVJbWFnZQotICAgKi8KLSAgcHVibGljIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciB0aXRsZUltYWdlKQotICB7Ci0gICAgc3VwZXIocGFnZU5hbWUsIHRpdGxlLCB0aXRsZUltYWdlKTsKLSAgICBzZXREZXNjcmlwdGlvbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERVNDUklQVElPTl9ORVdfV1NETF9GSUxFIikpOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBiYXNlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoYmFzZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfSEVMUCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGJhc2Uuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0gICAgLy8gIEdyb3VwIHdzZGxHcm91cCA9IFZpZXdVdGlsaXR5LmNyZWF0ZUdyb3VwKGJhc2UsIDIsICJXU0RMIiwgZmFsc2UpOwotICAgIENvbXBvc2l0ZSB3c2RsR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGJhc2UsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIHdzZGxHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHdzZGxHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIEdyaWREYXRhIGdkID0gKEdyaWREYXRhKXdzZGxHcm91cC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLSAgICBMYWJlbCB0YXJnZXROYW1lc3BhY2UgPSBuZXcgTGFiZWwod3NkbEdyb3VwLCBTV1QuTEVGVCk7Ci0gICAgdGFyZ2V0TmFtZXNwYWNlLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIEdyaWREYXRhIG5zRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIG5zRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0YXJnZXROYW1lc3BhY2Uuc2V0TGF5b3V0RGF0YShuc0RhdGEpOwotICAgIAotICAgIHRhcmdldE5hbWVzcGFjZVRleHQgPSBuZXcgVGV4dCh3c2RsR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSB0ZXh0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIHRleHREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHRleHREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHRleHREYXRhLndpZHRoSGludCA9IDEwOwotICAgIHRhcmdldE5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YSh0ZXh0RGF0YSk7Ci0gICAgCi0gICAgdGFyZ2V0TmFtZXNwYWNlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotICAgIExhYmVsIHByZWZpeCA9IG5ldyBMYWJlbCh3c2RsR3JvdXAsIFNXVC5MRUZUKTsKLSAgICBwcmVmaXguc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QUkVGSVhfV0lUSF9DT0xPTiIpKTsgLy8kTk9OLU5MUy0xJFwKLQotICAgIEdyaWREYXRhIHByZWZpeERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBwcmVmaXhEYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHByZWZpeC5zZXRMYXlvdXREYXRhKHByZWZpeERhdGEpOwotICAgIAotICAgIHByZWZpeFRleHQgPSBuZXcgVGV4dCh3c2RsR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSBwcmVmaXhUZXh0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIHByZWZpeFRleHREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHByZWZpeFRleHREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHByZWZpeFRleHREYXRhLndpZHRoSGludCA9IDEwOwotICAgIHByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShwcmVmaXhUZXh0RGF0YSk7Ci0KLSAgICBwcmVmaXhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIC8vICAgIFhNTENhdGFsb2cgeG1sQ2F0YWxvZyA9IFhNTENhdGFsb2dSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmxvb2t1cE9yQ3JlYXRlWE1MQ2F0YWxvZygiZGVmYXVsdCIpOwotICAgIC8vICAgIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIGNhdGFsb2cgPSBuZXcgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwoYmFzZSwgeG1sQ2F0YWxvZyk7Ci0KLS8vICBEZXRlcm1pbmUgaWYgdGhlIHVzZXIgd2lzaGVzIHRvIGNyZWF0ZSBhIHNrZWxldG9uIFdTREwuICBJZiB5ZXMsIHByZXNlbnQgdGhlIHVzZXIgd2l0aCBpbnB1dCBmaWVsZHMuCi0gICAgY3JlYXRlU2tlbGV0b25DaGVja0JveCA9IG5ldyBCdXR0b24oYmFzZSwgU1dULkNIRUNLKTsKLSAgICBjcmVhdGVTa2VsZXRvbkNoZWNrQm94LnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQ1JFQVRFX1dTRExfU0tFTEVUT04iKSk7Ci0gICAgY3JlYXRlU2tlbGV0b25DaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgCi0gICAgd3NkbFNrZWxldG9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGJhc2UsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dDIgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dDIubnVtQ29sdW1ucyA9IDI7Ci0gICAgd3NkbFNrZWxldG9uR3JvdXAuc2V0TGF5b3V0KGxheW91dDIpOwotCi0gICAgR3JpZERhdGEgZGF0YTIgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhMi52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YTIuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgd3NkbFNrZWxldG9uR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0KLSAgIGNyZWF0ZUxhYmVsKHdzZGxTa2VsZXRvbkdyb3VwLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX1BST1RPQ09MIikpOwotICAgcHJvdG9jb2xDb21ibyA9IG5ldyBDb21ibyh3c2RsU2tlbGV0b25Hcm91cCwgU1dULlJFQURfT05MWSk7Ci0gICBHcmlkRGF0YSBkYXRhQyA9IG5ldyBHcmlkRGF0YSgpOwotICAgZGF0YUMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBkYXRhQy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgIHByb3RvY29sQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhQyk7Ci0gICBwcm90b2NvbENvbWJvLmFkZChTT0FQX1BST1RPQ09MKTsKLSAgIHByb3RvY29sQ29tYm8uYWRkKEhUVFBfUFJPVE9DT0wpOwotICAgcHJvdG9jb2xDb21iby5zZWxlY3QoMCk7Ci0gICBwcm90b2NvbENvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotICAgCi0gICBzZXBMYWJlbCA9IG5ldyBMYWJlbChiYXNlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgR3JpZERhdGEgc2VwRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgc2VwRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgIHNlcERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICBzZXBMYWJlbC5zZXRMYXlvdXREYXRhKHNlcERhdGEpOwotICAgCi0gICAKLSAgIC8vIENyZWF0ZSBQYWdlQm9vayBhbmQgcGFnZXMvY29udHJvbHMgZm9yIHRoZSBQYWdlQm9vawotICAgcHJvdG9jb2xQYWdlQm9vayA9IG5ldyBQYWdlQm9vayhiYXNlLCBTV1QuTk9ORSk7Ci0KLSAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gU29hcCBQYWdlCi0gICBzb2FwUGFnZSA9IG5ldyBDb21wb3NpdGUocHJvdG9jb2xQYWdlQm9vaywgU1dULk5PTkUpOwotICAgR3JpZExheW91dCBwYkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICBzb2FwUGFnZS5zZXRMYXlvdXQocGJMYXlvdXQpOwotCi0gICBHcmlkRGF0YSBwYkRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgIHBiRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBwYkRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBzb2FwUGFnZS5zZXRMYXlvdXREYXRhKHBiRGF0YSk7Ci0KLSAgIGNyZWF0ZUxhYmVsKHNvYXBQYWdlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9TT0FQX0JJTkRJTkdfT1BUSU9OUyIpKTsKLSAgIGRvY0xpdFJhZGlvID0gbmV3IEJ1dHRvbihzb2FwUGFnZSwgU1dULlJBRElPKTsKLSAgIHJwY0xpdFJhZGlvID0gbmV3IEJ1dHRvbihzb2FwUGFnZSwgU1dULlJBRElPKTsKLSAgIHJwY0VuY1JhZGlvID0gbmV3IEJ1dHRvbihzb2FwUGFnZSwgU1dULlJBRElPKTsKLSAgIGRvY0xpdFJhZGlvLnNldFRleHQoU09BUF9ET0NVTUVOVF9MSVRFUkFMKTsKLSAgIHJwY0xpdFJhZGlvLnNldFRleHQoU09BUF9SUENfTElURVJBTCk7Ci0gICBycGNFbmNSYWRpby5zZXRUZXh0KFNPQVBfUlBDX0VOQ09ERUQpOwotICAgZG9jTGl0UmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgCi0gICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEh0dHAgUGFnZQotICAgaHR0cFBhZ2UgPSBuZXcgQ29tcG9zaXRlKHByb3RvY29sUGFnZUJvb2ssIFNXVC5OT05FKTsKLSAgIHBiTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgIGh0dHBQYWdlLnNldExheW91dChwYkxheW91dCk7Ci0KLSAgIHBiRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgcGJEYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgIHBiRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgIGh0dHBQYWdlLnNldExheW91dERhdGEocGJEYXRhKTsKLSAgIAotICAgY3JlYXRlTGFiZWwoaHR0cFBhZ2UsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0hUVFBfQklORElOR19PUFRJT05TIikpOyAvLyBBbHJlYWR5IEV4dGVybmFsaXplZAotICAgaHR0cEdldFJhZGlvID0gbmV3IEJ1dHRvbihodHRwUGFnZSwgU1dULlJBRElPKTsKLSAgIGh0dHBQb3N0UmFkaW8gPSBuZXcgQnV0dG9uKGh0dHBQYWdlLCBTV1QuUkFESU8pOwotICAgaHR0cEdldFJhZGlvLnNldFRleHQoSFRUUF9HRVQpOwotICAgaHR0cFBvc3RSYWRpby5zZXRUZXh0KEhUVFBfUE9TVCk7Ci0gICBodHRwR2V0UmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgCi0gICB3c2RsU2tlbGV0b25Hcm91cC5zZXRWaXNpYmxlKHRydWUpOwotICAgc2VwTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgIHByb3RvY29sUGFnZUJvb2suc2hvd1BhZ2Uoc29hcFBhZ2UpOwotICAgcHJvdG9jb2xQYWdlQm9vay5zZXRWaXNpYmxlKHRydWUpOwotICAgCi0gICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBBZGQgU2VsZWN0aW9uIExpc3RlbmVycwotICAgY3JlYXRlU2tlbGV0b25DaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgIAotLy8gICBCaW5kaW5nUHJvdG9jb2xDb21wb25lbnRDb250cm9sIGNvbXBvbmVudCA9IG5ldyBCaW5kaW5nUHJvdG9jb2xDb21wb25lbnRDb250cm9sKGJhc2UsIGdlbmVyYXRvciwgZmFsc2UpOwotLy8gICBjb21wb25lbnQuaW5pdEZpZWxkcygpOwotICAgCi0gICAgc2V0Q29udHJvbChiYXNlKTsKLSAgfQotCi0gIHByaXZhdGUgTmV3V1NETFdpemFyZCBnZXROZXdXU0RMV2l6YXJkKCkKLSAgewotICAgIHJldHVybiAoTmV3V1NETFdpemFyZClnZXRXaXphcmQoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGNvbXB1dGVEZWZhdWx0RGVmaW5pdGlvbk5hbWUoKQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSAiRGVmYXVsdE5hbWUiOwotICAgIElQYXRoIHBhdGggPSBnZXROZXdXU0RMV2l6YXJkKCkuZ2V0TmV3RmlsZVBhdGgoKTsKLSAgICBpZiAocGF0aCAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWUgPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZURlZmF1bHROYW1lc3BhY2VOYW1lKCkKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UiKSk7Ci0gICAgaWYgKCFuYW1lc3BhY2UuZW5kc1dpdGgoIi8iKSkgewotICAgIAluYW1lc3BhY2UgPSBuYW1lc3BhY2UuY29uY2F0KCIvIik7Ci0gICAgfQotICAgIAotICAgIElQYXRoIHBhdGggPSBnZXROZXdXU0RMV2l6YXJkKCkuZ2V0TmV3RmlsZVBhdGgoKTsKLSAgICBpZiAocGF0aCAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSArPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS50b1N0cmluZygpICsgIi8iOwotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpCi0gIHsKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCi0gICAgaWYgKHZpc2libGUpCi0gICAgewotICAgICAgLy8gcHJpbWUgdGhlIGZpZWxkcyAgICAKLSAgICAgIHRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dChjb21wdXRlRGVmYXVsdE5hbWVzcGFjZU5hbWUoKSk7Ci0gICAgICBwcmVmaXhUZXh0LnNldFRleHQoInRucyIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2VUZXh0LmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkKLSAgewotICAgIHJldHVybiBwcmVmaXhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25OYW1lKCkKLSAgewotICAJcmV0dXJuIGNvbXB1dGVEZWZhdWx0RGVmaW5pdGlvbk5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0YXJnZXROYW1lc3BhY2VUZXh0KQotICAgIHsKLSAgICAgIHN0YXJ0RGVsYXllZEV2ZW50KGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBwcmVmaXhUZXh0KQotICAgIHsKLSAgICAgIHNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLSAgICB9Ci0JZWxzZSBpZiAoZS53aWRnZXQgPT0gcHJvdG9jb2xDb21ibykgewotCQkvLyBVcGRhdGUgd2hhdCBwYWdlL2NvbnRyb2wgd2Ugc2hvdyBpbiB0aGUgUGFnZUJvb2sKLQkJaWYgKHByb3RvY29sQ29tYm8uZ2V0VGV4dCgpLmVxdWFscygiU09BUCIpKSB7Ci0JCQlwcm90b2NvbFBhZ2VCb29rLnNob3dQYWdlKHNvYXBQYWdlKTsKLQkJfQotCQllbHNlIGlmIChwcm90b2NvbENvbWJvLmdldFRleHQoKS5lcXVhbHMoIkhUVFAiKSkgewotCQkJcHJvdG9jb2xQYWdlQm9vay5zaG93UGFnZShodHRwUGFnZSk7Ci0JCX0KLQl9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1cGRhdGVPY2N1cmVkKE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikKLSAgewotICAgIHNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgewotICAgIGJvb2xlYW4gcmVhZHkgPSB0cnVlOwotCi0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgLy8gc28gdGhhdCB0aGUgcGFnZSBkb2Vzbid0IGltbWVkaWF0ZWx5IHNob3cgdXAgd2l0aCBhbiBlcnJvcgotICAgIGlmICh0YXJnZXROYW1lc3BhY2VUZXh0LmdldFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSkKLSAgICB7Ci0gICAgICBpZiAocmVhZHkpCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIXZhbGlkYXRlVGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpKSkKLSAgICB7Ci0gICAgICByZWFkeSA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVhZHk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeChTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IFZhbGlkYXRlSGVscGVyLmNoZWNrWE1MUHJlZml4KHByZWZpeCk7Ci0KLSAgICBpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlWE1MTmFtZShTdHJpbmcgeG1sTmFtZSkKLSAgewotICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTE5hbWUoeG1sTmFtZSk7Ci0KLSAgICBpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlVGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBucykKLSAgewotICAgIGJvb2xlYW4gdGVzdCA9IHRydWU7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJJIHRlc3RVUkkgPSBuZXcgVVJJKG5zKTsKLSAgICAgIC8vICAgICAgaWYgKCF0ZXN0VVJJLmlzR2VuZXJpY1VSSSgpKQotICAgICAgLy8gICAgICB7Ci0gICAgICAvLyAgICAgICAgc2V0RXJyb3JNZXNzYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfTkFNRVNQQUNFX0lOVkFMSUQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vICAgICAgICB0ZXN0ID0gZmFsc2U7Ci0gICAgICAvLyAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFZhbGlkYXRlSGVscGVyLmNoZWNrWE1MTmFtZShucyk7Ci0gICAgICAvLwkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCB8fCBlcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgIC8vCQkJewotICAgICAgLy8JCQkJdGVzdCA9IHRydWU7Ci0gICAgICAvLwkJCX0KLSAgICAgIC8vCQkJZWxzZQotICAgICAgLy8JCQl7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfTkFNRVNQQUNFX0lOVkFMSUQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRlc3QgPSBmYWxzZTsKLSAgICAgIC8vCQkJfQotICAgIH0KLQotICAgIHJldHVybiB0ZXN0OwotICB9Ci0KLSAgLyoKLSAgcHJpdmF0ZSBib29sZWFuIGFyZVByZWZpeGVzVW5pcXVlQW5kVmFsaWQoKQotICB7Ci0gICAgamF2YS51dGlsLkxpc3QgaW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0gICAgamF2YS51dGlsLkxpc3QgY2hlY2tlZExpc3QgPSBuYW1lc3BhY2VJbmZvLmdldE5hbWVzcGFjZUNoZWNrZWRMaXN0KCk7Ci0KLSAgICBWZWN0b3IgcHJlZml4TGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBib29sZWFuIHRlc3QgPSB0cnVlOwotICAgIGJvb2xlYW4gaXNPbmVCbGFuayA9IGZhbHNlOwotCi0gICAgU3RyaW5nIGN1cnJlbnRQcmVmaXggPSBwcmVmaXhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgaWYgKGN1cnJlbnRQcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICBpc09uZUJsYW5rID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICh2YWxpZGF0ZVByZWZpeChjdXJyZW50UHJlZml4KSkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4TGlzdC5hZGQoY3VycmVudFByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9QUkVGSVhfSVNfSU5WQUxJRCIsIGN1cnJlbnRQcmVmaXgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvTGlzdC5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpbmZvTGlzdC5nZXQoaSk7Ci0gICAgICBpZiAoKChTdHJpbmcpY2hlY2tlZExpc3QuZ2V0KGkpKS5lcXVhbHMoInRydWUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBTdHJpbmcgYVByZWZpeCA9IGluZm8ucHJlZml4LnRyaW0oKTsKLSAgICAgICAgaWYgKGFQcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFwcmVmaXhMaXN0LmNvbnRhaW5zKGFQcmVmaXgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByZWZpeChhUHJlZml4KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJlZml4TGlzdC5hZGQoYVByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9QUkVGSVhfSVNfSU5WQUxJRCIsIGluZm8ucHJlZml4KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgdGVzdCA9IGZhbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9QUkVGSVhfSVNfQV9EVVBMSUNBVEUiLCBpbmZvLnByZWZpeCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0ZXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc09uZUJsYW5rKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzT25lQmxhbmsgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VSUk9SX01PUkVfVEhBTl9PTkVfUFJFRklYX0lTX0JMQU5LIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0ZXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRlc3Q7Ci0gIH0KLSAgKi8KLQotICBwcm90ZWN0ZWQgRGVsYXllZEV2ZW50IGRlbGF5ZWRUYXNrOwotICBwcm90ZWN0ZWQgdm9pZCBzdGFydERlbGF5ZWRFdmVudChNb2RpZnlFdmVudCBlKQotICB7Ci0gICAgaWYgKGRlbGF5ZWRUYXNrID09IG51bGwgfHwgZGVsYXllZFRhc2suZ2V0RXZlbnQoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIGRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLCBkZWxheWVkVGFzayk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBNb2RpZnlFdmVudCBkZWxheWVkRXZlbnQgPSBkZWxheWVkVGFzay5nZXRFdmVudCgpOwotCi0gICAgICBpZiAoZS53aWRnZXQgPT0gZGVsYXllZEV2ZW50LndpZGdldCkKLSAgICAgIHsKLSAgICAgICAgLy8gc2FtZSBldmVudCwganVzdCBkaWZmZXJlbnQgZGF0YSwgZGVsYXkgbmV3IGV2ZW50Ci0gICAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KG51bGwpOwotICAgICAgfQotICAgICAgZGVsYXllZFRhc2sgPSBuZXcgRGVsYXllZEV2ZW50KCk7Ci0gICAgICBkZWxheWVkVGFzay5zZXRFdmVudChlKTsKLSAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnRpbWVyRXhlYyg1MDAsIGRlbGF5ZWRUYXNrKTsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBEZWxheWVkRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZQotICB7Ci0gICAgcHJvdGVjdGVkIE1vZGlmeUV2ZW50IGV2ZW50OwotCi0gICAgLyoKLSAgICAgKiBAc2VlIFJ1bm5hYmxlI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBpZiAoZXZlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotICAgICAgICBldmVudCA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1vZGlmeUV2ZW50IGdldEV2ZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gZXZlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbnQoTW9kaWZ5RXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gIAkgaWYgKGUud2lkZ2V0ID09IGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3gpIHsKLSAgCSAJaWYgKGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCSAJCXdzZGxTa2VsZXRvbkdyb3VwLnNldFZpc2libGUodHJ1ZSk7Ci0gIAkgCQlzZXBMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotICAJIAkJcHJvdG9jb2xQYWdlQm9vay5zZXRWaXNpYmxlKHRydWUpOwotICAJIAl9Ci0gIAkgCWVsc2UgewotICAJIAkJd3NkbFNrZWxldG9uR3JvdXAuc2V0VmlzaWJsZShmYWxzZSk7Ci0gIAkgCQlzZXBMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgCSAJCXByb3RvY29sUGFnZUJvb2suc2V0VmlzaWJsZShmYWxzZSk7Ci0gIAkgCX0KLSAgCSB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX1BST1RPQ09MID0gIlNPQVAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9UT0NPTCA9ICJIVFRQIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUlBDX0VOQ09ERUQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9SQURJT19SUENfRU5DT0RFRCIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9SUENfTElURVJBTCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1JBRElPX1JQQ19MSVRFUkFMIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0RPQ1VNRU5UX0xJVEVSQUwgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9SQURJT19ET0NVTUVOVF9MSVRFUkFMIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BPU1QgPSAiSFRUUCBQT1NUIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfR0VUID0gIkhUVFAgR0VUIjsKLQotICBDb21wb3NpdGUgd3NkbFNrZWxldG9uR3JvdXA7Ci0gIEJ1dHRvbiBjcmVhdGVTa2VsZXRvbkNoZWNrQm94OwotICAKLSAgTGFiZWwgc2VwTGFiZWw7Ci0gIAotICBwcml2YXRlIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBjb21wKSB7Ci0gICAgVGV4dCB0ZXh0RmllbGQgPSBuZXcgVGV4dChjb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgdGV4dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICB0ZXh0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0ZXh0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICB0ZXh0RGF0YS53aWR0aEhpbnQgPSAxMDsKLSAgICB0ZXh0RmllbGQuc2V0TGF5b3V0RGF0YSh0ZXh0RGF0YSk7Ci0KLSAgCXJldHVybiB0ZXh0RmllbGQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbXAsIFN0cmluZyBsYWJlbFN0cmluZykgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KGxhYmVsU3RyaW5nKTsKLSAgICBHcmlkRGF0YSBuc0RhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBuc0RhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuc0RhdGEpOwotICAgIAotICAgIHJldHVybiBsYWJlbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICBjb21wb3NpdGUuc2V0Rm9udChuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgIm1zIHNhbnMgc2VyaWYiLCA4LCBTV1QuTk9STUFMKSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBWZWN0b3IgZ2V0TmFtZXNwYWNlSW5mbygpIHsKLQkJVmVjdG9yIG5hbWVzcGFjZXMgPSBuZXcgVmVjdG9yKCk7Ci0gIAkJCi0gIAkJLy8gQWRkIERlZmF1bHQgTmFtZXNwYWNlcwotCQlOYW1lc3BhY2VJbmZvIGluZm8xID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLQkJaW5mbzEucHJlZml4ID0gIndzZGwiOwotCQlpbmZvMS51cmkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotCQluYW1lc3BhY2VzLmFkZEVsZW1lbnQoaW5mbzEpOwotCQkKLQkJTmFtZXNwYWNlSW5mbyBpbmZvOCA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0JCWluZm84LnByZWZpeCA9ICJ4c2QiOwotCQlpbmZvOC51cmkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCQluYW1lc3BhY2VzLmFkZEVsZW1lbnQoaW5mbzgpOwotCQkKLQkJcmV0dXJuIG5hbWVzcGFjZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldENyZWF0ZVNrZWxldG9uQm9vbGVhbigpIHsKLSAgCXJldHVybiBjcmVhdGVTa2VsZXRvbkNoZWNrQm94LmdldFNlbGVjdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotICAJcmV0dXJuIHByb3RvY29sQ29tYm8uZ2V0VGV4dCgpOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0UHJvdG9jb2xPcHRpb25zKCkgewotICAJT2JqZWN0IGJvb2xbXSA9IG5ldyBCb29sZWFuWzNdOwotICAJaWYgKHByb3RvY29sQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhTT0FQX1BST1RPQ09MKSkgewotICAJCWlmIChkb2NMaXRSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotICAJCQlib29sWzBdID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gIAkJfQotICAJCWVsc2UgewotICAJCQlib29sWzBdID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotICAJCX0KLSAgCQkKLSAgCQlpZiAocnBjTGl0UmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCQkJYm9vbFsyXSA9IG5ldyBCb29sZWFuKHRydWUpOwotICAJCX0KLSAgCQllbHNlIHsKLSAgCQkJYm9vbFsyXSA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLSAgCQl9Ci0gIAl9Ci0gIAllbHNlIGlmIChwcm90b2NvbENvbWJvLmdldFRleHQoKS5lcXVhbHMoSFRUUF9QUk9UT0NPTCkpewotICAJCWlmIChodHRwR2V0UmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCQkJYm9vbFswXSA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkJCWJvb2xbMF0gPSBuZXcgQm9vbGVhbih0cnVlKTsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBib29sOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NvYXBEb2NMaXRlcmFsUHJvdG9jb2woKSB7Ci0gIAlpZiAoZ2V0UHJvdG9jb2woKS5lcXVhbHMoU09BUF9QUk9UT0NPTCkgJiYgZG9jTGl0UmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCQlyZXR1cm4gdHJ1ZTsKLSAgCX0KLSAgCWVsc2UgewotICAJCXJldHVybiBmYWxzZTsKLSAgCX0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9XU0RMTmV3RmlsZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDhlODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9XU0RMTmV3RmlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgV1NETE5ld0ZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZQotewotICBwdWJsaWMgV1NETE5ld0ZpbGVQYWdlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9ORVdfV1NETF9GSUxFIiksIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRUaXRsZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9ORVdfV1NETF9GSUxFIikpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0RGVzY3JpcHRpb24oV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQ1JFQVRFX05FV19XU0RMX0ZJTEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICAvLyBpbmhlcml0IGRlZmF1bHQgY29udGFpbmVyIGFuZCBuYW1lIHNwZWNpZmljYXRpb24gd2lkZ2V0cwotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICB0aGlzLnNldEZpbGVOYW1lKGNvbXB1dGVEZWZhdWx0RmlsZU5hbWUoKSk7Ci0KLSAgICBzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKQotICB7Ci0gICAgUGF0aCBuZXdOYW1lID0gbmV3IFBhdGgoZ2V0RmlsZU5hbWUoKSk7Ci0gICAgU3RyaW5nIGZ1bGxGaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0gICAgU3RyaW5nIGV4dGVuc2lvbiA9IG5ld05hbWUuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCB8fCAhZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoIndzZGwiKSkgIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfRklMRV9NVVNUX0VORF9XSVRIX1dTREwiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZm9yIGZpbGUgc2hvdWxkIGJlIGNhc2UgaW5zZW5zaXRpdmUKLSAgICBTdHJpbmcgc2FtZU5hbWUgPSBleGlzdHNGaWxlQW55Q2FzZShmdWxsRmlsZU5hbWUpOwotICAgIGlmIChzYW1lTmFtZSAhPSBudWxsKSAKLSAgICB7Ci0gICAgICAgU3RyaW5nIHF1YWxpZmllZEZpbGVOYW1lID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS50b1N0cmluZygpICsgJy8nICsgZnVsbEZpbGVOYW1lOwotICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTIiwgIHNhbWVOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgCi0gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBkZWZhdWx0TmFtZSA9ICJOZXdXU0RMRmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBkZWZhdWx0RmlsZUV4dGVuc2lvbiA9ICIud3NkbCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMgPSB7ICIqLndzZGwifTsgLy8kTk9OLU5MUy0xJAotCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkKLSAgewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgU3RyaW5nIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLSAgICBJUGF0aCBjb250YWluZXJGdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0gICAgaWYgKGNvbnRhaW5lckZ1bGxQYXRoICE9IG51bGwpCi0gICAgewotICAgICAgd2hpbGUgKHRydWUpCi0gICAgICB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotICAgICAgICAvLyBpZiAoV29ya2JlbmNoVXRpbGl0eS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKHBhdGgpKQotICAgICAgICBpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMocGF0aCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBjb3VudCArIGRlZmF1bHRGaWxlRXh0ZW5zaW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWxlTmFtZTsKLSAgfQotCi0gIC8vIHJldHVybnMgdHJ1ZSBpZiBmaWxlIG9mIHNwZWNpZmllZCBuYW1lIGV4aXN0cyBpbiBhbnkgY2FzZSBmb3Igc2VsZWN0ZWQgY29udGFpbmVyCi0gIHByb3RlY3RlZCBTdHJpbmcgZXhpc3RzRmlsZUFueUNhc2UoU3RyaW5nIGZpbGVOYW1lKQotICB7Ci0gICAgaWYgKCAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpCi0gICAgICAgICAgJiYgKGZpbGVOYW1lLmNvbXBhcmVUbygiIikgIT0gMCkpCi0gICAgewotICAgICAgLy9sb29rIHRocm91Z2ggYWxsIHJlc291cmNlcyBhdCB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciAtIGNvbXBhcmUgaW4gdXBwZXIgY2FzZQotICAgICAgSVJlc291cmNlIHBhcmVudCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihnZXRDb250YWluZXJGdWxsUGF0aCgpKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgewotICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBwYXJlbnQ7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0gICAgICAgICAgU3RyaW5nIGVudGVyZWRGaWxlVXBwZXIgPSBmaWxlTmFtZS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtZW1iZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVVwcGVyTmFtZSA9IG1lbWJlcnNbaV0uZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VVcHBlck5hbWUuZXF1YWxzKGVudGVyZWRGaWxlVXBwZXIpKQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgIHJldHVybiBtZW1iZXJzW2ldLmdldE5hbWUoKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MzYwNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRERldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotCi0KLQotcHVibGljIGNsYXNzIFhTRERldGFpbHNWaWV3ZXJQcm92aWRlciAvLyBpbXBsZW1lbnRzIElEZXRhaWxzVmlld2VyUHJvdmlkZXIKLXsKLS8vICBwdWJsaWMgT2JqZWN0IGdldFZpZXdlcktleShPYmplY3QgbW9kZWxPYmplY3QpCi0vLyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7ICAgCi0vLwotLy8gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0vLyAgICB7Ci0vLyAgICAgIEVsZW1lbnQgaW5wdXQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW1vZGVsT2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0vLwotLy8gICAgICBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiZWxlbWVudCI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCB0cnVlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJlbGVtZW50UmVmIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLS8vICAgICAgICAgICAgICAgIGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLS8vICAgICAgICAgICAgICAgIGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAic2VxdWVuY2VDaG9pY2VBbGwiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiYXR0cmlidXRlIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiYXR0cmlidXRlUmVmIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiYXR0cmlidXRlR3JvdXAiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIHRydWUpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImF0dHJpYnV0ZUdyb3VwUmVmIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAibm90YXRpb24iOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJncm91cCI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiZ3JvdXBSZWYiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAic2NoZW1hIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiY29tcGxleFR5cGUiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImRvY3VtZW50YXRpb24iOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImFwcEluZm8iOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KWlucHV0OwotLy8gICAgICAgICAgWFNERE9NSGVscGVyIHhzZERPTUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLS8vICAgICAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5Tm9kZSA9IHhzZERPTUhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50KHBhcmVudEVsZW1lbnQpOwotLy8gICAgICAgICAgaWYgKGRlcml2ZWRCeU5vZGUgIT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgaWYgKGlucHV0RXF1YWxzKGRlcml2ZWRCeU5vZGUsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgcmVzdWx0ID0gInNpbXBsZUNvbnRlbnQiOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGRlcml2ZWRCeU5vZGUsIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHJlc3VsdCA9ICJzaW1wbGVDb250ZW50IjsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICByZXN1bHQgPSAieHNkIjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KWlucHV0OwotLy8gICAgICAgICAgWFNERE9NSGVscGVyIHhzZERPTUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLS8vICAgICAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5Tm9kZSA9IHhzZERPTUhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50KHBhcmVudEVsZW1lbnQpOwotLy8gICAgICAgICAgaWYgKGRlcml2ZWRCeU5vZGUgIT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcmVzdWx0ID0gInNpbXBsZUNvbnRlbnQiOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICByZXN1bHQgPSAieHNkIjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5JTkNMVURFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiaW5jbHVkZVhTRCI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJpbXBvcnRYU0QiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuUkVERUZJTkVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJyZWRlZmluZSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAic2ltcGxlQmFzZSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInNpbXBsZUJhc2UiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9IGdldEtleUZvclJlc3RyaWN0V2luZG93KGlucHV0KTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaXNGYWNldChpbnB1dCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgTm9kZSBwYXJlbnRFbGVtZW50ID0gKChFbGVtZW50KWlucHV0KS5nZXRQYXJlbnROb2RlKCk7Ci0vLyAgICAgICAgICBpZiAoaW5wdXRFcXVhbHMocGFyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHJlc3VsdCA9IGdldEtleUZvclJlc3RyaWN0V2luZG93KGlucHV0KTsKLS8vICAgICAgICAgIH0gCi0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgTm9kZSBwYXJlbnRFbGVtZW50ID0gKChFbGVtZW50KWlucHV0KS5nZXRQYXJlbnROb2RlKCk7Ci0vLyAgICAgICAgICBpZiAoaW5wdXRFcXVhbHMocGFyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHJlc3VsdCA9ICJzaW1wbGVDb250ZW50IjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHJlc3VsdCA9ICJzaW1wbGVDb250ZW50IjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcmVzdWx0ID0gInhzZCI7ICAgICAgICAgICAgCi0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuUEFUVEVSTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInBhdHRlcm4iOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRU5VTUVSQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJlbnVtIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFOWV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImFueUVsZW1lbnQiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiYW55QXR0cmlidXRlIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlVOSVFVRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInVuaXF1ZSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5LRVlSRUZfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJrZXlSZWYiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0VMRUNUT1JfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJzZWxlY3RvciI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5GSUVMRF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImZpZWxkIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLktFWV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImtleSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInhzZCI7Ci0vLyAgICAgIH0gICAgICAKLS8vICAgIH0gIAotLy8gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLS8vICAgIHsKLS8vICAgICAgcmVzdWx0ID0gInNjaGVtYSI7Ci0vLyAgICB9Ci0vLwotLy8gICAgcmV0dXJuIHJlc3VsdDsKLS8vICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8KLS8vCi0vLyAgcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotLy8gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICAgIFZpZXdlciB2aWV3ZXIgPSBudWxsOwotLy8KLS8vICAgIAotLy8gICAgRGVzaWduVmlld2VyIGRlc2lnblZpZXdlciA9IG5ldyBEZXNpZ25WaWV3ZXIoZWRpdG9yUGFydCk7Ci0vLyAgICBkZXNpZ25WaWV3ZXIuc2V0Q29udHJvbChwYXJlbnQpOyAgICAKLS8vICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotLy8gICAgewotLy8gICAgICBFbGVtZW50IGVsZW0gPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW1vZGVsT2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0vLyAgICAgIHZpZXdlciA9IGRlc2lnblZpZXdlci5jcmVhdGVWaWV3ZXIoZWxlbSk7Ci0vLy8vVE9ETyBwb3J0Ci0vLy8vICAgICAgKChCYXNlV2luZG93KXZpZXdlcikuc2V0TW9kZWxPYmplY3QobW9kZWxPYmplY3QpOwotLy8vLyAgICAgIHZpZXdlci5zZXRJbnB1dChlbGVtKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0vLyAgICB7Ci0vLyAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHNjaGVtYSA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCltb2RlbE9iamVjdDsKLS8vICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IHNjaGVtYS5nZXRTY2hlbWEoKTsKLS8vICAgICAgRWxlbWVudCBlbGVtID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLS8vICAgICAgdmlld2VyID0gZGVzaWduVmlld2VyLmNyZWF0ZVZpZXdlcihlbGVtKTsKLS8vLy9UT0RPIHBvcnQKLS8vLy8gICAgICAoKEJhc2VXaW5kb3cpdmlld2VyKS5zZXRNb2RlbE9iamVjdChtb2RlbE9iamVjdCk7Ci0vLy8vICAgICAgdmlld2VyLnNldElucHV0KGVsZW0pOyAgICAgIAotLy8gICAgfQotLy8gICAgcmV0dXJuIHZpZXdlcjsKLS8vICB9Ci0vLwotLy8gIHByb3RlY3RlZCBib29sZWFuIGlucHV0RXF1YWxzKE9iamVjdCBpbnB1dCwgU3RyaW5nIHRhZ25hbWUsIGJvb2xlYW4gaXNSZWYpCi0vLyAgewotLy8gICAgcmV0dXJuIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhpbnB1dCwgdGFnbmFtZSwgaXNSZWYpOwotLy8gIH0KLS8vCi0vLyAgcHJvdGVjdGVkIFN0cmluZyBnZXRLZXlGb3JSZXN0cmljdFdpbmRvdyhPYmplY3QgaW5wdXQpCi0vLyAgewotLy8gICAgLy8gc3BlY2lhbCBjYXNlIHdoZXJlIFNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gaXMgZGlmZmVyZW50IHRoYW4gU2ltcGxlQ29udGVudCByZXN0cmljdGlvbgotLy8KLS8vICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLS8vICAgIHsKLS8vICAgICAgTm9kZSBwYXJlbnRFbGVtZW50ID0gKChFbGVtZW50KWlucHV0KS5nZXRQYXJlbnROb2RlKCk7Ci0vLyAgICAgIGlmIChpbnB1dEVxdWFscyhwYXJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmV0dXJuICJzaW1wbGVSZXN0cmljdCI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMocGFyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJldHVybiAic2ltcGxlUmVzdHJpY3QiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmV0dXJuICJzaW1wbGVDb250ZW50IjsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgcmV0dXJuICJ4c2QiOwotLy8gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzMDlkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLS8vIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXI7Ci0vLyBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci0vLyBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5YU0RBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5YU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLQotLy8KLS8vCi1wdWJsaWMgY2xhc3MgWFNERXh0ZW5zaW9uIGltcGxlbWVudHMgV1NETEVkaXRvckV4dGVuc2lvbgotewotICBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbCB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5OwotICBYU0RBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgYWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotICAKLSAgcHVibGljIFhTREV4dGVuc2lvbigpCi0gIHsKLSAgICB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5ID0gbmV3IFhTRE1vZGVsQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0gICAgYWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyID0gbmV3IFhTREFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcih4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb25UeXBlU3VwcG9ydGVkKGludCB0eXBlKQotICB7Ci0gICAgcmV0dXJuIAotICAgICAgICAgICAvL0NTIGNvbW1lbnQgdGhlc2Ugb3V0IHVudGlsIHRoZSBwb3J0IGlzIGNvbXBsZXRlCi0gICAgICAgICAgIHR5cGUgPT0gT1VUTElORV9UUkVFX0NPTlRFTlRfUFJPVklERVIgfHwgCi0gICAgICAgICAgIHR5cGUgPT0gT1VUTElORV9MQUJFTF9QUk9WSURFUiB8fAotICAgICAgICAgICB0eXBlID09IFBST1BFUlRZX1NPVVJDRV9QUk9WSURFUiB8fAotICAgICAgICAgICB0eXBlID09IFBST1BFUlRZX1NFQ1RJT05fREVTQ1JJUFRPUl9QUk9WSURFUiB8fAotICAgICAgICAgICB0eXBlID09IE1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SIHx8Ci0gICAgICAgICAgIHR5cGUgPT0gREVUQUlMU19WSUVXRVJfUFJPVklERVIgfHwKLSAgICAgICAgICAgdHlwZSA9PSBFRElUX1BBUlRfRkFDVE9SWSB8fCAKLSAgICAgICAgICAgdHlwZSA9PSBUWVBFX1NZU1RFTV9QUk9WSURFUiB8fAotICAgICAgICAgICB0eXBlID09IE5PREVfUkVDT05DSUxFUiB8fAotICAgICAgICAgICB0eXBlID09IE5PREVfQVNTT0NJQVRJT05fUFJPVklERVIgfHwKLSAgICAgICAgICAgdHlwZSA9PSBNT0RFTF9RVUVSWV9DT05UUklCVVRPUjsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCB8fCAKLSAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50IHx8Ci0gICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeUFkYXB0ZXIgfHwKLSAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5KTsKLSAgICAgICAgICAgIC8vIHx8IG9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlcik7Ci0gIH0gCi0KLSAgcHVibGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb25PYmplY3QoaW50IHR5cGUsIFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIE9VVExJTkVfVFJFRV9DT05URU5UX1BST1ZJREVSIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhTRE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlcih4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsgCi0vLyAgICAgICAgcmVzdWx0ID0gbmV3IFhTRE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlcigpOwotICAgICAgICAvLyByZXN1bHQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoWFNERXh0ZW5zaW9uUGx1Z2luLmdldFhTRFNlbWFudGljSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBPVVRMSU5FX0xBQkVMX1BST1ZJREVSIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhTRExhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKTsKLSAgICAgICAgLy8gcmVzdWx0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihYU0RFeHRlbnNpb25QbHVnaW4uZ2V0WFNEU2VtYW50aWNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIERFVEFJTFNfVklFV0VSX1BST1ZJREVSIDoKLSAgICAgIHsKLSAgICAgICAgLy8gcmVzdWx0ID0gbmV3IFhTRERldGFpbHNWaWV3ZXJQcm92aWRlcigpOwotICAgICAgICByZXN1bHQgPSBudWxsOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTUVOVV9BQ1RJT05fQ09OVFJJQlVUT1IgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNETWVudUFjdGlvbkNvbnRyaWJ1dG9yKHdzZGxFZGl0b3IpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgVFlQRV9TWVNURU1fUFJPVklERVIgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNEVHlwZVN5c3RlbVByb3ZpZGVyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAKLSAgICAgIGNhc2UgRURJVF9QQVJUX0ZBQ1RPUlkgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNERXh0ZW5zaW9uRWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOT0RFX1JFQ09OQ0lMRVIgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNETm9kZVJlY29uY2lsZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgCi0gICAgICBjYXNlIE5PREVfQVNTT0NJQVRJT05fUFJPVklERVIgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNETm9kZUFzc29jaWF0aW9uUHJvdmlkZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICAgIGNhc2UgTU9ERUxfUVVFUllfQ09OVFJJQlVUT1IgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNETW9kZWxRdWVyeUNvbnRyaWJ1dG9yKHdzZGxFZGl0b3IpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUFJPUEVSVFlfU09VUkNFX1BST1ZJREVSOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNEUHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUFJPUEVSVFlfU0VDVElPTl9ERVNDUklQVE9SX1BST1ZJREVSOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgWFNEX0RFTEVURV9BQ1RJT046Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBEZWxldGVBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RFeHRlbnNpb25FZGl0UGFydEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RFeHRlbnNpb25FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNTBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERXh0ZW5zaW9uRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmdyYXBoLmVkaXRwYXJ0cy5YU0RTY2hlbWFEcmlsbERvd25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5YU0RFZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREV4dGVuc2lvbkVkaXRQYXJ0RmFjdG9yeSBleHRlbmRzIFhTREVkaXRQYXJ0RmFjdG9yeQotewotICBwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgcGFyZW50LCBPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTY2hlbWEgJiYgcGFyZW50LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgeyAgICAgICAgIAotICAgICAgZWRpdFBhcnQgPSBuZXcgWFNEU2NoZW1hRHJpbGxEb3duRWRpdFBhcnQoKTsKLSAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIGVkaXRQYXJ0LnNldFBhcmVudChwYXJlbnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWRpdFBhcnQgPSBzdXBlci5jcmVhdGVFZGl0UGFydChwYXJlbnQsIG1vZGVsKTsKLSAgICB9Ci0gCi0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjExMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotCi0vKioKLSAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgWFNETGFiZWxQcm92aWRlciBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9uZSBpbiBYU0RFZGl0b3IuCi0gKiBUaGlzIHByb3ZpZGVyIG9ubHkgbmVlZHMgdG8gaGFuZGxlIG5vZGVzIGluIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZS4KLSAqIE90aGVyIFhNTCBub2RlcyAoaW5jbHVkaW5nIGNvbW1lbnRzLCBQSXMgZXRjKSBnZXQgaGFuZGxlZCBieSB0aGUgJ21haW4nIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgWFNETGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsKLSAgWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSUxhYmVsUHJvdmlkZXJDbGFzcyA9IElMYWJlbFByb3ZpZGVyLmNsYXNzOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBYU0RMYWJlbFByb3ZpZGVyLgotICAgKi8KLSAgcHVibGljIFhTRExhYmVsUHJvdmlkZXIoWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5hZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgPSBhZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQotICAgKi8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7Ci0gICAgICBlbGVtZW50ID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50KS5nZXRTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiBhZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0gIH0KLSAgICAKLSAgLyoKLSAgICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIC8vIG92ZXJyaWRlIHRleHQgZm9yIHhzZCBzY2hlbWEKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICByZXR1cm4gKChYU0RTY2hlbWEpZWxlbWVudCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgCS8vIFdlIGRvbid0IGNhbGwgImFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpIiBiZWNhdXNlIGl0IHdpbGwgcmV0dXJuIGEgb2JqZWN0LnRvU3RyaW5nKCkgaWYKLSAgICAJLy8gdGhlcmUgaXMgbm8gbGFiZWxQcm92aWRlci4uLi4gIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGRpc3BsYXkgdGhpcyAnZ2FyYmFnZScgaW5mbyB0byB0aGUgdXNlci4gICAgCQotICAgIAlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5nZXRBZGFwdGVyRmFjdG9yeSgpOwotICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gKElMYWJlbFByb3ZpZGVyKWFkYXB0ZXJGYWN0b3J5LmFkYXB0KGVsZW1lbnQsIElMYWJlbFByb3ZpZGVyQ2xhc3MpOwotICAgICAgICBTdHJpbmcgdGV4dCA9ICIiOwotICAgICAgICBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgIAl0ZXh0ID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0gIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA1MTI0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETENvbXBvbmVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmFjdGlvbnMuQWRkU2NoZW1hQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5hY3Rpb25zLkJhY2tBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNETWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuRE9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLlRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3ZpZGVyLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwYXJ0cy5BYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydDsKLQotcHVibGljIGNsYXNzIFhTRE1lbnVBY3Rpb25Db250cmlidXRvciBpbXBsZW1lbnRzIElNZW51QWN0aW9uQ29udHJpYnV0b3IKLXsKLSAgRWxlbWVudCBjdXJyRWxlbWVudDsKLSAgRG9jdW1lbnQgY3VyckRvY3VtZW50OwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotLy8gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgaVNlbGVjdGlvblByb3ZpZGVyOwotICBXU0RMRWRpdG9yIHdzZGxFZGl0b3I7Ci0KLSAgcHVibGljIFhTRE1lbnVBY3Rpb25Db250cmlidXRvcihXU0RMRWRpdG9yIHdzZGxFZGl0b3IpCi0gIHsKLSAgICB0aGlzLndzZGxFZGl0b3IgPSB3c2RsRWRpdG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZU1lbnVBY3Rpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsIE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RNZW51RXh0ZW5zaW9uTGlzdGVuZXIgeHNkTWVudUxpc3RlbmVyID0gbmV3IFhTRE1lbnVFeHRlbnNpb25MaXN0ZW5lcih3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgeHNkTWVudUxpc3RlbmVyLmNvbnRyaWJ1dGVNZW51QWN0aW9ucyhtYW5hZ2VyLCBub2RlLCBvYmplY3QpOwotICB9Ci0KLSAgY2xhc3MgWFNETWVudUV4dGVuc2lvbkxpc3RlbmVyIGV4dGVuZHMgWFNETWVudUxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgWFNETWVudUV4dGVuc2lvbkxpc3RlbmVyKElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgICB7Ci0gICAgICBzdXBlcihzZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29udHJpYnV0ZU1lbnVBY3Rpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgdXBkYXRlWFNEU2NoZW1hKCk7Ci0gICAgICBBYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCBlZGl0UGFydCA9IChBYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCl3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCkuZ2V0Um9vdEVkaXRQYXJ0KCkuZ2V0Q29udGVudHMoKTsKLS8vICAgIGlTZWxlY3Rpb25Qcm92aWRlciA9ICgoV1NETENvbnRlbnRPdXRsaW5lUGFnZSkod3NkbEVkaXRvci5nZXRXU0RMVGV4dEVkaXRvcigpLmdldENvbnRlbnRPdXRsaW5lUGFnZSgpKSkuZ2V0VHJlZVZpZXdlcigpOwotICAgICAgRWRpdFBhcnQgZm9jdXNFZGl0UGFydCA9IHdzZGxFZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKS5nZXRGb2N1c0VkaXRQYXJ0KCk7Ci0KLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIFdTRExHcm91cE9iamVjdCBncm91cCA9IChXU0RMR3JvdXBPYmplY3Qpb2JqZWN0OwotICAgICAgICBpZiAoZ3JvdXAuZ2V0VHlwZSgpID09IFdTRExHcm91cE9iamVjdC5UWVBFU19HUk9VUCkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gdHlwZXNFeGlzdCA9IGdyb3VwLmdldFBhcmVudCgpLmdldFR5cGVzKCkgIT0gbnVsbDsKLSAgICAgICAgICAKLSAgICAgICAgICBFbGVtZW50IHR5cGVzRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgaWYgKHR5cGVzRXhpc3QpCi0gICAgICAgICAgewotICAgICAgICAgICAgVHlwZXMgdHlwZXMgPSBncm91cC5nZXRQYXJlbnQoKS5nZXRFVHlwZXMoKTsKLSAgICAgICAgICAgIHR5cGVzRWxlbWVudCA9IHR5cGVzLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZWRpdFBhcnQuZ2V0Vmlld2VyKCkgaW5zdGFuY2VvZiBXU0RMQ29tcG9uZW50Vmlld2VyKSB7Ci0gICAgICAgICAgICAgIFdTRExDb21wb25lbnRWaWV3ZXIgd3NkbENvbXBvbmVudFZpZXdlciA9IChXU0RMQ29tcG9uZW50Vmlld2VyKSBlZGl0UGFydC5nZXRWaWV3ZXIoKTsKLSAgICAgICAgICAgICAgZG9jdW1lbnQgPSB3c2RsQ29tcG9uZW50Vmlld2VyLmdldFdTRExFZGl0b3IoKS5nZXRYTUxEb2N1bWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgQWRkU2NoZW1hQWN0aW9uKGdyb3VwLmdldERlZmluaXRpb24oKSwgKEVsZW1lbnQpbm9kZSwgdHlwZXNFbGVtZW50LCBkb2N1bWVudCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAKLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFR5cGVzKQotICAgICAgewotICAgICAgICAvLyBJTWVudU1hbmFnZXIgbWVudSA9IG1hbmFnZXIuZmluZE1lbnVVc2luZ1BhdGgoImFkZGNoaWxkIik7Ci0KLSAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFR5cGVzIHR5cGVzID0gKFR5cGVzKW9iamVjdDsKLSAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgQWRkU2NoZW1hQWN0aW9uKHR5cGVzLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgKEVsZW1lbnQpbm9kZSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh4c2RTY2hlbWEgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgCi0gICAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICBOb2RlIHJlbGF0aXZlTm9kZSA9IG51bGw7Ci0gICAgICAKLSAgICAgIEJhY2tBY3Rpb24gYmFja0FjdGlvbjsKLSAgICAgIAotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fCBmb2N1c0VkaXRQYXJ0IGluc3RhbmNlb2YgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCB8fCBvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeSkKLSAgICAgIHsKLSAgICAgICAgYmFja0FjdGlvbiA9IG5ldyBCYWNrQWN0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JBQ0tfVE8iLCAiRGVmaW5pdGlvbiIpKTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXREZWZpbml0aW9uKHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihzZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgICAgIGJhY2tBY3Rpb24uc2V0Um9vdEVkaXRQYXJ0KGVkaXRQYXJ0KTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXRHcmFwaFZpZXdlcih3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkpOwotICAgICAgICBtYW5hZ2VyLmFkZChiYWNrQWN0aW9uKTsKLSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBiYWNrQWN0aW9uID0gbmV3IEJhY2tBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9CQUNLX1RPX1NDSEVNQV9WSUVXIikpOwotICAgICAgICAvLyBiYWNrQWN0aW9uLnNldFhTRFNjaGVtYSgoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdCkuZ2V0U2NoZW1hKCkpOwotICAgICAgICBiYWNrQWN0aW9uLnNldFhTRFNjaGVtYSh4c2RTY2hlbWEpOwotICAgICAgICBiYWNrQWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXRSb290RWRpdFBhcnQoZWRpdFBhcnQpOwotICAgICAgICBiYWNrQWN0aW9uLnNldEdyYXBoVmlld2VyKHdzZGxFZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKSk7Ci0gICAgICAgIG1hbmFnZXIuYWRkKGJhY2tBY3Rpb24pOwotICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgfQotCi0gICAgICAvLyBDUzogSSdtIHJlbW92aW5nIHRoZSAnb2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCcgY2FzZSBmcm9tIHRoaXMgdGVzdAotICAgICAgLy8gZm9yIG5vdyB0aGUgbWVudSBhY3Rpb25zIGFyZSBkcml2ZW4gZnJvbSAnbW9kZWwnIG9iamVjdHMKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCB8fCAob2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpKQotICAgICAgewotICAgICAgICBFbGVtZW50IHBhcmVudDsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgcGFyZW50ID0gKEVsZW1lbnQpb2JqZWN0OyAKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHNjaGVtYSA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudClvYmplY3Q7Ci0gICAgICAgICAgeHNkU2NoZW1hID0gc2NoZW1hLmdldFNjaGVtYSgpOwotICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgcGFyZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGN1cnJFbGVtZW50ID0gcGFyZW50OwotICAgICAgICBjdXJyRG9jdW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAKLS8vICAgICAgICBpZiAoIShjdXJyRG9jdW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudEltcGwpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHJldHVybjsKLS8vICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhZGRDb250ZXh0SXRlbXMobWFuYWdlciwgY3VyckVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkgfHwKLSAgICAgICAgICAgCShvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEgJiYgISh3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCkuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkpKSB7Ci0gICAgICAgICAgIAlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25zID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgIAlvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkRlbGV0ZVdTRExBbmRYU0RBY3Rpb24gZGVsZXRlV1NETEFuZFhTREFjdGlvbiA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkRlbGV0ZVdTRExBbmRYU0RBY3Rpb24oc2VsZWN0aW9ucy50b0xpc3QoKSwgY3VyckVsZW1lbnQsIHdzZGxFZGl0b3IpOwotICAgICAgICAgICAJZGVsZXRlV1NETEFuZFhTREFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICAgCW1hbmFnZXIuYWRkKGRlbGV0ZVdTRExBbmRYU0RBY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeQotICAgICAgICAgICAgfHwgb2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgICAgewotICAgICAgICBpbnQgZ3JvdXBUeXBlID0gLTE7Ci0KLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5KQotICAgICAgICB7Ci0gICAgICAgICAgQ2F0ZWdvcnkgY2cgPSAoQ2F0ZWdvcnkpb2JqZWN0OwotICAgICAgICAgIHhzZFNjaGVtYSA9IGNnLmdldFhTRFNjaGVtYSgpOwotICAgICAgICAgIGdyb3VwVHlwZSA9IGNnLmdldEdyb3VwVHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgIC8vIENhdGVnb3J5QWRhcHRlcgotICAgICAgICB7Ci0gICAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGNhdGVnb3J5ID0gKENhdGVnb3J5QWRhcHRlcilvYmplY3Q7Ci0gICAgICAgICAgZ3JvdXBUeXBlID0gY2F0ZWdvcnkuZ2V0R3JvdXBUeXBlKCk7Ci0gICAgICAgICAgeHNkU2NoZW1hID0gY2F0ZWdvcnkuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRWxlbWVudCBwYXJlbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgICBjdXJyRWxlbWVudCA9IHBhcmVudDsKLSAgICAgICAgY3VyckRvY3VtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgc3dpdGNoIChncm91cFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIENhdGVnb3J5LlRZUEVTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3R2xvYmFsVHlwZU5hbWUoIkNvbXBsZXhUeXBlIikpKTsKLSAgICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbilhY3Rpb24pLnNldElzR2xvYmFsKHRydWUpOwotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdHbG9iYWxUeXBlTmFtZSgiU2ltcGxlVHlwZSIpKSk7Ci0gICAgICAgICAgICBBY3Rpb24gYWN0aW9uMiA9IGFkZENyZWF0ZVNpbXBsZVR5cGVBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbilhY3Rpb24yKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5LkVMRU1FTlRTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3R2xvYmFsTmFtZShYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgIkdsb2JhbEVsZW1lbnQiKSkpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpKSk7Ci0gICAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfRUxFTUVOVCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5LkdST1VQUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0dsb2JhbE5hbWUoWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCAiR3JvdXAiKSkpOwotICAgICAgICAgICAgQ3JlYXRlR3JvdXBBY3Rpb24gZ3JvdXBBY3Rpb24gPSBhZGRDcmVhdGVHcm91cEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0dST1VQIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICAgIGdyb3VwQWN0aW9uLnNldElzR2xvYmFsKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgQ2F0ZWdvcnkuQVRUUklCVVRFUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0dsb2JhbE5hbWUoWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgIkdsb2JhbEF0dHJpYnV0ZSIpKSk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkpKTsKLSAgICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0dMT0JBTF9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICAgKChDcmVhdGVFbGVtZW50QWN0aW9uKWFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeS5BVFRSSUJVVEVfR1JPVVBTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3R2xvYmFsTmFtZShYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsICJBdHRyaWJ1dGVHcm91cCIpKSk7Ci0gICAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOyAKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeS5OT1RBVElPTlM6Ci0gICAgICAgICAgewotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0dsb2JhbE5hbWUoWFNEQ29uc3RhbnRzLk5PVEFUSU9OX0VMRU1FTlRfVEFHLCAiTm90YXRpb24iKSkpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuUFVCTElDX0FUVFJJQlVURSwgIiIpKTsKLSAgICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICAgKChDcmVhdGVFbGVtZW50QWN0aW9uKWFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeS5ESVJFQ1RJVkVTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYiA9IHRydWU7Ci0gICAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICBOb2RlIGVmZmVjdGl2ZVJlbGF0aXZlTm9kZSA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKSAmJiBiOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KWNoaWxkLCBYU0RDb25zdGFudHMuSU5DTFVERV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCljaGlsZCwgWFNEQ29uc3RhbnRzLklNUE9SVF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCljaGlsZCwgWFNEQ29uc3RhbnRzLlJFREVGSU5FX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KWNoaWxkLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJlbGF0aXZlTm9kZSA9IGNoaWxkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVsYXRpdmVOb2RlID0gZWZmZWN0aXZlUmVsYXRpdmVOb2RlICE9IG51bGwgPyBlZmZlY3RpdmVSZWxhdGl2ZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA6IG51bGw7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuU0NIRU1BTE9DQVRJT05fQVRUUklCVVRFLCAiIikpOwotCi0gICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5JTkNMVURFX0VMRU1FTlRfVEFHLFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lOQ0xVREUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuSU1QT1JUX0VMRU1FTlRfVEFHLFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lNUE9SVCIpLCBudWxsLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5SRURFRklORV9FTEVNRU5UX1RBRyxYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9SRURFRklORSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAKLQotICAgIHByb3RlY3RlZCBJRmlsZSBnZXRGaWxlUmVzb3VyY2UoKQotICAgIHsKLSAgLy8vLy8gV1NETCBUT0RPCi0gIC8vICAgIGlmIChnZXRFZGl0b3IoKSAhPSBudWxsKQotICAvLyAgICAgIHJldHVybiBnZXRFZGl0b3IoKS5nZXRGaWxlUmVzb3VyY2UoKTsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotLy8gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3RlZEVsZW1lbnQoKQotLy8gICAgewotLy8gICAgICByZXR1cm4gY3VyckVsZW1lbnQ7Ci0vLyAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGdldFhTRFNjaGVtYSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgICB9Ci0gIAotICAgIHByb3RlY3RlZCBJRE9NTW9kZWwgZ2V0WE1MTW9kZWwoKQotICAgIHsKLSAgICAgIGlmIChjdXJyRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gY3VyckVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRG9jdW1lbnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgRG9jdW1lbnRJbXBsIHhtbERvYyA9IChEb2N1bWVudEltcGwpIGN1cnJFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICByZXR1cm4geG1sRG9jLmdldE1vZGVsKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTMzMGI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNEQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBYU0RDb250ZW50UHJvdmlkZXIKLXsgIAotICBwdWJsaWMgWFNETW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyKFhTRE1vZGVsQWRhcHRlckZhY3RvcnlJbXBsIHhzZE1vZGVsQWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICBzdXBlcih4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50T2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG51bGw7Ci0KLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wID0gbnVsbDsKLSAgICBpZiAocGFyZW50T2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpcGFyZW50T2JqZWN0OwotICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHhzZENvbXAgPSB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5nZXRTY2hlbWEoKTsKLSAgICAgIHJldHVybiBzdXBlci5nZXRDaGlsZHJlbih4c2RDb21wKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudE9iamVjdCk7ICAgIAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNb2RlbFF1ZXJ5Q29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNb2RlbFF1ZXJ5Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4MWRkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETW9kZWxRdWVyeUNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsgICAgICAKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSU1vZGVsUXVlcnlDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuQWJzdHJhY3RYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuQWJzdHJhY3RYU0RNb2RlbFF1ZXJ5Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbFF1ZXJ5Q29udHJpYnV0b3IgZXh0ZW5kcyBBYnN0cmFjdFhTRE1vZGVsUXVlcnlDb250cmlidXRvciBpbXBsZW1lbnRzIElNb2RlbFF1ZXJ5Q29udHJpYnV0b3IKLXsgCi0gIHByb3RlY3RlZCBXU0RMRWRpdG9yIHdzZGxFZGl0b3I7Ci0KLSAgcHVibGljIFhTRE1vZGVsUXVlcnlDb250cmlidXRvcihXU0RMRWRpdG9yIHdzZGxFZGl0b3IpCi0gIHsKLSAgICB0aGlzLndzZGxFZGl0b3IgPSB3c2RsRWRpdG9yOwotICB9Ci0gIAotICBwdWJsaWMgQWJzdHJhY3RYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uIGNyZWF0ZVhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24oTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICB7Ci0gICAgcmV0dXJuIG5ldyBYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uKG1vZGVsUXVlcnkpOyAKLSAgfQotCi0gIGNsYXNzIFhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdFhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24KLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIFhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24oTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICAgIHsKLSAgICAgIHN1cGVyKG1vZGVsUXVlcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgIHsKLSAgICAgIHJldHVybiAiV1NETC1YU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uIjsKLSAgICB9Ci0gICAgIAotICAgIHByb3RlY3RlZCBYU0RTY2hlbWEgZ2V0RW5jbG9zaW5nWFNEU2NoZW1hKEVsZW1lbnQgZWxlbWVudCkKLSAgICB7ICAgICAgICAKLSAgICAgIFhTRFNjaGVtYSByZXN1bHQgPSBudWxsOwotICAgICAgT2JqZWN0IG8gPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCksIGVsZW1lbnQpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvKS5nZXRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgIAotCi0JICBwcm90ZWN0ZWQgVHlwZXNIZWxwZXIgY3JlYXRlVHlwZXNIZWxwZXIoWFNEU2NoZW1hIHNjaGVtYSkKLQkgIHsgCi0JCSAgcmV0dXJuIG5ldyBUeXBlc0hlbHBlcihzY2hlbWEpCi0JCSAgewotCQkJICBwcm90ZWN0ZWQgTGlzdCBnZXRQcmVmaXhlc0Zvck5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKQotCQkJICB7Ci0JCQkgIAlMaXN0IGxpc3QgPSBzdXBlci5nZXRQcmVmaXhlc0Zvck5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkJICAJTWFwIG1hcCA9IHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpLmdldE5hbWVzcGFjZXMoKTsKLQkJCSAgCWZvciAoSXRlcmF0b3IgaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQkgIAl7Ci0JCQkgIAkJU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpaS5uZXh0KCk7Ci0JCQkgIAkJU3RyaW5nIG5zID0gKFN0cmluZyltYXAuZ2V0KHByZWZpeCk7Ci0JCQkgICAJCWlmIChucyAhPSBudWxsICYmIG5zLmVxdWFscyhuYW1lc3BhY2UpKQotCQkJCSAgCXsJCQkJCQotCQkJCSAgCSAgaWYgKCFsaXN0LmNvbnRhaW5zKHByZWZpeCkpCi0JCQkJICAJICB7Ci0JCQkJICAJCWxpc3QuYWRkKHByZWZpeCk7Ci0JCQkJICAJICB9Ci0JCQkJICAJfSAgCi0JICAJCQl9CQotCSAgCQkJcmV0dXJuIGxpc3Q7Ci0JICAJCX0JCQkJCi0JICAJfTsJCQotICAJfSAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWRlOTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklOb2RlQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLm1vZGVsLkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuQ2F0ZWdvcnlBZGFwdGVyOwotCi1jbGFzcyBYU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElOb2RlQXNzb2NpYXRpb25Qcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoT2JqZWN0IHBhcmVudE1vZGVsT2JqZWN0LCBFbGVtZW50W10gZWxlbWVudENoYWluLCBpbnQgc3RhcnQsIGludFtdIGVuZCkKLSAgeyAgIAotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChwYXJlbnRNb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KXBhcmVudE1vZGVsT2JqZWN0OwotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGV4dGVuc2liaWxpdHlFbGVtZW50LmdldFNjaGVtYSgpOwotICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAKLSAgICAgICAgRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gZWxlbWVudENoYWluW2VsZW1lbnRDaGFpbi5sZW5ndGggLSAxXTsKLSAgICAgICAgcmVzdWx0ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQodGFyZ2V0RWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudE1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQ2F0ZWdvcnlBZGFwdGVyKXBhcmVudE1vZGVsT2JqZWN0KS5nZXRYU0RTY2hlbWEoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50TW9kZWxPYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKENhdGVnb3J5KXBhcmVudE1vZGVsT2JqZWN0KS5nZXRYU0RTY2hlbWEoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZShPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsgICAgICAgIAotICAgIE5vZGUgbm9kZSA9IG51bGw7Ci0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCltb2RlbE9iamVjdDsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBleHRlbnNpYmlsaXR5RWxlbWVudC5nZXRTY2hlbWEoKTsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgCi0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBub2RlID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbE9iamVjdCkuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICB7Ci0gICAgICBub2RlID0gKChDYXRlZ29yeUFkYXB0ZXIpbW9kZWxPYmplY3QpLmdldFhTRFNjaGVtYSgpLmdldEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeSkKLSAgICB7Ci0gICAgICBub2RlID0gKChDYXRlZ29yeSltb2RlbE9iamVjdCkuZ2V0WFNEU2NoZW1hKCkuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbm9kZTsKLSAgfSAgICAgIAotfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETm9kZVJlY29uY2lsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlUmVjb25jaWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjNhNWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklOb2RlUmVjb25jaWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgWFNETm9kZVJlY29uY2lsZXIgaW1wbGVtZW50cyBJTm9kZVJlY29uY2lsZXIKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE9iamVjdCBtb2RlbE9iamVjdCwgRWxlbWVudCBlbGVtZW50LCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbE9iamVjdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW1vZGVsT2JqZWN0OwotICAgICAgY29tcG9uZW50ID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgfSAgIAotCi0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFOgotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnRBdHRyaWJ1dGVzQ2hhbmdlZChlbGVtZW50KTsgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEOgotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnRDb250ZW50c0NoYW5nZWQoZWxlbWVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRDoKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gIH0KLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFByb3BlcnR5U291cmNlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZmYzNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFByb3BlcnR5U291cmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuQW55QXR0cmlidXRlUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkFueUVsZW1lbnRQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuQXBwSW5mb1Byb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5BdHRyaWJ1dGVHcm91cFJlZlByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5BdHRyaWJ1dGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuQmFzZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5Db21wbGV4VHlwZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5Eb2N1bWVudGF0aW9uUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkVsZW1lbnRQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuRW51bWVyYXRpb25Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuSW1wb3J0UHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkluY2x1ZGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuS2V5cmVmUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLk1vZGVsR3JvdXBQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuTmFtZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5Ob3RhdGlvblByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5QYXR0ZXJuUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlNjaGVtYVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5TaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlNpbXBsZVJlc3RyaWN0UHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlNpbXBsZVR5cGVMaXN0UHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlNpbXBsZVR5cGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuU2ltcGxlVHlwZVVuaW9uUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlhQYXRoUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWFNEUHJvcGVydHlTb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyI2dldFByb3BlcnR5U291cmNlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpCi0gIHsKLS8vIFVzaW5nIFhTRCdzIGl0ZW0gcHJvdmlkZXJzCi0vLyAgICBYU0RJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFhTREV4dGVuc2lvblBsdWdpbi5nZXRYU0RJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotLy8gICAKLS8vICAgIElJdGVtUHJvcGVydHlTb3VyY2UgaXRlbVByb3BlcnR5U291cmNlID0KLS8vICAgICAgKElJdGVtUHJvcGVydHlTb3VyY2UpCi0vLyAgICAgICAgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkgPT0gbnVsbCA/Ci0vLyAgICAgICAgICBudWxsIDoKLS8vICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcykpOwotLy8gICAgcmV0dXJuIAotLy8gICAgaXRlbVByb3BlcnR5U291cmNlICE9IG51bGwgPyAgY3JlYXRlUHJvcGVydHlTb3VyY2Uob2JqZWN0LCBpdGVtUHJvcGVydHlTb3VyY2UpIDogbnVsbDsKLSAgICAKLSAgICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiBudWxsOwotICAgIAotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7Ci0gICAgICBvYmplY3QgPSAoKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgfQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBCYXNlUHJvcGVydHlTb3VyY2UgYnBzID0gKEJhc2VQcm9wZXJ0eVNvdXJjZSlnZXRYU0RQcm9wZXJ0eVNvdXJjZShvYmplY3QpOwotICAgICAgRWxlbWVudCBpbnB1dCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgICBicHMuc2V0SW5wdXQoaW5wdXQpOwotICAgICAgcmV0dXJuIGJwczsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVByb3BlcnR5U291cmNlIGNyZWF0ZVByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QsIElJdGVtUHJvcGVydHlTb3VyY2UgaXRlbVByb3BlcnR5U291cmNlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVNvdXJjZShvYmplY3QsIGl0ZW1Qcm9wZXJ0eVNvdXJjZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlucHV0RXF1YWxzKE9iamVjdCBpbnB1dCwgU3RyaW5nIHRhZ25hbWUsIGJvb2xlYW4gaXNSZWYpCi0gIHsKLSAgICByZXR1cm4gWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGlucHV0LCB0YWduYW1lLCBpc1JlZik7Ci0gIH0KLQotICBib29sZWFuIHNob3dQYXJlbnQgPSBmYWxzZTsKLSAgCi0gIC8vIFRPRE86IFdlIHNob3VsZCB1c2UgYWRhcHRlcnMgdG8gZG8gdGhpcy4gIERvIGFzIHdlIGNvbXBsZXRlICdtb2RlbCctYmFzZWQgcG9ydAotICBwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFhTRFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmplY3QpLmdldFNjaGVtYSgpOwotICAgIEVsZW1lbnQgaW5wdXQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdCkuZ2V0RWxlbWVudCgpOwotCi0gICAgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRWxlbWVudFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBHcm91cFJlZlByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICBpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgIGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBNb2RlbEdyb3VwUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZUdyb3VwUmVmUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTmFtZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBOb3RhdGlvblByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlVHlwZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IE5hbWVQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyb3VwUmVmUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNjaGVtYVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudGF0aW9uUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BUFBJTkZPX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBBcHBJbmZvUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IHBhcmVudCA9IChFbGVtZW50KWlucHV0OwotICAgICAgICBYU0RET01IZWxwZXIgeHNkRE9NSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSB4c2RET01IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChwYXJlbnQpOwotICAgICAgICBpZiAoZGVyaXZlZEJ5Tm9kZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlucHV0RXF1YWxzKGRlcml2ZWRCeU5vZGUsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IAotICAgICAgICAgICAgICBpbnB1dEVxdWFscyhkZXJpdmVkQnlOb2RlLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudClpbnB1dDsKLSAgICAgICAgWFNERE9NSGVscGVyIHhzZERPTUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgRWxlbWVudCBkZXJpdmVkQnlOb2RlID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnQocGFyZW50KTsKLSAgICAgICAgaWYgKGRlcml2ZWRCeU5vZGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQ29udGVudFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5JTkNMVURFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotLy8gICAgICBpZiAoZWRpdG9yIGluc3RhbmNlb2YgWFNERWRpdG9yKQotLy8gICAgICB7Ci0vLyAgICAgICAgSUZpbGUgaW5wdXRGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0gICAgICAgIElGaWxlIGlucHV0RmlsZSA9IG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgSW5jbHVkZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSwgaW5wdXRGaWxlKTsKLS8vICAgICAgfQotLy8gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0vLyAgICAgIGlmIChlZGl0b3IgaW5zdGFuY2VvZiBYU0RFZGl0b3IpCi0vLyAgICAgIHsKLS8vICAgICAgICBJRmlsZSBpbnB1dEZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9yLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgIElGaWxlIGlucHV0RmlsZSA9IG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgSW1wb3J0UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hLCBpbnB1dEZpbGUpOwotLy8gICAgICB9Ci0vLyAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlJFREVGSU5FX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotLy8gICAgICBpZiAoZWRpdG9yIGluc3RhbmNlb2YgWFNERWRpdG9yKQotLy8gICAgICAgewotLy8gICAgICAgIElGaWxlIGlucHV0RmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCllZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotICAgICAgSUZpbGUgaW5wdXRGaWxlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBJbmNsdWRlUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hLCBpbnB1dEZpbGUpOwotLy8gICAgICB9Ci0vLyAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVR5cGVMaXN0UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlVHlwZVVuaW9uUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBjcmVhdGVSZXN0cmljdFdpbmRvdyhpbnB1dCwgeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlzRmFjZXQoaW5wdXQpKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSAoKEVsZW1lbnQpaW5wdXQpLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKGlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gY3JlYXRlUmVzdHJpY3RXaW5kb3coaW5wdXQsIHhzZFNjaGVtYSk7Ci0gICAgICAgIH0gCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBOb2RlIHBhcmVudCA9ICgoRWxlbWVudClpbnB1dCkuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAoaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKQotICAgICAgICAgICAgfHwgaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICB7Ci0gICAgICAgICAgc2hvd1BhcmVudCA9IHRydWU7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlBBVFRFUk5fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFBhdHRlcm5Qcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBFbnVtZXJhdGlvblByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQU5ZX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBBbnlFbGVtZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEFueUF0dHJpYnV0ZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuVU5JUVVFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBOYW1lUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5LRVlSRUZfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEtleXJlZlByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0VMRUNUT1JfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFhQYXRoUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5GSUVMRF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWFBhdGhQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLktFWV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTmFtZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJUHJvcGVydHlTb3VyY2UgY3JlYXRlUmVzdHJpY3RXaW5kb3coT2JqZWN0IGlucHV0LCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgLy8gc3BlY2lhbCBjYXNlIHdoZXJlIFNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gaXMgZGlmZmVyZW50IHRoYW4gU2ltcGxlQ29udGVudCByZXN0cmljdGlvbgotCi0gICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIE5vZGUgcGFyZW50ID0gKChFbGVtZW50KWlucHV0KS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICBpZiAoaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVJlc3RyaWN0UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVSZXN0cmljdFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBzaG93UGFyZW50ID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWY1YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyIGltcGxlbWVudHMgSVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIKLXsKLSAgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlciBkZXNjcmlwdG9yOwotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGRlc2NyaXB0b3IgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlciNnZXRTZWN0aW9uRGVzY3JpcHRvcnMoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uRGVzY3JpcHRvcltdIGdldFNlY3Rpb25EZXNjcmlwdG9ycygpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRvci5nZXRTZWN0aW9uRGVzY3JpcHRvcnMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFRlbXBEZXRhaWxzVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEVGVtcERldGFpbHNWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwMWVmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEVGVtcERldGFpbHNWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlVmlld2VyOwotICAgICAgIAotCi1wdWJsaWMgY2xhc3MgWFNEVGVtcERldGFpbHNWaWV3ZXIgZXh0ZW5kcyBCYXNlVmlld2VyCi17ICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLQotICBwdWJsaWMgWFNEVGVtcERldGFpbHNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAKLSAgICBzdXBlcihudWxsKTsKLSAgICBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gIH0KLSAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29udHJvbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxLCB0cnVlKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVGbGF0UGFnZUhlYWRlcihjb250cm9sLCAiWFNEVmlld2VyIik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RUeXBlU3lzdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RUeXBlU3lzdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyODI1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREltcG9ydEltcGw7Ci0KLS8vCi0vLwotcHVibGljIGNsYXNzIFhTRFR5cGVTeXN0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUeXBlU3lzdGVtUHJvdmlkZXIKLXsKLSAgICBwdWJsaWMgTGlzdCBnZXRQcmVmaXhlcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE1hcCBtYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHRoZU5hbWVzcGFjZSA9IChTdHJpbmcpIG1hcC5nZXQocHJlZml4KTsKLSAgICAgICAgICAgIGlmICh0aGVOYW1lc3BhY2UgIT0gbnVsbCAmJiB0aGVOYW1lc3BhY2UuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQocHJlZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRQcmVmaXhlZE5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0UHJlZml4ZXMoZGVmaW5pdGlvbiwgbmFtZXNwYWNlKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOwotICAgICAgICAgICAgbGlzdC5hZGQobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTmFtZWRDb21wb25lbnRzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgTGlzdCBsaXN0LCBMaXN0IG5hbWVkQ29tcG9uZW50cykKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVkQ29tcG9uZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBsaXN0LmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKGRlZmluaXRpb24sIGNvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgY29tcG9uZW50LmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdFdTSVN0eWxlSW1wb3J0cyhYU0RTY2hlbWEgeHNkU2NoZW1hKQotICAgIHsKLSAgICAgICAgaWYgKHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0SW1wbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhTREltcG9ydEltcGwgeHNkSW1wb3J0ID0gKFhTREltcG9ydEltcGwpIGNvbnRlbnQ7Ci0JCQkJCVhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKXhzZEltcG9ydC5nZXRSZXNvbHZlZFNjaGVtYSgpOwkJCQkJCi0JCQkJCWlmIChzY2hlbWEgPT0gbnVsbCkKLQkJCQkJewotCQkJCQkJc2NoZW1hID0geHNkSW1wb3J0LmltcG9ydFNjaGVtYSgpOwotCQkJCQl9ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVR5cGVOYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCB0eXBlTmFtZUNhdGVnb3J5KQotICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGVOYW1lQ2F0ZWdvcnkgPT0gSVR5cGVTeXN0ZW1Qcm92aWRlci5CVUlMVF9JTl9UWVBFKSB7Ci0gICAgICAgIAlsaXN0ID0gZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoZGVmaW5pdGlvbik7ICAgICAgICAJCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIAlUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICAgIAlpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgICAgCXsKLSAgICAgICAgCQlmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAJCXsKLSAgICAgICAgCQkJT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgCQkJaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgCQkJewotICAgICAgICAJCQkJWFNEU2NoZW1hIHNjaGVtYSA9ICgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIG8pLmdldFNjaGVtYSgpOwotICAgICAgICAJCQkJaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAJCQkJewotICAgICAgICAJCQkJCWluaXRXU0lTdHlsZUltcG9ydHMoc2NoZW1hKTsKLSAgICAgICAgCQkJCQlhZGROYW1lZENvbXBvbmVudHMoZGVmaW5pdGlvbiwgbGlzdCwgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpKTsKLSAgICAgICAgCQkJCX0KLSAgICAgICAgCQkJfQotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgCi0gICAgICAgIAlmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAJewotICAgICAgICAJCUltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgICAgCQlYU0RTY2hlbWEgc2NoZW1hID0gdGhlSW1wb3J0LmdldEVTY2hlbWEoKTsKLSAgICAgICAgCQlpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgIAkJewotICAgICAgICAJCQlhZGROYW1lZENvbXBvbmVudHMoZGVmaW5pdGlvbiwgbGlzdCwgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIAlsaXN0LmFkZEFsbChnZXRCdWlsdEluVHlwZU5hbWVzTGlzdChkZWZpbml0aW9uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCXJldHVybiBsaXN0OyAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVR5cGVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSwgaW50IHR5cGVOYW1lQ2F0ZWdvcnkpCi0gICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIExpc3Qga2VlcFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciB0eXBlSXRlcmF0b3IgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgLy8gRmlsdGVyIG91dCB1bndhbnRlZCBUeXBlcwotICAgICAgICBpZiAodHlwZU5hbWVDYXRlZ29yeSA9PSBJVHlwZVN5c3RlbVByb3ZpZGVyLlVTRVJfREVGSU5FRF9DT01QTEVYX1RZUEUpIHsKLSAgICAgICAgCXdoaWxlICh0eXBlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJT2JqZWN0IHR5cGUgPSB0eXBlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJCWlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgIAkJCWtlZXBUeXBlcy5hZGQodHlwZSk7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lQ2F0ZWdvcnkgPT0gSVR5cGVTeXN0ZW1Qcm92aWRlci5VU0VSX0RFRklORURfU0lNUExFX1RZUEUpIHsKLSAgICAgICAgCXdoaWxlICh0eXBlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJT2JqZWN0IHR5cGUgPSB0eXBlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJCWlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgCQkJa2VlcFR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vYWRkTmFtZWRDb21wb25lbnRzKGRlZmluaXRpb24sIGxpc3QsIGtlZXBUeXBlcyk7ICAgICAgICAKLSAgICAgICAgLy9yZXR1cm4gbGlzdDsKLSAgICAgICAgcmV0dXJuIGtlZXBUeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgIHsKLSAgICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdCBwcmVmaXhlcyA9IGdldFByZWZpeGVzKGRlZmluaXRpb24sIFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJlZml4ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFhTRERPTUhlbHBlci5kYXRhVHlwZS5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBYU0RET01IZWxwZXIuZGF0YVR5cGVbal1bMF07Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOwotICAgICAgICAgICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVtczsKLSAgICB9Ci0gICAgcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlRWxlbWVudE5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgVHlwZXMgdHlwZXMgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpOwotICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJaW5pdFdTSVN0eWxlSW1wb3J0cyhzY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkTmFtZWRDb21wb25lbnRzKGRlZmluaXRpb24sIGxpc3QsIHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBJbXBvcnQgdGhlSW1wb3J0ID0gKEltcG9ydCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gdGhlSW1wb3J0LmdldEVTY2hlbWEoKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGROYW1lZENvbXBvbmVudHMoZGVmaW5pdGlvbiwgbGlzdCwgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgIHB1YmxpYyBpbnQgZ2V0Q2F0ZWdvcnlGb3JUeXBlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvYWN0aW9ucy9BZGRTY2hlbWFBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9hY3Rpb25zL0FkZFNjaGVtYUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDM3YjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9hY3Rpb25zL0FkZFNjaGVtYUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRTY2hlbWFBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVUeXBlc0VsZW1lbnQgPSBmYWxzZTsKLQotICBwdWJsaWMgQWRkU2NoZW1hQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCkKLSAgewotICAgIHRoaXMoZGVmaW5pdGlvbiwgZGVmaW5pdGlvbkVsZW1lbnQsIGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRTY2hlbWFBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50LCBib29sZWFuIGNyZWF0ZVR5cGVzRWxlbWVudCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfU0NIRU1BIiksICJpY29ucy94c2Rfb2JqLmdpZiIsIGRlZmluaXRpb25FbGVtZW50LCAieHNkOnNjaGVtYSIpOyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jcmVhdGVUeXBlc0VsZW1lbnQgPSBjcmVhdGVUeXBlc0VsZW1lbnQ7Ci0gICAgdGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsgICAgCi0gIH0KLQotICBwdWJsaWMgQWRkU2NoZW1hQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCwgRWxlbWVudCB0eXBlc0VsZW1lbnQpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NDSEVNQSIpLCAiaWNvbnMveHNkX29iai5naWYiLCBkZWZpbml0aW9uRWxlbWVudCwgInhzZDpzY2hlbWEiKTsgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmICh0eXBlc0VsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJlbnROb2RlID0gIHR5cGVzRWxlbWVudDsKLSAgICAgIHRoaXMuY3JlYXRlVHlwZXNFbGVtZW50ID0gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aGlzLmNyZWF0ZVR5cGVzRWxlbWVudCA9IHRydWU7ICAgICAgCi0gICAgfQotICAgIHRhcmdldE5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIEFkZFNjaGVtYUFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQsIEVsZW1lbnQgdHlwZXNFbGVtZW50LCBEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAJdGhpcyhkZWZpbml0aW9uLCBkZWZpbml0aW9uRWxlbWVudCwgdHlwZXNFbGVtZW50KTsKLSAgCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIAl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOnhzZCIsIFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoImVsZW1lbnRGb3JtRGVmYXVsdCIsICJxdWFsaWZpZWQiKTsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgCWJlZ2luUmVjb3JkaW5nKCk7Ci0gIAlpZiAocGFyZW50Tm9kZSA9PSBudWxsIHx8IChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkgewotICAJCWNyZWF0ZURlZmluaXRpb25TdHViKCk7Ci0gIAkJcHJlZml4ID0gbnVsbDsKLSAgCQl0YXJnZXROYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAJfQotICAJCi0gICAgaWYgKGNyZWF0ZVR5cGVzRWxlbWVudCkKLSAgICB7Ci0gICAgICBBZGRFbGVtZW50QWN0aW9uIGFkZFR5cGVzQWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oIiIsICJpY29ucy94c2Rfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHBhcmVudE5vZGUuZ2V0UHJlZml4KCksICJ0eXBlcyIpOwotICAgICAgYWRkVHlwZXNBY3Rpb24uc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gICAgICBhZGRUeXBlc0FjdGlvbi5ydW4oKTsKLSAgICAgIHBhcmVudE5vZGUgPSAgYWRkVHlwZXNBY3Rpb24uZ2V0TmV3RWxlbWVudCgpOwotICAgIH0gCi0gICAgc3VwZXIucnVuKCk7Ci0gICAgZW5kUmVjb3JkaW5nKCk7Ci0gIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvQmFja0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvQmFja0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJmNDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9hY3Rpb25zL0JhY2tBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETEdyYXBoVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwYXJ0cy5BYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydDsKLQotcHVibGljIGNsYXNzIEJhY2tBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIFdTRExHcmFwaFZpZXdlciBncmFwaFZpZXdlcjsKLSAgCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBCYWNrQWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRleHQKLSAgICovCi0gIHB1YmxpYyBCYWNrQWN0aW9uKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRleHQKLSAgICogQHBhcmFtIGltYWdlCi0gICAqLwotICBwdWJsaWMgQmFja0FjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKQotICB7Ci0gICAgc3VwZXIodGV4dCwgaW1hZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqIEBwYXJhbSBzdHlsZQotICAgKi8KLSAgcHVibGljIEJhY2tBY3Rpb24oU3RyaW5nIHRleHQsIGludCBzdHlsZSkKLSAgewotICAgIHN1cGVyKHRleHQsIHN0eWxlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMuc2VsZWN0aW9uUHJvdmlkZXIgPSBzZWxlY3Rpb25Qcm92aWRlcjsKLSAgfQotICAKLSAgQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgZWRpdFBhcnQ7Ci0gIHB1YmxpYyB2b2lkIHNldFJvb3RFZGl0UGFydChBYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHRoaXMuZWRpdFBhcnQgPSBlZGl0UGFydDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0WFNEU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0R3JhcGhWaWV3ZXIoV1NETEdyYXBoVmlld2VyIGdyYXBoVmlld2VyKQotICB7Ci0gICAgdGhpcy5ncmFwaFZpZXdlciA9IGdyYXBoVmlld2VyOwotICB9Ci0gIAotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih4c2RTY2hlbWEpOwotICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAvLyBlZGl0UGFydC5zZXRJbnB1dCh4c2RTY2hlbWEpOwotICAgICAgZ3JhcGhWaWV3ZXIuc2V0SW5wdXQoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmaW5pdGlvbik7Ci0gICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgIC8vIGVkaXRQYXJ0LnNldElucHV0KGRlZmluaXRpb24pOwotICAgICAgZ3JhcGhWaWV3ZXIuc2V0SW5wdXQoZGVmaW5pdGlvbik7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNGU0ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkRlbGV0ZUludGVyZmFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5kZWxldGUuQmFzZUdsb2JhbENsZWFudXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLy8gU2hvdWxkIHRyeSB0byB1c2UgeHNkZWRpdG9yJ3MgZGVsZXRlIGFjdGlvbi4uLi4KLQotcHVibGljIGNsYXNzIERlbGV0ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIERlbGV0ZUludGVyZmFjZUFjdGlvbgotewotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIExpc3QgZGVsZXRlTGlzdDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlQWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKi8KLSAgcHVibGljIERlbGV0ZUFjdGlvbihTdHJpbmcgdGV4dCkKLSAgewotICAgIHN1cGVyKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOwotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWxldGVMaXN0KExpc3QgbGlzdCkgewotICAJZGVsZXRlTGlzdCA9IGxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldERlbGV0ZUxpc3QoKSB7Ci0gIAlyZXR1cm4gZGVsZXRlTGlzdDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSUFjdGlvbiNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIExpc3Qgc2VsZWN0aW9ucyA9IGdldERlbGV0ZUxpc3QoKTsKLSAgICAKLSAgICBpZiAoc2VsZWN0aW9ucy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9ucy5pdGVyYXRvcigpOwotICAgIERvY3VtZW50SW1wbCBkb2MgPSBudWxsOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IG5vZGU7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IChFbGVtZW50KW9iajsKLSAgICAgICAgT2JqZWN0IGVsZW0gPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoZGVmaW5pdGlvbiwgbm9kZSk7Ci0gICAgICAgIGlmIChlbGVtIGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2NoZW1hID0gKChYU0RDb21wb25lbnQpZWxlbSkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBub2RlID0gKChYU0RDb21wb25lbnQpb2JqKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIHhzZFNjaGVtYSA9ICgoWFNEQ29tcG9uZW50KW9iaikuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotICAgICAgCW5vZGUgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iaikuZ2V0RWxlbWVudCgpOwotICAgICAgCXhzZFNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqKS5nZXRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOyAKLSAgICAgIH0KLSAgICAgICAgCi0gICAgICBpZiAoIVhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhub2RlLCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBkb2MgPSAoRG9jdW1lbnRJbXBsKSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURV9OT0RFUyIpKTsKLSAgICAgICAgfQotICAKLSAgICAgICAgYm9vbGVhbiByZWZyZXNoID0gY2xlYW51cFJlZmVyZW5jZXMobm9kZSk7Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShub2RlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdvcmthcm91bmQgdG8gcmVzZXQgaW5jbHVkZWQgZWxlbWVudHMgaW4gWFNEIG1vZGVsCi0gICAgICAgIGlmIChyZWZyZXNoKQotICAgICAgICB7Ci0vLyBUT0RPCi0vLyAgICAgICAgICBnZXRFZGl0b3IoKS5yZXBhcnNlU2NoZW1hKCk7Ci0vLyAgICAgICAgICBnZXRFZGl0b3IoKS5nZXRHcmFwaFZpZXdlcigpLnNldFNjaGVtYShnZXRFZGl0b3IoKS5nZXRYU0RTY2hlbWEoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGRvYyAhPSBudWxsKQotICAgIHsKLSAgICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhbnVwUmVmZXJlbmNlcyhOb2RlIGRlbGV0ZWROb2RlKQotICB7Ci0gICAgYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IGdldFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZGVsZXRlZE5vZGUpOwotICAgIAotICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNESW5jbHVkZSB8fAotICAgICAgICBjb21wIGluc3RhbmNlb2YgWFNESW1wb3J0IHx8Ci0gICAgICAgIGNvbXAgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSAoKFhTRFNjaGVtYURpcmVjdGl2ZSljb21wKS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgWFNEU2NoZW1hIHJlZmVyZW5jZWRTY2hlbWEgPSBudWxsOwotICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RJbmNsdWRlKQotICAgICAgewotICAgICAgICByZWZlcmVuY2VkU2NoZW1hID0gKChYU0RJbmNsdWRlKWNvbXApLmdldEluY29ycG9yYXRlZFNjaGVtYSgpOwotICAgICAgICByZWZyZXNoID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgIHsKLSAgICAgICAgcmVmZXJlbmNlZFNjaGVtYSA9ICgoWFNEUmVkZWZpbmUpY29tcCkuZ2V0SW5jb3Jwb3JhdGVkU2NoZW1hKCk7Ci0gICAgICAgIHJlZnJlc2ggPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICAgIHsKLSAgICAgICAgIHJlZmVyZW5jZWRTY2hlbWEgPSAoKFhTREltcG9ydCljb21wKS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgfQotCi0gICAgICBpZiAocmVmZXJlbmNlZFNjaGVtYSAhPSBudWxsKQotICAgICAgewotLy8gICAgICAgIFhTREV4dGVybmFsRmlsZUNsZWFudXAgY2xlYW5IZWxwZXIgPSBuZXcgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cChyZWZlcmVuY2VkU2NoZW1hKTsKLS8vICAgICAgICBjbGVhbkhlbHBlci52aXNpdFNjaGVtYShnZXRTY2hlbWEoKSk7Ci0vLyAgICAgICAgLy8gcG9wdWxhdGUgbWVzc2FnZXMKLS8vLy8gVE9ETwotLy8vLyAgICAgICAgZ2V0RWRpdG9yKCkuY3JlYXRlVGFza3NJblRhc2tMaXN0KGNsZWFuSGVscGVyLmdldE1lc3NhZ2VzKCkpOwotICAgICAgfQotICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICB7Ci0gICAgICAgIFR5cGVzSGVscGVyIHR5cGVzSGVscGVyID0gbmV3IFR5cGVzSGVscGVyKGdldFNjaGVtYSgpKTsKLSAgICAgICAgdHlwZXNIZWxwZXIudXBkYXRlTWFwQWZ0ZXJEZWxldGUoKFhTREltcG9ydCljb21wKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZ2V0U2NoZW1hKCkuZXF1YWxzKGNvbXAuZ2V0Q29udGFpbmVyKCkpKQotICAgIHsKLSAgICAgIEJhc2VHbG9iYWxDbGVhbnVwIGNsZWFuSGVscGVyID0gbnVsbDsKLSAgIC8vICAgT25seSBuZWVkIHRvIGNsZWFuIHVwIHJlZmVyZW5jZXMgaWYgdGhlIGNvbXBvbmVudCBiZWluZyBkZWxldGVkIGlzIGdsb2JhbCBzY29wZWQKLS8vICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBjbGVhbkhlbHBlciA9IG5ldyBHbG9iYWxFbGVtZW50Q2xlYW51cChjb21wKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBjbGVhbkhlbHBlciA9IG5ldyBHbG9iYWxHcm91cENsZWFudXAoY29tcCk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZUNsZWFudXAoY29tcCk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsQXR0cmlidXRlQ2xlYW51cChjb21wKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsQXR0cmlidXRlR3JvdXBDbGVhbnVwKGNvbXApOwotLy8gICAgICB9Ci0vLyAgICAgIAotLy8gICAgICAKLS8vICAgICAgaWYgKGNsZWFuSGVscGVyICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBjbGVhbkhlbHBlci52aXNpdFNjaGVtYShnZXRTY2hlbWEoKSk7Ci0vLyAgICAgICAgLy8gcG9wdWxhdGUgbWVzc2FnZXMKLS8vLy8gVE9ETwotLy8vLyAgICAgICAgZ2V0RWRpdG9yKCkuY3JlYXRlVGFza3NJblRhc2tMaXN0KGNsZWFuSGVscGVyLmdldE1lc3NhZ2VzKCkpOwotLy8gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWZyZXNoOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvZ3JhcGgvZWRpdHBhcnRzL1hTRFNjaGVtYURyaWxsRG93bkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvZ3JhcGgvZWRpdHBhcnRzL1hTRFNjaGVtYURyaWxsRG93bkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliY2IxYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2dyYXBoL2VkaXRwYXJ0cy9YU0RTY2hlbWFEcmlsbERvd25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5EcmlsbERvd25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hRHJpbGxEb3duRWRpdFBhcnQgZXh0ZW5kcyBEcmlsbERvd25FZGl0UGFydCAKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBJRmlndXJlIGZpZ3VyZSA9IHN1cGVyLmNyZWF0ZUZpZ3VyZSgpOwotICAgIGxhYmVsLnNldEljb24oWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RGaWxlLmdpZiIpKTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpZ2V0TW9kZWwoKTsKLSAgICBTdHJpbmcgbnMgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCA/IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA6ICIiOwotICAgIGxhYmVsLnNldFRleHQobnMpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2dyYXBoL2VkaXRwYXJ0cy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvZ3JhcGgvZWRpdHBhcnRzL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwOTMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvZ3JhcGgvZWRpdHBhcnRzL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCAKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5OwotCi0gIHB1YmxpYyBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVkaXRQYXJ0KEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5KQotICB7Ci0gICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ29udGFpbmVyRmlndXJlIGZpZ3VyZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsgICAgCi0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfSAgICAKLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKSAKLSAgewotICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUVkaXRQYXJ0KHRoaXMsIG1vZGVsKTsKLSAgfSAgICAgIAotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSAKLSAgeyAKLSAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KWdldE1vZGVsKCk7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcmVzdWx0LmFkZChlLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIAotICB7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNiN2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL3dzZGx2YWxpZGF0ZXVpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL3dzZGx2YWxpZGF0ZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9xbmFtZS5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIvd3NkbDRqLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmIxY2U0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzZGx2YWxpZGF0ZS5qYXIKLXdzZGx2YWxpZGF0ZXVpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTkwYzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyNDA1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHdzZGx2YWxpZGF0ZS5qYXIsXAotICAgICAgICAgICAgICAgd3NkbHZhbGlkYXRldWkuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotb3V0cHV0LndzZGx2YWxpZGF0ZS5qYXIgPSBiaW4vCi1zb3VyY2Uud3NkbHZhbGlkYXRlLmphciA9IHNyYy93c2RsdmFsaWRhdGUvCi1zb3VyY2Uud3NkbHZhbGlkYXRldWkuamFyID0gc3JjL3dzZGx2YWxpZGF0ZXVpLwotamFycy5jb21waWxlLm9yZGVyID0gd3NkbHZhbGlkYXRlLmphcixcCi0gICAgICAgICAgICAgICAgICAgICB3c2RsdmFsaWRhdGV1aS5qYXIKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL2V4dHZhbGlkYXRvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2QvZXh0dmFsaWRhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZGQwNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2QvZXh0dmFsaWRhdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIgaWQ9ImV4dHZhbGlkYXRvciIgbmFtZT0iV1NETCBFeHRlbnNpb24gVmFsaWRhdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEFuIGV4dGVuc2lvbiBwb2ludCB0byBhbGxvdyBwbHVnZ2luIGluIGV4dGVuc2lvbiB2YWxpZGF0b3JzIHRvIHJ1biBwb3N0IFdTREwgdmFsaWRhdGlvbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXh0dmFsaWRhdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHR2YWxpZGF0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb3VyY2VidW5kbGUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC91cmlyZXNvbHZlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2QvdXJpcmVzb2x2ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4NjRkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC91cmlyZXNvbHZlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIgaWQ9InVyaXJlc29sdmVyIiBuYW1lPSJXU0RMIFVSSSBSZXNvbHZlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1cmlyZXNvbHZlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idXJpcmVzb2x2ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL3dzZGwxMXZhbGlkYXRvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2Qvd3NkbDExdmFsaWRhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzN2JiOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2Qvd3NkbDExdmFsaWRhdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIgaWQ9IndzZGwxMXZhbGlkYXRvciIgbmFtZT0iV1NETCAxLjEgRXh0ZW5zaW9uIFZhbGlkYXRvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3c2RsMTF2YWxpZGF0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndzZGwxMXZhbGlkYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZWJ1bmRsZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL3htbGNhdGFsb2cuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL3htbGNhdGFsb2cuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNDliMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC94bWxjYXRhbG9nLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIgaWQ9InhtbGNhdGFsb2ciIG5hbWU9IldTREwgWE1MIENhdGFsb2ciLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVudGl0eSIvPgotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzY2hlbWFkaXIiLz4KLSAgICAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZW50aXR5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHVibGljSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNjaGVtYWRpciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2xpYi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkyZjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9saWIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSouamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4M2VkOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24KLSEtLSBUb29sIE5hbWUKLQotX1BMVUdJTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gV1NETCBWYWxpZGF0b3IKLV9QUk9WSURFUl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVjbGlwc2Uub3JnCi0KLSEtLSBVSSBNZW51IEl0ZW0KLV9VSV9NRU5VX1ZBTElEQVRFX1dTREwgICAgICAgICAgICAgICAgICAgICA9IFZhbGlkYXRlIFdTREwgRmlsZQotX1VJX1dTRExfVkFMSURBVE9SICAgICAgICAgICAgICAgICAgICAgICAgID0gV1NETCBWYWxpZGF0b3IKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhYmExMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iCi0gICBuYW1lPSIlX1BMVUdJTl9OQU1FIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlX1BST1ZJREVSX05BTUUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlLlZhbGlkYXRlV1NETFBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0id3NkbHZhbGlkYXRldWkuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgICAgPGxpYnJhcnkgbmFtZT0id3NkbHZhbGlkYXRlLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi93c2RsNGouamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGliL3FuYW1lLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmRlcGVuZGVuY3ljaGVja2VyIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuYW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24iLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZGVwZW5kZW5jeWNoZWNrZXIucmVxdWlyZWRGaWxlcyI+Ci0gICAgICA8cmVxdWlyZWRGaWxlCi0gICAgICAgICAgICBwbHVnaW5SZWxhdGl2ZVBhdGg9ImxpYi9xbmFtZS5qYXIiCi0gICAgICAgICAgICBsb2NhdGlvblVSTD0iaHR0cDovL3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC93c2RsNGovd3NkbDRqLWJpbi0xLjQuemlwP2Rvd25sb2FkIi8+Ci0gICAgICA8cmVxdWlyZWRGaWxlCi0gICAgICAgICAgICBwbHVnaW5SZWxhdGl2ZVBhdGg9ImxpYi93c2RsNGouamFyIgotICAgICAgICAgICAgbG9jYXRpb25VUkw9Imh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvd3NkbDRqL3dzZGw0ai1iaW4tMS40LnppcD9kb3dubG9hZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gV1NETCBleHRlbnNpb24gdmFsaWRhdG9yLiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0aGF0IHdpbGwgcnVuCi0gICAgICAgIGFmdGVyIFdTREwgdmFsaWRhdGlvbiBpZiBXU0RMIHZhbGlkYXRpb24gaXMgc3VjY2Vzc2Z1bC4gIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0dmFsaWRhdG9yIiBuYW1lPSJXU0RMIEV4dGVuc2lvbiBWYWxpZGF0b3IiIHNjaGVtYT0iZXhzZC9leHR2YWxpZGF0b3IuZXhzZCIvPgotICAgCi0gICA8IS0tIFdTREwgMS4xIHZhbGlkYXRvciBleHRlbnNpb24uIFRvIHByb3ZpZGUgYSBuYW1lc3BhY2Ugc3BlY2lmaWMgV1NETCAxLjEKLSAgICAgICAgdmFsaWRhdG9yLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndzZGwxMXZhbGlkYXRvciIgbmFtZT0iV1NETCAxLjEgRXh0ZW5zaW9uIFZhbGlkYXRvciIgc2NoZW1hPSJleHNkL3dzZGwxMXZhbGlkYXRvci5leHNkIi8+Ci0gICAKLSAgIDwhLS0gQW4gZXh0ZW5zaW9uIHRvIGFkZCBYTUwgY2F0YWxvZyBlbnRyaWVzIHRvIHRoZSBXU0RMIHZhbGlkYXRvci4KLSAgICAgICAgTWFueSBlbnRpcmVzIGNhbiBiZSBhZGRlZCBhcyBzZWVuIGJlbG93LiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgbmFtZT0iV1NETCBYTUwgQ2F0YWxvZyIgaWQ9InhtbGNhdGFsb2ciIHNjaGVtYT0iZXhzZC94bWxjYXRhbG9nLmV4c2QiLz4KLQotICAgPCEtLSBBbiBleHRlbnNpb24gdG8gYWRkIGEgVVJJIHJlc29sdmVyIHRvIHRoZSBXU0RMIHZhbGlkYXRvci4gVVJJIHJlc29sdmVycwotICAgICAgICBhcmUgdXNlZCB0byByZXNvbHZlIHRoZSBsb2NhdGlvbiBvZiBpbXBvcnRlZCBkb2N1bWVudHMgc3VjaCBhcyBXU0RMIGFuZAotICAgICAgICBYU0QgdGhyb3VnaCB0aGUgV1NETCBhbmQgc2NoZW1hIGltcG9ydCBtZWNoYW5pc21zLiAKLSAgICAgICAgVGhpcyBpcyBob3cgdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZC4KLSAgICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS51cmlyZXNvbHZlciI+Ci0gICAgICAgICAgPHVyaXJlc29sdmVyIGNsYXNzPSJmdWxsIG5hbWUgb2YgeW91ciBjbGFzcyIvPgotICAgICAgICA8L2V4dGVuc2lvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IldTREwgVVJJIFJlc29sdmVyIiBpZD0idXJpcmVzb2x2ZXIiIHNjaGVtYT0iZXhzZC91cmlyZXNvbHZlci5leHNkIi8+Ci0KLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPCEtLSBTZXQgdGhlIFZhbGlkYXRlIFdTREwgRmlsZSBjb250ZXh0IG1lbnUgaXRlbS4gVGhpcyAgICAgLS0+Ci0gICA8IS0tIG1lbnUgaXRlbSBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHRoZSB2YWxpZGF0aW9uICAgICAgICAtLT4KLSAgIDwhLS0gZnJhbWV3b3JrIGlzIG1vZGlmaWVkIHRvIGNyZWF0ZSB0aGUgaXRlbS4gICAgICAgICAgICAgIC0tPgotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzZGwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi53c2RsYWN0aW9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX01FTlVfVkFMSURBVEVfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2UuVmFsaWRhdGVXU0RMQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZS5WYWxpZGF0ZVdTRExBY3Rpb25EZWxlZ2F0ZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPCEtLSBTZXQgdGhlIFhNTCBDYXRhbG9nIGVudHJpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICA8IS0tIFRoZXNlIGVudHJpZXMgYXJlIGNvbW1lbnRlZCBvdXQgdW50aWwgc3VjaCB0aW1lIGFzICAgICAtLT4KLSAgIDwhLS0gcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGluY2x1ZGUgdGhlbSBpbiB0aGlzIHBsdWdpbi4gIC0tPgotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8IS0tZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnhtbGNhdGFsb2ciLS0+Ci0gICAgIDwhLS1lbnRpdHkKLSAgICAgICBwdWJsaWNJZD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIAotICAgICAgIGxvY2F0aW9uPSJ4c2Qvd3NkbC54c2QiIC8tLT4KLSAgICAgPCEtLWVudGl0eQotICAgICAgIHB1YmxpY0lkPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICAgICBsb2NhdGlvbj0ieHNkL2h0dHAueHNkIiAvLS0+Ci0gICAgIDwhLS1lbnRpdHkKLSAgICAgICBwdWJsaWNJZD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgbG9jYXRpb249InhzZC9zb2FwLnhzZCIgLy0tPgotICAgICA8IS0tZW50aXR5Ci0gICAgICAgcHVibGljSWQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgIGxvY2F0aW9uPSJ4c2Qvd3NkbC1taW1lLnhzZCIgLy0tPgotICAgICA8IS0tZW50aXR5IAotICAgICAgIHB1YmxpY0lkPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgbG9jYXRpb249InhzZC9zb2FwZW5jLnhzZCIgLy0tPgotICAgICA8IS0tIFRoZSB4bWwtc29hcCBkb2VzIG5vdCBleGlzdCBidXQgaXMgdXNlZCBpbiBjZXJ0YWluIGRvY3VtZW50cy4KLSAgICAgICAgICBJdCBpcyBpbmNsdWRlZCBoZXJlIHNvIHRoZSB2YWxpZGF0b3Igd2lsbCByZWNvZ25pemUgaXQuIC0tPgotICAgICA8IS0tZW50aXR5Ci0gICAgICAgcHVibGljSWQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgCi0gICAgICAgbG9jYXRpb249InhzZC94bWwtc29hcC54c2QiIC8tLT4KLSAgIDwhLS0vZXh0ZW5zaW9uLS0+Ci0gICAKLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPCEtLSBBbiBleHRlbnNpb24gZm9yIGFkZGluZyB0aGUgVVJJIHJlc29sdmVyIGZyb20gICAgICAgICAgLS0+Ci0gICA8IS0tIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIgdG8gdGhlIFdTREwgICAgICAgICAtLT4KLSAgIDwhLS0gdmFsaWRhdG9yLgkJCQkJCQkJCQkJICAgLS0+Ci0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udXJpcmVzb2x2ZXIiPgotICAgICA8dXJpcmVzb2x2ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZS5VUklSZXNvbHZlcldyYXBwZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDwhLS0gQW4gZXh0ZW5zaW9uIGZvciBhZGRpbmcgdGhlIFdTREwgdmFsaWRhdG9yIHRvIHRoZSAgICAgIC0tPgotICAgPCEtLSB2YWxpZGF0aW9uIGZyYW1ld29yay4gCQkJCQkJICAgICAgICAgICAtLT4JCQkJCQkJCQkJICAgLS0+Ci0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ3c2RsVmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iJV9VSV9XU0RMX1ZBTElEQVRPUiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgICAgPHZhbGlkYXRvcj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGhlbHBlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLkhlbHBlciI+Ci0gICAgICAgICA8L2hlbHBlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2UuVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMmNhN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi0vKioKLSAqIFNldCBjb25zdGFudHMgdGhhdCB0aGUgdmFsaWRhdG9yIG1ha2VzIHVzZSBvZi4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdGFudHMKLXsKLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgcHJvcGVydGllcyBmaWxlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NETF9WQUxJREFUT1JfUFJPUEVSVElFU19GSUxFID0gInZhbGlkYXRld3NkbCI7Ci0KLSAgLyoqCi0gICAqIFRoZSBTT0FQIDEuMSBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19TT0FQMTEgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI7Ci0KLSAgLyoqCi0gICAqIFRoZSBIVFRQIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX0hUVFAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyI7Ci0KLSAgLyoqCi0gICAqIFRoZSBNSU1FIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX01JTUUgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRyb2xsZXJWYWxpZGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db250cm9sbGVyVmFsaWRhdGlvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzNDBmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRyb2xsZXJWYWxpZGF0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSB2YWxpZGF0aW9uIGluZm8gdGhhdCBhbGxvd3MgZm9yIHN0YXJ0aW5nIGFuZAotICogY29tcGxldGluZyBXU0RMIGFuZCBXUy1JIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udHJvbGxlclZhbGlkYXRpb25JbmZvIGV4dGVuZHMgVmFsaWRhdGlvbkluZm8KLXsKLSAgCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSBuZWNlc3Nhcnkgc3RlcHMgdG8gY29tcGxldGUgV1NETCB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgY29tcGxldGVXU0RMVmFsaWRhdGlvbigpOwotICAKLS8vICAvKioKLS8vICAgKiBQZXJmb3JtIHRoZSBuZWNlc3Nhcnkgc3RlcHMgdG8gY29tcGxldGUgV1MtSSBXU0RMIHZhbGlkYXRpb24uCi0vLyAgICovCi0vLyAgcHVibGljIHZvaWQgY29tcGxldGVXU0lWYWxpZGF0aW9uKCk7Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JV1NETFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JV1NETFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVkOWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVdTRExWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5leGNlcHRpb24uVmFsaWRhdGVXU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSBXU0RMIHZhbGlkYXRvci4gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIHRvcCBsZXZlbCB2YWxpZGF0b3IgCi0gKiBjb21wb25lbnQgc3VjaCBhcyBhIFdTREwgMS4xIHZhbGlkYXRvciwgV1NETCAxLjIgdmFsaWRhdG9yIG9yIFdTLUkgQmFzaWMgUHJvZmlsZSB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdTRExWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAqIAotICAgKiBAcGFyYW0gZG9tTW9kZWwgQSBET00gbW9kZWwgb2YgdGhlIGZpbGUgdG8gYmUgdmFsaWRhdGVkLgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSB2YWxpZGF0aW9uIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkLgotICAgKiBAdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoRG9jdW1lbnQgZG9tTW9kZWwsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pIHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIHNldFJlc291cmNlQnVuZGxlCi0gICAqIFNldCB0aGUgUmVzb3VyY2VCdW5kbGUgZm9yIHRoaXMgdmFsaWRhdG9yLiBBbGxvd3MgdGhlIHVzZSBvZiBkaWZmZXJlbmNlIAotICAgKiBSZXNvdXJjZUJ1bmRsZXMgZm9yIGRpZmZlcmVudCB2YWxpZGF0b3JzLgotICAgKiAKLSAgICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25Db250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25Db250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWE3OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFcnJvclJlcG9ydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5leGNlcHRpb24uVmFsaWRhdGVXU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuQWJzdHJhY3RYTUxDb25mb3JtYW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuSVhNTFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5MaW5lTnVtYmVyRE9NUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeXBvaW50IHRvIHRoZSBXU0RMIFZhbGlkYXRvci4gVGhlIGNvbnRyb2xsZXIgaXMKLSAqIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoZSByZWFkZXIsIHRoZSBYTUwgY29uZm9ybWFuY2UgY2hlY2ssIHRoZSBXU0RMCi0gKiB2YWxpZGF0aW9uIGFuZCB0aGUgV1MtSSB2YWxpZGF0aW9uIGlmIHNlbGVjdGVkLiBUaGUgY29udHJvbGxlciBjb250YWlucyBhbnkKLSAqIGVycm9ycyBhbmQgd2FybmluZ3MgZ2VuZXJhdGVkIGFzIHdlbGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uQ29udHJvbGxlcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FUlJPUl9QUk9CTEVNX1dTRExfVkFMSURBVE9SID0gIl9FUlJPUl9QUk9CTEVNX1dTRExfVkFMSURBVE9SIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fV1NETF9WQUxJREFUT1IgPSAiX0VSUk9SX05PX1dTRExfVkFMSURBVE9SIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVJST1JfUFJPQkxFTV9FWFRfVkFMSURBVE9SID0gIl9FUlJPUl9QUk9CTEVNX0VYVF9WQUxJREFUT1IiOwotCi0gIHByb3RlY3RlZCBWYWxpZGF0b3JSZWdpc3RyeSB2ZXI7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZWJ1bmRsZTsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLSAgcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLy9wcm90ZWN0ZWQgU3RyaW5nIHdzZGxOYW1lc3BhY2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgUmVzb3VyY2VCdW5kbGUgbmVlZHMgdG8gYmUgc2V0IHNvIGl0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHJlYWRlci4KLSAgICogCi0gICAqIEBwYXJhbSByYgotICAgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25Db250cm9sbGVyKFJlc291cmNlQnVuZGxlIHJiLCBVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAgIHJlc291cmNlYnVuZGxlID0gcmI7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJlc291cmNlYnVuZGxlKTsKLSAgICB0aGlzLnVyaVJlc29sdmVyID0gdXJpUmVzb2x2ZXI7Ci0KLSAgICB2ZXIgPSBWYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIHRoZSBhdHRyaWJ1dGVzIHNwZWNpZmllZCB0byB0aGUgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVzIFRoZSBhdHRyaWJ1dGVzIHRvIGFkZCB0byB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoSGFzaHRhYmxlIGF0dHJpYnV0ZXMpCi0gIHsKLSAgCXRoaXMuYXR0cmlidXRlcy5wdXRBbGwoYXR0cmlidXRlcyk7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIFdTREwgZmlsZS4gQ2hlY2sgdGhlIGZpbGUgZm9yIFhNTCBjb25mb3JtYW5jZS4gSWYgaXQgaXMgWE1MCi0gICAqIGNvbmZvcm1hbnQsIHJlYWQgdGhlIGZpbGUgYW5kIGNoZWNrIGl0IGZvciBXU0RMIGNvbmZvcm1hbmNlLiBJZiBpdCBpcyBXU0RMCi0gICAqIGNvbmZvcm1hbnQgYW5kIFdTLUkgY29uZm9ybWFuY2UgaXMgc2V0IHRvIHN1Z2dlc3Qgb3IgcmVxdWlyZSwgY2hlY2sgdGhlCi0gICAqIGZpbGUgZm9yIFdTLUkgY29uZm9ybWFuY2UuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqICAgICAgICAgICAgVGhlIHVyaSB3aGVyZSB0aGUgV1NETCBkb2N1bWVudCBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gd3NpTGV2ZWwKLSAgICogICAgICAgICAgICBUaGUgbGV2ZWwgb2YgV1MtSSBjb25mb3JtYW5jZSB0byB1c2UgZm9yIHZhbGlkYXRpb24uCi0gICAqIEByZXR1cm4gQSB2YWxpZGF0aW9uIHJlcG9ydCB3aXRoIHRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoZSBmaWxlLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSkKLSAgewotICAgIENvbnRyb2xsZXJWYWxpZGF0aW9uSW5mbyB2YWxJbmZvID0gbmV3IFZhbGlkYXRpb25JbmZvSW1wbCh1cmksIG1lc3NhZ2VnZW5lcmF0b3IpOwotICAgICgoVmFsaWRhdGlvbkluZm9JbXBsKXZhbEluZm8pLnNldFVSSVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLSAgICAoKFZhbGlkYXRpb25JbmZvSW1wbCl2YWxJbmZvKS5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCi0gICAgaWYgKHZhbGlkYXRlWE1MKHZhbEluZm8pKQotICAgIHsKLSAgICAgIERvY3VtZW50IHdzZGxkb2MgPSBnZXREb2N1bWVudCh1cmkpOwotICAgICAgU3RyaW5nIHdzZGxucyA9IGdldFdTRExOYW1lc3BhY2Uod3NkbGRvYyk7Ci0gICAgICBpZiAodmFsaWRhdGVXU0RMKHdzZGxkb2MsIHZhbEluZm8sIHdzZGxucykpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlRXh0ZW5zaW9uVmFsaWRhdG9ycyh3c2RsZG9jLCB2YWxJbmZvLCB3c2RsbnMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKFZhbGlkYXRpb25SZXBvcnQpdmFsSW5mbzsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZmlsZSBmb3IgWE1MIGNvbmZvcm1hbmNlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaQotICAgKiAgICAgICAgICAgIFRoZSB1cmkgd2hlcmUgdGhlIFdTREwgZG9jdW1lbnQgaXMgbG9jYXRlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIGNvbmZvcm1hbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlWE1MKENvbnRyb2xsZXJWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgSVhNTFZhbGlkYXRvciB4bWxWYWxpZGF0b3IgPSBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFhNTFZhbGlkYXRvcigpOwotICAgIHhtbFZhbGlkYXRvci5zZXRVUklSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0gICAgeG1sVmFsaWRhdG9yLnNldEZpbGUodmFsSW5mby5nZXRGaWxlVVJJKCkpOwotICAgIC8veG1sVmFsaWRhdG9yLnNldFZhbGlkYXRpb25JbmZvKHZhbEluZm8pOwotICAgIHhtbFZhbGlkYXRvci5ydW4oKTsKLSAgICAvLyBpZiB0aGVyZSBhcmUgbm8geG1sIGNvbmZvcm1hbmNlIHByb2JsZW1zIGdvIG9uIHRvIGNoZWNrIHRoZSB3c2RsIHN0dWZmCi0gICAgaWYgKHhtbFZhbGlkYXRvci5oYXNFcnJvcnMoKSkKLSAgICB7Ci0gICAgICAvLyB0ZW1wIGhhbmRsaW5nIG9mIFhNTCBlcnJvcnMgdW50aWwgdmFsaWRhdG9yIGlzIHVwZGF0ZWQuCi0gICAgICBMaXN0IGVycm9ycyA9IHhtbFZhbGlkYXRvci5nZXRFcnJvcnMoKTsKLSAgICAgIEl0ZXJhdG9yIGVycm9yc0l0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChlcnJvcnNJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgdmFsTWVzID0gKFZhbGlkYXRpb25NZXNzYWdlKWVycm9yc0l0ZXIubmV4dCgpOwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKHZhbE1lcy5nZXRNZXNzYWdlKCksIHZhbE1lcy5nZXRMaW5lKCksIHZhbE1lcy5nZXRDb2x1bW4oKSwgdmFsTWVzLmdldFVSSSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy93c2RsTmFtZXNwYWNlID0geG1sVmFsaWRhdG9yLmdldFdTRExOYW1lc3BhY2UoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBmaWxlLiBTZXQgdGhlIGVycm9ycyBhbmQgd2FybmluZyBhcHByb3ByaWF0ZWx5LgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxkb2MgQSBXM0MgZG9jdW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsTmFtZXNwYWNlIFRoZSBXU0RMIG5hbWVzcGFjZSB0byB2YWxpZGF0ZS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVdTREwoRG9jdW1lbnQgd3NkbGRvYywgQ29udHJvbGxlclZhbGlkYXRpb25JbmZvIHZhbEluZm8sIFN0cmluZyB3c2RsTmFtZXNwYWNlKQotICB7Ci0gICAgV1NETFZhbGlkYXRvckRlbGVnYXRlW10gd3NkbFZhbHMgPSB2ZXIucXVlcnlWYWxpZGF0b3JSZWdpc3RyeSh3c2RsTmFtZXNwYWNlLCBWYWxpZGF0b3JSZWdpc3RyeS5XU0RMX1ZBTElEQVRPUik7Ci0gICAgaWYgKHdzZGxWYWxzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RsVmFscy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgV1NETFZhbGlkYXRvckRlbGVnYXRlIHdzZGx2YWxkZWwgPSB3c2RsVmFsc1tpXTsKLSAgICAgICAgSVdTRExWYWxpZGF0b3Igd3NkbFZhbCA9IHdzZGx2YWxkZWwuZ2V0VmFsaWRhdG9yKCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGwgdmFsaWRhdG9yIGlzbid0IG51bGwsIHZhbGlkYXRlLgotICAgICAgICBpZiAod3NkbFZhbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgd3NkbFZhbC52YWxpZGF0ZSh3c2RsZG9jLCB2YWxJbmZvKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFZhbGlkYXRlV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX1BST0JMRU1fV1NETF9WQUxJREFUT1IsIHdzZGxOYW1lc3BhY2UpLCAxLCAxLCB2YWxJbmZvLmdldEZpbGVVUkkoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHRoZSB2YWxpZGF0b3IgaXMgbnVsbCBhbmQgdGhlIG5hbWVzcGFjZSBpc24ndCBjcmVhdGUgYW4gZXJyb3IuCi0gICAgICAgIC8vIElmIHRoZSBuYW1lc3BhY2UgaXMgbnVsbCB0aGUgZmlsZSBpcyBlbXB0eSAoYW5kIHRoZSBYTUwgdmFsaWRhdG9yCi0gICAgICAgIC8vIGhhcyBsZXQgaXQgZ28pCi0gICAgICAgIC8vIHNvIGl0IGlzIHZhbGlkIGJ1dCBkb2VzIG5vdCBuZWVkIHRvIGJlIHZhbGlkYXRlZC4KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT19XU0RMX1ZBTElEQVRPUiwgd3NkbE5hbWVzcGFjZSksCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHZhbEluZm8uZ2V0RmlsZVVSSSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBObyB2YWxpZGF0b3JzIHJlZ2lzdGVyZWQuCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX1dTRExfVkFMSURBVE9SLCB3c2RsTmFtZXNwYWNlKSwgMSwgMSwgdmFsSW5mby5nZXRGaWxlVVJJKCkpOwotICAgIH0KLSAgICB2YWxJbmZvLmNvbXBsZXRlV1NETFZhbGlkYXRpb24oKTsKLQotICAgIHJldHVybiB2YWxJbmZvLmlzV1NETFZhbGlkKCk7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIFdTREwgZmlsZSB3aXRoIHRoZSBleHRlbnNpb24gdmFsaWRhdG9yLiBTZXQgdGhlIGVycm9ycyBhbmQgd2FybmluZyBhcHByb3ByaWF0ZWx5LgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxkb2MgQSBXM0MgZG9jdW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsTmFtZXNwYWNlIFRoZSBXU0RMIG5hbWVzcGFjZSB0byB2YWxpZGF0ZS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUV4dGVuc2lvblZhbGlkYXRvcnMoRG9jdW1lbnQgd3NkbGRvYywgQ29udHJvbGxlclZhbGlkYXRpb25JbmZvIHZhbEluZm8sIFN0cmluZyB3c2RsTmFtZXNwYWNlKQotICB7Ci0gICAgV1NETFZhbGlkYXRvckRlbGVnYXRlW10gZXh0VmFscyA9IHZlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KHdzZGxOYW1lc3BhY2UsIFZhbGlkYXRvclJlZ2lzdHJ5LkVYVF9WQUxJREFUT1IpOwotICAgIGlmKGV4dFZhbHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgbnVtdmFscyA9IGV4dFZhbHMubGVuZ3RoOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bXZhbHM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgV1NETFZhbGlkYXRvckRlbGVnYXRlIGV4dHZhbGRlbCA9IGV4dFZhbHNbaV07Ci0gICAgICAgIElXU0RMVmFsaWRhdG9yIGV4dHZhbCA9IGV4dHZhbGRlbC5nZXRWYWxpZGF0b3IoKTsKLSAgICAgICAgaWYoZXh0dmFsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgZXh0dmFsLnZhbGlkYXRlKHdzZGxkb2MsIHZhbEluZm8pOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaChUaHJvd2FibGUgIHQpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmFsSW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9QUk9CTEVNX0VYVF9WQUxJREFUT1IsICBleHR2YWxkZWwuZ2V0VmFsaWRhdG9yQ2xhc3NOYW1lKCksIHdzZGxOYW1lc3BhY2UpLCAxLCAxLCB2YWxJbmZvLmdldEZpbGVVUkkoKSk7Ci0gICAgICAgICAgICAvLyBUaGlzIGVycm9yIHNob3VsZCBiZSBsb2dnZWQgYW5kIG5vdCBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgUmVzb3VyY2VCdW5kbGUgZm9yIHRoaXMgVmFsaWRhdG9yTWFuYWdlci4KLSAgICogCi0gICAqIEBwYXJhbSByYgotICAgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgotICAgKiBAc2VlICNnZXRSZXNvdXJjZUJ1bmRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICByZXNvdXJjZWJ1bmRsZSA9IHJiOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgUmVzb3VyY2VCdW5kbGUgZm9yIHRoaXMgVmFsaWRhdGlvbkNvbnRyb2xsZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBidW5kbGUgc2V0IGZvciB0aGlzIFZhbGlkYXRpb25Db250cm9sbGVyLgotICAgKiBAc2VlICNzZXRSZXNvdXJjZUJ1bmRsZQotICAgKi8KLSAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZWJ1bmRsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCBhIERPTSBkb2N1bWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBvZiB0aGUgZmlsZSB0byByZWFkCi0gICAqIEByZXR1cm4gVGhlIERPTSBtb2RlbCBvZiB0aGUgV1NETCBkb2N1bWVudCBvciBudWxsIGlmIHRoZSBkb2N1bWVudCBjYW4ndCBiZSByZWFkLgotICAgKi8KLSAgcHJpdmF0ZSBEb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcgdXJpKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQ2F0Y2ggYSBwcmVtYXR1cmUgRU9GIGVycm9yIHRvIGFsbG93IGVtcHR5IFdTREwgZmlsZXMgdG8gYmUgY29uc2lkZXJlZCB2YWxpZC4KLSAgICAgIFN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IFN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbigpCi0gICAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBYTUxFcnJvclJlcG9ydGVyIGNyZWF0ZUVycm9yUmVwb3J0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYTUxFcnJvclJlcG9ydGVyKCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMsIHNob3J0IHNldmVyaXR5KSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJvb2xlYW4gcmVwb3J0RXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscygiUHJlbWF0dXJlRU9GIikpCi0gICAgICAgICAgICAgIHsgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXBvcnRFcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVwb3J0RXJyb3IoZG9tYWluLCBrZXksIGFyZ3VtZW50cywgc2V2ZXJpdHkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgfTsKLQotICAgICAgRE9NUGFyc2VyIGJ1aWxkZXIgPSBuZXcgTGluZU51bWJlckRPTVBhcnNlcihjb25maWd1cmF0aW9uKTsKLSAgICAgIGJ1aWxkZXIucGFyc2UodXJpKTsKLSAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHQpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0V1NETE5hbWVzcGFjZShEb2N1bWVudCBkb2MpCi0gIHsKLSAgICBTdHJpbmcgd3NkbG5zID0gbnVsbDsKLSAgICBpZihkb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGRlZmluaXRpb25zID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgaWYoZGVmaW5pdGlvbnMuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJkZWZpbml0aW9ucyIpKQotICAgICAgewotICAgICAgICB3c2RsbnMgPSBkZWZpbml0aW9ucy5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHdzZGxuczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzNiYjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXI7Ci0KLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uSW5mbyBleHRlbmRzIFZhbGlkYXRpb25SZXBvcnQKLXsKLSAgCi0gIC8qKgotICAgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBmaWxlLiAoVXNlcyB0aGUgVVJJIGZyb20gdGhpcyB2YWxpZGF0aW9uIGluZm8gb2JqZWN0LikKLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlcnJvciBpbiB0aGUgZmlsZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlcnJvciBpbiB0aGUgZmlsZS4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbik7Ci0gIAotICAvKioKLSAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBlcnJvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSk7Ci0gIAotICAvKioKLSAgICogQWRkIGEgd2FybmluZyBtZXNzYWdlIGZvciB0aGlzIGZpbGUuIChVc2VzIHRoZSBVUkkgZnJvbSB0aGlzIHZhbGlkYXRpb24gaW5mbyBvYmplY3QuKQotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgZm9yIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgd2FybmluZyBpbiB0aGUgZmlsZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSB3YXJuaW5nIGluIHRoZSBmaWxlLgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4pOwotICAKLSAgLyoqCi0gICAqIEFkZCBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgd2FybmluZyBpbiB0aGUgZmlsZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGVycm9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpOwotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgVVJJIHJlc29sdmVyIGluIHVzZSBmb3IgdGhpcyB2YWxpZGF0aW9uLiBUaGUgVVJJIHJlc29sdmVyCi0gICAqIHJldHVybmVkIGlzIGFjdHVhbGx5IGEgVVJJIHJlc29sdmVyIGhhbmRsZXIgdGhhdCB3aWxsIAotICAgKiBpdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSByZWdpc3RlcmVkIFVSSSByZXNvbHZlcnMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgcmVzb2x2ZXIgaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBJVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKTsKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiB0aGUgYXR0cmlidXRlCi0gICAqIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLCByZXR1cm4gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYmVpbmcgcmVxdWVzdGVkLgotICAgKiBAcmV0dXJuIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBoYXMgYmVlbiByZWdpc3RlcmVkLCBudWxsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkluZm9JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25JbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTBhZTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkluZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhbGlkYXRpb24gaW5mbyBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW5mb0ltcGwgaW1wbGVtZW50cyBWYWxpZGF0aW9uUmVwb3J0LCBDb250cm9sbGVyVmFsaWRhdGlvbkluZm8KLXsKLSAgcHJpdmF0ZSBib29sZWFuIFdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEID0gdHJ1ZTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1dBUk5fTk9fVkFMRElBVE9SID0gIl9XQVJOX05PX1ZBTERJQVRPUiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9SRUZfRklMRV9FUlJPUl9NRVNTQUdFID0gIl9SRUZfRklMRV9FUlJPUl9NRVNTQUdFIjsKLSAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGluZ19maWxlX3VyaSA9IG51bGw7Ci0gIHByaXZhdGUgVVJMIHZhbGlkYXRpbmdfZmlsZV91cmwgPSBudWxsOwotICBwcml2YXRlIGJvb2xlYW4gd3NkbFZhbGlkID0gZmFsc2U7Ci0gIHByaXZhdGUgTGlzdCBtZXNzYWdlcyA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBMaXN0IHNjaGVtYXMgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgTGlzdCBuc05vVmFscyA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3IgPSBudWxsOwotICBwcml2YXRlIGJvb2xlYW4gaGFzZXJyb3JzID0gZmFsc2U7Ci0gIHByaXZhdGUgSGFzaE1hcCBuZXN0ZWRNZXNzYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByaXZhdGUgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBudWxsOwotICBwcml2YXRlIEhhc2h0YWJsZSBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogICAgICAgICAgICBUaGUgVVJJIG9mIHRoZSBmaWxlIGZvciB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uSW5mb0ltcGwoU3RyaW5nIHVyaSwgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yKQotICB7Ci0gICAgdGhpcy52YWxpZGF0aW5nX2ZpbGVfdXJpID0gdXJpOwotICAgIGlmKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVyaSA9IHVyaS5yZXBsYWNlQWxsKCIlMjAiLCIgIik7Ci0gICAgICB0aGlzLnZhbGlkYXRpbmdfZmlsZV91cmkgPSB1cmk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgdGhpcy52YWxpZGF0aW5nX2ZpbGVfdXJsID0gbmV3IFVSTCh1cmkpOwotICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHRoaXMubWVzc2FnZWdlbmVyYXRvciA9IG1lc3NhZ2VnZW5lcmF0b3I7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVwb3J0I2dldEZpbGVVUkkoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGaWxlVVJJKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0aW5nX2ZpbGVfdXJpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVwb3J0I2lzV1NETFZhbGlkKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV1NETFZhbGlkKCkKLSAgewotICAgIHJldHVybiB3c2RsVmFsaWQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25JbmZvI2FkZEVycm9yKGphdmEubGFuZy5TdHJpbmcsCi0gICAqICAgICAgaW50LCBpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4pCi0gIHsKLSAgICBhZGRFcnJvcihtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHZhbGlkYXRpbmdfZmlsZV91cmkpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25JbmZvI2FkZEVycm9yKGphdmEubGFuZy5TdHJpbmcsCi0gICAqICAgICAgaW50LCBpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICBpZihhZGRNZXNzYWdlKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBWYWxpZGF0aW9uTWVzc2FnZUltcGwuU0VWX0VSUk9SKSkKLSAgICB7Ci0gICAgICBoYXNlcnJvcnMgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkluZm8jYWRkV2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLAotICAgKiAgICAgIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4pCi0gIHsKLSAgICBhZGRXYXJuaW5nKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdmFsaWRhdGluZ19maWxlX3VyaSk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uSW5mbyNhZGRXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0gICAqICAgICAgaW50LCBpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIGFkZE1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIFZhbGlkYXRpb25NZXNzYWdlSW1wbC5TRVZfV0FSTklORyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYSBtZXNzYWdlIHRvIHRoZSBsaXN0LiBBIG1lc3NhZ2UgbWF5IG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdCBpbiAKLSAgICogY2VydGFpbiBjaXJjdW1zdGFuY2VzIHN1Y2ggYXMgd2hlbiB0aGUgVVJJIGlzIGludmFsaWQgb3IgdGhlIG1lc3NhZ2UgCi0gICAqIGlzIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG1lc3NhZ2Ugd2FzIGFibGUgdG8gYmUgYWRkZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGRNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgaW50IHNldmVyaXR5KQotICB7Ci0gICAgYm9vbGVhbiBzdWNjZXNzZnVsbHlBZGRlZCA9IGZhbHNlOwotICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIG51bGwgdGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQuCi0gICAgaWYobWVzc2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBzdWNjZXNzZnVsbHlBZGRlZDsKLSAgICB9Ci0gICAgU3RyaW5nIGVycm9yVVJJID0gdXJpOwotICAgIFVSTCBlcnJvclVSTCA9IG51bGw7Ci0gICAgaWYgKGVycm9yVVJJICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGVycm9yVVJJID0gZXJyb3JVUkkucmVwbGFjZUFsbCgiJTIwIiwgIiAiKTsKLSAgICAgICAgZXJyb3JVUkwgPSBuZXcgVVJMKGVycm9yVVJJKTsKLSAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgLy9lcnJvclVSSSA9IG5vcm1hbGl6ZVVSSShlcnJvclVSSSk7Ci0gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICBlcnJvclVSSSA9IHZhbGlkYXRpbmdfZmlsZV91cmk7Ci0vLyAgICAgIGVycm9yVVJMID0gdmFsaWRhdGluZ19maWxlX3VybDsKLS8vICAgIH0KLSAgICAvL2Jvb2xlYW4gZG9EaWFsb2cgPSB0cnVlOwotICAgIGlmIChlcnJvclVSTCAhPSBudWxsKQotICAgIHsKLSAgICAgIHN1Y2Nlc3NmdWxseUFkZGVkID0gdHJ1ZTsKLSAgICAgIC8vIEFkZCB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdCBpZiBuZXN0ZWQgZXJyb3Igc3VwcG9ydCBpcyBvZmYgb3IKLSAgICAgIC8vIHRoaXMgbWVzc2FnZSBpcyBmb3IgdGhlIGN1cnJlbnQgZmlsZS4KLSAgICAgIGlmICghV1JBUFBFUl9FUlJPUl9TVVBQT1JUX0VOQUJMRUQgfHwgdmFsaWRhdGluZ19maWxlX3VybC5zYW1lRmlsZShlcnJvclVSTCkpCi0gICAgICB7Ci0KLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsIHZhbG1lcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZUltcGwobWVzc2FnZSwgbGluZSwKLSAgICAgICAgICAgIGNvbHVtbiwgc2V2ZXJpdHksIHVyaSk7Ci0gICAgICAgIG1lc3NhZ2VzLmFkZCh2YWxtZXMpOwotICAgICAgfQotICAgICAgLy8gSWYgbmVzdGVkIGVycm9yIHN1cHBvcnQgaXMgZW5hYmxlZCBjcmVhdGUgYSBuZXN0ZWQgZXJyb3IuCi0gICAgICBlbHNlIGlmIChXUkFQUEVSX0VSUk9SX1NVUFBPUlRfRU5BQkxFRCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5lc3RlZHVyaSA9IGVycm9yVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlSW1wbCBuZXN0ZWRtZXNzID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlSW1wbChtZXNzYWdlLCBsaW5lLAotICAgICAgICAgICAgY29sdW1uLCBzZXZlcml0eSwgbmVzdGVkdXJpKTsKLQotICAgICAgICBWYWxpZGF0aW9uTWVzc2FnZUltcGwgY29udGFpbmVyID0gKFZhbGlkYXRpb25NZXNzYWdlSW1wbCkgbmVzdGVkTWVzc2FnZXMuZ2V0KG5lc3RlZHVyaSk7Ci0gICAgICAgIGlmKGNvbnRhaW5lciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSW5pdGlhbGx5IHNldCB0aGUgbmVzdGVkIGVycm9yIHRvIGEgd2FybmluZy4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2hhbmdlZAotICAgICAgICAgIC8vIHRvIGFuIGVycm9yIGlmIGEgbmVzdGVkIG1lc3NhZ2UgaGFzIGEgc2V2ZXJpdHkgb2YgZXJyb3IuCi0gICAgICAgICAgY29udGFpbmVyID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlSW1wbChtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSwgbmVzdGVkdXJpKSwgMSwgMCwgVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcsIG5lc3RlZHVyaSk7Ci0gICAgICAgICAgbmVzdGVkTWVzc2FnZXMucHV0KG5lc3RlZHVyaSwgY29udGFpbmVyKTsKLSAgICAgICAgICBtZXNzYWdlcy5hZGQoY29udGFpbmVyKTsKLSAgICAgICAgfQotICAgICAgICBjb250YWluZXIuYWRkTmVzdGVkTWVzc2FnZShuZXN0ZWRtZXNzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN1Y2Nlc3NmdWxseUFkZGVkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVwb3J0I2dldFZhbGlkYXRpb25NZXNzYWdlcygpCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIChWYWxpZGF0aW9uTWVzc2FnZVtdKW1lc3NhZ2VzLnRvQXJyYXkobmV3IFZhbGlkYXRpb25NZXNzYWdlW21lc3NhZ2VzLnNpemUoKV0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uSW5mbyNhZGROYW1lc3BhY2VXaXRoTm9WYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZVdpdGhOb1ZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgLy8gSWYgdGhlIGxpc3QgZG9lc24ndCBhbHJlYWR5IGNvbnRhaW4gdGhpcyBuYW1lc3BhY2UsIGFkZCBpdCB0byB0aGUgbGlzdAotICAgIC8vIGFuZCBjcmVhdGUgYSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAgaWYgKCFuc05vVmFscy5jb250YWlucyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIG5zTm9WYWxzLmFkZChuYW1lc3BhY2UpOwotICAgICAgYWRkV2FybmluZyhtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfV0FSTl9OT19WQUxESUFUT1IsIG5hbWVzcGFjZSksIDEsIDApOwotCi0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRyb2xsZXJWYWxpZGF0aW9uSW5mbyNjb21wbGV0ZVdTRExWYWxpZGF0aW9uKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbXBsZXRlV1NETFZhbGlkYXRpb24oKQotICB7Ci0gICAgaWYgKGhhc2Vycm9ycykKLSAgICB7Ci0gICAgICB3c2RsVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzZGxWYWxpZCA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVwb3J0I2hhc0Vycm9ycygpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKQotICB7Ci0gICAgcmV0dXJuIGhhc2Vycm9yczsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydCNnZXROZXN0ZWRNZXNzYWdlcygpCi0gICAqLwotICBwdWJsaWMgSGFzaE1hcCBnZXROZXN0ZWRNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gbmVzdGVkTWVzc2FnZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gIAl0aGlzLnVyaVJlc29sdmVyID0gdXJpUmVzb2x2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKQotICB7Ci0gIAlyZXR1cm4gdXJpUmVzb2x2ZXI7Ci0gIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuVmFsaWRhdGlvbkluZm8jZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIAotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKEhhc2h0YWJsZSBhdHRyaWJ1dGVzKQotCXsKLQkJdGhpcy5hdHRyaWJ1dGVzLnB1dEFsbChhdHRyaWJ1dGVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25NZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZDdmMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSB2YWxpZGF0aW9uIG1lc3NhZ2UuIEEgdmFsaWRhdGlvbiBtZXNzYWdlIGNvbnRhaW5zIGluZm9ybWF0aW9uCi0gKiBmb3IgdGhlIG1lc3NhZ2UsIGl0cyBzZXZlcml0eSBhbmQgd2hlcmUgaXQncyBsb2NhdGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25NZXNzYWdlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBFUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKCJvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlIiwgImVycm9yTWVzc2FnZU1hcCIpOwotICAvKioKLSAgICogU2V2ZXJpdHkgZXJyb3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZfRVJST1IgPSAwOwotICAvKioKLSAgICogU2V2ZXJpdHkgd2FybmluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVl9XQVJOSU5HID0gMTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9yIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgZm9yIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNldmVyaXR5IG9mIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2V2ZXJpdHkgb2YgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFNldmVyaXR5KCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaW5lIHdoZXJlIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIHdoZXJlIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldExpbmUoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGNvbHVtbiB3aGVyZSB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgY29sdW1uIHdoZXJlIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbHVtbigpOwotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXROZXN0ZWRNZXNzYWdlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uTWVzc2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbk1lc3NhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZWNiMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uTWVzc2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogQSB2YWxpZGF0aW9uIG1lc3NhZ2UgaXMgY3JlYXRlZCB3aGVuIHRoZXJlIGlzIGluZm9ybWF0aW9uIHRvIHJlcG9ydCBmcm9tCi0gKiB2YWxpZGF0aW5nIGEgV1NETCBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlSW1wbCBpbXBsZW1lbnRzIFZhbGlkYXRpb25NZXNzYWdlCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZTsKLSAgcHJvdGVjdGVkIGludCBsaW5lTnVtYmVyOwotICBwcm90ZWN0ZWQgaW50IGNvbHVtbk51bWJlcjsKLSAgcHJvdGVjdGVkIFN0cmluZyB1cmk7Ci0gIHByb3RlY3RlZCBpbnQgc2V2ZXJpdHkgPSBTRVZfRVJST1I7Ci0gIHByb3RlY3RlZCBMaXN0IG5lc3RlZEVycm9yczsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZSB3aGVyZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiBAcGFyYW0gY29sdW1uTnVtYmVyIFRoZSBjb2x1bW4gd2hlcmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbnRydWN0b3Igd2l0aCBVUkkgcGFyYW1ldGVyLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlSW1wbChTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIsIGludCBzZXZlcml0eSkKLSAgewotICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCBzZXZlcml0eSwgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEFsbG93cyBzcGVjaWZ5aW5nIGEgdXJpIGZvciB0aGUgcmVmZXJlbmNlIHRoYXQgdGhlIG1lc3NhZ2UgcmVmZXJzIHRvLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgd2hlcmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIHdoZXJlIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBvZiB0aGUgcmVmZXJlbmNlIGZpbGUgZm9yIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlSW1wbChTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIsIGludCBzZXZlcml0eSwgU3RyaW5nIHVyaSkKLSAgewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLSAgICB0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICB0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0gICAgdGhpcy51cmkgPSB1cmk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHRoZSBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbHVtbigpCi0gIHsKLSAgICByZXR1cm4gY29sdW1uTnVtYmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZSgpCi0gIHsKLSAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiByZXR1cm5zIHRoZSB1cmkgb2YgdGhlIHJlZmVyZW5jZSBmaWxlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgdXJpIG9mIHRoZSByZXNvdXJjZSB0aGF0IHRoZSBtZXNzYWdlIHJlZmVycyB0by4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotICAgIHJldHVybiB1cmk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uTWVzc2FnZSNnZXRTZXZlcml0eSgpCi0gICAqLwotICBwdWJsaWMgaW50IGdldFNldmVyaXR5KCkKLSAgewotICAgIHJldHVybiBzZXZlcml0eTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5KQotICB7Ci0gICAgaWYoc2V2ZXJpdHkgPT0gU0VWX0VSUk9SIHx8IHNldmVyaXR5ID09IFNFVl9XQVJOSU5HKQotICAgIHsKLSAgICAgIHRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYSBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlIHRvIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRpb25NZXNzYWdlIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gYWRkIGFzIGEgbmVzdGVkIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGROZXN0ZWRNZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlKQotICB7Ci0gICAgaWYgKG5lc3RlZEVycm9ycyA9PSBudWxsKQotICAgIHsKLSAgICAgIG5lc3RlZEVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0gICAgbmVzdGVkRXJyb3JzLmFkZCh2YWxpZGF0aW9uTWVzc2FnZSk7Ci0gICAgaW50IHZhbGlkYWl0b25tZXNzYWdlU2V2ZXJpdHkgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRTZXZlcml0eSgpOwotICAgIGlmKHZhbGlkYWl0b25tZXNzYWdlU2V2ZXJpdHkgPT0gU0VWX0VSUk9SKQotICAgIHsKLSAgICAgIHNldFNldmVyaXR5KFNFVl9FUlJPUik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXROZXN0ZWRNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gbmVzdGVkRXJyb3JzICE9IG51bGwgPyBuZXN0ZWRFcnJvcnMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvblJlcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODlhM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSBXU0RMIHZhbGlkYXRpb24gcmVwb3J0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXBvcnQKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhlIHJlcG9ydCByZWZlcnMgdG8uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgZm9yIHRoZSBmaWxlIHRoZSByZXBvcnQgcmVmZXJzIHRvLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGaWxlVVJJKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIGlzIHZhbGlkIGFjY29yZGluZyB0byB0aGUgV1NETCBzcGVjaWZpY2F0aW9uLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIFdTREwgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV1NETFZhbGlkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZVtdIGdldFZhbGlkYXRpb25NZXNzYWdlcygpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgZXJyb3JzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgYXJlIGVycm9ycywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCk7Ci0gIAotICBwdWJsaWMgSGFzaE1hcCBnZXROZXN0ZWRNZXNzYWdlcygpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MmNhNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0KLS8qKgotICogQSByZWdpc3RyeSBvZiBJV1NETFZhbGlkYXRvciB2YWxpZGF0b3JzLiBUaGlzIGhvbGRzIHRoZSB0b3AgbGV2ZWwgV1NETCBhbmQgV1MtSSB2YWxpZGF0b3JzLgotICogVmFsaWRhdG9ycyBhcmUgcmVnaXN0ZXJlZCBieSB0aGUgbmFtZXNwYWNlIHRoZXkgdmFsaWRhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeQotewotICAvKioKLSAgICogVGhlIFdTREwgdmFsaWRhdG9yIHR5cGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIEludGVnZXIgV1NETF9WQUxJREFUT1IgPSBuZXcgSW50ZWdlcigwKTsKLSAgLyoqCi0gICAqIFRoZSBXUy1JIHZhbGlkYXRvciB0eXBlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIEVYVF9WQUxJREFUT1IgPSBuZXcgSW50ZWdlcigxKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSB2ZXJJbnN0YW5jZTsKLSAgLyoKLSAgICBUaGlzIGlzIGEgTWFwIG9mIE1hcHMuIFRoZSB0b3AtbGV2ZWwgTWFwIGlzIGtleWVkIGJ5IChDbGFzcylwYXJlbnRUeXBlLAotICAgIGFuZCB0aGUgaW5uZXIgTWFwcyBhcmUga2V5ZWQgYnkgKFFOYW1lKWVsZW1lbnRUeXBlLgotICAgIFRoaXMgaWRlYSBpcyB0aGUgc2FtZSBhcyBpcyBkb25lIGluIFdTREw0SgotICAqLwotICBwcm90ZWN0ZWQgTWFwIHZhbGlkYXRvclJlZyA9IG5ldyBIYXNodGFibGUoKTsKLQotICBwcm90ZWN0ZWQgSXRlcmF0b3IgZGVmYXVsdFZhbGlkYXRvckl0ZXJhdG9yOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByb3RlY3RlZCBWYWxpZGF0b3JSZWdpc3RyeSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmICh2ZXJJbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZlckluc3RhbmNlID0gbmV3IFZhbGlkYXRvclJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiB2ZXJJbnN0YW5jZTsKLSAgfQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhpcyB2YWxpZGF0b3Igb2YgdGhlIGdpdmVuIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRoZSB2YWxpZGF0b3IgdmFsaWRhdGVzLgotICAgKiBAcGFyYW0gdmFsRGVsZWdhdGUgVGhlIHZhbGlkYXRvciBkZWxlZ2F0ZSB0byByZWdpc3Rlci4KLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgV1NETFZhbGlkYXRvckRlbGVnYXRlIHZhbERlbGVnYXRlLCBJbnRlZ2VyIHR5cGUpCi0gIHsKLSAgICAvLyBhbGxvdyB0aGUgbnVsbCBuYW1lc3BhY2UgYnV0IG1ha2UgaXQgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0KLSAgICAvLyBnZXQgdGhlIGhhc3RhYmxlIGZvciB0aGUgdHlwZSBvZiB2YWxpZGF0b3Igd2Ugd2FudAotICAgIEhhc2h0YWJsZSB0eXBlVmFsaWRhdG9yUmVnID0gKEhhc2h0YWJsZSl2YWxpZGF0b3JSZWcuZ2V0KHR5cGUpOwotICAgIC8vIGlmIGl0J3MgbnVsbCBpZiBtZWFucyB3ZSBoYXZlbid0IGRlZmluZWQgdGhpcyB0eXBlIG9mIHZhbGlkYXRvciB5ZXQKLSAgICBpZiAodHlwZVZhbGlkYXRvclJlZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHR5cGVWYWxpZGF0b3JSZWcgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICB2YWxpZGF0b3JSZWcucHV0KHR5cGUsIHR5cGVWYWxpZGF0b3JSZWcpOwotICAgIH0KLSAgICAKLSAgICAgIExpc3QgbmFtZXNwYWNldmFscyA9IChMaXN0KXR5cGVWYWxpZGF0b3JSZWcuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgICBpZihuYW1lc3BhY2V2YWxzID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzcGFjZXZhbHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHR5cGVWYWxpZGF0b3JSZWcucHV0KG5hbWVzcGFjZSwgbmFtZXNwYWNldmFscyk7Ci0gICAgICB9Ci0gICAgICBuYW1lc3BhY2V2YWxzLmFkZCh2YWxEZWxlZ2F0ZSk7Ci0KLSAgfQotICAvKioKLSAgICogQXNrIGZvciB0aGUgdmFsaWRhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWVzcGFjZS4gSWYgbm9uZSBpcyBmb3VuZAotICAgKiByZXR1cm4gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBmb3IgdGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC4KLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLgotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHZhbGlkYXRvciBkZWxlZ2F0ZXMgaWYgYXQgbGVhc3Qgb25lIGlzIHJlZ2lzdGVyZWQsIG51bGwgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0b3JEZWxlZ2F0ZVtdIHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkoU3RyaW5nIG5hbWVzcGFjZSwgSW50ZWdlciB0eXBlKQotICB7Ci0gICAgSVdTRExWYWxpZGF0b3Igd3NkbHZhbCA9IG51bGw7Ci0gICAgLy8gaWYgdGhlIG5hbWVzcGFjZSBpcyBudWxsIGFsbG93IGl0IGFuZCB0cmVhdCBpdCBhcyB0aGUgZW1wdHkgc3RyaW5nCi0gICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9ICIiOwotICAgIH0KLSAgICBIYXNodGFibGUgdHlwZVZhbGlkYXRvclJlZyA9IChIYXNodGFibGUpdmFsaWRhdG9yUmVnLmdldCh0eXBlKTsKLSAgICBpZiAodHlwZVZhbGlkYXRvclJlZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgfQotCi0gICAgTGlzdCB2YWxkZWxzID0gKExpc3QpdHlwZVZhbGlkYXRvclJlZy5nZXQobmFtZXNwYWNlKTsKLSAgICBpZih2YWxkZWxzICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIChXU0RMVmFsaWRhdG9yRGVsZWdhdGVbXSl2YWxkZWxzLnRvQXJyYXkobmV3IFdTRExWYWxpZGF0b3JEZWxlZ2F0ZVt2YWxkZWxzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRvciByZWdpc3RlcmVkIG9mIHRoZSBnaXZlbiB0eXBlIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgdmFsaWRhdG9yLgotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgdmFsaWRhdG9yLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYSB2YWxpZGF0b3IgcmVnaXN0ZXJlZCBmb3IgdGhlIG5hbWVzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUmVnaXN0ZXJlZFZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBJbnRlZ2VyIHR5cGUpCi0gIHsKLSAgICBpZiAocXVlcnlWYWxpZGF0b3JSZWdpc3RyeShuYW1lc3BhY2UsIHR5cGUpICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxYmM1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5VUklSZXNvbHZlcjsKLQotLyoqCi0gKiBBbiBleHRlcm5hbCBlbnRyeSBwb2ludCBpbnRvIHRoZSBXU0RMIHZhbGlkYXRvci4gVGhlcmUgb25seSBuZWVkcwotICogdG8gYmUgb25lIFdTREwgdmFsaWRhdG9yIHNvIHdlIHdpbGwgb25seSBhbGxvdyBvbmUgdGhyb3VnaCB0aGUgZ2V0SW5zdGFuY2UKLSAqIG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEQVRPUl9SRVNPVVJDRV9CVU5ETEUgPSAidmFsaWRhdGV3c2RsIjsKLSAgcHJpdmF0ZSBzdGF0aWMgV1NETFZhbGlkYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0gIHByaXZhdGUgVmFsaWRhdGlvbkNvbnRyb2xsZXIgdmFsaWRhdGlvbkNvbnRyb2xsZXI7Ci0gIHByaXZhdGUgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXI7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRvcigpCi0gIHsKLSAgICBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShWQUxJREFUT1JfUkVTT1VSQ0VfQlVORExFKTsKLSAgICB1cmlSZXNvbHZlciA9IG5ldyBVUklSZXNvbHZlcigpOwotICAgIHZhbGlkYXRpb25Db250cm9sbGVyID0gbmV3IFZhbGlkYXRpb25Db250cm9sbGVyKHJiLCB1cmlSZXNvbHZlcik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGUgV1NETCB2YWxpZGF0b3Igbm8gbG9uZ2VyIHVzZXMgb25lIGluc3RhbmNlLiBDbGllbnRzCi0gICAqIGFyZSBmcmVlIHRvIGNyZWF0ZSB0aGVpciBvd24gdmFsaWRhdG9ycyBhbmQgY3VzdG9taXplIAotICAgKiB0aGVtLiBVc2UgdGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG5ldyB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyB2YWxpZGF0b3IuCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdTRExWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBXU0RMVmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBXU0RMIGZpbGUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgbG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHJldHVybiBBIHZhbGlkYXRpb24gcmVwb3J0IHN1bW1hcml6aW5nIHRoZSByZXN1bHRzIG9mIHRoZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSkKLSAgewotICAgIGlmKHVyaSA9PSBudWxsKSAKLSAgICAgIHJldHVybiBudWxsOwotICAgIHZhbGlkYXRpb25Db250cm9sbGVyLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0gICAgcmV0dXJuIHZhbGlkYXRpb25Db250cm9sbGVyLnZhbGlkYXRlKGZvcm1hdFVSSSh1cmkpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIFVSSSByZXNvbHZlciB0byB0aGUgV1NETCB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgVGhlIFVSSSByZXNvbHZlciB0byBhZGQgdG8gdGhlIFdTREwgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVVJJUmVzb2x2ZXIoSVVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gIAl0aGlzLnVyaVJlc29sdmVyLmFkZFVSSVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCBhbiBhdHRyaWJ1dGUgb24gdGhlIHZhbGlkYXRvci4gQW4gYXR0cmlidXRlIGlzCi0gICAqIGRlZmluZWQgYnkgYSBuYW1lIGFuZCBhIHZhbHVlIHBhaXIuIEFuIGF0dHJpYnV0ZSBtYXkKLSAgICogYmUgZGVmaW5lZCBmb3IgYW55IHZhbGlkYXRvciwgYnVpbHQgaW4gb3IgYW4gZXh0ZW5zaW9uLgotICAgKiBFeHRlbnNpb24gdmFsaWRhdG9ycyBjYW4gcHJvYmUgdGhlIGF0dHJpYnV0ZXMgc2V0IG9uCi0gICAqIHRoZSBXU0RMIHZhbGlkYXRvciB0byBjdXN0b21pemUgdGhlIHdheSBpbiB3aGljaCB0aGV5Ci0gICAqIHZhbGlkYXRlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSBpZGVudGlmaWVyLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIGF0dHJpYnV0ZSBpdHNlbGYuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgewotICAJYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOwotICB9Ci0gIHByb3RlY3RlZCBTdHJpbmcgZm9ybWF0VVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICB1cmkgPSB1cmkucmVwbGFjZSgnXFwnLCcvJyk7Ci0gICAgaWYodXJpLnN0YXJ0c1dpdGgoImZpbGU6IikpCi0gIAl7Ci0gIAkgIHVyaSA9IHVyaS5zdWJzdHJpbmcoNik7Ci0gIAkgIHdoaWxlKHVyaS5zdGFydHNXaXRoKCJcXCIpIHx8IHVyaS5zdGFydHNXaXRoKCIvIikpCi0gIAkgIHsKLSAgCSAgCXVyaSA9IHVyaS5zdWJzdHJpbmcoMSk7Ci0gIAkgIH0KLSAgCSAgdXJpID0gImZpbGU6Ly8vIiArIHVyaTsKLSAgCX0KLSAgICByZXR1cm4gdXJpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0MDc1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLQotLyoqCi0gKiBBIGRlbGVnYXRlIGhvbGRzIGEgdmFsaWRhdG9yJ3MgaW5mb3JtYXRpb24gYW5kIGNhbiBpbnN0YW50aWF0ZSBpdAotICogd2hlbiByZXF1ZXN0ZWQgdG8uCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKLSAgcHJpdmF0ZSBJV1NETFZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZWxlZ2F0ZSBmb3IgYSB2YWxpZGF0b3IgYnkgaXRzIGNsYXNzIG5hbWUgYW5kIHJlc291cmNlIGJ1bmRsZSBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBiYXNlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlKQotICB7Ci0gICAgdGhpcy52YWxpZGF0b3JDbGFzc25hbWUgPSB2YWxpZGF0b3JDbGFzc25hbWU7Ci0gICAgdGhpcy5yZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGRlbGVnYXRlIGZvciBhIHZhbGlkYXRvciBieSBpdHMgY2xhc3MgbmFtZSwgcmVzb3VyY2UgYnVuZGxlIG5hbWUgYW5kIAotICAgKiBhIGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSB2YWxpZGF0b3IgYW5kIGJ1bmRsZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZSB0byBsb2FkIHRoZSB2YWxpZGF0b3IgYW5kIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIHRoaXModmFsaWRhdG9yQ2xhc3NuYW1lLCByZXNvdXJjZUJ1bmRsZSk7Ci0gICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsaWRhdG9yIHNwZWNpZmllZCBpbiB0aGlzIGRlbGVnYXRlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgV1NETCB2YWxpZGF0b3Igc3BlY2lmaWVkIGJ5IHRoaXMgZGVsZWdhdGUuCi0gICAqLwotICBwdWJsaWMgSVdTRExWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkKLSAgICAgewotICAgICAgaWYoY2xhc3NMb2FkZXIgPT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzID0KLSAgICAgICAgY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyh2YWxpZGF0b3JDbGFzc25hbWUpIDogQ2xhc3MuZm9yTmFtZSh2YWxpZGF0b3JDbGFzc25hbWUpOwotCi0gICAgICAgIHZhbGlkYXRvciA9IChJV1NETFZhbGlkYXRvcil2YWxpZGF0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgIFJlc291cmNlQnVuZGxlIHZhbGlkYXRvckJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZSwgTG9jYWxlLmdldERlZmF1bHQoKSwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgdmFsaWRhdG9yLnNldFJlc291cmNlQnVuZGxlKHZhbGlkYXRvckJ1bmRsZSk7Ci0gICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmFsaWRhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSB2YWxpZGF0b3IgY2xhc3MgbmFtZS4KLSAgICogQHJldHVybiBUaGUgdmFsaWRhdG9yIGNsYXNzIG5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdG9yQ2xhc3NuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2V4Y2VwdGlvbi9WYWxpZGF0ZVdTRExFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZXhjZXB0aW9uL1ZhbGlkYXRlV1NETEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGU5Y2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZXhjZXB0aW9uL1ZhbGlkYXRlV1NETEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0vKioKLSAqIEN1c3RvbSBleGNlcHRpb24gZm9yIFdTREwgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotCSAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBleGNlcHRpb24gbWVzc2FnZQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRlV1NETEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLQl7Ci0JICBzdXBlcihtZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL0lVUklSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9JVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5Yjc1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL0lVUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgV1NETCB2YWxpZGF0b3IncyBVUkkgcmVzb2x2ZXIgbWVjaGFuaXNtLiBUaGUgVVJJIHJlc29sdmVyCi0gKiBpcyB1c2VkIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIGFuIGVudGl0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJUmVzb2x2ZXIKLXsKLSAvKioKLSAgKiBSZXNvbHZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZW50aXR5IGRlc2NyaWJlZCBieSB0aGUgcHVibGljSWQgYW5kIHN5c3RlbUlkLgotICAqIAotICAqIEBwYXJhbSBiYXNlTG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSB0aGF0IGNvbnRhaW5zIHRoZSB1cmkuCi0gICogQHBhcmFtIHB1YmxpY0lkIEFuIG9wdGlvbmFsIHB1YmxpYyBpZGVudGlmaWVyIChpLmUuIG5hbWVzcGFjZSBuYW1lKSwgb3IgbnVsbCBpZiBub25lLgotICAqIEBwYXJhbSBzeXN0ZW1JZCBBbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkksIG9yIG51bGwgaWYgbm9uZS4KLSAgKiBAcmV0dXJuIEFuIGFic29sdXRlIFVSSSBmb3IgdGhlIHJlc291cmNlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9VUklSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9VUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjUyM2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1haW4gVVJJIHJlc29sdmVyIHRoYXQgY2FsbHMgb3V0IHRvIGFsbCBvZiB0aGUgcmVnaXN0ZXJlZAotICogZXh0ZXJuYWwgVVJJIHJlc29sdmVycyB0byBsb2NhdGUgYW4gZW50aXR5LiBJZiBub25lIG9mIHRoZSBleHRlcm5hbCByZXNvbHZlcnMKLSAqIGNhbiBsb2NhdGUgdGhlIGVudGl0eSB0aGUgcmVzb2x2ZXIgd2lsbCBhc2sgdGhlIGludGVybmFsIFdTREwgdmFsaWRhdG9yIFhNTAotICogY2F0YWxvZyB0byByZXNvbHZlIHRoZSBsb2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyIGltcGxlbWVudHMgSVVSSVJlc29sdmVyLCBYTUxFbnRpdHlSZXNvbHZlcgotewotICAvL3ByaXZhdGUgc3RhdGljIFVSSVJlc29sdmVyIGluc3RhbmNlID0gbnVsbDsKLQotICBwcml2YXRlIExpc3QgZXh0VVJJUmVzb2x2ZXJzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAvL3ByaXZhdGUgVVJJUmVzb2x2ZXJEZWxlZ2F0ZVtdIGV4dFJlc29sdmVyc0FycmF5OwotCi0gIC8vcHJpdmF0ZSBpbnQgbnVtRXh0UmVzb2x2ZXJzOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gVGhpcyBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LgotICAgKi8KLSAgcHVibGljIFVSSVJlc29sdmVyKCkKLSAgewotICAgIC8vbnVtRXh0UmVzb2x2ZXJzID0gVVJJUmVzb2x2ZXIuZXh0VVJJUmVzb2x2ZXJzTGlzdC5zaXplKCk7Ci0gICAgLy9leHRSZXNvbHZlcnNBcnJheSA9IChVUklSZXNvbHZlckRlbGVnYXRlW10pIFVSSVJlc29sdmVyLmV4dFVSSVJlc29sdmVyc0xpc3QKLSAgICAvLyAgICAudG9BcnJheShuZXcgVVJJUmVzb2x2ZXJEZWxlZ2F0ZVtudW1FeHRSZXNvbHZlcnNdKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGlzIFVSSVJlc29sdmVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgaW5zdGFuY2Ugb2YgdGhpcyBVUklSZXNvbHZlci4KLSAgICovCi0vLyAgcHVibGljIHN0YXRpYyBVUklSZXNvbHZlciBnZXRJbnN0YW5jZSgpCi0vLyAgewotLy8gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIGluc3RhbmNlID0gbmV3IFVSSVJlc29sdmVyKCk7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gaW5zdGFuY2U7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlSZXNvbHZlcgotICAgKiAgICAgICAgICBUaGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFVSSVJlc29sdmVyKElVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAgIGV4dFVSSVJlc29sdmVyc0xpc3QuYWRkKHVyaVJlc29sdmVyKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXIjcmVzb2x2ZShqYXZhLmxhbmcuU3RyaW5nLAotICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBJdGVyYXRvciByZXNvbHZlckl0ZXIgPSBleHRVUklSZXNvbHZlcnNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUocmVzb2x2ZXJJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAoSVVSSVJlc29sdmVyKXJlc29sdmVySXRlci5uZXh0KCk7Ci0gICAgICBpZiAocmVzb2x2ZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCAhcmVzdWx0LmVxdWFscyhzeXN0ZW1JZCkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHdlIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIGxvY2F0ZSB0aGUgcmVzdWx0IHlldCBhc2sgdGhlIGludGVybmFsIFhNTAotICAgIC8vIGNhdGFsb2cuCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFhNTENhdGFsb2cuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlRW50aXR5TG9jYXRpb24ocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICB9Ci0gICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gIG5vcm1hbGl6ZShiYXNlTG9jYXRpb24sIHN5c3RlbUlkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXIpCi0gICAqLwotICBwdWJsaWMgWE1MSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmVzb3VyY2VJZGVudGlmaWVyKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHB1YmxpY0lkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldFB1YmxpY0lkKCk7Ci0gICAgU3RyaW5nIHN5c3RlbUlkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldExpdGVyYWxTeXN0ZW1JZCgpOwotICAgIGlmIChwdWJsaWNJZCA9PSBudWxsIHx8IHB1YmxpY0lkLmVxdWFscygiIikpCi0gICAgewotICAgICAgcHVibGljSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIFN0cmluZyByZXN1bHQgPSByZXNvbHZlKHJlc291cmNlSWRlbnRpZmllci5nZXRCYXNlU3lzdGVtSWQoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICBYTUxJbnB1dFNvdXJjZSB4bWxJbnB1dFNvdXJjZSA9IG51bGw7Ci0gICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChyZXN1bHQpOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIHhtbElucHV0U291cmNlID0gbmV3IFhNTElucHV0U291cmNlKHB1YmxpY0lkLCByZXN1bHQsIHJlc3VsdCwgaXMsIG51bGwpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHhtbElucHV0U291cmNlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgc3lzdGVtSWQpCi0JewotCSAgLy8gSWYgbm8gc3lzdGVtSWQgaGFzIGJlZW4gc3BlY2lmaWVkIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KLQkgIC8vIHNvIHJldHVybiBudWxsOwotCSAgaWYoc3lzdGVtSWQgPT0gbnVsbCkKLQkgICAgcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSBzeXN0ZW1JZDsKLQkJLy8gbm9ybWFsaXplIHRoZSBVUkkKLQkJVVJJIHN5c3RlbVVSSSA9IFVSSS5jcmVhdGUoc3lzdGVtSWQpOwotCQlpZiAoIXN5c3RlbVVSSS5pc0Fic29sdXRlKCkpCi0JCXsKLQkJCVVSSSBiYXNlVVJJID0gVVJJLmNyZWF0ZShiYXNlTG9jYXRpb24pOwotCQkJdHJ5Ci0JCQl7Ci0JCQkgIHJlc3VsdCA9IGJhc2VVUkkucmVzb2x2ZShzeXN0ZW1VUkkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLQkJCXt9Ci0JCQkKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL1VSSVJlc29sdmVyRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzJlNmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXI7Ci0KLQotLyoqCi0gKiBBIGRlbGVnYXRlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyRGVsZWdhdGUKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NuYW1lOwotICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyOwotICBwcml2YXRlIElVUklSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0gIAotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGNsYXNzbmFtZSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgVVJJIHJlc29sdmVyLgotICAgKiBAcGFyYW0gY2xhc3Nsb2FkZXIgVGhlIGNsYXNzIGxvYWRlciB0byB1c2UgdG8gbG9hZCB0aGUgVVJJIHJlc29sdmVyLgotICAgKi8KLSAgcHVibGljIFVSSVJlc29sdmVyRGVsZWdhdGUoU3RyaW5nIGNsYXNzbmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpCi0gIHsKLSAgICB0aGlzLmNsYXNzbmFtZSA9IGNsYXNzbmFtZTsKLSAgICB0aGlzLmNsYXNzbG9hZGVyID0gY2xhc3Nsb2FkZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFVSSSByZXNvbHZlciBkZXNjcmliZWQgYnkgdGhpcyBkZWxlZ2F0ZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSByZXNvbHZlciBkZXNjcmliZWQgYnkgdGhpcyBkZWxlZ2F0ZS4KLSAgICovCi0gIHB1YmxpYyBJVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKQotICB7Ci0gICAgaWYocmVzb2x2ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmVzb2x2ZXIgPSAoSVVSSVJlc29sdmVyKWNsYXNzbG9hZGVyLmxvYWRDbGFzcyhjbGFzc25hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlciA9IChJVVJJUmVzb2x2ZXIpZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbGFzc25hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUyKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc29sdmVyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3V0aWwvRXJyb3JNZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3V0aWwvRXJyb3JNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYmRjMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL0Vycm9yTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogQSBjbGFzcyB0byBob2xkIHZhbGlkYXRpb24gbWVzc2FnZXMuIEluIHRoaXMgY2FzZSBhbiBlcnJvciBtZXNzYWdlIGlzIGEgZ2VuZXJpYwotICogdGVybSBmb3IgYW55IGtpbmQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlLgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JNZXNzYWdlCi17Ci0gIHByaXZhdGUgaW50IGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIHNldmVyaXR5OwotICBwcml2YXRlIFN0cmluZyBlcnJvclN0cmluZywgdXJpOwotICBwcml2YXRlIGludCBzdGFydE9mZnNldCA9IC0xOwotICBwcml2YXRlIGludCBlbmRPZmZzZXQgPSAtMTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgRXJyb3JNZXNzYWdlKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gZXJyb3IgVGhlIG1lc3NhZ2UgdG8gc2V0LgotICAgKiBAc2VlICNnZXRFcnJvck1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpCi0gIHsKLSAgICBlcnJvclN0cmluZyA9IGVycm9yOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHNlZSAjZ2V0U2V2ZXJpdHkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBzZXZlcml0eSkKLSAgewotICAgIHRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZSB1c2luZyBzdHJpbmcgbmFtZXMgZm9yIHRoZSBzZXZlcml0eS4KLSAgICogCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZXZlcml0eS4KLSAgICogQHNlZSAjZ2V0U2V2ZXJpdHkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldmVyaXR5KFN0cmluZyBzZXZlcml0eSkKLSAgewotICAgIGlmIChzZXZlcml0eS5lcXVhbHMoIndhcm5pbmciKSkKLSAgICB7Ci0gICAgICB0aGlzLnNldmVyaXR5ID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2V2ZXJpdHkuZXF1YWxzKCJlcnJvciIpKQotICAgIHsKLSAgICAgIHRoaXMuc2V2ZXJpdHkgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChzZXZlcml0eS5lcXVhbHMoImZhdGFsIikpCi0gICAgewotICAgICAgdGhpcy5zZXZlcml0eSA9IDI7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGxpbmUgd2hlcmUgdGhlIGVycm9yIGlzIGxvY2F0ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgaXMgbG9jYXRlZC4KLSAgICogQHNlZSAjZ2V0RXJyb3JMaW5lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvckxpbmUoaW50IGxpbmUpCi0gIHsKLSAgICBlcnJvckxpbmUgPSBsaW5lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgaXMgbG9jYXRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgaXMgbG9jYXRlZC4KLSAgICogQHNlZSAjZ2V0RXJyb3JDb2x1bW4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVycm9yQ29sdW1uKGludCBjb2x1bW4pCi0gIHsKLSAgICBlcnJvckNvbHVtbiA9IGNvbHVtbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZXJyb3IgbWVzc2FnZS4KLSAgICogQHNlZSAjc2V0RXJyb3JNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JTdHJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2V2ZXJpdHkgb2YgdGhlIGVycm9yLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2V2ZXJpdHkgb2YgdGhlIGVycm9yLgotICAgKiBAc2VlICNzZXRTZXZlcml0eQotICAgKi8KLSAgcHVibGljIGludCBnZXRTZXZlcml0eSgpCi0gIHsKLSAgICByZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlcnJvci4KLSAgICogQHNlZSAjc2V0RXJyb3JMaW5lCi0gICAqLwotICBwdWJsaWMgaW50IGdldEVycm9yTGluZSgpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JMaW5lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAc2VlICNzZXRFcnJvckNvbHVtbgotICAgKi8KLSAgcHVibGljIGludCBnZXRFcnJvckNvbHVtbigpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JDb2x1bW47Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc3RhcnQgb2Zmc2V0LgotICAgKiAKLSAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBvZmZzZXQuCi0gICAqIEBzZWUgI2dldEVycm9yU3RhcnRPZmZzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVycm9yU3RhcnRPZmZzZXQoaW50IHN0YXJ0KQotICB7Ci0gICAgc3RhcnRPZmZzZXQgPSBzdGFydDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlcnJvciBzdGFydCBvZmZzZXQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBlcnJvciBzdGFydCBvZmZzZXQuCi0gICAqIEBzZWUgI3NldEVycm9yU3RhcnRPZmZzZXQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RXJyb3JTdGFydE9mZnNldCgpCi0gIHsKLSAgICByZXR1cm4gc3RhcnRPZmZzZXQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW5kIG9mZnNldC4KLSAgICogCi0gICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBvZmZzZXQuCi0gICAqIEBzZWUgI2dldEVycm9yRW5kT2Zmc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvckVuZE9mZnNldChpbnQgZW5kKQotICB7Ci0gICAgZW5kT2Zmc2V0ID0gZW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVycm9yIGVuZCBvZmZzZXQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBlcnJvciBlbmQgb2Zmc2V0LgotICAgKiBAc2VlICNzZXRFcnJvckVuZE9mZnNldAotICAgKi8KLSAgcHVibGljIGludCBnZXRFcnJvckVuZE9mZnNldCgpCi0gIHsKLSAgICByZXR1cm4gZW5kT2Zmc2V0OwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBuZXcgbGluZSBvdCB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBuZXdMaW5lIFRoZSBuZXcgbGluZSB0byBhZGQgdG8gdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGROZXdFcnJvck1lc3NhZ2VMaW5lKFN0cmluZyBuZXdMaW5lKQotICB7Ci0gICAgZXJyb3JTdHJpbmcgKz0gIlxuIiArIG5ld0xpbmU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIFVSSSBvZiB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSB0byBzZXQuCi0gICAqLwotIAotICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIHRoaXMudXJpID0gdXJpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBVUkkgb2YgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgb2YgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3V0aWwvTWVzc2FnZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL01lc3NhZ2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3OGNiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3V0aWwvTWVzc2FnZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotLyoqCi0gKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciB3b3JraW5nIHdpdGggcmVzb3VyY2VzIGluIGEgcmVzb3VyY2UgYnVuZGxlLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUdlbmVyYXRvcgotewotICBwcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VidW5kbGU7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gd29yayB3aXRoLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VHZW5lcmF0b3IoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICByZXNvdXJjZWJ1bmRsZSA9IHJiOwotICB9Ci0KLSAgLyoqCi0gICogU2V0IHRoZSByZXNvdXJjZWJ1bmRsZSB0byB0aGUgb25lIHNwZWNpZmllZC4KLSAgKiAKLSAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgcmVzb3VyY2VidW5kbGUgPSByYjsKLSAgfQotCi0gIC8qKgotICAqIEdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIGtleS4KLSAgKiAKLSAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSByZXNvdXJjZS4KLSAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlYnVuZGxlLmdldFN0cmluZyhrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIGtleSBhbmQgZG9lcyBvbmUgc3Vic3RpdHV0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgcmVzb3VyY2UuCi0gICAqIEBwYXJhbSBzMSBUaGUgc3Vic3RpdHV0aW9uIHRvIHBlcmZvcm0uCi0gICAqIEByZXR1cm4gVGhlIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpCi0gIHsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXSB7IHMxIH0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIGtleSBhbmQgZG9lcyB0d28gc3Vic3RpdHV0aW9ucy4KLSAgICogCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIHJlc291cmNlLgotICAgKiBAcGFyYW0gczEgVGhlIGZpcnN0IHN1YnN0aXR1dGlvbiB0byBwZXJmb3JtLgotICAgKiBAcGFyYW0gczIgVGhlIHNlY29uZCBzdWJzdGl0dXRpb24gdG8gcGVyZm9ybS4KLSAgICogQHJldHVybiBUaGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSwgT2JqZWN0IHMyKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W10geyBzMSwgczIgfSk7Ci0gIH0KLQotICAvKioKLSAgICogIEdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIGtleSBhbmQgZG9lcyB0aHJlZSBzdWJzdGl0dXRpb25zLgotICAgKiAKLSAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgcmVzb3VyY2UuCi0gICAqIEBwYXJhbSBzMSBUaGUgZmlyc3Qgc3Vic3RpdHV0aW9uIHRvIHBlcmZvcm0uCi0gICAqIEBwYXJhbSBzMiBUaGUgc2Vjb25kIHN1YnN0aXR1dGlvbiB0byBwZXJmb3JtLgotICAgKiBAcGFyYW0gczMgVGhlIHRoaXJkIHN1YnN0aXR1dGlvbiB0byBwZXJmb3JtLgotICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxLCBPYmplY3QgczIsIE9iamVjdCBzMykKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgbmV3IE9iamVjdFtdIHsgczEsIHMyLCBzMyB9KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSVdTREwxMVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSVdTREwxMVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDc0N2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0lXU0RMMTFWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgdmFsaWRhdG9yIHBsdWdnZWQgaW50byB0aGUgV1NETCAxLjEgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBwYXJlbnRzIEEgbGlzdCBvZiBwYXJlbnRzIG9mIHRoaXMgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIFdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIHJlc291cmNlIGJ1bmRsZSBvZiB0aGUgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9JbXBvcnRIb2xkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0ltcG9ydEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTlhZjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0ltcG9ydEhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLkVycm9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2QuWFNEVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLkFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLklYTUxWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MQ2F0YWxvZ1Jlc29sdmVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET01VdGlsczsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC54bWwuUU5hbWVVdGlsczsKLQotLyoqCi0gKiBBIGNsYXNzIHRvIGhvbGQgYW5kIHBhcnNlIGFuIGltcG9ydCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0SG9sZGVyIGltcGxlbWVudHMgQ29tcGFyYWJsZQotewotICBwcml2YXRlIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLSAgCi0gIHByaXZhdGUgV1NETERvY3VtZW50IGltcG9ydGluZ1dTRExEb2MgPSBudWxsOwotICBwcml2YXRlIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQgPSBudWxsOwotICBwcml2YXRlIERlZmluaXRpb24gaW1wb3J0aW5nRGVmID0gbnVsbDsKLSAgcHJpdmF0ZSBFbGVtZW50IGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIGNvbnRleHRVUkkgPSBudWxsOwotICBwcml2YXRlIGludCBkZXB0aDsKLSAgcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICBwcml2YXRlIExpc3Qgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBib29sZWFuIGlzV1NETEZpbGVJbXBvcnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gaW1wb3J0SW52YWxpZCA9IGZhbHNlOwotICBwcml2YXRlIEltcG9ydCBpbXBvcnREZWYgPSBudWxsOwotICBwcml2YXRlIFdTREwxMVZhbGlkYXRpb25JbmZvIHZhbGluZm87Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcG9ydC4KLSAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW1wb3J0LgotICAgKiBAcGFyYW0gY29udGV4dFVSSSBUaGUgY29udGV4dCBVUkkgZm9yIHJlc29sdmluZyB0aGUgaW1wb3J0IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gd3NkbERvYyBUaGUgV1NETERvY3VtZW50IHRoYXQgY29udGFpbnMgdGhlIGltcG9ydC4KLSAgICogQHBhcmFtIGRlcHRoIFRoZSBkZXB0aCBvZiB0aGUgaW1wb3J0LgotICAgKiBAcGFyYW0gaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCBUaGUgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGltcG9ydCBpbiB0aGUgZW5jYXBzdWxhdGluZyBXU0RMRG9jdW1lbnQuCi0gICAqIEBwYXJhbSBtZXNzYWdlZ2VuZXJhdG9yIEEgbWVzc2FnZWdlbmVyYXRvciBmb3Igb2J0YWluaW5nIHN0cmluZ3MuCi0gICAqIEBwYXJhbSB2YWxpbmZvIFRoZSBXU0RMMTFWYWxpZGF0aW9uSW5mbyBmb3IgcmVwb3J0aW5nIG1lc3NhZ2VzLgotICAgKi8KLSAgcHVibGljIEltcG9ydEhvbGRlcihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBjb250ZXh0VVJJLCBXU0RMRG9jdW1lbnQgaW1wb3J0aW5nV1NETERvYywgaW50IGRlcHRoLCBFbGVtZW50IGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQsIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciwgV1NETDExVmFsaWRhdGlvbkluZm8gdmFsaW5mbykKLSAgewotICAgIHRoaXMubWVzc2FnZWdlbmVyYXRvciA9IG1lc3NhZ2VnZW5lcmF0b3I7Ci0gICAgdGhpcy52YWxpbmZvID0gdmFsaW5mbzsKLSAgICB0aGlzLmltcG9ydGluZ1dTRExEb2MgPSBpbXBvcnRpbmdXU0RMRG9jOwotICAgIGlmKGltcG9ydGluZ1dTRExEb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aGlzLmltcG9ydGluZ0RlZiA9IGltcG9ydGluZ1dTRExEb2MuZ2V0RGVmaW5pdGlvbigpOwotICAgIH0KLSAgICB0aGlzLmltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQgPSBpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50OwotICAgIHRoaXMuZGVwdGggPSBkZXB0aDsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgCi0gICAgLy8gIEFsbG93IFdTREwgaW1wb3J0cyB0byBoYXZlIG5vIGxvY2F0aW9uIGF0dHJpYnV0ZSBldmVuIHRob3VnaCBpdCBpcyByZXF1aXJlZC4KLSAgICAvLyBTY2hlbWEgd2lsbCBub3JtYWxseSBjYXRjaCB0aGUgcHJvYmxlbSBidXQgdGhpcyBhbGxvd3MgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlCi0gICAgLy8gc2NoZW1hIGFuZCBoYXZlIHRoZSB2YWxpZGF0b3IgcnVuLgotICAgIGlmICh0aGlzLmxvY2F0aW9uID09IG51bGwpCi0gICAgewotICAgICAgdGhpcy5sb2NhdGlvbiA9IG5hbWVzcGFjZTsKLSAgICB9Ci0gICAgdGhpcy5jb250ZXh0VVJJID0gY29udGV4dFVSSTsKLSAgICAKLSAgICB0aGlzLmxvY2F0aW9uID0gdGhpcy5sb2NhdGlvbi5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgICBTdHJpbmcgY2xhc3NwYXRoVVJJID0gdmFsaW5mby5nZXRVUklSZXNvbHZlcigpLnJlc29sdmUodGhpcy5jb250ZXh0VVJJLCB0aGlzLm5hbWVzcGFjZSwgdGhpcy5sb2NhdGlvbik7Ci0gICAgaWYoY2xhc3NwYXRoVVJJICE9IG51bGwpCi0gICAgewotICAgICAgdGhpcy5sb2NhdGlvbiA9IGNsYXNzcGF0aFVSSTsKLSAgICAgIHRoaXMuY29udGV4dFVSSSA9IG51bGw7Ci0gICAgfSAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpCi0gIHsKLSAgICBFbGVtZW50IGRvY3VtZW50RWxlbWVudCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBpZihkb2N1bWVudEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gIAkgIC8vIEhhbmRsZSBXU0RMIGltcG9ydHMuCi0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fREVGSU5JVElPTlMsIGRvY3VtZW50RWxlbWVudCkpCi0gICAgICB7Ci0gICAgICAgIGlmKGlzWE1MVmFsaWQodGhpcy5sb2NhdGlvbikpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3c2RsRG9jdW1lbnQgPSBuZXcgV1NETERvY3VtZW50KHRoaXMubG9jYXRpb24sIGRvY3VtZW50RWxlbWVudCwgdGhpcy5kZXB0aCwgdGhpcy5tZXNzYWdlZ2VuZXJhdG9yLCB0aGlzLnZhbGluZm8pOwotICAgICAgICAgICAgY3JlYXRlV1NETEltcG9ydCh3c2RsRG9jdW1lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmFsaW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1VOQUJMRV9UT19JTVBPUlRfQkFEX0xPQ0FUSU9OIiwgIiciICsgaW1wb3J0RGVmLmdldExvY2F0aW9uVVJJKCkgKyAiJyIpLCBpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIEhhbmRsZSBzY2hlbWEgaW1wb3J0cy4KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX1hTRF8yMDAxLCBkb2N1bWVudEVsZW1lbnQpKQotICAgICAgewotICAgICAgICBjcmVhdGVYU0RJbXBvcnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzWE1MVmFsaWQoU3RyaW5nIHVyaSkKLSAgewotICAgIElYTUxWYWxpZGF0b3IgeG1sVmFsaWRhdG9yID0gQWJzdHJhY3RYTUxDb25mb3JtYW5jZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRYTUxWYWxpZGF0b3IoKTsKLSAgICB4bWxWYWxpZGF0b3Iuc2V0RmlsZSh1cmkpOwotICAgIC8veG1sVmFsaWRhdG9yLnNldFZhbGlkYXRpb25JbmZvKHZhbEluZm8pOwotICAgIHhtbFZhbGlkYXRvci5ydW4oKTsKLSAgICAvLyBpZiB0aGVyZSBhcmUgbm8geG1sIGNvbmZvcm1hbmNlIHByb2JsZW1zIGdvIG9uIHRvIGNoZWNrIHRoZSB3c2RsIHN0dWZmCi0gICAgaWYgKHhtbFZhbGlkYXRvci5oYXNFcnJvcnMoKSkKLSAgICB7Ci0gICAgICAvLyB0ZW1wIGhhbmRsaW5nIG9mIFhNTCBlcnJvcnMgdW50aWwgdmFsaWRhdG9yIGlzIHVwZGF0ZWQuCi0gICAgICBMaXN0IGVycm9ycyA9IHhtbFZhbGlkYXRvci5nZXRFcnJvcnMoKTsKLSAgICAgIEl0ZXJhdG9yIGVycm9yc0l0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChlcnJvcnNJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgdmFsTWVzID0gKFZhbGlkYXRpb25NZXNzYWdlKWVycm9yc0l0ZXIubmV4dCgpOwotICAgICAgICB2YWxpbmZvLmFkZEVycm9yKHZhbE1lcy5nZXRNZXNzYWdlKCksIHZhbE1lcy5nZXRMaW5lKCksIHZhbE1lcy5nZXRDb2x1bW4oKSwgdmFsTWVzLmdldFVSSSgpKTsKLSAgICAgIH0KLSAgICAgIGltcG9ydEludmFsaWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgaW1wb3J0aW5nIFdTRExEb2N1bWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGltcG9ydGluZyBXU0RMRG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50IGdldEltcG9ydGluZ0RvY3VtZW50KCkKLSAgewotICAgIHJldHVybiBpbXBvcnRpbmdXU0RMRG9jOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBXU0RMIGRvY3VtZW50IHRoaXMgaW1wb3J0IHJlcHJlc2VudHMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBXU0RMIGRvY3VtZW50IHRoaXMgaW1wb3J0IHJlcHJlc2VudHMuCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50IGdldFdTRExEb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gd3NkbERvY3VtZW50OwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsb2NhdGlvbi4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRleHQgVVJJLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgY29udGV4dCBVUkkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRVUkkoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRleHRVUkk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGRlcHRoIGluIHRoZSBXU0RMIHRyZWUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBkZXB0aCBpbiB0aGUgV1NETCB0cmVlLgotICAgKi8KLSAgcHVibGljIGludCBnZXREZXB0aCgpCi0gIHsKLSAgICByZXR1cm4gZGVwdGg7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRhaW5pbmcgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgY29udGFpbmluZyBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0SW1wb3J0aW5nRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0aW5nRGVmOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBlbGVtZW50IGZvciB0aGlzIGltcG9ydC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgZm9yIHRoaXMgaW1wb3J0LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgaWYoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgbG9jYXRpb25VUkkgPSBsb2NhdGlvbjsKLSAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlOwotICAgIC8vSW1wb3J0IGltcG9ydERlZiA9IGltcG9ydGluZ0RlZi5jcmVhdGVJbXBvcnQoKTsKLSAgICAKLSAgICAvLyAgQWxsb3cgbG9jYXRpbmcgV1NETCBkb2N1bWVudHMgdXNpbmcgYW55IHJlZ2lzdGVyZWQgVVJJIHJlc29sdmVyLgotICAgIC8vU3RyaW5nIGNsYXNzcGF0aFVSSSA9IFVSSVJlc29sdmVyLmdldEluc3RhbmNlKCkucmVzb2x2ZShjb250ZXh0VVJJLCBuYW1lc3BhY2VVUkksIGxvY2F0aW9uVVJJKTsKLS8vICAgIGlmICghY2xhc3NwYXRoVVJJLmVxdWFscyhsb2NhdGlvblVSSSkpCi0vLyAgICB7Ci0vLyAgICAgIGxvY2F0aW9uVVJJID0gY2xhc3NwYXRoVVJJOwotLy8gICAgICBjb250ZXh0VVJJID0gbnVsbDsKLS8vICAgIH0KLSAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICBpZiAobG9jYXRpb25VUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy9TdHJpbmcgY29udGV4dFVSSSA9IGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAgICAgICAvL0RlZmluaXRpb24gaW1wb3J0ZWREZWYgPSBudWxsOwotICAgICAgICAgIAotICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbnVsbDsKLSAgICAgICAgICBVUkwgdXJsID0gbnVsbDsKLQotICAgICAgICAgIAotICAgICAgICAgICAgVVJMIGNvbnRleHRVUkwgPSAoY29udGV4dFVSSSAhPSBudWxsKSA/IFN0cmluZ1V0aWxzLmdldFVSTChudWxsLCBjb250ZXh0VVJJKSA6IG51bGw7Ci0KLSAgICAgICAgICAgIHVybCA9IFN0cmluZ1V0aWxzLmdldFVSTChjb250ZXh0VVJMLCBsb2NhdGlvblVSSSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEhhbmRsZSBmaWxlOi8vIHVybHMuIFRoZSBjb3JyZWN0IGZvcm1hdCBzaG91bGQgYmUgZmlsZTovLy8gb3IgZmlsZTovLgotICAgICAgICAgICAgU3RyaW5nIHVybEF1dGhvcml0eSA9IHVybC5nZXRBdXRob3JpdHkoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmxQcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOwotICAgICAgICAgICAgaWYodXJsQXV0aG9yaXR5ICE9bnVsbCAmJiB1cmxQcm90b2NvbC5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikgJiYgIXVybEF1dGhvcml0eS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh1cmxQcm90b2NvbCwiIiwiLyIgKyB1cmxBdXRob3JpdHkgKyB1cmwuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOwotCQkJLy8gVGVzdCBmb3IgY2FzZSBzZW5zaXRpdml0eSBvbiBsb2NhbCBmaWxlcy4KLQkJCWlmKHVybFN0cmluZy5zdGFydHNXaXRoKCJmaWxlOiIpKQotCQkJewotCQkJICBGaWxlIHRlc3RmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCQkgIFN0cmluZyB0ZXN0ZmlsZVN0cmluZyA9IHRlc3RmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJICBGaWxlIGNhbm9uaWNhbGZpbGUgPSB0ZXN0ZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCQkgIFN0cmluZyBjYW5vbmljYWxmaWxlU3RyaW5nID0gY2Fub25pY2FsZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotICAgICAgICAgICAgICBpZiAoIXRlc3RmaWxlU3RyaW5nLmVxdWFscyhjYW5vbmljYWxmaWxlU3RyaW5nKSkKLSAgICAgICAgICAgICAgewotCQkJCWlmICghU3RyaW5nLnZhbHVlT2YodGVzdGZpbGVTdHJpbmcuY2hhckF0KDApKS5lcXVhbHNJZ25vcmVDYXNlCi0JCQkJICAgIChTdHJpbmcudmFsdWVPZihjYW5vbmljYWxmaWxlU3RyaW5nLmNoYXJBdCgwKSkpCi0JCQkJICAgIHx8ICF0ZXN0ZmlsZVN0cmluZy5zdWJzdHJpbmcoMSx0ZXN0ZmlsZVN0cmluZy5sZW5ndGgoKSkuZXF1YWxzCi0JCQkJCShjYW5vbmljYWxmaWxlU3RyaW5nLnN1YnN0cmluZygxLGNhbm9uaWNhbGZpbGVTdHJpbmcubGVuZ3RoKCkpKSkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICB1cmxTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgICAgICAgIHVybCA9IG51bGw7Ci0JCQkJfQotICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCQkKLQkJCWlmKHVybCAhPSBudWxsKQotCQkJewotCQkJICB0cnkKLQkJCSAgewotICAgICAgICAgICAgICAgIHJlYWRlciA9IFN0cmluZ1V0aWxzLmdldENvbnRlbnRBc1JlYWRlcih1cmwpOwotCQkJICB9Ci0JCQkgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0JCQkgIHsKLQkJCSAgICAvLyBObyBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUuIFRoZSBlcnJvciB3aWxsIGJlIGhhbmRsZWQgYmVsb3cuCi0JCQkgIH0KLQkJCX0KLSAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UocmVhZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlucHV0U291cmNlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIEdldCB0aGUgYWN0dWFsIGxvY2F0aW9uIGZyb20gdGhlIGVsZW1lbnQuCi0gICAgICAgICAgICAgIFN0cmluZyBhY3R1YWxMb2NhdGlvbiA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50LCBDb25zdGFudHMuQVRUUl9MT0NBVElPTik7Ci0gICAgICAgICAgICAgIGlmKGFjdHVhbExvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgCWFjdHVhbExvY2F0aW9uID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQsICJzY2hlbWFMb2NhdGlvbiIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmKGFjdHVhbExvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgCWFjdHVhbExvY2F0aW9uID0gbmFtZXNwYWNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGltcG9ydGluZ1dTRExEb2MuYWRkUmVhZGVyV2FybmluZygKLSAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RlZiwKLSAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1VOQUJMRV9UT19JTVBPUlRfQkFEX0xPQ0FUSU9OIiwgIiciICsgYWN0dWFsTG9jYXRpb24gKyAiJyIpKTsKLSAgICAgICAgICAgICAgaW1wb3J0SW52YWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gVE9ETzogbW9kaWZ5IHRoZSByZWFkZXIgZXJyb3IgdG8gc2hvdyBpbiBhbGwgdGhlIGNvcnJlY3QgbG9jYXRpb25zLgotICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLAotICAgICAgICAgICAgICAgICJVbmFibGUgdG8gbG9jYXRlIGltcG9ydGVkIGRvY3VtZW50ICIKLSAgICAgICAgICAgICAgICAgICsgImF0ICciCi0gICAgICAgICAgICAgICAgICArIGxvY2F0aW9uVVJJCi0gICAgICAgICAgICAgICAgICArICInIgotICAgICAgICAgICAgICAgICAgKyAoY29udGV4dFVSSSA9PSBudWxsID8gIi4iIDogIiwgcmVsYXRpdmUgdG8gJyIgKyBjb250ZXh0VVJJICsgIicuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkb2MgPSBXU0RMUmVhZGVySW1wbC5nZXREb2N1bWVudChpbnB1dFNvdXJjZSwgbG9jYXRpb25VUkkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBUaGUgRmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcmVhZC4gCi0gICAgICAgICAgICAgIC8vIFBlcmZvcm0gWE1MIHZhbGlkYXRpb24uCi0gICAgICAgICAgICAgIGlzWE1MVmFsaWQobG9jYXRpb25VUkkpOwotLy8gICAgICAgICAgICAgIGltcG9ydGluZ1dTRExEb2MuYWRkUmVhZGVyRXJyb3IoCi0vLyAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RlZiwKLS8vICAgICAgICAgICAgICAgICAgaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCwKLS8vICAgICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9VTkFCTEVfVE9fSU1QT1JUX0lOVkFMSUQiLCAiJyIgKyBsb2NhdGlvbiArICInIikpOwotICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmKCFRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ERUZJTklUSU9OUywgZWxlbWVudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzV1NETEZpbGVJbXBvcnQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBpbXBvcnRlZCBkb2N1bWVudCBoYXMgdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBpbXBvcnQgZWxlbWVudCBzdGF0ZXMuCi0gICAgICAgICAgICBTdHJpbmcgaW1wb3J0VGFyZ2V0TlMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIGlmKCFpbXBvcnRUYXJnZXROUy5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW1wb3J0aW5nV1NETERvYy5hZGRSZWFkZXJXYXJuaW5nKAotICAgICAgICAgICAgICAgICAgaW1wb3J0aW5nRGVmLAotICAgICAgICAgICAgICAgICAgaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfV0FSTl9XUk9OR19OU19PTl9JTVBPUlQiLCAiJyIgKyBuYW1lc3BhY2UgKyAiJyIsICInIiArIGltcG9ydFRhcmdldE5TICsgIiciKSk7Ci0gICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICBpbXBvcnRJbnZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmKHJlYWRlciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7fQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgCi0gICAgfQotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGFuIGltcG9ydCBlbGVtZW50IGZvciBhIFdTREwgaW1wb3J0IG9mIGEgV1NETCBkb2N1bWVudC4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgVGhlIGRvY3VtZW50IG9mIHRoZSBpbXBvcnQuCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW1wb3J0IGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGNyZWF0ZVdTRExJbXBvcnQoV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgewotICAgIGlmKGltcG9ydERlZiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBpbXBvcnREZWY7Ci0gICAgfQotICAgIGltcG9ydERlZiA9IGdldE5ld0ltcG9ydCgpOwotICAKLSAgICBpZiAoaW1wb3J0RGVmICE9IG51bGwpCi0gICAgewotICAgICAgaW1wb3J0RGVmLnNldERlZmluaXRpb24od3NkbERvY3VtZW50LmdldERlZmluaXRpb24oKSk7Ci0gICAgICBzY2hlbWFzLmFkZEFsbCh3c2RsRG9jdW1lbnQuZ2V0U2NoZW1hcygpKTsKLSAgICAgIGltcG9ydGluZ1dTRExEb2MuYWRkU2NoZW1hcyhzY2hlbWFzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGFuIGltcG9ydCBlbGVtZW50IGZvciBhIFdTREwgaW1wb3J0IG9mIGEgc2NoZW1hIGltcG9ydCBvZiBhIHNjaGVtYSBkb2N1bWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW1wb3J0IGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGNyZWF0ZVhTREltcG9ydCgpCi0gIHsKLSAgICBpZihpbXBvcnREZWYgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW1wb3J0RGVmOwotICAgIH0KLSAgICBpbXBvcnREZWYgPSBnZXROZXdJbXBvcnQoKTsKLSAgICBYU0RWYWxpZGF0b3IgeHNkdmFsaWRhdG9yID0gbmV3IFhTRFZhbGlkYXRvcigpOwotCi0gICAgeHNkdmFsaWRhdG9yLnZhbGlkYXRlKGxvY2F0aW9uLCBYTUxDYXRhbG9nUmVzb2x2ZXIuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgaWYgKHhzZHZhbGlkYXRvci5pc1ZhbGlkKCkpCi0gICAgewotICAgICAgWFNNb2RlbCBzY2hlbWEgPSB4c2R2YWxpZGF0b3IuZ2V0WFNNb2RlbCgpOwotICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBzY2hlbWFzLmFkZChzY2hlbWEpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAvLyBhZGRSZWFkZXJXYXJuaW5nKAotLy8gICAgICAgIGRlZiwKLS8vICAgICAgICBpbXBvcnREZWYsCi0vLyAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9VTkFCTEVfVE9fSU1QT1JUX0lOVkFMSUQiLCAiJyIgKyBpbXBvcnREZWYuZ2V0TG9jYXRpb25VUkkoKSArICInIikpOwotICAgICAgSXRlcmF0b3IgZXJyb3JzID0geHNkdmFsaWRhdG9yLmdldEVycm9ycygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZXJyb3JzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRXJyb3JNZXNzYWdlIGVyciA9IChFcnJvck1lc3NhZ2UpIGVycm9ycy5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBlcnIuZ2V0VVJJKCk7Ci0gICAgICAgIGludCBsaW5lID0gZXJyLmdldEVycm9yTGluZSgpOwotICAgICAgICBTdHJpbmcgZXJybWVzcyA9IGVyci5nZXRFcnJvck1lc3NhZ2UoKTsKLSAgICAgICAgdmFsaW5mby5hZGRFcnJvcihlcnJtZXNzLCBsaW5lLCBlcnIuZ2V0RXJyb3JDb2x1bW4oKSwgdXJpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW1wb3J0aW5nV1NETERvYy5hZGRTY2hlbWFzKHNjaGVtYXMpOwotICAgIHJldHVybiBpbXBvcnREZWY7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGltcG9ydCBlbGVtZW50IGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbXBvcnQgZWxlbWVudCBpZiBpdCBoYXMgYmVlbiBjcmVhdGVkIG9yIG51bGwuCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGdldEltcG9ydCgpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGEgbmV3IGltcG9ydCBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiBBIG5ldyBpbXBvcnQgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgSW1wb3J0IGdldE5ld0ltcG9ydCgpCi0gIHsKLSAgICBpZihpbXBvcnRJbnZhbGlkKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBJbXBvcnQgaW1wb3J0RGVmID0gaW1wb3J0aW5nRGVmLmNyZWF0ZUltcG9ydCgpOyAKLSAgICAKLSAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgewotICAgICAgaW1wb3J0RGVmLnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGltcG9ydERlZi5zZXRMb2NhdGlvblVSSShsb2NhdGlvbik7Ci0gICAgfQotICAgIAotICAgIGlmKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGVsZW1lbnQpOwotCi0gICAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgICB7Ci0gICAgICAgICAgaW1wb3J0RGVmLnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzY2hlbWFzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpbXBvcnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzY2hlbWFzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpbXBvcnQuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRTY2hlbWFzKCkKLSAgewotICAgIHJldHVybiBzY2hlbWFzOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaW1wb3J0IGltcG9ydHMgYSBXU0RMIGRvY3VtZW50LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBpbXBvcnQgaW1wb3J0cyBhIFdTREwgZG9jdW1lbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV1NETEZpbGVJbXBvcnQoKQotICB7Ci0gICAgcmV0dXJuIGlzV1NETEZpbGVJbXBvcnQ7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0gIHsKLSAgICBpZihvYmouZ2V0Q2xhc3MoKSA9PSBJbXBvcnRIb2xkZXIuY2xhc3MpCi0gICAgewotICAgICAgSW1wb3J0SG9sZGVyIG90aGVySW1wb3J0ID0gKEltcG9ydEhvbGRlcilvYmo7Ci0gICAgICAKLSAgICAgIGlmKGdldE5hbWVzcGFjZSgpLmVxdWFscyhvdGhlckltcG9ydC5nZXROYW1lc3BhY2UoKSkgJiYgZ2V0TG9jYXRpb24oKS5lcXVhbHMob3RoZXJJbXBvcnQuZ2V0TG9jYXRpb24oKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmopCi0gIHsKLSAgICBpZihvYmogPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgSW1wb3J0SG9sZGVyIG90aGVySW1wb3J0ID0gKEltcG9ydEhvbGRlcilvYmo7Ci0gICAgICAKLSAgICByZXR1cm4gKGdldE5hbWVzcGFjZSgpK2dldExvY2F0aW9uKCkpLmNvbXBhcmVUbygob3RoZXJJbXBvcnQuZ2V0TmFtZXNwYWNlKCkrb3RoZXJJbXBvcnQuZ2V0TG9jYXRpb24oKSkpOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBtZXNzYWdlZ2VuZXJhdG9yIGZvciB0aGUgaW1wb3J0IGhvbGRlci4KLSAgICogCi0gICAqIEBwYXJhbSBtZyBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUdlbmVyYXRvcihNZXNzYWdlR2VuZXJhdG9yIG1nKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1nOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhlIGltcG9ydCBpcyBpbnZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGltcG9ydCBpcyBpbnZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ltcG9ydEludmFsaWQoKQotICB7Ci0gICAgcmV0dXJuIGltcG9ydEludmFsaWQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9Mb2NhdGlvbkhvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvTG9jYXRpb25Ib2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlZjMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9Mb2NhdGlvbkhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi0vKioKLSAqIEhvbGRzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW4gZWxlbWVudCBpbiBhIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgTG9jYXRpb25Ib2xkZXIKLXsKLSAgcHJpdmF0ZSBpbnQgbGluZTsKLSAgcHJpdmF0ZSBpbnQgY29sdW1uOwotICBwcml2YXRlIFN0cmluZyB1cmk7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBudW1iZXIuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgTG9jYXRpb25Ib2xkZXIoaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICB0aGlzLmxpbmUgPSBsaW5lOwotICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwotICAgIHRoaXMudXJpID0gdXJpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaW5lIG51bWJlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpbmUgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lKCkKLSAgewotICAgIHJldHVybiBsaW5lOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjb2x1bW4gbnVtYmVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgY29sdW1uIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkKLSAgewotICAgIHJldHVybiBjb2x1bW47Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGZpbGUgVVJJLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZmlsZSBVUkkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9SZWFkZXJFcnJvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvUmVhZGVyRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiNGU0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9SZWFkZXJFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi0vKioKLSAqIEhvbGRzIGFuIGVycm9yIGNyZWF0ZWQgd2hlbiByZWFkaW5nIGEgV1NETCBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRlckVycm9yCi17Ci0gIHByb3RlY3RlZCBPYmplY3QgcGFyZW50T2JqZWN0OyAvLyB0aGUgb2JqZWN0IG9mIHRoZSBwYXJlbnQgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvcgotICBwcm90ZWN0ZWQgT2JqZWN0IG9iamVjdDsgLy8gdGhlIG9iamVjdCB0aGUgZXJyb3IgaXMgYXNzb2NpYXRlZCB3aXRoCi0gIHByb3RlY3RlZCBTdHJpbmcgZXJyb3I7IC8vIHRoZSBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCAKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50T2JqZWN0IHRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IKLSAgICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yCi0gICAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IKLSAgICovCi0gIHB1YmxpYyBSZWFkZXJFcnJvcihPYmplY3QgcGFyZW50T2JqZWN0LCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZXJyb3IpCi0gIHsKLSAgICB0aGlzLnBhcmVudE9iamVjdCA9IHBhcmVudE9iamVjdDsKLSAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICB0aGlzLmVycm9yID0gZXJyb3I7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcGFyZW50IG9iamVjdCBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgcGFyZW50IG9iamVjdCBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudE9iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gcGFyZW50T2JqZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvci4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvcgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFcnJvcigpCi0gIHsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDU2NGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogQSByZWdpc3RyeSB0byBob2xkIGFsbCB0aGUgV1NETCAxLjEgdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5Ci17Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSB2ZXJJbnN0YW5jZTsKLQotICBwcm90ZWN0ZWQgTWFwIHZhbGlkYXRvclJlZyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgVmFsaWRhdG9yUmVnaXN0cnkoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhpcyByZWdpc3RyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmICh2ZXJJbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZlckluc3RhbmNlID0gbmV3IFZhbGlkYXRvclJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiB2ZXJJbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGlzIHZhbGlkYXRvciBkZWxlZ2F0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdGhlIHZhbGlkYXRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAqIEBwYXJhbSB2YWxEZWxlZ2F0ZSBUaGUgdmFsaWRhdG9yIGRlbGVnYXRlIHRvIHJlZ2lzdGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgdmFsRGVsZWdhdGUpCi0gIHsKLSAgICAvLyBhbGxvdyB0aGUgbnVsbCBuYW1lc3BhY2UgYnV0IG1ha2UgaXQgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIHZhbGlkYXRvciB0byB0aGUgaGFzaHRhYmxlCi0gICAgdmFsaWRhdG9yUmVnLnB1dChuYW1lc3BhY2UsIHZhbERlbGVnYXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc2sgZm9yIHRoZSB2YWxpZGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlLiBJZiBub25lIGlzIGZvdW5kCi0gICAqIHJldHVybiBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEByZXR1cm4gVGhlIFdTREwgMS4xIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBJV1NETDExVmFsaWRhdG9yIHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIC8vIGlmIHRoZSBuYW1lc3BhY2UgaXMgbnVsbCBhbGxvdyBpdCBhbmQgdHJlYXQgaXQgYXMgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0gICAgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUgPSAoV1NETDExVmFsaWRhdG9yRGVsZWdhdGUpdmFsaWRhdG9yUmVnLmdldChuYW1lc3BhY2UpOwotICAgIGlmKGRlbGVnYXRlICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHRlbGxzIHdoZXRoZXIgYSB2YWxpZGF0b3IgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlIGlzIHJlZ2lzdGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdG8gY2hlY2suCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRvciByZWdpc3RlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNSZWdpc3RlcmVkVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBpZiAocXVlcnlWYWxpZGF0b3JSZWdpc3RyeShuYW1lc3BhY2UpICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExQmFzaWNWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMUJhc2ljVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmODIyM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExQmFzaWNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2QuU2NoZW1hQXR0cmlidXRlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkLlhTRFZhbGlkYXRvcjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0vKioKLSAqIFZhbGlkYXRlIHRoZSBlbGVtZW50cyBkZWZpbmVkIGluIGEgV1NETCAxLjEgRG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMTFCYXNpY1ZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VTX0ZFQVRVUkVfSUQgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRkVBVFVSRV9JRCA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BX1ZBTElEQVRJT05fRkVBVFVSRV9JRCA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNDSEVNQV9GVUxMX0NIRUNLSU5HX0ZFQVRVUkVfSUQgPQotICAgICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEtZnVsbC1jaGVja2luZyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQ09OVElOVUVfQUZURVJfRkFUQUxfRVJST1JfSUQgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTT0FQX0VOQ09ESU5HX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gIAotICAvLyBFcnJvciBhbmQgV2FybmluZyBLZXlzCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9QT1JUX05BTUVfTk9UX1VOSVFVRSA9ICJfUE9SVF9OQU1FX05PVF9VTklRVUUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfTk9fQklORElOR19GT1JfUE9SVCA9ICJfTk9fQklORElOR19GT1JfUE9SVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9OT19BRERSRVNTX1BPUlQgPSAiX05PX0FERFJFU1NfUE9SVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9NT1JFX1RIRU5fT05FX0FERFJFU1NfUE9SVCA9ICJfTU9SRV9USEVOX09ORV9BRERSRVNTX1BPUlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfUE9SVFRZUEVfVU5ERUZJTkVEX0ZPUl9CSU5ESU5HID0gIl9QT1JUVFlQRV9VTkRFRklORURfRk9SX0JJTkRJTkciOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfT1BFUkFUSU9OX1VOREVGSU5FRF9GT1JfUE9SVFRZUEUgPSAiX09QRVJBVElPTl9VTkRFRklORURfRk9SX1BPUlRUWVBFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX09QRVJBVElPTl9OT19JTlBVVF9PUl9PVVRQVVQgPSAiX09QRVJBVElPTl9OT19JTlBVVF9PUl9PVVRQVVQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfSU5QVVRfTkFNRV9OT1RfVU5JUVVFID0gIl9JTlBVVF9OQU1FX05PVF9VTklRVUUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVUID0gIl9NRVNTQUdFX1VOREVGSU5FRF9GT1JfSU5QVVQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfT1VUUFVUX05BTUVfTk9UX1VOSVFVRSA9ICJfT1VUUFVUX05BTUVfTk9UX1VOSVFVRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9NRVNTQUdFX1VOREVGSU5FRF9GT1JfT1VUUFVUID0gIl9NRVNTQUdFX1VOREVGSU5FRF9GT1JfT1VUUFVUIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9GQVVMVCA9ICJfTUVTU0FHRV9VTkRFRklORURfRk9SX0ZBVUxUIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1BBUlRfTk9fRUxFTUVOVF9PUl9UWVBFID0gIl9QQVJUX05PX0VMRU1FTlRfT1JfVFlQRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9QQVJUX0JPVEhfRUxFTUVOVF9BTkRfVFlQRSA9ICJfUEFSVF9CT1RIX0VMRU1FTlRfQU5EX1RZUEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfUEFSVF9JTlZBTElEX0VMRU1FTlQgPSAiX1BBUlRfSU5WQUxJRF9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1BBUlRfSU5WQUxJRF9UWVBFID0gIl9QQVJUX0lOVkFMSURfVFlQRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9XQVJOX1NPQVBFTkNfSU1QT1JURURfUEFSVCA9ICJfV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1BBUlQiOwotCi0gIHByaXZhdGUgZmluYWwgaW50IEVMRU1FTlQgPSAwOwotICBwcml2YXRlIGZpbmFsIGludCBUWVBFID0gMTsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJFUVVFU1QgPSAiUmVxdWVzdCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJFU1BPTlNFID0gIlJlc3BvbnNlIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUVVPVEUgPSAiJyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotICAKLQotICAvL3Byb3RlY3RlZCBXU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyIHZhbGlkYXRvcmNvbnRyb2xsZXI7Ci0gIHByb3RlY3RlZCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3I7Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvciN2YWxpZGF0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuTGlzdCwgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2RsMTEuV1NETDExVmFsaWRhdGlvbkluZm8pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgLy90aGlzLnZhbGlkYXRvcmNvbnRyb2xsZXIgPSB2YWxpZGF0b3Jjb250cm9sbGVyOwotICAgIC8vc2V0RGVmYXVsdFJlc291cmNlQnVuZGxlSWZOZWVkZWQodmFsaWRhdG9yY29udHJvbGxlcik7Ci0gICAgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWVsZW1lbnQ7Ci0gICAgLy92YWxpZGF0ZVR5cGVzKHdzZGxEZWZpbml0aW9uLCB2YWxJbmZvKTsKLSAgICB2YWxpZGF0ZVNlcnZpY2VzKHdzZGxEZWZpbml0aW9uLCB2YWxJbmZvKTsKLSAgICB2YWxpZGF0ZUJpbmRpbmdzKHdzZGxEZWZpbml0aW9uLCB2YWxJbmZvKTsKLSAgICB2YWxpZGF0ZVBvcnRUeXBlcyh3c2RsRGVmaW5pdGlvbiwgdmFsSW5mbyk7Ci0gICAgdmFsaWRhdGVNZXNzYWdlcyh3c2RsRGVmaW5pdGlvbiwgdmFsSW5mbyk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBUYWtlcyBhIGxpc3Qgb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIGFuZCBjaGVja3MgaWYgdGhlcmUncyBhIHZhbGlkYXRvciAKLSAgICogYXNzb2NpYXRlZCB3aXRoIGVhY2ggZWxlbWVudCBhbmQgaWYgc28gY2FsbHMgdGhlIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzIFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIuCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgZGVmbmludGlvbnMgZWxlbWVudCBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KAotICAgIExpc3QgcGFyZW50cywKLSAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cywKLSAgICBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgVmFsaWRhdG9yUmVnaXN0cnkgdmVyID0gVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBJdGVyYXRvciBleHRFbGVtcyA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChleHRFbGVtcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgSVdTREwxMVZhbGlkYXRvciB2YWwgPSB2ZXIucXVlcnlWYWxpZGF0b3JSZWdpc3RyeShuYW1lc3BhY2UpOwotICAgICAgaWYgKHZhbCAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICAgdmFsLnZhbGlkYXRlKGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgICB7Ci0vLyAgICAgICAgdmFsSW5mby5hZGROYW1lc3BhY2VXaXRoTm9WYWxpZGF0b3IobmFtZXNwYWNlKTsKLS8vICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGUgcmVzb3VyY2VidW5kbGUgaGFzbid0IGJlZW4gc2V0LCBzZXQgaXQgdG8gdGhlIG9uZSByZWdpc3RlcmVkIHdpdGggdGhlIFZhbGlkYXRvckNvbnRyb2xsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgdG8gZ2V0IHRoZSByZXNvdXJjZSBidW5kbGUgZnJvbS4KLSAgICovCi0gIC8vICBwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVJZk5lZWRlZChXU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyIHZhbGlkYXRvcmNvbnRyb2xsZXIpCi0gIC8vICB7Ci0gIC8vICAgIGlmIChtZXNzYWdlZ2VuZXJhdG9yID09IG51bGwpCi0gIC8vICAgIHsKLSAgLy8gICAgICBzZXRSZXNvdXJjZUJ1bmRsZSh2YWxpZGF0b3Jjb250cm9sbGVyLmdldFJlc291cmNlQnVuZGxlKCkpOwotICAvLyAgICB9Ci0gIC8vICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcmVzb3VyY2VidW5kbGUgdG8gdGhlIG9uZSBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIG1lc3NhZ2VnZW5lcmF0b3IgPSBuZXcgTWVzc2FnZUdlbmVyYXRvcihyYik7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgdGhlIFR5cGVzIGVsZW1lbnQgaXMgY29ycmVjdC4gCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb24gVGhlIGRlZmluaXRpb25zIGVsZW1lbnQgZnJvbSB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAgICovCi0KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlcyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgVHlwZXMgdHlwZXMgPSB3c2RsRGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgIC8vIGVuc3VyZSB0aGF0IHR5cGVzIGlzIGRlZmluZWQKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHBhcmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBwYXJlbnRzLmFkZCh3c2RsRGVmaW5pdGlvbik7Ci0gICAgICBPYmplY3QgZXh0ZW5zaWJsZUVsZW1lbnRzW10gPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS50b0FycmF5KCk7Ci0gICAgICBwYXJlbnRzLmFkZCgwLCB0eXBlcyk7Ci0gICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdChwYXJlbnRzLCB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIGFsbCBvZiB0aGUgZGVjbGFyZWQgc2VydmljZXMgZm9yIHRoZSBkZWZpbml0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNlcnZpY2VzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIFdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBpZiAod3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIE9iamVjdCBzZXJ2aWNlc1tdID0gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS50b0FycmF5KCk7Ci0gICAgTGlzdCBwYXJlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIHBhcmVudHMuYWRkKHdzZGxEZWZpbml0aW9uKTsKLSAgICBIYXNodGFibGUgYWxsUG9ydHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAvL1RPRE86IGNoZWNrIHRoYXQgcG9ydHMgaW4gb3RoZXIgaW1wb3J0ZWQgZmlsZXMgZG9uJ3QgY29uZmxpY3Qgd2l0aCBwb3J0cyBpbiB0aGlzIG9uZQotICAgIC8vICAgIC8vIHJlZ2lzdGVyIGFsbCBvZiB0aGUgaW1wb3J0ZWQgcG9ydHMKLSAgICAvLyAgICBJdGVyYXRvciBpbXBvcnRzID0gd3NkbERlZmluaXRpb24uZ2V0SW1wb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgLy8gICAgd2hpbGUoaW1wb3J0cy5oYXNOZXh0KCkpCi0gICAgLy8gICAgewotICAgIC8vICAgICAgSXRlcmF0b3IgaW1wc2VydmljZXMgPSAoKEltcG9ydClpbXBvcnRzLm5leHQoKSkuZ2V0RGVmaW5pdGlvbigpLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAvLyAgICAgIHdoaWxlKGltcHNlcnZpY2VzLmhhc05leHQoKSkKLSAgICAvLyAgICAgIHsKLSAgICAvLyAgICAgICAgSXRlcmF0b3IgaW1wcG9ydHMgPSAoKFNlcnZpY2UpaW1wc2VydmljZXMubmV4dCgpKS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgLy8gICAgICAgIHdoaWxlKGltcHBvcnRzLmhhc05leHQoKSkKLSAgICAvLyAgICAgICAgewotICAgIC8vICAgICAgICAgIFBvcnQgdGVtcFAgPSAoUG9ydClpbXBwb3J0cy5uZXh0KCk7Ci0gICAgLy8gICAgICAgICAgYWxsUG9ydHMucHV0KHRlbXBQLmdldE5hbWUoKSx0ZW1wUCk7CQotICAgIC8vICAgICAgICB9Ci0gICAgLy8gICAgICB9Ci0gICAgLy8gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU2VydmljZSBzID0gKFNlcnZpY2Upc2VydmljZXNbaV07Ci0gICAgICBwYXJlbnRzLmFkZCgwLCBzKTsKLSAgICAgIE9iamVjdCBwb3J0c1tdID0gcy5nZXRQb3J0cygpLnZhbHVlcygpLnRvQXJyYXkoKTsKLSAgICAgIEhhc2hTZXQgcG9ydElucHV0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICBIYXNoU2V0IHBvcnRPdXRwdXRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcG9ydHMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcCA9IChQb3J0KXBvcnRzW2pdOwotICAgICAgICBwYXJlbnRzLmFkZCgwLCBwKTsKLSAgICAgICAgLy8gYSBQb3J0IG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgV0RTTCBkb2N1bWVudAotICAgICAgICBpZiAoYWxsUG9ydHMuY29udGFpbnMocC5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfUE9SVF9OQU1FX05PVF9VTklRVUUsIFFVT1RFICsgcC5nZXROYW1lKCkgKyBRVU9URSksIHApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFsbFBvcnRzLnB1dChwLmdldE5hbWUoKSwgcCk7Ci0KLSAgICAgICAgICAvLyBnZXQgdGhlIGJpbmRpbmcgZm9yIHRoaXMgcG9ydCBhbmQgc2VlIGlmIHRoZSBQb3J0VHlwZSBmb3IgdGhlIGJpbmRpbmcKLSAgICAgICAgICAvLyBpcyBkZWZpbmVkCi0gICAgICAgICAgaWYgKHAuZ2V0QmluZGluZygpID09IG51bGwgfHwgcC5nZXRCaW5kaW5nKCkuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ05hbWUgPSBFTVBUWV9TVFJJTkc7Ci0gICAgICAgICAgICBpZiAocC5nZXRCaW5kaW5nKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmluZGluZ05hbWUgPSBwLmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX05PX0JJTkRJTkdfRk9SX1BPUlQsIFFVT1RFICsgcC5nZXROYW1lKCkgKyBRVU9URSwgUVVPVEUgKyBiaW5kaW5nTmFtZSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgcCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBDaGVjayB0aGF0IHRoZSBvdXRwdXQgb2Ygb25lIHBvcnQgaXNuJ3QgdGhlIGlucHV0IG9mIGFub3RoZXIgYW5kIHZpY2UgdmVyc2EKLSAgICAgICAgICAgIC8vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgdGhlIHBvcnQKLSAgICAgICAgICAgIC8vIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBhbmQgbXVzdCBiZSBvbmUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGRlZmluZWQgZm9yIGEgcG9ydAotICAgICAgICAgICAgTGlzdCBleHRlbGVtcyA9IHAuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoZXh0ZWxlbXMuc2l6ZSgpIDwgMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfTk9fQUREUkVTU19QT1JULCBRVU9URSArIHAuZ2V0TmFtZSgpICsgUVVPVEUpLCBwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVsZW1zLnNpemUoKSA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGsgPSAxOyBrIDwgZXh0ZWxlbXMuc2l6ZSgpOyBrKyspCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX01PUkVfVEhFTl9PTkVfQUREUkVTU19QT1JULCBRVU9URSArIHAuZ2V0TmFtZSgpICsgUVVPVEUpLAotICAgICAgICAgICAgICAgICAgZXh0ZWxlbXMuZ2V0KGspKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgcC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICB9Ci0gICAgICAvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvciB0aGUgc2VydmljZQotICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRoYXQgdGhlIGJpbmRpbmdzIHJlZmVyIHRvIHZhbGlkIFBvcnRUeXBlcyBhbmQgYWxsIG9mIHRoZSBvcGVyYXRpb25zCi0gIC8vIGluIGEgZ2l2ZW4gYmluZGluZyByZWZlciB0byBhIGRlZmluZWQgb3BlcmF0aW9uIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZwotICAvLyBQb3J0VHlwZS4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCaW5kaW5ncyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgaWYgKHdzZGxEZWZpbml0aW9uLmdldEJpbmRpbmdzKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBPYmplY3QgYmluZGluZ3NbXSA9IHdzZGxEZWZpbml0aW9uLmdldEJpbmRpbmdzKCkudmFsdWVzKCkudG9BcnJheSgpOwotICAgIExpc3QgcGFyZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwYXJlbnRzLmFkZCh3c2RsRGVmaW5pdGlvbik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGIgPSAoQmluZGluZyliaW5kaW5nc1tpXTsKLSAgICAgIHBhcmVudHMuYWRkKDAsIGIpOwotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiLmdldFBvcnRUeXBlKCk7Ci0KLSAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIC8vIHRoZSBQb3J0VHlwZSBpcyBub3QgZGVmaW5lZCBzbyBkb24ndCBib3RoZXIgY2hlY2tpbmcgdGhlIG9wZXJhdGlvbnMKLSAgICAgIGlmIChwb3J0VHlwZS5pc1VuZGVmaW5lZCgpKQotICAgICAgewotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgX1BPUlRUWVBFX1VOREVGSU5FRF9GT1JfQklORElORywKLSAgICAgICAgICAgIFFVT1RFICsgcG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFLAotICAgICAgICAgICAgUVVPVEUgKyBiLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksCi0gICAgICAgICAgYik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIHRoZSBQb3J0VHlwZSBpcyBkZWZpbmVkIHNvIG5vdyB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQKLSAgICAgICAgT2JqZWN0IGJpbmRpbmdPcGVyYXRpb25zW10gPSBiLmdldEJpbmRpbmdPcGVyYXRpb25zKCkudG9BcnJheSgpOwotCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBvcGVyYXRpb24gaXMgZGVmaW5lZCBmb3IgZWFjaCBCaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYmluZGluZ09wZXJhdGlvbnMubGVuZ3RoOyBrKyspCi0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvID0gKEJpbmRpbmdPcGVyYXRpb24pYmluZGluZ09wZXJhdGlvbnNba107Ci0gICAgICAgICAgcGFyZW50cy5hZGQoMCwgYm8pOwotICAgICAgICAgIGlmIChiby5nZXRPcGVyYXRpb24oKSA9PSBudWxsIHx8IGJvLmdldE9wZXJhdGlvbigpLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgX09QRVJBVElPTl9VTkRFRklORURfRk9SX1BPUlRUWVBFLAotICAgICAgICAgICAgICAgIFFVT1RFICsgYi5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUsCi0gICAgICAgICAgICAgICAgUVVPVEUgKyBwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICAgICAgICBibyk7Ci0gICAgICAgICAgICAvLyBuaWNlIGlkZWEgdG8gYWRkIHN1Z2dlc3Rpb25zIHRvIG90aGVyIGVsZW1lbnRzIHRvIGZpeCB0aGUgZXJyb3IKLSAgICAgICAgICAgIC8vIGJ1dCBpdCBkb2Vzbid0IHdvcmsgd2l0aCBtdWx0aXBlIGZpbGVzIGxpa2UgdGhpcwotICAgICAgICAgICAgLy9hZGRWYWxpZGF0aW9uTWVzc2FnZSh3YXJuaW5nTGlzdCxwb3J0VHlwZSxwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgIkRlZmluZSBhbiBvcGVyYXRpb24gaGVyZSB0byBjb3JyZXNwb25kIHdpdGggdGhlIG9wZXJhdGlvbiBpbjogIiArIGJvLmdldE5hbWUoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiBhbGwgdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgb3BlcmF0aW9uLCBiaW5kaW5nIGlucHV0cywgb3V0cHV0cyBhbmQgZmF1bHRzCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEJpbmRpbmdJbnB1dCBiaW5wdXQgPSBiby5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChiaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFyZW50cy5hZGQoMCwgYmlucHV0KTsKLSAgICAgICAgICAgICAgLy8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgYmluZGluZyBvcGVyYXRpb24gaW5wdXQKLSAgICAgICAgICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QoCi0gICAgICAgICAgICAgICAgcGFyZW50cywKLSAgICAgICAgICAgICAgICBiby5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICB2YWxJbmZvKTsKLSAgICAgICAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCaW5kaW5nT3V0cHV0IGJvdXRwdXQgPSBiby5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICAgICAgICBpZiAoYm91dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJlbnRzLmFkZCgwLCBib3V0cHV0KTsKLSAgICAgICAgICAgICAgLy8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgYmluZGluZyBvcGVyYXRpb24gb3V0cHV0Ci0gICAgICAgICAgICAgIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KAotICAgICAgICAgICAgICAgIHBhcmVudHMsCi0gICAgICAgICAgICAgICAgYm8uZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLAotICAgICAgICAgICAgICAgIHZhbEluZm8pOwotICAgICAgICAgICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG5vIGlucHV0IG9yIG91dHB1dCBoYXMgYmVlbiBkZWZpbmVkIGZvciB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgICBpZiAoYmlucHV0ID09IG51bGwgJiYgYm91dHB1dCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9PUEVSQVRJT05fTk9fSU5QVVRfT1JfT1VUUFVULCBRVU9URSArIGJvLmdldE5hbWUoKSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICBibyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvciBlYWNoIGJpbmRpbmcgb3BlcmF0aW9uIGZhdWx0Ci0gICAgICAgICAgICBJdGVyYXRvciBmYXVsdHMgPSBiby5nZXRCaW5kaW5nRmF1bHRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChmYXVsdHMuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBCaW5kaW5nRmF1bHQgYmYgPSAoQmluZGluZ0ZhdWx0KWZhdWx0cy5uZXh0KCk7Ci0gICAgICAgICAgICAgIHBhcmVudHMuYWRkKDAsIGJmKTsKLSAgICAgICAgICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgYmYuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHZhbEluZm8pOwotICAgICAgICAgICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgYmluZGluZyBvcGVyYXRpb24KLSAgICAgICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdChwYXJlbnRzLCBiby5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIHRoZSBiaW5kaW5nCi0gICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdChwYXJlbnRzLCBiLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB2YWxJbmZvKTsKLSAgICAgIHBhcmVudHMucmVtb3ZlKDApOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgYWxsIG9mIHRoZSBQb3J0VHlwZXMgaGF2ZSB2YWxpZCBtZXNzYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlaXIKLSAgLy8gb3BlcmF0aW9uIGlucHV0LCBvdXRwdXQgYW5kIGZhdWx0IHR5cGVzLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBvcnRUeXBlcyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgaWYgKHdzZGxEZWZpbml0aW9uLmdldFBvcnRUeXBlcygpID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgT2JqZWN0IHBvcnR0eXBlc1tdID0gd3NkbERlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCkudmFsdWVzKCkudG9BcnJheSgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0dHlwZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgUG9ydFR5cGUgcCA9IChQb3J0VHlwZSlwb3J0dHlwZXNbaV07Ci0gICAgICBPYmplY3Qgb3BlcmF0aW9uc1tdID0gcC5nZXRPcGVyYXRpb25zKCkudG9BcnJheSgpOwotICAgICAgTGlzdCBpbkFuZE91dE5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBvcGVyYXRpb25zLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gbyA9IChPcGVyYXRpb24pb3BlcmF0aW9uc1tqXTsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBvLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIG1lc3NhZ2VzIGFyZSBkZWZpbmVkIGZvciB0aGUgaW5wdXQsIG91dHB1dCBhbmQgZmF1bHRzCi0gICAgICAgIE1lc3NhZ2UgbTsKLSAgICAgICAgSW5wdXQgaW5wdXQgPSBvLmdldElucHV0KCk7Ci0gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGlucHV0TmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAvLyBpZiB0aGUgbmFtZSBpc24ndCBkZWZpbmVkIGl0IGRlZmF1bHRzIHRvIHRoaXMKLSAgICAgICAgICBpZiAoaW5wdXROYW1lID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXROYW1lID0gby5nZXROYW1lKCkgKyBSRVFVRVNUOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaW5BbmRPdXROYW1lcy5jb250YWlucyhpbnB1dE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIF9JTlBVVF9OQU1FX05PVF9VTklRVUUsCi0gICAgICAgICAgICAgICAgUVVPVEUgKyBpbnB1dE5hbWUgKyBRVU9URSwKLSAgICAgICAgICAgICAgICBRVU9URSArIHAuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgaW5wdXQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5BbmRPdXROYW1lcy5hZGQoaW5wdXROYW1lKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtID0gaW5wdXQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzTmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgICAgIFFOYW1lIG1lc3NRTmFtZSA9IG0uZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChtZXNzUU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVzc05hbWUgPSBtZXNzUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9NRVNTQUdFX1VOREVGSU5FRF9GT1JfSU5QVVQsIFFVT1RFICsgbWVzc05hbWUgKyBRVU9URSksIGlucHV0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgT3V0cHV0IG91dHB1dCA9IG8uZ2V0T3V0cHV0KCk7Ci0gICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvdXRwdXROYW1lID0gb3V0cHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAvLyBpZiB0aGUgbmFtZSBpc24ndCBkZWZpbmVkIGl0IGRlZmF1bHRzIHRvIHRoaXMKLSAgICAgICAgICBpZiAob3V0cHV0TmFtZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dE5hbWUgPSBvLmdldE5hbWUoKSArIFJFU1BPTlNFOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChpbkFuZE91dE5hbWVzLmNvbnRhaW5zKG91dHB1dE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIF9PVVRQVVRfTkFNRV9OT1RfVU5JUVVFLAotICAgICAgICAgICAgICAgIFFVT1RFICsgb3V0cHV0TmFtZSArIFFVT1RFLAotICAgICAgICAgICAgICAgIFFVT1RFICsgcC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICAgICAgICBvdXRwdXQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5BbmRPdXROYW1lcy5hZGQob3V0cHV0TmFtZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbSA9IG91dHB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NOYW1lID0gRU1QVFlfU1RSSU5HOwotICAgICAgICAgICAgUU5hbWUgbWVzc1FOYW1lID0gbS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKG1lc3NRTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtZXNzTmFtZSA9IG1lc3NRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9PVVRQVVQsIFFVT1RFICsgbWVzc05hbWUgKyBRVU9URSksIG91dHB1dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGZhdWx0c1tdID0gby5nZXRGYXVsdHMoKS52YWx1ZXMoKS50b0FycmF5KCk7Ci0KLSAgICAgICAgLy9MaXN0IGZhdWx0TmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZmF1bHRzLmxlbmd0aDsgaysrKQotICAgICAgICB7Ci0gICAgICAgICAgRmF1bHQgZiA9IChGYXVsdClmYXVsdHNba107Ci0gICAgICAgICAgbSA9IGYuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzTmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgICAgIFFOYW1lIG1lc3NRTmFtZSA9IG0uZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChtZXNzUU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVzc05hbWUgPSBtZXNzUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9NRVNTQUdFX1VOREVGSU5FRF9GT1JfRkFVTFQsIFFVT1RFICsgbWVzc05hbWUgKyBRVU9URSksIGYpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IGFsbCB0aGUgbWVzc2FnZXMgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudCBhcmUgdmFsaWQuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb24gVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWVzc2FnZXMoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIGlmICh3c2RsRGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgSXRlcmF0b3IgbWVzc2FnZXMgPSB3c2RsRGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICB3aGlsZSAobWVzc2FnZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE1lc3NhZ2UgbSA9IChNZXNzYWdlKW1lc3NhZ2VzLm5leHQoKTsKLSAgICAgIGlmICghbS5pc1VuZGVmaW5lZCgpKQotICAgICAgewotICAgICAgICAvLyBpZiB0aGUgbWVzc2FnZSBoYXMgYSBwYXJ0IChhbmQgaXQgZG9lc24ndCBoYXZlIHRvKQotICAgICAgICAvLyBlbnN1cmUgZWFjaCBtZXNzYWdlIHBhcnQgaGFzIGVpdGhlciBhbiBlbGVtZW50IG9yIGEgdHlwZQotICAgICAgICBpZiAoIW0uZ2V0UGFydHMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBwYXJ0cyA9IG0uZ2V0UGFydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChwYXJ0cy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgUGFydCBwID0gKFBhcnQpcGFydHMubmV4dCgpOwotICAgICAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPSBwLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICBRTmFtZSB0eXBlTmFtZSA9IHAuZ2V0VHlwZU5hbWUoKTsKLSAgICAgICAgICAgIE1hcCBleHRBdHRzID0gcC5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAvLyBUT0RPOlRoaXMgd2lsbCBoYXZlIHRvIGJlIGV4dGVuZGVkIGFzIHBhcnRzIGNhbiBoYXZlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgICAgICAgIC8vZW5zdXJlIHRoZSBwYXJ0IGhhcyBhIHR5cGUgb3IgYW4gZWxlbWVudCBkZWZpbmVkCi0gICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUgPT0gbnVsbCAmJiB0eXBlTmFtZSA9PSBudWxsICYmIChleHRBdHRzID09IG51bGwgfHwgZXh0QXR0cy5pc0VtcHR5KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9QQVJUX05PX0VMRU1FTlRfT1JfVFlQRSwgUVVPVEUgKyBwLmdldE5hbWUoKSArIFFVT1RFKSwgcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2hlcmUgdGhlIHBhcnQgaGFzIGJvdGggdGhlIGVsZW1lbnQgYW5kIHR5cGUgZGVmaW5lZCBhbmQgaXQgY2FuIG9ubHkgaGF2ZSBvbmUgZGVmaW5lZAkKLSAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnROYW1lICE9IG51bGwgJiYgdHlwZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfUEFSVF9CT1RIX0VMRU1FTlRfQU5EX1RZUEUsIFFVT1RFICsgcC5nZXROYW1lKCkgKyBRVU9URSksIHApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudE5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFjaGVja1BhcnRDb25zdGl0dWVudChlbGVtZW50TmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICBlbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICBFTEVNRU5ULAotICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgdmFsSW5mbykpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIF9QQVJUX0lOVkFMSURfRUxFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgUVVPVEUgKyBwLmdldE5hbWUoKSArIFFVT1RFLAotICAgICAgICAgICAgICAgICAgICBRVU9URSArIGVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICAgICAgICAgICAgcCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIHR5cGUgaXRzZWxmIGlzIGRlZmluZWQgcHJvcGVybHkKLSAgICAgICAgICAgICAgaWYgKCFjaGVja1BhcnRDb25zdGl0dWVudCh0eXBlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgdHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCksIFRZUEUsIHAsIHZhbEluZm8pKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBfUEFSVF9JTlZBTElEX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIFFVT1RFICsgcC5nZXROYW1lKCkgKyBRVU9URSwKLSAgICAgICAgICAgICAgICAgICAgUVVPVEUgKyB0eXBlTmFtZS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICAgIHApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBuYW1lIGlzIGRlZmluZWQgaW4gdGhlIG5hbWVzcGFjZSBmb3IgdGhlIHBhcnQuICBBIHBhcnQgaXMgYW4KLSAgICogRUxFTUVOVCBvciBhIFRZUEUuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdG8gY2hlY2suCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGNoZWNrLgotICAgKiBAcGFyYW0gcGFydCBUaGUgcGFydCB0byBjaGVjaywgZWl0aGVyIEVMRU1FTlQgb3IgVFlQRS4KLSAgICogQHBhcmFtIHBhcnRPYmplY3QgVGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHBhcnQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGFydCBlbGVtZW50IG9mIHR5cGUgaXMgZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tQYXJ0Q29uc3RpdHVlbnQoCi0gICAgU3RyaW5nIG5hbWVzcGFjZSwKLSAgICBTdHJpbmcgbmFtZSwKLSAgICBpbnQgcGFydCwKLSAgICBQYXJ0IHBhcnRPYmplY3QsCi0gICAgV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotCi0gICAgYm9vbGVhbiBwYXJ0dmFsaWQgPSBmYWxzZTsKLSAgICAvLyBGaXJzdCB0YWtlIGNhcmUgb2YgdGhlIHNpdHVhdGlvbiB3aGVyZSBpdCdzIGZyb20gdGhlIHNjaGVtYSBuYW1lc3BhY2UuCi0gICAgLy8gVGhlIDE5OTksIDIwMDAgYW5kIDIwMDEgc2NoZW1hIG5hbWVzcGFjZXMgYXJlIGFsbCBhY2NlcHRlZC4KLSAgICBpZiAobmFtZXNwYWNlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxKQotICAgICAgfHwgbmFtZXNwYWNlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KQotICAgICAgfHwgbmFtZXNwYWNlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAwKSkKLSAgICB7Ci0gICAgICBTY2hlbWFBdHRyaWJ1dGVUYWJsZSB4c2RUYWJsZSA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVUYWJsZSgpOwotICAgICAgaWYgKHhzZFRhYmxlLmNvbnRhaW5zU3ltYm9sKG5hbWUpKQotICAgICAgewotICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICAvLyBjaGVjayBpbmxpbmUgYW5kIGltcG9ydGVkIHNjaGVtYQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBYU01vZGVsW10gc2NoZW1hcyA9IHZhbEluZm8uZ2V0U2NoZW1hcygpOwotICAgICAgaW50IG51bVNjaGVtYXMgPSBzY2hlbWFzLmxlbmd0aDsKLSAgICAgIC8vSXRlcmF0b3Igc2NoZW1hc0l0ZXIgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNjaGVtYXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgWFNNb2RlbCBzY2hlbWEgPSBzY2hlbWFzW2ldOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocGFydCA9PSBFTEVNRU5UICYmIHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb24obmFtZSwgbmFtZXNwYWNlKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcnR2YWxpZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAocGFydCA9PSBUWVBFICYmIHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbihuYW1lLCBuYW1lc3BhY2UpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFydHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBJZiB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UgaGFzbid0IGJlZW4gZXhwbGljaXRseSBpbXBvcnRlZCBkbyBzbwotCS8vIG5vdy4KLSAgICAvLyBBbGxvdyB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UgdG8gYmUgYXV0b21hdGljYWxseSBpbXBvcnRlZCBidXQgbWFyawotCS8vIGl0IGFzIGEgd2FybmluZy4KLSAgICBpZiAoIXBhcnR2YWxpZCAmJiBuYW1lc3BhY2UuZXF1YWxzKFNPQVBfRU5DT0RJTkdfVVJJKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgWFNEVmFsaWRhdG9yIHhzZFZhbCA9IG5ldyBYU0RWYWxpZGF0b3IoKTsKLSAgICAgICAgU3RyaW5nIHNvYXBFbmMgPSB2YWxJbmZvLmdldFVSSVJlc29sdmVyKCkucmVzb2x2ZShudWxsLCBTT0FQX0VOQ09ESU5HX1VSSSwgbnVsbCk7Ci0gICAgICAgIGlmKHNvYXBFbmMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHhzZFZhbC52YWxpZGF0ZShzb2FwRW5jLCBudWxsKTsKLSAgICAgICAgICAvLyBzYW5pdHkgY2hlY2sgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZwotICAgICAgICAgIGlmICh4c2RWYWwuaXNWYWxpZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTTW9kZWwgeHNNb2RlbCA9IHhzZFZhbC5nZXRYU01vZGVsKCk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJ0ID09IEVMRU1FTlQgJiYgeHNNb2RlbC5nZXRFbGVtZW50RGVjbGFyYXRpb24obmFtZSwgbmFtZXNwYWNlKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFydCA9PSBUWVBFICYmIHhzTW9kZWwuZ2V0VHlwZURlZmluaXRpb24obmFtZSwgbmFtZXNwYWNlKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsSW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX1NPQVBFTkNfSU1QT1JURURfUEFSVCwgUVVPVEUgKyBuYW1lICsgUVVPVEUpLCBwYXJ0T2JqZWN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy9UT0RPOiBsb2cgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwYXJ0dmFsaWQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExVmFsaWRhdGlvbkluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGY1NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExVmFsaWRhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHZlcjsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIFdTREwgMS4xIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uIFVzZXMgYW4gZXhpc3RpbmcKLSAqIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8gc2V0IGFuZCByZXRyaWV2ZQotICogc2NoZW1hcyBhbmQgY29udmVuaWVuY2UgbWV0aG9kcyBmb3Igc2V0dGluZyBlcnJvcnMgd2l0aCBvYmplY3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTREwxMVZhbGlkYXRpb25JbmZvCi17Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgb2YgdGhlIGZpbGUgYmVpbmcgdmFsaWRhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgVVJJIG9mIHRoZSBmaWxlIGJlaW5nIHZhbGlkYXRlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpOwotICAKLSAgLyoqCi0gICAqIEFkZCBhIHNjaGVtYSB0byB0aGUgbGlzdCBvZiBzY2hlbWFzIGF2YWlsYWJsZSBmb3IgdGhpcyBXU0RMIGRvY3VtZW50LgotICAgKiAKLSAgICogQHBhcmFtIHhzTW9kZWwgVGhlIHNjaGVtYSB0byBhZGQgdG8gdGhlIGxpc3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTY2hlbWEoWFNNb2RlbCB4c01vZGVsKTsKLSAgCi0gIC8qKgotICAgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIHRoZSBzY2hlbWFzIGF2YWlsYWJsZSBmb3IgdGhpcyBXU0RMIGRvY3VtZW50LgotICAgKiAKLSAgICogQHJldHVybiBBbiBhcnJheSBvZiBhbGwgdGhlIHNjaGVtYXMgYXZhaWxhYmxlIGZvciB0aGlzIFdTREwgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgWFNNb2RlbFtdIGdldFNjaGVtYXMoKTsKLSAgCi0gIC8qKgotICAgKiBDbGVhciBhbGwgdGhlIHN0b3JlZCBzY2hlbWFzLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXJTY2hlbWFzKCk7Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBlbGVtZW50IGxvY2F0aW9ucyBoYXNodGFibGUuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudExvY2F0aW9ucyBUaGUgaGFzaHRhYmxlIHRvIHNldCB3aXRoIHRoZSBlbGVtZW50IGxvY2F0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRMb2NhdGlvbnMoSGFzaHRhYmxlIGVsZW1lbnRMb2NhdGlvbnMpOwotICAKLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCBlcnJvciBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciB0byBhZGQuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBvYmplY3QgdG8gYWRkIHRoZSBlcnJvciBmb3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGVsZW1lbnQpOwotICAKLSAgLyoqCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlIGF0IHRoZSBnaXZlbiBsaW5lIGFuZCBjb2x1bW4uCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBlcnJvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSk7Ci0gIAotICAvKioKLSAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBleHRlbnNpYmx5IHZhbGlkYXRvcnMgdG8gYWRkIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgd2FybmluZyB0byBhZGQuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBvYmplY3QgdG8gYWRkIHRoZSB3YXJuaW5nIGZvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBlbGVtZW50KTsKLSAgCi0gIC8qKgotICAgKiBBZGQgYSB3YXJuaW5nIG1lc3NhZ2UgYXQgdGhlIGdpdmVuIGxpbmUgYW5kIGNvbHVtbi4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSB3YXJuaW5nIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHdhcm5pbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSk7Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBVUkkgcmVzb2x2ZXIgaW4gdXNlIGZvciB0aGlzIHZhbGlkYXRpb24uIFRoZSBVUkkgcmVzb2x2ZXIKLSAgICogcmV0dXJuZWQgaXMgYWN0dWFsbHkgYSBVUkkgcmVzb2x2ZXIgaGFuZGxlciB0aGF0IHdpbGwgCi0gICAqIGl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHJlZ2lzdGVyZWQgVVJJIHJlc29sdmVycy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSByZXNvbHZlciBoYW5kbGVyLgotICAgKi8KLSAgcHVibGljIElVUklSZXNvbHZlciBnZXRVUklSZXNvbHZlcigpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0aW9uSW5mb0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRpb25JbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzlhZjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRpb25JbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHZlcjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbmF0aW9uIG9mIFdTREwxMVZhbGlkYXRpb25JbmZvLgotICovCi1wdWJsaWMgY2xhc3MgV1NETDExVmFsaWRhdGlvbkluZm9JbXBsIGltcGxlbWVudHMgV1NETDExVmFsaWRhdGlvbkluZm8KLXsKLSAgcHJpdmF0ZSBWYWxpZGF0aW9uSW5mbyB2YWxpbmZvID0gbnVsbDsKLSAgcHJpdmF0ZSBIYXNodGFibGUgZWxlbWVudGxvY2F0aW9ucyA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdCBzY2hlbWFzID0gbmV3IFZlY3RvcigpOwotICAKLSAgcHVibGljIFdTREwxMVZhbGlkYXRpb25JbmZvSW1wbChWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICB7Ci0gICAgdGhpcy52YWxpbmZvID0gdmFsaW5mbzsKLSAgfQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbyNnZXRGaWxlVVJJKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gdmFsaW5mby5nZXRGaWxlVVJJKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGRTY2hlbWEob3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFNjaGVtYShYU01vZGVsIHhzTW9kZWwpCi0gIHsKLSAgICBpZiAoeHNNb2RlbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHNjaGVtYXMuYWRkKHhzTW9kZWwpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETDExVmFsaWRhdGlvbkluZm8jZ2V0U2NoZW1hcygpCi0gICAqLwotICBwdWJsaWMgWFNNb2RlbFtdIGdldFNjaGVtYXMoKQotICB7Ci0gICAgcmV0dXJuIChYU01vZGVsW10pc2NoZW1hcy50b0FycmF5KG5ldyBYU01vZGVsW3NjaGVtYXMuc2l6ZSgpXSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2RsMTEuV1NETDExVmFsaWRhdGlvbkluZm8jY2xlYXJkU2NoZW1hcygpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhclNjaGVtYXMoKQotICB7Ci0gICAgc2NoZW1hcy5jbGVhcigpOwotICB9Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvI3NldEVsZW1lbnRMb2NhdGlvbnMoamF2YS51dGlsLkhhc2h0YWJsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRMb2NhdGlvbnMoSGFzaHRhYmxlIGVsZW1lbnRMb2NhdGlvbnMpCi0gIHsKLSAgICB0aGlzLmVsZW1lbnRsb2NhdGlvbnMgPSBlbGVtZW50TG9jYXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETDExVmFsaWRhdGlvbkluZm8jYWRkRXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZWxlbWVudCkKLSAgewotICAgIExvY2F0aW9uSG9sZGVyIGxvY2F0aW9uOwotICAgIGlmIChlbGVtZW50bG9jYXRpb25zLmNvbnRhaW5zS2V5KGVsZW1lbnQpKQotICAgIHsKLSAgICAgIGxvY2F0aW9uID0gKExvY2F0aW9uSG9sZGVyKWVsZW1lbnRsb2NhdGlvbnMuZ2V0KGVsZW1lbnQpOwotICAgICAgYWRkRXJyb3IobWVzc2FnZSwgbG9jYXRpb24uZ2V0TGluZSgpLCBsb2NhdGlvbi5nZXRDb2x1bW4oKSwgbG9jYXRpb24uZ2V0VVJJKCkpOwotICAgIH0KLSAgICAvLyBpZiB3ZSBnaXZlIGl0IGFuIGVsZW1lbnQgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkIHdlJ2xsIHNldCB0aGUgbG9jYXRpb24KLSAgICAvLyBhdCAoMCwwKSBzbyB0aGUgZXJyb3Igc2hvd3MgdXAgYnV0IG5vIGxpbmUgbWFya2VyIGluIHRoZSBlZGl0b3IKLSAgICBlbHNlCi0gICAgewotICAgICAgYWRkRXJyb3IobWVzc2FnZSwgMCwgMSwgZ2V0RmlsZVVSSSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGRXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZWxlbWVudCkKLSAgewotICAgIExvY2F0aW9uSG9sZGVyIGxvY2F0aW9uOwotICAgIGlmIChlbGVtZW50bG9jYXRpb25zLmNvbnRhaW5zS2V5KGVsZW1lbnQpKQotICAgIHsKLSAgICAgIGxvY2F0aW9uID0gKExvY2F0aW9uSG9sZGVyKWVsZW1lbnRsb2NhdGlvbnMuZ2V0KGVsZW1lbnQpOwotICAgICAgYWRkV2FybmluZyhtZXNzYWdlLCBsb2NhdGlvbi5nZXRMaW5lKCksIGxvY2F0aW9uLmdldENvbHVtbigpLCBsb2NhdGlvbi5nZXRVUkkoKSk7Ci0gICAgfQotICAgIC8vIGlmIHdlIGdpdmUgaXQgYW4gZWxlbWVudCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQgd2UnbGwgc2V0IHRoZSBsb2NhdGlvbgotICAgIC8vIGF0ICgwLDApIHNvIHRoZSBlcnJvciBzaG93cyB1cCBidXQgbm8gbGluZSBtYXJrZXIgaW4gdGhlIGVkaXRvcgotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhZGRXYXJuaW5nKG1lc3NhZ2UsIDAsIDEsIGdldEZpbGVVUkkoKSk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGROYW1lc3BhY2VXaXRoTm9WYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0vLyAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlV2l0aE5vVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UpCi0vLyAgewotLy8gICAgdmFsaW5mby5hZGROYW1lc3BhY2VXaXRoTm9WYWxpZGF0b3IobmFtZXNwYWNlKTsKLS8vCi0vLyAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvI2FkZEVycm9yKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgdmFsaW5mby5hZGRFcnJvcihtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGRXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICB2YWxpbmZvLmFkZFdhcm5pbmcobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvI2dldFVSSVJlc29sdmVyKCkKLSAgICovCi0gIHB1YmxpYyBJVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKSAKLSAgewotCXJldHVybiB2YWxpbmZvLmdldFVSSVJlc29sdmVyKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJiZjVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JV1NETFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uLlZhbGlkYXRlV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogVGhlIHZhbGlkYXRvciBjb250cm9sbGVyIGlzIHRoZSBoZWFkIG9mIHZhbGlkYXRpb24uIAotICovCi1wdWJsaWMgY2xhc3MgV1NETDExVmFsaWRhdG9yQ29udHJvbGxlciBpbXBsZW1lbnRzIElXU0RMVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgX1dBUk5fTk9fVkFMRElBVE9SID0gIl9XQVJOX05PX1ZBTERJQVRPUiI7Ci0vLyAgcHJvdGVjdGVkIGZpbmFsIGludCBFUlJPUl9NRVNTQUdFID0gMDsKLS8vICBwcm90ZWN0ZWQgZmluYWwgaW50IFdBUk5JTkdfTUVTU0FHRSA9IDE7Ci0vLyAgcHJvdGVjdGVkIFN0cmluZyBmaWxlVVJJOwotLy8gIHByb3RlY3RlZCBMaXN0IHNjaGVtYXMgPSBuZXcgVmVjdG9yKCk7Ci0vLyAgcHJvdGVjdGVkIERlZmluaXRpb24gd3NkbERlZmluaXRpb247Ci0gIHByb3RlY3RlZCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3IgPSBudWxsOwotICAvL3Byb3RlY3RlZCBWYWxpZGF0aW9uQ29udHJvbGxlciB2YWxpZGF0aW9uQ29udHJvbGxlcjsKLSAgcHJvdGVjdGVkIFZhbGlkYXRvclJlZ2lzdHJ5IHZlciA9IFZhbGlkYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIoKQotICB7Ci0gIH0KLQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLklXU0RMVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy53M2MuZG9tLkRvY3VtZW50LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLlZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoRG9jdW1lbnQgZG9tTW9kZWwsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pIHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb24KLSAgewotICAgIC8vIHJlc2V0IHRoZSB2YXJpYWJsZXMKLS8vICAgIHJlc2V0KCk7Ci0vLyAgICBmaWxlVVJJID0gdmFsSW5mby5nZXRGaWxlVVJJKCk7Ci0gICAgLy90aGlzLnZhbGlkYXRpb25Db250cm9sbGVyID0gdmFsaWRhdGlvbmNvbnRyb2xsZXI7Ci0KLSAgICBXU0RMMTFWYWxpZGF0aW9uSW5mbyB3c2RsdmFsaW5mbyA9IG5ldyBXU0RMMTFWYWxpZGF0aW9uSW5mb0ltcGwodmFsSW5mbyk7Ci0gICAgV1NETERvY3VtZW50W10gd3NkbERvY3MgPSByZWFkV1NETERvY3VtZW50KGRvbU1vZGVsLCB2YWxJbmZvLmdldEZpbGVVUkkoKSwgZ2V0TWVzc2FnZUdlbmVyYXRvcigpLCB3c2RsdmFsaW5mbyk7Ci0gICAgLy8gRG9uJ3QgdmFsaWRhdGUgYW4gbnVsbCBkZWZpbml0aW9ucyBlbGVtZW50LiBFaXRoZXIgdGhlIGZpbGUgaXMgZW10cHkgYW5kIHZhbGlkIG9yCi0gICAgLy8gaGFkIGFuIGVycm9yIHdoZW4gcmVhZGluZy4KLSAgICBpZih3c2RsRG9jcyAhPSBudWxsKQotICAgIHsgIAotICAgICAgaW50IG51bVdTRExEb2NzID0gd3NkbERvY3MubGVuZ3RoOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bVdTRExEb2NzOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCB0ZW1wRG9jID0gd3NkbERvY3NbaV07Ci0gICAgICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSB0ZW1wRG9jLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIHNjaGVtYXMuCi0gICAgICAgIExpc3QgeHNkTGlzdCA9IHRlbXBEb2MuZ2V0U2NoZW1hcygpOwotICAgICAgICBJdGVyYXRvciB4c2RJdGVyID0geHNkTGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoeHNkSXRlci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2RsdmFsaW5mby5hZGRTY2hlbWEoKFhTTW9kZWwpeHNkSXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNldCB0aGUgZWxlbWVudCBsb2NhdGlvbnMgdGFibGUuCi0gICAgICAgIHdzZGx2YWxpbmZvLnNldEVsZW1lbnRMb2NhdGlvbnModGVtcERvYy5nZXRFbGVtZW50TG9jYXRpb25zKCkpOwotICAgICAgICAvLyBTZXQgYW55IHJlYWRlciBlcnJvcnMuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciB0aGUgZWxlbWVudCBsb2NhdGlvbnMgdGFibGUgaXMgc2V0LgotICAgICAgICBMaXN0IHJlYWRlckVycm9ycyA9IHRlbXBEb2MuZ2V0UmVhZGVyRXJyb3JzKCk7Ci0gICAgICAgIGlmIChyZWFkZXJFcnJvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIHJlYWRlckVycm9yc0kgPSByZWFkZXJFcnJvcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAocmVhZGVyRXJyb3JzSS5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgUmVhZGVyRXJyb3IgcmUgPSAoUmVhZGVyRXJyb3IpcmVhZGVyRXJyb3JzSS5uZXh0KCk7Ci0gICAgICAgICAgICB3c2RsdmFsaW5mby5hZGRFcnJvcihyZS5nZXRFcnJvcigpLCByZS5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExpc3QgcmVhZGVyV2FybmluZ3MgPSB0ZW1wRG9jLmdldFJlYWRlcldhcm5pbmdzKCk7Ci0gICAgICAgIGlmIChyZWFkZXJXYXJuaW5ncyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSXRlcmF0b3IgcmVhZGVyV2FybmluZ3NJID0gcmVhZGVyV2FybmluZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAocmVhZGVyV2FybmluZ3NJLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBSZWFkZXJFcnJvciByZSA9IChSZWFkZXJFcnJvcilyZWFkZXJXYXJuaW5nc0kubmV4dCgpOwotICAgICAgICAgICAgd3NkbHZhbGluZm8uYWRkV2FybmluZyhyZS5nZXRFcnJvcigpLCByZS5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHZhbGlkYXRlV1NETEVsZW1lbnQoQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCB3c2RsRGVmaW5pdGlvbiwgbmV3IFZlY3RvcigpLCB3c2RsdmFsaW5mbyk7Ci0gICAgICAgIHdzZGx2YWxpbmZvLmNsZWFyU2NoZW1hcygpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIGFuIGltcG9ydGVkIFdTREwgZG9jdW1lbnQuIEFsbG93cyB0aGUgY2FsbGluZyBjbGFzcyB0byBoYXZlIGFjY2VzcyB0byB0aGUgaW50ZXJuYWwKLSAgICogY29tcG9uZW50cyBvZiB0aGUgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsdmFsaW5mbyBUaGUgV1NETCAxLjEgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byB1c2UuCi0gICAqIEByZXR1cm4gVGhlIGRlZmluaXRpb25zIGVsZW1lbnQgZm9yIHRoZSBpbXBvcnQuCi0gICAqIEB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uCi0gICAqLwotLy8gIHByb3RlY3RlZCBEZWZpbml0aW9uIHZhbGlkYXRlSW1wb3J0KFdTREwxMVZhbGlkYXRpb25JbmZvIHdzZGx2YWxpbmZvKQotLy8gIHsKLS8vICAgIFdTRExEb2N1bWVudFtdIHdzZGxEb2NzID0gbnVsbDsKLS8vICAgIHRyeQotLy8gICAgewotLy8gICAgICB3c2RsRG9jcyA9IHJlYWRXU0RMRG9jdW1lbnQobnVsbCwgd3NkbHZhbGluZm8uZ2V0RmlsZVVSSSgpLCBnZXRNZXNzYWdlR2VuZXJhdG9yKCksIHdzZGx2YWxpbmZvKTsKLS8vICAgIH0KLS8vICAgIGNhdGNoKFZhbGlkYXRlV1NETEV4Y2VwdGlvbiBlKQotLy8gICAgewotLy8gICAgICAvLyBzdXByZXNzIGFueSB2YWxpZGF0aW9uIGlzc3VlcyB3aXRoIGltcG9ydGVkIGRvY3VtZW50cwotLy8gICAgfQotLy8gICAgLy8gRG9uJ3QgdmFsaWRhdGUgYW4gbnVsbCBkZWZpbml0aW9ucyBlbGVtZW50LiBFaXRoZXIgdGhlIGZpbGUgaXMgZW10cHkgYW5kIHZhbGlkIG9yCi0vLyAgICAvLyBoYWQgYW4gZXJyb3Igd2hlbiByZWFkaW5nLgotLy8gICAgaWYod3NkbERvY3MgIT0gbnVsbCkKLS8vICAgICB7ICAKLS8vICAgICAgdmFsaWRhdGVXU0RMRWxlbWVudChDb25zdGFudHMuTlNfVVJJX1dTREwsIHdzZGxEZWZpbml0aW9uLCBuZXcgVmVjdG9yKCksIHdzZGx2YWxpbmZvKTsKLS8vICAgIH0KLS8vICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbjsKLS8vICB9Ci0gIAotICAvKioKLSAgICogUmVhZCBpbiB0aGUgV1NETCBkb2N1bWVudCBhbmQgc2V0IHRoZSBtb2RlbCBhbmQgaW1wb3J0ZWQgc2NoZW1hcy4KLSAgICogCi0gICAqIEBwYXJhbSBkb21Nb2RlbCBBIERPTSBtb2RlbCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgcmVhZC4KLSAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gcmVhZC4KLSAgICogQHBhcmFtIG1lc3NhZ2VnZW5lcmF0b3IgVGhlIG1lc3NhZ2VnZW5lcmF0b3IgdGhlIHJlYWRlciBzaG91bGQgdXNlIGZvciBhbnkgbWVzc2FnZXMgcHJvZHVjZWQuCi0gICAqIEBwYXJhbSB3c2RsdmFsaW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICogQHJldHVybiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudCBmb3IgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETERvY3VtZW50W10gcmVhZFdTRExEb2N1bWVudChEb2N1bWVudCBkb21Nb2RlbCwgU3RyaW5nIGZpbGUsIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciwgV1NETDExVmFsaWRhdGlvbkluZm8gd3NkbHZhbGluZm8pIHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb24KLSAgewotICAgIFdTRExEb2N1bWVudFtdIHdzZGxEb2NzID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0KLSAgICAgIFdTRExSZWFkZXJJbXBsIHdzZGxSZWFkZXIgPSBuZXcgV1NETFJlYWRlckltcGwod3NkbHZhbGluZm8pOwotICAgICAgd3NkbFJlYWRlci5zZXRNZXNzYWdlR2VuZXJhdG9yKG1lc3NhZ2VnZW5lcmF0b3IpOwotICAgICAgaWYoZG9tTW9kZWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd3NkbERvY3MgPSB3c2RsUmVhZGVyLnJlYWRXU0RMKGZpbGUsIGRvbU1vZGVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgIAotICAgICAgICB3c2RsRG9jcyA9IHdzZGxSZWFkZXIucmVhZFdTREwoZmlsZSk7Ci0gICAgICB9Ci0gICAgICAvL3dzZGx2YWxpbmZvLnNldEVsZW1lbnRMb2NhdGlvbnMod3NkbFJlYWRlci5nZXRFbGVtZW50TG9jYXRpb25zSGFzaHRhYmxlKCkpOwotLy8gICAgICBMaXN0IHJlYWRlckVycm9ycyA9IHdzZGxSZWFkZXIuZ2V0UmVhZGVyRXJyb3JzKCk7Ci0vLyAgICAgIGlmIChyZWFkZXJFcnJvcnMgIT0gbnVsbCkKLS8vICAgICAgIHsKLS8vICAgICAgICBJdGVyYXRvciByZWFkZXJFcnJvcnNJID0gcmVhZGVyRXJyb3JzLml0ZXJhdG9yKCk7Ci0vLyAgICAgICAgd2hpbGUgKHJlYWRlckVycm9yc0kuaGFzTmV4dCgpKQotLy8gICAgICAgICB7Ci0vLyAgICAgICAgICBSZWFkZXJFcnJvciByZSA9IChSZWFkZXJFcnJvcilyZWFkZXJFcnJvcnNJLm5leHQoKTsKLS8vICAgICAgICAgIHdzZGx2YWxpbmZvLmFkZEVycm9yKHJlLmdldEVycm9yKCksIHJlLmdldE9iamVjdCgpKTsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgaWYgKHdzZGxSZWFkZXIuaGFzSW1wb3J0U2NoZW1hcygpKQotLy8gICAgICB7Ci0vLyAgICAgICAgTGlzdCB4c2RMaXN0ID0gd3NkbFJlYWRlci5nZXRJbXBvcnRTY2hlbWFzKCk7Ci0vLyAgICAgICAgSXRlcmF0b3IgeHNkSXRlciA9IHhzZExpc3QuaXRlcmF0b3IoKTsKLS8vICAgICAgICB3aGlsZSAoeHNkSXRlci5oYXNOZXh0KCkpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgd3NkbHZhbGluZm8uYWRkU2NoZW1hKChYU01vZGVsKXhzZEl0ZXIubmV4dCgpKTsKLS8vICAgICAgICB9Ci0vLwotLy8gICAgICB9Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVmFsaWRhdGVXU0RMRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpICsgIiAiICsgZS5nZXRGYXVsdENvZGUoKSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBWYWxpZGF0ZVdTRExFeGNlcHRpb24oInVuYWJsZSB0byByZWFkIGZpbGUiICsgZS5nZXRNZXNzYWdlKCkgKyAiICIgKyBlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICByZXR1cm4gd3NkbERvY3M7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBXU0RMIGVsZW1lbnQsIGNhbGwgVmFsaWRhdGVFbGVtZW50IGZvciBpdC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgZm9yIHRoaXMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlV1NETEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgV1NETDExVmFsaWRhdGlvbkluZm8gd3NkbHZhbGluZm8pCi0gIHsKLSAgICBJV1NETDExVmFsaWRhdG9yIHZhbCA9IHZlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KG5hbWVzcGFjZSk7Ci0gICAgaWYgKHZhbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHZhbC52YWxpZGF0ZShlbGVtZW50LCBwYXJlbnRzLCB3c2RsdmFsaW5mbyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB3c2RsdmFsaW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX05PX1ZBTERJQVRPUiwgbmFtZXNwYWNlKSwgZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHNjaGVtYSB0byB0aGUgbGlzdCBvZiBzY2hlbWFzLgotICAgKiAKLSAgICogQHBhcmFtIHhzTW9kZWwgVGhlIHNjaGVtYSB0byBhZGQuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZFNjaGVtYShYU01vZGVsIHhzTW9kZWwpCi0vLyAgewotLy8gICAgaWYgKHhzTW9kZWwgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgc2NoZW1hcy5hZGQoeHNNb2RlbCk7Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxpc3QgY29udGFpbmluZyB0aGUgc2NoZW1hcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2Ygc2NoZW1hcy4KLSAgICovCi0vLyAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0vLyAgewotLy8gICAgcmV0dXJuIHNjaGVtYXM7Ci0vLyAgfQotCi0gIC8qKgotICAJKiBHZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRvck1hbmFnZXIuCi0gIAkqIAotICAJKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBidW5kbGUgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAJKiBAc2VlICNzZXRSZXNvdXJjZUJ1bmRsZQotICAJKi8KLS8vICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKQotLy8gIHsKLS8vICAgIHJldHVybiByZXNvdXJjZWJ1bmRsZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgUmVzb3VyY2VCdW5kbGUgZm9yIHRoaXMgVmFsaWRhdG9yTWFuYWdlci4KLSAgICogCi0gICAqIEBwYXJhbSByYiBUaGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VCdW5kbGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgaWYgKG1lc3NhZ2VnZW5lcmF0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICAgIH0KLQotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBtZXNzYWdlIGdlbmVyYXRvciBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKiAKLSAgICogQHBhcmFtIG1lc2dlbiBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gc2V0IGZvciB0aGlzIGNvbnRyb2xsZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlR2VuZXJhdG9yKE1lc3NhZ2VHZW5lcmF0b3IgbWVzZ2VuKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1lc2dlbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1lc3NhZ2UgZ2VuZXJhdG9yIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29udHJvbGxlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UgZ2VuZXJhdG9yIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29udHJvbGxlci4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlR2VuZXJhdG9yIGdldE1lc3NhZ2VHZW5lcmF0b3IoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VnZW5lcmF0b3I7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBmaWxlbmFtZSBmb3IgdGhlIGZpbGUgY3VycmVudGx5IGJlaW5nIHZhbGlkYXRlZC4gU29tZSB2YWxpZGF0b3JzIHJlcXVpcmUgdGhpcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGZpbGVuYW1lIGZvciB0aGUgZmlsZSBiZWluZyB2YWxpZGF0ZWQuCi0gICAqLwotLy8gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKQotLy8gIHsKLS8vICAgIHJldHVybiBmaWxlVVJJOwotLy8gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBleHRlbnNpYmx5IHZhbGlkYXRvcnMgdG8gYWRkIGVycm9yIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgZXJyb3IgZm9yLgotICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIHRvIGFkZC4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgYWRkRXJyb3JNZXNzYWdlKE9iamVjdCBvYmplY3QsIFN0cmluZyBlcnJvcikKLS8vICB7Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShFUlJPUl9NRVNTQUdFLCBvYmplY3QsIGVycm9yKTsKLS8vICAgIGVycm9ycyA9IHRydWU7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgZXJyb3IgbWVzc2FnZXMgd2hlbiB0aGV5IGtub3cKLSAgICogbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCi0gICAqIAotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gd2hlcmUgdGhlIGVycm9yIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2UoaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyBlcnJvcikKLS8vICB7Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShFUlJPUl9NRVNTQUdFLCBsaW5lLCBjb2x1bW4sIGVycm9yKTsKLS8vICAgIGVycm9ycyA9IHRydWU7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgd2FybmluZyBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBhZGQgdGhlIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogQHBhcmFtIHdhcm5pbmcgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgYWRkV2FybmluZ01lc3NhZ2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHdhcm5pbmcpCi0vLyAgewotLy8gICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoV0FSTklOR19NRVNTQUdFLCBvYmplY3QsIHdhcm5pbmcpOwotLy8gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGZvciBleHRlbnNpYmx5IHZhbGlkYXRvcnMgdG8gYWRkIHdhcm5pbmcgbWVzc2FnZXMgd2hlbiB0aGV5IGtub3cKLSAgICogbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCi0gICAqIAotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gd2hlcmUgdGhlIGVycm9yIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICogQHBhcmFtIHdhcm5pbmcgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgYWRkV2FybmluZ01lc3NhZ2UoaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB3YXJuaW5nKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKFdBUk5JTkdfTUVTU0FHRSwgbGluZSwgY29sdW1uLCB3YXJuaW5nKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIElmIHlvdSBoYXZlIGFuIG9iamVjdCByZWFkIGluIGJ5IHRoZSByZWFkZXIgZm9yIHRoaXMKLSAgICogdmFsaWRhdG9yY29udHJvbGxlciB0aGUgb2JqZWN0IGNhbiBiZSBwYXNzZWQgaW4gaGVyZSBhbmQgdGhlIGxpbmUgYW5kIGNvbHVtbgotICAgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIGFic3RyYWN0ZWQgZnJvbSBpdC4KLSAgICogCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBlcnJvciAodXNlZCB0byBnZXQgdGhlIGxvY2F0aW9uKS4KLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShpbnQgdHlwZSwgT2JqZWN0IG8sIFN0cmluZyBtZXNzYWdlKQotLy8gIHsKLS8vICAgIGludFtdIGxvY2F0aW9uOwotLy8gICAgaWYgKGVsZW1lbnRMb2NhdGlvbnMuY29udGFpbnNLZXkobykpCi0vLyAgICB7Ci0vLyAgICAgIGxvY2F0aW9uID0gKGludFtdKWVsZW1lbnRMb2NhdGlvbnMuZ2V0KG8pOwotLy8gICAgfQotLy8gICAgLy8gaWYgd2UgZ2l2ZSBpdCBhbiBlbGVtZW50IHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZCB3ZSdsbCBzZXQgdGhlIGxvY2F0aW9uCi0vLyAgICAvLyBhdCAoMCwwKSBzbyB0aGUgZXJyb3Igc2hvd3MgdXAgYnV0IG5vIGxpbmUgbWFya2VyIGluIHRoZSBlZGl0b3IKLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgbG9jYXRpb24gPSBuZXcgaW50W10geyAwLCAwIH07Ci0vLyAgICB9Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZSh0eXBlLCBsb2NhdGlvblswXSwgbG9jYXRpb25bMV0sIG1lc3NhZ2UpOwotLy8gIH0KLQotICAvKioKLSAgICAqIENyZWF0ZXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgICogCi0gIAkqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHZhbGlkYXRpb24gbWVzc2FnZSB0byBhZGQuCi0gIAkqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gIAkqIEBwYXJhbSBjb2x1bW4gVGhlIGxpbmUgd2hlcmUgdGhlIGNvbHVtbiBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gIAkqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgCSovCi0vLyAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoaW50IHR5cGUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgbWVzc2FnZSkKLS8vICB7Ci0vLyAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBpZiAodHlwZSA9PSBFUlJPUl9NRVNTQUdFKQotLy8gICAgICB7Ci0vLyAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xsZXIuYWRkRXJyb3JNZXNzYWdlKGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAodHlwZSA9PSBXQVJOSU5HX01FU1NBR0UpCi0vLyAgICAgIHsKLS8vICAgICAgICB2YWxpZGF0aW9uQ29udHJvbGxlci5hZGRXYXJuaW5nTWVzc2FnZShsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuY29udHJvbGxlci5JV1NETFZhbGlkYXRvciNpc1ZhbGlkKCkKLSAgICovCi0vLyAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi0vLyAgewotLy8gICAgcmV0dXJuICFlcnJvcnM7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIuCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkKLS8vICB7Ci0vLyAgICBzY2hlbWFzID0gbmV3IFZlY3RvcigpOwotLy8gICAgZmlsZVVSSSA9ICIiOwotLy8gICAgd3NkbERlZmluaXRpb24gPSBudWxsOwotLy8gICAgZWxlbWVudExvY2F0aW9ucyA9IG51bGw7Ci0vLyAgICByZXNvdXJjZWJ1bmRsZSA9IG51bGw7Ci0vLyAgICAvL3ZhbGlkYXRpb25Db250cm9sbGVyID0gbnVsbDsKLS8vICAgIGVycm9ycyA9IGZhbHNlOwotLy8gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRvckRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjI3YTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRvckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotCi0vKioKLSAqIFRoZSBXU0RMIDEuMSB2YWxpZGF0b3IgZGVsZWdhdGUgaG9sZHMgYSByZWZlcmVuY2UgdG8gYSB2YWxpZGF0b3IgdG8gYmUgaW5zdGFudGlhdGVkIGF0Ci0gKiBhIGxhdGVyIHBvaW50LgotICovCi1wdWJsaWMgY2xhc3MgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKLSAgcHJpdmF0ZSBJV1NETDExVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGRlbGVnYXRlIGZvciBhIHZhbGlkYXRvciBieSBpdHMgY2xhc3MgbmFtZSBhbmQgcmVzb3VyY2UgYnVuZGxlIG5hbWUuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGJhc2UgcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHVibGljIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlKFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUsIFN0cmluZyByZXNvdXJjZUJ1bmRsZSkKLSAgewotICAgIHRoaXMudmFsaWRhdG9yQ2xhc3NuYW1lID0gdmFsaWRhdG9yQ2xhc3NuYW1lOwotICAgIHRoaXMucmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZWxlZ2F0ZSBmb3IgYSB2YWxpZGF0b3IgYnkgaXRzIGNsYXNzIG5hbWUsIHJlc291cmNlIGJ1bmRsZSBuYW1lIGFuZCAKLSAgICogYSBjbGFzcyBsb2FkZXIgdG8gbG9hZCB0aGUgdmFsaWRhdG9yIGFuZCBidW5kbGUuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGJhc2UgcmVzb3VyY2UgYnVuZGxlLgotICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgVGhlIGNsYXNzIGxvYWRlciB0byB1c2UgdG8gbG9hZCB0aGUgdmFsaWRhdG9yIGFuZCBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIHRoaXModmFsaWRhdG9yQ2xhc3NuYW1lLCByZXNvdXJjZUJ1bmRsZSk7Ci0gICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsaWRhdG9yIHNwZWNpZmllZCBpbiB0aGlzIGRlbGVnYXRlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgV1NETCAxLjEgdmFsaWRhdG9yIHNwZWNpZmllZCBieSB0aGlzIGRlbGVnYXRlLgotICAgKi8KLSAgcHVibGljIElXU0RMMTFWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZihjbGFzc0xvYWRlciA9PSBudWxsKQotICAgICAgewotICAgICAgCWNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzID0KLSAgICAgICAgICBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKHZhbGlkYXRvckNsYXNzbmFtZSkgOiBDbGFzcy5mb3JOYW1lKHZhbGlkYXRvckNsYXNzbmFtZSk7Ci0KLSAgICAgICAgdmFsaWRhdG9yID0gKElXU0RMMTFWYWxpZGF0b3IpdmFsaWRhdG9yQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSB2YWxpZGF0b3JCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocmVzb3VyY2VCdW5kbGUsIExvY2FsZS5nZXREZWZhdWx0KCksIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICB2YWxpZGF0b3Iuc2V0UmVzb3VyY2VCdW5kbGUodmFsaWRhdG9yQnVuZGxlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIGxvZ2dpbmcKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgfQotICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIGxvZ2dpbmcKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIGxvZ2dpbmcKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmFsaWRhdG9yOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTRExEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjc4MTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTRExEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvbkRlc2VyaWFsaXplcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRWxlbWVudE5TSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZC5JbmxpbmVTY2hlbWFWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuRWxlbWVudExvY2F0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTVV0aWxzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5RTmFtZVV0aWxzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5YUGF0aFV0aWxzOwotCi0vKioKLSAqIEEgV1NETCBkb2N1bWVudCB0aGF0IGtub3dzIGhvdyB0byBwYXJzZSBpdHNlbGYuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRG9jdW1lbnQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBTVFlMRV9PTkVfV0FZID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyBDb25zdGFudHMuRUxFTV9JTlBVVCB9KTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBTVFlMRV9SRVFVRVNUX1JFU1BPTlNFID0KLSAgICBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5FTEVNX0lOUFVULCBDb25zdGFudHMuRUxFTV9PVVRQVVQgfSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgU1RZTEVfU09MSUNJVF9SRVNQT05TRSA9Ci0gICAgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyBDb25zdGFudHMuRUxFTV9PVVRQVVQsIENvbnN0YW50cy5FTEVNX0lOUFVUIH0pOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFNUWUxFX05PVElGSUNBVElPTiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkVMRU1fT1VUUFVUIH0pOwotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9FUlJPUl9NVUxUSVBMRV9UWVBFU19ERUZJTkVEID0gIl9FUlJPUl9NVUxUSVBMRV9UWVBFU19ERUZJTkVEIjsKLQotICBwcm90ZWN0ZWQgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0UmVnID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBmYWN0b3J5SW1wbE5hbWUgPSBudWxsOwotCi0gIC8vIHN0b3JlIHRoZSBlbGVtZW50IGxvY2F0aW9ucyB3aXRoaW4gdGhlIGZpbGUgLSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycwotICAvLyB0aGUgbG9jYXRpb24gaW5mbyBpcyBzdG9yZWQgYXMgYW4gaW50IGFycmF5IG9mIGxlbmd0aCAyIHtsaW5lbnVtYmVyLCBjb2xudW1iZXJ9Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgZWxlbWVudExvY2F0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLSAgCi0gIC8vIGhvbGQgdGhlIHJlYWRlciBlcnJvcnMKLSAgcHJvdGVjdGVkIExpc3QgcmVhZGVyRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgTGlzdCByZWFkZXJXYXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLSAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWYgPSBudWxsOwotICBwcml2YXRlIFNldCBpbXBvcnRlZERlZnMgPSBuZXcgVHJlZVNldCgpOwotICBwcml2YXRlIEVsZW1lbnQgdHlwZXNFbCA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBMaXN0IHBvcnR0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBMaXN0IGJpbmRpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIExpc3Qgc2VydmljZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgTGlzdCBleHRlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBpbnQgZGVwdGg7Ci0gIC8vIEhvbGQgdGhlIHNjaGVtYXMgdGhhdCBhcmUgaW1wb3J0ZWQgb3IgZGVjbGFyZWQgaW5saW5lIGluIHRoaXMgd3NkbCBkb2N1bWVudC4KLSAgcHJpdmF0ZSBMaXN0IHNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgV1NETDExVmFsaWRhdGlvbkluZm8gdmFsaW5mbzsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gUGVyZm9ybXMgYSBwcmVwYXJzZSBvZiB0aGUgZG9jdW1lbnQgYW5kIGhhbmRsZXMgaW1wb3J0cyBhbmQgdHlwZXMuCi0gICAqIAotICAgKiBAcGFyYW0gZG9jdW1lbnRCYXNlVVJJIFRoZSBVUkkgb2YgdGhpcyBXU0RMIGRvY3VtZW50LgotICAgKiBAcGFyYW0gZGVmRWwgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZXB0aCBUaGUgZGVwdGggb2YgdGhpcyBkb2N1bWVudCBpbiBhIGRvY3VtZW50IHRyZWUuCi0gICAqIEBwYXJhbSBtZXNzYWdlZ2VuZXJhdG9yIEEgbWVzc2FnZWdlbmVyYXRvciB1c2VkIGZvciByZXRyaWV2aW5nIHN0cmluZ3MuCi0gICAqIEBwYXJhbSB2YWxpbmZvIEEgV1NETDExVmFsaWRhdGlvbkluZm8gb2JqZWN0IGZvciByZXBvcnRpbmcgbWVzc2FnZXMuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBFbGVtZW50IGRlZkVsLCBpbnQgZGVwdGgsIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciwgV1NETDExVmFsaWRhdGlvbkluZm8gdmFsaW5mbykgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHRoaXMubWVzc2FnZWdlbmVyYXRvciA9IG1lc3NhZ2VnZW5lcmF0b3I7Ci0gICAgdGhpcy52YWxpbmZvID0gdmFsaW5mbzsKLSAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gICAgCi0gICAgY2hlY2tFbGVtZW50TmFtZShkZWZFbCwgQ29uc3RhbnRzLlFfRUxFTV9ERUZJTklUSU9OUyk7Ci0gICAgCi0gICAgV1NETEZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAoZmFjdG9yeUltcGxOYW1lICE9IG51bGwpID8gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoZmFjdG9yeUltcGxOYW1lKSA6IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgZGVmID0gZmFjdG9yeS5uZXdEZWZpbml0aW9uKCk7Ci0KLSAgICBpZiAoZXh0UmVnICE9IG51bGwpCi0gICAgewotICAgICAgZGVmLnNldEV4dGVuc2lvblJlZ2lzdHJ5KGV4dFJlZyk7Ci0gICAgfQotCi0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoZGVmRWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoZGVmRWwsIENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9IGRlZkVsLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgIGlmIChkb2N1bWVudEJhc2VVUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWYuc2V0RG9jdW1lbnRCYXNlVVJJKGRvY3VtZW50QmFzZVVSSSk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWYuc2V0UU5hbWUobmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgbmFtZSkpOwotICAgIH0KLQotICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWYuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgaW50IHNpemUgPSBhdHRycy5nZXRMZW5ndGgoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWF0dHJzLml0ZW0oaSk7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gYXR0ci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBhdHRyLmdldExvY2FsTmFtZSgpOwotICAgICAgU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCi0gICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwgJiYgbmFtZXNwYWNlVVJJLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hNTE5TKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGxvY2FsUGFydCAhPSBudWxsICYmICFsb2NhbFBhcnQuZXF1YWxzKENvbnN0YW50cy5BVFRSX1hNTE5TKSkKLSAgICAgICAgewotICAgICAgICAgIGRlZi5hZGROYW1lc3BhY2UobG9jYWxQYXJ0LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZGVmLmFkZE5hbWVzcGFjZShudWxsLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGVyZSBhcmUgcHJvYmxlbXMgd2hlbiB0aGUgbW9kZWwgaXMgY3JlYXRlZCBhbmQgdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGlzIG5vdAotICAgIC8vIEltcG9ydCAtIFR5cGVzIC0gTWVzc2FnZSAtIFBvcnRUeXBlIC0gQmluZGluZyAtIFNlcnZpY2Ugc28gd2UgbmVlZCB0byByZWFkIHRoZW0KLSAgICAvLyBpbnRvIHRoZSBtb2RlbCBpbiB0aGF0IG9yZGVyCi0gICAgLy8gUGVyZm9ybWFuY2Ugd2lzZSB0aGlzIHNob3VsZCBiZSBtb2RpZmllZCBhcyB3ZSBoYXZlIHRvIG1ha2UgNSBleHRyYSBsb29wcyB0aHJvdWdoCi0gICAgLy8gYWxsIG9mIHRoZSBlbGVtZW50cyBhcyBhIHJlc3VsdAotCi0gICAgLy8gdGFrZSBjYXJlIG9mIEltcG9ydHMsIFR5cGVzLCBEb2N1bWVudGF0aW9uIGFuZCBleHRlbnNpYmxlZWxlbWVudHMgdG9nZXRoZXIgLSBzYXZlcyBhIHBhc3MgZm9yIERvY3VtZW50YXRpb24gCi0gICAgLy8gbGF0ZXIgYW5kIERvY3MgZG9uJ3QgZWZmZWN0IGFueXRoaW5nIGVsc2UgLSBJbXBvcnRzIGFuZCBUeXBlcyBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgdGhpbmcKLSAgICAvLyBubyBwcmVjb25jZWl2ZWQgaWRlYXMgYWJvdXQgZXh0ZW5zaWJsZSBlbGVtZW50cwotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoZGVmRWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLQotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0lNUE9SVCwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZSh0ZW1wRWwsIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSk7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZSh0ZW1wRWwsIENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OKTsKLSAgICAgICAgSW1wb3J0SG9sZGVyIGloID0gbmV3IEltcG9ydEhvbGRlcihuYW1lc3BhY2VVUkksIGxvY2F0aW9uVVJJLCBkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCksIHRoaXMsIGRlcHRoKzEsIHRlbXBFbCwgbWVzc2FnZWdlbmVyYXRvciwgdmFsaW5mbyk7Ci0gICAgICAgIGltcG9ydGVkRGVmcy5hZGQoaWgpOwotICAgICAgICBzZXRMb2NhdGlvbih0ZW1wRWwsIHRlbXBFbCk7Ci0vLyAgICAgICAgaWYgKGltcG9ydGVkRGVmcyA9PSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGltcG9ydGVkRGVmcyA9IG5ldyBIYXNodGFibGUoKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgaWYgKGRvY3VtZW50QmFzZVVSSSAhPSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGltcG9ydGVkRGVmcy5wdXQoZG9jdW1lbnRCYXNlVVJJLCBkZWYpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBkZWYuYWRkSW1wb3J0KHBhcnNlSW1wb3J0KHRlbXBFbCwgZGVmLCBpbXBvcnRlZERlZnMpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGRlZi5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fVFlQRVMsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGlmKHR5cGVzRWwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNldExvY2F0aW9uKHRlbXBFbCwgdGVtcEVsKTsKLSAgICAgICAgICBhZGRSZWFkZXJFcnJvcihkZWYsIHRlbXBFbCwgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX01VTFRJUExFX1RZUEVTX0RFRklORUQpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlc0VsID0gdGVtcEVsOwotICAgICAgICAgIHBhcnNlVHlwZXMoKTsKLSAgICAgICAgfQotLy8gICAgICAgIGRlZi5zZXRUeXBlcyhwYXJzZVR5cGVzKHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9NRVNTQUdFLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBtZXNzYWdlcy5hZGQodGVtcEVsKTsKLSAgICAgICAgLy9kZWYuYWRkTWVzc2FnZShwYXJzZU1lc3NhZ2UodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX1BPUlRfVFlQRSwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgcG9ydHR5cGVzLmFkZCh0ZW1wRWwpOwotICAgICAgICAvLyAgICAgICAgICAgICBQb3J0VHlwZSBwdCA9IHBhcnNlUG9ydFR5cGUodGVtcEVsLCBkZWYpOwotICAgICAgICAvLyAgICAgICAgICAgICBpZihwdCAhPSBudWxsKQotICAgICAgICAvLyAgICAgICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgIGRlZi5hZGRQb3J0VHlwZShwdCk7Ci0gICAgICAgIC8vICAgICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0JJTkRJTkcsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdzLmFkZCh0ZW1wRWwpOwotICAgICAgICAvL2RlZi5hZGRCaW5kaW5nKHBhcnNlQmluZGluZyh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fU0VSVklDRSwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgc2VydmljZXMuYWRkKHRlbXBFbCk7Ci0gICAgICAgIC8vZGVmLmFkZFNlcnZpY2UocGFyc2VTZXJ2aWNlKHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGV4dGVsZW1lbnRzLmFkZCh0ZW1wRWwpOwotICAgICAgICAvLyAgICAgICAgZGVmLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KAotICAgICAgICAvLyAgICAgICAgICBwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KERlZmluaXRpb24uY2xhc3MsIHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZGVmaW5pdGlvbnMgZWxlbWVudCBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGRlZmluaXRpb25zIGVsZW1lbnQgZm9yIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBkZWY7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgYSBzZXQgb2YgdGhlIGltcG9ydHMgaW4gdGhpcyBkb2N1bWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gQSBzZXQgb2YgdGhlIGltcG9ydHMgaW4gdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBTZXQgZ2V0SW1wb3J0cygpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0ZWREZWZzOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBkZWYKLSAgICogQHBhcmFtIGRvYwotICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAqIEBwYXJhbSBsb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW1wb3J0KERlZmluaXRpb24gZGVmLCBFbGVtZW50IGRvYywgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgSW1wb3J0IGltcCA9IGRlZi5jcmVhdGVJbXBvcnQoKTsKLSAgICBpbXAuc2V0RGVmaW5pdGlvbihkZWYpOwotICAgIGltcC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChkb2MpOwotICAgIGltcC5zZXROYW1lc3BhY2VVUkkobmFtZXNwYWNlKTsKLSAgICBpbXAuc2V0TG9jYXRpb25VUkkobG9jYXRpb24pOwotICAgIGRlZi5hZGRJbXBvcnQoaW1wKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSB0eXBlcyBpbiB0aGUgV1NETCBkb2N1bWVudC4gSGFuZGxlcyBkb2N1bWVudGF0aW9uLCBpbXBvcnQgYW5kIHNjaGVtYQotICAgKiBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlVHlwZXMoKQotICB7Ci0gICAgVHlwZXMgdHlwZXMgPSBkZWYuY3JlYXRlVHlwZXMoKTsKLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQodHlwZXNFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIHR5cGVzLnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0ZW1wRWwuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiaW1wb3J0IikpCi0gICAgICAgIC8vZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fSU1QT1JULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICAvLyB0aGlzIHNob3VsZG4ndCByZWFsbHkgYmUgdXNlZCBoZXJlIGJ1dCBhIGxpdHRsZSBoYWNrIHdpbGwgbWFrZQotICAgICAgICAvLyBsaWZlIGVhc2llcgotICAgICAgICAvL3BhcnNlSW1wb3J0KHRlbXBFbCwgZGVmLCAoTWFwKW5ldyBIYXNodGFibGUoKSk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUodGVtcEVsLCBDb25zdGFudHMuQVRUUl9OQU1FU1BBQ0UpOwotICAgICAgICBTdHJpbmcgbG9jYXRpb25VUkkgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUodGVtcEVsLCAic2NoZW1hTG9jYXRpb24iKTsKLSAgICAgICAgaW1wb3J0ZWREZWZzLmFkZChuZXcgSW1wb3J0SG9sZGVyKG5hbWVzcGFjZVVSSSwgbG9jYXRpb25VUkksIGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKSwgdGhpcywgZGVwdGgrMSwgdGVtcEVsLCBtZXNzYWdlZ2VuZXJhdG9yLCB2YWxpbmZvKSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZXMuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQocGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChUeXBlcy5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSBwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KFR5cGVzLmNsYXNzLCB0ZW1wRWwsIGRlZik7Ci0gICAgICAgICAgdHlwZXMuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0RWxlbSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotICAgIGRlZi5zZXRUeXBlcyh0eXBlcyk7Ci0gICAgCi0gICAgdmFsaW5mby5zZXRFbGVtZW50TG9jYXRpb25zKGVsZW1lbnRMb2NhdGlvbnMpOwotICAgIExpc3QgdHlwZXNFbGVtcyA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIGlmKHR5cGVzRWxlbXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciB0eXBlc0VsZW1zSXRlciA9IHR5cGVzRWxlbXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKHR5cGVzRWxlbXNJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdHlwZUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpdHlwZXNFbGVtc0l0ZXIubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgSW5saW5lU2NoZW1hVmFsaWRhdG9yIHhzZFZhbCA9IG5ldyBJbmxpbmVTY2hlbWFWYWxpZGF0b3IoKTsKLSAgICAgICAgeHNkVmFsLnNldE1lc3NhZ2VHZW5lcmF0b3IobWVzc2FnZWdlbmVyYXRvcik7Ci0gICAgCi0gICAgICAgIExpc3QgcGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGFyZW50cy5hZGQoZGVmKTsKLSAgICAgICAgcGFyZW50cy5hZGQoMCx0eXBlcyk7Ci0gICAgICAgIHhzZFZhbC52YWxpZGF0ZSh0eXBlRWxlbWVudCwgcGFyZW50cyx2YWxpbmZvKTsKLSAgICAgICAgWFNNb2RlbFtdIHR5cGVzU2NoZW1hcyA9IHZhbGluZm8uZ2V0U2NoZW1hcygpOwotICAgICAgICBMaXN0IHR5cGVzU2NoZW1hTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHR5cGVzU2NoZW1hcy5sZW5ndGg7IGkrKykKLSAgICAgICAgeyAgCi0gICAgICAgICAgdHlwZXNTY2hlbWFMaXN0LmFkZCh0eXBlc1NjaGVtYXNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHNjaGVtYXMuYWRkQWxsKHR5cGVzU2NoZW1hTGlzdCk7Ci0gICAgICAgIHZhbGluZm8uY2xlYXJTY2hlbWFzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHZhbGluZm8uc2V0RWxlbWVudExvY2F0aW9ucyhudWxsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBtZXNzYWdlcyBpbiB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VNZXNzYWdlcygpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkZWYuYWRkTWVzc2FnZShwYXJzZU1lc3NhZ2UoKEVsZW1lbnQpbWVzc2FnZXMuZ2V0KGkpLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICAgIHt9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIHBvcnRUeXBlcyBpbiB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VQb3J0dHlwZXMoKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0dHlwZXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFBvcnRUeXBlIHB0ID0gcGFyc2VQb3J0VHlwZSgoRWxlbWVudClwb3J0dHlwZXMuZ2V0KGkpLCBkZWYpOwotICAgICAgICBpZiAocHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGRlZi5hZGRQb3J0VHlwZShwdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICAgIHt9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIGJpbmRpbmdzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZUJpbmRpbmdzKCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ3Muc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRlZi5hZGRCaW5kaW5nKHBhcnNlQmluZGluZygoRWxlbWVudCliaW5kaW5ncy5nZXQoaSksIGRlZikpOwotICAgICAgfQotICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAge30KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgc2VydmljZXMgaW4gdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlU2VydmljZXMoKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZGVmLmFkZFNlcnZpY2UocGFyc2VTZXJ2aWNlKChFbGVtZW50KXNlcnZpY2VzLmdldChpKSwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICB7fQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVsZW1lbnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkZWYuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQocGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChEZWZpbml0aW9uLmNsYXNzLCAoRWxlbWVudClleHRlbGVtZW50cy5nZXQoaSksIGRlZikpOwotICAgICAgfQotICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAge30KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgdGhlIGdpdmVuIGxpc3Qgb2Ygc2NoZW1hcyB0byB0aGUgc2NoZW1hcyBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWFzIFRoZSBsaXN0IG9mIHNjaGVtYXMgdG8gYWRkIHRvIHRoaXMgZG9jdW1lbnQncyBzY2hlbWFzLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkU2NoZW1hcyhMaXN0IHNjaGVtYXMpCi0gIHsKLSAgICB0aGlzLnNjaGVtYXMuYWRkQWxsKHNjaGVtYXMpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzY2hlbWFzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2NoZW1hcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFNjaGVtYXMoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtYXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgc3BlY2lmaWVkIGJpbmRpbmcuCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZ0VsIFRoZSBiaW5kaW5nIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZyBwYXJzZUJpbmRpbmcoRWxlbWVudCBiaW5kaW5nRWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShiaW5kaW5nRWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotICAgIFFOYW1lIHBvcnRUeXBlTmFtZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBwb3J0VHlwZU5hbWUgPSBET01VdGlscy5nZXRRdWFsaWZpZWRBdHRyaWJ1dGVWYWx1ZShiaW5kaW5nRWwsIENvbnN0YW50cy5BVFRSX1RZUEUsIENvbnN0YW50cy5FTEVNX0JJTkRJTkcsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIG1lc3NhZ2UgbmFtZQotICAgICAgcG9ydFR5cGVOYW1lID0gbmV3IFFOYW1lKG51bGwsIERPTVV0aWxzLmdldEF0dHJpYnV0ZShiaW5kaW5nRWwsICJ0eXBlIikpOwotICAgIH0KLQotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gbnVsbDsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgYmluZGluZ05hbWUgPSBuZXcgUU5hbWUoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lKTsKLQotICAgICAgYmluZGluZyA9IGRlZi5nZXRCaW5kaW5nKGJpbmRpbmdOYW1lKTsKLQotICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZyA9IGRlZi5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgICAgIGJpbmRpbmcuc2V0UU5hbWUoYmluZGluZ05hbWUpOwotICAgICAgfQotICAgICAgLy8gcmVwb3J0IGFuIGVycm9yIGlmIGEgYmluZGluZyB3aXRoIHRoaXMgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQKLSAgICAgIGVsc2UgaWYgKCFiaW5kaW5nLmlzVW5kZWZpbmVkKCkpCi0gICAgICB7Ci0gICAgICAgIC8vYWRkUmVhZGVyRXJyb3IoZGVmLGJpbmRpbmdFbCwgIl9CSU5ESU5HX05BTUVfQUxSRUFEWV9ERUZJTkVEIik7ICAgICAgIAotICAgICAgICBhZGRSZWFkZXJFcnJvcigKLSAgICAgICAgICBkZWYsCi0gICAgICAgICAgYmluZGluZ0VsLAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfQklORElOR19OQU1FX0FMUkVBRFlfREVGSU5FRCIsICInIiArIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICInIikpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYmluZGluZyA9IGRlZi5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gV2hldGhlciBpdCB3YXMgcmV0cmlldmVkIG9yIGNyZWF0ZWQsIHRoZSBkZWZpbml0aW9uIGhhcyBiZWVuIGZvdW5kLgotICAgIGJpbmRpbmcuc2V0VW5kZWZpbmVkKGZhbHNlKTsKLQotICAgIGlmIChwb3J0VHlwZU5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwb3J0VHlwZSA9IGRlZi5nZXRQb3J0VHlwZShwb3J0VHlwZU5hbWUpOwotCi0gICAgICBpZiAocG9ydFR5cGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcG9ydFR5cGUgPSBkZWYuY3JlYXRlUG9ydFR5cGUoKTsKLSAgICAgICAgcG9ydFR5cGUuc2V0UU5hbWUocG9ydFR5cGVOYW1lKTsKLSAgICAgICAgZGVmLmFkZFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICAgIH0KLQotICAgICAgYmluZGluZy5zZXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChiaW5kaW5nRWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nLnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9PUEVSQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcuYWRkQmluZGluZ09wZXJhdGlvbihwYXJzZUJpbmRpbmdPcGVyYXRpb24odGVtcEVsLCBwb3J0VHlwZSwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQocGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChCaW5kaW5nLmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGJpbmRpbmcsIGJpbmRpbmdFbCk7Ci0KLSAgICByZXR1cm4gYmluZGluZzsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGJpbmRpbmcgb3BlcmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdPcGVyYXRpb25FbCBUaGUgYmluZGluZyBvcGVyYXRpb24gZWxlbWVudC4KLSAgICogQHBhcmFtIHBvcnRUeXBlIFRoZSBwb3J0VHlwZSB0aGUgYmluZGluZyByZWZlcmVuY2VzLgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBiaW5kaW5nIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3BlcmF0aW9uIHBhcnNlQmluZGluZ09wZXJhdGlvbihFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbCwgUG9ydFR5cGUgcG9ydFR5cGUsIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBkZWYuY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGJpbmRpbmdPcGVyYXRpb25FbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGJpbmRpbmdPcGVyYXRpb25FbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0lOUFVULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEJpbmRpbmdJbnB1dChwYXJzZUJpbmRpbmdJbnB1dCh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fT1VUUFVULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEJpbmRpbmdPdXRwdXQocGFyc2VCaW5kaW5nT3V0cHV0KHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9GQVVMVCwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5hZGRCaW5kaW5nRmF1bHQocGFyc2VCaW5kaW5nRmF1bHQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KEJpbmRpbmdPcGVyYXRpb24uY2xhc3MsIHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICBTdHJpbmcgaW5wdXROYW1lID0gKGJpbmRpbmdJbnB1dCAhPSBudWxsID8gYmluZGluZ0lucHV0LmdldE5hbWUoKSA6IG51bGwpOwotICAgICAgU3RyaW5nIG91dHB1dE5hbWUgPSAoYmluZGluZ091dHB1dCAhPSBudWxsID8gYmluZGluZ091dHB1dC5nZXROYW1lKCkgOiBudWxsKTsKLQotICAgICAgLy8gaGFjayBjb2RlIHRvIGdldCBhdCBvcGVyYXRpb25zIHRoYXQgYXJlIGRlZmluZWQgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQKLSAgICAgIC8vIGlucHV0cyBhbmQgb3V0cHV0cyAKLSAgICAgIE9wZXJhdGlvbiBvcCA9IG51bGw7Ci0gICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAvLyBnZXQgYSBsaXN0IG9mIGFsbCBvcGVyYXRpb25zIHdpdGggbWF0Y2hpbmcgbmFtZXMKLSAgICAgIExpc3QgbWF0Y2hpbmdPcGVyYXRpb25zID0gbmV3IFZlY3RvcigpOwotICAgICAgSXRlcmF0b3IgaU9wZXJhdGlvbnMgPSBvcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaU9wZXJhdGlvbnMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gb3BlciA9IChPcGVyYXRpb24paU9wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICBpZiAob3Blci5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXRjaGluZ09wZXJhdGlvbnMuYWRkKG9wZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtYXRjaGluZ09wZXJhdGlvbnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBtYXRjaGluZyBvcGVyYXRpb24gdGhpcyBpcyB3aGF0IHdlJ3JlIHJlZmVycmluZyB0by4KLSAgICAgICAgLy8gT25seSBtYXRjaGluZyBpZiBiaW5kaW5nIG9wZXJhdGlvbiBpbnB1dCBuYW1lIGFuZCBvdXRwdXQgbmFtZSBhcmUKLSAgICAgICAgLy8gYm90aCBudWxsIG9yIHRoZSBzYW1lIGFzIHRoZSBwb3J0VHlwZSBvcGVyYXRpb24gaW5wdXQgYW5kIG91dHB1dCBuYW1lcy4KLSAgICAgICAgLy8gdGhlIHBvcnRUeXBlIG9wZXJhdGlvbiBuYW1lCi0gICAgICAgIGlmIChtYXRjaGluZ09wZXJhdGlvbnMuc2l6ZSgpID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBvbmx5IHNheSB0aGUgc2luZ2xlIG9wZXJhdGlvbiBpcyB0aGUgb25lIHdlJ3JlIGxvb2tpbmcgZm9yIGlmIHRoZSBuYW1lcwotICAgICAgICAgIC8vIG9mIHRoZSBiaW5kaW5nIGlucHV0IGFuZCBvdXRwdXQgYXJlIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICBPcGVyYXRpb24gdGVtcE9wID0gKE9wZXJhdGlvbiltYXRjaGluZ09wZXJhdGlvbnMuZ2V0KDApOwotICAgICAgICAgIGJvb2xlYW4gaW5wdXRPSyA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gb3V0cHV0T0sgPSBmYWxzZTsKLSAgICAgICAgICBJbnB1dCB0ZW1wSW5wdXQgPSB0ZW1wT3AuZ2V0SW5wdXQoKTsKLSAgICAgICAgICBPdXRwdXQgdGVtcE91dHB1dCA9IHRlbXBPcC5nZXRPdXRwdXQoKTsKLQotICAgICAgICAgIC8vIG9yZGVyIGlzIGltcG9ydGFudCBpbiB0aGVzZSBjb25kaXRpb25zLiBjb25kaXRpb24gMiBtdXN0IGZhaWwgZm9yIDMgdG8gd29yawotICAgICAgICAgIC8vIGNoZWNrIHRoZSBpbnB1dAotICAgICAgICAgIGlmICh0ZW1wSW5wdXQgPT0gbnVsbCAmJiBiaW5kaW5nSW5wdXQgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dE9LID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYmluZGluZ0lucHV0ID09IG51bGwgfHwgYmluZGluZ0lucHV0LmdldE5hbWUoKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0T0sgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh0ZW1wSW5wdXQgIT0gbnVsbCAmJiBiaW5kaW5nSW5wdXQuZ2V0TmFtZSgpLmVxdWFscyh0ZW1wSW5wdXQuZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dE9LID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gY2hlY2sgdGhlIG91dHB1dAotICAgICAgICAgIGlmICh0ZW1wT3V0cHV0ID09IG51bGwgJiYgYmluZGluZ091dHB1dCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dE9LID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYmluZGluZ091dHB1dCA9PSBudWxsIHx8IGJpbmRpbmdPdXRwdXQuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0T0sgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh0ZW1wT3V0cHV0ICE9IG51bGwgJiYgYmluZGluZ091dHB1dC5nZXROYW1lKCkuZXF1YWxzKHRlbXBPdXRwdXQuZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRPSyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpbnB1dE9LICYmIG91dHB1dE9LKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wID0gdGVtcE9wOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyAgICAgICAgICBvcCA9IChPcGVyYXRpb24pIG1hdGNoaW5nT3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gb3RoZXJ3aXNlIGZpbmQgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUsIGlucHV0bmFtZSwgb3V0cHV0bmFtZSBzaWduYXR1cmUKLSAgICAgICAgaWYgKG1hdGNoaW5nT3BlcmF0aW9ucyAhPSBudWxsICYmIG9wID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBpTWF0Y2hpbmdPcGVyYXRpb25zID0gbWF0Y2hpbmdPcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGlNYXRjaGluZ09wZXJhdGlvbnMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgYm9vbGVhbiBpbnB1dE5hbWVzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gb3V0cHV0TmFtZXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXIgPSAoT3BlcmF0aW9uKWlNYXRjaGluZ09wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgLy8gICAgICAgICAgaWYgKG9wZXIuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgICAgLy8gICAgICAgICAgewotICAgICAgICAgICAgSW5wdXQgb3BJbnB1dCA9IG9wZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChvcElucHV0ICE9IG51bGwgJiYgYmluZGluZ0lucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBvcElucHV0TmFtZSA9IG9wSW5wdXQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lucHV0TmFtZSA9IGJpbmRpbmdJbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIGlmIChvcElucHV0TmFtZSAhPSBudWxsICYmIG9wSW5wdXROYW1lLmVxdWFsc0lnbm9yZUNhc2UoYmluZGluZ0lucHV0TmFtZSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKG9wSW5wdXROYW1lID09IG51bGwgJiYgYmluZGluZ0lucHV0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5wdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob3BJbnB1dCA9PSBudWxsICYmIGJpbmRpbmdJbnB1dCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT3V0cHV0IG9wT3V0cHV0ID0gb3Blci5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAgIGlmIChvcE91dHB1dCAhPSBudWxsICYmIGJpbmRpbmdPdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIG9wT3V0cHV0TmFtZSA9IG9wT3V0cHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdPdXRwdXROYW1lID0gYmluZGluZ091dHB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIGlmIChvcE91dHB1dE5hbWUgIT0gbnVsbCAmJiBvcE91dHB1dE5hbWUuZXF1YWxzSWdub3JlQ2FzZShiaW5kaW5nT3V0cHV0TmFtZSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChvcE91dHB1dE5hbWUgPT0gbnVsbCAmJiBiaW5kaW5nT3V0cHV0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9wT3V0cHV0ID09IG51bGwgJiYgYmluZGluZ091dHB1dCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvdXRwdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbnB1dE5hbWVzRXF1YWwgJiYgb3V0cHV0TmFtZXNFcXVhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3AgPSBvcGVyOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy9PcGVyYXRpb24gb3AgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb24obmFtZSwgaW5wdXROYW1lLCBvdXRwdXROYW1lKTsKLQotICAgICAgaWYgKG9wID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9wID0gZGVmLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgICBvcC5zZXROYW1lKG5hbWUpOwotICAgICAgICBwb3J0VHlwZS5hZGRPcGVyYXRpb24ob3ApOwotICAgICAgfQotCi0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE9wZXJhdGlvbihvcCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihiaW5kaW5nT3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uRWwpOwotCi0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGJpbmRpbmcgaW5wdXQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nSW5wdXRFbCBUaGUgYmluZGluZyBpbnB1dCBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBiaW5kaW5nIGlucHV0IGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdJbnB1dCBwYXJzZUJpbmRpbmdJbnB1dChFbGVtZW50IGJpbmRpbmdJbnB1dEVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBkZWYuY3JlYXRlQmluZGluZ0lucHV0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoYmluZGluZ0lucHV0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nSW5wdXQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGJpbmRpbmdJbnB1dEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0lucHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdJbnB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KEJpbmRpbmdJbnB1dC5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihiaW5kaW5nSW5wdXQsIGJpbmRpbmdJbnB1dEVsKTsKLQotICAgIHJldHVybiBiaW5kaW5nSW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBiaW5kaW5nIG91dHB1dCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdPdXRwdXRFbCBUaGUgYmluZGluZyBvdXRwdXQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgYmluZGluZyBvdXRwdXQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ091dHB1dCBwYXJzZUJpbmRpbmdPdXRwdXQoRWxlbWVudCBiaW5kaW5nT3V0cHV0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gZGVmLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShiaW5kaW5nT3V0cHV0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3V0cHV0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChiaW5kaW5nT3V0cHV0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3V0cHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPdXRwdXQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQocGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChCaW5kaW5nT3V0cHV0LmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGJpbmRpbmdPdXRwdXQsIGJpbmRpbmdPdXRwdXRFbCk7Ci0KLSAgICByZXR1cm4gYmluZGluZ091dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGJpbmRpbmcgZmF1bHQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nRmF1bHRFbCBUaGUgYmluZGluZyBmYXVsdCBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBiaW5kaW5nIGZhdWx0IGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdGYXVsdCBwYXJzZUJpbmRpbmdGYXVsdChFbGVtZW50IGJpbmRpbmdGYXVsdEVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSBkZWYuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoYmluZGluZ0ZhdWx0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nRmF1bHQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGJpbmRpbmdGYXVsdEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0ZhdWx0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdGYXVsdC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KEJpbmRpbmdGYXVsdC5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihiaW5kaW5nRmF1bHQsIGJpbmRpbmdGYXVsdEVsKTsKLQotICAgIHJldHVybiBiaW5kaW5nRmF1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBtZXNzYWdlIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gbXNnRWwgVGhlIG1lc3NhZ2UgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgbWVzc2FnZSBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlIHBhcnNlTWVzc2FnZShFbGVtZW50IG1zZ0VsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE1lc3NhZ2UgbXNnID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShtc2dFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFFOYW1lIG1lc3NhZ2VOYW1lID0gbmV3IFFOYW1lKGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZSk7Ci0KLSAgICAgIG1zZyA9IGRlZi5nZXRNZXNzYWdlKG1lc3NhZ2VOYW1lKTsKLQotICAgICAgaWYgKG1zZyA9PSBudWxsKQotICAgICAgewotICAgICAgICBtc2cgPSBkZWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBtc2cuc2V0UU5hbWUobWVzc2FnZU5hbWUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIW1zZy5pc1VuZGVmaW5lZCgpKQotICAgICAgewotICAgICAgICAvLyBwcm9kdWNlIGFuIGVycm9yIG1lc3NhZ2UgYXMgYSBtZXNzYWdlIHdpdGggdGhpcyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZAotICAgICAgICBhZGRSZWFkZXJFcnJvcigKLSAgICAgICAgICBkZWYsCi0gICAgICAgICAgbXNnRWwsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9NRVNTQUdFX05BTUVfQUxSRUFEWV9ERUZJTkVEIiwgIiciICsgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiJyIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1zZyA9IGRlZi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgfQotCi0gICAgLy8gV2hldGhlciBpdCB3YXMgcmV0cmlldmVkIG9yIGNyZWF0ZWQsIHRoZSBkZWZpbml0aW9uIGhhcyBiZWVuIGZvdW5kLgotICAgIG1zZy5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChtc2dFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIG1zZy5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fUEFSVCwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgbXNnLmFkZFBhcnQocGFyc2VQYXJ0KHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFhNTCBWYWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihtc2csIG1zZ0VsKTsKLQotICAgIHJldHVybiBtc2c7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBwYXJ0IGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gcGFydEVsIFRoZSBwYXJ0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIHBhcnQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgUGFydCBwYXJzZVBhcnQoRWxlbWVudCBwYXJ0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgUGFydCBwYXJ0ID0gZGVmLmNyZWF0ZVBhcnQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShwYXJ0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgUU5hbWUgZWxlbWVudE5hbWU7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZWxlbWVudE5hbWUgPSBET01VdGlscy5nZXRRdWFsaWZpZWRBdHRyaWJ1dGVWYWx1ZShwYXJ0RWwsIENvbnN0YW50cy5BVFRSX0VMRU1FTlQsIENvbnN0YW50cy5FTEVNX01FU1NBR0UsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIGVsZW1lbnQgbmFtZQotICAgICAgZWxlbWVudE5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBhcnRFbCwgImVsZW1lbnQiKSk7Ci0gICAgfQotCi0gICAgUU5hbWUgdHlwZU5hbWU7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgdHlwZU5hbWUgPSBET01VdGlscy5nZXRRdWFsaWZpZWRBdHRyaWJ1dGVWYWx1ZShwYXJ0RWwsIENvbnN0YW50cy5BVFRSX1RZUEUsCi0gICAgICAgIC8vIENvcnJlY3RlZCAtIHdhcyBBVFRSX0VMRU1FTlQKLSAgQ29uc3RhbnRzLkVMRU1fTUVTU0FHRSwgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy90aGUgY2FsbCBhYm92ZSBmYWlscyBpZiB0aGVyZSBpcyBubyBxdWFsaWZpZWQgbmFtZXNwYWNlIGZvciB0aGUgZWxlbWVudCBhdHRyaWJ1dGUKLSAgICAgIHR5cGVOYW1lID0gbmV3IFFOYW1lKG51bGwsIERPTVV0aWxzLmdldEF0dHJpYnV0ZShwYXJ0RWwsICJuYW1lIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIGlmIChlbGVtZW50TmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhcnQuc2V0RWxlbWVudE5hbWUoZWxlbWVudE5hbWUpOwotICAgIH0KLQotICAgIGlmICh0eXBlTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhcnQuc2V0VHlwZU5hbWUodHlwZU5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQocGFydEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgcGFydC5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBYTUwgVmFsaWRhdGlvbiB3aWxsIGNhdGNoIHRoaXMKLSAgICAgICAgRE9NVXRpbHMudGhyb3dXU0RMRXhjZXB0aW9uKHRlbXBFbCk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIE1hcCBleHRlbnNpb25BdHRyaWJ1dGVzID0gcGFydC5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCk7Ci0KLSAgICBleHRlbnNpb25BdHRyaWJ1dGVzLnB1dEFsbChnZXRQYXJ0QXR0cmlidXRlcyhwYXJ0RWwsIGRlZikpOwotCi0gICAgLy8gTmVlZCB0byBkbyBzb21ldGhpbmcgaGVyZSB0byBsb2NhdGUgcGFydCBkZWZpbml0aW9uLgotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihwYXJ0LCBwYXJ0RWwpOwotCi0gICAgcmV0dXJuIHBhcnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbWFwIG9mIHRoZSBwYXJ0IGF0dHJpYnV0ZXMuCi0gICAqIAotICAgKiBAcGFyYW0gZWwgVGhlIHBhcnQgYXR0cmlidXRlcyBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbnRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBtYXAgY29udGFpbmluZyB0aGUgcGFydCBhdHRyaWJ1dGVzLgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBNYXAgZ2V0UGFydEF0dHJpYnV0ZXMoRWxlbWVudCBlbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBlbC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IGF0dHMgPSBub2RlTWFwLmdldExlbmd0aCgpOwotCi0gICAgZm9yIChpbnQgYSA9IDA7IGEgPCBhdHRzOyBhKyspCi0gICAgewotICAgICAgQXR0ciBhdHRyaWJ1dGUgPSAoQXR0cilub2RlTWFwLml0ZW0oYSk7Ci0gICAgICBTdHJpbmcgbE5hbWUgPSBhdHRyaWJ1dGUuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICBTdHJpbmcgblNwYWNlID0gYXR0cmlidXRlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGF0dHJpYnV0ZS5nZXRQcmVmaXgoKTsKLSAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoblNwYWNlLCBsTmFtZSk7Ci0KLSAgICAgIGlmIChuU3BhY2UgIT0gbnVsbCAmJiAhblNwYWNlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1dTREwpKQotICAgICAgewotICAgICAgICBpZiAoIW5TcGFjZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YTUxOUykpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgc3RyVmFsdWUgPSBhdHRyaWJ1dGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICBRTmFtZSBxVmFsdWUgPSBudWxsOwotCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcVZhbHVlID0gRE9NVXRpbHMuZ2V0UU5hbWUoc3RyVmFsdWUsIGVsKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBxVmFsdWUgPSBuZXcgUU5hbWUoc3RyVmFsdWUpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KG5hbWUsIHFWYWx1ZSk7Ci0KLSAgICAgICAgICBTdHJpbmcgdGVtcE5TVXJpID0gZGVmLmdldE5hbWVzcGFjZShwcmVmaXgpOwotCi0gICAgICAgICAgd2hpbGUgKHRlbXBOU1VyaSAhPSBudWxsICYmICF0ZW1wTlNVcmkuZXF1YWxzKG5TcGFjZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ICs9ICJfIjsKLSAgICAgICAgICAgIHRlbXBOU1VyaSA9IGRlZi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBkZWYuYWRkTmFtZXNwYWNlKHByZWZpeCwgblNwYWNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgICFsTmFtZS5lcXVhbHMoQ29uc3RhbnRzLkFUVFJfTkFNRSkKLSAgICAgICAgICAmJiAhbE5hbWUuZXF1YWxzKENvbnN0YW50cy5BVFRSX0VMRU1FTlQpCi0gICAgICAgICAgJiYgIWxOYW1lLmVxdWFscyhDb25zdGFudHMuQVRUUl9UWVBFKSkKLSAgICAgIHsKLSAgICAgICAgV1NETEV4Y2VwdGlvbiB3c2RsRXhjID0KLSAgICAgICAgICBuZXcgV1NETEV4Y2VwdGlvbigKLSAgICAgICAgICAgIFdTRExFeGNlcHRpb24uSU5WQUxJRF9XU0RMLAotICAgICAgICAgICAgIkVuY291bnRlcmVkIGlsbGVnYWwgIgotICAgICAgICAgICAgICArICJwYXJ0IGV4dGVuc2lvbiAiCi0gICAgICAgICAgICAgICsgImF0dHJpYnV0ZSAnIgotICAgICAgICAgICAgICArIG5hbWUKLSAgICAgICAgICAgICAgKyAiJy4gRXh0ZW5zaW9uICIKLSAgICAgICAgICAgICAgKyAiYXR0cmlidXRlcyBtdXN0IGJlIGluICIKLSAgICAgICAgICAgICAgKyAiYSBuYW1lc3BhY2Ugb3RoZXIgdGhhbiAiCi0gICAgICAgICAgICAgICsgIldTREwncy4iKTsKLQotICAgICAgICB3c2RsRXhjLnNldExvY2F0aW9uKFhQYXRoVXRpbHMuZ2V0WFBhdGhFeHByRnJvbU5vZGUoZWwpKTsKLSAgICAgICAgLy90aHJvdyB3c2RsRXhjOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24oYXR0cmlidXRlcywgZWwpOwotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBwb3J0VHlwZSBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIHBvcnRUeXBlRWwgVGhlIHBvcnRUeXBlIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmludGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgcG9ydFR5cGUgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgUG9ydFR5cGUgcGFyc2VQb3J0VHlwZShFbGVtZW50IHBvcnRUeXBlRWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0KLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUocG9ydFR5cGVFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFFOYW1lIHBvcnRUeXBlTmFtZSA9IG5ldyBRTmFtZShkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUpOwotCi0gICAgICBwb3J0VHlwZSA9IGRlZi5nZXRQb3J0VHlwZShwb3J0VHlwZU5hbWUpOwotCi0gICAgICBpZiAocG9ydFR5cGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcG9ydFR5cGUgPSBkZWYuY3JlYXRlUG9ydFR5cGUoKTsKLSAgICAgICAgcG9ydFR5cGUuc2V0UU5hbWUocG9ydFR5cGVOYW1lKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCFwb3J0VHlwZS5pc1VuZGVmaW5lZCgpKQotICAgICAgewotICAgICAgICAvLyBpZiB0aGUgUG9ydFR5cGUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIHByb2R1Y2UgYW4gZXJyb3IgYW5kIHJldHVybiBudWxsCi0gICAgICAgIGFkZFJlYWRlckVycm9yKAotICAgICAgICAgIGRlZiwKLSAgICAgICAgICBwb3J0VHlwZUVsLAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfUE9SVFRZUEVfTkFNRV9BTFJFQURZX0RFRklORUQiLCAiJyIgKyBwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgIiciKSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcG9ydFR5cGUgPSBkZWYuY3JlYXRlUG9ydFR5cGUoKTsKLSAgICB9Ci0KLSAgICAvLyBXaGV0aGVyIGl0IHdhcyByZXRyaWV2ZWQgb3IgY3JlYXRlZCwgdGhlIGRlZmluaXRpb24gaGFzIGJlZW4gZm91bmQuCi0gICAgcG9ydFR5cGUuc2V0VW5kZWZpbmVkKGZhbHNlKTsKLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQocG9ydFR5cGVFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIHBvcnRUeXBlLnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9PUEVSQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIC8vIG1vZGlmaWVkIHNvIGR1cGxpY2F0ZSBvcGVyYXRpb25zIHdpbGwgbm90IGJlIGFkZGVkIHRvIHBvcnR0eXBlIAotICAgICAgICBPcGVyYXRpb24gb3AgPSBwYXJzZU9wZXJhdGlvbih0ZW1wRWwsIHBvcnRUeXBlLCBkZWYpOwotICAgICAgICBpZiAob3AgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBvcnRUeXBlLmFkZE9wZXJhdGlvbihvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9wb3J0VHlwZS5hZGRPcGVyYXRpb24ocGFyc2VPcGVyYXRpb24odGVtcEVsLCBwb3J0VHlwZSwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIHNvbWV0aGluZyBlbHNlIHRoYXQgc2hvdWxkbid0IGJlIGhlcmUKLSAgICAgICAgLy8gTkVFRCBUTyBBREQgVE8gRVJST1IgTElTVAotICAgICAgICAvL0RPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKHBvcnRUeXBlLCBwb3J0VHlwZUVsKTsKLQotICAgIHJldHVybiBwb3J0VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIG9wRWwgVGhlIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcG9ydFR5cGUgVGhlIHBvcnRUeXBlIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBPcGVyYXRpb24gcGFyc2VPcGVyYXRpb24oRWxlbWVudCBvcEVsLCBQb3J0VHlwZSBwb3J0VHlwZSwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBPcGVyYXRpb24gb3AgPSBudWxsOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKG9wRWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotICAgIFN0cmluZyBwYXJhbWV0ZXJPcmRlclN0ciA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShvcEVsLCBDb25zdGFudHMuQVRUUl9QQVJBTUVURVJfT1JERVIpOwotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQob3BFbCk7Ci0gICAgTGlzdCBtZXNzYWdlT3JkZXIgPSBuZXcgVmVjdG9yKCk7Ci0gICAgRWxlbWVudCBkb2NFbCA9IG51bGw7Ci0gICAgSW5wdXQgaW5wdXQgPSBudWxsOwotICAgIE91dHB1dCBvdXRwdXQgPSBudWxsOwotICAgIExpc3QgZmF1bHRzID0gbmV3IFZlY3RvcigpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBkb2NFbCA9IHRlbXBFbDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0lOUFVULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBpbnB1dCA9IHBhcnNlSW5wdXQodGVtcEVsLCBkZWYpOwotICAgICAgICBtZXNzYWdlT3JkZXIuYWRkKENvbnN0YW50cy5FTEVNX0lOUFVUKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX09VVFBVVCwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgb3V0cHV0ID0gcGFyc2VPdXRwdXQodGVtcEVsLCBkZWYpOwotICAgICAgICBtZXNzYWdlT3JkZXIuYWRkKENvbnN0YW50cy5FTEVNX09VVFBVVCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9GQVVMVCwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgZmF1bHRzLmFkZChwYXJzZUZhdWx0KHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIGludmFsaWQgZWxlbWVudCBpbiB0aGUgb3BlcmF0aW9uCi0gICAgICAgIC8vIFhNTCBjaGVjayB3aWxsIGNhdGNoIHRoaXMKLSAgICAgICAgRE9NVXRpbHMudGhyb3dXU0RMRXhjZXB0aW9uKHRlbXBFbCk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGlucHV0TmFtZSA9IChpbnB1dCAhPSBudWxsID8gaW5wdXQuZ2V0TmFtZSgpIDogbnVsbCk7Ci0gICAgICBTdHJpbmcgb3V0cHV0TmFtZSA9IChvdXRwdXQgIT0gbnVsbCA/IG91dHB1dC5nZXROYW1lKCkgOiBudWxsKTsKLQotICAgICAgYm9vbGVhbiBvcERlZmluZWQgPSBmYWxzZTsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0KLSAgICAgICAgLy9vcCA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbihuYW1lLCBpbnB1dE5hbWUsIG91dHB1dE5hbWUpOwotCi0gICAgICAgIC8vT3BlcmF0aW9uIG9wID0gbnVsbDsKLSAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBpZiAob3BlcmF0aW9ucyAhPSBudWxsKQotICAgICAgICB7Ci0KLSAgICAgICAgICBJdGVyYXRvciBpT3BlcmF0aW9ucyA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoaU9wZXJhdGlvbnMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaW5wdXROYW1lc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIG91dHB1dE5hbWVzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIE9wZXJhdGlvbiBvcGVyID0gKE9wZXJhdGlvbilpT3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob3Blci5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSW5wdXQgb3BJbnB1dCA9IG9wZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgICAgaWYgKG9wSW5wdXQgIT0gbnVsbCAmJiBpbnB1dCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wSW5wdXROYW1lID0gb3BJbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wSW5wdXROYW1lICE9IG51bGwgJiYgaW5wdXROYW1lICE9IG51bGwgJiYgb3BJbnB1dE5hbWUuZXF1YWxzSWdub3JlQ2FzZShpbnB1dE5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlucHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wSW5wdXROYW1lID09IG51bGwgJiYgaW5wdXROYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW5wdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAob3BJbnB1dCA9PSBudWxsICYmIGlucHV0ID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIE91dHB1dCBvcE91dHB1dCA9IG9wZXIuZ2V0T3V0cHV0KCk7Ci0gICAgICAgICAgICAgIGlmIChvcE91dHB1dCAhPSBudWxsICYmIG91dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wT3V0cHV0TmFtZSA9IG9wT3V0cHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAob3BPdXRwdXROYW1lICE9IG51bGwgJiYgb3V0cHV0TmFtZSAhPSBudWxsICYmIG9wT3V0cHV0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKG91dHB1dE5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG91dHB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChvcE91dHB1dE5hbWUgPT0gbnVsbCAmJiBvdXRwdXROYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb3V0cHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKG9wT3V0cHV0ID09IG51bGwgJiYgb3V0cHV0ID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoaW5wdXROYW1lc0VxdWFsICYmIG91dHB1dE5hbWVzRXF1YWwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcCA9IG9wZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgb3BEZWZpbmVkID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKG9wICE9IG51bGwgLyomJiAhb3AuaXNVbmRlZmluZWQoKSovCi0gICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgLy9vcCA9IG51bGw7Ci0gICAgICAgIG9wRGVmaW5lZCA9IHRydWU7Ci0KLSAgICAgIH0KLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgIW9wRGVmaW5lZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlucHV0TmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSW5wdXQgdGVtcEluID0gb3AuZ2V0SW5wdXQoKTsKLQotICAgICAgICAgIGlmICh0ZW1wSW4gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGVtcEluLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL29wID0gbnVsbDsKLSAgICAgICAgICAgICAgb3BEZWZpbmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgIW9wRGVmaW5lZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKG91dHB1dE5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIE91dHB1dCB0ZW1wT3V0ID0gb3AuZ2V0T3V0cHV0KCk7Ci0KLSAgICAgICAgICBpZiAodGVtcE91dCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0ZW1wT3V0LmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL29wID0gbnVsbDsKLSAgICAgICAgICAgICAgb3BEZWZpbmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG9wRGVmaW5lZCkKLSAgICAgIHsKLSAgICAgICAgLy8gaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUgd2l0aCB0aGUgc2FtZSBuYW1lIHdlJ3JlIGdvaW5nIHRvIHJldHVybiBudWxsLgotICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIFdTREwgMS4yIHdvcmtpbmcgZHJhZnQgb3BlcmF0aW9uIG92ZXJsb2FkaW5nIGlzIG5vIGxvbmdlciBhbGxvd2VkLgotICAgICAgICAvLyBHb2luZyB0byB1c2UgdGhhdCBoZXJlIHRvIHNhdmUgYSBsb3Qgb2Ygd29yawotICAgICAgICBzZXRMb2NhdGlvbihvcCwgb3BFbCk7Ci0gICAgICAgIGFkZFJlYWRlckVycm9yKAotICAgICAgICAgIHBvcnRUeXBlLAotICAgICAgICAgIG9wLAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgIl9EVVBMSUNBVEVfT1BFUkFUSU9OX0ZPUl9QT1JUVFlQRSIsCi0gICAgICAgICAgICAiJyIgKyBvcC5nZXROYW1lKCkgKyAiJyIsCi0gICAgICAgICAgICAiJyIgKyBwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgIiciKSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgaWYgKG9wID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9wID0gZGVmLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgICBvcC5zZXROYW1lKG5hbWUpOwotCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvcCA9IGRlZi5jcmVhdGVPcGVyYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvLyBXaGV0aGVyIGl0IHdhcyByZXRyaWV2ZWQgb3IgY3JlYXRlZCwgdGhlIGRlZmluaXRpb24gaGFzIGJlZW4gZm91bmQuCi0gICAgb3Auc2V0VW5kZWZpbmVkKGZhbHNlKTsKLQotICAgIGlmIChwYXJhbWV0ZXJPcmRlclN0ciAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wLnNldFBhcmFtZXRlck9yZGVyaW5nKFN0cmluZ1V0aWxzLnBhcnNlTk1Ub2tlbnMocGFyYW1ldGVyT3JkZXJTdHIpKTsKLSAgICB9Ci0KLSAgICBpZiAoZG9jRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChkb2NFbCk7Ci0gICAgfQotCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgb3Auc2V0SW5wdXQoaW5wdXQpOwotICAgIH0KLQotICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcC5zZXRPdXRwdXQob3V0cHV0KTsKLSAgICB9Ci0KLSAgICBpZiAoZmF1bHRzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgSXRlcmF0b3IgZmF1bHRJdGVyYXRvciA9IGZhdWx0cy5pdGVyYXRvcigpOwotCi0gICAgICB3aGlsZSAoZmF1bHRJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIEZhdWx0IGYgPSAoRmF1bHQpZmF1bHRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIC8vIGlmIHRoZSBmYXVsdCBpc24ndCBkZWZpbmVkIHlldAotICAgICAgICBpZiAob3AuZ2V0RmF1bHQoZi5nZXROYW1lKCkpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBvcC5hZGRGYXVsdChmKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhZGRSZWFkZXJFcnJvcigKLSAgICAgICAgICAgIG9wLAotICAgICAgICAgICAgZiwKLSAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfRFVQTElDQVRFX0ZBVUxUX05BTUUiLCAiJyIgKyBmLmdldE5hbWUoKSArICInIiwgIiciICsgb3AuZ2V0TmFtZSgpICsgIiciKSk7Ci0gICAgICAgICAgLy9mYXVsdEVycm9ycy5hZGQobmV3IE9iamVjdFtde2YsIkR1cGxpY2F0ZSBOYW1lIixvcH0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgT3BlcmF0aW9uVHlwZSBzdHlsZSA9IG51bGw7Ci0KLSAgICBpZiAobWVzc2FnZU9yZGVyLmVxdWFscyhTVFlMRV9PTkVfV0FZKSkKLSAgICB7Ci0gICAgICBzdHlsZSA9IE9wZXJhdGlvblR5cGUuT05FX1dBWTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWVzc2FnZU9yZGVyLmVxdWFscyhTVFlMRV9SRVFVRVNUX1JFU1BPTlNFKSkKLSAgICB7Ci0gICAgICBzdHlsZSA9IE9wZXJhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWVzc2FnZU9yZGVyLmVxdWFscyhTVFlMRV9TT0xJQ0lUX1JFU1BPTlNFKSkKLSAgICB7Ci0gICAgICBzdHlsZSA9IE9wZXJhdGlvblR5cGUuU09MSUNJVF9SRVNQT05TRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWVzc2FnZU9yZGVyLmVxdWFscyhTVFlMRV9OT1RJRklDQVRJT04pKQotICAgIHsKLSAgICAgIHN0eWxlID0gT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT047Ci0gICAgfQotCi0gICAgaWYgKHN0eWxlICE9IG51bGwpCi0gICAgewotICAgICAgb3Auc2V0U3R5bGUoc3R5bGUpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24ob3AsIG9wRWwpOwotCi0gICAgLy8gbW9kaWZpZWQgdG8gcmVtb3ZlIGR1cGxpY2F0ZSBvcGVyYXRpb25zCi0gICAgLy8gICAgaWYob3BEZWZpbmVkKQotICAgIC8vICAgIHsKLSAgICAvLyAgICAgIGFkZFJlYWRlckVycm9yKHBvcnRUeXBlLG9wLFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX0RVUExJQ0FURV9PUEVSQVRJT05fRk9SX1BPUlRUWVBFIiwiJyIrb3AuZ2V0TmFtZSgpKyInIiwiJyIrcG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSsiJyIpKTsKLSAgICAvLyAgICAgIHJldHVybiBudWxsOwotICAgIC8vICAgIH0KLSAgICByZXR1cm4gb3A7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBzZXJ2aWNlIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gc2VydmljZUVsIFRoZSBzZXJ2aWNlIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmludGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgc2VydmljZSBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBTZXJ2aWNlIHBhcnNlU2VydmljZShFbGVtZW50IHNlcnZpY2VFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBkZWYuY3JlYXRlU2VydmljZSgpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHNlcnZpY2VFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNlcnZpY2Uuc2V0UU5hbWUobmV3IFFOYW1lKGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZSkpOwotICAgIH0KLSAgICBTZXJ2aWNlIHM7Ci0gICAgLy8gYSBzZXJ2aWNlIHdpdGggdGhpcyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZAotICAgIGlmICgocyA9IGRlZi5nZXRTZXJ2aWNlKHNlcnZpY2UuZ2V0UU5hbWUoKSkpICE9IG51bGwpCi0gICAgewotICAgICAgYWRkUmVhZGVyRXJyb3IoCi0gICAgICAgIGRlZiwKLSAgICAgICAgc2VydmljZUVsLAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1NFUlZJQ0VfTkFNRV9BTFJFQURZX0RFRklORUQiLCAiJyIgKyBzLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiJyIpKTsKLSAgICAgIHJldHVybiBzOwotICAgIH0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KHNlcnZpY2VFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIHNlcnZpY2Uuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX1BPUlQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChwYXJzZVBvcnQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2VydmljZS5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KFNlcnZpY2UuY2xhc3MsIHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24oc2VydmljZSwgc2VydmljZUVsKTsKLQotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBwb3J0IGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gcG9ydEVsIFRoZSBwb3J0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIHBvcnQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgUG9ydCBwYXJzZVBvcnQoRWxlbWVudCBwb3J0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgUG9ydCBwb3J0ID0gZGVmLmNyZWF0ZVBvcnQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShwb3J0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotICAgIFFOYW1lIGJpbmRpbmdTdHI7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmluZGluZ1N0ciA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKHBvcnRFbCwgQ29uc3RhbnRzLkFUVFJfQklORElORywgQ29uc3RhbnRzLkVMRU1fUE9SVCwgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy90aGUgY2FsbCBhYm92ZSBmYWlscyBpZiB0aGVyZSBpcyBubyBxdWFsaWZpZWQgbmFtZXNwYWNlIGZvciB0aGUgbWVzc2FnZSBuYW1lCi0gICAgICBiaW5kaW5nU3RyID0gbmV3IFFOYW1lKG51bGwsIERPTVV0aWxzLmdldEF0dHJpYnV0ZShwb3J0RWwsICJiaW5kaW5nIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcG9ydC5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIGlmIChiaW5kaW5nU3RyICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gZGVmLmdldEJpbmRpbmcoYmluZGluZ1N0cik7Ci0KLSAgICAgIGlmIChiaW5kaW5nID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcgPSBkZWYuY3JlYXRlQmluZGluZygpOwotICAgICAgICBiaW5kaW5nLnNldFFOYW1lKGJpbmRpbmdTdHIpOwotICAgICAgICBkZWYuYWRkQmluZGluZyhiaW5kaW5nKTsKLSAgICAgIH0KLQotICAgICAgcG9ydC5zZXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQocG9ydEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgcG9ydC5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwb3J0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoUG9ydC5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihwb3J0LCBwb3J0RWwpOwotCi0gICAgcmV0dXJuIHBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBleHRlbnNpYmlsaXR5IGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50VHlwZSBUaGUgcGFyZW50IHR5cGUgb2YgdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICogQHBhcmFtIGVsIFRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgcGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChDbGFzcyBwYXJlbnRUeXBlLCBFbGVtZW50IGVsLCBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgUU5hbWUgZWxlbWVudFR5cGUgPSBRTmFtZVV0aWxzLm5ld1FOYW1lKGVsKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dFJlZyA9IGRlZi5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCi0gICAgICBpZiAoZXh0UmVnID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICAgIFdTRExFeGNlcHRpb24uQ09ORklHVVJBVElPTl9FUlJPUiwKLSAgICAgICAgICAiTm8gRXh0ZW5zaW9uUmVnaXN0cnkgc2V0IGZvciB0aGlzICIKLSAgICAgICAgICAgICsgIkRlZmluaXRpb24sIHNvIHVuYWJsZSB0byBkZXNlcmlhbGl6ZSAiCi0gICAgICAgICAgICArICJhICciCi0gICAgICAgICAgICArIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICArICInIGVsZW1lbnQgaW4gdGhlICIKLSAgICAgICAgICAgICsgImNvbnRleHQgb2YgYSAnIgotICAgICAgICAgICAgKyBwYXJlbnRUeXBlLmdldE5hbWUoKQotICAgICAgICAgICAgKyAiJy4iKTsKLSAgICAgIH0KLQotICAgICAgRXh0ZW5zaW9uRGVzZXJpYWxpemVyIGV4dERTID0gZXh0UmVnLnF1ZXJ5RGVzZXJpYWxpemVyKHBhcmVudFR5cGUsIGVsZW1lbnRUeXBlKTsKLQotICAgICAgLy8gYXNpZ24gdGhlIEV4dGVuc2liaWxpdHlFbGVtZW50IHRvIGEgdmFyIHNvIHdlIGNhbiBhZGQgaXQgdG8gdGhlIGxvY2F0aW9ucwotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IGV4dERTLnVubWFyc2hhbGwocGFyZW50VHlwZSwgZWxlbWVudFR5cGUsIGVsLCBkZWYsIGV4dFJlZyk7Ci0gICAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgICAgLy8gdGhpcyBtaWdodCBub3Qgd29yayBwcm9wZXJseQotICAgICAgc2V0TG9jYXRpb24oZXh0RWxlbSwgZWwpOwotCi0gICAgICAvLyByZWdpc3RlciBhbGwgb2YgdGhlIGNoaWxkIEVsZW1lbnRzIHNvIHdlIGNhbiBmaW5kIHRoZW0gbGF0ZXIKLSAgICAgIC8vIHVzZWQgZm9yIGlubGluZSBzY2hlbWEgdmFsaWRhdGlvbgotICAgICAgcmVnaXN0ZXJDaGlsZEVsZW1lbnRzKGV4dEVsZW0pOwotCi0gICAgICByZXR1cm4gZXh0RWxlbTsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBpZiAoZS5nZXRMb2NhdGlvbigpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGUuc2V0TG9jYXRpb24oWFBhdGhVdGlscy5nZXRYUGF0aEV4cHJGcm9tTm9kZShlbCkpOwotICAgICAgfQotICAgICAgdGhyb3cgZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBpbnB1dCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGlucHV0RWwgVGhlIGlucHV0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmludGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgaW5wdXQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgSW5wdXQgcGFyc2VJbnB1dChFbGVtZW50IGlucHV0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0KLSAgICBJbnB1dCBpbnB1dCA9IGRlZi5jcmVhdGVJbnB1dCgpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGlucHV0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotICAgIFFOYW1lIG1lc3NhZ2VOYW1lID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBtZXNzYWdlTmFtZSA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKGlucHV0RWwsIENvbnN0YW50cy5BVFRSX01FU1NBR0UsIENvbnN0YW50cy5FTEVNX0lOUFVULCBmYWxzZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL3RoZSBjYWxsIGFib3ZlIGZhaWxzIGlmIHRoZXJlIGlzIG5vIHF1YWxpZmllZCBuYW1lc3BhY2UgZm9yIHRoZSBtZXNzYWdlIG5hbWUKLSAgICAgIG1lc3NhZ2VOYW1lID0gbmV3IFFOYW1lKG51bGwsIERPTVV0aWxzLmdldEF0dHJpYnV0ZShpbnB1dEVsLCAibWVzc2FnZSIpKTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlucHV0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKG1lc3NhZ2VOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZGVmLmdldE1lc3NhZ2UobWVzc2FnZU5hbWUpOwotCi0gICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBtZXNzYWdlID0gZGVmLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgbWVzc2FnZS5zZXRRTmFtZShtZXNzYWdlTmFtZSk7Ci0gICAgICAgIGRlZi5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgfQotCi0gICAgICBpbnB1dC5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoaW5wdXRFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFhNTCBWYWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihpbnB1dCwgaW5wdXRFbCk7Ci0KLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBvdXRwdXQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBvdXRwdXRFbCBUaGUgb3V0cHV0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmludGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgb3V0cHV0IGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIE91dHB1dCBwYXJzZU91dHB1dChFbGVtZW50IG91dHB1dEVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE91dHB1dCBvdXRwdXQgPSBkZWYuY3JlYXRlT3V0cHV0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUob3V0cHV0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotICAgIFFOYW1lIG1lc3NhZ2VOYW1lID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBtZXNzYWdlTmFtZSA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKG91dHB1dEVsLCBDb25zdGFudHMuQVRUUl9NRVNTQUdFLCBDb25zdGFudHMuRUxFTV9PVVRQVVQsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIG1lc3NhZ2UgbmFtZQotICAgICAgbWVzc2FnZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKG91dHB1dEVsLCAibWVzc2FnZSIpKTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dHB1dC5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIGlmIChtZXNzYWdlTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGRlZi5nZXRNZXNzYWdlKG1lc3NhZ2VOYW1lKTsKLQotICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZSA9IGRlZi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIG1lc3NhZ2Uuc2V0UU5hbWUobWVzc2FnZU5hbWUpOwotICAgICAgICBkZWYuYWRkTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgIH0KLQotICAgICAgb3V0cHV0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChvdXRwdXRFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIG91dHB1dC5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBYTUwgVmFsaWRhdGlvbiB3aWxsIGNhdGNoIHRoaXMKLSAgICAgICAgRE9NVXRpbHMudGhyb3dXU0RMRXhjZXB0aW9uKHRlbXBFbCk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24ob3V0cHV0LCBvdXRwdXRFbCk7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgZmF1bHQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBmYXVsdEVsIFRoZSBmYXVsdCBlbGVtZW50IHRvIHBhcnNlLgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBmYXVsdCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBGYXVsdCBwYXJzZUZhdWx0KEVsZW1lbnQgZmF1bHRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBGYXVsdCBmYXVsdCA9IGRlZi5jcmVhdGVGYXVsdCgpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGZhdWx0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotICAgIFFOYW1lIG1lc3NhZ2VOYW1lID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBtZXNzYWdlTmFtZSA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKGZhdWx0RWwsIENvbnN0YW50cy5BVFRSX01FU1NBR0UsIENvbnN0YW50cy5FTEVNX0lOUFVULCBmYWxzZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL3RoZSBjYWxsIGFib3ZlIGZhaWxzIGlmIHRoZXJlIGlzIG5vIHF1YWxpZmllZCBuYW1lc3BhY2UgZm9yIHRoZSBtZXNzYWdlIG5hbWUKLSAgICAgIG1lc3NhZ2VOYW1lID0gbmV3IFFOYW1lKG51bGwsIERPTVV0aWxzLmdldEF0dHJpYnV0ZShmYXVsdEVsLCAibWVzc2FnZSIpKTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZhdWx0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKG1lc3NhZ2VOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZGVmLmdldE1lc3NhZ2UobWVzc2FnZU5hbWUpOwotCi0gICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBtZXNzYWdlID0gZGVmLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgbWVzc2FnZS5zZXRRTmFtZShtZXNzYWdlTmFtZSk7Ci0gICAgICAgIGRlZi5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgfQotCi0gICAgICBmYXVsdC5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoZmF1bHRFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGZhdWx0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFhNTCBWYWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihmYXVsdCwgZmF1bHRFbCk7Ci0KLSAgICByZXR1cm4gZmF1bHQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIG1lc3NhZ2VnZW5lcmF0b3IgZm9yIHRoZSByZWFkZXIuCi0gICAqIAotICAgKiBAcGFyYW0gbWcgVGhlIG1lc3NhZ2UgZ2VuZXJhdG9yIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VHZW5lcmF0b3IoTWVzc2FnZUdlbmVyYXRvciBtZykKLSAgewotICAgIG1lc3NhZ2VnZW5lcmF0b3IgPSBtZzsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgdGhlIHJlZk9iamVjdCB0byB0aGUgZWxlbWVudExvY2F0aW9uIGhhc2h0YWJsZSB3aXRoIHRoZSBsb2NhdGlvbiBkZWZpbmVkIGluIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gcmVmT2JqZWN0IFRoZSBvYmplY3QgdG8gYWRkLgotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldExvY2F0aW9uKE9iamVjdCByZWZPYmplY3QsIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnRJbXBsID0gKEVsZW1lbnRJbXBsKWVsZW1lbnQ7Ci0gICAgICBFbGVtZW50TG9jYXRpb24gZWxlbWVudExvY2F0aW9uID0gKEVsZW1lbnRMb2NhdGlvbillbGVtZW50SW1wbC5nZXRVc2VyRGF0YShFbGVtZW50TG9jYXRpb24uSUQpOwotICAgICAgaWYgKGVsZW1lbnRMb2NhdGlvbiAhPSBudWxsKQotICAgICAgewotCi0gICAgICAgIGVsZW1lbnRMb2NhdGlvbnMucHV0KAotICAgICAgICAgIHJlZk9iamVjdCwKLSAgICAgICAgICBuZXcgTG9jYXRpb25Ib2xkZXIoZWxlbWVudExvY2F0aW9uLmdldExpbmVOdW1iZXIoKSwgZWxlbWVudExvY2F0aW9uLmdldENvbHVtbk51bWJlcigpLCBkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIEFkZCBhIHJlYWRlciBlcnJvciB0byB0aGUgbGlzdC4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvci4KLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHdpdGggdGhlIGVycm9yLgotICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRSZWFkZXJFcnJvcihPYmplY3QgcGFyZW50b2JqZWN0LCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZXJyb3IpCi0gIHsKLSAgICByZWFkZXJFcnJvcnMuYWRkKG5ldyBSZWFkZXJFcnJvcihwYXJlbnRvYmplY3QsIG9iamVjdCwgZXJyb3IpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIHJlYWRlciB3YXJuaW5nIHRvIHRoZSBsaXN0LgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSB3YXJuaW5nIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRSZWFkZXJXYXJuaW5nKE9iamVjdCBwYXJlbnRvYmplY3QsIE9iamVjdCBvYmplY3QsIFN0cmluZyB3YXJuaW5nKQotICB7Ci0gICAgcmVhZGVyV2FybmluZ3MuYWRkKG5ldyBSZWFkZXJFcnJvcihwYXJlbnRvYmplY3QsIG9iamVjdCwgd2FybmluZykpOwotICB9Ci0gIAotICAvKioKLSAgICogUmVnaXN0ZXIgYWxsIG9mIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBleHRlbnNpYmlsaXR5Ci0gICAqIGVsZW1lbnQgZ2l2ZW4uCi0gICAqIAotICAgKiBAcGFyYW0gZXh0RWxlbSBUaGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IHdob3NlIGNoaWxkIGVsZW1lbnRzIHdpbGwgYmUgcmVnaXN0ZXJlZC4KLSAgICovCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDaGlsZEVsZW1lbnRzKEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0pCi0gIHsKLSAgICAvLyBvbmx5IGFkZCB0aG9zZSB0aGF0IGFyZSBvZiB0eXBlIHVua25vd24uIGlmIHRoZXkncmUga25vd24gdGhleSAKLSAgICAvLyB3aWxsIHRha2UgY2FyZSBvZiB0aGVtc2VsdmVzCi0gICAgaWYgKGV4dEVsZW0gaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtID0gKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZXh0RWxlbSkuZ2V0RWxlbWVudCgpOwotICAgICAgcmVnaXN0ZXJDaGlsZEVsZW1lbnRzUmVjdXJzaXZlbHkoZWxlbSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBsb2NhdGlvbiBvZiBhbGwgb2YgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIGVsZW0uCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbSBUaGUgZWxlbWVudCB3aG9zZSBjaGlsZCBlbGVtZW50cyB3aWxsIGJlIHJlZ2lzdGVyZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckNoaWxkRWxlbWVudHNSZWN1cnNpdmVseShFbGVtZW50IGVsZW0pCi0gIHsKLSAgICBpZiAoZWxlbSBpbnN0YW5jZW9mIEVsZW1lbnROU0ltcGwpCi0gICAgewotICAgICAgc2V0TG9jYXRpb24oZWxlbSwgZWxlbSk7Ci0KLSAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCByZWN1cnNpdmVseSBmb3IgZWFjaCBjaGlsZCBlbGVtZW50Ci0gICAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gZWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSB8fCBpIDwgNTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIG4gPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0gICAgICAgIC8vIHdlIG9ubHkgd2FudCBub2RlcyB0aGF0IGFyZSBFbGVtZW50cwotICAgICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpbjsKLSAgICAgICAgICByZWdpc3RlckNoaWxkRWxlbWVudHNSZWN1cnNpdmVseShjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgYW4gZWxlbWVudCBuYW1lIG1hdGNoZXMgdGhlIGV4cGVjdGVkIG5hbWUuCi0gICAqIAotICAgKiBAcGFyYW0gZWwgVGhlIGVsZW1lbnQgd2l0aCB0aGUgbmFtZSB0byBjaGVjay4KLSAgICogQHBhcmFtIHFuYW1lIFRoZSBuYW1lIHRvIGNoZWNrIGFnYWluc3QuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0VsZW1lbnROYW1lKEVsZW1lbnQgZWwsIFFOYW1lIHFuYW1lKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCFRTmFtZVV0aWxzLm1hdGNoZXMocW5hbWUsIGVsKSkKLSAgICB7Ci0gICAgICBXU0RMRXhjZXB0aW9uIHdzZGxFeGMgPSBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLklOVkFMSURfV1NETCwgIkV4cGVjdGVkIGVsZW1lbnQgJyIgKyBxbmFtZSArICInLiIpOwotCi0gICAgICB3c2RsRXhjLnNldExvY2F0aW9uKFhQYXRoVXRpbHMuZ2V0WFBhdGhFeHByRnJvbU5vZGUoZWwpKTsKLQotICAgICAgdGhyb3cgd3NkbEV4YzsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGVsZW1lbnQgbG9jYXRpb25zIGhhc2h0YWJsZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgbG9jYXRpb25zIGhhc2h0YWJsZS4KLSAgICovCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0RWxlbWVudExvY2F0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudExvY2F0aW9uczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgcmVhZGVyIGVycm9ycy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHJlYWRlciBlcnJvcnMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRSZWFkZXJFcnJvcnMoKQotICB7Ci0gICAgcmV0dXJuIHJlYWRlckVycm9yczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCByZWFkZXIgd2FybmluZ3MuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSByZWFkZXIgd2FybmluZ3MuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRSZWFkZXJXYXJuaW5ncygpCi0gIHsKLSAgICByZXR1cm4gcmVhZGVyV2FybmluZ3M7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMUmVhZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETFJlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5MTg5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMUmVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFcnJvclJlcG9ydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuTGluZU51bWJlckRPTVBhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwuU3RyaW5nVXRpbHM7Ci0KLS8qKgotICogQSBXU0RMIHJlYWRlciB0aGF0IHN1cHBvcnRzIGN5Y2xpYyBXU0RMIGltcG9ydHMsIHNjaGVtYSBpbXBvcnRzIGFuZCBpbmxpbmUgc2NoZW1hcy4KLSAqIFRoaXMgcmVhZGVyIGlzIGJhc2VkIG9uIHRoZSBXU0RMUmVhZGVySW1wbCBmcm9tIFdTREw0Si4gCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUmVhZGVySW1wbAotewotICBwcm90ZWN0ZWQgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yOwotICBwcm90ZWN0ZWQgV1NETDExVmFsaWRhdGlvbkluZm8gd3NkbHZhbGluZm87Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbHZhbGluZm8gVGhlIFdTREwgMS4xIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIFdTRExSZWFkZXJJbXBsKFdTREwxMVZhbGlkYXRpb25JbmZvIHdzZGx2YWxpbmZvKQotICB7Ci0gICAgdGhpcy53c2RsdmFsaW5mbyA9IHdzZGx2YWxpbmZvOwotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIHJvb3QgZG9jdW1lbnQuIFRoaXMgbWV0aG9kIHdpbGwgZmluZCBhbGwgaW1wb3J0cyBhbmQgcGFyc2UgdGhlbSBhcyAKLSAgICogd2VsbCBjcmVhdGluZyBhIFdTRExEb2N1bWVudCBmb3IgZWFjaCB1bmlxdWUgV1NETCBmaWxlLiBUaGlzIG1ldGhvZCBzdXBwb3J0cwotICAgKiBjeWNsaWMgV1NETCBpbXBvcnQgc3RhdGVtZW50cyBzdWNoIHRoYXQgZmlsZSBBIGNhbiBpbXBvcnQgZmlsZSBCIGFuZCBmaWxlIEIKLSAgICogY2FuIGltcG9ydCBmaWxlIEEuCi0gICAqIAotICAgKiBAcGFyYW0gZG9jdW1lbnRCYXNlVVJJIFRoZSBiYXNlIFVSSSBvZiB0aGUgcm9vdCBkb2N1bWVudC4KLSAgICogQHBhcmFtIGRlZkVsIFRoZSBkZWZpbml0aW9uIGVsZW1lbnQgb2YgdGhlIHJvb3QgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV1NETERvY3VtZW50cyBjb250YWluaW5nIGFsbCBvZiB0aGUgdW5pcXVlIGZpbGVzIGluIHRoZSBkZXNjcmlwdGlvbi4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETERvY3VtZW50W10gcGFyc2VEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBFbGVtZW50IGRlZkVsKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgaW50IGluaXRpYWxJbXBvcnRBcnJheVNpemUgPSAyMDsKLSAgICBMaXN0W10gZmlsZXNBdERlcHRoID0gbmV3IEFycmF5TGlzdFtpbml0aWFsSW1wb3J0QXJyYXlTaXplXTsKLSAgICBNYXAgZmlsZXNJbXBvcnRpbmcgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgU29ydGVkU2V0IHBhcnNlZEltcG9ydHMgPSBuZXcgVHJlZVNldCgpOwotICAgIFNvcnRlZFNldCBpbXBvcnRzVG9QYXJzZSA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgaW50IG1heGRlcHRoID0gMDsKLQotICAgIFdTRExEb2N1bWVudCByb290ZG9jID0gbmV3IFdTRExEb2N1bWVudChkb2N1bWVudEJhc2VVUkksIGRlZkVsLCAwLCBtZXNzYWdlZ2VuZXJhdG9yLCB3c2RsdmFsaW5mbyk7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHJvb3Rkb2MuZ2V0RGVmaW5pdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIEltcG9ydEhvbGRlciByb290SW1wb3J0ID0gbmV3IEltcG9ydEhvbGRlcih0YXJnZXROYW1lc3BhY2UsIGRvY3VtZW50QmFzZVVSSSwgZG9jdW1lbnRCYXNlVVJJLCByb290ZG9jLCAwLCBudWxsLCBtZXNzYWdlZ2VuZXJhdG9yLCB3c2RsdmFsaW5mbyk7Ci0gICAgcm9vdEltcG9ydC5jcmVhdGVXU0RMSW1wb3J0KHJvb3Rkb2MpOwotICAgIHBhcnNlZEltcG9ydHMuYWRkKHJvb3RJbXBvcnQpOwotICAgIExpc3Qgcm9vdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZmlsZXNJbXBvcnRpbmcucHV0KHJvb3RJbXBvcnQuZ2V0TG9jYXRpb24oKSwgbmV3IEFycmF5TGlzdCgpKTsKLSAgICByb290TGlzdC5hZGQocm9vdGRvYyk7Ci0gICAgZmlsZXNBdERlcHRoWzBdID0gcm9vdExpc3Q7Ci0gICAgaW1wb3J0c1RvUGFyc2UuYWRkQWxsKHJvb3Rkb2MuZ2V0SW1wb3J0cygpKTsKLSAgICBTZXQgaW1wcyA9IHJvb3Rkb2MuZ2V0SW1wb3J0cygpOwotICAgIEl0ZXJhdG9yIGltcEl0ZXIgPSBpbXBzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUoaW1wSXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSW1wb3J0SG9sZGVyIGltcCA9IChJbXBvcnRIb2xkZXIpaW1wSXRlci5uZXh0KCk7Ci0gICAgICBMaXN0IHRlbXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgdGVtcExpc3QuYWRkKGltcC5nZXRJbXBvcnRpbmdEb2N1bWVudCgpKTsKLSAgICAgIGZpbGVzSW1wb3J0aW5nLnB1dChpbXAuZ2V0TG9jYXRpb24oKSwgdGVtcExpc3QpOwotICAgIH0KLSAgICAKLSAgICB3aGlsZSghaW1wb3J0c1RvUGFyc2UuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIEltcG9ydEhvbGRlciBpbXAgPSAoSW1wb3J0SG9sZGVyKWltcG9ydHNUb1BhcnNlLmZpcnN0KCk7Ci0gICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBpbml0aWFsaXplIHRoZSBpbXBvcnQgaGVyZSBzbyBlYWNoIGltcG9ydAotICAgICAgLy8gaXMgb25seSBjcmVhdGVkIG9uY2UuIEluIHRoZSBjYXNlIG9mIHJlY2lwcmljYWwgaW1wb3J0cyB0aGlzCi0gICAgICAvLyBhdm9pZHMgYW4gaW5maW5pdGUgbG9vcC4KLSAgICAgIGltcC5pbml0aWFsaXplKCk7Ci0gICAgICBXU0RMRG9jdW1lbnQgaW1wRG9jID0gaW1wLmdldFdTRExEb2N1bWVudCgpOwotICAgICAgCi0gICAgICBpbXBvcnRzVG9QYXJzZS5yZW1vdmUoaW1wKTsKLSAgICAgIAotICAgICAgcGFyc2VkSW1wb3J0cy5hZGQoaW1wKTsKLSAgICAgIAotICAgICAgLy8gQWRkIG5ldyBpbXBvcnRzIHRvIHRoZSBsaXN0IG9mIGltcG9ydHMgdG8gcGFyc2UuCi0gICAgICAvLyBSZW1vdmUgYWxsIHRoZSBpbXBvcnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcGFyc2VkLgotICAgICAgaWYoaW1wRG9jICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIEluY3JlYXRlIGltcG9ydCBhcnJheSBpZiBuZWNlc3NhcnkuCi0gICAgICAgIGlmKGltcC5nZXREZXB0aCgpID49IGluaXRpYWxJbXBvcnRBcnJheVNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0W10gdGVtcEFycmF5ID0gbmV3IExpc3RbZmlsZXNBdERlcHRoLmxlbmd0aCArIGluaXRpYWxJbXBvcnRBcnJheVNpemVdOwotICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZmlsZXNBdERlcHRoLCAwLCB0ZW1wQXJyYXksIDAsIGZpbGVzQXREZXB0aC5sZW5ndGgpOwotICAgICAgICAgIGZpbGVzQXREZXB0aCA9IHRlbXBBcnJheTsKLSAgICAgICAgfQotICAgICAgICAvLyBDcmVhdGUgdGhlIGxpc3QgZm9yIHRoZSBkZXB0aCBpZiBuZWNlc3NhcnkuCi0gICAgICAgIGludCBpbXBEZXB0aCA9IGltcC5nZXREZXB0aCgpOwotICAgICAgICBpZihmaWxlc0F0RGVwdGhbaW1wRGVwdGhdID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZihtYXhkZXB0aCA8IGltcERlcHRoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heGRlcHRoID0gaW1wRGVwdGg7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZpbGVzQXREZXB0aFtpbXBEZXB0aF0gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmlsZXNBdERlcHRoW2ltcC5nZXREZXB0aCgpXS5hZGQoaW1wRG9jKTsKLSAgICAgICAgCi0gICAgICAgIFNldCBpbXBvcnRzID0gaW1wRG9jLmdldEltcG9ydHMoKTsKLSAgICAgICAgSW1wb3J0SG9sZGVyW10gaW1wb3J0c0FycmF5ID0gKEltcG9ydEhvbGRlcltdKWltcG9ydHMudG9BcnJheShuZXcgSW1wb3J0SG9sZGVyW2ltcG9ydHMuc2l6ZSgpXSk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpbXBvcnRzQXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBJbXBvcnRIb2xkZXIgaWggPSBpbXBvcnRzQXJyYXlbaV07Ci0gICAgICAgICAgLy8gSWYgYWxyZWFkeSBwYXJzZWQsIGFkZCB0aGUgZGVmaW5pdGlvbiBpbXBvcnRpbmcgdGhpcyBmaWxlIHRvIHRoZSBsaXN0LgotICAgICAgICAgIGlmKGZpbGVzSW1wb3J0aW5nLmNvbnRhaW5zS2V5KGloLmdldExvY2F0aW9uKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoTGlzdClmaWxlc0ltcG9ydGluZy5nZXQoaWguZ2V0TG9jYXRpb24oKSkpLmFkZChpaC5nZXRJbXBvcnRpbmdEb2N1bWVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBpdCB0byB0aGUgbGlzdCB0byBwYXJzZS4KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQWRkIHRoaXMgaW1wb3J0IHRvIHRoZSBsaXN0IG9mIGZpbGVzIGltcG9ydGluZyBsaXN0LgotICAgICAgICAgICAgTGlzdCB0ZW1wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHRlbXBMaXN0LmFkZChpaC5nZXRJbXBvcnRpbmdEb2N1bWVudCgpKTsKLSAgICAgICAgICAgIGZpbGVzSW1wb3J0aW5nLnB1dChpaC5nZXRMb2NhdGlvbigpLCB0ZW1wTGlzdCk7Ci0gICAgICAgICAgICBpbXBvcnRzVG9QYXJzZS5hZGQoaWgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBBZGQgYWxsIG9mIHRoZSBpbXBvcnRzIHRvIHRoZSByZXNwZWN0aXZlIGRvY3VtZW50cy4KLSAgICBJdGVyYXRvciBpbXBvcnRFbGVtZW50c0l0ZXIgPSBwYXJzZWRJbXBvcnRzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUoaW1wb3J0RWxlbWVudHNJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJbXBvcnRIb2xkZXIgaW1wID0gKEltcG9ydEhvbGRlcilpbXBvcnRFbGVtZW50c0l0ZXIubmV4dCgpOwotICAgICAgTGlzdCBmaWxlcyA9IChMaXN0KWZpbGVzSW1wb3J0aW5nLmdldChpbXAuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICBJdGVyYXRvciBmaWxlc0l0ZXIgPSBmaWxlcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUoZmlsZXNJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgV1NETERvY3VtZW50IGRvYyA9IChXU0RMRG9jdW1lbnQpZmlsZXNJdGVyLm5leHQoKTsKLSAgICAgICAgCi0gICAgICAgIERlZmluaXRpb25JbXBsIGRlZiA9IChEZWZpbml0aW9uSW1wbClkb2MuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICBJbXBvcnQgaW1wRWxlbSA9IGltcC5nZXRJbXBvcnQoKTsKLSAgICAgICAgaWYoaW1wRWxlbSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZGVmLmFkZEltcG9ydChpbXBFbGVtKTsKLSAgICAgICAgICBpZighaW1wLmlzV1NETEZpbGVJbXBvcnQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkb2MuYWRkU2NoZW1hcyhpbXAuZ2V0U2NoZW1hcygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIFBhcnNlIHRoZSBXU0RMIGRvY3VtZW50cy4KLSAgICAvLyBQYXJzZSB0aGUgTWVzc2FnZXMuCi0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgZG9jLnBhcnNlTWVzc2FnZXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUGFyc2UgdGhlIFBvcnR0eXBlcy4KLSAgICBmb3IoaW50IGkgPSBtYXhkZXB0aDsgaSA+PTA7IGktLSkKLSAgICB7Ci0gICAgICBMaXN0IGRvY3MgPSBmaWxlc0F0RGVwdGhbaV07Ci0gICAgICBJdGVyYXRvciBkb2NzSXRlciA9IGRvY3MuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKGRvY3NJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgV1NETERvY3VtZW50IGRvYyA9IChXU0RMRG9jdW1lbnQpZG9jc0l0ZXIubmV4dCgpOwotICAgICAgICBkb2MucGFyc2VQb3J0dHlwZXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUGFyc2UgdGhlIEJpbmRpbmdzLgotICAgIGZvcihpbnQgaSA9IG1heGRlcHRoOyBpID49MDsgaS0tKQotICAgIHsKLSAgICAgIExpc3QgZG9jcyA9IGZpbGVzQXREZXB0aFtpXTsKLSAgICAgIEl0ZXJhdG9yIGRvY3NJdGVyID0gZG9jcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUoZG9jc0l0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBXU0RMRG9jdW1lbnQgZG9jID0gKFdTRExEb2N1bWVudClkb2NzSXRlci5uZXh0KCk7Ci0gICAgICAgIGRvYy5wYXJzZUJpbmRpbmdzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFBhcnNlIHRoZSBTZXJ2aWNlcy4KLSAgICBmb3IoaW50IGkgPSBtYXhkZXB0aDsgaSA+PTA7IGktLSkKLSAgICB7Ci0gICAgICBMaXN0IGRvY3MgPSBmaWxlc0F0RGVwdGhbaV07Ci0gICAgICBJdGVyYXRvciBkb2NzSXRlciA9IGRvY3MuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKGRvY3NJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgV1NETERvY3VtZW50IGRvYyA9IChXU0RMRG9jdW1lbnQpZG9jc0l0ZXIubmV4dCgpOwotICAgICAgICBkb2MucGFyc2VTZXJ2aWNlcygpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBQYXJzZSB0aGUgRXh0ZW5zaWJpbGl0eSBFbGVtZW50cy4KLSAgICBmb3IoaW50IGkgPSBtYXhkZXB0aDsgaSA+PTA7IGktLSkKLSAgICB7Ci0gICAgICBMaXN0IGRvY3MgPSBmaWxlc0F0RGVwdGhbaV07Ci0gICAgICBJdGVyYXRvciBkb2NzSXRlciA9IGRvY3MuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKGRvY3NJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgV1NETERvY3VtZW50IGRvYyA9IChXU0RMRG9jdW1lbnQpZG9jc0l0ZXIubmV4dCgpOwotICAgICAgICBkb2MucGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgTGlzdCB3c2RsRG9jcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IoaW50IGkgPSBtYXhkZXB0aDsgaSA+PTA7IGktLSkKLSAgICB7Ci0gICAgICBMaXN0IGRvY3MgPSBmaWxlc0F0RGVwdGhbaV07Ci0gICAgICBJdGVyYXRvciBkb2NzSXRlciA9IGRvY3MuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKGRvY3NJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgV1NETERvY3VtZW50IGRvYyA9IChXU0RMRG9jdW1lbnQpZG9jc0l0ZXIubmV4dCgpOwotICAgICAgICB3c2RsRG9jcy5hZGQoZG9jKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIChXU0RMRG9jdW1lbnRbXSl3c2RsRG9jcy50b0FycmF5KG5ldyBXU0RMRG9jdW1lbnRbd3NkbERvY3Muc2l6ZSgpXSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gaW5wdXRTb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgcmV0cmlldmVkLgotICAgKiBAcGFyYW0gZGVzYyBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRvY3VtZW50IGJlaW5nIHJldHJpZXZlZC4KLSAgICogQHJldHVybiBUaGUgV1NETCBkb2N1bWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIERvY3VtZW50IGdldERvY3VtZW50KElucHV0U291cmNlIGlucHV0U291cmNlLCBTdHJpbmcgZGVzYykgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IFN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbigpCi0gICAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBYTUxFcnJvclJlcG9ydGVyIGNyZWF0ZUVycm9yUmVwb3J0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYTUxFcnJvclJlcG9ydGVyKCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMsIHNob3J0IHNldmVyaXR5KSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJvb2xlYW4gcmVwb3J0RXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscygiUHJlbWF0dXJlRU9GIikpCi0gICAgICAgICAgICAgICB7ICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcikKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdXBlci5yZXBvcnRFcnJvcihkb21haW4sIGtleSwgYXJndW1lbnRzLCBzZXZlcml0eSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgCi0gICAgICBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpCi0gICAgICB7Ci0gICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICAgICAgICovCi0gICAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gICAgICAgICAgfQotICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gICAgICAgICAgfQotICAgICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gICAgICAgICAgfQotICAgICAgfTsKLQotICAgICAgRE9NUGFyc2VyIGJ1aWxkZXIgPSBuZXcgTGluZU51bWJlckRPTVBhcnNlcihjb25maWd1cmF0aW9uKTsKLSAgICAgIGJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcik7Ci0gICAgICBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLSAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uUEFSU0VSX0VSUk9SLCAiUHJvYmxlbSBwYXJzaW5nICciICsgZGVzYyArICInLiIsIHQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGEgV1NETCBkb2N1bWVudCB1c2luZyBhIGNvbnRleHQgVVJJIGFuZCBmaWxlIFVSSS4KLSAgICogCi0gICAqIEBwYXJhbSBjb250ZXh0VVJJIFRoZSBjb250ZXh0IFVSSSB0byB1c2UuCi0gICAqIEBwYXJhbSB3c2RsVVJJIFRoZSBXU0RMIFVSSSB0byB1c2UuCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV1NETERvY3VtZW50cy4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50W10gcmVhZFdTREwoU3RyaW5nIGNvbnRleHRVUkksIFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIGNvbnRleHRVUkwgPSAoY29udGV4dFVSSSAhPSBudWxsKSA/IFN0cmluZ1V0aWxzLmdldFVSTChudWxsLCBjb250ZXh0VVJJKSA6IG51bGw7Ci0gICAgICBVUkwgdXJsID0gU3RyaW5nVXRpbHMuZ2V0VVJMKGNvbnRleHRVUkwsIHdzZGxVUkkpOwotICAgICAgUmVhZGVyIHJlYWRlciA9IFN0cmluZ1V0aWxzLmdldENvbnRlbnRBc1JlYWRlcih1cmwpOwotICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UocmVhZGVyKTsKLSAgICAgIERvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGlucHV0U291cmNlLCB3c2RsVVJJKTsKLSAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgV1NETERvY3VtZW50W10gd3NkbERvY3MgPSBudWxsOwotICAgICAgLy8gb25seSBwYXJzZSB0aGUgZG9jdW1lbnQgaWYgaXQgaXNuJ3QgZW1wdHkKLSAgICAgIGlmKGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKQotICAgICAgIHsgICAgICAKLSAgICAgICAgd3NkbERvY3MgPSByZWFkV1NETCh1cmwudG9TdHJpbmcoKSwgZG9jKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB3c2RsRG9jczsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBlOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oCi0gICAgICAgIFdTRExFeGNlcHRpb24uT1RIRVJfRVJST1IsCi0gICAgICAgICJVbmFibGUgdG8gcmVzb2x2ZSBpbXBvcnRlZCBkb2N1bWVudCBhdCAnIiArIHdzZGxVUkkgKyAiJy4iLAotICAgICAgICB0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtZXNzYWdlZ2VuZXJhdG9yIGZvciB0aGUgcmVhZGVyLgotICAgKiAKLSAgICogQHBhcmFtIG1nIFRoZSBtZXNzYWdlIGdlbmVyYXRvciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlR2VuZXJhdG9yKE1lc3NhZ2VHZW5lcmF0b3IgbWcpCi0gIHsKLSAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbWc7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWFkIHRoZSBXU0RMIGRvY3VtZW50IGFjY2Vzc2libGUgdmlhIHRoZSBzcGVjaWZpZWQKLSAgICogVVJJIGludG8gYSBXU0RMIGRlZmluaXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB3c2RsVVJJIEEgVVJJIHBvaW50aW5nIHRvIGEgV1NETCBmaWxlLgotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdTRExEb2N1bWVudHMuCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50W10gcmVhZFdTREwoU3RyaW5nIHdzZGxVUkkpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcmVhZFdTREwobnVsbCwgd3NkbFVSSSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgV1NETCBkb2N1bWVudCBkZXNjcmliZWQgYnkgYSBVUkkgYW5kIGl0cyBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSBUaGUgVVJJIG9mIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbnNFbGVtZW50IFRoZSBkZWZpbml0aW9ucyBlbGVtZW50IGZvciB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHJldHVybiBBbiBhcnJheSBvZiBXU0RMRG9jdW1lbnRzLgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBXU0RMRG9jdW1lbnRbXSByZWFkV1NETChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGRlZmluaXRpb25zRWxlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHBhcnNlRG9jdW1lbnQoZG9jdW1lbnRCYXNlVVJJLCBkZWZpbml0aW9uc0VsZW1lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIHNwZWNpZmllZCBXU0RMIGRvY3VtZW50LgotICAgKgotICAgKiBAcGFyYW0gZG9jdW1lbnRCYXNlVVJJIFRoZSBkb2N1bWVudCBiYXNlIFVSSS4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCBUaGUgV1NETCBkb2N1bWVudC4KLSAgICogQHJldHVybiBBbiBhcnJheSBvZiBXU0RMRG9jdW1lbnRzLgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudFtdIHJlYWRXU0RMKFN0cmluZyBkb2N1bWVudEJhc2VVUkksIERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHJlYWRXU0RMKGRvY3VtZW50QmFzZVVSSSwgd3NkbERvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgfQotICAKLSAgCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9odHRwL0hUVFBWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL2h0dHAvSFRUUFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTc3NjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL2h0dHAvSFRUUFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5odHRwOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbzsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ0lucHV0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ09wZXJhdGlvbkltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLlBvcnRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3NJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbkltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZEltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnRJbXBsOwotCi0vKioKLSAqIFRoZSBIVFRQIHZhbGlkYXRvciBpcyBhbiBleHRlbnNpb24gV1NETCB2YWxpZGF0b3IgdGhhdCB2YWxpZGF0ZXMgYWxsIGVsZW1lbnRzIGluIHRoZSBIVFRQCi0gKiBuYW1lc3BhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQVmFsaWRhdG9yIGltcGxlbWVudHMgSVdTREwxMVZhbGlkYXRvcgotewotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfUE9SVF9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfRUxFTUVOVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfSU5QVVRfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0lOUFVUX0VMRU1FTlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9IVFRQX0VMRU1FTlRfRk9SX0xPQ0FUSU9OID0gIl9FUlJPUl9JTlZBTElEX0hUVFBfRUxFTUVOVF9GT1JfTE9DQVRJT04iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MgPSAiX0VSUk9SX05PX0xPQ0FUSU9OX0ZPUl9BRERSRVNTIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9BRERSRVNTID0gIl9FUlJPUl9OT19IVFRQQklORElOR19GT1JfQUREUkVTUyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfVkVSQiA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1ZFUkIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9MT0NBVElPTl9VUkkgPSAiX0VSUk9SX0lOVkFMSURfTE9DQVRJT05fVVJJIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9PUEVSQVRJT04gPSAiX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9PUEVSQVRJT04iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9UX09OTFlfRUxFTUVOVF9ERUZJTkVEID0gIl9FUlJPUl9OT1RfT05MWV9FTEVNRU5UX0RFRklORUQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fSFRUUE9QRVJBVElPTl9GT1JfVVJMID0gIl9FUlJPUl9OT19IVFRQT1BFUkFUSU9OX0ZPUl9VUkwiOwotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEdFVCA9ICJHRVQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBQT1NUID0gIlBPU1QiOwotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFFVT1RFID0gIiciOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsKLQotICBwcml2YXRlIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIFdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICAvLyBQb3J0IEhUVFAgZGVmaW5pdGlvbgotICAgIC8vIG1ha2Ugc3VyZSBldmVyeSBwb3J0IGhhcyBvbmx5IG9uZSBhZGRyZXNzIGVsZW1lbnQgZGVmaW5lZAotICAgIC8vIGlmIGl0IGlzIGFuIGFkZHJlc3MgZWxlbWVudCwgdmFsaWRhdGUgaXQKLSAgICBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBQb3J0SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IEhUVFBBZGRyZXNzSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVBZGRyZXNzKGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfUE9SVF9FTEVNRU5ULCBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwKLSAgICAgICAgICBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBCaW5kaW5nIEhUVFAgZGVmaW5pdGlvbgotICAgIC8vIEEgSFRUUCBCaW5kaW5nIG11c3QgaGF2ZSBhIHZlcmIgb2YgR0VUIG9yIFBPU1QKLSAgICBlbHNlIGlmIChwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gSFRUUEJpbmRpbmdJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUJpbmRpbmcoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBCaW5kaW5nIE9wZXJhdGlvbiBIVFRQIGRlZmluaXRpb24KLSAgICAvLyBBIEhUVFAgT3BlcmF0aW9uIGhhcyBhIGxvY2F0aW9uIHVyaSBkZWZpbmVkCi0gICAgZWxzZSBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBCaW5kaW5nT3BlcmF0aW9uSW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IEhUVFBPcGVyYXRpb25JbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZU9wZXJhdGlvbihlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCwKLSAgICAgICAgICAgIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgfQotCi0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0lucHV0SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICAvLyB2YWxpZGF0ZSB0aGUgSFRUUCB1cmxFbmNvZGVkIGFuZCB1cmxSZXBsYWNlbWVudAotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBIVFRQVXJsRW5jb2RlZEltcGwuY2xhc3MgfHwgZWxlbWVudC5nZXRDbGFzcygpID09IEhUVFBVcmxSZXBsYWNlbWVudEltcGwuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlSHR0cFVybChlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfSU5QVVRfRUxFTUVOVCwgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksCi0gICAgICAgICAgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gaW4gdGhpcyBjYXNlIHRoZXJlIGhhcyBiZWVuIGEgSFRUUCBlbGVtZW50IGRlZmluZWQgdGhhdCBpcyBub3QgZGVmaW5lZCBmb3IgdGhpcyBwb2ludCBpbiB0aGUgSFRUUCBuYW1lc3BhY2UKLSAgICBlbHNlCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgX0VSUk9SX0lOVkFMSURfSFRUUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiwKLSAgICAgICAgICBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwKLSAgICAgICAgZWxlbWVudCk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS52YWxpZGF0b3IuSVdTREwxMVZhbGlkYXRvciNzZXRSZXNvdXJjZUJ1bmRsZShqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIGlmIChtZXNzYWdlZ2VuZXJhdG9yID09IG51bGwpCi0gICAgewotICAgICAgbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgdGhlIEhUVFAgYWRkcmVzcyBoYXMgYSB2YWx1ZSBzcGVjaWZpZWQgZm9yIGl0J3MgdXJpIGFuZCB0aGF0IHRoZXJlIGlzIGEgSFRUUCBCaW5kaW5nIGRlZmluZWQKLSAgICogZm9yIHRoZSBCaW5kaW5nIHNwZWNpZmllZCBpbiB0aGUgcG9ydC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVFRQIGFkZHJlc3MgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgVGhlIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgSFRUUCBhZGRyZXNzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3Jjb250cm9sbGVyIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciBpbiBjaGFyZ2Ugb2YgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQWRkcmVzcyhPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgSFRUUEFkZHJlc3NJbXBsIGhhID0gKEhUVFBBZGRyZXNzSW1wbCllbGVtZW50OwotCi0gICAgU3RyaW5nIHVyaSA9IGhhLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHNJZ25vcmVDYXNlKEVNUFRZX1NUUklORykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MpLCBoYSk7Ci0gICAgfQotCi0gICAgUG9ydCBwb3J0ID0gKFBvcnQpcGFyZW50cy5nZXQoMCk7Ci0KLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLQotICAgIGlmICghaGFzSHR0cEJpbmRpbmcoYmluZGluZykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9BRERSRVNTLAotICAgICAgICAgIFFVT1RFICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUsCi0gICAgICAgICAgUVVPVEUgKyBwb3J0LmdldE5hbWUoKSArIFFVT1RFKSwKLSAgICAgICAgaGEpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhlIEhUVFAgQmluZGluZyBkZWZpbmVkIGlzIHZhbGlkLiBBIEhUVFAgQmluZGluZyBtdXN0IGhhdmUgYSB2ZXJiIG9mIEdFVCBvciBQT1NULgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUVFAgYmluZGluZyBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBUaGUgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBIVFRQIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbGlkYXRvcmNvbnRyb2xsZXIgVGhlIHZhbGlkYXRvciBjb250cm9sbGVyIGluIGNoYXJnZSBvZiB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCaW5kaW5nKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIFdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBIVFRQQmluZGluZ0ltcGwgaGIgPSAoSFRUUEJpbmRpbmdJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgdmVyYiA9IGhiLmdldFZlcmIoKTsKLQotICAgIGlmICh2ZXJiICE9IG51bGwgJiYgIXZlcmIuZXF1YWxzKEdFVCkgJiYgIXZlcmIuZXF1YWxzKFBPU1QpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQklORElOR19WRVJCLCBRVU9URSArIHZlcmIgKyBRVU9URSksIGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBbiBvcGVyYXRpb24gbXVzdCBoYXZlIGEgbG9jYXRpb24gZGVmaW5lZC4gQSBIVFRQIEJpbmRpbmcgbXVzdCBiZSBzcGVjaWZpZWQgdG8gdXNlIGFuIG9wZXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVFRQIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBUaGUgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBIVFRQIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU9wZXJhdGlvbihPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgSFRUUE9wZXJhdGlvbiBobyA9IChIVFRQT3BlcmF0aW9uKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgbG9jYXRpb25VUkkgPSBoby5nZXRMb2NhdGlvblVSSSgpOwotCi0gICAgaWYgKGxvY2F0aW9uVVJJICE9IG51bGwgJiYgbG9jYXRpb25VUkkuZXF1YWxzSWdub3JlQ2FzZShFTVBUWV9TVFJJTkcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfTE9DQVRJT05fVVJJKSwgZWxlbWVudCk7Ci0gICAgfQotCi0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpcGFyZW50cy5nZXQoMSk7Ci0gICAgaWYgKCFoYXNIdHRwQmluZGluZyhiaW5kaW5nKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX09QRVJBVElPTiwgUVVPVEUgKyBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksCi0gICAgICAgIGhvKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIEhUVFAgdXJsUmVwbGFjZW1lbnQgb3IgdXJsRW5jb2RlZC4gRW5zdXJlIHRoZSBIVFRQIG9wZXJhdGlvbiBoYXMgYmVlbiBkZWZpbmVkLiAKLSAgICogRW5zdXJlIHRoYXQgZWl0aGVyIGVsZW1lbnQgaXMgdGhlIG9ubHkgZWxlbWVudCBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRUUCBiaW5kaW5nIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBUaGUgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBIVFRQIGJpbmRpbmcgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3Jjb250cm9sbGVyIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciBpbiBjaGFyZ2Ugb2YgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSHR0cFVybChPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbilwYXJlbnRzLmdldCgxKTsKLQotICAgIFN0cmluZyBlbGVtZW50TmFtZTsKLSAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IEhUVFBVcmxFbmNvZGVkSW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBlbGVtZW50TmFtZSA9ICJ1cmxFbmNvZGVkIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IEhUVFBVcmxSZXBsYWNlbWVudEltcGwuY2xhc3MpCi0gICAgewotICAgICAgZWxlbWVudE5hbWUgPSAidXJsUmVwbGFjZW1lbnQiOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWxlbWVudE5hbWUgPSBFTVBUWV9TVFJJTkc7Ci0gICAgfQotCi0gICAgQmluZGluZ0lucHV0IGlucHV0ID0gKEJpbmRpbmdJbnB1dClwYXJlbnRzLmdldCgwKTsKLSAgICBpZiAoaW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuc2l6ZSgpICE9IDEpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9UX09OTFlfRUxFTUVOVF9ERUZJTkVELCBlbGVtZW50TmFtZSksIGVsZW1lbnQpOwotICAgIH0KLQotICAgIGlmICghaGFzSHR0cE9wZXJhdGlvbihvcGVyYXRpb24pKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT19IVFRQT1BFUkFUSU9OX0ZPUl9VUkwsIFFVT1RFICsgb3BlcmF0aW9uLmdldE5hbWUoKSArIFFVT1RFLCBlbGVtZW50TmFtZSksCi0gICAgICAgIGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIEJpbmRpbmdPcGVyYXRpb24gdGVsbHMgd2hldGhlciBpdCBoYXMgYSBIVFRQIG9wZXJhdGlvbiBkZWZpbmVkIGZvciBpdC4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nIFRoZSBIVFRQIGJpbmRpbmcgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhbiBIVFRQIG9wZXJhdGlvbiBkZWZpbmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNIdHRwT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgZXh0ZWxlbXMgPSBvcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBpZiAoZXh0ZWxlbXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaWV4dGVsZW1zID0gZXh0ZWxlbXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGlleHRlbGVtcy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaWV4dGVsZW1zLm5leHQoKS5nZXRDbGFzcygpID09IEhUVFBPcGVyYXRpb25JbXBsLmNsYXNzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBiaW5kaW5nIHJldHVybnMgdHJ1ZSBpZiBpdCBoYXMgYSBIVFRQIGJpbmRpbmcgZGVmaW5lZC4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nIFRoZSBiaW5kaW5nIHRvIGNoZWNrLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYW4gSFRUUCBiaW5kaW5nIGRlZmluZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNIdHRwQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgZXh0ZWxlbXMgPSBiaW5kaW5nLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgaWYgKGV4dGVsZW1zICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGlleHRlbGVtcyA9IGV4dGVsZW1zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpZXh0ZWxlbXMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlleHRlbGVtcy5uZXh0KCkuZ2V0Q2xhc3MoKSA9PSBIVFRQQmluZGluZ0ltcGwuY2xhc3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvbWltZS9NSU1FVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9taW1lL01JTUVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNjhjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9taW1lL01JTUVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5taW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbzsKLQotLyoqCi0gKiBUaGUgTUlNRSB2YWxpZGF0b3IgcGx1Z3MgaW50byB0aGUgV1NETCB2YWxpZGF0b3IgdG8gcHJvdmlkZQotICogdmFsaWRhdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGluIGEgV1NETCBkb2N1bWVudCB3aXRoaW4gdGhlIE1JTUUgbmFtZXNwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgTUlNRVZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIFdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLQotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS52YWxpZGF0b3IuSVdTREwxMVZhbGlkYXRvciNzZXRSZXNvdXJjZUJ1bmRsZShqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIGlmIChtZXNzYWdlZ2VuZXJhdG9yID09IG51bGwpCi0gICAgewotICAgICAgbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJiKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3NvYXAvU09BUFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvc29hcC9TT0FQVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MmRiY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvc29hcC9TT0FQVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnNvYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbzsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nRmF1bHRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ0lucHV0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ09wZXJhdGlvbkltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLkJpbmRpbmdPdXRwdXRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5Qb3J0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdEltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uSW1wbDsKLQotLyoqCi0gKiBUaGUgU09BUCB2YWxpZGF0b3IgcGx1Z3MgaW50byB0aGUgV1NETCB2YWxpZGF0b3IgdG8gcHJvdmlkZQotICogdmFsaWRhdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGluIGEgV1NETCBkb2N1bWVudCB3aXRoaW4gdGhlIFNPQVAgbmFtZXNwYWNlLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNPQVBWYWxpZGF0b3IgaW1wbGVtZW50cyBJV1NETDExVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfSEVBREVSX0JPRFlfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9IRUFERVJfQk9EWV9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9GQVVMVF9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfU09BUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiA9ICJfRVJST1JfSU5WQUxJRF9TT0FQX0VMRU1FTlRfRk9SX0xPQ0FUSU9OIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX0xPQ0FUSU9OX0ZPUl9BRERSRVNTID0gIl9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQUREUkVTUyA9ICJfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX0FERFJFU1MiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1NUWUxFID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfU1RZTEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1VSSSA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1VSSSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX09QRVJBVElPTl9TVFlMRSA9ICJfRVJST1JfSU5WQUxJRF9PUEVSQVRJT05fU1RZTEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiA9ICJfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JPRFlfRU5DT0RJTkdfU1RZTEUgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9FTkNPRElOR19TVFlMRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JPRFlfTkFNRVNQQUNFX0ZPUl9FTkNPREVEID0gIl9FUlJPUl9JTlZBTElEX0JPRFlfTkFNRVNQQUNFX0ZPUl9FTkNPREVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQk9EWV9VU0UgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9VU0UiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfTk9UX1RZUEUgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX05PVF9UWVBFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX1VOREVGSU5FRCA9ICJfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9CT0RZID0gIl9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQk9EWSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfTUVTU0FHRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9NRVNTQUdFX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfUEFSVF9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9QQVJUX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfVVNFX1VOREVGSU5FRCA9ICJfRVJST1JfSEVBREVSX1VTRV9VTkRFRklORUQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSX05BTUVTUEFDRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9OQU1FU1BBQ0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIgPSAiX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSRkFVTFRfTUVTU0FHRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUkZBVUxUX01FU1NBR0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0hFQURFUkZBVUxUX1BBUlRfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9QQVJUX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJGQVVMVF9VU0VfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9VU0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0hFQURFUkZBVUxUX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9FTkNPRElOR1NUWUxFX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRSA9ICJfRVJST1JfSU5WQUxJRF9GQVVMVF9OQU1FIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfRU5DT0RJTkdfU1RZTEUgPSAiX0VSUk9SX0lOVkFMSURfRkFVTFRfRU5DT0RJTkdfU1RZTEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9GQVVMVF9OQU1FU1BBQ0VfRk9SX0VOQ09ERUQgPSAiX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRVNQQUNFX0ZPUl9FTkNPREVEIjsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVOQ09ERUQgPSAiZW5jb2RlZCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIExJVEVSQUwgPSAibGl0ZXJhbCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJQQyA9ICJycGMiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBET0NVTUVOVCA9ICJkb2N1bWVudCI7Ci0gIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBRVU9URSA9ICInIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7Ci0KLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLSAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvciN2YWxpZGF0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuTGlzdCwgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2RsMTEuV1NETDExVmFsaWRhdGlvbkluZm8pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgLy8gUG9ydCBTT0FQIGRlZmluaXRpb24KLSAgICAvLyBtYWtlIHN1cmUgZXZlcnkgcG9ydCBoYXMgb25seSBvbmUgYWRkcmVzcyBlbGVtZW50IGRlZmluZWQKLSAgICAvLyBpZiBpdCBpcyBhbiBhZGRyZXNzIGVsZW1lbnQsIHZhbGlkYXRlIGl0Ci0gICAgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gUG9ydEltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBTT0FQQWRkcmVzc0ltcGwuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlQWRkcmVzcyhlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCwgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEJpbmRpbmcgU09BUCBkZWZpbml0aW9uCi0gICAgLy8gQSBTT0FQIEJpbmRpbmcgbXVzdCBoYXZlIGEgc3R5bGUgb3IgcnBjIG9yIGRvY3VtZW50IG9yIG5vIHN0eWxlIGRlZmluZWQgLSBkZWZhdWx0cyB0byBkb2N1bWVudAotICAgIC8vIE11c3QgaGF2ZSBhIHRyYW5zcG9ydCB1cmkgZGVmaW5lZCAtIGNoZWNrIGlmIHRoZSB1cmkgaXMgZW1wdHkKLSAgICBlbHNlIGlmIChwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gU09BUEJpbmRpbmdJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUJpbmRpbmcoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gQmluZGluZyBPcGVyYXRpb24gU09BUCBkZWZpbml0aW9uCi0gICAgLy8gQSBTT0FQIE9wZXJhdGlvbiBtYXkgaGF2ZSBhIHN0eWxlIGRlZmluZWQgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGRvY3VtZW50IG9yIHJwYwotICAgIC8vIGFuZCBtYXkgaGF2ZSBhIHNvYXBBY3Rpb24gdXJpIGRlZmluZWQKLSAgICBlbHNlIGlmIChwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdPcGVyYXRpb25JbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gU09BUE9wZXJhdGlvbkltcGwuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlT3BlcmF0aW9uKGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgIF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0VMRU1FTlQsCi0gICAgICAgICAgICBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZSBpZiAoCi0gICAgICBwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdJbnB1dEltcGwuY2xhc3MgfHwgcGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBCaW5kaW5nT3V0cHV0SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICAvLyB2YWxpZGF0ZSB0aGUgU09BUCBib2R5Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IFNPQVBCb2R5SW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVCb2R5KGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotICAgICAgLy8gdmFsaWF0ZSB0aGUgU09BUCBoZWFkZXIKLSAgICAgIGVsc2UgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBTT0FQSGVhZGVySW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVIZWFkZXIoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9IRUFERVJfQk9EWV9FTEVNRU5ULCBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0ZhdWx0SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IFNPQVBGYXVsdEltcGwuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlRmF1bHQoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9GQVVMVF9FTEVNRU5ULCBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGluIHRoaXMgY2FzZSB0aGVyZSBoYXMgYmVlbiBhIFNPQVAgZWxlbWVudCBkZWZpbmVkIHRoYXQgaXMgbm90IGRlZmluZWQgZm9yIHRoaXMgcG9pbnQgaW4gdGhlIFNPQVAgbmFtZXNwYWNlCi0gICAgZWxzZQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgIF9FUlJPUl9JTlZBTElEX1NPQVBfRUxFTUVOVF9GT1JfTE9DQVRJT04sCi0gICAgICAgICAgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIGVsZW1lbnQpOwotICAgIH0KLQotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS52YWxpZGF0b3IuSVdTREwxMVZhbGlkYXRvciNzZXRSZXNvdXJjZUJ1bmRsZShqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIGlmIChtZXNzYWdlZ2VuZXJhdG9yID09IG51bGwpCi0gICAgewotICAgICAgbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgdGhlIFNPQVAgYWRkcmVzcyBoYXMgYSB2YWx1ZSBzcGVjaWZpZWQgZm9yIGl0J3MgdXJpIGFuZCB0aGF0IHRoZSBiaW5kaW5nIGhhcyBhIFNPQVAKLSAgICogQmluZGluZyBkZWZpbmVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIFNPQVAgYWRkcmVzcyBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBhZGRyZXNzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoaXMgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQWRkcmVzcyhPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUEFkZHJlc3NJbXBsIHNhID0gKFNPQVBBZGRyZXNzSW1wbCllbGVtZW50OwotCi0gICAgU3RyaW5nIHVyaSA9IHNhLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHNJZ25vcmVDYXNlKEVNUFRZX1NUUklORykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MpLCBzYSk7Ci0gICAgfQotCi0gICAgUG9ydCBwb3J0ID0gKFBvcnQpcGFyZW50cy5nZXQoMCk7Ci0KLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLQotICAgIGlmICghaGFzU29hcEJpbmRpbmcoYmluZGluZykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9BRERSRVNTLAotICAgICAgICAgIFFVT1RFICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUsCi0gICAgICAgICAgUVVPVEUgKyBwb3J0LmdldE5hbWUoKSArIFFVT1RFKSwgc2EpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhlIFNPQVAgQmluZGluZyBkZWZpbmVkIGlzIHZhbGlkLiBBIFNPQVAgQmluZGluZyBtdXN0IGhhdmUgYSBzdHlsZSBvZiBycGMgb3IgZG9jdW1lbnQKLSAgICogb3Igbm8gc3R5bGUgZGVmaW5lZCAoZGVmYXVsdHMgdG8gZG9jdW1lbnQuKSAgQSB2YWxpZCAobm9uIGVtcHR5KSBVUkkgbXVzdCBhbHNvIGJlIHNwZWNpZmllZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIFNPQVAgYmluZGluZyBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIGZvciB0aGlzIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUJpbmRpbmcoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIFNPQVBCaW5kaW5nSW1wbCBzYiA9IChTT0FQQmluZGluZ0ltcGwpZWxlbWVudDsKLQotICAgIFN0cmluZyBzdHlsZSA9IHNiLmdldFN0eWxlKCk7Ci0gICAgU3RyaW5nIHVyaSA9IHNiLmdldFRyYW5zcG9ydFVSSSgpOwotCi0gICAgaWYgKHN0eWxlICE9IG51bGwgJiYgIXN0eWxlLmVxdWFsc0lnbm9yZUNhc2UoUlBDKSAmJiAhc3R5bGUuZXF1YWxzSWdub3JlQ2FzZShET0NVTUVOVCkpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQklORElOR19TVFlMRSwgUVVPVEUgKyBzYi5nZXRTdHlsZSgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICB9Ci0gICAgaWYgKHVyaS5lcXVhbHNJZ25vcmVDYXNlKEVNUFRZX1NUUklORykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1VSSSksIGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBbiBvcGVyYXRpb24gbWF5IGhhdmUgYSBzdHlsZSBkZWZpbmVkLiBJZiBpdCBpcyBkZWZpbmVkIGl0IG11c3QgYmUgcnBjIG9yIGRvY3VtZW50LiBJdCBtYXkgYWxzbyBoYXZlIGEKLSAgICogdXJpIGRlZmluZWQgd2hpY2ggbXVzdCBiZSBub24gZW1wdHkuICBJdCBtYXkgaGF2ZSBhIHNvYXBBY3Rpb24gZGVmaW5lZCBhcyB3ZWxsLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIFNPQVAgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIEEgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBTT0FQIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIGZvciB0aGlzIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU9wZXJhdGlvbihPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUE9wZXJhdGlvbiBzbyA9IChTT0FQT3BlcmF0aW9uKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgc29hcFN0eWxlID0gc28uZ2V0U3R5bGUoKTsKLQotICAgIGlmIChzb2FwU3R5bGUgIT0gbnVsbCAmJiAhc29hcFN0eWxlLmVxdWFsc0lnbm9yZUNhc2UoUlBDKSAmJiAhc29hcFN0eWxlLmVxdWFsc0lnbm9yZUNhc2UoRE9DVU1FTlQpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OX1NUWUxFKSwgZWxlbWVudCk7Ci0gICAgfQotCi0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpcGFyZW50cy5nZXQoMSk7Ci0gICAgaWYgKCFoYXNTb2FwQmluZGluZyhiaW5kaW5nKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiwgUVVPVEUgKyBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIHNvKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIFNPQVAgYm9keS4gSWYgZW5jb2RlZCBhIGJvZHkgbXVzdCBoYXZlIGFuIGVuY29kaW5nU3R5bGUuIEFsc28sCi0gICAqIGlmIHNwZWNpZmllZCwgYWxsIG9mIHRoZSBwYXJ0cyBsaXN0ZWQgbXVzdCBiZSBkZWZpbmVkIHBhcnRzIGFuZCBpbiB0aGUgZW5jb2RpbmcgdXNlIGNhc2UsIHRoZSBwYXJ0cwotICAgKiBtdXN0IGhhdmUgdHlwZXMgZGVmaW5lZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIGJvZHkgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIFNPQVAgYm9keSBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIGZvciB0aGlzIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUJvZHkoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIFNPQVBCb2R5SW1wbCBzYiA9IChTT0FQQm9keUltcGwpZWxlbWVudDsKLQotICAgIFN0cmluZyB1c2UgPSBzYi5nZXRVc2UoKTsKLQotICAgIC8vIGlmIHRoZSB1c2UgPSBlbmNvZGVkIHRoZW4gdGhlcmUgbXVzdCBiZSBlbmNvZGluZ1N0eWxlcy4KLSAgICBpZiAodXNlICE9IG51bGwgJiYgdXNlLmVxdWFsc0lnbm9yZUNhc2UoRU5DT0RFRCkpCi0gICAgewotICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlcyA9IHNiLmdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBpZiAoZW5jb2RpbmdTdHlsZXMgPT0gbnVsbCB8fCBlbmNvZGluZ1N0eWxlcy5zaXplKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX0VOQ09ESU5HX1NUWUxFKSwgc2IpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh1c2UgIT0gbnVsbCAmJiAhdXNlLmVxdWFsc0lnbm9yZUNhc2UoTElURVJBTCkpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX1VTRSwgUVVPVEUgKyB1c2UgKyBRVU9URSksIHNiKTsKLSAgICB9Ci0KLSAgICAvL0NoZWNrIHRoYXQgdGhlIHBhcnRzIGFyZSB2YWxpZAotICAgIC8vIHBhcnRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgbWVzc2FnZSBzcGVjaWZpZWQgZm9yIHRoZSBvcGVyYXRpb24KLSAgICBMaXN0IHBhcnRzID0gc2IuZ2V0UGFydHMoKTsKLQotICAgIGlmIChwYXJ0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHBhcnRzSXRlcmF0b3IgPSBwYXJ0cy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKHBhcnRzSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcGFydCA9IChTdHJpbmcpcGFydHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm8gPSAoQmluZGluZ09wZXJhdGlvbilwYXJlbnRzLmdldCgxKTsKLSAgICAgICAgT3BlcmF0aW9uIG8gPSBiby5nZXRPcGVyYXRpb24oKTsKLQotICAgICAgICBpZiAobyAhPSBudWxsICYmICFvLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgaW5wdXQgb3Igb3V0cHV0IGlmIGl0IGV4aXN0cwotICAgICAgICAgIE1lc3NhZ2UgbWVzcyA9IG51bGw7Ci0gICAgICAgICAgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0lucHV0SW1wbC5jbGFzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJbnB1dCBpbnB1dCA9IG8uZ2V0SW5wdXQoKTsKLQotICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1lc3MgPSBpbnB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ091dHB1dEltcGwuY2xhc3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgT3V0cHV0IG91dHB1dCA9IG8uZ2V0T3V0cHV0KCk7Ci0KLSAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVzcyA9IG91dHB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKG1lc3MgIT0gbnVsbCAmJiAhbWVzcy5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBhcnQgcCA9IG1lc3MuZ2V0UGFydChwYXJ0KTsKLQotICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gaWYgdGhlIHVzZSBpcyBlbmNvZGVkIHRoZSBwYXJ0cyBtdXN0IGFsbCBoYXZlIGEgdHlwZSBkZWZpbmVkCi0gICAgICAgICAgICAgIGlmICh1c2UgIT0gbnVsbCAmJiB1c2UuZXF1YWxzSWdub3JlQ2FzZShFTkNPREVEKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwLmdldFR5cGVOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBwYXJ0IGVycm9yIC0gcGFydCBuZWVkcyB0byBiZSB0eXBlIGFuZCBpc24ndAkKLSAgICAgICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9OT1RfVFlQRSwgUVVPVEUgKyBwYXJ0ICsgUVVPVEUpLCBzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vcGFydCBlcnJvciAtIHBhcnQgaXNuJ3QgZGVmaW5lZAkKLSAgICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfVU5ERUZJTkVELCBRVU9URSArIHBhcnQgKyBRVU9URSksIHNiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vcGFydCBlcnJvciAtIGlucHV0IGlzbid0IGRlZmluZWQKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9VTkRFRklORUQsIFFVT1RFICsgcGFydCArIFFVT1RFKSwgc2IpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBwYXJ0cyBlcnJvciAtIG9wZXJhdGlvbiBpc24ndCBkZWZpbmVkCi0gICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9VTkRFRklORUQsIFFVT1RFICsgcGFydCArIFFVT1RFKSwgc2IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpcGFyZW50cy5nZXQoMik7Ci0gICAgaWYgKCFoYXNTb2FwQmluZGluZyhiaW5kaW5nKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX0JPRFksIFFVT1RFICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBzYik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEEgU09BUCBoZWFkZXIgbXVzdCBoYXZlIGEgbWVzc2FnZSwgcGFydCBhbmQgdXNlIGRlZmluZWQuIElmIHRoZSB1c2UgaXMgZW5jb2RlZCwgbXVzdAotICAgKiBhbHNvIGhhdmUgYSBub24tZW1wdHkgZW5jb2RpbmdTdHlsZSBhbmQgbmFtZXNwYWNlIGRlZmluZWQuCi0gICAqIEEgU09BUCBoZWFkZXIgbWF5IGhhdmUgaGVhZGVyZmF1bHRzIGRlZmluZWQgYXMgd2VsbC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIGhlYWRlciBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBoZWFkZXIgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIZWFkZXIoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIFNPQVBIZWFkZXJJbXBsIHNvYXBIZWFkZXIgPSAoU09BUEhlYWRlckltcGwpZWxlbWVudDsKLQotICAgIFFOYW1lIG1lc3NhZ2VRTmFtZSA9IHNvYXBIZWFkZXIuZ2V0TWVzc2FnZSgpOwotICAgIE1lc3NhZ2UgbWVzc2FnZSA9ICgoRGVmaW5pdGlvbilwYXJlbnRzLmdldChwYXJlbnRzLnNpemUoKSAtIDEpKS5nZXRNZXNzYWdlKG1lc3NhZ2VRTmFtZSk7Ci0gICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBtZXNzYWdlIHVuZGVmaW5lZAotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0hFQURFUl9NRVNTQUdFX1VOREVGSU5FRCwgUVVPVEUgKyBtZXNzYWdlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIHNvYXBIZWFkZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHBhcnRuYW1lID0gc29hcEhlYWRlci5nZXRQYXJ0KCk7Ci0gICAgICBQYXJ0IHBhcnQgPSBtZXNzYWdlLmdldFBhcnQocGFydG5hbWUpOwotICAgICAgaWYgKHBhcnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gcGFydCB1bmRlZmluZWQKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgIF9FUlJPUl9IRUFERVJfUEFSVF9VTkRFRklORUQsCi0gICAgICAgICAgICBRVU9URSArIHBhcnRuYW1lICsgUVVPVEUsCi0gICAgICAgICAgICBRVU9URSArIG1lc3NhZ2VRTmFtZS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgc29hcEhlYWRlcik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIHVzZSA9IHNvYXBIZWFkZXIuZ2V0VXNlKCk7Ci0gICAgaWYgKHVzZSAhPSBudWxsICYmICF1c2UuZXF1YWxzSWdub3JlQ2FzZShMSVRFUkFMKSAmJiAhdXNlLmVxdWFsc0lnbm9yZUNhc2UoRU5DT0RFRCkpCi0gICAgewotICAgICAgLy8gdXNlIHVuZGVmaW5lZAotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0hFQURFUl9VU0VfVU5ERUZJTkVELCBRVU9URSArIHVzZSArIFFVT1RFKSwgc29hcEhlYWRlcik7Ci0gICAgfQotCi0gICAgaWYgKHVzZS5lcXVhbHNJZ25vcmVDYXNlKEVOQ09ERUQpKQotICAgIHsKLSAgICAgIExpc3QgZW5jb2RpbmdTdHlsZXMgPSBzb2FwSGVhZGVyLmdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBpZiAoZW5jb2RpbmdTdHlsZXMgPT0gbnVsbCB8fCBlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIC8vIG5vIGVuY29kaW5nU3R5bGUgZGVmaW5lZAotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQpLCBzb2FwSGVhZGVyKTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHNvYXBIZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobmFtZXNwYWNlID09IG51bGwgfHwgbmFtZXNwYWNlLmVxdWFsc0lnbm9yZUNhc2UoRU1QVFlfU1RSSU5HKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbm8gbmFtZXNwYWNlIGRlZmluZWQKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSX05BTUVTUEFDRV9VTkRFRklORUQpLCBzb2FwSGVhZGVyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBMaXN0IGhlYWRlckZhdWx0cyA9IHNvYXBIZWFkZXIuZ2V0U09BUEhlYWRlckZhdWx0cygpOwotICAgIGlmIChoZWFkZXJGYXVsdHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpaGVhZGVyRmF1bHRzID0gaGVhZGVyRmF1bHRzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaWhlYWRlckZhdWx0cy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlSGVhZGVyRmF1bHQoaWhlYWRlckZhdWx0cy5uZXh0KCksIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotICAgIH0KLQotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKXBhcmVudHMuZ2V0KDIpOwotICAgIGlmICghaGFzU29hcEJpbmRpbmcoYmluZGluZykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIsIFFVT1RFICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBzb2FwSGVhZGVyKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBIFNPQVAgaGVhZGVyZmF1bHQgbXVzdCBoYXZlIGEgbWVzc2FnZSwgcGFydCBhbmQgdXNlIGRlZmluZWQuIElmIHRoZSB1c2UgaXMgZW5jb2RlZCwgbXVzdAotICAgKiBhbHNvIGhhdmUgYSBub24tZW1wdHkgZW5jb2RpbmdTdHlsZSBhbmQgbmFtZXNwYWNlIGRlZmluZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgU09BUCBoZWFkZXIgZmF1bHQgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIFNPQVAgaGVhZGVyIGZhdWx0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoaXMgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSGVhZGVyRmF1bHQoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIFNPQVBIZWFkZXJGYXVsdEltcGwgc29hcEhlYWRlckZhdWx0ID0gKFNPQVBIZWFkZXJGYXVsdEltcGwpZWxlbWVudDsKLQotICAgIFFOYW1lIG1lc3NhZ2VRTmFtZSA9IHNvYXBIZWFkZXJGYXVsdC5nZXRNZXNzYWdlKCk7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gKChEZWZpbml0aW9uKXBhcmVudHMuZ2V0KHBhcmVudHMuc2l6ZSgpIC0gMSkpLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKTsKLSAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIG1lc3NhZ2UgdW5kZWZpbmVkCi0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSRkFVTFRfTUVTU0FHRV9VTkRFRklORUQsIFFVT1RFICsgbWVzc2FnZVFOYW1lLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBzb2FwSGVhZGVyRmF1bHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHBhcnRuYW1lID0gc29hcEhlYWRlckZhdWx0LmdldFBhcnQoKTsKLSAgICAgIFBhcnQgcGFydCA9IG1lc3NhZ2UuZ2V0UGFydChwYXJ0bmFtZSk7Ci0gICAgICBpZiAocGFydCA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBwYXJ0IHVuZGVmaW5lZAotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgX0VSUk9SX0hFQURFUkZBVUxUX1BBUlRfVU5ERUZJTkVELAotICAgICAgICAgICAgUVVPVEUgKyBwYXJ0bmFtZSArIFFVT1RFLAotICAgICAgICAgICAgUVVPVEUgKyBtZXNzYWdlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIHNvYXBIZWFkZXJGYXVsdCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5nIHVzZSA9IHNvYXBIZWFkZXJGYXVsdC5nZXRVc2UoKTsKLSAgICBpZiAodXNlICE9IG51bGwgJiYgIXVzZS5lcXVhbHNJZ25vcmVDYXNlKExJVEVSQUwpICYmICF1c2UuZXF1YWxzSWdub3JlQ2FzZShFTkNPREVEKSkKLSAgICB7Ci0gICAgICAvLyB1c2UgdW5kZWZpbmVkCi0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSRkFVTFRfVVNFX1VOREVGSU5FRCwgUVVPVEUgKyB1c2UgKyBRVU9URSksIHNvYXBIZWFkZXJGYXVsdCk7Ci0gICAgfQotCi0gICAgaWYgKHVzZS5lcXVhbHNJZ25vcmVDYXNlKEVOQ09ERUQpKQotICAgIHsKLSAgICAgIExpc3QgZW5jb2RpbmdTdHlsZXMgPSBzb2FwSGVhZGVyRmF1bHQuZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLSAgICAgIGlmIChlbmNvZGluZ1N0eWxlcyA9PSBudWxsIHx8IGVuY29kaW5nU3R5bGVzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbm8gZW5jb2RpbmdTdHlsZSBkZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0hFQURFUkZBVUxUX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEKSwgc29hcEhlYWRlckZhdWx0KTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHNvYXBIZWFkZXJGYXVsdC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UuZXF1YWxzSWdub3JlQ2FzZShFTVBUWV9TVFJJTkcpKQotICAgICAgewotICAgICAgICAvLyBubyBuYW1lc3BhY2UgZGVmaW5lZAotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEKSwgc29hcEhlYWRlckZhdWx0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBWYWxpZGF0ZSB0aGUgU09BUCBmYXVsdC4gQSBTT0FQIGZhdWx0IG11c3QgaGF2ZSBhIG5hbWUgZGVmaW5lZCB0aGF0IGNvcnJlc3BvbmRzIHdpdGggdGhlIG5hbWUKLSAgKiBzcGVjaWZpZWQgaW4gdGhlIHBvcnRUeXBlLiAgSWYgZW5jb2RlZCBhIGZhdWx0IG11c3QgaGF2ZSBhbiBlbmNvZGluZ1N0eWxlIGFuZCBhIG5hbWVzcGFjZVVSSS4gCi0gICogCi0gICogQHBhcmFtIGVsZW1lbnQgVGhlIFNPQVAgZmF1bHQgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIFNPQVAgZmF1bHQgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbGlkYXRpb25JbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoaXMgdmFsaWRhdGlvbi4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGYXVsdChPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUEZhdWx0SW1wbCBmYXVsdCA9IChTT0FQRmF1bHRJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLQotICAgIFN0cmluZyBwYXJlbnROYW1lID0gKChCaW5kaW5nRmF1bHQpcGFyZW50cy5nZXQoMCkpLmdldE5hbWUoKTsKLQotICAgIGlmICghbmFtZS5lcXVhbHMocGFyZW50TmFtZSkpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRSwgUVVPVEUgKyBuYW1lICsgUVVPVEUsIFFVT1RFICsgcGFyZW50TmFtZSArIFFVT1RFKSwgZmF1bHQpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBoYXNTb2FwQmluZGluZy4gLSBoZWxwZXIgTWV0aG9kCi0gICAqIEdpdmVuIGEgYmluZGluZyByZXR1cm5zIHRydWUgaWYgaXQgaGFzIGEgU09BUCBiaW5kaW5nIGRlZmluZWQuCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZyAtIHRoZSBTT0FQIGJpbmRpbmcgdG8gY2hlY2sKLSAgICogQHJldHVybiB0cnVlIGlmIGEgYmluZGluZyBoYXMgYSBTT0FQIGJpbmRpbmcgZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTb2FwQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgZXh0ZWxlbXMgPSBiaW5kaW5nLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgaWYgKGV4dGVsZW1zICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGlleHRlbGVtcyA9IGV4dGVsZW1zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpZXh0ZWxlbXMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlleHRlbGVtcy5uZXh0KCkuZ2V0Q2xhc3MoKSA9PSBTT0FQQmluZGluZ0ltcGwuY2xhc3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0ZpbGVFbnRpdHlSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0ZpbGVFbnRpdHlSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjFjMzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9GaWxlRW50aXR5UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBFbnRpdHkgcmVzb2x2ZSB0byByZXNvbHZlIGZpbGUgZW50aXRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlRW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBYTUxFbnRpdHlSZXNvbHZlcgotewotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJlc291cmNlKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHB1YmxpY0lkID0gcmVzb3VyY2UuZ2V0UHVibGljSWQoKTsKLSAgICBTdHJpbmcgc3lzdGVtSWQgPSByZXNvdXJjZS5nZXRFeHBhbmRlZFN5c3RlbUlkKCk7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJlc291cmNlLmdldE5hbWVzcGFjZSgpOwotICAgIFVSTCB1cmwgPSBudWxsOwotICAgIGlmKHN5c3RlbUlkICE9IG51bGwpCi0gICAgewotICAgICAgdXJsID0gbmV3IFVSTChzeXN0ZW1JZCk7Ci0gICAgfQotICAgIGVsc2UgaWYocHVibGljSWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKHB1YmxpY0lkKTsKLSAgICB9Ci0gICAgZWxzZSBpZihuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIGlmKHVybCAhPSBudWxsKQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgIHJldHVybiBuZXcgWE1MSW5wdXRTb3VyY2UocHVibGljSWQsIHJlc291cmNlLmdldEV4cGFuZGVkU3lzdGVtSWQoKSwgcmVzb3VyY2UuZ2V0RXhwYW5kZWRTeXN0ZW1JZCgpLCBpcywgbnVsbCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3NmI1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lU2NoZW1hR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogR2VuZXJhdGUgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzY2hlbWEgZm9yIGFuIGlubGluZSBzY2hlbWEuIFdpbGwgYWRkIGltcG9ydHMgZm9yIHVucmVzb2x2ZWQKLSAqIG5hbWVzcGFjZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmxpbmVTY2hlbWFHZW5lcmF0b3IKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTT0FQX0VOQ09ESU5HX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRV9QUkVGSVggPSAiZmlsZTovLy8iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBUQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBJTVBPUlQgPSAiaW1wb3J0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBJTkNMVURFID0gImluY2x1ZGUiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNDSEVNQSA9ICJzY2hlbWEiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNDSEVNQUxPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBpZ25vcmVOYW1lc3BhY2VzID0KLSAgICB7IENvbnN0YW50cy5OU19VUklfWFNEXzE5OTksIENvbnN0YW50cy5OU19VUklfWFNEXzIwMDAsIENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEgfTsKLQotICBwcm90ZWN0ZWQgc3RhdGljIElubGluZVNjaGVtYUdlbmVyYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIElubGluZVNjaGVtYUdlbmVyYXRvcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIHRoZSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGUgaW5saW5lIHNjaGVtYSBnZW5lcmF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIElubGluZVNjaGVtYUdlbmVyYXRvciBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBJbmxpbmVTY2hlbWFHZW5lcmF0b3IoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2NoZW1hIGZyb20gdGhlIGVsZW1lbnQgcHJvdmlkZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBlbGVtZW50cyBBIGxpc3Qgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEgaW4gb3JkZXIuCi0gICAqIEBwYXJhbSBmaWxlbG9jYXRpb24gVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVYU0RTdHJpbmcoRWxlbWVudCBlbGVtZW50LCBMaXN0IGVsZW1lbnRzLCBTdHJpbmcgZmlsZWxvY2F0aW9uKQotICB7Ci0gICAgcmV0dXJuIElubGluZVNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmcoZWxlbWVudCwgZWxlbWVudHMsIGZpbGVsb2NhdGlvbiwgbmV3IEhhc2h0YWJsZSgpKTsKLSAgfQotICAKLSAgLyoqCi0gIAkqIENyZWF0ZXMgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzY2hlbWEgbW9kZWwgd2l0aCB0aGUgcm9vdCBlbGVtZW50IG9mCi0gIAkqIGV4dEVsZW0uIENhbGxzIGNyZWF0ZVhTRFN0cmluZ1JlY3Vyc2l2ZWx5IHRvIHRha2UgY2FyZSBvZiBidWlsZGluZyB0aGUgU3RyaW5nCi0gIAkqIGFmdGVyIGl0IG9idGFpbnMgdGhlIEVsZW1lbnQgZnJvbSB0aGUgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LgotICAJKiAKLSAgCSogQHBhcmFtIGVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAJKiBAcGFyYW0gZWxlbWVudHMgQSBsaXN0IHRvIGNvbnRhaW4gdGhlIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEgaW4gb3JkZXIuCi0gIAkqIEBwYXJhbSBmaWxlbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHRoZSBzY2hlbWEgaXMgbG9jYXRlZCBpbi4KLSAgCSogQHBhcmFtIHBhcmVudE5TcyBBIGhhc2h0YWJsZSBvZiBwYXJlbnQgbmFtZXNwYWNlcyB0byB1c2VkIHRvIHJlc29sdmUgcHJlZml4ZXMuCi0gIAkqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjaGVtYSB3aXRoIHRoZSByb290IGVsZW1lbnQgJ2VsZW1lbnQnLgotICAJKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlWFNEU3RyaW5nKEVsZW1lbnQgZWxlbWVudCwgTGlzdCBlbGVtZW50cywgU3RyaW5nIGZpbGVsb2NhdGlvbiwgSGFzaHRhYmxlIHBhcmVudE5TcykKLSAgewotICAgIElubGluZVNjaGVtYUdlbmVyYXRvciBzY2hlbWFHZW5lcmF0b3IgPSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgICBIYXNodGFibGUgbnNSZXNvbHZlciA9IHNjaGVtYUdlbmVyYXRvci5nZXROU1Jlc29sdmVyKGVsZW1lbnQpOwotICAgIExpc3QgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0UmVxdWlyZWROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgIEhhc2h0YWJsZSByZXFOU0RlY2wgPSBzY2hlbWFHZW5lcmF0b3IucmVzb2x2ZU5hbWVzcGFjZXMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgLy9IYXNodGFibGUgcmVxTlNEZWNsID0gc2NoZW1hR2VuZXJhdG9yLmdldFJlcXVpcmVkTlNEZWNsYXJhdGlvbnMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgTGlzdCBpbXBvcnROUyA9IHNjaGVtYUdlbmVyYXRvci5nZXRJbXBvcnROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLnJlbW92ZUltcG9ydHMocmVxbnMsIGltcG9ydE5TKTsKLSAgICByZXFucyA9IHNjaGVtYUdlbmVyYXRvci5yZW1vdmVMb2NhbE5hbWVzcGFjZXMocmVxbnMsIGVsZW1lbnQpOwotICAgIHJldHVybiBzY2hlbWFHZW5lcmF0b3IuY3JlYXRlWFNEU3RyaW5nUmVjdXJzaXZlbHkoZWxlbWVudCwgZWxlbWVudHMsIHJlcW5zLCByZXFOU0RlY2wsIGZpbGVsb2NhdGlvbik7Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UgaXMgcmVxdWlyZWQgYnV0IG5vdCBpbXBvcnRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGZpbGVsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NoZW1hLgotICAgKiBAcGFyYW0gcGFyZW50TlNzIEEgaGFzaHRhYmxlIG9mIHRoZSBwYXJlbnQgbmFtZXNwYWNlcy4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzb2FwIGVuY29kaW5nIG5hbWVzcGFjZSBpcyByZXF1aXJlZCBidXQgbm90IGltcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc29hcEVuY29kaW5nUmVxdWlyZWROb3RJbXBvcnRlZChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBmaWxlbG9jYXRpb24sIEhhc2h0YWJsZSBwYXJlbnROU3MpCi0gIHsKLSAgICBJbmxpbmVTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yID0gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgSGFzaHRhYmxlIG5zUmVzb2x2ZXIgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0TlNSZXNvbHZlcihlbGVtZW50KTsKLSAgICBMaXN0IHJlcW5zID0gbnVsbDsKLQotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLmdldFJlcXVpcmVkTmFtZXNwYWNlcyhlbGVtZW50KTsKLSAgICBzY2hlbWFHZW5lcmF0b3IucmVzb2x2ZU5hbWVzcGFjZXMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgLy9zY2hlbWFHZW5lcmF0b3IucmVzb2x2ZVVuZGVjbGFyZWROYW1lc3BhY2VzKHJlcW5zLCBwYXJlbnROU3MpOwotICAgIExpc3QgaW1wb3J0TlMgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0SW1wb3J0TmFtZXNwYWNlcyhlbGVtZW50KTsKLSAgICByZXFucyA9IHNjaGVtYUdlbmVyYXRvci5yZW1vdmVJbXBvcnRzKHJlcW5zLCBpbXBvcnROUyk7Ci0gICAgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IucmVtb3ZlTG9jYWxOYW1lc3BhY2VzKHJlcW5zLCBlbGVtZW50KTsKLQotICAgIHJldHVybiBzY2hlbWFHZW5lcmF0b3IuY2hlY2tTT0FQRW5jb2RpbmdSZXF1aXJlZChyZXFucyk7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc29sdmUgdGhlIHVuZGVjbGFyZWQgbmFtZXNwYWNlcy4KLSAgICogCi0gICAqIEBwYXJhbSB1bnJlc29sdmVkTlNzIEEgbGlzdCBvZiB1bnJlc29sdmVkIG5hbWVzcGFjZXMuCi0gICAqIEBwYXJhbSBuc1Jlc29sdmVyIFRoZSBuYW1lc3BhY2UgcmVzb2x2ZXIgdG8gdXNlLgotICAgKiBAcmV0dXJuIEEgaGFzaHRhYmxlIG9mIHByZWZpeGVzIGFuZCBuYW1lc3BhY2VzLgotICAgKi8KLS8vICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHJlc29sdmVVbmRlY2xhcmVkTmFtZXNwYWNlcyhMaXN0IHVucmVzb2x2ZWROU3MsIEhhc2h0YWJsZSBuc1Jlc29sdmVyKQotLy8gIHsKLS8vICAgIEhhc2h0YWJsZSBuYW1lc3BhY2VzID0gbmV3IEhhc2h0YWJsZSgpOwotLy8gICAgaWYgKHVucmVzb2x2ZWROU3MgIT0gbnVsbCAmJiAhdW5yZXNvbHZlZE5Tcy5pc0VtcHR5KCkgJiYgbnNSZXNvbHZlciAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBmb3IgKGludCBpID0gdW5yZXNvbHZlZE5Tcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkKLS8vICAgICAgewotLy8gICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpdW5yZXNvbHZlZE5Tcy5nZXQoaSk7Ci0vLyAgICAgICAgaWYgKG5zLmVxdWFscygiIikpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgbnMgPSBYTUxOUzsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIG5zID0gWE1MTlMgKyAiOiIgKyBuczsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgaWYgKG5zUmVzb2x2ZXIuY29udGFpbnNLZXkobnMpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIC8vbmFtZXNwYWNlcy5yZW1vdmUoaSk7Ci0vLyAgICAgICAgICAvL25hbWVzcGFjZXMuYWRkKGksIG5zUmVzb2x2ZXIuZ2V0KG5zKSk7Ci0vLyAgICAgICAgICBuYW1lc3BhY2VzLnB1dChucywgbnNSZXNvbHZlci5nZXQobnMpKTsKLS8vICAgICAgICAgIHVucmVzb2x2ZWROU3MucmVtb3ZlKGkpOwotLy8gICAgICAgICAgdW5yZXNvbHZlZE5Tcy5hZGQoaSwgbnNSZXNvbHZlci5nZXQobnMpKTsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIHJldHVybiBuYW1lc3BhY2VzOwotLy8gIH0KLQotICAvKioKLSAgICogVGhpcyByZWN1cnNpdmUgbWV0aG9kIGNyZWF0ZXMgdGhlIHNjaGVtYSBTdHJpbmcgZnJvbSB0aGUgcm9vdCBFbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW0gVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcGFyYW0gZWxlbWVudHMgQSBsaXN0IHRvIGJlIGNyZWF0ZWQgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEgaW4gb3JkZXIuCi0gICAqIEBwYXJhbSByZXF1aXJlZE5hbWVzcGFjZXMgQSBsaXN0IG9mIHJlcXVpcmVkIG5hbWVzcGFjZXMuCi0gICAqIEBwYXJhbSByZXFOU0RlY2wgQSBoYXNodGFibGUgb2YgcmVxdWlyZWQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4KLSAgICogQHBhcmFtIGZpbGVsb2NhdGlvbiBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhpcyBzY2hlbWEuCi0gICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzY2hlbWEuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVhTRFN0cmluZ1JlY3Vyc2l2ZWx5KAotICAgIEVsZW1lbnQgZWxlbSwKLSAgICBMaXN0IGVsZW1lbnRzLAotICAgIExpc3QgcmVxdWlyZWROYW1lc3BhY2VzLAotICAgIEhhc2h0YWJsZSByZXFOU0RlY2wsCi0gICAgU3RyaW5nIGZpbGVsb2NhdGlvbikKLSAgewotICAgIGlmIChlbGVtID09IG51bGwpCi0gICAgICByZXR1cm4gIiI7IC8vIGp1c3QgaW4gY2FzZQotCi0gICAgZWxlbWVudHMuYWRkKGVsZW0pOwotCi0gICAgU3RyaW5nQnVmZmVyIHhzZFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtLmdldFRhZ05hbWUoKTsKLSAgICB4c2RTdHJpbmcuYXBwZW5kKCI8IikuYXBwZW5kKGVsZW1lbnROYW1lKTsKLQotICAgIGJvb2xlYW4gZm91bmRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOyAvLyBmbGFnIGlmIHNjaGVtYWxvY2F0aW9uIGlzIGRlZmluZWQKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gIiI7IC8vIHRoZSBuYW1lc3BhY2UgaWYgd2UncmUgY2hlY2tpbmcgYW4gaW1wb3J0IG9yIGluY2x1ZGUKLSAgICBTdHJpbmcgbmFtZVByZWZpeCA9ICIiOyAvLyB0aGUgeG1sbnMgcHJlZml4IHVzZWQgZm9yIHRoZSBlbGVtZW50cwotICAgIC8vIEdldCBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYXBwZW5kIHRoZW0gdG8gdGhlIHhzZFN0cmluZwotICAgIE5hbWVkTm9kZU1hcCBhdHRzID0gZWxlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgTm9kZSBuID0gYXR0cy5pdGVtKGkpOwotICAgICAgeHNkU3RyaW5nLmFwcGVuZCgiICIpLmFwcGVuZChuLmdldE5vZGVOYW1lKCkpLmFwcGVuZCgiPVwiIik7Ci0gICAgICBTdHJpbmcgbm9kZU5hbWUgPSBuLmdldE5vZGVOYW1lKCk7Ci0gICAgICBpZiAobm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShTQ0hFTUFMT0NBVElPTikgJiYgZmlsZWxvY2F0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvdW5kU2NoZW1hTG9jYXRpb24gPSB0cnVlOwotICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgeHNkU3RyaW5nLmFwcGVuZChyZWxhdGl2ZVBhdGgpLmFwcGVuZCgiXCIiKTsgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5vZGVWYWx1ZSA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIGlmIChub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5BTUVTUEFDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2UgPSBub2RlVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZ2V0IHRoZSBuYW1lIHByZWZpeCBmb3IgdGhpcyBzY2hlbWEgdG8gdXNlIGluIGdlbmVyYXRpbmcgaW1wb3J0IHN0YXRlbWVudHMKLSAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUuaW5kZXhPZihYTUxOUykgIT0gLTEpCi0gICAgICAgIHsKLQotICAgICAgICAgIGlmIChub2RlVmFsdWUuZXF1YWxzSWdub3JlQ2FzZShlbGVtLmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lUHJlZml4ID0gbm9kZU5hbWU7Ci0gICAgICAgICAgICBpZiAobmFtZVByZWZpeC5lcXVhbHNJZ25vcmVDYXNlKFhNTE5TKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmFtZVByZWZpeCA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuYW1lUHJlZml4ID0gbmFtZVByZWZpeC5zdWJzdHJpbmcoNikgKyAiOiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFJlcGxhY2Ugb2xkIHNjaGVtYSBuYW1lc3BhY2VzIHdpdGggdGhlIG5ldyBzY2hlbWEgbmFtZXNwYWNlLgotICAgICAgICBpZihub2RlVmFsdWUuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpIHx8IG5vZGVWYWx1ZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgbm9kZVZhbHVlID0gQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMTsKLSAgICAgICAgfQotICAgICAgICB4c2RTdHJpbmcuYXBwZW5kKG5vZGVWYWx1ZSkuYXBwZW5kKCJcIiIpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW1wb3J0IikgJiYgIWZvdW5kU2NoZW1hTG9jYXRpb24pCi0gICAgewotICAgICAgeHNkU3RyaW5nLmFwcGVuZCgiICIpLmFwcGVuZChTQ0hFTUFMT0NBVElPTikuYXBwZW5kKCI9XCIiKS5hcHBlbmQobmFtZXNwYWNlKS5hcHBlbmQoIlwiIik7Ci0gICAgfQotICAgIC8vIGFkZCBpbiBhbnkgcmVxdWlyZWQgTlMgZGVjbGFyYXRpb25zIGZyb20gcGFyZW50IGVsZW1lbnRzCi0gICAgaWYgKHJlcU5TRGVjbCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVudW1lcmF0aW9uIGtleXMgPSByZXFOU0RlY2wua2V5cygpOwotICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIGRlY2xOUyA9IChTdHJpbmcpcmVxTlNEZWNsLmdldChrZXkpOwotICAgICAgICBpZihkZWNsTlMuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpIHx8IGRlY2xOUy5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgZGVjbE5TID0gQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMTsKLSAgICAgICAgfQotICAgICAgICB4c2RTdHJpbmcuYXBwZW5kKCIgIikuYXBwZW5kKGtleSkuYXBwZW5kKCI9XCIiKS5hcHBlbmQoZGVjbE5TKS5hcHBlbmQoIlwiIik7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgeHNkU3RyaW5nLmFwcGVuZCgiPiIpOwotICAgIGlmIChyZXF1aXJlZE5hbWVzcGFjZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpUmVxdWlyZWROYW1lc3BhY2VzID0gcmVxdWlyZWROYW1lc3BhY2VzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaVJlcXVpcmVkTmFtZXNwYWNlcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpaVJlcXVpcmVkTmFtZXNwYWNlcy5uZXh0KCk7Ci0KLSAgICAgICAgeHNkU3RyaW5nCi0gICAgICAgICAgLmFwcGVuZCgiPCIpCi0gICAgICAgICAgLmFwcGVuZChuYW1lUHJlZml4KQotICAgICAgICAgIC5hcHBlbmQoSU1QT1JUKQotICAgICAgICAgIC5hcHBlbmQoIiAiKQotICAgICAgICAgIC5hcHBlbmQoTkFNRVNQQUNFKQotICAgICAgICAgIC5hcHBlbmQoIj1cIiIpCi0gICAgICAgICAgLmFwcGVuZChucykKLSAgICAgICAgICAuYXBwZW5kKCJcIiAiKQotICAgICAgICAgIC5hcHBlbmQoU0NIRU1BTE9DQVRJT04pCi0gICAgICAgICAgLmFwcGVuZCgiPVwiIikKLSAgICAgICAgICAuYXBwZW5kKG5zKQotICAgICAgICAgIC5hcHBlbmQoIlwiLz4iKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICB4c2RTdHJpbmcuYXBwZW5kKCJcbiIpOwotCi0gICAgLy8gY2FsbCB0aGUgbWV0aG9kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gZWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgfHwgaSA8IDU7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG4gPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0gICAgICAvLyB3ZSBvbmx5IHdhbnQgbm9kZXMgdGhhdCBhcmUgRWxlbWVudHMKLSAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBjaGlsZCA9IChFbGVtZW50KW47Ci0gICAgICAgIHhzZFN0cmluZy5hcHBlbmQoY3JlYXRlWFNEU3RyaW5nUmVjdXJzaXZlbHkoY2hpbGQsIGVsZW1lbnRzLCBudWxsLCBudWxsLCBmaWxlbG9jYXRpb24pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB4c2RTdHJpbmcuYXBwZW5kKCI8LyIpLmFwcGVuZChlbGVtLmdldFRhZ05hbWUoKSkuYXBwZW5kKCI+Iik7Ci0KLSAgICByZXR1cm4geHNkU3RyaW5nLnRvU3RyaW5nKCk7Ci0KLSAgfQotICAvKioKLSAgICogR2V0IGEgbGlzdCBvZiBhbGwgdGhlIG5hbWVzcGFjZXMgdGhhdCBhcmUgdXNlZCBmb3IgZWxlbWVudHMgb3IgdHlwZXMgaW4gdGhlIHNjaGVtYS4KLSAgICogVGhlc2UgYXJlIHRoZSByZXF1aXJlZCBuYW1lc3BhY2VzIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFsbCB0aGUgZWxtZW50cyBhcmUgdmFsaWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbSBUaGUgZWxlbWVudCB0byBjaGVjayBmb3IgcmVxdWlyZWQgbmFtZXNwYWNlcy4KLSAgICogQHJldHVybiBBIGxpc3Qgb2YgcmVxdWlyZWQgbmFtZXNwYWNlcyBmb3IgdGhlIGVsZW1lbnQgYW5kIGFsbCBpdHMgY2hpbGRyZW4uCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCBnZXRSZXF1aXJlZE5hbWVzcGFjZXMoRWxlbWVudCBlbGVtKQotICB7Ci0gICAgTGlzdCBuYW1lc3BhY2UgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvLyBjYWxsIHRoZSBtZXRob2QgcmVjdXJzaXZlbHkgZm9yIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIC8vIHJlZ2lzdGVyIGFsbCB0aGUgY2hpbGQgdHlwZXMgZmlyc3QKLSAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gZWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IG51bUNoaWxkcmVuID0gY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsKLSAgICAvLyBUT0RPOiB3aHkgaXMgdGhlcmUgYSA8IDUgY29uZGl0aW9uPwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW4gLyp8fCBpIDwgNSovOyBpKyspCi0gICAgewotICAgICAgTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotICAgICAgLy8gd2Ugb25seSB3YW50IG5vZGVzIHRoYXQgYXJlIEVsZW1lbnRzCi0gICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCluOwotICAgICAgICBMaXN0IGNoaWxkbnMgPSBnZXRSZXF1aXJlZE5hbWVzcGFjZXMoY2hpbGQpOwotICAgICAgICBmb3IgKGludCBqID0gY2hpbGRucy5zaXplKCkgLSAxOyBqID49IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpY2hpbGRucy5nZXQoaik7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMobnMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZS5hZGQobnMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBBZGQgdGhlIG5hbWVzcGFjZSBvZiB0aGUgY3VycmVudCBlbGVtZW50Ci0gICAgU3RyaW5nIGVsZW1OUyA9IGVsZW0uZ2V0UHJlZml4KCk7Ci0gICAgLy8gaWYgdGhlcmUgaXMgbm8gbmFtZXNwYWNlIHByZWZpeCBzZXQgaXQgdG8gdGhlIGVtcHR5IHByZWZpeC4KLSAgICBpZihlbGVtTlMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbGVtTlMgPSAiIjsKLSAgICB9Ci0gICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMoZWxlbU5TKSkKLSAgICAgewotICAgICAgbmFtZXNwYWNlLmFkZChlbGVtTlMpOwotICAgIH0KLSAgICAvLyBub3cgYWRkIGFsbCBvZiB0aGUgY3VycmVudCBlbGVtZW50J3MgbmFtZXNwYWNlcwotICAgIC8vIGRvbid0IGluY2x1ZGUgaW1wb3J0IGFuZCBzY2hlbWEgZWxlbWVudHMKLSAgICBTdHJpbmcgbG9jYWxuYW1lID0gZWxlbS5nZXRMb2NhbE5hbWUoKTsKLSAgICBpZiAoIWxvY2FsbmFtZS5lcXVhbHMoSU1QT1JUKSAmJiAhbG9jYWxuYW1lLmVxdWFscyhJTkNMVURFKSAmJiAhbG9jYWxuYW1lLmVxdWFscyhTQ0hFTUEpKQotICAgIHsKLSAgICAgIE5hbWVkTm9kZU1hcCBhdHRzID0gZWxlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBuID0gYXR0cy5pdGVtKGkpOwotCi0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IG4uZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgLy8gcmVtb3ZlZCByZXN0cmljdGlvbiB0aGF0IHdlJ3JlIG9ubHkgbG9va2luZyBhdCB0eXBlcwotICAgICAgICAvLwkJaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFlQRSkpCi0gICAgICAgIC8vCQl7Ci0gICAgICAgIC8vIGRvbid0IHRha2UgbmFtZXNwYWNlIGluZm8gZnJvbSBhdHRyaWJ1dGVzIGRlZmluaW5nIG5hbWVzcGFjZXMuCi0gICAgICAgIC8vIHRoYXQgaW5jbHVkZXMgeG1sbnMsIHRhcmdldE5hbWVzcGFjZQotICAgICAgICAvLyBkb24ndCB0YWtlIG5hbWVzcGFjZSBpbmZvIGZyb20gbmFtZSBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChub2RlTmFtZS5pbmRleE9mKFhNTE5TKSAhPSAtMSB8fCBub2RlTmFtZS5lcXVhbHMoVEFSR0VUTkFNRVNQQUNFKSB8fCBub2RlTmFtZS5lcXVhbHMoTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbm9kZVZhbHVlID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpbnQgY29sb25JbmRleCA9IG5vZGVWYWx1ZS5pbmRleE9mKCI6Iik7Ci0gICAgICAgIC8vIERvbid0IHRha2UgbmFtZXNwYWNlIGluZm8gZnJvbSBhdHRyaWJ1dGVzIHdpdGggdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCB0aGF0IGlzIGF0dHJpYnV0ZXMKLSAgICAgICAgLy8gdGhhdCBhcmUgbm90IHByZWZpeGVkLiAoY29sb25JbmRleCA9PSAtMSkKLSAgICAgICAgLy8gSWYgdGhlIGNvbG9uSW5kZXggaXMgZm9sbG93ZWQgYnkgYSAvIHRoZW4gaXQgaXMgYSBVUkkgYW5kIG5vdAotICAgICAgICAvLyBuYW1lc3BhY2UgcXVhbGlmaWVkLgotCQlpZiAoY29sb25JbmRleCA9PSAtMSB8fCAoY29sb25JbmRleCArIDEgPCBub2RlVmFsdWUubGVuZ3RoKCkgJiYgbm9kZVZhbHVlLmNoYXJBdChjb2xvbkluZGV4ICsgMSkgPT0gJy8nKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGhlcmUgd2UgaGF2ZSBmb3VuZCBhIGNvbG9uIGRlbGltaXRlciBzbyB3ZSBuZWVkIHRoZSBuYW1lc3BhY2UgZGVmaW5lZCBoZXJlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5vZGVWYWx1ZSA9IG5vZGVWYWx1ZS5zdWJzdHJpbmcoMCwgY29sb25JbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMobm9kZVZhbHVlKSkKLSAgICAgICAgewotCi0gICAgICAgICAgbmFtZXNwYWNlLmFkZChub2RlVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIC8vCQl9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBuYW1lc3BhY2VzIHRoYXQgaGF2ZSBhbiBpbXBvcnQgc3RhdGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW0gVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBhbGwgdGhlIG5hbWVzcGFjZXMgdGhhdCBhcmUgaW1wb3J0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCBnZXRJbXBvcnROYW1lc3BhY2VzKEVsZW1lbnQgZWxlbSkKLSAgewotICAgIExpc3QgbmFtZXNwYWNlID0gbmV3IFZlY3RvcigpOwotCi0gICAgLy8gY2FsbCB0aGUgbWV0aG9kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICAvLyByZWdpc3RlciBhbGwgdGhlIGNoaWxkIHR5cGVzIGZpcnN0Ci0gICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IGVsZW0uZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpIHx8IGkgPCA1OyBpKyspCi0gICAgewotICAgICAgTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotICAgICAgLy8gd2Ugb25seSB3YW50IG5vZGVzIHRoYXQgYXJlIEVsZW1lbnRzCi0gICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCluOwotICAgICAgICBMaXN0IGNoaWxkbnMgPSBnZXRJbXBvcnROYW1lc3BhY2VzKGNoaWxkKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IGNoaWxkbnMuc2l6ZSgpIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKWNoaWxkbnMuZ2V0KGopOwotICAgICAgICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKG5zKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc3BhY2UuYWRkKG5zKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gaWYgdGhpcyBpcyBhbiBpbXBvcnQgZWxlbWVudCBnZXQgdGhlIG5hbWVzcGFjZSBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgaWYgKGVsZW0uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShJTVBPUlQpKQotICAgIHsKLSAgICAgIE5hbWVkTm9kZU1hcCBhdHRzID0gZWxlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBuID0gYXR0cy5pdGVtKGkpOwotCi0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IG4uZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTkFNRVNQQUNFKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBub2RlVmFsdWUgPSBuLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKG5vZGVWYWx1ZSkpCi0gICAgICAgICAgewotCi0gICAgICAgICAgICBuYW1lc3BhY2UuYWRkKG5vZGVWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIEhhc2h0YWJsZSB3aXRoIG5hbWVzcGFjZSBwcmVmaXhlcyBhcyBrZXlzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbSBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gQSBoYXNodGFibGUgd2l0aCBuYW1lc3BhY2UgcHJlZml4ZXMgbWFwcGVkIHRvIG5hbWVzcGFjZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldE5TUmVzb2x2ZXIoRWxlbWVudCBlbGVtKQotICB7Ci0gICAgSGFzaHRhYmxlIG5zUmVzb2x2ZXIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGF0dHMuaXRlbShpKTsKLQotICAgICAgU3RyaW5nIG5vZGVOYW1lID0gbi5nZXROb2RlTmFtZSgpOwotICAgICAgaWYgKG5vZGVOYW1lLmluZGV4T2YoWE1MTlMpICE9IC0xKQotICAgICAgewotICAgICAgICBTdHJpbmcgbm9kZVZhbHVlID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVQcmVmaXggPSBub2RlTmFtZTsKLQotICAgICAgICBpZiAobmFtZVByZWZpeC5lcXVhbHNJZ25vcmVDYXNlKFhNTE5TKSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVQcmVmaXggPSAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lUHJlZml4ID0gbmFtZVByZWZpeC5zdWJzdHJpbmcoNik7Ci0gICAgICAgIH0KLSAgICAgICAgbnNSZXNvbHZlci5wdXQobmFtZVByZWZpeCwgbm9kZVZhbHVlKTsKLQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnNSZXNvbHZlcjsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFJlc29sdmUgdGhlIG5hbWVzcGFjZXMgaW4gdGhlIGdpdmVuIG5hbWVzcGFjZXMgbGlzdCB3aXRoIHRoZSB0d28gbmFtZXNwYWNlCi0gICAqIHJlc29sdmVyIGhhc2h0YWJsZXMgcHJvdmlkZWQuIFJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBuYW1lc3BhY2UgdGhhdCBuZWVkCi0gICAqIHRvIGJlIGRlY2xhcmVkLgotICAgKiBGaXJzdCByZXNvbHZlIGFnYWluc3QgdGhlIGxvY2FsIG5hbWVzcGFjZXMgd2l0aCBuc1Jlc29sdmVyLgotICAgKiBOZXh0IHJlc29sdmUgYWdhaW5zdCB0aGUgcGFyZW50IG5hbWVzcGFjZSB3aXRoIHBhcmVudE5TUmVzb2x2ZXIuCi0gICAqIEEgc2lkZSBhZmZlY3Qgb2YgdGhpcyBtZXRob2QgaXMgdGhlIG5hbWVzcGFjZXMgbGlzdCBpcyBsZWZ0IHdpdGggb25seSB0aG9zZSAKLSAgICogbmFtZXNwYWNlcyB0aGF0IGFyZSByZXNvbHZlZCBhbmQgdGhlIHJlc29sdmVkIGVudGl0aWVzIGFyZSBwbGFjZWQgaW4gdGhlIAotICAgKiBsaXN0IGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGVudHJpZXMuCi0gICAqIEZvciBleC4gSWYgeW91IHByb3ZpZGUgYSBsaXN0IHN1Y2ggYXMge3hzZCwgaW50Zn0gYW5kIG9ubHkgeHNkIGNhbiBiZSByZXNvbHZlZAotICAgKiB5b3Ugd2lsbCBlbmQgdXAgd2l0aCB0aGUgbGlzdCB7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9Ci0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlcyBUaGUgbGlzdCBvZiBuYW1lc3BhY2VzIHRvIHJlc29sdmUuCi0gICAqIEBwYXJhbSBuc1Jlc29sdmVyIFRoZSBoYXNodGFibGUgdG8gYmUgdXNlZCBhcyB0aGUgbG9jYWwgcmVzb2x2ZXIuCi0gICAqIEBwYXJhbSBwYXJlbnROU1Jlc29sdmVyIFRoZSBoYXNodGFibGUgdG8gYmUgdXNlZCBhcyB0aGUgcGFyZW50IG5hbWVzcGFjZSByZXNvbHZlci4KLSAgICogQHJldHVybiBBIEhhc2h0YWJsZSBvZiBuYW1lc3BhY2VzIHRoYXQgbXVzdCBiZSBkZWNsYXJlZC4KLSAgICovCi0gIHByb3RlY3RlZCBIYXNodGFibGUgcmVzb2x2ZU5hbWVzcGFjZXMoTGlzdCBuYW1lc3BhY2VzLCBIYXNodGFibGUgbnNSZXNvbHZlciwgSGFzaHRhYmxlIHBhcmVudE5TUmVzb2x2ZXIpCi0gIHsKLSAgCUhhc2h0YWJsZSByZXFOU0RlY2wgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgaWYgKG5hbWVzcGFjZXMgIT0gbnVsbCAmJiAhbmFtZXNwYWNlcy5pc0VtcHR5KCkgJiYgbnNSZXNvbHZlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSBuYW1lc3BhY2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKW5hbWVzcGFjZXMuZ2V0KGkpOwotICAgICAgICAvLyBSZW1vdmUgdGhlIG5hbWVzcGFjZSBmcm9tIHRoZSBsaXN0LgotICAgICAgICBuYW1lc3BhY2VzLnJlbW92ZShpKTsKLSAgICAgICAgLy8gRmlyc3QgdHJ5IHRvIHJlc29sdmUgYWdhaW5zdCB0aGUgbG9jYWwgbmFtZXNwYWNlIHJlc29sdmVyLgotICAgICAgICBpZiAobnNSZXNvbHZlci5jb250YWluc0tleShucykpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3QgcmVzb2x2ZWROUyA9IG5zUmVzb2x2ZXIuZ2V0KG5zKTsKLSAgICAgICAgICAvLyBPbmx5IGFkZCB0aGUgbmFtZXNwYWNlIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gdGhlIGxpc3QuCi0gICAgICAgICAgaWYoIW5hbWVzcGFjZXMuY29udGFpbnMocmVzb2x2ZWROUykpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZXNwYWNlcy5hZGQoaSwgbnNSZXNvbHZlci5nZXQobnMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTmV4dCB0cnkgdG8gcmVzb2x2ZSBhZ2FpbnN0IHRoZSBwYXJlbnQgbmFtZXNwYWNlIHJlc29sdmVyLgotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgCWlmIChucy5lcXVhbHMoIiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBucyA9IFhNTE5TOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBucyA9IFhNTE5TICsgIjoiICsgbnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyZW50TlNSZXNvbHZlci5jb250YWluc0tleShucykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCByZXNvbHZlZE5TID0gcGFyZW50TlNSZXNvbHZlci5nZXQobnMpOwotICAgICAgICAgICAgICAvLyBPbmx5IGFkZCB0aGUgbmFtZXNwYWNlIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gdGhlIGxpc3QuCi0gICAgICAgICAgICAgIGlmKCFuYW1lc3BhY2VzLmNvbnRhaW5zKHJlc29sdmVkTlMpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5hZGQoaSwgcmVzb2x2ZWROUyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLy8gU3RpbGwgbmVlZCB0byBkZWNsYXJlIHRoZSBuYW1lc3BhY2UgdGhvdWdoLgotICAgICAgICAgICAgICByZXFOU0RlY2wucHV0KG5zLCByZXNvbHZlZE5TKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXFOU0RlY2w7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlIGFueSBuYW1lc3BhY2UgZnJvbSB0aGUgbmFtZXNwYWNlcyBsaXN0IGlmIGl0IGlzIGluIHRoZSBpbXBvcnQgbGlzdC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VzIFRoZSBuYW1lc3BhY2VzIGxpc3QuCi0gICAqIEBwYXJhbSBpbXBvcnRlZE5hbWVzcGFjZXMgQSBsaXN0IG9mIGltcG9ydGVkIG5hbWVzcGFjZXMuCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB3aXRob3V0IHRoZSBpbXBvcnRlZCBuYW1lc3BhY2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgcmVtb3ZlSW1wb3J0cyhMaXN0IG5hbWVzcGFjZXMsIExpc3QgaW1wb3J0ZWROYW1lc3BhY2VzKQotICB7Ci0gICAgaWYgKG5hbWVzcGFjZXMgIT0gbnVsbCAmJiBpbXBvcnRlZE5hbWVzcGFjZXMgIT0gbnVsbCAmJiAhaW1wb3J0ZWROYW1lc3BhY2VzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpSW1wb3J0ZWROUyA9IGltcG9ydGVkTmFtZXNwYWNlcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGlJbXBvcnRlZE5TLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGlOUyA9IChTdHJpbmcpaUltcG9ydGVkTlMubmV4dCgpOwotCi0gICAgICAgIG5hbWVzcGFjZXMucmVtb3ZlKGlOUyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuYW1lc3BhY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSB0aGUgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgc2NoZW1hIGFuZCB0aGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gdGhlIGlnbm9yZU5hbWVzcGFjZXMKLSAgICogbGlzdCBmcm9tIHRoZSBuYW1lc3BhY2VzIGxpc3QgcHJvdmlkZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlcyBUaGUgbGlzdCBvZiBsb2NhbCBuYW1lc3BhY2VzLgotICAgKiBAcGFyYW0gZWxlbSBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB3aXRoIHRoZSBsb2NhbCBuYW1lc3BhY2VzIHJlbW92ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCByZW1vdmVMb2NhbE5hbWVzcGFjZXMoTGlzdCBuYW1lc3BhY2VzLCBFbGVtZW50IGVsZW0pCi0gIHsKLSAgICBpZiAobmFtZXNwYWNlcyAhPSBudWxsICYmIGVsZW0gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnMgPSBlbGVtLmdldEF0dHJpYnV0ZShUQVJHRVROQU1FU1BBQ0UpOwotICAgICAgbmFtZXNwYWNlcy5yZW1vdmUobnMpOwotCi0gICAgICBmb3IgKGludCBpID0gaWdub3JlTmFtZXNwYWNlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgLy8ga2VlcCByZW1vdmluZyB0aGUgbmFtZXNwYWNlIHVudGlsIGl0IGlzIG5vdCBpbiB0aGUgbGlzdAotICAgICAgICBpZiAobmFtZXNwYWNlcy5yZW1vdmUoaWdub3JlTmFtZXNwYWNlc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5hbWVzcGFjZXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGlzIGluIHRoZSBsaXN0IG9mIHJlcXVpcmVkIG5hbWVzcGFjZXMsCi0gICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEBwYXJhbSByZXFucyBUaGUgbGlzdCBvZiBuYW1lc3BhY2VzIHRvIGNoZWNrIGZvciB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2VzIGlzIGluIHRoZSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1NPQVBFbmNvZGluZ1JlcXVpcmVkKExpc3QgcmVxbnMpCi0gIHsKLSAgICBpZiAocmVxbnMuY29udGFpbnMoU09BUF9FTkNPRElOR19VUkkpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZiYmY4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lU2NoZW1hVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuRXJyb3JNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETDExVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogUGx1Z2luIHZhbGlkYXRvciBmb3IgdGhlIFdTREwgVmFsaWRhdGlvbiBmcmFtZXdvcmsuIFZhbGlkYXRlcyBpbmxpbmUgc2NoZW1hIGZvdW5kIGluIGEgV1NETCBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIElubGluZVNjaGVtYVZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1dBUk5fT0xEX1NDSEVNQV9OQU1FU1BBQ0UgPSAiX1dBUk5fT0xEX1NDSEVNQV9OQU1FU1BBQ0UiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1NDSEVNQSA9ICJfV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1NDSEVNQSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBRVU9URSA9ICInIjsKLSAgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yID0gbnVsbDsKLSAgTGlzdCBlbGVtZW50cyA9IG51bGw7Ci0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkxpc3QsIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAJZWxlbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW0gPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBlbGVtZW50OwotICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgcGFyZW50cy5nZXQocGFyZW50cy5zaXplKCkgLSAxKTsKLSAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0gd3NkbERlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0gICAgLy8gQWRkIGluIHRoZSBuYW1lc3BhY2VzIGRlZmluZWQgaW4gdGhlIGRvYyBhbHJlYWR5IHRoYXQgYXJlbid0IGRlZmluZWQgbG9jYWxseSBpbiB0aGlzIHNjaGVtYS4KLSAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGZvciBuYW1lc3BhY2VzIG90aGVyIHRoZW4gaW4gdGhlIGRlZmludGlvbnMgYW5kIHR5cGVzIGVsZW1lbnRzIGFzCi0gICAgLy8gaW5saW5lIHNjaGVtYSBjYW4gbm90IGhhdmUgYW55IG90aGVyIHBhcmVudHMgYW5kIG11c3QgaGF2ZSB0aGVyZSB0d28gcGFyZW50cy4KLSAgICAvLyBGaXJzdCB0YWtlIGNhcmUgb2YgdGhlIGRlZmluaXRpb25zIGVsZW1lbnQKLSAgICAKLSAgICAvLyBjcmVhdGUgdGhlIGlubGluZSBzY2hlbWEgc3RyaW5nCi0JRWxlbWVudCB3M2NlbGVtZW50ID0gZWxlbS5nZXRFbGVtZW50KCk7Ci0JSGFzaHRhYmxlIHBhcmVudG5hbWVzcGFjZXMgPSBnZXROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbix3M2NlbGVtZW50KTsKLQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gdzNjZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSk7Ci0JLy8gaWYgdGhlIHRhcmdldE5hbWVzcGFjZSBoYXNuJ3QgYmVlbiBkZWZpbmVkIGZvciB0aGUgc2NoZW1hIHVzZSB0aGUgCi0JLy8gdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBkZWZpbml0aW9ucyBlbGVtZW50Ci0JaWYodGFyZ2V0TmFtZXNwYWNlID09IG51bGwgfHwgdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhFTVBUWV9TVFJJTkcpKQotCSB7Ci0JICB0YXJnZXROYW1lc3BhY2UgPSB3c2RsRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkgIHczY2VsZW1lbnQuc2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UsdGFyZ2V0TmFtZXNwYWNlKTsKLQl9Ci0JCi0JU3RyaW5nIHhzZCA9IElubGluZVNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmcodzNjZWxlbWVudCwgZWxlbWVudHMsIGJhc2VMb2NhdGlvbiwgcGFyZW50bmFtZXNwYWNlcyk7Ci0JCi0gICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBnaXZlbiBpcyBvbmUgb2YgdGhlIG9sZCBzY2hlbWEgbmFtZXNwYWNlcyBwcm9kdWNlIGEgd2FybmluZy4KLQlTdHJpbmcgbmFtZXNwYWNlID0gdzNjZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQlpZihuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpIHx8IG5hbWVzcGFjZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCkpCi0JIHsKLQkgIHZhbEluZm8uYWRkV2FybmluZygKLQkgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfV0FSTl9PTERfU0NIRU1BX05BTUVTUEFDRSwgUVVPVEUgKyBDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxICsgUVVPVEUpLCBlbGVtZW50KTsKLQl9Ci0JCi0gICAgLy8gbm93IGNyZWF0ZSBhbmQgY2FsbCB0aGUgdmFsaWRhdG9yIGZvciB0aGUgaW5saW5lIHNjaGVtYQotICAgIFhTRFZhbGlkYXRvciBzY2hlbWF2ID0gbmV3IFhTRFZhbGlkYXRvcigpOwotICAgIAotICAgIC8vU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG5ldyBVUkwodmFsaWRhdG9ybWFuYWdlci5nZXRGaWxlbmFtZSgpKS5nZXRQYXRoKCk7Ci0gICAgSW5saW5lWFNEUmVzb2x2ZXIgaW5saW5lRW50aXR5UmVzb2x2ZXIgPQotICAgICAgZ2V0RW50aXR5UmVzb2x2ZXIod3NkbERlZmluaXRpb24sIChUeXBlcykgcGFyZW50cy5nZXQoMCksIGJhc2VMb2NhdGlvbiwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAvLwlhZGQgaW4gdGhlIGV4dGVybmFsIFhTRCBDYXRhbG9nIHRvIHJlc29sdmUgc2NoZW1hcyBvZmZsaW5lCi0gICAgWE1MRW50aXR5UmVzb2x2ZXJDaGFpbiBlbnRpdHlSZXNvbHZlckNoYWluID0gbmV3IFhNTEVudGl0eVJlc29sdmVyQ2hhaW4oKTsKLSAgICBlbnRpdHlSZXNvbHZlckNoYWluLmFkZEVudGl0eVJlc29sdmVyKGlubGluZUVudGl0eVJlc29sdmVyKTsKLSAgICBlbnRpdHlSZXNvbHZlckNoYWluLmFkZEVudGl0eVJlc29sdmVyKChYTUxFbnRpdHlSZXNvbHZlcil2YWxJbmZvLmdldFVSSVJlc29sdmVyKCkpOwotICAgIC8vZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcihYTUxDYXRhbG9nUmVzb2x2ZXIuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcihuZXcgRmlsZUVudGl0eVJlc29sdmVyKCkpOwotICAgIHNjaGVtYXYudmFsaWRhdGVJbmxpbmVTY2hlbWEoeHNkLCB0YXJnZXROYW1lc3BhY2UsIGJhc2VMb2NhdGlvbiwgZW50aXR5UmVzb2x2ZXJDaGFpbiwgaW5saW5lRW50aXR5UmVzb2x2ZXIpOwotICAgIAotLy8JY2hlY2sgaWYgdGhlIFNPQVAgRW5jb2RpbmcgbmFtZXNwYWNlIGlzIHJlcXVpcmVkIGJ1dCBub3QgaW1wb3J0ZWQKLQkJIGlmIChJbmxpbmVTY2hlbWFHZW5lcmF0b3Iuc29hcEVuY29kaW5nUmVxdWlyZWROb3RJbXBvcnRlZChlbGVtLmdldEVsZW1lbnQoKSwgYmFzZUxvY2F0aW9uLCBwYXJlbnRuYW1lc3BhY2VzKSkKLQkJIHsKLQkJICAgdmFsSW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX1NPQVBFTkNfSU1QT1JURURfU0NIRU1BKSwgZWxlbWVudCk7Ci0JCSB9Ci0KLSAgICAvLyBJZiB0aGUgc2NoZW1hIGlzbid0IHZhbGlkIGFkZCB0aGUgZXJyb3IgbWVzc2FnZXMgcHJvZHVjZWQgdG8gdmFsaW5mby4KLSAgICAvLyBEb24ndCBhZGQgdGhlIGVycm9ycyBpZiB0aGV5IGFyZSBsb2NhdGVkIG9uIGFub3RoZXIgaW5saW5lIHNjaGVtYS4gVGhlc2UKLQkvLyB3aWxsIGJlIHJlcG9ydGVkIHdoZW4gdGhlIG90aGVyIHNjaGVtYSBpcyB2YWxpZGF0ZWQuCi0JCSAKLSAgICBpZiAoIXNjaGVtYXYuaXNWYWxpZCgpKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGVycm9ycyA9IHNjaGVtYXYuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChlcnJvcnMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFcnJvck1lc3NhZ2UgZXJyID0gKEVycm9yTWVzc2FnZSkgZXJyb3JzLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IGVyci5nZXRVUkkoKTsKLSAgICAgICAgaW50IGxpbmUgPSBlcnIuZ2V0RXJyb3JMaW5lKCk7Ci0gICAgICAgIFN0cmluZyBlcnJtZXNzID0gZXJyLmdldEVycm9yTWVzc2FnZSgpOwotICAgICAgICBlcnJtZXNzID0gcmVwbGFjZU5hbWVzcGFjZShlcnJtZXNzLCBuYW1lc3BhY2UpOwotICAgICAgICBpZihsaW5lID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHModmFsSW5mby5nZXRGaWxlVVJJKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoZXJybWVzcywgZ2V0T2JqZWN0QXRMaW5lKGxpbmUgLSAxKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYoIWlubGluZUVudGl0eVJlc29sdmVyLmlzSW5saW5lU2NoZW1hKHVyaSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihlcnJtZXNzLCBsaW5lLCBlcnIuZ2V0RXJyb3JDb2x1bW4oKSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih1cmkgIT0gbnVsbCAmJiAhaW5saW5lRW50aXR5UmVzb2x2ZXIuaXNJbmxpbmVTY2hlbWEodXJpKSkKLSAgICAgICAgewotCSAgICAgIHZhbEluZm8uYWRkRXJyb3IoZXJybWVzcywgMCwwLCB1cmkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGlmIHRoZSBzY2hlbWEgaXMgdmFsaWQsIGFzc2lnbiB0aGUgbW9kZWwgdG8gdGhlIHZhbGlkYXRvcm1hbmFnZXIKLSAgICBlbHNlCi0gICAgewotICAgICAgWFNNb2RlbCB4c01vZGVsID0gc2NoZW1hdi5nZXRYU01vZGVsKCk7Ci0gICAgICB2YWxJbmZvLmFkZFNjaGVtYSh4c01vZGVsKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGFuIGVudGl0eSByZXNvbHZlciB0aGF0IHdpbGwgcmVzb2x2ZSBpbmxpbmUgc2NoZW1hcy4gIEV2ZXJ5IGlubGluZSBzY2hlbWEgaXMgcHJlcmVnaXN0ZXJlZCB3aXRoCi0gICAqIHRoZSByZXNvbHZlci4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcGFyYW0gdHlwZXMgVGhlIHR5cGVzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSByZWZlcmVuY2VMb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzIHNjaGVtYS4KLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gQW4gZW50aXR5IHJlc29sdmVyIHRoYXQgY2FuIHJlc29sdmUgaW5saW5lIHNjaGVtYXMuCi0gICAqLwotICBwcm90ZWN0ZWQgSW5saW5lWFNEUmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgVHlwZXMgdHlwZXMsIFN0cmluZyByZWZlcmVuY2VMb2NhdGlvbiwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkKLSAgewotICAgIElubGluZVhTRFJlc29sdmVyIGVudGl0eVJlc29sdmVyID0gbmV3IElubGluZVhTRFJlc29sdmVyKCk7Ci0vLyAgICBlbnRpdHlSZXNvbHZlci5zZXRSZWZlcmVuY2VMb2NhdGlvbihyZWZlcmVuY2VMb2NhdGlvbik7Ci0gICAgTGlzdCBzY2hlbWFzID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYgKHNjaGVtYXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpU2NoZW1hcyA9IHNjaGVtYXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpU2NoZW1hcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgaVNjaGVtYXMubmV4dCgpOwotICAgICAgICBTdHJpbmcgdGhpc05hbWVzcGFjZSA9IGV4dEVsZW0uZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHRoaXNOYW1lc3BhY2UgIT0gbnVsbCAmJiAhdGhpc05hbWVzcGFjZS5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgCQotICAgICAgICAJRWxlbWVudCBlbGVtZW50ID0gZXh0RWxlbS5nZXRFbGVtZW50KCk7Ci0JCQkKLS8vCQkJY3JlYXRlIHRoZSBpbmxpbmUgc2NoZW1hIHN0cmluZwotCQkJIC8vRWxlbWVudCB3M2NlbGVtZW50ID0gZWxlbS5nZXRFbGVtZW50KCk7Ci0JCQkgSGFzaHRhYmxlIHBhcmVudG5hbWVzcGFjZXMgPSBnZXROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbixlbGVtZW50KTsKLQkJCSBTdHJpbmcgeHNkID0gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmNyZWF0ZVhTRFN0cmluZyhlbGVtZW50LCBlbGVtZW50cywgcmVmZXJlbmNlTG9jYXRpb24sIHBhcmVudG5hbWVzcGFjZXMpOwotICAgICAgICAJLy9hZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbixlbGVtZW50KTsKLSAgICAgICAgICBlbnRpdHlSZXNvbHZlci5hZGQodGhpc05hbWVzcGFjZSwgeHNkKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlbnRpdHlSZXNvbHZlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEudmFsaWRhdG9yLklXU0RMMTFWYWxpZGF0b3Ijc2V0UmVzb3VyY2VCdW5kbGUoamF2YS51dGlsLlJlc291cmNlQnVuZGxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgCW1lc3NhZ2VnZW5lcmF0b3IgPSBuZXcgTWVzc2FnZUdlbmVyYXRvcihyYik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VHZW5lcmF0b3IoTWVzc2FnZUdlbmVyYXRvciBtZXNzZ2VuKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1lc3NnZW47Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGFzIGluIHRoZSBmb3JtIAotICAgKiB4bWxucz0ic29tZW5hbWVzcGFjZSIKLSAgICogZnJvbSB0aGUgZGVmaW5pdGlvbnMgYW5kIHR5cGVzIGVsZW1lbnRzIGFuZCBhZGQgdGhlbSB0byB0aGUgc2NoZW1hIGVsZW1lbnQgc28gdGhlIHNjaGVtYSAKLSAgICogdmFsaWRhdG9yIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlbS4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgdHlwZXMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIGhhc2h0YWJsZSB3aXRoIHRoZSBuYW1lc3BhY2UgZWxlbWVudHMgZnJvbSB0aGUgZWxlbWVudHMgcHJvdmlkZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldE5hbWVzcGFjZURlY2xhcmF0aW9uc0Zyb21QYXJlbnRzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAJSGFzaHRhYmxlIG5zcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBJdGVyYXRvciBuYW1lU3BhY2VzID0gd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICBTdHJpbmcgWE1MTlMgPSBDb25zdGFudHMuQVRUUl9YTUxOUzsKLSAgICAKLSAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSAiIjsKLSAgICB3aGlsZSAobmFtZVNwYWNlcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIG5zcHJlZml4ID0gWE1MTlM7Ci0gICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKSBuYW1lU3BhY2VzLm5leHQoKTsKLSAgICAgIGlmICghbnMuZXF1YWxzSWdub3JlQ2FzZSgiIikpCi0gICAgICB7Ci0gICAgICAgIG5zcHJlZml4ICs9ICI6IjsKLSAgICAgIH0KLSAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUobnNwcmVmaXggKyBucykpCi0gICAgICB7Ci0gICAgICAJbnNzLnB1dChuc3ByZWZpeCArIG5zLCB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UobnMpKTsKLS8vICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuc3ByZWZpeCArIG5zLCB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UobnMpKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICAvLyBOZXh0IGhhbmRsZSB0aGUgcGFyZW50IHR5cGVzIGVsZW1lbnQKLSAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgYXR0c2xlbmd0aCA9IGF0dHMuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSB0ZW1wbm9kZSA9IGF0dHMuaXRlbShpKTsKLSAgICAgIFN0cmluZyBub2RlbmFtZSA9IHRlbXBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAvLyBpZiB0aGlzIGlzIGEgbmFtZXNwYWNlIGF0dHJpYnV0ZQotICAgICAgaWYgKG5vZGVuYW1lLmluZGV4T2YoWE1MTlMpICE9IC0xKQotICAgICAgewotCQluc3MucHV0KG5vZGVuYW1lLCAgdGVtcG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKG5vZGVuYW1lLCB0ZW1wbm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuc3M7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIGxpbmUgbnVtYmVyIGZvciB0aGUgc2NoZW1hIHJldHVybnMgdGhlIGVsZW1lbnQgZm91bmQgb24gdGhhdCBsaW5lLiAKLSAgICogVXNlZnVsIGZvciBvYnRhaW5pbmcgZWxlbWVudHMgZnJvbSBzY2hlbWEgU3RyaW5ncy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIG51bWJlciBmb3IgdGhlIHNjaGVtYS4KLSAgICogQHJldHVybiBUaGUgb2JqZWN0IGxvY2F0ZWQgYXQgdGhlIGxpbmUgb3IgYXQgbGluZSAwIGlmIHRoZSBsaW5lIGlzIGludmFsaWQuCi0gICAqLwotICAgcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3RBdExpbmUoaW50IGxpbmUpCi0gICB7Ci0gICAJaWYobGluZSA8IDAgfHwgbGluZSA+PSBlbGVtZW50cy5zaXplKCkpCi0gICAJewotICAgCSAgbGluZSA9IDA7Ci0gICAJfQotCXJldHVybiBlbGVtZW50cy5nZXQobGluZSk7Ci0gICB9Ci0gICAKLSAgLyoqCi0gICAqIFJlcGxhY2UgYW55IGluc3RhbmNlIG9mIHRoZSAyMDAxIHNjaGVtYSBuYW1lc3BhY2UgaW4gdGhlIGdpdmVuIG1lc3NhZ2Ugd2l0aAotICAgKiB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gcmVwbGFjZSB0aGUgbmFtZXNwYWNlIGluLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdXNlZCBmb3IgcmVwbGFjZW1lbnQuCi0gICAqIEByZXR1cm4gVGhlIG1lc3NhZ2Ugd2l0aCB0aGUgMjAwMSBzY2hlbWEgbmFtZXNwYWNlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyByZXBsYWNlTmFtZXNwYWNlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbmFtZXNwYWNlKQotICAgewotICAgICBTdHJpbmcgeHNkMjAwMSA9IENvbnN0YW50cy5OU19VUklfWFNEXzIwMDE7Ci0gICAgIGludCBzdGFydCA9IG1lc3NhZ2UuaW5kZXhPZih4c2QyMDAxKTsKLSAgICAgaW50IGVuZCA9IHN0YXJ0ICsgeHNkMjAwMS5sZW5ndGgoKTsKLSAgICAgaWYoc3RhcnQgPCAwKQotICAgICB7Ci0gICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgIH0KLSAgICAgU3RyaW5nIHN0YXJ0U3RyaW5nID0gbWVzc2FnZS5zdWJzdHJpbmcoMCxzdGFydCk7Ci0gICAgIFN0cmluZyBlbmRTdHJpbmcgPSBtZXNzYWdlLnN1YnN0cmluZyhlbmQsbWVzc2FnZS5sZW5ndGgoKSk7Ci0gICAgIHJldHVybiBzdGFydFN0cmluZyArIG5hbWVzcGFjZSArIGVuZFN0cmluZzsKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVYU0RSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0lubGluZVhTRFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODYzNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0lubGluZVhTRFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogQW4gWE1MRW50aXR5UmVzb2x2ZXIgdGhhdCBhbGxvd3MgaW5saW5lIHNjaGVtYXMgdG8gcmVzb2x2ZSBlYWNoIG90aGVyIHRocm91Z2ggaW1wb3J0cy4KLSAqLwotcHVibGljIGNsYXNzIElubGluZVhTRFJlc29sdmVyIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBGSUxFX1BSRUZJWCA9ICJmaWxlOiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGVudGl0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotLy8gIHByb3RlY3RlZCBTdHJpbmcgcmVmTG9jYXRpb24gPSBudWxsOwotICBwcm90ZWN0ZWQgWE1MRW50aXR5UmVzb2x2ZXIgZXh0ZXJuYWxSZXNvbHZlciA9IG51bGw7Ci0gIHByb3RlY3RlZCBYTUxJbnB1dFNvdXJjZSByZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcmVmZXJyaW5nU2NoZW1hTmFtZXNwYWNlID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHVjdG9yLgotICAgKi8KLSAgcHVibGljIElubGluZVhTRFJlc29sdmVyKCkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJlc291cmNlSWRlbnRpZmllcikKLQkJIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlTdHJpbmcgc3lzdGVtSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0RXhwYW5kZWRTeXN0ZW1JZCgpOwkgCi0JU3RyaW5nIHB1YmxpY0lkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldFB1YmxpY0lkKCk7CQotCVN0cmluZyBuYW1lc3BhY2UgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TmFtZXNwYWNlKCk7Ci0JWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotCVJlYWRlciByZWFkZXIgPSBudWxsOwotCVN0cmluZyBzY2hlbWEgPSBudWxsOwotCWlmIChzeXN0ZW1JZCA9PSBudWxsKQotCXsKLQkgIGlmKHB1YmxpY0lkID09IG51bGwpCi0JICB7Ci0JICAJaWYobmFtZXNwYWNlID09IG51bGwpCi0JICAJewkKLQkgICAgICByZXR1cm4gbnVsbDsKLQkgIAl9Ci0JICAJZWxzZQotCSAgCXsKLQkgIAkJc3lzdGVtSWQgPSBuYW1lc3BhY2U7Ci0JICAJfQotCSAgfQotCSAgZWxzZQotCSAgewkKLQkgICAgc3lzdGVtSWQgPSBwdWJsaWNJZDsKLQkgIH0KLQl9Ci0JICAKLQlpZihyZWZlcnJpbmdTY2hlbWFOYW1lc3BhY2UgIT0gbnVsbCAmJiByZWZlcnJpbmdTY2hlbWFOYW1lc3BhY2UuZXF1YWxzKHN5c3RlbUlkKSkKLQl7Ci0JCWlmKHJlZmVycmluZ1NjaGVtYUlucHV0U291cmNlIT1udWxsKQotCQl7Ci0JCQlyZXR1cm4gcmVmZXJyaW5nU2NoZW1hSW5wdXRTb3VyY2U7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoKHNjaGVtYSA9IChTdHJpbmcpIGVudGl0aWVzLmdldChzeXN0ZW1JZCkpICE9IG51bGwgJiYgIXNjaGVtYS5lcXVhbHMoIiIpKQotCXsKLQkJaXMgPSBuZXcgWE1MSW5wdXRTb3VyY2UocHVibGljSWQsIHN5c3RlbUlkLCBzeXN0ZW1JZCxuZXcgU3RyaW5nUmVhZGVyKHNjaGVtYSksbnVsbCk7Ci0JfQotCQotICAgIC8vaWYoaXMgPT0gbnVsbCkKLSAgICAvL3sKLSAgICAvLwl0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLSAgICAvL30KLQlyZXR1cm4gaXM7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGFuIGlubGluZSBzY2hlbWEuCi0gICAqIAotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIC0gdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYQotICAgKiBAcGFyYW0gc2NoZW1hIC0gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjaGVtYQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFN0cmluZyBzY2hlbWEpCi0gIHsKLSAgICBlbnRpdGllcy5wdXQodGFyZ2V0TmFtZXNwYWNlLCBzY2hlbWEpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIHRoZSByZWZlcnJpbmcgaW5saW5lIHNjaGVtYS4gCi0gICAqIAotICAgKiBAcGFyYW0gaW5wdXRTb3VyY2UgLSBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbmxpbmUgc2NoZW1hCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSB0aGUgbmFtZXNwYWNlIG9mIHRoZSBpbmxpbmUgc2NoZW1hCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRSZWZlcnJpbmdTY2hlbWEoWE1MSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UsIFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICByZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOwotICAgIHJlZmVycmluZ1NjaGVtYU5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBuYW1lc3BhY2UgY29ycmVzcG9uZHMgdG8gYW4gaW5saW5lIHNjaGVtYSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbmFtZXNwYWNlIGNvcnJlc3BvbmRzIHRvIGFuIGlubGluZSBzY2hlbWEsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSW5saW5lU2NoZW1hKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICByZXR1cm4gZW50aXRpZXMuY29udGFpbnNLZXkobmFtZXNwYWNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1NjaGVtYUF0dHJpYnV0ZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvU2NoZW1hQXR0cmlidXRlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0M2UxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvU2NoZW1hQXR0cmlidXRlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy5TY2hlbWFTeW1ib2xzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuU3ltYm9sVGFibGU7Ci0vKioKLSAqIFRoaXMgY2xhc3Mgd2lsbCBhbGxvdyB0aGUgY2FsbGluZyBjb2RlIHRvIHNlZSBpZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQgaW4gc2NoZW1hLgotICogVGhpcyBzZXJ2ZXMgYXMgc2NoZW1hIGZvciBzY2hlbWEuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFBdHRyaWJ1dGVUYWJsZSBleHRlbmRzIFN5bWJvbFRhYmxlCi17Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZVRhYmxlKCkKLSAgewotICAgIC8vIGFkZCBhbGwgb2YgdGhlIHN5Ym9scyB0byB0aGUgdGFibGUuIFNjaGVtYVN5bWJvbHMgcHJvYmFibHkgc2hvdWxkIGhhdmUKLSAgICAvLyBhIFN5bWJvbFRhYmxlIGZvciB0aGVzZSBidXQgaXQgZG9lc24ndAotCi0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5EQU5ZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFdPUE9VTkRMT0NBTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5ET1RIRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UV09QT1VORFRBUkdFVE5TKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUE9VTkRBTEwpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9GQUxTRV8wKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFJVRV8xKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQU5ZU0lNUExFVFlQRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0FOWVRZUEUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9BTllVUkkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CQVNFNjRCSU5BUlkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CT09MRUFOKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQllURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0NPTExBUFNFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RBVEVUSU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREVDSU1BTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RPVUJMRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RVUkFUSU9OKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRU5USVRZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRU5USVRJRVMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9FWFRFTlNJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9GQUxTRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0ZMT0FUKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSEVYQklOQVJZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSUQpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9JRFJFRik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lEUkVGUyk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lOVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9MQU5HVUFHRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xBWCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xJU1QpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9MT05HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTkFNRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX05FR0FUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX01PTlRIKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTU9OVEhEQVkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OQ05BTUUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OTVRPS0VOKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTk1UT0tFTlMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT05ORUdBVElWRUlOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT05QT1NJVElWRUlOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT1JNQUxJWkVEU1RSSU5HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTk9UQVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9PUFRJT05BTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1BPU0lUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1BSRVNFUlZFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUFJPSElCSVRFRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1FOQU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUVVBTElGSUVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVQTEFDRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1JFUVVJUkVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVTVFJJQ1RJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TSE9SVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1NLSVApOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVFJJQ1QpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVFJJTkcpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVUJTVElUVVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9USU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVE9LRU4pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UUlVFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5CT1VOREVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5JT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9VTlFVQUxJRklFRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOU0lHTkVEQllURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOU0lHTkVESU5UKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURMT05HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURTSE9SVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1lFQVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9ZRUFSTU9OVEgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvVmFsaWRhdGVFcnJvckhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzhmYzE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20zLkRPTUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuRXJyb3JNZXNzYWdlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFhNTEVycm9ySGFuZGxlciB0aGF0IGNhcHR1cmVzIGVycm9yIGZyb20gWGVyY2VzLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBYTUxFcnJvckhhbmRsZXIKLXsKLSAgQXJyYXlMaXN0IGVycm9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBlcnJvciBtZXNzYWdlcyBjcmVhdGVkIGJ5IFhlcmNlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVycm9ycyBsaXN0LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIHZhbGlkYXRpb24gbWVzc2FnZSBmcm9tIHRoZSBleGNlcHRpb24gYW5kIHNldmVyaXR5LgotICAgKiAKLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvci4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eS4KLSAgICogQHJldHVybiBBbiBlcnJvciBtZXNzYWdlLgotICAgKi8KLSAgcHJvdGVjdGVkIEVycm9yTWVzc2FnZSBjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZUZvckV4Y2VwdGlvbihYTUxQYXJzZUV4Y2VwdGlvbiBlcnJvciwgaW50IHNldmVyaXR5KQotICB7Ci0gICAgU3RyaW5nIHVyaSA9IGVycm9yLmdldExpdGVyYWxTeXN0ZW1JZCgpOwotICAgIGlmKHVyaSA9PSBudWxsKQotICAgIHsKLSAgICAgIHVyaSA9IGVycm9yLmdldFB1YmxpY0lkKCk7Ci0gICAgfQotICAgIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0gICAgZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShlcnJvci5nZXRMaW5lTnVtYmVyKCkpOwotICAgIGVycm9yTWVzc2FnZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3IuZ2V0TWVzc2FnZSgpKTsKLSAgICBlcnJvck1lc3NhZ2Uuc2V0RXJyb3JDb2x1bW4oZXJyb3IuZ2V0Q29sdW1uTnVtYmVyKCkpOwotICAgIGVycm9yTWVzc2FnZS5zZXRVUkkodXJpKTsKLSAgICBlcnJvck1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciNlcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLSAgewotICAgIGVycm9yTGlzdC5hZGQoY3JlYXRlVmFsaWRhdGlvbk1lc3NhZ2VGb3JFeGNlcHRpb24oZXhjZXB0aW9uLCBET01FcnJvci5TRVZFUklUWV9FUlJPUikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjZmF0YWxFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICB7Ci0gICAgZXJyb3JMaXN0LmFkZChjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZUZvckV4Y2VwdGlvbihleGNlcHRpb24sIERPTUVycm9yLlNFVkVSSVRZX0ZBVEFMX0VSUk9SKSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciN3YXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gIHsKLSAgICBlcnJvckxpc3QuYWRkKGNyZWF0ZVZhbGlkYXRpb25NZXNzYWdlRm9yRXhjZXB0aW9uKGV4Y2VwdGlvbiwgRE9NRXJyb3IuU0VWRVJJVFlfV0FSTklORykpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWE1MRW50aXR5UmVzb2x2ZXJDaGFpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1hNTEVudGl0eVJlc29sdmVyQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5MzYxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWE1MRW50aXR5UmVzb2x2ZXJDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEhhbmRsZSBhIGNoYWluIG9mIGVudGl0eSByZXNvbHZlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFbnRpdHlSZXNvbHZlckNoYWluIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLXsKLSAgcHJpdmF0ZSBMaXN0IGVudGl0eVJlc29sdmVycyA9IG5ldyBWZWN0b3IoKTsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHhtbFJlc291cmNlSWRlbnRpZmllcikgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLSAgICBJdGVyYXRvciBlbnRpdHlSZXNvbHZlckl0ZXIgPSBlbnRpdHlSZXNvbHZlcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZW50aXR5UmVzb2x2ZXJJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IChYTUxFbnRpdHlSZXNvbHZlcillbnRpdHlSZXNvbHZlckl0ZXIubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlzID0gZW50aXR5UmVzb2x2ZXIucmVzb2x2ZUVudGl0eSh4bWxSZXNvdXJjZUlkZW50aWZpZXIpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFhOSUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFRocm93IGFuZCBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBpc24ndCBmb3VuZAotICAgIGlmIChpcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGxvY2F0ZSBmaWxlIik7Ci0gICAgfQotICAgIHJldHVybiBpczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gZW50aXR5IHJlc29sdmVyIHRvIHRoaXMgY2hhaW4uCi0gICAqIAotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgVGhlIHJlc29sdmVyIHRvIGFkZCB0byB0aGUgY2hhaW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFbnRpdHlSZXNvbHZlcihYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikKLSAgewotICAgIGVudGl0eVJlc29sdmVycy5hZGQoZW50aXR5UmVzb2x2ZXIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWFNEVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWFNEVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDk3ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1hTRFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2Q7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuWE1MR3JhbW1hclByZXBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTEdyYW1tYXJQb29sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWE1MR3JhbW1hckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyUG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWFNHcmFtbWFyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotCi0KLS8qKgotICogVmFsaWRhdGUgc2NoZW1hcyBmcm9tIGZpbGVzIG9yIFN0cmluZy4KLSAqLwotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUVTUEFDRVNfRkVBVFVSRV9JRCA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTQ0hFTUFfVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZVTExfQ0hFQ0tJTkdfRkVBVFVSRV9JRCA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYS1mdWxsLWNoZWNraW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBDT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUl9JRCA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEZJTEVfUFJFRklYID0gImZpbGU6IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEFSR0VUTkFNRVNQQUNFID0gInRhcmdldE5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgSU1QT1JUID0gImltcG9ydCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBpZ25vcmVOYW1lc3BhY2VzID0KLSAgICB7ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYSIgfTsKLQotICBwcm90ZWN0ZWQgWFNNb2RlbCB4c01vZGVsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkWFNEOwotICBwcm90ZWN0ZWQgTGlzdCBlcnJvcnM7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsZWxvY2F0aW9uOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBYU0RWYWxpZGF0b3IoKQotICB7Ci0gICAgeHNNb2RlbCA9IG51bGw7Ci0gICAgaXNWYWxpZFhTRCA9IGZhbHNlOwotICAgIGVycm9ycyA9IG51bGw7Ci0gIH0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIGFuIGlubGluZSBzY2hlbWEuCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hIEEgc2NoZW1hIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLgotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBmaWxlbG9jIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgc2NoZW1hLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGVJbmxpbmVTY2hlbWEoU3RyaW5nIHNjaGVtYSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU3RyaW5nIGZpbGVsb2MpCi0gIHsKLSAgICB2YWxpZGF0ZUlubGluZVNjaGVtYShzY2hlbWEsIHRhcmdldE5hbWVzcGFjZSwgZmlsZWxvYywgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSBhbiBpbmxpbmUgc2NoZW1hIGFuZCBzcGVjaWZ5IGFuIGVudGl0eSByZXNvbHZlci4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgVGhpcyBzY2hlbWEgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuCi0gICAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGZpbGVsb2MgVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgc2NoZW1hLgotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXJDaGFpbiBUaGUgZW50aXR5IHJlc29sdmVyIGNoYWluLgotICAgKiBAcGFyYW0gaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIgQW4gaW5saW5lIHNjaGVtYSByZXNvbHZlciBmb3IgdGhpcyBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUlubGluZVNjaGVtYSgKLSAgICBTdHJpbmcgc2NoZW1hLAotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgU3RyaW5nIGZpbGVsb2MsCi0gICAgWE1MRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXJDaGFpbiwKLSAgICBYTUxFbnRpdHlSZXNvbHZlciBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcikKLSAgewotICAgIGZpbGVsb2NhdGlvbiA9IGZpbGVsb2M7Ci0gICAgCi0gICAgdmFsaWRhdGVYU0Qoc2NoZW1hLCB0cnVlLCBlbnRpdHlSZXNvbHZlckNoYWluLHRhcmdldE5hbWVzcGFjZSwgaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIGxvY2F0ZWQgYXQgdGhlIHVyaSBzcGVjaWZpZWQgd2l0aCB0aGUgZ2l2ZW4gZW50aXR5IHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBBbiBhYnNvbHV0ZSB1cmkgZm9yIHRoZSBzY2hlbWEgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBlbnRpdHlSZXNvbHZlciBBbiBlbnRpdHkgcmVzb2x2ZXIgdG8gYmUgdXNlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKFN0cmluZyB1cmksIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyKQotICB7Ci0gICAgdmFsaWRhdGVYU0QodXJpLCBmYWxzZSwgZW50aXR5UmVzb2x2ZXIsIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIHNjaGVtYS4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgVGhlIHNjaGVtYSBvciBpdCdzIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gaW5saW5lWFNEIFRydWUgaWYgYW4gaW5saW5lIHNjaGVtYSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgQW4gZW50aXR5IHJlc29sdmVyIHRvIHVzZS4KLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hIGJlaW5nIHZhbGlkYXRlZC4KLSAgICogQHBhcmFtIGlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyIEFuIGlubGluZSBzY2hlbWEgZW50aXR5IHJlc29sdmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYU0QoU3RyaW5nIHNjaGVtYSwgYm9vbGVhbiBpbmxpbmVYU0QsIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBYTUxFbnRpdHlSZXNvbHZlciBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcikKLSAgewotICAgIFZhbGlkYXRlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBWYWxpZGF0ZUVycm9ySGFuZGxlcigpOwotICAgIGVycm9ySGFuZGxlci5nZXRFcnJvck1lc3NhZ2VzKCkuY2xlYXIoKTsKLSAgICB0cnkKLSAgICB7Ci0JCVhNTEdyYW1tYXJQcmVwYXJzZXIgZ3JhbW1hclByZXBhcnNlciA9IG5ldyBYTUxHcmFtbWFyUHJlcGFyc2VyKCk7Ci0JCVhNTEdyYW1tYXJQb29sIGdyYW1tYXJQb29sID0gbmV3IFhNTEdyYW1tYXJQb29sSW1wbCgpOwotCQlncmFtbWFyUHJlcGFyc2VyLnNldEdyYW1tYXJQb29sKGdyYW1tYXJQb29sKTsKLQkgCi0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotICAgICAgaWYgKGVudGl0eVJlc29sdmVyICE9IG51bGwpCi0gICAgICB7Ci0JCWdyYW1tYXJQcmVwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOwotICAgICAgfQotCi0gICAgICB0cnkKLSAgICAgIHsKLQkJWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotICAgICAgICAvLyB0aGlzIGFsbG93cyBzdXBwb3J0IGZvciB0aGUgaW5saW5lIHNjaGVtYSBpbiBXU0RMIGRvY3VtZW50cwotICAgICAgICBpZiAoaW5saW5lWFNEKQotICAgICAgICB7Ci0gICAgICAgIAkKLSAgICAgICAgCVJlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHNjaGVtYSk7Ci0JCQlpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShudWxsLGZpbGVsb2NhdGlvbixmaWxlbG9jYXRpb24scmVhZGVyLG51bGwpOwotCQkJCi0JCQkoKElubGluZVhTRFJlc29sdmVyKWlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyKS5hZGRSZWZlcnJpbmdTY2hlbWEoaXMsdGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICB9Ci0gICAgICAgIC8vIGdldCB0aGUgaW5wdXQgc291cmNlIGZvciBhbiBleHRlcm5hbCBzY2hlbWEgZmlsZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShudWxsLHNjaGVtYSxzY2hlbWEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBncmFtbWFyUHJlcGFyc2VyLnJlZ2lzdGVyUHJlcGFyc2VyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLG51bGwvKnNjaGVtYUxvYWRlciovKTsKLSAgICAgICAgWE1MR3JhbW1hckxvYWRlciBzY2hlbWFMb2FkZXIgPSBncmFtbWFyUHJlcGFyc2VyLmdldExvYWRlcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSk7Ci0KLQkJWFNHcmFtbWFyIGdyYW1tYXIgPSAoWFNHcmFtbWFyKWdyYW1tYXJQcmVwYXJzZXIucHJlcGFyc2VHcmFtbWFyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLGlzKTsKLQkJeHNNb2RlbCA9IGdyYW1tYXIudG9YU01vZGVsKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vcGFyc2VyIHdpbGwgcmV0dXJuIG51bGwgcG9pbnRlciBleGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIHN0cnVjdHVyYWxseSBpbnZhbGlkCi0gICAgICAgIC8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgfQotCi0gICAgICBlcnJvcnMgPSBlcnJvckhhbmRsZXIuZ2V0RXJyb3JNZXNzYWdlcygpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICAgIGlmIChlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGlzVmFsaWRYU0QgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBYU01vZGVsIGNyZWF0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBYU01vZGVsIGNyZWF0ZWQuCi0gICAqLwotCi0gIHB1YmxpYyBYU01vZGVsIGdldFhTTW9kZWwoKQotICB7Ci0gIAlyZXR1cm4geHNNb2RlbDsKLSAgfQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzY2hlbWEgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2NoZW1hIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiBpc1ZhbGlkWFNEOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZXJyb3IgbGlzdC4KLSAgICogCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIGVycm9yIGZyb20gdGhlIHNjaGVtYS4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9ycygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9JV1NETDIwVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9JV1NETDIwVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTNmNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvSVdTREwyMFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDIwOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uSW5mbzsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgdmFsaWRhdG9yIHBsdWdnZWQgaW50byB0aGUgV1NETCAyLjAgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXU0RMMjBWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBwYXJlbnRzIEEgbGlzdCBvZiBwYXJlbnRzIG9mIHRoaXMgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIHJlc291cmNlIGJ1bmRsZSBvZiB0aGUgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvVmFsaWRhdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4M2JkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0vKioKLSAqIEEgcmVnaXN0cnkgdG8gaG9sZCBhbGwgdGhlIFdTREwgMi4wIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeQotewotCi0gIHByb3RlY3RlZCBzdGF0aWMgVmFsaWRhdG9yUmVnaXN0cnkgdmVySW5zdGFuY2U7Ci0KLSAgcHJvdGVjdGVkIE1hcCB2YWxpZGF0b3JSZWcgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFZhbGlkYXRvclJlZ2lzdHJ5KCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGlzIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAodmVySW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB2ZXJJbnN0YW5jZSA9IG5ldyBWYWxpZGF0b3JSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gdmVySW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhpcyB2YWxpZGF0b3IgZGVsZWdhdGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRoZSB2YWxpZGF0b3IgaXMgYXNzb2NpYXRlZCB3aXRoLgotICAgKiBAcGFyYW0gdmFsRGVsZWdhdGUgVGhlIHZhbGlkYXRvciBkZWxlZ2F0ZSB0byByZWdpc3Rlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UsIFdTREwyMFZhbGlkYXRvckRlbGVnYXRlIHZhbERlbGVnYXRlKQotICB7Ci0gICAgLy8gYWxsb3cgdGhlIG51bGwgbmFtZXNwYWNlIGJ1dCBtYWtlIGl0IHRoZSBlbXB0eSBzdHJpbmcKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gIiI7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSB2YWxpZGF0b3IgdG8gdGhlIGhhc2h0YWJsZQotICAgIHZhbGlkYXRvclJlZy5wdXQobmFtZXNwYWNlLCB2YWxEZWxlZ2F0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQXNrIGZvciB0aGUgdmFsaWRhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWVzcGFjZS4gSWYgbm9uZSBpcyBmb3VuZAotICAgKiByZXR1cm4gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgdmFsaWRhdG9yLgotICAgKiBAcmV0dXJuIFRoZSBXU0RMIDEuMSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgSVdTREwyMFZhbGlkYXRvciBxdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICAvLyBpZiB0aGUgbmFtZXNwYWNlIGlzIG51bGwgYWxsb3cgaXQgYW5kIHRyZWF0IGl0IGFzIHRoZSBlbXB0eSBzdHJpbmcKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gIiI7Ci0gICAgfQotICAgIFdTREwyMFZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gKFdTREwyMFZhbGlkYXRvckRlbGVnYXRlKXZhbGlkYXRvclJlZy5nZXQobmFtZXNwYWNlKTsKLSAgICBpZihkZWxlZ2F0ZSAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFZhbGlkYXRvcigpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCB0ZWxscyB3aGV0aGVyIGEgdmFsaWRhdG9yIGZvciBhIGdpdmVuIG5hbWVzcGFjZSBpcyByZWdpc3RlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRvIGNoZWNrLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYSB2YWxpZGF0b3IgcmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUmVnaXN0ZXJlZFZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgaWYgKHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkobmFtZXNwYWNlKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1dTREwyMEJhc2ljVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9XU0RMMjBCYXNpY1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTgwNzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1dTREwyMEJhc2ljVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDIwOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLS8qKgotICogVmFsaWRhdGUgdGhlIGVsZW1lbnRzIGRlZmluZWQgaW4gYSBXU0RMIDEuMSBEb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFdTREwyMEJhc2ljVmFsaWRhdG9yIGltcGxlbWVudHMgSVdTREwyMFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUVTUEFDRVNfRkVBVFVSRV9JRCA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTQ0hFTUFfVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZVTExfQ0hFQ0tJTkdfRkVBVFVSRV9JRCA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYS1mdWxsLWNoZWNraW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBDT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUl9JRCA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNPQVBfRU5DT0RJTkdfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKLQotICBwcm90ZWN0ZWQgZmluYWwgaW50IEVMRU1FTlQgPSAwOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IFRZUEUgPSAxOwotCi0gIC8vcHJvdGVjdGVkIFdTREwyMFZhbGlkYXRvckNvbnRyb2xsZXIgdmFsaWRhdG9yY29udHJvbGxlcjsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETDIwQmFzaWNWYWxpZGF0b3IoKQotICB7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnZhbGlkYXRvci5JV1NETDExVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLlZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIC8vdGhpcy52YWxpZGF0b3Jjb250cm9sbGVyID0gdmFsaWRhdG9yY29udHJvbGxlcjsKLSAgICAvL3NldERlZmF1bHRSZXNvdXJjZUJ1bmRsZUlmTmVlZGVkKHZhbGlkYXRvcmNvbnRyb2xsZXIpOwotICAJCi0vLyAgICBEZWZpbml0aW9ucyB3c2RsRGVmaW5pdGlvbnMgPSAoRGVmaW5pdGlvbnMpZWxlbWVudDsKLS8vICAgIHZhbGlkYXRlVHlwZXMod3NkbERlZmluaXRpb25zLCB2YWxJbmZvKTsKLS8vICAgIHZhbGlkYXRlU2VydmljZXMod3NkbERlZmluaXRpb25zLCB2YWxJbmZvKTsKLS8vICAgIHZhbGlkYXRlQmluZGluZ3Mod3NkbERlZmluaXRpb25zLCB2YWxJbmZvKTsKLS8vICAgIHZhbGlkYXRlSW50ZXJmYWNlcyh3c2RsRGVmaW5pdGlvbnMsIHZhbEluZm8pOwotCi0gIH0KLQotICAvKioKLSAgICogVGFrZXMgYSBsaXN0IG9mIEV4dGVuc2liaWxpdHlFbGVtZW50cyBhbmQgY2hlY2tzIGlmIHRoZXJlJ3MgYSB2YWxpZGF0b3IgCi0gICAqIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGVsZW1lbnQgYW5kIGlmIHNvIGNhbGxzIHRoZSB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50cyBUaGUgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBlbGVtZW50cy4KLSAgICogQHBhcmFtIGV4dGVuc2liaWxpdHlFbGVtZW50cyBUaGUgbGlzdCBvZiBlbGVtZW50cyB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHZhbGlkYXRvcmNvbnRyb2xsZXIgVGhlIHZhbGlkYXRvciBjb250cm9sbGVyLgotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb24gVGhlIGRlZm5pbnRpb25zIGVsZW1lbnQgZm9yIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KAotLy8gICAgTGlzdCBwYXJlbnRzLAotLy8gICAgRWxlbWVudEluZm9JdGVtW10gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLAotLy8gICAgVmFsaWRhdGlvbkluZm8gdmFsSW5mbywKLS8vICAgIERlZmluaXRpb25zIHdzZGxEZWZpbml0aW9ucykKLS8vICB7Ci0vLyAgICAvL1RPRE86IGdldCB0aGUgdmFsaWRhdGlvbiBjb250cm9sbGVyIHN0YXRpY2FsbHkgdG8gZ2V0IHRoZSBleHRlbnNpYmlsaXR5IHZhbGlkYXRvcgotLy8vLyAgICBWYWxpZGF0b3JSZWdpc3RyeSB2ZXIgPSBWYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotLy8vLyAgICBJdGVyYXRvciBleHRFbGVtcyA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOwotLy8vLyAgICB3aGlsZSAoZXh0RWxlbXMuaGFzTmV4dCgpKQotLy8vLyAgICB7Ci0vLy8vICAgICAgRWxlbWVudEluZm9JdGVtIGVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZXh0RWxlbXMubmV4dCgpOwotLy8vLyAgICAgIC8vICAgICAgaWYgKHZlci5oYXNSZWdpc3RlcmVkVmFsaWRhdG9yKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKSkpCi0vLy8vICAgICAgLy8gICAgICB7Ci0vLy8vICAgICAgdmFsaWRhdG9yY29udHJvbGxlci52YWxpZGF0ZVdTRExFbGVtZW50KGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKSwgZWxlbWVudCwgcGFyZW50cyk7Ci0vLy8vICAgICAgLy92ZXIucXVlcnlWYWxpZGF0b3JSZWdpc3RyeShlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpLnZhbGlkYXRlKGVsZW1lbnQsIHBhcmVudHMsIHZhbGlkYXRvcm1hbmFnZXIpOwotLy8vLyAgICAgIC8vICAgICAgfQotLy8vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBJZiB0aGUgcmVzb3VyY2VidW5kbGUgaGFzbid0IGJlZW4gc2V0LCBzZXQgaXQgdG8gdGhlIG9uZSByZWdpc3RlcmVkIHdpdGggdGhlIFZhbGlkYXRvckNvbnRyb2xsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgdG8gZ2V0IHRoZSByZXNvdXJjZSBidW5kbGUgZnJvbS4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlc291cmNlQnVuZGxlSWZOZWVkZWQoV1NETDIwVmFsaWRhdG9yQ29udHJvbGxlciB2YWxpZGF0b3Jjb250cm9sbGVyKQotLy8gIHsKLS8vICAgIGlmIChtZXNzYWdlZ2VuZXJhdG9yID09IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIHNldFJlc291cmNlQnVuZGxlKHZhbGlkYXRvcmNvbnRyb2xsZXIuZ2V0UmVzb3VyY2VCdW5kbGUoKSk7Ci0vLyAgICB9Ci0vLyAgfQotICAvKioKLSAgICogU2V0IHRoZSByZXNvdXJjZWJ1bmRsZSB0byB0aGUgb25lIHNwZWNpZmllZC4KLSAgICogCi0gICAqIEBwYXJhbSByYiBUaGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJiKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhhdCB0aGUgVHlwZXMgZWxlbWVudCBpcyBjb3JyZWN0LiAKLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudCBmcm9tIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICAgKi8KLQotLy8gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVHlwZXMoRGVmaW5pdGlvbnMgd3NkbERlZmluaXRpb25zLCBWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotLy8gIHsKLS8vICAgIFR5cGVzIHR5cGVzID0gd3NkbERlZmluaXRpb25zLmdldFR5cGVzKCk7Ci0vLyAgICAvLyBlbnN1cmUgdGhhdCB0eXBlcyBpcyBkZWZpbmVkCi0vLyAgICBpZiAodHlwZXMgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgTGlzdCBwYXJlbnRzID0gbmV3IFZlY3RvcigpOwotLy8gICAgICBwYXJlbnRzLmFkZCh3c2RsRGVmaW5pdGlvbnMpOwotLy8gICAgICBFbGVtZW50SW5mb0l0ZW0gZWxlbWVudEluZm9JdGVtc1tdID0gdHlwZXMuZ2V0RWxlbWVudEluZm9JdGVtcygpOwotLy8gICAgICBwYXJlbnRzLmFkZCgwLCB0eXBlcyk7Ci0vLyAgICAgIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KHBhcmVudHMsIGVsZW1lbnRJbmZvSXRlbXMsIHZhbEluZm8sIHdzZGxEZWZpbml0aW9ucyk7Ci0vLyAgICAgIHBhcmVudHMucmVtb3ZlKDApOwotLy8gICAgfQotLy8gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIGFsbCBvZiB0aGUgZGVjbGFyZWQgc2VydmljZXMgZm9yIHRoZSBkZWZpbml0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9ucyBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBWYWxpZGF0aW9uIGluZm8gZm9yIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2VydmljZXMoRGVmaW5pdGlvbnMgd3NkbERlZmluaXRpb25zLCBWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotLy8gIHsKLS8vCi0vLyAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgdGhhdCB0aGUgYmluZGluZ3MgcmVmZXIgdG8gdmFsaWQgaW50ZXJmYWNlcyBhbmQgYWxsIG9mIHRoZSBvcGVyYXRpb25zCi0gICAqIGluIGEgZ2l2ZW4gYmluZGluZyByZWZlciB0byBhIGRlZmluZWQgb3BlcmF0aW9uIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZwotICAgKiBpbnRlcmZhY2VzLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9ucyBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBWYWxpZGF0aW9uIGluZm8gZm9yIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQmluZGluZ3MoRGVmaW5pdGlvbnMgd3NkbERlZmluaXRpb25zLCBWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotLy8gIHsKLS8vCi0vLyAgfQotCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IGFsbCBvZiB0aGUgSW50ZXJmYWNlcyBoYXZlIHZhbGlkIG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGVpcgotICAgKiBvcGVyYXRpb24gaW5wdXQsIG91dHB1dCwgaW5mYXVsdCBhbmQgb3V0ZmF1bHQgdHlwZXMuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb25zIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFZhbGlkYXRpb24gaW5mbyBmb3IgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICovCi0vLyAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSW50ZXJmYWNlcyhEZWZpbml0aW9ucyB3c2RsRGVmaW5pdGlvbnMsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0vLyAgewotLy8gICAgCi0vLyAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbmFtZSBpcyBkZWZpbmVkIGluIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBwYXJ0LiAgQSBwYXJ0IGlzIGFuCi0gICAqIEVMRU1FTlQgaW4gV1NETCAyLjAuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdG8gY2hlY2suCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGNoZWNrLgotICAgKiBAcGFyYW0gdmFsSW5mbyBWYWxpZGF0aW9uIGluZm8gZm9yIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGFydCBlbGVtZW50IGlzIGRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGNoZWNrTWVzc2FnZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotCi0gICAgYm9vbGVhbiBwYXJ0dmFsaWQgPSBmYWxzZTsKLS8vICAgIC8vIGZpcnN0IHRha2UgY2FyZSBvZiB0aGUgc2l0dWF0aW9uIHdoZXJlIGl0J3Mgc2NoZW1hIGZvciBzY2hlbWEKLS8vICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzSWdub3JlQ2FzZShTY2hlbWFTeW1ib2xzLlVSSV9TQ0hFTUFGT1JTQ0hFTUEpKQotLy8gICAgewotLy8gICAgICBTY2hlbWFBdHRyaWJ1dGVUYWJsZSB4c2RUYWJsZSA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVUYWJsZSgpOwotLy8gICAgICBpZiAoeHNkVGFibGUuY29udGFpbnNTeW1ib2wobmFtZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICAvLyBjaGVjayBpbmxpbmUgYW5kIGltcG9ydGVkIHNjaGVtYQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICBMaXN0IHNjaGVtYXMgPSB2YWxpZGF0b3Jjb250cm9sbGVyLmdldFNjaGVtYXMoKTsKLS8vICAgICAgSXRlcmF0b3Igc2NoZW1hc0l0ZXIgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0vLyAgICAgIHdoaWxlIChzY2hlbWFzSXRlci5oYXNOZXh0KCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBYU01vZGVsIHNjaGVtYSA9IChYU01vZGVsKXNjaGVtYXNJdGVyLm5leHQoKTsKLS8vICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgaWYgKHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb24obmFtZSwgbmFtZXNwYWNlKSAhPSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotLy8gICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgCi0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgLy8gSWYgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgaW1wb3J0ZWQgZG8gc28gbm93LgotICAgIC8vIEFsbG93IHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSB0byBiZSBhdXRvbWF0aWNhbGx5IGltcG9ydGVkIGJ1dCBtYXJrIGl0IGFzIGEgd2FybmluZy4KLS8vICAgIGlmICghcGFydHZhbGlkICYmIG5hbWVzcGFjZS5lcXVhbHMoU09BUF9FTkNPRElOR19VUkkpKQotLy8gICAgewotLy8gICAgICB0cnkKLS8vICAgICAgewotLy8gICAgICAgIFhTRFZhbGlkYXRvciB4c2RWYWwgPSBuZXcgWFNEVmFsaWRhdG9yKCk7Ci0vLyAgICAgICAgeHNkVmFsLnZhbGlkYXRlKFhNTENhdGFsb2cuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlRW50aXR5TG9jYXRpb24oU09BUF9FTkNPRElOR19VUkksIG51bGwpLCBudWxsKTsKLS8vICAgICAgICAvLyBzYW5pdHkgY2hlY2sgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZwotLy8gICAgICAgIGlmICh4c2RWYWwuaXNWYWxpZCgpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFhTTW9kZWwgeHNNb2RlbCA9IHhzZFZhbC5nZXRYU01vZGVsKCk7Ci0vLwotLy8gICAgICAgICAgaWYgKHhzTW9kZWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKG5hbWUsIG5hbWVzcGFjZSkgIT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcGFydHZhbGlkID0gdHJ1ZTsKLS8vICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICB2YWxpZGF0b3Jjb250cm9sbGVyLmFkZFdhcm5pbmdNZXNzYWdlKAotLy8gICAgICAgICAgICBwYXJ0T2JqZWN0LAotLy8gICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9QQVJUIiwgIiciICsgbmFtZSArICInIikpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLyAgICAgIHsKLS8vICAgICAgICAvL1RPRE86IGxvZyB0aGUgZXJyb3IgbWVzc2FnZQotLy8gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgcmV0dXJuIHBhcnR2YWxpZDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9XU0RMMjBWYWxpZGF0b3JDb250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9XU0RMMjBWYWxpZGF0b3JDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDc0ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwVmFsaWRhdG9yQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklXU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5leGNlcHRpb24uVmFsaWRhdGVXU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciBpcyB0aGUgaGVhZCBvZiB2YWxpZGF0aW9uLiBIYXMgbWV0aG9kcyBmb3IgZ2V0dGluZyAKLSAqIGV4dGVuc2lvbiB2YWxpZGF0b3JzLgotICovCi1wdWJsaWMgY2xhc3MgV1NETDIwVmFsaWRhdG9yQ29udHJvbGxlciBpbXBsZW1lbnRzIElXU0RMVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgX1dBUk5fTk9fVkFMRElBVE9SID0gIl9XQVJOX05PX1ZBTERJQVRPUiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBpbnQgRVJST1JfTUVTU0FHRSA9IDA7Ci0gIHByb3RlY3RlZCBmaW5hbCBpbnQgV0FSTklOR19NRVNTQUdFID0gMTsKLSAgcHJvdGVjdGVkIFN0cmluZyBmaWxlVVJJOwotICBwcm90ZWN0ZWQgTGlzdCBzY2hlbWFzID0gbmV3IFZlY3RvcigpOwotLy8gIHByb3RlY3RlZCBEZWZpbml0aW9ucyB3c2RsRGVmaW5pdGlvbjsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBlbGVtZW50TG9jYXRpb25zID0gbnVsbDsKLSAgcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIHJlc291cmNlYnVuZGxlOwotICBwcm90ZWN0ZWQgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yID0gbnVsbDsKLSAgLy9wcm90ZWN0ZWQgVmFsaWRhdGlvbkNvbnRyb2xsZXIgdmFsaWRhdGlvbkNvbnRyb2xsZXI7Ci0gIHByb3RlY3RlZCBWYWxpZGF0b3JSZWdpc3RyeSB2ZXIgPSBWYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBlcnJvcnMgPSBmYWxzZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQgZm9yIHRoaXMgY29udHJvbGxlci4KLSAgICovCi0gIHB1YmxpYyBXU0RMMjBWYWxpZGF0b3JDb250cm9sbGVyKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgc2V0UmVzb3VyY2VCdW5kbGUocmIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuSVdTRExWYWxpZGF0b3IjdmFsaWRhdGUob3JnLnczYy5kb20uRG9jdW1lbnQsIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuVmFsaWRhdGlvbkluZm8pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShEb2N1bWVudCBkb21Nb2RlbCwgVmFsaWRhdGlvbkluZm8gdmFsSW5mbykgdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgLy8gcmVzZXQgdGhlIHZhcmlhYmxlcwotICAgIC8vcmVzZXQoKTsKLSAgICBmaWxlVVJJID0gdmFsSW5mby5nZXRGaWxlVVJJKCk7Ci0gICAgLy90aGlzLnZhbGlkYXRpb25Db250cm9sbGVyID0gdmFsaWRhdGlvbmNvbnRyb2xsZXI7Ci0KLSAgICAKLS8vICAgIExpc3QgcmVhZGVyRXJyb3JzID0gcmVhZFdTRExEb2N1bWVudChkb21Nb2RlbCwgZmlsZVVSSSwgZ2V0TWVzc2FnZUdlbmVyYXRvcigpKTsKLSAgICAvLwkJaGFuZGxlIGFueSByZWFkZXIgZXJyb3JzCi0vLyAgICBpZiAocmVhZGVyRXJyb3JzICE9IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIEl0ZXJhdG9yIHJlYWRlckVycm9yc0kgPSByZWFkZXJFcnJvcnMuaXRlcmF0b3IoKTsKLS8vICAgICAgd2hpbGUgKHJlYWRlckVycm9yc0kuaGFzTmV4dCgpKQotLy8gICAgICB7Ci0vLyAgICAgICAgUmVhZGVyRXJyb3IgcmUgPSAoUmVhZGVyRXJyb3IpcmVhZGVyRXJyb3JzSS5uZXh0KCk7Ci0vLyAgICAgICAgdmFsSW5mby5hZGRFcnJvcihyZS5nZXRNZXNzYWdlKCksIHJlLmdldExpbmUoKSwgcmUuZ2V0Q29sdW1uKCksIHJlLmdldEZpbGVVUkkoKSk7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIHZhbGlkYXRlV1NETEVsZW1lbnQoQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCB3c2RsRGVmaW5pdGlvbiwgbmV3IFZlY3RvcigpLCB2YWxJbmZvKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJlYWQgaW4gdGhlIFdTREwgZG9jdW1lbnQgYW5kIHNldCB0aGUgbW9kZWwgYW5kIGltcG9ydGVkIHNjaGVtYXMuCi0gICAqIAotICAgKiBAcGFyYW0gZG9tTW9kZWwgQSBET00gZG9jdW1lbnQgbW9kZWwgb2YgdGhlIGZpbGUgdG8gYmUgcmVhZC4KLSAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gcmVhZC4KLSAgICogQHBhcmFtIG1lc3NhZ2VnZW5lcmF0b3IgVGhlIG1lc3NhZ2VnZW5lcmF0b3IgdGhlIHJlYWRlciBzaG91bGQgdXNlIGZvciBhbnkgbWVzc2FnZXMgcHJvZHVjZWQuCi0gICAqIEB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIHJlYWRlciBlcnJvcnMuCi0gICAqLwotLy8gIHByb3RlY3RlZCBMaXN0IHJlYWRXU0RMRG9jdW1lbnQoRG9jdW1lbnQgZG9tTW9kZWwsIFN0cmluZyBmaWxlLCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3IpIHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb24KLS8vICB7Ci0vLyAgICBMaXN0IHJlYWRlckVycm9ycyA9IG51bGw7Ci0vLyAgICB0cnkKLS8vICAgIHsKLS8vCi0vLyAgICAgIFdTRExSZWFkZXJJbXBsIHdzZGxSZWFkZXIgPSBuZXcgV1NETFJlYWRlckltcGwoKTsKLS8vICAgICAgd3NkbERlZmluaXRpb24gPSB3c2RsUmVhZGVyLnJlYWRXU0RMKGZpbGUsIGRvbU1vZGVsKTsKLS8vCi0vLyAgICAgIHJlYWRlckVycm9ycyA9IHdzZGxSZWFkZXIuZ2V0UmVhZGVyRXJyb3JzKCk7Ci0vLwotLy8gICAgfQotLy8gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLS8vICAgIHsKLS8vICAgICAgdGhyb3cgbmV3IFZhbGlkYXRlV1NETEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSAvKisgIiAiICsgZS5nZXRGYXVsdENvZGUoKSovKTsKLS8vICAgIH0KLS8vCi0vLyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLyAgICB7Ci0vLyAgICAgIHRocm93IG5ldyBWYWxpZGF0ZVdTRExFeGNlcHRpb24oInVuYWJsZSB0byByZWFkIGZpbGUiICsgZS5nZXRNZXNzYWdlKCkgKyAiICIgKyBlLnRvU3RyaW5nKCkpOwotLy8gICAgfQotLy8gICAgcmV0dXJuIHJlYWRlckVycm9yczsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgV1NETCBlbGVtZW50LCBjYWxsIFZhbGlkYXRlRWxlbWVudCBmb3IgaXQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gcGFyZW50cyBUaGUgbGlzdCBvZiBwYXJlbnRzIGZvciB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVdTRExFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBJV1NETDIwVmFsaWRhdG9yIHZhbCA9IHZlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KG5hbWVzcGFjZSk7Ci0gICAgaWYgKHZhbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHZhbC52YWxpZGF0ZShlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vdmFsSW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX05PX1ZBTERJQVRPUiwgbmFtZXNwYWNlKSwgZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHNjaGVtYSB0byB0aGUgbGlzdCBvZiBzY2hlbWFzLgotICAgKiAKLSAgICogQHBhcmFtIHhzTW9kZWwgVGhlIHNjaGVtYSB0byBhZGQuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZFNjaGVtYShYU01vZGVsIHhzTW9kZWwpCi0vLyAgewotLy8gICAgaWYgKHhzTW9kZWwgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgc2NoZW1hcy5hZGQoeHNNb2RlbCk7Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxpc3QgY29udGFpbmluZyB0aGUgc2NoZW1hcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2Ygc2NoZW1hcy4KLSAgICovCi0vLyAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0vLyAgewotLy8gICAgcmV0dXJuIHNjaGVtYXM7Ci0vLyAgfQotCi0gIC8qKgotICAJKiBHZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRvck1hbmFnZXIuCi0gIAkqIAotICAJKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBidW5kbGUgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAJKiBAc2VlICNzZXRSZXNvdXJjZUJ1bmRsZQotICAJKi8KLSAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZWJ1bmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRvck1hbmFnZXIuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICAqIEBzZWUgI2dldFJlc291cmNlQnVuZGxlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIGlmIChyYiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc291cmNlYnVuZGxlID0gcmI7Ci0gICAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWVzc2FnZSBnZW5lcmF0b3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VHZW5lcmF0b3IgZ2V0TWVzc2FnZUdlbmVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZWdlbmVyYXRvcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGZpbGVuYW1lIGZvciB0aGUgZmlsZSBjdXJyZW50bHkgYmVpbmcgdmFsaWRhdGVkLiBTb21lIHZhbGlkYXRvcnMgcmVxdWlyZSB0aGlzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZmlsZW5hbWUgZm9yIHRoZSBmaWxlIGJlaW5nIHZhbGlkYXRlZC4KLSAgICovCi0vLyAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpCi0vLyAgewotLy8gICAgcmV0dXJuIGZpbGVVUkk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgZXJyb3IgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYWRkIHRoZSBlcnJvciBmb3IuCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgdG8gYWRkLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGVycm9yKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKEVSUk9SX01FU1NBR0UsIG9iamVjdCwgZXJyb3IpOwotLy8gICAgZXJyb3JzID0gdHJ1ZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCBlcnJvciBtZXNzYWdlcyB3aGVuIHRoZXkga25vdwotICAgKiBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZEVycm9yTWVzc2FnZShpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIGVycm9yKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKEVSUk9SX01FU1NBR0UsIGxpbmUsIGNvbHVtbiwgZXJyb3IpOwotLy8gICAgZXJyb3JzID0gdHJ1ZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgd2FybmluZyBtZXNzYWdlLgotICAgKiBAcGFyYW0gd2FybmluZyBUaGUgd2FybmluZyBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nTWVzc2FnZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgd2FybmluZykKLS8vICB7Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShXQVJOSU5HX01FU1NBR0UsIG9iamVjdCwgd2FybmluZyk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgd2FybmluZyBtZXNzYWdlcyB3aGVuIHRoZXkga25vdwotICAgKiBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gd2FybmluZyBUaGUgd2FybmluZyBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nTWVzc2FnZShpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHdhcm5pbmcpCi0vLyAgewotLy8gICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoV0FSTklOR19NRVNTQUdFLCBsaW5lLCBjb2x1bW4sIHdhcm5pbmcpOwotLy8gIH0KLQotICAvKioKLSAgICogSWYgeW91IGhhdmUgYW4gb2JqZWN0IHJlYWQgaW4gYnkgdGhlIHJlYWRlciBmb3IgdGhpcwotICAgKiB2YWxpZGF0b3Jjb250cm9sbGVyIHRoZSBvYmplY3QgY2FuIGJlIHBhc3NlZCBpbiBoZXJlIGFuZCB0aGUgbGluZSBhbmQgY29sdW1uCi0gICAqIGluZm9ybWF0aW9uIHdpbGwgYmUgYWJzdHJhY3RlZCBmcm9tIGl0LgotICAgKiAKLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgbWVzc2FnZSB0byBhZGQuCi0gICAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGVycm9yICh1c2VkIHRvIGdldCB0aGUgbG9jYXRpb24pLgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKGludCB0eXBlLCBPYmplY3QgbywgU3RyaW5nIG1lc3NhZ2UpCi0vLyAgewotLy8gICAgVmFsaWRhdGFibGVFbGVtZW50IHZlID0gKFZhbGlkYXRhYmxlRWxlbWVudClvOwotLy8vLyAgICBpbnRbXSBsb2NhdGlvbjsKLS8vLy8gICAgaWYgKGVsZW1lbnRMb2NhdGlvbnMuY29udGFpbnNLZXkobykpCi0vLy8vICAgIHsKLS8vLy8gICAgICBsb2NhdGlvbiA9IChpbnRbXSllbGVtZW50TG9jYXRpb25zLmdldChvKTsKLS8vLy8gICAgfQotLy8vLyAgICAvLyBpZiB3ZSBnaXZlIGl0IGFuIGVsZW1lbnQgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkIHdlJ2xsIHNldCB0aGUgbG9jYXRpb24KLS8vLy8gICAgLy8gYXQgKDAsMCkgc28gdGhlIGVycm9yIHNob3dzIHVwIGJ1dCBubyBsaW5lIG1hcmtlciBpbiB0aGUgZWRpdG9yCi0vLy8vICAgIGVsc2UKLS8vLy8gICAgewotLy8vLyAgICAgIGxvY2F0aW9uID0gbmV3IGludFtdIHsgMCwgMCB9OwotLy8vLyAgICB9Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZSh0eXBlLCB2ZS5nZXRMaW5lKCksIHZlLmdldENvbHVtbigpLCBtZXNzYWdlKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAgKiBDcmVhdGVzIGEgdmFsaWRhdGlvbiBtZXNzYWdlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAqIAotICAJKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gYWRkLgotICAJKiBAcGFyYW0gbGluZSBUaGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAJKiBAcGFyYW0gY29sdW1uIFRoZSBsaW5lIHdoZXJlIHRoZSBjb2x1bW4gbWVzc2FnZSBpcyBsb2NhdGVkLgotICAJKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gIAkqLwotLy8gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKGludCB0eXBlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIG1lc3NhZ2UpCi0vLyAgewotLy8gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgaWYgKHR5cGUgPT0gRVJST1JfTUVTU0FHRSkKLS8vICAgICAgewotLy8gICAgICAgIHZhbGlkYXRpb25Db250cm9sbGVyLmFkZEVycm9yTWVzc2FnZShsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gV0FSTklOR19NRVNTQUdFKQotLy8gICAgICB7Ci0vLyAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xsZXIuYWRkV2FybmluZ01lc3NhZ2UobGluZSwgY29sdW1uLCBtZXNzYWdlKTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmNvbnRyb2xsZXIuSVdTRExWYWxpZGF0b3IjaXNWYWxpZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiAhZXJyb3JzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSB2YWxpZGF0b3IgY29udHJvbGxlci4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKQotLy8gIHsKLS8vICAgIHNjaGVtYXMgPSBuZXcgVmVjdG9yKCk7Ci0vLyAgICBmaWxlVVJJID0gIiI7Ci0vLyAgICB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0vLyAgICBlbGVtZW50TG9jYXRpb25zID0gbnVsbDsKLS8vICAgIHJlc291cmNlYnVuZGxlID0gbnVsbDsKLS8vICAgIC8vdmFsaWRhdGlvbkNvbnRyb2xsZXIgPSBudWxsOwotLy8gICAgZXJyb3JzID0gZmFsc2U7Ci0vLyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1dTREwyMFZhbGlkYXRvckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NjFmN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0KLS8qKgotICogVGhlIFdTREwgMS4xIHZhbGlkYXRvciBkZWxlZ2F0ZSBob2xkcyBhIHJlZmVyZW5jZSB0byBhIHZhbGlkYXRvciB0byBiZSBpbnN0YW50aWF0ZWQgYXQKLSAqIGEgbGF0ZXIgcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZQotewotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyByZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0gIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotICBwcml2YXRlIElXU0RMMjBWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgZGVsZWdhdGUgZm9yIGEgdmFsaWRhdG9yIGJ5IGl0cyBjbGFzcyBuYW1lIGFuZCByZXNvdXJjZSBidW5kbGUgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlKQotICB7Ci0gICAgdGhpcy52YWxpZGF0b3JDbGFzc25hbWUgPSB2YWxpZGF0b3JDbGFzc25hbWU7Ci0gICAgdGhpcy5yZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGRlbGVnYXRlIGZvciBhIHZhbGlkYXRvciBieSBpdHMgY2xhc3MgbmFtZSwgcmVzb3VyY2UgYnVuZGxlIG5hbWUgYW5kIAotICAgKiBhIGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSB2YWxpZGF0b3IgYW5kIGJ1bmRsZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZSB0byBsb2FkIHRoZSB2YWxpZGF0b3IgYW5kIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBXU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZShTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICB7Ci0gICAgdGhpcyh2YWxpZGF0b3JDbGFzc25hbWUsIHJlc291cmNlQnVuZGxlKTsKLSAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGluIHRoaXMgZGVsZWdhdGUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBXU0RMIDEuMSB2YWxpZGF0b3Igc3BlY2lmaWVkIGJ5IHRoaXMgZGVsZWdhdGUuCi0gICAqLwotICBwdWJsaWMgSVdTREwyMFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQotICB7Ci0gICAgaWYgKHZhbGlkYXRvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmKGNsYXNzTG9hZGVyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAJY2xhc3NMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3MgdmFsaWRhdG9yQ2xhc3MgPQotICAgICAgICAgIGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3ModmFsaWRhdG9yQ2xhc3NuYW1lKSA6IENsYXNzLmZvck5hbWUodmFsaWRhdG9yQ2xhc3NuYW1lKTsKLQotICAgICAgICB2YWxpZGF0b3IgPSAoSVdTREwyMFZhbGlkYXRvcil2YWxpZGF0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFJlc291cmNlQnVuZGxlIHZhbGlkYXRvckJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZSwgTG9jYWxlLmdldERlZmF1bHQoKSwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgIHZhbGlkYXRvci5zZXRSZXNvdXJjZUJ1bmRsZSh2YWxpZGF0b3JCdW5kbGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0Fic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9BYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2NiNTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0Fic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZ2VuZXJhdGluZyBvYmplY3RzIG5lZWRlZCBmb3IgWE1MIENvbmZvcm1hbmNlIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeQotewotICBwcm90ZWN0ZWQgc3RhdGljIEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5IGluc3RhbmNlOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoaXMgZmFjdG9yeS4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoaXMgZmFjdG9yeQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBEZWZhdWx0WE1MQ29uZm9ybWFuY2VGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgZmFjdG9yeSB0byB1c2UuCi0gICAqIAotICAgKiBAcGFyYW0gZmFjdG9yeSAtIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGlzIGZhY3Rvcnkgd2lsbCB1c2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvbihBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeSBmYWN0b3J5KQotICB7Ci0gICAgaW5zdGFuY2UgPSBmYWN0b3J5OwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIGFuIFhNTCB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcmV0dXJuIGFuIFhNTCB2YWxpZGF0b3IKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBJWE1MVmFsaWRhdG9yIGdldFhNTFZhbGlkYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTRlMTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0RlZmF1bHRYTUxDb25mb3JtYW5jZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5Ci17Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIERlZmF1bHRYTUxDb25mb3JtYW5jZUZhY3RvcnkoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5BYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeSNnZXRYTUxWYWxpZGF0b3IoKQotICAgKi8KLSAgcHVibGljIElYTUxWYWxpZGF0b3IgZ2V0WE1MVmFsaWRhdG9yKCkKLSAgewotICAgIHJldHVybiBuZXcgRGVmYXVsdFhNTFZhbGlkYXRvcigpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0RlZmF1bHRYTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0RlZmF1bHRYTUxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViOTYyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9EZWZhdWx0WE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5qYXhwLlNBWFBhcnNlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbk1lc3NhZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSVhNTFZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRYTUxWYWxpZGF0b3IgaW1wbGVtZW50cyBJWE1MVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9DT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUiA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9jb250aW51ZS1hZnRlci1mYXRhbC1lcnJvciI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VfUFJFRklYRVMgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VTID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX1ZBTElEQVRJT04gPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfVkFMSURBVElPTl9TQ0hFTUEgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0FQQUNIRV9QUk9QRVJUWV9FWFRFUk5BTF9TQ0hFTUFMT0NBVElPTiA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9wcm9wZXJ0aWVzL3NjaGVtYS9leHRlcm5hbC1zY2hlbWFMb2NhdGlvbiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRklOSVRJT05TID0gImRlZmluaXRpb25zIjsKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9BTFdBWVMgPSAiSUdOT1JFX0FMV0FZUyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRU1BVFVSRV9FT0YgPSAiUHJlbWF0dXJlRU9GIjsKLSAgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgaW5nb3JlZEVycm9yS2V5VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyB1cmk7Ci0gIHByb3RlY3RlZCBVUklSZXNvbHZlciB1cmlSZXNvbHZlciA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBzY2hlbWFMb2NhdGlvblN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgcHJvdGVjdGVkIExpc3QgaWdub3JlZE5hbWVzcGFjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgcHJvdGVjdGVkIFN0cmluZyB3c2RsTmFtZXNwYWNlID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgRGVmYXVsdFhNTFZhbGlkYXRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIAotICAgIGlnbm9yZWROYW1lc3BhY2VMaXN0LmFkZChDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KTsKLSAgICBpZ25vcmVkTmFtZXNwYWNlTGlzdC5hZGQoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCk7Ci0gICAgaWdub3JlZE5hbWVzcGFjZUxpc3QuYWRkKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEpOwotICAgIAotICAgIGluZ29yZWRFcnJvcktleVRhYmxlLnB1dChQUkVNQVRVUkVfRU9GLCBJR05PUkVfQUxXQVlTKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZhbGlkYXRlLndzZGwueG1sY29uZm9ybWFuY2UuSVhNTFZhbGlkYXRvckFjdGlvbiNzZXRGaWxlKElGaWxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmlsZShTdHJpbmcgdXJpKQotICB7Ci0gICAgdGhpcy51cmkgPSB1cmk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gIAl0aGlzLnVyaVJlc29sdmVyID0gdXJpUmVzb2x2ZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnhtbGNvbmZvcm1hbmNlLklYTUxWYWxpZGF0b3JBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICAvLyBWYWxpZGF0ZSB0aGUgWE1MIGZpbGUuCi0gICAgdHJ5Ci0gICAgewotICAgICAgcHJlcGFyc2UodXJpKTsKLSAgICAgIFNBWFBhcnNlciBzYXhwYXJzZXIgPSBjcmVhdGVTQVhQYXJzZXIoKTsKLSAgICAgIFhNTENvbmZvcm1hbmNlRGVmYXVsdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxDb25mb3JtYW5jZURlZmF1bHRIYW5kbGVyKCk7Ci0gICAgICBzYXhwYXJzZXIucGFyc2UodXJpLCBoYW5kbGVyKTsKLS8vICAgICAgd3NkbE5hbWVzcGFjZSA9IGhhbmRsZXIuZ2V0V1NETE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSwgZS5nZXRMaW5lTnVtYmVyKCksIGUuZ2V0Q29sdW1uTnVtYmVyKCksIHVyaSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIFNBWCBwYXJzZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuZXcgU0FYIHBhcnNlci4KLSAgICovCi0gIHByb3RlY3RlZCBTQVhQYXJzZXIgY3JlYXRlU0FYUGFyc2VyKCkKLSAgewotICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyZmFjdG9yeSA9IG5ldyBTQVhQYXJzZXJGYWN0b3J5SW1wbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHBhcnNlcmZhY3Rvcnkuc2V0RmVhdHVyZShfQVBBQ0hFX0ZFQVRVUkVfQ09OVElOVUVfQUZURVJfRkFUQUxfRVJST1IsIHRydWUpOwotICAgICAgICBwYXJzZXJmYWN0b3J5LnNldEZlYXR1cmUoX0FQQUNIRV9GRUFUVVJFX05BTUVTUEFDRV9QUkVGSVhFUywgdHJ1ZSk7Ci0gICAgICAgIHBhcnNlcmZhY3Rvcnkuc2V0RmVhdHVyZShfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFUywgdHJ1ZSk7Ci0gICAgICAgIHBhcnNlcmZhY3Rvcnkuc2V0RmVhdHVyZShfQVBBQ0hFX0ZFQVRVUkVfVkFMSURBVElPTiwgdHJ1ZSk7Ci0gICAgICAgIHBhcnNlcmZhY3Rvcnkuc2V0RmVhdHVyZShfQVBBQ0hFX0ZFQVRVUkVfVkFMSURBVElPTl9TQ0hFTUEsIHRydWUpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBwYXJzZXJmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgcGFyc2VyZmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOwotICAgICAgc2F4UGFyc2VyID0gcGFyc2VyZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQotICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uU3RyaW5nLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpLnNldFByb3BlcnR5KF9BUEFDSEVfUFJPUEVSVFlfRVhURVJOQUxfU0NIRU1BTE9DQVRJT04sIHNjaGVtYUxvY2F0aW9uU3RyaW5nLnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gc2F4UGFyc2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFByZXBhcnNlIHRoZSBmaWxlIHRvIGZpbmQgYWxsIG9mIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIGRlZmluZWQgaW4gb3JkZXIKLSAgICogdG8gc3BlY2lmeSB0aGUgc2NoZW1hbG9jYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIGZpbGUgdG8gcGFyc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJzZShTdHJpbmcgdXJpKQotICB7Ci0gICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJmYWN0b3J5ID0gbmV3IFNBWFBhcnNlckZhY3RvcnlJbXBsKCk7Ci0KLSAgICAgIHBhcnNlcmZhY3Rvcnkuc2V0RmVhdHVyZShfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFX1BSRUZJWEVTLCB0cnVlKTsKLSAgICAgIHBhcnNlcmZhY3Rvcnkuc2V0RmVhdHVyZShfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFUywgdHJ1ZSk7Ci0KLSAgICAgIHNheFBhcnNlciA9IHBhcnNlcmZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICBTY2hlbWFTdHJpbmdIYW5kbGVyIGhhbmRsZXIgPSBuZXcgU2NoZW1hU3RyaW5nSGFuZGxlcih1cmkpOwotICAgICAgc2F4UGFyc2VyLnBhcnNlKHVyaSwgaGFuZGxlcik7Ci0gICAgfQotICAgIGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnhtbGNvbmZvcm1hbmNlLklYTUxWYWxpZGF0b3JBY3Rpb24jaGFzRXJyb3JzKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpCi0gIHsKLSAgICByZXR1cm4gIWVycm9ycy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnhtbGNvbmZvcm1hbmNlLklYTUxWYWxpZGF0b3JBY3Rpb24jZ2V0RXJyb3JMaXN0KCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9ycygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZXJyb3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvcihTdHJpbmcgZXJyb3IsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKGVycm9yLCBsaW5lLCBjb2x1bW4sIFZhbGlkYXRpb25NZXNzYWdlSW1wbC5TRVZfRVJST1IsIHVyaSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBoYW5kbGVyIGZvciB0aGUgU0FYIHBhcnNlci4gVGhpcyBoYW5kbGVyIHdpbGwgb2J0YWluIHRoZSBXU0RMCi0gICAqIG5hbWVzcGFjZSwgaGFuZGxlIGVycm9ycyBhbmQgcmVzb2x2ZSBlbnRpdGllcy4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYTUxDb25mb3JtYW5jZURlZmF1bHRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKFNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBhZGRFcnJvcihhcmcwLmdldE1lc3NhZ2UoKSwgYXJnMC5nZXRMaW5lTnVtYmVyKCksIGFyZzAuZ2V0Q29sdW1uTnVtYmVyKCksIGFyZzAuZ2V0U3lzdGVtSWQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBhZGRFcnJvcihhcmcwLmdldE1lc3NhZ2UoKSwgYXJnMC5nZXRMaW5lTnVtYmVyKCksIGFyZzAuZ2V0Q29sdW1uTnVtYmVyKCksIGFyZzAuZ2V0U3lzdGVtSWQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBhZGRFcnJvcihhcmcwLmdldE1lc3NhZ2UoKSwgYXJnMC5nZXRMaW5lTnVtYmVyKCksIGFyZzAuZ2V0Q29sdW1uTnVtYmVyKCksIGFyZzAuZ2V0U3lzdGVtSWQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgU3RyaW5nIHVyaSA9IHVyaVJlc29sdmVyLnJlc29sdmUobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgIGlmICh1cmkgIT0gbnVsbCAmJiAhdXJpLmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIElucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICAgIGlmIChpcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGlzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBUaGlzIHRyeS9jYXRjaCBibG9jayB3aXRoIHRoZSBJT0V4Y2VwdGlvbiBpcyBoZXJlIHRvIGhhbmRsZSBhIGRpZmZlcmVuY2UKLSAgICAgIC8vIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBFbnRpdHlSZXNvbHZlciBpbnRlcmZhY2UuCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBzdXBlci5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgICAgIGlmKGlzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXM7Ci0gICAgICB9Ci0gICAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0vLyAgICAvKioKLS8vICAgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsCi0vLyAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0vLyAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxuYW1lLCBTdHJpbmcgYXJnMiwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0vLyAgICB7Ci0vLyAgICAgIGlmIChsb2NhbG5hbWUuZXF1YWxzKERFRklOSVRJT05TKSkKLS8vICAgICAgewotLy8gICAgICAgIHdzZGxVUkkgPSB1cmk7Ci0vLyAgICAgIH0KLS8vICAgICAgc3VwZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxuYW1lLCBhcmcyLCBhdHRyaWJ1dGVzKTsKLS8vCi0vLyAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZhbGlkYXRlLndzZGwueG1sY29uZm9ybWFuY2UuSVhNTFZhbGlkYXRvciNzZXRTY2hlbWFMb2NhdGlvbihTdHJpbmcsCi0gICAqICAgICAgU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hTG9jYXRpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsICYmIGxvY2F0aW9uICE9IG51bGwgJiYgIW5hbWVzcGFjZS5lcXVhbHNJZ25vcmVDYXNlKCIiKSAmJiAhbG9jYXRpb24uZXF1YWxzSWdub3JlQ2FzZSgiIikpCi0gICAgewotICAgICAgc2NoZW1hTG9jYXRpb25TdHJpbmcuYXBwZW5kKCIgIikuYXBwZW5kKG5hbWVzcGFjZSkuYXBwZW5kKCIgIikuYXBwZW5kKGZvcm1hdFVSSShsb2NhdGlvbikpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgc3BhY2UgY2hhcmFjdGVycyBmcm9tIGEgU3RyaW5nIGFuZCByZXBsYWNlIHRoZW0gd2l0aCAlMjAuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0KLSAgICogICAgICAgICAgICB0aGUgdXJpIHRvIGZvcm1hdAotICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdFVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nIHNwYWNlID0gIiUyMCI7Ci0gICAgU3RyaW5nQnVmZmVyIG5ld1VyaSA9IG5ldyBTdHJpbmdCdWZmZXIodXJpKTsKLSAgICBpbnQgbmV3VXJpTGVuZ3RoID0gbmV3VXJpLmxlbmd0aCgpOwotCi0gICAgLy8gd29yayBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgc3RyaW5nYnVmZmVyIGluIGNhc2UgaXQgZ3Jvd3MgdG8gdGhlCi0gICAgLy8gcG9pbnQKLSAgICAvLyB3aGVyZSB0aGUgbGFzdCBzcGFjZSB3b3VsZCBiZSBtaXNzZWQuCi0gICAgZm9yIChpbnQgaSA9IG5ld1VyaUxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGlmIChuZXdVcmkuY2hhckF0KGkpID09ICcgJykKLSAgICAgIHsKLSAgICAgICAgbmV3VXJpLnJlcGxhY2UoaSwgaSArIDEsIHNwYWNlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3VXJpLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogQSBoYW5kbGVyIHVzZWQgaW4gcHJlcGFyc2luZyB0byBnZXQgdGhlIHNjaGVtYUxvY2F0aW9uIHN0cmluZy4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBTY2hlbWFTdHJpbmdIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsKLSAgICBwcml2YXRlIFN0cmluZyBiYXNlbG9jYXRpb24gPSBudWxsOwotCi0gICAgcHVibGljIFNjaGVtYVN0cmluZ0hhbmRsZXIoU3RyaW5nIGJhc2Vsb2NhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLmJhc2Vsb2NhdGlvbiA9IGJhc2Vsb2NhdGlvbjsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbG5hbWUsIFN0cmluZyBhcmcyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobG9jYWxuYW1lLmVxdWFscyhERUZJTklUSU9OUykpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgICBpbnQgbnVtQXR0cyA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXR0czsgaSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICBTdHJpbmcgYXR0bmFtZSA9IGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSk7Ci0gICAgICAgICAgaWYgKGF0dG5hbWUuc3RhcnRzV2l0aChYTUxOUykpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICBpZighaWdub3JlZE5hbWVzcGFjZUxpc3QuY29udGFpbnMobmFtZXNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkVVJJID0gdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlbG9jYXRpb24sIG5hbWVzcGFjZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgaWYocmVzb2x2ZWRVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldFNjaGVtYUxvY2F0aW9uKG5hbWVzcGFjZSwgcmVzb2x2ZWRVUkkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsbmFtZSwgYXJnMiwgYXR0cmlidXRlcyk7Ci0KLSAgICB9Ci0gIH0KLQotLy8gIC8qKgotLy8gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5pbnRlcm5hbC54bWwuSVhNTFZhbGlkYXRvciNnZXRXU0RMTmFtZXNwYWNlKCkKLS8vICAgKi8KLS8vICBwdWJsaWMgU3RyaW5nIGdldFdTRExOYW1lc3BhY2UoKQotLy8gIHsKLS8vICAgIHJldHVybiB3c2RsTmFtZXNwYWNlOwotLy8gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvRWxlbWVudExvY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9FbGVtZW50TG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkOWEzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9FbGVtZW50TG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotLyoqCi0gKiBIb2xkcyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQgaW4gdGhlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudExvY2F0aW9uCi17ICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAibG9jYXRpb24iOwotICBwcm90ZWN0ZWQgaW50IGxpbmU7Ci0gIHByb3RlY3RlZCBpbnQgY29sdW1uOwotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbGluZSAtIHRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50Ci0gICAqIEBwYXJhbSBjb2x1bW4gLSB0aGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50Ci0gICAqLwotICBwdWJsaWMgRWxlbWVudExvY2F0aW9uKGludCBsaW5lLCBpbnQgY29sdW1uKQotICB7Ci0gICAgdGhpcy5saW5lID0gbGluZTsKLSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbGluZSBudW1iZXIgZm9yIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIGZvciB0aGlzIGVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gIHsKLSAgCXJldHVybiBsaW5lOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBjb2x1bW4gbnVtYmVyIGZvciB0aGlzIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBjb2x1bW4gbnVtYmVyIGZvciB0aGlzIGVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkKLSAgewotICAJcmV0dXJuIGNvbHVtbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvSVhNTENhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0lYTUxDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjQ1NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvSVhNTENhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGFuIFhNTCBjYXRhbG9nLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxDYXRhbG9nCi17Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHB1YmxpYyBpZCBhbmQgYSBsb2NhdGlvbiB0byB0aGUgY2F0YWxvZy4KLSAgICogCi0gICAqIEBwYXJhbSBwdWJsaWNJZCAtCi0gICAqICAgICAgICAgIHRoZSBwdWJsaWMgaWQgb2YgdGhlIGVudHJ5Ci0gICAqIEBwYXJhbSBzeXN0ZW1JZCAtCi0gICAqICAgICAgICAgIHRoZSBzeXN0ZW0gaWQgb2YgdGhlIGVudHJ5Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRFbnRyeVRvQ2F0YWxvZyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCk7Ci0KLSAgLyoqCi0gICAqIFJlc29sdmUgdGhlIGxvY2F0aW9uIG9mIGFuIGVudGl0eSBnaXZlbiBwdWJsaWMgYW5kIHN5c3RlbSBpZHMuCi0gICAqIAotICAgKiBAcGFyYW0gcHVibGljSWQgLQotICAgKiAgICAgICAgICB0aGUgcHVibGljIGlkIG9mIHRoZSBlbnRpdHkgdG8gYmUgcmVzb2x2ZWQKLSAgICogQHBhcmFtIHN5c3RlbUlkIC0KLSAgICogICAgICAgICAgdGhlIHN5c3RlbSBpZCBvZiB0aGUgZW50aXR5IHRvIGJlIHJlc29sdmVkCi0gICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBlbnRpdHkKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgcmVzb2x2ZUVudGl0eUxvY2F0aW9uKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0Y2FkZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvSVhNTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYW4gWE1MIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGludGVyZmFjZSBJWE1MVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBTZXQgdGhlIGZpbGUgdG8gYmUgdmFsaWRhdGVkLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSAtIHRoZSB1cmkgb2YgdGhlIGZpbGUgdG8gYmUgdmFsaWRhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGaWxlKFN0cmluZyB1cmkpOwotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3ZXJlIHZhbGlkYXRpb24gZXJyb3JzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgd2VyZSB2YWxpZGF0aW9uIGVycm9ycywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGVycm9ycy4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZXJyb3JzCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRFcnJvcnMoKTsKLSAgCi0gIC8qKgotICAgKiBBZGQgYSBzY2hlbWEgbG9jYXRpb24gdG8gYmUgc2NoZW1hIGxvY2F0aW5vIHN0cmluZyB1c2VkIGJ5IHRoZSBYTUwgcGFyc2VyLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSAtIHRoZSBuYW1lc3BhY2VzIG9mIHRoZSBzY2hlbWEKLSAgICogQHBhcmFtIGxvY2F0aW9uIC0gdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYUxvY2F0aW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbik7Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaVJlc29sdmVyIFRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvTGluZU51bWJlckRPTVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvTGluZU51bWJlckRPTVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRkYjFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0xpbmVOdW1iZXJET01QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5ET01QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5TeW1ib2xUYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWE1MR3JhbW1hclBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQ29uc3RhbnRzOwotCi0vKioKLSAqIEEgRE9NIHBhcnNlciB0aGF0IHdpbGwgcmVnaXN0ZXIgbG9jYXRpb24gaW5mb3JtYXRpb24gd2l0aCB0aGUgZWxlbWVudHMgaW4gdGhlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgTGluZU51bWJlckRPTVBhcnNlciBleHRlbmRzIERPTVBhcnNlcgotewotICBYTUxMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBMaW5lTnVtYmVyRE9NUGFyc2VyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc2V0RmVhdHVyZShERUZFUl9OT0RFX0VYUEFOU0lPTiwgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3R1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBhcmcwIFRoZSBwYXJzZXIgY29uZmlndXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBMaW5lTnVtYmVyRE9NUGFyc2VyKFhNTFBhcnNlckNvbmZpZ3VyYXRpb24gYXJnMCkKLSAgewotICAgIHN1cGVyKGFyZzApOwotICAgIHRyeQotICAgIHsKLSAgICAgIHNldEZlYXR1cmUoREVGRVJfTk9ERV9FWFBBTlNJT04sIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGFyZzAgQSBzeW1ib2wgdGFibGUgZm9yIHRoZSBwYXJzZXIuCi0gICAqLwotICBwdWJsaWMgTGluZU51bWJlckRPTVBhcnNlcihTeW1ib2xUYWJsZSBhcmcwKQotICB7Ci0gICAgc3VwZXIoYXJnMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gYXJnMCBBIHN5bWJvbCB0YWJsZSBmb3IgdGhlIHBhcnNlci4KLSAgICogQHBhcmFtIGFyZzEgQSBncmFtbWFyIHBvb2wgZm9yIHRoZSBwYXJzZXIuCi0gICAqLwotICBwdWJsaWMgTGluZU51bWJlckRPTVBhcnNlcihTeW1ib2xUYWJsZSBhcmcwLCBYTUxHcmFtbWFyUG9vbCBhcmcxKQotICB7Ci0gICAgc3VwZXIoYXJnMCwgYXJnMSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MRG9jdW1lbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuUU5hbWUsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxBdHRyaWJ1dGVzLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9ucykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChRTmFtZSBhcmcwLCBYTUxBdHRyaWJ1dGVzIGFyZzEsIEF1Z21lbnRhdGlvbnMgYXJnMikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50OwotICAgIC8vIEZvciBlbGVtZW50cyBmcm9tIHRoZSBTY2hlbWEgbmFtZXNwYWNlIHdlIHdhbnQgdG8gcHJlc2VydmUgdGhlbQotICAgIC8vIHRoZSB3YXkgdGhleSB3ZXJlIGVudGVyZWQuIFJldmVydCB0aGUgdmFsdWVzIHRvIHRoZSBub24tbm9ybWFsaXplZCB2YWx1ZXMuCi0gICAgU3RyaW5nIG5zID0gYXJnMC51cmk7Ci0gICAgaWYobnMgIT0gbnVsbCAmJiAobnMuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEpIHx8IG5zLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KSB8fCBucy5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCkpKQotICAgIHsKLSAgICAgIGludCBudW1hdHRzID0gYXJnMS5nZXRMZW5ndGgoKTsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1hdHRzOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBub25Ob3JtYWxpemVkVmFsdWUgPSBhcmcxLmdldE5vbk5vcm1hbGl6ZWRWYWx1ZShpKTsKLSAgICAgICAgYXJnMS5zZXRWYWx1ZShpLCBub25Ob3JtYWxpemVkVmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5zdGFydEVsZW1lbnQoYXJnMCwgYXJnMSwgYXJnMik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZWxlbWVudCA9IChFbGVtZW50KWdldFByb3BlcnR5KENVUlJFTlRfRUxFTUVOVF9OT0RFKTsKLSAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnRJbXBsID0gKEVsZW1lbnRJbXBsKWVsZW1lbnQ7Ci0gICAgICBlbGVtZW50SW1wbC5zZXRVc2VyRGF0YSgKLSAgICAgICAgRWxlbWVudExvY2F0aW9uLklELAotICAgICAgICBuZXcgRWxlbWVudExvY2F0aW9uKGxvY2F0b3IuZ2V0TGluZU51bWJlcigpLCBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKSwKLSAgICAgICAgbnVsbCk7Ci0gICAgfQotICAgIC8vIGNhdGNoIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gYW5kIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBjYW4ndCBnZXQgZWxlbWVudAotICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxEb2N1bWVudEhhbmRsZXIjc3RhcnREb2N1bWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvciwgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudChYTUxMb2NhdG9yIGFyZzAsIFN0cmluZyBhcmcxLCBOYW1lc3BhY2VDb250ZXh0IGFyZzIsIEF1Z21lbnRhdGlvbnMgYXJnMykKLSAgICB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gIHsKLSAgICBsb2NhdG9yID0gYXJnMDsKLSAgICBzdXBlci5zdGFydERvY3VtZW50KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NjdiZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmpheHAuU0FYUGFyc2VyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBYTUxDYXRhbG9nIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIsIG9idGFpbiBhbmQgZGVsZXRlIGFuIGluc3RhbmNlCi0gKiBvZiBhbiBYTUwgY2F0YWxvZy4gTWV0aG9kIGRlZmluaXRpb25zIGFyZSBwcm92aWRlZCBmb3IgdGhlIGNhdGFsb2cgdG8gc2V0IGEKLSAqIGxvY2F0aW9uIGluIHRoZSBjYXRhbG9nIGFuZCByZXNvbHZlIGFuIGVudGl0eSBmcm9tIHRoZSBjYXRhbG9nLgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZyBpbXBsZW1lbnRzIElYTUxDYXRhbG9nCi17Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfQ09OVElOVUVfQUZURVJfRkFUQUxfRVJST1IgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIjsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX05BTUVTUEFDRV9QUkVGSVhFUyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIjsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX05BTUVTUEFDRVMgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiOwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfVkFMSURBVElPTiA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9WQUxJREFUSU9OX1NDSEVNQSA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiOwotCi0gIHByaXZhdGUgc3RhdGljIElYTUxDYXRhbG9nIGluc3RhbmNlID0gbnVsbDsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0eG1sY2F0YWxvZ2NsYXNzID0gbnVsbDsKLQotICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBleHRjbGFzc0xvYWRlciA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgSVhNTENhdGFsb2cgZXh0WE1MQ2F0YWxvZ0luc3RhbmNlID0gbnVsbDsKLQotICBwcml2YXRlIHN0YXRpYyBMaXN0IHNjaGVtYWRpcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBlbnRpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAvKioKLSAgICogQSBoYXNodGFibGUgdG8gaG9sZCB0aGUgWE1MIGNhdGFsb2cgZW50cmllcy4KLSAgICovCi0gIHByb3RlY3RlZCBNYXAgY2F0YWxvZyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgY2F0YWxvZy4gQXNzaWducyBhbGwgcmVnaXN0ZXJlZCBzY2hlbWFzIHRvCi0gICAqIHRoZSBYTUwgY2F0YWxvZy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoZSBYTUwgY2F0YWxvZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVhNTENhdGFsb2cgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgWE1MQ2F0YWxvZygpOwotCi0gICAgICAvLyBBZGQgdGhlIHJlZ2lzdGVyZWQgZW50aXRpZXMgdG8gdGhlIGNhdGFsb2cuCi0gICAgICBJdGVyYXRvciBlbnRpdHlJdGVyID0gZW50aXRpZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChlbnRpdHlJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWE1MQ2F0YWxvZ0VudGl0eUhvbGRlciBlbnRpdHkgPSAoWE1MQ2F0YWxvZ0VudGl0eUhvbGRlcikgZW50aXR5SXRlci5uZXh0KCk7Ci0gICAgICAgIGluc3RhbmNlLmFkZEVudHJ5VG9DYXRhbG9nKGVudGl0eS5nZXRQdWJsaWNJZCgpLCBlbnRpdHkuZ2V0U3lzdGVtSWQoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEFkZCB0aGUgc2NoZW1hcyBpbiB0aGUgc2NoZW1hIGRpcmVjdG9yaWVzIHRvIHRoZSBjYXRhbG9nLgotICAgICAgaWYgKHNjaGVtYWRpcnMuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJmYWN0b3J5ID0gbmV3IFNBWFBhcnNlckZhY3RvcnlJbXBsKCk7Ci0gICAgICAgICAgcGFyc2VyZmFjdG9yeS5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VfUFJFRklYRVMsIHRydWUpOwotICAgICAgICAgIHBhcnNlcmZhY3Rvcnkuc2V0RmVhdHVyZShfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFUywgdHJ1ZSk7Ci0gICAgICAgICAgc2F4UGFyc2VyID0gcGFyc2VyZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvciBzY2hlbWFkaXJJdGVyID0gc2NoZW1hZGlycy5pdGVyYXRvcigpOwotICAgICAgICBTY2hlbWFOYW1lc3BhY2VIYW5kbGVyIGhhbmRsZXIgPSAoKFhNTENhdGFsb2cpIGluc3RhbmNlKS5uZXcgU2NoZW1hTmFtZXNwYWNlSGFuZGxlcigpOwotICAgICAgICB3aGlsZSAoc2NoZW1hZGlySXRlci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hZGlyID0gKFN0cmluZykgc2NoZW1hZGlySXRlci5uZXh0KCk7Ci0gICAgICAgICAgcmVnaXN0ZXJTY2hlbWFzRm9yRGlyKGluc3RhbmNlLCBzY2hlbWFkaXIsIHNheFBhcnNlciwgaGFuZGxlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBzY2hlbWFzIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkgYW5kIGFsbCBzdWJkaXJlY3RvcmllcyB3aXRoIHRoZQotICAgKiBYTUwgY2F0YWxvZy4KLSAgICogCi0gICAqIEBwYXJhbSBjYXRhbG9nCi0gICAqICAgICAgICAgIFRoZSBjYXRhbG9nIHRvIHJlZ2lzdGVyIHRoZSBzY2hlbWFzIHdpdGguCi0gICAqIEBwYXJhbSBzY2hlbWFkaXIKLSAgICogICAgICAgICAgVGhlIHNjaGVtYSBkaXJlY3RvcnkgdG8gc2VhcmNoIGZvciBzY2hlbWEgZmlsZXMuCi0gICAqIEBwYXJhbSBwYXJzZXIKLSAgICogICAgICAgICAgVGhlIFNBWFBhcnNlciB0byB1c2UgdG8gcGFyc2UgdGhlIHNjaGVtYXMgZm9yIHRoZWlyCi0gICAqICAgICAgICAgIHRhcmdldE5hbWVzcGFjZS4KLSAgICogQHBhcmFtIGhhbmRsZXIKLSAgICogICAgICAgICAgVGhlIGhhbmRsZXIgdG8gdXNlIHRvIGdldCB0aGUgdGFyZ2V0TmFtZXNwYWNlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWdpc3RlclNjaGVtYXNGb3JEaXIoSVhNTENhdGFsb2cgY2F0YWxvZywgU3RyaW5nIHNjaGVtYWRpciwgU0FYUGFyc2VyIHBhcnNlciwKLSAgICAgIFNjaGVtYU5hbWVzcGFjZUhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIC8vIFJlbW92ZSBmaWxlOiBhbmQgZmlsZTovIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUgbG9jYXRpb24gaWYgdGhleSBhcmUgcHJlc2VudC4KLSAgICBpZihzY2hlbWFkaXIuc3RhcnRzV2l0aCgiZmlsZTovIikpCi0gICAgewotICAgICAgc2NoZW1hZGlyID0gc2NoZW1hZGlyLnN1YnN0cmluZyg2KTsKLSAgICB9Ci0gICAgZWxzZSBpZihzY2hlbWFkaXIuc3RhcnRzV2l0aCgiZmlsZToiKSkKLSAgICB7Ci0gICAgICBzY2hlbWFkaXIgPSBzY2hlbWFkaXIuc3Vic3RyaW5nKDUpOwotICAgIH0KLSAgICAKLSAgICBGaWxlIGRpciA9IG5ldyBGaWxlKHNjaGVtYWRpcik7Ci0gICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKQotICAgIHsKLSAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLSAgICAgIGludCBudW1maWxlcyA9IGZpbGVzLmxlbmd0aDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtZmlsZXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRmlsZSB0ZW1wZmlsZSA9IGZpbGVzW2ldOwotICAgICAgICBTdHJpbmcgdGVtcGZpbGVwYXRoID0gdGVtcGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIGlmICh0ZW1wZmlsZS5pc0RpcmVjdG9yeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVnaXN0ZXJTY2hlbWFzRm9yRGlyKGNhdGFsb2csIHRlbXBmaWxlcGF0aCwgcGFyc2VyLCBoYW5kbGVyKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVyLnJlc2V0KCk7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHRlbXBmaWxlcGF0aCwgaGFuZGxlcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBsb2cgZXJyb3IuCi0gICAgICAgICAgfQotICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBoYW5kbGVyLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXRhbG9nLmFkZEVudHJ5VG9DYXRhbG9nKHRhcmdldE5hbWVzcGFjZSwgdGVtcGZpbGVwYXRoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uIFhNTCBjYXRhbG9nLiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBpZiBvbmUKLSAgICogaXMgcmVnaXN0ZXJlZCBhbmQgY2FuIGJlIGNyZWF0ZWQsIG51bGwgb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvbiBYTUwgY2F0YWxvZyBpZiBvbmUgaXMgcmVnaXN0ZXJlZCwKLSAgICogICAgICAgICBudWxsIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIElYTUxDYXRhbG9nIGdldEV4dGVuc2lvbkNhdGFsb2dJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoZXh0WE1MQ2F0YWxvZ0luc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGV4dHhtbGNhdGFsb2djbGFzcyAhPSBudWxsICYmIGV4dGNsYXNzTG9hZGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQ2xhc3MgY2F0YWxvZ0NsYXNzID0gZXh0Y2xhc3NMb2FkZXIgIT0gbnVsbCA/IGV4dGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhleHR4bWxjYXRhbG9nY2xhc3MpIDogQ2xhc3MKLSAgICAgICAgICAgICAgLmZvck5hbWUoZXh0eG1sY2F0YWxvZ2NsYXNzKTsKLSAgICAgICAgICBleHRYTUxDYXRhbG9nSW5zdGFuY2UgPSAoSVhNTENhdGFsb2cpIGNhdGFsb2dDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBleHRYTUxDYXRhbG9nSW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjbGFzcyBvZiB0aGUgWE1MIGNhdGFsb2cgdG8gYmUgdXNlZC4KLSAgICogCi0gICAqIEBwYXJhbSB4bWxjYXRhbG9nCi0gICAqICAgICAgICAgIFRoZSBjbGFzcyBvZiB0aGUgWE1MIGNhdGFsb2cgdG8gYmUgdXNlZC4KLSAgICogQHBhcmFtIGNsYXNzbG9hZGVyCi0gICAqICAgICAgICAgIFRoZSBjbGFzc2xvYWRlciB0byB1c2UgdG8gbG9hZCB0aGUgY2F0YWxvZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHRlbnNpb25YTUxDYXRhbG9nKFN0cmluZyB4bWxjYXRhbG9nLCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikKLSAgewotICAgIGV4dHhtbGNhdGFsb2djbGFzcyA9IHhtbGNhdGFsb2c7Ci0gICAgZXh0Y2xhc3NMb2FkZXIgPSBjbGFzc2xvYWRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIGluc3RhbmNlIG9mIHRoZSBYTUwgY2F0YWxvZyB0byBudWxsLiBGb3IgZGVsZXRpbmcgdGhlIGNhdGFsb2cgaWYKLSAgICogbmVjZXNzYXJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkKLSAgewotICAgIGluc3RhbmNlID0gbnVsbDsKLSAgICBleHR4bWxjYXRhbG9nY2xhc3MgPSBudWxsOwotICAgIGV4dGNsYXNzTG9hZGVyID0gbnVsbDsKLSAgICBleHRYTUxDYXRhbG9nSW5zdGFuY2UgPSBudWxsOwotICAgIGVudGl0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHNjaGVtYWRpcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgc2NoZW1hIGRpcmVjdG9yeSB0byBiZSBjaGVja2VkIGZvciBzY2hlbWFzIHRvIHJlZ2lzdGVyIGluIHRoZQotICAgKiBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYWRpcgotICAgKiAgICAgICAgICBUaGUgZGlyZWN0b3J5IHRvIGNoZWNrIGZvciBzY2hlbWFzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFNjaGVtYURpcihTdHJpbmcgc2NoZW1hZGlyKQotICB7Ci0gICAgc2NoZW1hZGlycy5hZGQoc2NoZW1hZGlyKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gZW50aXR5IHRvIHRoZSBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIGVudGl0eQotICAgKiAgICAgICAgICBUaGUgZW50aXR5IHRvIGFkZCB0byB0aGUgY2F0YWxvZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFbnRpdHkoWE1MQ2F0YWxvZ0VudGl0eUhvbGRlciBlbnRpdHkpCi0gIHsKLSAgICBlbnRpdGllcy5hZGQoZW50aXR5KTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5pbnRlcm5hbC54bWwuSVhNTENhdGFsb2cjYWRkRW50cnlUb0NhdGFsb2coamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRW50cnlUb0NhdGFsb2coU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBjYXRhbG9nLnB1dChwdWJsaWNJZCwgc3lzdGVtSWQpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLmludGVybmFsLnhtbC5JWE1MQ2F0YWxvZyNyZXNvbHZlRW50aXR5TG9jYXRpb24oamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyByZXNvbHZlRW50aXR5TG9jYXRpb24oU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBTdHJpbmcgcmVzb2x2ZWRsb2NhdGlvbiA9IG51bGw7Ci0gICAgLy8gRmlyc3QgdHJ5IHRvIHJlc29sdmUgdXNpbmcgdGhlIGV4dCBjYXRhbG9nLgotICAgIElYTUxDYXRhbG9nIGV4dGNhdGFsb2cgPSBnZXRFeHRlbnNpb25DYXRhbG9nSW5zdGFuY2UoKTsKLSAgICBpZiAoZXh0Y2F0YWxvZyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc29sdmVkbG9jYXRpb24gPSBleHRjYXRhbG9nLnJlc29sdmVFbnRpdHlMb2NhdGlvbihwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIH0KLSAgICBpZiAocmVzb2x2ZWRsb2NhdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gc3lzdGVtIGlkIHVzZSB0aGUgcHVibGljIGlkCi0gICAgICBpZiAoc3lzdGVtSWQgPT0gbnVsbCB8fCBzeXN0ZW1JZC5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBzeXN0ZW1JZCA9IHB1YmxpY0lkOwotICAgICAgfQotICAgICAgcmVzb2x2ZWRsb2NhdGlvbiA9IChTdHJpbmcpIGNhdGFsb2cuZ2V0KHN5c3RlbUlkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc29sdmVkbG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogQSBoYW5kbGVyIHVzZWQgaW4gcGFyc2luZyB0byBnZXQgdGhlIHRhcmdldE5hbWVzcGFjZSBzdHJpbmcgb2YgYSBzY2hlbWEuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgU2NoZW1hTmFtZXNwYWNlSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi0gIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFID0gInRhcmdldE5hbWVzcGFjZSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBTQ0hFTUEgPSAic2NoZW1hIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsbmFtZSwgU3RyaW5nIGFyZzIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChsb2NhbG5hbWUuZXF1YWxzKFNDSEVNQSkpCi0gICAgICB7Ci0KLSAgICAgICAgaW50IG51bUF0dHMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUF0dHM7IGkrKykKLSAgICAgICAgewotCi0gICAgICAgICAgU3RyaW5nIGF0dG5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotICAgICAgICAgIGlmIChhdHRuYW1lLmVxdWFscyhUQVJHRVRfTkFNRVNQQUNFKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbG5hbWUsIGFyZzIsIGF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdGFyZ2V0TmFtZXNwYWNlIGZvdW5kIGJ5IHBhcnNpbmcgdGhlIGZpbGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgdGFyZ2V0TmFtZXNwYWNlIGZvdW5kIGJ5IHBhcnNpbmcgdGhlIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgIHsKLSAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBoYW5kbGVyIHNvIGl0IGNhbiBiZSByZXVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZ0VudGl0eUhvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZ0VudGl0eUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWNhNmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2dFbnRpdHlIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotLyoqCi0gKiBBIGNvbnRhaW5lciB0byBob2xkIHRoZSBlbnRpdHkgaW5mb3JtYXRpb24gdW50aWwgYW4gWE1MIGNhdGFsb2cgaXMKLSAqIHRvIGJlIGluaXRpYWxpemVkLgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0VudGl0eUhvbGRlcgotewotICBwcml2YXRlIFN0cmluZyBwdWJsaWNJZDsKLSAgcHJpdmF0ZSBTdHJpbmcgc3lzdGVtSWQ7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcHVibGljSWQgVGhlIHB1YmxpYyBpZCBvZiB0aGUgZW50aXR5LgotICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIHN5c3RlbSBpZCBvZiB0aGUgZW50aXR5LgotICAgKi8KLSAgcHVibGljIFhNTENhdGFsb2dFbnRpdHlIb2xkZXIoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICB0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0gICAgdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgcHVibGljIGlkIG9mIHRoZSBlbnRpdHkuCi0gICAqIEByZXR1cm4gVGhlIHB1YmxpYyBpZCBvZiB0aGUgZW50aXR5LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpCi0gIHsKLSAgICByZXR1cm4gcHVibGljSWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWQgb2YgdGhlIGVudGl0eS4KLSAgICogQHJldHVybiBUaGUgc3lzdGVtIGlkIG9mIHRoZSBlbnRpdHkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkKLSAgewotICAgIHJldHVybiBzeXN0ZW1JZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZ1Jlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyNzc4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEEgcmVzb2x2ZXIgdG8gcmVzb2x2ZXIgZW50aXRpZXMgZnJvbSB0aGUgWE1MIGNhdGFsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nUmVzb2x2ZXIgaW1wbGVtZW50cyBYTUxFbnRpdHlSZXNvbHZlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIFhNTENhdGFsb2dSZXNvbHZlciB4bWxDYXRhbG9nOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByb3RlY3RlZCBYTUxDYXRhbG9nUmVzb2x2ZXIoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBpbnN0YW5jZSBvZiB0aGlzIHJlc29sdmVyLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhpcyByZXNvbHZlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYTUxDYXRhbG9nUmVzb2x2ZXIgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKHhtbENhdGFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB4bWxDYXRhbG9nID0gbmV3IFhNTENhdGFsb2dSZXNvbHZlcigpOwotICAgIH0KLSAgICByZXR1cm4geG1sQ2F0YWxvZzsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByZXNvdXJjZUlkZW50aWZpZXIpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHVibGljSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0UHVibGljSWQoKTsKLSAgICBpZihwdWJsaWNJZCA9PSBudWxsKQotICAgIHsKLSAgICAgIHB1YmxpY0lkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBTdHJpbmcgc3lzdGVtSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TGl0ZXJhbFN5c3RlbUlkKCk7Ci0gICAgU3RyaW5nIGxvY2F0aW9uID0gWE1MQ2F0YWxvZy5nZXRJbnN0YW5jZSgpLnJlc29sdmVFbnRpdHlMb2NhdGlvbihwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgWE1MSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgWE1MSW5wdXRTb3VyY2UocHVibGljSWQsIHN5c3RlbUlkLCBzeXN0ZW1JZCwgaXMsIG51bGwpOwotICAgICAgICByZXR1cm4gaW5wdXRTb3VyY2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBvdGhlcndpc2UgcmV0dXJuIG51bGwgdG8gdGVsbCB0aGUgcGFyc2VyIHRvIGxvY2F0ZSB0aGUgc3lzdGVtSWQgYXMgYSBVUkkKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2RsLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzNTk0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hLS0gQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotIS0tIFdhcm5pbmcgTWVzc2FnZXMKLV9XQVJOX05PX1ZBTERJQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgdmFsaWRhdG9yIGZvciB0aGUgbmFtZXNwYWNlIHswfS4KLV9XQVJOX1BST0JMRU1fV1NJX1ZBTElEQVRPUiAgICAgICAgICAgICAgICA9IEEgcHJvYmxlbSBvY2N1cnJlZCB2YWxpYXRpbmcgdGhpcyBmaWxlIGZvciBXUy1JIGNvbmZvcm1hbmNlLgotCi1fRVJST1JfUFJPQkxFTV9XU0RMX1ZBTElEQVRPUiAgICAgICAgICAgICAgPSBBIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgcnVubmluZyB0aGUgV1NETCB2YWxpZGF0b3IgZm9yIG5hbWVzcGFjZSB7MH0uCi1fRVJST1JfTk9fV1NETF9WQUxJREFUT1IgICAgICAgICAgICAgICAgICAgPSBUaGUgbmFtZXNwYWNlIHswfSBzcGVjaWZpZWQgaXMgbm90IGEgdmFsaWQgV1NETCBuYW1lc3BhY2UuCi1fRVJST1JfUFJPQkxFTV9FWFRfVkFMSURBVE9SICAgICAgICAgICAgICAgPSBBIHByb2JlbG0gb2NjdXJyZWQgd2hpbGUgcnVubmluZyB0aGUgRXh0ZW5zaW9uIHZhbGlkYXRvciB7MH0gZm9yIG5hbWVzcGFjZSB7MX0uCi0KLSEtLSBTdHJpbmdzIGZvciBXU0RMIDEuMSB2YWxpZGF0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLV9VTkFCTEVfVE9fSU1QT1JUX0JBRF9MT0NBVElPTiAgICAgICAgICAgICA9IFRoZSB7MH0gZG9jdW1lbnQgY291bGQgbm90IGJlIGltcG9ydGVkLiBDaGVjayB0aGF0IHRoZSBkb2N1bWVudCBleGlzdHMgYW5kIHRoYXQgdGhlIGxvY2F0aW9uIGlzIGNvcnJlY3QuCi1fVU5BQkxFX1RPX0lNUE9SVF9JTlZBTElEICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGRvY3VtZW50IGNvdWxkIG5vdCBiZSBpbXBvcnRlZCBiZWNhdXNlIGl0IGlzIG5vdCB2YWxpZC4gVGhlIGRvY3VtZW50IG11c3QgYmUgY29ycmVjdGVkIGJlZm9yZSBpdCBjYW4gYmUgaW1wb3J0ZWQuCi1fTk9fQklORElOR19GT1JfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IHBvcnQgaGFzIGFuIGludmFsaWQgYmluZGluZyAtIHsxfS4gQ2hlY2sgdGhhdCB0aGUgezF9IGJpbmRpbmcgaXMgZGVmaW5lZC4KLV9QT1JUVFlQRV9VTkRFRklORURfRk9SX0JJTkRJTkcgICAgICAgICAgICA9IFRoZSB7MH0gcG9ydCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHsxfSBiaW5kaW5nIGlzIHVuZGVmaW5lZC4gQ2hlY2sgdGhlIHswfSBwb3J0IHR5cGUgbmFtZSBhbmQgZW5zdXJlIGl0IGlzIGRlZmluZWQuCi1fT1BFUkFUSU9OX1VOREVGSU5FRF9GT1JfUE9SVFRZUEUgICAgICAgICAgPSBUaGUgb3BlcmF0aW9uIHNwZWNpZmllZCBmb3IgdGhlIHswfSBiaW5kaW5nIGlzIG5vdCBkZWZpbmVkIGZvciBwb3J0IHR5cGUgezF9LiBBbGwgb3BlcmF0aW9ucyBzcGVjaWZpZWQgaW4gdGhpcyBiaW5kaW5nIG11c3QgYmUgZGVmaW5lZCBpbiBwb3J0IHR5cGUgezF9LgotX0lOUFVUX05BTUVfTk9UX1VOSVFVRSAgICAgICAgICAgICAgICAgICAgID0gVGhlIG5hbWUgezB9IHNwZWNpZmllZCBmb3IgdGhpcyBpbnB1dCBlbGVtZW50IGlzIG5vdCB1bmlxdWUuIFRoZSBuYW1lIG9mIGFuIGlucHV0IGVsZW1lbnQgbXVzdCBiZSB1bmlxdWUgZnJvbSB0aGUgbmFtZXMgb2YgYWxsIG90aGVyIGlucHV0IGFuZCBvdXRwdXQgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgezF9IHBvcnQgdHlwZS4KLV9PVVRQVVRfTkFNRV9OT1RfVU5JUVVFICAgICAgICAgICAgICAgICAgICA9IFRoZSBuYW1lIHswfSBzcGVjaWZpZWQgZm9yIHRoaXMgb3V0cHV0IGVsZW1lbnQgaXMgbm90IHVuaXF1ZS4gVGhlIG5hbWUgb2YgYW4gb3V0cHV0IGVsZW1lbnQgbXVzdCBiZSB1bmlxdWUgZnJvbSB0aGUgbmFtZXMgb2YgYWxsIG90aGVyIGlucHV0cyBhbmQgb3V0cHV0IGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIHsxfSBwb3J0IHR5cGUuCi1fTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVUICAgICAgICAgICAgICAgPSBUaGUgaW5wdXQgZWxlbWVudCBpcyByZWZlcmVuY2luZyBhbiB1bmRlZmluZWQgbWVzc2FnZSB7MH0uIENoZWNrIHRoYXQgdGhlIG1lc3NhZ2UgbmFtZSBhbmQgbmFtZXNwYWNlIGFyZSBjb3JyZWN0IGFuZCB0aGF0IHRoZSBtZXNzYWdlIGhhcyBiZWVuIGRlZmluZWQuCi1fTUVTU0FHRV9VTkRFRklORURfRk9SX09VVFBVVCAgICAgICAgICAgICAgPSBUaGUgb3V0cHV0IGVsZW1lbnQgaXMgcmVmZXJlbmNpbmcgYW4gdW5kZWZpbmVkIG1lc3NhZ2UgezB9LiBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIG5hbWUgYW5kIG5hbWVzcGFjZSBhcmUgY29ycmVjdCBhbmQgdGhhdCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBkZWZpbmVkLgotX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9GQVVMVCAgICAgICAgICAgICAgID0gVGhlIGZhdWx0IGVsZW1lbnQgaXMgcmVmZXJlbmNpbmcgYW4gdW5kZWZpbmVkIG1lc3NhZ2UgezB9LiBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIG5hbWUgYW5kIG5hbWVzcGFjZSBhcmUgY29ycmVjdCBhbmQgdGhhdCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBkZWZpbmVkLgotX0RVUExJQ0FURV9GQVVMVF9OQU1FICAgICAgICAgICAgICAgICAgICAgID0gQSBmYXVsdCB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgZm9yIHRoZSB7MX0gMHBlcmF0aW9uLiBDaGVjayB0aGF0IGV2ZXJ5IGZhdWx0IGRlZmluZWQgZm9yIHRoaXMgb3BlcmF0aW9uIGhhcyBhIHVuaXF1ZSBuYW1lLgotX1BBUlRfTk9fRUxFTUVOVF9PUl9UWVBFICAgICAgICAgICAgICAgICAgID0gVGhlIHBhcnQgezB9IGRvZXMgbm90IGhhdmUgYSB0eXBlIGRlZmluZWQuIEV2ZXJ5IHBhcnQgbXVzdCBzcGVjaWZ5IGEgdHlwZSBmcm9tIHNvbWUgdHlwZSBzeXN0ZW0uIFRoZSB0eXBlIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIGJ1aWx0IGluICdlbGVtZW50JyBvciAndHlwZScgYXR0cmlidXRlcyBvciBtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIGFuIGV4dGVuc2lvbiBhdHRyaWJ1dGUuCi1fUEFSVF9CT1RIX0VMRU1FTlRfQU5EX1RZUEUgICAgICAgICAgICAgICAgPSBUaGUgcGFydCB7MH0gaGFzIGJvdGggYW4gZWxlbWVudCBhbmQgYSB0eXBlIGRlZmluZWQuIEV2ZXJ5IHBhcnQgbXVzdCBvbmx5IGhhdmUgYW4gZWxlbWVudCBvciBhIHR5cGUgZGVmaW5lZC4KLV9QQVJUX0lOVkFMSURfRUxFTUVOVCAgICAgICAgICAgICAgICAgICAgICA9IFRoZSBwYXJ0IHswfSBoYXMgYW4gaW52YWxpZCB2YWx1ZSB7MX0gZGVmaW5lZCBmb3IgaXRzIGVsZW1lbnQuIEVsZW1lbnQgZGVjbGFyYXRpb25zIG11c3QgcmVmZXIgdG8gdmFsaWQgdmFsdWVzIGRlZmluZWQgaW4gYSBzY2hlbWEuCi1fUEFSVF9JTlZBTElEX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgcGFydCB7MH0gaGFzIGFuIGludmFsaWQgdmFsdWUgezF9IGRlZmluZWQgZm9yIGl0cyB0eXBlLiBUeXBlIGRlY2xhcmF0aW9ucyBtdXN0IHJlZmVyIHRvIHZhbGlkIHZhbHVlcyBkZWZpbmVkIGluIGEgc2NoZW1hLgotX0RVUExJQ0FURV9PUEVSQVRJT05fRk9SX1BPUlRUWVBFICAgICAgICAgID0gQW4gb3BlcmF0aW9uIHdpdGggdGhlIG5hbWUgezB9IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBmb3IgdGhlIHsxfSBwb3J0IHR5cGUuIEV2ZXJ5IG9wZXJhdGlvbiBkZWZpbmVkIGZvciBhIHBvcnQgdHlwZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4gCi1fU0VSVklDRV9OQU1FX0FMUkVBRFlfREVGSU5FRCAgICAgICAgICAgICAgPSBBIFNlcnZpY2Ugd2l0aCB0aGUgbmFtZSB7MH0gaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiBFdmVyeSBzZXJ2aWNlIGluIHRoZSBXU0RMIGRvY3VtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLgotX0JJTkRJTkdfTkFNRV9BTFJFQURZX0RFRklORUQgICAgICAgICAgICAgID0gQSBiaW5kaW5nIHdpdGggdGhlIG5hbWUgezB9IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gRXZlcnkgYmluZGluZyBpbiB0aGUgV1NETCBkb2N1bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4KLV9NRVNTQUdFX05BTUVfQUxSRUFEWV9ERUZJTkVEICAgICAgICAgICAgICA9IEEgbWVzc2FnZSB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIEV2ZXJ5IG1lc3NhZ2UgaW4gdGhlIFdTREwgZG9jdW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuCi1fUE9SVFRZUEVfTkFNRV9BTFJFQURZX0RFRklORUQgICAgICAgICAgICAgPSBBIHBvcnQgdHlwZSB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIEV2ZXJ5IHBvcnQgdHlwZSBpbiB0aGUgV1NETCBkb2N1bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4KLV9NT1JFX1RIRU5fT05FX0FERFJFU1NfUE9SVCAgICAgICAgICAgICAgICA9IEFuIGFkZHJlc3MgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGZvciBwb3J0IHswfS4gRWFjaCBwb3J0IGNhbiBoYXZlIG9ubHkgb25lIGFkZHJlc3MgZGVmaW5lZC4KLV9OT19BRERSRVNTX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSBwb3J0IHswfSBoYXMgbm8gYWRkcmVzcyBkZWZpbmVkLiBFYWNoIHBvcnQgbXVzdCBkZWZpbmUgb25lIGFkZHJlc3MuCi1fUE9SVF9OQU1FX05PVF9VTklRVUUgICAgICAgICAgICAgICAgICAgICAgPSBBIHBvcnQgd2l0aCB0aGUgbmFtZSB7MH0gaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiBFdmVyeSBwb3J0IGluIHRoZSBXU0RMIGRvY3VtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLgotX01VTFRJUExFX1BBUlRTX1dJVEhfVFlQRSAgICAgICAgICAgICAgICAgID0gQSBwYXJ0IHswfSBoYXMgYmVlbiBkZWZpbmVkIGZvciB0aGUgezF9IG1lc3NhZ2Ugd2l0aCBhIHR5cGUgYXR0cmlidXRlLCBhbmQgdGhlcmUgYXJlIG11bHRpcGxlIHBhcnRzIGRlZmluZWQgZm9yIHRoaXMgbWVzc2FnZS4gT25seSBvbmUgcGFydCBjYW4gYmUgZGVmaW5lZCBmb3IgYSBtZXNzYWdlIHdoZW4gdXNpbmcgYSB0eXBlIGF0dHJpYnV0ZS4KLV9PUEVSQVRJT05fTk9fSU5QVVRfT1JfT1VUUFVUICAgICAgICAgICAgICA9IE5vIGlucHV0IG9yIG91dHB1dCBlbGVtZW50IGhhcyBiZWVuIGRlZmluZWQgZm9yIHRoZSB7MH0gb3BlcmF0aW9uLiBBbiBpbnB1dCBlbGVtZW50LCBhbiBvdXRwdXQgZWxlbWVudCwgb3IgYm90aCBtdXN0IGJlIGRlZmluZWQgZm9yIGV2ZXJ5IG9wZXJhdGlvbi4KLV9XQVJOX1NPQVBFTkNfSU1QT1JURURfUEFSVCAgICAgICAgICAgICAgICA9IFRoZSBwYXJ0IHswfSB1c2VzIGFuIGVsZW1lbnQgb3IgdHlwZSBmcm9tIHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBidXQgdGhlIG5hbWVzcGFjZSBoYXMgbm90IGJlZW4gaW1wb3J0ZWQuIFRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBzaG91bGQgYmUgaW1wb3J0ZWQgd2l0aCBhbiBpbXBvcnQgc3RhdGVtZW50IGJlZm9yZSBpdCBpcyB1c2VkLgotX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9TQ0hFTUEgICAgICAgICAgICAgID0gVGhlIGlubGluZSBzY2hlbWEgdXNlcyBhbiBlbGVtZW50IG9yIHR5cGUgZnJvbSB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UgYnV0IHRoZSBuYW1lc3BhY2UgaGFzIG5vdCBiZWVuIGltcG9ydGVkLiBUaGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2Ugc2hvdWxkIGJlIGltcG9ydGVkIHdpdGggYW4gaW1wb3J0IHN0YXRlbWVudCBiZWZvcmUgaXQgaXMgdXNlZC4KLV9SRUZFUkVOQ0VEX0ZJTEVfQ09OVEFJTlNfRVJST1JTICAgICAgICAgICA9IFJlZmVyZW5jZWQgZmlsZSBjb250YWlucyBlcnJvcnMgKHswfSkuCi1fV0FSTl9PTERfU0NIRU1BX05BTUVTUEFDRSAgICAgICAgICAgICAgICAgPSBBbiBvbGQgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIG5hbWVzcGFjZSBoYXMgYmVlbiBzcGVjaWZpZWQuIHswfSBpcyB0aGUgc2NoZW1hIG5hbWVzcGFjZSB0aGF0IHNob3VsZCBiZSB1c2VkLgotX0VSUk9SX01VTFRJUExFX1RZUEVTX0RFRklORUQgICAgICAgICAgICAgID0gQSB0eXBlcyBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gT25seSBvbmUgdHlwZXMgZWxlbWVudCBpcyBhbGxvd2VkLgotX1dBUk5fV1JPTkdfTlNfT05fSU1QT1JUICAgICAgICAgICAgICAgICAgID0gVGhlIGZpbGUgY2Fubm90IGJlIGltcG9ydGVkIGJlY2F1c2UgdGhlIG5hbWVzcGFjZSB7MH0gZG9lcyBub3QgbWF0Y2ggdGhlIGltcG9ydGVkIGRvY3VtZW50JydzIHRhcmdldCBuYW1lc3BhY2UgezF9LgotIS0tIFJlZmVyZW5jZWQgZmlsZSBlcnJvcgotIS0tIE5vdGUgdG8gdHJhbnNsYXRvciAtIF9SRUZfRklMRV9FUlJPUl9NRVNTQUdFIG5lZWRzIGEgdHJhaWxpbmcgc3BhY2UgYXMgYW5vdGhlciBtZXNzYWdlIG1heSBmb2xsb3cuCi1fUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSAgICAgICAgICA9IFJlZmVyZW5jZWQgZmlsZSBjb250YWlucyBlcnJvcnMgKHswfSkuIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2RsaHR0cC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2RsaHR0cC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTk0YTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL3ZhbGlkYXRld3NkbGh0dHAucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLV9VSV9XU0RMX0hUVFBfVkFMSURBVE9SICAgICAgICAgICAgICAgICAgICA9IFdTREwgSFRUUCBWYWxpZGF0b3IKLV9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyAgICAgICAgICAgICAgICAgICA9IE5vIGxvY2F0aW9uIGhhcyBiZWVuIHNwZWNpZmllZCBmb3IgdGhpcyBhZGRyZXNzLiBFdmVyeSBhZGRyZXNzIG11c3QgaGF2ZSBhIHZhbGlkIGxvY2F0aW9uIHNwZWNpZmllZC4KLV9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBkZWZpbmVkIGhlcmUgaXMgdW5kZWZpbmVkIGZvciB0aGUgSFRUUCBuYW1lc3BhY2UuIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnQgaXMgJ2FkZHJlc3MnLgotX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBIVFRQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudCBpcyAnYmluZGluZycuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9FTEVNRU5UICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIEhUVFAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICdvcGVyYXRpb24nLgotX0VSUk9SX0lOVkFMSURfQklORElOR19JTlBVVF9FTEVNRU5UICAgICAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBIVFRQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudHMgYXJlICd1cmxSZXBsYWNlbWVudCcgYW5kICd1cmxFbmNvZGVkJy4KLV9FUlJPUl9JTlZBTElEX0hUVFBfRUxFTUVOVF9GT1JfTE9DQVRJT04gICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBjYW5ub3QgYmUgc3BlY2lmaWVkIGhlcmUuIFRoaXMgZWxlbWVudCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgSFRUUCBuYW1lc3BhY2UgZm9yIHVzZSBhdCB0aGlzIHBvaW50LgotX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9BRERSRVNTICAgICAgICAgICAgICAgID0gQW4gSFRUUCBhZGRyZXNzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaGVyZSBhcyB0aGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgezF9IHBvcnQgcmVmZXJzIHRvIGRvZXMgbm90IGhhdmUgYW4gSFRUUCBiaW5kaW5nIGVsZW1lbnQgZGVmaW5lZC4gVGhlcmUgbXVzdCBiZSBhbiBIVFRQIGJpbmRpbmcgZWxlbWVudCBkZWZpbmVkIGluIG9yZGVyIHRvIHNwZWNpZnkgYW4gSFRUUCBhZGRyZXNzIGZvciBhIGJpbmRpbmcuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX1ZFUkIgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IHZlcmIgZGVmaW5lZCBmb3IgdGhlIEhUVFAgYmluZGluZyBpcyBpbnZhbGlkLiBUaGUgSFRUUCBiaW5kaW5nIHZlcmIgbXVzdCBiZSAnR0VUJyBvciAnUE9TVCcgYW5kIGlzIGNhc2Ugc2Vuc2l0aXZlLgotX0VSUk9SX0lOVkFMSURfTE9DQVRJT05fVVJJICAgICAgICAgICAgICAgICAgICAgID0gVGhlIGxvY2F0aW9uIFVSSSBpcyBpbnZhbGlkIGZvciB0aGUgSFRUUCBvcGVyYXRpb24uIFlvdSBtdXN0IHNwZWNpZnkgYSB2YWxpZCBsb2NhdGlvbiBVUkkgZm9yIGV2ZXJ5IEhUVFAgT3BlcmF0aW9uLgotX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9PUEVSQVRJT04gICAgICAgICAgICAgID0gVGhlIHswfSBiaW5kaW5nIHRoYXQgdGhlIEhUVFAgb3BlcmF0aW9uIGlzIHNwZWNpZmllZCBmb3IgZG9lcyBub3QgaGF2ZSBhbiBIVFRQIGJpbmRpbmcgZGVmaW5lZC4gQW4gSFRUUCBiaW5kaW5nIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byBkZWZpbmUgYW4gSFRUUCBvcGVyYXRpb24gaGVyZS4KLV9FUlJPUl9OT19IVFRQT1BFUkFUSU9OX0ZPUl9VUkwgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gb3BlcmF0aW9uIHRoYXQgdGhlIHsxfSBIVFRQIGVsZW1lbnQgaXMgc3BlY2lmaWVkIGZvciBkb2VzIG5vdCBoYXZlIGFuIEhUVFAgb3BlcmF0aW9uIGRlZmluZWQuIEEgSFRUUCBvcGVyYXRpb24gbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvIGRlZmluZSBhIHsxfSBIVFRQIGVsZW1lbnQgaGVyZS4KLV9FUlJPUl9OT1RfT05MWV9FTEVNRU5UX0RFRklORUQgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gSFRUUCBlbGVtZW50IGRlZmluZWQgaXMgbm90IHRoZSBvbmx5IGVsZW1lbnQgZGVmaW5lZCBmb3IgdGhlIGlucHV0IGVsZW1lbnQuIFdoZW4gezB9IGlzIGRlZmluZWQgaXQgbXVzdCBiZSB0aGUgb25seSBjaGlsZCBlbGVtZW50IGRlZmluZWQgZm9yIHRoZSBpbnB1dCBlbGVtZW50LgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2RsbWltZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2RsbWltZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNlN2JmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL3ZhbGlkYXRld3NkbG1pbWUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2Rsc29hcC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2Rsc29hcC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODBhNTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL3ZhbGlkYXRld3NkbHNvYXAucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotX1VJX1dTRExfU09BUF9WQUxJREFUT1IgICAgICAgICAgICAgICAgICAgID0gV1NETCBTT0FQIFZhbGlkYXRvcgotX0VSUk9SX05PX0xPQ0FUSU9OX0ZPUl9BRERSRVNTICAgICAgICAgICAgICAgICAgID0gTm8gbG9jYXRpb24gaGFzIGJlZW4gc3BlY2lmaWVkIGZvciB0aGlzIGFkZHJlc3MuIEV2ZXJ5IGFkZHJlc3MgbXVzdCBoYXZlIGEgdmFsaWQgbG9jYXRpb24gc3BlY2lmaWVkLgotX0VSUk9SX0lOVkFMSURfUE9SVF9FTEVNRU5UICAgICAgICAgICAgICAgICAgICAgID0gVGhlICB7MH0gZWxlbWVudCBkZWZpbmVkIGhlcmUgaXMgdW5kZWZpbmVkIGZvciB0aGUgU09BUCBuYW1lc3BhY2UuIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnQgaXMgJ2FkZHJlc3MnLgotX0VSUk9SX0lOVkFMSURfQklORElOR19TVFlMRSAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBzdHlsZSBkZWZpbmVkIGZvciB0aGUgU09BUCBiaW5kaW5nIGluIGludmFsaWQuIFRoZSBTT0FQIGJpbmRpbmcgc3R5bGUgbXVzdCBiZSAncnBjJyBvciAnZG9jdW1lbnQnLgotX0VSUk9SX0lOVkFMSURfQklORElOR19VUkkgICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHRyYW5zcG9ydCBVUkkgaGFzIG5vdCBiZWVuIGRlZmluZWQgZm9yIHRoZSBTT0FQIGJpbmRpbmcuIFlvdSBtdXN0IHNwZWNpZnkgYSB0cmFuc3BvcnQgVVJJIGZvciBldmVyeSBTT0FQIGJpbmRpbmcuCi1fRVJST1JfSU5WQUxJRF9PUEVSQVRJT05fU1RZTEUgICAgICAgICAgICAgICAgICAgPSBUaGUgc3R5bGUgc3BlY2lmaWVkIGZvciB0aGUgU09BUCBvcGVyYXRpb24gaXMgaW52YWxpZC4gVGhlIFNPQVAgb3BlcmF0aW9uIHN0eWxlIG11c3QgYmUgJ3JwYycgb3IgJ2RvY3VtZW50Jy4KLV9FUlJPUl9JTlZBTElEX09QRVJBVElPTl9VUkkgICAgICAgICAgICAgICAgICAgICA9IFRoZSBzb2FwQWN0aW9uIFVSSSBpcyBpbnZhbGlkIGZvciB0aGUgU09BUCBPcGVyYXRpb24uIFlvdSBtdXN0IHNwZWNpZnkgYSB2YWxpZCBzb2FwQWN0aW9uIFVSSSBmb3IgZXZlcnkgU09BUCBPcGVyYXRpb24uCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIFNPQVAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICdiaW5kaW5nJy4KLV9FUlJPUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0VMRU1FTlQgICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBkZWZpbmVkIGhlcmUgaXMgdW5kZWZpbmVkIGZvciB0aGUgU09BUCBuYW1lc3BhY2UuIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnQgaXMgJ29wZXJhdGlvbicuCi1fRVJST1JfSU5WQUxJRF9IRUFERVJfQk9EWV9FTEVNRU5UICAgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIFNPQVAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50cyBhcmUgJ2JvZHknLCAnaGVhZGVyJyBhbmQgJ2hlYWRlcmZhdWx0Jy4KLV9FUlJPUl9JTlZBTElEX0ZBVUxUX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBkZWZpbmVkIGhlcmUgaXMgdW5kZWZpbmVkIGZvciB0aGUgU09BUCBuYW1lc3BhY2UuIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnQgaXMgJ2ZhdWx0Jy4KLSEtLSBfRVJST1JfSU5WQUxJRF9CT0RZX05BTUVTUEFDRV9GT1JfRU5DT0RFRCAgICAgICAgPSBUaGUgbmFtZXNwYWNlIHNwZWNpZmllZCBmb3IgdGhlIFNPQVAgYm9keSBpcyBpbnZhbGlkLiBZb3UgbXVzdCBzcGVjaWZ5IGEgbmFtZXNwYWNlIGZvciB0aGUgU09BUCBib2R5IGVsZW1lbnQgd2hlbiBpdHMgdXNlIGlzIGVuY29kZWQuCi0KLSEtLSBBIFNPQVAgYm9keSBlbGVtZW50IGluIGEgV1NETCBkb2N1bWVudCBjYW4gaGF2ZSBhbiBhdHRyaWJ1dGUgInVzZSIgZGVmaW5lZCB0byBiZSBlaXRoZXIgbGl0ZXJhbCBvciBlbmNvZGVkLiAtLQotIS0tIFRoaXMgc3RyaW5nIGlzIHVzZWQgaW4gYW4gZXJyb3IgdGFzayBpbiBXU0FEIGlmIHRoZSBkb2N1bWVudCBzcGVjaWZpZXMgYSB1c2Ugb3RoZXIgdGhlbiBsaXRlcmFsIG9yIGVuY29kZWQuIC0tIAotIS0tIEZvciBleGFtcGxlLCBpZiB0aGUgZG9jdW1lbnQgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlIFNPQVAgYm9keSBhcyAic2ltcGxlIiB0aGUgb3V0cHV0IHN0cmluZyBzaG91bGQgYmU6ICAgIC0tCi0hLS0gVGhlICdzaW1wbGUnIHVzZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGJvZHkgaXMgaW52YWxpZC4gVGhlIHVzZSBtdXN0IGJlIGxpdGVyYWwgb3IgZW5jb2RlZC4gICAgICAgICAgICAgICAgLS0KLV9FUlJPUl9JTlZBTElEX0JPRFlfVVNFICAgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gdXNlIHNwZWNpZmllZCBmb3IgdGhlIFNPQVAgYm9keSBpcyBpbnZhbGlkLiBUaGUgdXNlIG11c3QgYmUgbGl0ZXJhbCBvciBlbmNvZGVkLgotX0VSUk9SX0lOVkFMSURfQk9EWV9FTkNPRElOR19TVFlMRSAgICAgICAgICAgICAgID0gVGhlcmUgaXMgbm8gZW5jb2Rpbmcgc3R5bGUgVVJJIGRlZmluZWQgZm9yIHRoZSBTT0FQIGJvZHkuIFlvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIFVSSSBmb3IgdGhlIGVuY29kaW5nIHN0eWxlIHdoZW4gdGhlIHVzZSBpcyBlbmNvZGVkLgotX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX1VOREVGSU5FRCAgICAgICAgICAgICAgID0gVGhlIHswfSBwYXJ0IHNwZWNpZmllZCBhcyBhIHBhcnQgZm9yIHRoZSBTT0FQIGJvZHkgaXMgdW5kZWZpbmVkLiAgWW91IGNhbiBvbmx5IHNwZWNpZnkgZGVmaW5lZCBwYXJ0cy4KLV9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9OT1RfVFlQRSAgICAgICAgICAgICAgICA9IFRoZSB7MH0gcGFydCBkb2VzIG5vdCBoYXZlIGEgdHlwZSBkZWZpbmVkIGFuZCBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIGEgU09BUCBib2R5IHdpdGggaXRzIHVzZSBlbmNvZGVkLiBXaGVuIHVzZSBpcyBlbmNvZGVkIG9uIGEgU09BUCBib2R5LCBhbGwgcGFydHMgZGVmaW5lZCBtdXN0IG9ubHkgY29udGFpbiBhIHZhbGlkIHR5cGUuCi1fRVJST1JfSU5WQUxJRF9TT0FQX0VMRU1FTlRfRk9SX0xPQ0FUSU9OICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgY2Fubm90IGJlIHNwZWNpZmllZCBoZXJlLiBUaGlzIGVsZW1lbnQgaXMgbm90IGRlZmluZWQgaW4gdGhlIFNPQVAgbmFtZXNwYWNlIGZvciB1c2UgYXQgdGhpcyBwb2ludC4KLV9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQUREUkVTUyAgICAgICAgICAgICAgICA9IEEgU09BUCBhZGRyZXNzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaGVyZSBhcyB0aGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgezF9IHBvcnQgcmVmZXJzIHRvIGRvZXMgbm90IGhhdmUgYSBTT0FQIGJpbmRpbmcgZWxlbWVudCBkZWZpbmVkLiBUaGVyZSBtdXN0IGJlIGEgU09BUCBiaW5kaW5nIGVsZW1lbnQgZGVmaW5lZCBpbiBvcmRlciB0byBzcGVjaWZ5IGEgU09BUCBhZGRyZXNzIGZvciBhIGJpbmRpbmcuCi1fRVJST1JfSEVBREVSX01FU1NBR0VfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IG1lc3NhZ2Ugc3BlY2lmaWVkIGZvciB0aGUgU09BUCBoZWFkZXIgaXMgdW5kZWZpbmVkLiBUaGUgbWVzc2FnZSBzcGVjaWZpZWQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LgotX0VSUk9SX0hFQURFUl9QQVJUX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBwYXJ0IHNwZWNpZmllZCBpbiBtZXNzYWdlIHsxfSBmb3IgdGhlIFNPQVAgaGVhZGVyIGlzIHVuZGVmaW5lZC4gRW5zdXJlIHRoZSBwYXJ0IGlzIGRlZmluZWQgaW4gdGhlIHsxfSBtZXNzYWdlLgotX0VSUk9SX0hFQURFUl9VU0VfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSB1c2Ugc3BlY2lmaWVkIGZvciB0aGUgU09BUCBoZWFkZXIgaXMgaW52YWxpZC4gVGhlIHVzZSBtdXN0IGJlIHNwZWNpZmllZCBhcyBsaXRlcmFsIG9yIGVuY29kZWQuCi1fRVJST1JfSEVBREVSX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEICAgICAgICAgICAgPSBUaGUgZW5jb2Rpbmcgc3R5bGUgZm9yIHRoZSBTT0FQIGhlYWRlciBpcyBub3Qgc3BlY2lmaWVkLiBXaGVuIHRoZSB1c2UgaXMgZW5jb2RlZCB0aGUgZW5jb2Rpbmcgc3R5bGUgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBVUkkuCi1fRVJST1JfSEVBREVSX05BTUVTUEFDRV9VTkRFRklORUQgICAgICAgICAgICAgICAgPSBUaGUgbmFtZXNwYWNlIGZvciB0aGUgU09BUCBoZWFkZXIgaXMgbm90IHNwZWNpZmllZC4gV2hlbiB0aGUgdXNlIGlzIGVuY29kZWQgYSBuYW1lc3BhY2UgVVJJIG11c3QgYmUgZGVmaW5lZC4KLV9FUlJPUl9IRUFERVJGQVVMVF9NRVNTQUdFX1VOREVGSU5FRCAgICAgICAgICAgICA9IFRoZSB7MH0gbWVzc2FnZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBpcyB1bmRlZmluZWQuIFRoZSBtZXNzYWdlIHNwZWNpZmllZCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuCi1fRVJST1JfSEVBREVSRkFVTFRfUEFSVF9VTkRFRklORUQgICAgICAgICAgICAgICAgPSBUaGUgezB9IHBhcnQgc3BlY2lmaWVkIGluIG1lc3NhZ2UgezF9IGZvciB0aGUgU09BUCBoZWFkZXIgZmF1bHQgaXMgdW5kZWZpbmVkLiBFbnN1cmUgdGhlIHBhcnQgaXMgZGVmaW5lZCBpbiB0aGUgezF9IG1lc3NhZ2UuIAotX0VSUk9SX0hFQURFUkZBVUxUX1VTRV9VTkRFRklORUQgICAgICAgICAgICAgICAgID0gVGhlIHswfSB1c2Ugc3BlY2lmaWVkIGZvciB0aGUgU09BUCBoZWFkZXIgZmF1bHQgaXMgaW52YWxpZC4gVGhlIHVzZSBtdXN0IGJlIHNwZWNpZmllZCBhcyBsaXRlcmFsIG9yIGVuY29kZWQuCi1fRVJST1JfSEVBREVSRkFVTFRfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQgICAgICAgPSBUaGUgZW5jb2Rpbmcgc3R5bGUgZm9yIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBpcyBub3Qgc3BlY2lmaWVkLiBXaGVuIHRoZSB1c2UgaXMgZW5jb2RlZCB0aGUgZW5jb2Rpbmcgc3R5bGUgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBVUkkuCi1fRVJST1JfSEVBREVSRkFVTFRfTkFNRVNQQUNFX1VOREVGSU5FRCAgICAgICAgICAgPSBUaGUgbmFtZXNwYWNlIGZvciB0aGUgU09BUCBoZWFkZXIgZmF1bHQgaXMgbm90IHNwZWNpZmllZC4gV2hlbiB0aGUgdXNlIGlzIGVuY29kZWQgYSBuYW1lc3BhY2UgVVJJIG11c3QgYmUgZGVmaW5lZC4KLV9FUlJPUl9JTlZBTElEX0ZBVUxUX05BTUUgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gbmFtZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGZhdWx0IGlzIGludmFsaWQuIFRoZSBuYW1lIHNwZWNpZmllZCBtdXN0IGJlIHsxfSwgdGhlIG5hbWUgZnJvbSB0aGUgZmF1bHQgcGFyZW50IGVsZW1lbnQuCi1fRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiAgICAgICAgICAgICAgPSBUaGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgU09BUCBvcGVyYXRpb24gaXMgc3BlY2lmaWVkIGZvciBkb2VzIG5vdCBoYXZlIGEgU09BUCBiaW5kaW5nIGRlZmluZWQuIEEgU09BUCBiaW5kaW5nIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byBkZWZpbmUgYSBTT0FQIG9wZXJhdGlvbiBoZXJlLgotX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9CT0RZICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBiaW5kaW5nIHRoYXQgdGhlIFNPQVAgYm9keSBpcyBzcGVjaWZpZWQgZm9yIGRvZXMgbm90IGhhdmUgYSBTT0FQIGJpbmRpbmcgZGVmaW5lZC4gQSBTT0FQIGJpbmRpbmcgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvIGRlZmluZSBhIFNPQVAgYm9keSBoZXJlLgotX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIgICAgICAgICAgICAgICAgID0gVGhlIHswfSBiaW5kaW5nIHRoYXQgdGhlIFNPQVAgaGVhZGVyIGlzIHNwZWNpZmllZCBmb3IgZG9lcyBub3QgaGF2ZSBhIFNPQVAgYmluZGluZyBkZWZpbmVkLiBBIFNPQVAgYmluZGluZyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gZGVmaW5lIGEgU09BUCBoZWFkZXIgaGVyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvV1NETENvbmZpZ3VyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1dTRExDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4ZWMyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvV1NETENvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLldTRExWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMC5XU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZTsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgdG8gc2V0IHZhbGlkYXRvcnMgYW5kIHNjaGVtYXMgdGhhdCBjYW4gYmUgdXNlZAotICogYnkgYWxsIGludGVyZmFjZXMgdG8gdGhlIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFdTRExDb25maWd1cmF0b3IKLXsKLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGEgV1NETCB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcyB0byByZWdpc3Rlci4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc2xvYWRlciBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldTRExWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlLCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikKLSAgewotICAgIFdTRExWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUodmFsaWRhdG9yQ2xhc3NuYW1lLCByZXNvdXJjZUJ1bmRsZSwgY2xhc3Nsb2FkZXIpOwotICAgIFZhbGlkYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVnaXN0ZXJWYWxpZGF0b3IobmFtZXNwYWNlLCBkZWxlZ2F0ZSwgVmFsaWRhdG9yUmVnaXN0cnkuV1NETF9WQUxJREFUT1IpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGFuIGV4dGVuc2lvbiB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcyB0byByZWdpc3Rlci4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc2xvYWRlciBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckV4dGVuc2lvblZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGUsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKQotICB7Ci0gICAgV1NETFZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IFdTRExWYWxpZGF0b3JEZWxlZ2F0ZSh2YWxpZGF0b3JDbGFzc25hbWUsIHJlc291cmNlQnVuZGxlLCBjbGFzc2xvYWRlcik7Ci0gICAgVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlclZhbGlkYXRvcihuYW1lc3BhY2UsIGRlbGVnYXRlLCBWYWxpZGF0b3JSZWdpc3RyeS5FWFRfVkFMSURBVE9SKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBhIFdTREwgMS4xIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHZhbGlkYXRvcgotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MgdG8gcmVnaXN0ZXIKLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc2xvYWRlciBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldTREwxMVZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGUsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKQotICB7Ci0gIAlXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSh2YWxpZGF0b3JDbGFzc25hbWUsIHJlc291cmNlQnVuZGxlLCBjbGFzc2xvYWRlcik7Ci0gICAgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlclZhbGlkYXRvcihuYW1lc3BhY2UsIGRlbGVnYXRlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGEgV1NETCAyLjAgdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgdmFsaWRhdG9yCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcyB0byByZWdpc3RlcgotICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBiYXNlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldTREwyMFZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGUpCi0gIHsKLSAgICBXU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZSh2YWxpZGF0b3JDbGFzc25hbWUsIHJlc291cmNlQnVuZGxlKTsKLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMC5WYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyVmFsaWRhdG9yKG5hbWVzcGFjZSwgZGVsZWdhdGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBkZWZhdWx0IHZhbGlkYXRvcnMuIFJlZ2lzdGVycyB2YWxpZGF0b3JzIGZvcjoKLSAgICogV1NETCAxLjEKLSAgICogV1NETCAxLjEgU09BUAotICAgKiBXU0RMIDEuMSBIVFRQCi0gICAqIFdTREwgMS4xIE1JTUUKLSAgICogCi0gICAqIEBwYXJhbSByYiAtIHRoZSByZXNvdXJjZSBidW5kbGUgb2YgdGhlIFdTREwgMS4xIHZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRGVmYXVsdFZhbGlkYXRvcnMoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICAvLyBSZWdpc3RlciB0aGUgV1NETCAxLjEgdmFsaWRhdG9yIGNvbnRyb2xsZXIgYW5kIHZhbGlkYXRvcnMuCi0gICAgcmVnaXN0ZXJXU0RMVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfV1NETCwgIm9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIiLCAidmFsaWRhdGV3c2RsIiwgbnVsbCk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETDExQmFzaWNWYWxpZGF0b3IiLCAidmFsaWRhdGV3c2RsIiwgbnVsbCk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoCi0gICAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50cy5OU19IVFRQLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuaHR0cC5IVFRQVmFsaWRhdG9yIiwidmFsaWRhdGV3c2RsaHR0cCIsIG51bGwpOwotICAgIHJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKAotICAgICAgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25zdGFudHMuTlNfU09BUDExLCJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5zb2FwLlNPQVBWYWxpZGF0b3IiLCJ2YWxpZGF0ZXdzZGxzb2FwIiwgbnVsbCk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoCi0gICAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50cy5OU19NSU1FLCJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5taW1lLk1JTUVWYWxpZGF0b3IiLCJ2YWxpZGF0ZXdzZGxtaW1lIiwgbnVsbCk7Ci0gICAgCi0gICAgLy8gVGhlIFdTREwgMS4xIHNjaGVtYSB2YWxpZGF0b3IgaXMgYSBzcGVjaWFsIGNhc2UgYXMgaXQgaXMgcmVnaXN0ZXJlZCBmb3IgdGhyZWUgbmFtZXNwYWNlcy4KLSAgICAvLyBXZSB3aWxsIGNhbGwgZGlyZWN0bHkgaGVyZSBzbyB3ZSBjYW4gdXNlIHRoZSBzYW1lIGRlbGVnYXRlIGZvciBhbGwgdGhyZWUgbmFtZXNwYWNlcy4KLSAgICBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSgib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkLklubGluZVNjaGVtYVZhbGlkYXRvciIsICJ2YWxpZGF0ZXdzZGwiKTsKLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5WYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTksIGRlbGVnYXRlKTsKLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5WYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDAsIGRlbGVnYXRlKTsKLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5WYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEsIGRlbGVnYXRlKTsKLSAgICAKLSAgICAvLyBSZWdpc3RlciB0aGUgV1NETCAyLjAgdmFsaWRhdG9yIGNvbnRyb2xsZXIgYW5kIHZhbGlkYXRvcnMuCi0vLyAgICByZWdpc3RlcldTRExWYWxpZGF0b3Iob3JnLmVjbGlwc2Uud3NkbDIwLm1vZGVsLmltcGwuQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMjAuV1NETDIwVmFsaWRhdG9yQ29udHJvbGxlciIsICJ2YWxpZGF0ZXdzZGwiLCBudWxsKTsKLS8vICAgIAotLy8gICAgcmVnaXN0ZXJXU0RMMjBWYWxpZGF0b3Iob3JnLmVjbGlwc2Uud3NkbDIwLm1vZGVsLmltcGwuQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMjAuV1NETDIwQmFzaWNWYWxpZGF0b3IiLCAidmFsaWRhdGV3c2RsIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvRXh0ZW5zaW9uVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L0V4dGVuc2lvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjlhYTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvRXh0ZW5zaW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5hbnQ7Ci0KLS8qKgotICogQW4gZXh0ZW5zaW9uIEFudCBXU0RMIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2lvblZhbGlkYXRvcgotewotICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWUgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyByZXNvdXJjZWJ1bmRsZSA9IG51bGw7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgY2xhc3NuYW1lKQotICB7Ci0gICAgdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKLSAgewotICAgIHJldHVybiB0aGlzLmNsYXNzbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VidW5kbGUpCi0gIHsKLSAgICB0aGlzLnJlc291cmNlYnVuZGxlID0gcmVzb3VyY2VidW5kbGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VidW5kbGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvVVJJUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2NjIzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1VSSVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5hbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotCi0vKioKLSAqIFRoZSBVUklSZXNvbHZlciB0YXNrIGFsbG93cyBzcGVjaWZ5aW5nIGFuIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIgd2l0aAotICogdGhlIFdTRExWYWxpZGF0ZSBBbnQgdGFzay4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyIGV4dGVuZHMgVGFzawotewotICBwcml2YXRlIFN0cmluZyBjbGF6eiA9IG51bGw7Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIGNsYXp6IFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGF6eikKLSAgewotICAgIHRoaXMuY2xhenogPSBjbGF6ejsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY2xheno7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvV1NETFZhbGlkYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1dTRExWYWxpZGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjY1NzQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvV1NETFZhbGlkYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRFRETG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5XU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLldTRExDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci0KLS8qKgotICogQW4gQW50IHRhc2sgdG8gcnVuIFdTREwgdmFsaWRhdGlvbiBvbiBhIGZpbGUgb3IgYSBzZXQgb2YgZmlsZXMuCi0gKiAKLSAqIE9wdGlvbnMKLSAqIC0gZmlsZSAtIHRoZSBmaWxlIHRvIHJ1biB2YWxpZGF0aW9uIG9uIChvcHRpb25hbCBpZiBmaWxlc2V0IGlzIHVzZWQpCi0gKiAtIGZhaWxvbmVycm9yIC0gZmFpbCB0aGUgYnVpbGQgcHJvY2VzcyBvbiB0aGUgZmlyc3QgZmlsZSB3aXRoIGFuIGVycm9yCi0gKiAtIHdzaWNvbXBsaWFuY2UgLSBob3cgdG8gcmVwb3J0IFdTLUkgZXJyb3JzIC0gUkVRVUlSRSwgU1VHR0VTVCwgSUdOT1JFIChkZWZhdWx0cyB0byBSRVFVSVJFKQotICogCi0gKiBTdXBwb3J0ZWQgTmVzdGVkIEVsZW1lbnRzCi0gKiAtIHhtbGNhdGFsb2cgLSBhbiB4bWwgY2F0YWxvZwotICogLSBkdGQgICAgICAgIC0gYSBkdGQgc3BlY2lmaWNhdGlvbiBhcyB3b3VsZCBhcHBlYXIgaW4gYW4geG1sY2F0YWxvZwotICogLSBzY2hlbWEgICAgIC0gYSBzY2hlbWEgc3BlY2lmaWNhdGlvbiBhcyB3b3VsZCBhcHBlYXIgaW4gYW4geG1sY2F0YWxvZwotICogLSBlbnRpdHkgICAgIC0gYW4gZW50aXR5IHNwZWNpZmljYXRpb24gYXMgd291bGQgYXBwZWFyIGluIGFuIHhtbGNhdGFsb2cKLSAqIC0gZmlsZXNldCAgICAtIGEgc2V0IG9mIGZpbGVzIHRvIHZhbGlkYXRlCi0gKiAtIHdzZGwxMXZhbGlkYXRvciAtIGFuIGV4dGVuc2lvbiBXU0RMIDEuMSB2YWxpZGF0b3IKLSAqIC0gdXJpcmVzb2x2ZXIgLSBhbiBleHRlbnNpb24gVVJJIHJlc29sdmVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0ZSBleHRlbmRzIFRhc2sKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBVSV9QUk9QRVJUSUVTID0gInZhbGlkYXRld3NkbHVpIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfUFJPUEVSVElFUyA9IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uc3RhbnRzLldTRExfVkFMSURBVE9SX1BST1BFUlRJRVNfRklMRTsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fRklMRV9TUEVDSUZJRUQgPSAiX0VSUk9SX05PX0ZJTEVfU1BFQ0lGSUVEIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfVUlfSU5GT1JNQVRJT05fREVMSU1JVEVSID0gIl9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9BQ1RJT05fVkFMSURBVElOR19GSUxFID0gIl9VSV9BQ1RJT05fVkFMSURBVElOR19GSUxFIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfVUlfRVJST1JfTUFSS0VSID0gIl9VSV9FUlJPUl9NQVJLRVIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9XQVJOSU5HX01BUktFUiA9ICJfVUlfV0FSTklOR19NQVJLRVIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9WQUxJRCA9ICJfVUlfVkFMSUQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9JTlZBTElEID0gIl9VSV9JTlZBTElEIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVhDX1VOQUJMRV9UT19WQUxJREFURV9GSUxFID0gIl9FWENfVU5BQkxFX1RPX1ZBTElEQVRFX0ZJTEUiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FWENfV1NETF9GQUlMX09OX0VSUk9SID0gIl9FWENfV1NETF9GQUlMX09OX0VSUk9SIjsKLSAgCi0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgV1NJX1JFUVVJUkUgPSAicmVxdWlyZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgV1NJX1NVR0dFU1QgPSAic3VnZ2VzdCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgV1NJX0lHTk9SRSA9ICJpZ25vcmUiOwotCi0gIC8vIEdsb2JhbCBWYXJzCi0gIHByb3RlY3RlZCBMaXN0IGZpbGVzZXRzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGUgPSBudWxsOwotICBwcm90ZWN0ZWQgUGF0aCBjbGFzc3BhdGg7Ci0gIHByb3RlY3RlZCBTdHJpbmcgeHNkRGlyZWN0b3J5ID0gbnVsbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIFhNTENhdGFsb2cgZ2xvYmFsWE1MQ2F0YWxvZyA9IG5ldyBYTUxDYXRhbG9nKCk7Ci0gIHByb3RlY3RlZCBTdHJpbmcgd3NpTGV2ZWwgPSBXU0lfUkVRVUlSRTsKLSAgcHJvdGVjdGVkIExpc3Qgd3NkbDExdmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIExpc3QgZXh0VVJJUmVzb2x2ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBDb25zdHVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0ZSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBUZWxscyB0aGUgV1NETCB2YWxpZGF0ZSB0YXNrIHRvIGZhaWwgdGhlIGJ1aWxkIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIGZhaWxPbkVycm9yIFdoZXRoZXIgdG8gZmFpbCBvbiBlcnJvciBvciBub3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGZhaWxPbkVycm9yKQotICB7Ci0gICAgdGhpcy5mYWlsT25FcnJvciA9IGZhaWxPbkVycm9yOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgV1MtSSBjb21wbGlhbmNlIGxldmVsIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gY29tcGxpYW5jZWxldmVsIC0gdGhlIGNvbXBsaWFuY2UgbGV2ZWwgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0lDb21wbGlhbmNlKFN0cmluZyBjb21wbGlhbmNlbGV2ZWwpCi0gIHsKLSAgICBpZiAoY29tcGxpYW5jZWxldmVsLmVxdWFsc0lnbm9yZUNhc2UoV1NJX1NVR0dFU1QpKQotICAgIHsKLSAgICAgIHdzaUxldmVsID0gV1NJX1NVR0dFU1Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXBsaWFuY2VsZXZlbC5lcXVhbHNJZ25vcmVDYXNlKFdTSV9JR05PUkUpKQotICAgIHsKLSAgICAgIHdzaUxldmVsID0gV1NJX0lHTk9SRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzaUxldmVsID0gV1NJX1JFUVVJUkU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBiYXNlIHNjaGVtYSBmaWxlcyBmb3IgdGhlIGNhdGFsb2cgYXJlIGxvY2F0ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZGlyIC0gdGhlIGRpcmVjdG9yeSBvZiB0aGUgYmFzZSBzY2hlbWEgZmlsZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYURpcihTdHJpbmcgZGlyKQotICB7Ci0gICAgeHNkRGlyZWN0b3J5ID0gZGlyOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBhIGZpbGUgdG8gcnVuIFdTREwgdmFsaWRhdGlvbiBvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIC0gYSBmaWxlIHRvIHJ1biB2YWxpZGF0aW9uIG9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGaWxlKFN0cmluZyBmaWxlKQotICB7Ci0gICAgdGhpcy5maWxlID0gZmlsZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBzZXQgb2YgZmlsZXMgdG8gcnVuIFdTREwgdmFsaWRhdGlvbiBvbi4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIEZpbGVTZXQgb2YgZmlsZXMgdG8gcnVuIFdTREwgdmFsaWRhdGlvbiBvbgotICAgKi8KLSAgcHVibGljIEZpbGVTZXQgY3JlYXRlRmlsZXNldCgpCi0gIHsKLSAgICBGaWxlU2V0IGZpbGVzZXQgPSBuZXcgRmlsZVNldCgpOwotICAgIGZpbGVzZXRzLmFkZChmaWxlc2V0KTsKLSAgICByZXR1cm4gZmlsZXNldDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gWE1MIGNhdGFsb2cgdG8gdGhlIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBjYXRhbG9nIC0gdGhlIGNhdGFsb2cgdG8gYWRkIHRvIHRoZSB2YWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRYTUxDYXRhbG9nKFhNTENhdGFsb2cgY2F0YWxvZykKLSAgewotICAgIGdsb2JhbFhNTENhdGFsb2cuYWRkQ29uZmlndXJlZFhNTENhdGFsb2coY2F0YWxvZyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRXU0RMMTFWYWxpZGF0b3IoRXh0ZW5zaW9uVmFsaWRhdG9yIGV4dFZhbCkKLSAgewotICAgIHdzZGwxMXZhbGlkYXRvcnMuYWRkKGV4dFZhbCk7Ci0gIH0KLQotICAvKioKLSAgICogQWxsb3cgc3BlY2lmaWNhdGlvbiBvZiBhbiBlbnRpdHkgb3V0c2lkZSBvZiBhbiBYTUxDYXRhbG9nLgotICAgKiAKLSAgICogQHJldHVybiBhIERURExvY2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBlbnRpdHkKLSAgICoqLwotICBwdWJsaWMgRFRETG9jYXRpb24gY3JlYXRlRW50aXR5KCkKLSAgewotICAgIERURExvY2F0aW9uIGR0ZExvYyA9IG5ldyBEVERMb2NhdGlvbigpOwotICAgIGdsb2JhbFhNTENhdGFsb2cuYWRkRW50aXR5KGR0ZExvYyk7Ci0gICAgcmV0dXJuIGR0ZExvYzsKLSAgfQotCi0gIC8qKgotICAgKiBBbGxvdyBzcGVjaWZpY2F0aW9uIG9mIGEgRFREIG91dHNpZGUgb2YgYW4gWE1MQ2F0YWxvZy4KLSAgICogCi0gICAqIEByZXR1cm4gYSBEVERMb2NhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgRFRECi0gICAqKi8KLSAgcHVibGljIERURExvY2F0aW9uIGNyZWF0ZURURCgpCi0gIHsKLSAgICBEVERMb2NhdGlvbiBkdGRMb2MgPSBuZXcgRFRETG9jYXRpb24oKTsKLSAgICBnbG9iYWxYTUxDYXRhbG9nLmFkZEVudGl0eShkdGRMb2MpOwotICAgIHJldHVybiBkdGRMb2M7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSBVUklSZXNvbHZlciBleHRlbnNpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIEEgVVJJUmVzb2x2ZXIuCi0gICAqLwotICBwdWJsaWMgVVJJUmVzb2x2ZXIgY3JlYXRlVVJJUmVzb2x2ZXIoKQotICB7Ci0gICAgVVJJUmVzb2x2ZXIgdXJpcmVzID0gbmV3IFVSSVJlc29sdmVyKCk7Ci0gICAgZXh0VVJJUmVzb2x2ZXJzLmFkZCh1cmlyZXMuZ2V0Q2xhc3NOYW1lKCkpOwotICAgIHJldHVybiB1cmlyZXM7Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbGlzdCBvZiBhbGwgdGhlIGZpbGVzIHRvIHJ1biBXU0RMIHZhbGlkYXRpb24gb24uIFRha2VzIHRoZSBmaWxlIGFuZCBmaWxlc2V0Ci0gICAqIGFuZCBjcmVhdGVzIHRoZSBsaXN0LgotICAgKiAKLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBmaWxlcyB0byBiZSB2YWxpZGF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IGdldEZpbGVMaXN0KCkKLSAgewotICAgIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvLyBpZiBhIHNwZWNpZmljIGZpbGUgd2FzIHNwZWNpZmllZCBhZGQgaXQgdG8gdGhlIGxpc3QKLSAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZpbGVzLmFkZChmaWxlKTsKLSAgICB9Ci0KLSAgICAvLyBnbyB0aHJvdWdoIGFsbCBmaWxlc2V0cyBzcGVjaWZpZWQgYW5kIGFkZCBhbGwgdGhlIGZpbGVzIHRvIHRoZSBsaXN0Ci0gICAgSXRlcmF0b3IgZnNJdGVyID0gZmlsZXNldHMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZnNJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBGaWxlU2V0IGZpbGVzZXQgPSAoRmlsZVNldClmc0l0ZXIubmV4dCgpOwotICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZpbGVzZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihmaWxlc2V0LmdldFByb2plY3QoKSk7Ci0KLSAgICAgIFN0cmluZ1tdIGZpbGVsaXN0ID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgaW50IG51bUZpbGVzID0gZmlsZWxpc3QubGVuZ3RoOwotICAgICAgaWYgKGZpbGVzICE9IG51bGwgJiYgbnVtRmlsZXMgPiAwKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZpbGVzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBmaWxlcy5hZGQoZmlsZWxpc3RbaV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWxlczsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrI2V4ZWN1dGUoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgotICB7Ci0gICAgLy8gdGhlIHJlc291cmNlIGJ1bmRsZXMgZm9yIHRoZSB1aSBhbmQgdmFsaWRhdG9yIGFyZSBuZWVkZWQKLSAgICBSZXNvdXJjZUJ1bmRsZSB2YWxpZGF0b3JSQiA9IG51bGw7Ci0gICAgTWVzc2FnZUdlbmVyYXRvciBtZXNzR2VuID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBSZXNvdXJjZUJ1bmRsZSB1aVJCID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFVJX1BST1BFUlRJRVMpOwotICAgICAgbWVzc0dlbiA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHVpUkIpOwotICAgICAgdmFsaWRhdG9yUkIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVkFMSURBVE9SX1BST1BFUlRJRVMpOwotICAgIH0KLSAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gaWYgdGhlIHJlc291cmNlIGJ1bmRsZXMgY2FuJ3QgYmUgb3BlbmVkIHdlIGNhbid0IHJlcG9ydCBlcnJvciBzbyB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIG9wZW4gcmVzb3VyY2UgYnVuZGxlLiAiICsgZSk7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBYTUwgY2F0YWxvZy4KLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nLnNldEV4dGVuc2lvblhNTENhdGFsb2coIm9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUudWkuYW50LlhNTENhdGFsb2dJbXBsIiwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICBYTUxDYXRhbG9nSW1wbCB4bWxDYXRhbG9nID0gKFhNTENhdGFsb2dJbXBsKW9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cuZ2V0SW5zdGFuY2UoKTsKLSAgICB4bWxDYXRhbG9nLmFkZFhNTENhdGFsb2coZ2xvYmFsWE1MQ2F0YWxvZyk7Ci0gICAgCi0gICAgV1NETFZhbGlkYXRvciB3c2RsVmFsaWRhdG9yID0gbmV3IFdTRExWYWxpZGF0b3IoKTsKLSAgICAKLSAgICAvLyBTZXQgdGhlIGV4dGVuc2lvbiBVUklSZXNvbHZlcnMuCi0gICAgSXRlcmF0b3IgcmVzb2x2ZXJzSXRlciA9IGV4dFVSSVJlc29sdmVycy5pdGVyYXRvcigpOwotICAgIHdoaWxlKHJlc29sdmVyc0l0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyByZXNvbHZlckNsYXNzID0gKFN0cmluZylyZXNvbHZlcnNJdGVyLm5leHQoKTsKLSAgICAgIHdzZGxWYWxpZGF0b3IuYWRkVVJJUmVzb2x2ZXIobmV3IFVSSVJlc29sdmVyRGVsZWdhdGUocmVzb2x2ZXJDbGFzcywgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKS5nZXRVUklSZXNvbHZlcigpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHRvIHZhbGlkYXRlLgotICAgIExpc3QgZmlsZXMgPSBnZXRGaWxlTGlzdCgpOwotICAgIAotICAgIC8vIFJlZ2lzdGVyIHRoZSBXU0RMIDEuMSBleHRlbnNpb24gdmFsaWRhdG9ycy4KLSAgICBJdGVyYXRvciB3c2RsMTFleHRJdGVyID0gd3NkbDExdmFsaWRhdG9ycy5pdGVyYXRvcigpOwotICAgIHdoaWxlKHdzZGwxMWV4dEl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2lvblZhbGlkYXRvciBleHRWYWwgPSAoRXh0ZW5zaW9uVmFsaWRhdG9yKXdzZGwxMWV4dEl0ZXIubmV4dCgpOwotICAgICAgV1NETENvbmZpZ3VyYXRvci5yZWdpc3RlcldTREwxMVZhbGlkYXRvcihleHRWYWwuZ2V0TmFtZXNwYWNlKCksIGV4dFZhbC5nZXRDbGFzc05hbWUoKSwgZXh0VmFsLmdldFJlc291cmNlQnVuZGxlKCksIG51bGwpOwotICAgIH0KLQotICAgIC8vIFRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGFueSBmaWxlcyB0byB2YWxpZGF0ZS4KLSAgICBpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1lc3NHZW4uZ2V0U3RyaW5nKF9FUlJPUl9OT19GSUxFX1NQRUNJRklFRCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFJlZ2lzdGVyIHRoZSBkZWZhdWx0IHZhbGlkYXRvcnMgYW5kIHNjaGVtYXMuCi0gICAgV1NETENvbmZpZ3VyYXRvci5yZWdpc3RlckRlZmF1bHRWYWxpZGF0b3JzKHZhbGlkYXRvclJCKTsKLSAgICBpZiAoeHNkRGlyZWN0b3J5ICE9IG51bGwpCi0gICAgewotICAgICAgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MQ2F0YWxvZy5hZGRTY2hlbWFEaXIoeHNkRGlyZWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZSBhbGwgdGhlIGZpbGVzIHNwZWNpZmllZC4KLSAgICBJdGVyYXRvciBpRmlsZXMgPSBmaWxlcy5pdGVyYXRvcigpOwotCi0gICAgLy8gQ29tbW9uIHN0cmluZ3MgbmVlZGVkIGluIHZhbGlkYXRpb24gb3V0cHV0LgotICAgIFN0cmluZyBpbmZvRGVsaW0gPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfSU5GT1JNQVRJT05fREVMSU1JVEVSKTsKLSAgICBTdHJpbmcgdmFsaWQgPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfVkFMSUQpOwotICAgIFN0cmluZyBpbnZhbGlkID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX0lOVkFMSUQpOwotICAgIFN0cmluZyBlcnJvcm1hcmtlciA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9FUlJPUl9NQVJLRVIpOwotICAgIFN0cmluZyB3YXJuaW5nbWFya2VyID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX1dBUk5JTkdfTUFSS0VSKTsKLQotICAgIGludCB3c2lDb25mb3JtYW5jZUxldmVsOwotICAgIAotICAgIC8vIFNldCB0aGUgV1MtSSBjb21wbGlhbmNlIGxldmVsLgotICAgIGlmICh3c2lMZXZlbC5lcXVhbHMoV1NJX1NVR0dFU1QpKQotICAgIHsKLSAgICAgIC8vd3NpQ29uZm9ybWFuY2VMZXZlbCA9IFZhbGlkYXRpb25Db250cm9sbGVyLldTSV9TVUdHRVNUOwotICAgIH0KLSAgICBlbHNlIGlmICh3c2lMZXZlbC5lcXVhbHMoV1NJX0lHTk9SRSkpCi0gICAgewotICAgICAgLy93c2lDb25mb3JtYW5jZUxldmVsID0gVmFsaWRhdGlvbkNvbnRyb2xsZXIuV1NJX0lHTk9SRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vd3NpQ29uZm9ybWFuY2VMZXZlbCA9IFZhbGlkYXRpb25Db250cm9sbGVyLldTSV9SRVFVSVJFOwotICAgIH0KLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBudWxsOwotICAgIGJvb2xlYW4gbm90dmFsaWQgPSB0cnVlOwotICAgIHdoaWxlIChpRmlsZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIG5vdHZhbGlkID0gZmFsc2U7Ci0gICAgICBTdHJpbmcgZmlsZW5hbWUgPSAoU3RyaW5nKWlGaWxlcy5uZXh0KCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChpbmZvRGVsaW0pLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChtZXNzR2VuLmdldFN0cmluZyhfVUlfQUNUSU9OX1ZBTElEQVRJTkdfRklMRSwgZmlsZW5hbWUpKS5hcHBlbmQoIiAtICIpOwotCi0gICAgICAgIFZhbGlkYXRpb25SZXBvcnQgdmFsUmVwb3J0ID0gd3NkbFZhbGlkYXRvci52YWxpZGF0ZShmaWxlbmFtZSk7Ci0KLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcyA9IHZhbFJlcG9ydC5nZXRWYWxpZGF0aW9uTWVzc2FnZXMoKTsKLQotICAgICAgICBpZiAoIXZhbFJlcG9ydC5oYXNFcnJvcnMoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQodmFsaWQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW52YWxpZCk7Ci0gICAgICAgICAgbm90dmFsaWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIikuYXBwZW5kKGluZm9EZWxpbSkuYXBwZW5kKCJcbiIpOwotCi0gICAgICAgIHJlc3VsdC5hcHBlbmQocmVwb3J0TWVzc2FnZXMobWVzc2FnZXMsIGVycm9ybWFya2VyLCB3YXJuaW5nbWFya2VyKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdC50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKG5vdHZhbGlkICYmIGZhaWxPbkVycm9yKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd2UgZmFpbCBvbiBlcnJvciBieSB0aHJvd2luZyBhIGJ1aWxkIGV4Y2VwdGlvbgotICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzR2VuLmdldFN0cmluZyhfRVhDX1dTRExfRkFJTF9PTl9FUlJPUikpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtZXNzR2VuLmdldFN0cmluZyhfRVhDX1VOQUJMRV9UT19WQUxJREFURV9GSUxFLCBmaWxlbmFtZSwgZSkpOwotICAgICAgfQotICAgIH0KLQotICAgIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cucmVzZXQoKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIHN0cmluZyB3aXRoIGZvcm1hdHRlZCBvdXRwdXQgZm9yIHRoZSBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbWVzc2FnZXMgdG8gcmVwb3J0LgotICAgKiBAcGFyYW0gZXJyb3JtYXJrZXIgVGhlIG1hcmtlciB0byB1c2UgZm9yIGVycm9yIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gd2FybmluZ21hcmtlciBUaGUgbWFya2VyIHRvIHVzZSBmb3Igd2FybmluZyBtZXNzYWdlcy4KLSAgICogQHJldHVybiBBIHN0cmluZyB3aXRoIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXBvcnRNZXNzYWdlcyhWYWxpZGF0aW9uTWVzc2FnZVtdIG1lc3NhZ2VzLCBTdHJpbmcgZXJyb3JtYXJrZXIsIFN0cmluZyB3YXJuaW5nbWFya2VyKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHJldHVybkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIGlmIChtZXNzYWdlcyA9PSBudWxsKQotICAgICAgcmV0dXJuIHJldHVybkJ1ZmZlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgaW50IG51bU1lc3NhZ2VzID0gbWVzc2FnZXMubGVuZ3RoOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1NZXNzYWdlczsgaSsrKQotICAgIHsKLSAgICAgIFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTsKLQotICAgICAgaWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IGVycm9ybWFya2VyOwotICAgICAgfQotICAgICAgZWxzZSBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSB3YXJuaW5nbWFya2VyOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICB9aWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IGVycm9ybWFya2VyOwotICAgICAgfQotICAgICAgZWxzZSBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSB3YXJuaW5nbWFya2VyOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICB9aWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IGVycm9ybWFya2VyOwotICAgICAgfQotICAgICAgZWxzZSBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSB3YXJuaW5nbWFya2VyOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICB9aWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IGVycm9ybWFya2VyOwotICAgICAgfQotICAgICAgZWxzZSBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSB3YXJuaW5nbWFya2VyOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICB9Ci0gICAgICByZXR1cm5CdWZmZXIKLSAgICAgICAgLmFwcGVuZChwcmVmaXgpCi0gICAgICAgIC5hcHBlbmQoIiAiKQotICAgICAgICAuYXBwZW5kKG1lc3NhZ2UuZ2V0TGluZSgpKQotICAgICAgICAuYXBwZW5kKCI6IikKLSAgICAgICAgLmFwcGVuZChtZXNzYWdlLmdldENvbHVtbigpKQotICAgICAgICAuYXBwZW5kKCI6IikKLSAgICAgICAgLmFwcGVuZChtZXNzYWdlLmdldE1lc3NhZ2UoKSkKLSAgICAgICAgLmFwcGVuZCgiXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldHVybkJ1ZmZlci50b1N0cmluZygpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9YTUxDYXRhbG9nSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9YTUxDYXRhbG9nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBmOGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvWE1MQ2F0YWxvZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmFudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EVERMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5YTUxDYXRhbG9nOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV1NETCBWYWxpZGF0b3IncyBYTUwgQ2F0YWxvZyB0aGF0IHVzZXMgdGhlIFhNTCBDYXRhbG9nCi0gKiBmcm9tIGFudC4KLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dJbXBsIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MQ2F0YWxvZwotewotICBwcm90ZWN0ZWQgWE1MQ2F0YWxvZyB4bWxDYXRhbG9nID0gbmV3IFhNTENhdGFsb2coKTsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nI2FkZEVudHJ5VG9DYXRhbG9nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFbnRyeVRvQ2F0YWxvZyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIERURExvY2F0aW9uIHJlc0xvYyA9IG5ldyBEVERMb2NhdGlvbigpOwotICAgIHJlc0xvYy5zZXRMb2NhdGlvbihzeXN0ZW1JZCk7Ci0gICAgcmVzTG9jLnNldFB1YmxpY0lkKHB1YmxpY0lkKTsKLSAgICB4bWxDYXRhbG9nLmFkZEVudGl0eShyZXNMb2MpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MQ2F0YWxvZyNyZXNvbHZlRW50aXR5TG9jYXRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZUVudGl0eUxvY2F0aW9uKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgU3RyaW5nIHJlc29sdmVkSWQgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgSW5wdXRTb3VyY2UgaXMgPSB4bWxDYXRhbG9nLnJlc29sdmVFbnRpdHkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgIGlmIChpcyAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXNvbHZlZElkID0gaXMuZ2V0U3lzdGVtSWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICAvLyBuZWVkcyB0byByZXR1cm4gbnVsbCBpZiBpdCBjYW4ndCByZXNvbHZlIHRoZSBpZAotICAgIGlmIChyZXNvbHZlZElkICE9IG51bGwgJiYgcmVzb2x2ZWRJZC5lcXVhbHMoIiIpKQotICAgIHsKLSAgICAgIHJlc29sdmVkSWQgPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gcmVzb2x2ZWRJZDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBjb25maWd1cmVkIFhNTCBDYXRhbG9nIHRvIHRoaXMgY2F0YWxvZy4KLSAgICogCi0gICAqIEBwYXJhbSBjYXRhbG9nIEEgY29uZmlndXJlZCBYTUwgY2F0YWxvZyB0byBhZGQgdG8gdGhpcyBjYXRhbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkWE1MQ2F0YWxvZyhYTUxDYXRhbG9nIGNhdGFsb2cpCi0gIHsKLSAgICB4bWxDYXRhbG9nLmFkZENvbmZpZ3VyZWRYTUxDYXRhbG9nKGNhdGFsb2cpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1VSSVJlc29sdmVyUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1VSSVJlc29sdmVyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2NTg2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9VUklSZXNvbHZlclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyRGVsZWdhdGU7Ci0KLS8qKgotICogUmVhZCBleHRlbnNpb24gVVJJIHJlc29sdmVycy4KLSAqIAotICogIDxleHRlbnNpb24KLSAqICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi51cmlyZXNvbHZlciI+Ci0gKiAgICA8dXJpcmVzb2x2ZXIKLSAqICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnNvbWVjbGFzcyIvPgotICogICA8L2V4dGVuc2lvbj4KLSAqICAKLSAqLwotY2xhc3MgVVJJUmVzb2x2ZXJSZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJ1cmlyZXNvbHZlciI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFnTmFtZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgVVJJUmVzb2x2ZXJSZWdpc3RyeVJlYWRlcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBoYW5kbGUgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgdGhhdCBtYXRjaAotICAgKiB0aGUgc3BlZGlmaWVkIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIExpc3QgcmVhZFJlZ2lzdHJ5KCkKLSAgewotICAJTGlzdCByZXNvbHZlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElVUklSZXNvbHZlciByZXNvbHZlciA9IHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgICAgaWYocmVzb2x2ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc29sdmVyTGlzdC5hZGQocmVzb2x2ZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlckxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYW5kIGRlYWwgd2l0aCB0aGUgZXh0ZW5zaW9uIHBvaW50cy4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBleHRlbnNpb24gcG9pbnQgZWxlbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBJVVJJUmVzb2x2ZXIgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVYVEVOU0lPTl9QT0lOVF9JRCkpCi0gICAgewotICAgICAgU3RyaW5nIHJlc29sdmVyQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCi0gICAgICBpZiAocmVzb2x2ZXJDbGFzcyAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIENsYXNzTG9hZGVyIHBsdWdpbkxvYWRlciA9Ci0gICAgICAgICAgICBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIG5ldyBVUklSZXNvbHZlckRlbGVnYXRlKHJlc29sdmVyQ2xhc3MsIHBsdWdpbkxvYWRlcikuZ2V0VVJJUmVzb2x2ZXIoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVVJJUmVzb2x2ZXJXcmFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9VUklSZXNvbHZlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjOGYyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9VUklSZXNvbHZlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotCi0vKioKLSAqIEFuIHdyYXBwZXIgVVJJIHJlc29sdmVyIHRoYXQgd3JhcHMgdGhlIFdlYiBTdGFuZGFyZCBUb29scyBVUkkgcmVzb2x2ZXIKLSAqIGluIGEgV1NETCB2YWxpZGF0b3IgVVJJIHJlc29sdmVyLgotICovCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJXcmFwcGVyIGltcGxlbWVudHMgSVVSSVJlc29sdmVyCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlcldyYXBwZXIoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXIjcmVzb2x2ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyByZXNvbHZlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotICAgIFN0cmluZyByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgdGVtcFVSTCA9IG5ldyBVUkwocmVzdWx0KTsKLSAgICAgIHRlbXBVUkwgPSBQbGF0Zm9ybS5yZXNvbHZlKHRlbXBVUkwpOwotICAgICAgcmVzdWx0ID0gdGVtcFVSTC50b1N0cmluZygpOwotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBudWxsOwotICAgIH0KLSAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIHRoZSByZXF1ZXN0IHJldHVybiBudWxsLgotICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiAocmVzdWx0LmVxdWFscyhzeXN0ZW1JZCkpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRlV1NETEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNTBjMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRlQWN0aW9uOwotCi0vKioKLSAqIEVjbGlwc2UgYWN0aW9uIGZvciBydW5uaW5nIHRoZSBXU0RMIHZhbGlkYXRvci4gCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVdTRExBY3Rpb24gZXh0ZW5kcyBWYWxpZGF0ZUFjdGlvbgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9GSUxFX0VSUk9SX09QRU4gPSAicmVmZXJlbmNlZEZpbGVFcnJvcigiOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfQ0xPU0UgPSAiKSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfU0FWRV9ESVJUWV9GSUxFX01FU1NBR0UgPSAiX1VJX1NBVkVfRElSVFlfRklMRV9NRVNTQUdFIjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1VJX1NBVkVfRElSVFlfRklMRV9USVRMRSA9ICJfVUlfU0FWRV9ESVJUWV9GSUxFX1RJVExFIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFID0gIl9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RFRF9FUlJPUlMgPSAiTkVTVEVEX0VSUk9SUyI7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBzaG93RGlhbG9nIFdoZXRoZXIgdG8gc2hvdyBhIGRpYWxvZyB3aXRoIHRoZSBzdGF0dXMgdXBvbiBjb21wbGV0aW9uLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRlV1NETEFjdGlvbihJRmlsZSBmaWxlLCBib29sZWFuIHNob3dEaWFsb2cpCi0gIHsKLSAgCXN1cGVyKGZpbGUsIHNob3dEaWFsb2cpOwotICB9Ci0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpbGUgYW5kIGFzc2lnbiBtYXJrZXJzIGNvcnJlc3BvbmRpbmdseSB0byB0aGUgZmlsZS4gSWYKLSAgICogcmVxdWlyZWQsIHNob3cgYSBkaWFsb2cgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoZmluYWwgSUZpbGUgZmlsZSkKLSAgewotICAgIGZpbmFsIFZhbGlkYXRpb25PdXRjb21lIHZhbGlkYXRpb25PdXRjb21lID0gbmV3IFZhbGlkYXRpb25PdXRjb21lKCk7Ci0gICAgSVdvcmtzcGFjZVJ1bm5hYmxlIG9wID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgewotICAgICAgICBXU0RMVmFsaWRhdG9yIHdzZGxWYWxpZGF0b3IgPSBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGNsZWFyTWFya2VycyhmaWxlKTsKLSAgICAgICAgVmFsaWRhdGlvblJlcG9ydCB2YWxSZXBvcnQgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgbG9jYXRpb24gPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0Q2Fub25pY2FsRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgbG9jYXRpb24gPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9jYXRpb24uc3RhcnRzV2l0aCgiLyIpKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsUmVwb3J0ID0gd3NkbFZhbGlkYXRvci52YWxpZGF0ZShsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmFsUmVwb3J0ID0gd3NkbFZhbGlkYXRvci52YWxpZGF0ZShGSUxFX1BST1RPQ09MICsgbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHZhbGlkYXRpb25PdXRjb21lLmlzV1NETFZhbGlkID0gdmFsUmVwb3J0LmlzV1NETFZhbGlkKCk7Ci0gICAgICAgIHZhbGlkYXRpb25PdXRjb21lLmlzVmFsaWQgPSAhdmFsUmVwb3J0Lmhhc0Vycm9ycygpOwotICAgICAgICBpZiAodmFsUmVwb3J0LmdldFZhbGlkYXRpb25NZXNzYWdlcygpLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsaWRhdGlvbk91dGNvbWUuaGFzTWVzc2FnZXMgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpZGF0aW9uT3V0Y29tZS5oYXNNZXNzYWdlcyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBjcmVhdGVNYXJrZXJzKGZpbGUsIGNvbnZlcnRWYWxpZGF0aW9uTWVzc2FnZXModmFsUmVwb3J0LmdldFZhbGlkYXRpb25NZXNzYWdlcygpKSk7Ci0gICAgICAgIC8vY3JlYXRlTWFya2VycyhmaWxlLCB2YWxpZGF0b3JtYW5hZ2VyLmdldFdhcm5pbmdMaXN0KCksCi0gICAgICAgIC8vIFdBUk5JTkdfTUFSS0VSKTsKLSAgICAgICAgCi0gICAgICAgIC8vZmlsZS5zZXRTZXNzaW9uUHJvcGVydHkoVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1JfTUVTU0FHRV9NQVBfUVVBTElGSUVEX05BTUUsIHZhbFJlcG9ydC5nZXROZXN0ZWRNZXNzYWdlcygpKTsKLSAgICAgICAgZmlsZS5zZXRTZXNzaW9uUHJvcGVydHkob3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1JfTUVTU0FHRV9NQVBfUVVBTElGSUVEX05BTUUsIGNvbnZlcnROZXN0ZWRWYWxpZGF0aW9uTWVzc2FnZXModmFsUmVwb3J0LmdldE5lc3RlZE1lc3NhZ2VzKCkpKTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihvcCwgbnVsbCk7Ci0KLSAgICAgIGlmIChzaG93RGlhbG9nKQotICAgICAgewotICAgICAgICBzaG93RGlhbG9nKHZhbGlkYXRpb25PdXRjb21lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQ29udmVydCBXU0RMIHZhbGlkYXRpb24gbWVzc2FnZXMgdG8gdmFsaWRhdGlvbiBmcmFtZXdvcmsgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZXMgVGhlIFdTREwgdmFsaWRhdGlvbiBtZXNzYWdlcyB0byBjb252ZXJ0LgotICAgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2VbXSBjb252ZXJ0VmFsaWRhdGlvbk1lc3NhZ2VzKFZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMpCi0gIHsKLSAgCWludCBudW1NZXNzYWdlcyA9IG1lc3NhZ2VzLmxlbmd0aDsKLSAgCW9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlW10gY29udmVydGVkTWVzc2FnZXMgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2VbbnVtTWVzc2FnZXNdOwotICAJCi0gIAlmb3IoaW50IGkgPSAwOyBpIDwgbnVtTWVzc2FnZXM7IGkrKykKLSAgCXsKLSAgCSAgVmFsaWRhdGlvbk1lc3NhZ2UgbWVzcyA9IG1lc3NhZ2VzW2ldOwotICAJICBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZSBjb252ZXJ0TWVzcyA9IG5ldyBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZShtZXNzLmdldE1lc3NhZ2UoKSxtZXNzLmdldExpbmUoKSxtZXNzLmdldENvbHVtbigpLCBtZXNzLmdldFVSSSgpKTsKLSAgCSAgaWYobWVzcy5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HKQotCSAgewotCSAgCWNvbnZlcnRNZXNzLnNldFNldmVyaXR5KG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpOwotCSAgfQotCSAgZWxzZQotCSAgewotCSAgCWNvbnZlcnRNZXNzLnNldFNldmVyaXR5KG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlLlNFVl9ISUdIKTsKLQkgIH0KLSAgCSAgCi0gIAkgIC8vIENvbnZlcnQgYW55IG5lc3RlZCBtZXNzYWdlcy4KLSAgCSAgTGlzdCBuZXN0ZWRNZXNzYWdlcyA9IG1lc3MuZ2V0TmVzdGVkTWVzc2FnZXMoKTsKLSAgCSAgaWYobmVzdGVkTWVzc2FnZXMgIT0gbnVsbCAmJiAhbmVzdGVkTWVzc2FnZXMuaXNFbXB0eSgpKQotICAJICB7Ci0gIAkgIAlJdGVyYXRvciBuZXN0ZWRJdGVyID0gbmVzdGVkTWVzc2FnZXMuaXRlcmF0b3IoKTsKLSAgCSAgICB3aGlsZShuZXN0ZWRJdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIG5lc3RlZE1lc3MgPSAoVmFsaWRhdGlvbk1lc3NhZ2UpbmVzdGVkSXRlci5uZXh0KCk7Ci0gICAgCSAgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UgY29udmVydE5lc3RlZE1lc3MgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UobmVzdGVkTWVzcy5nZXRNZXNzYWdlKCksbmVzdGVkTWVzcy5nZXRMaW5lKCksbmVzdGVkTWVzcy5nZXRDb2x1bW4oKSwgbmVzdGVkTWVzcy5nZXRVUkkoKSk7Ci0gICAgCSAgaWYobmVzdGVkTWVzcy5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HKQotICAgIAkgIHsKLSAgICAJICAJY29udmVydE5lc3RlZE1lc3Muc2V0U2V2ZXJpdHkob3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0gICAgCSAgfQotICAgIAkgIGVsc2UKLSAgICAJICB7Ci0gICAgCSAgCWNvbnZlcnROZXN0ZWRNZXNzLnNldFNldmVyaXR5KG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlLlNFVl9ISUdIKTsKLSAgICAJICB9Ci0gICAgCSAgY29udmVydE1lc3MuYWRkTmVzdGVkTWVzc2FnZShjb252ZXJ0TmVzdGVkTWVzcyk7Ci0gICAgICAgIH0KLSAgCSAgfQotICAJICBjb252ZXJ0ZWRNZXNzYWdlc1tpXSA9IGNvbnZlcnRNZXNzOwotICAJfQotICAJcmV0dXJuIGNvbnZlcnRlZE1lc3NhZ2VzOwotICB9Ci0gIAotICAvKioKLSAgICogQ29udmVydCB0aGUgbmVzdGVkIG1lc3NhZ2VzIGhhc2htYXAuCi0gICAqIAotICAgKiBAcGFyYW0gbmVzdGVkTWVzc2FnZXMgVGhlIG5lc3RlZCBtZXNzYWdlcyBoYXNobWFwIHRvIGNvbnZlcnQuCi0gICAqIEByZXR1cm4gQSBoYXNobWFwIHdpdGggdGhlIGNvbnZlcnRlZCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBIYXNoTWFwIGNvbnZlcnROZXN0ZWRWYWxpZGF0aW9uTWVzc2FnZXMoSGFzaE1hcCBuZXN0ZWRNZXNzYWdlcykKLSAgewotICAJSGFzaE1hcCBjb252ZXJ0ZWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAJCi0gIAlTZXQga2V5U2V0ID0gbmVzdGVkTWVzc2FnZXMua2V5U2V0KCk7Ci0gIAlJdGVyYXRvciBrZXlzSXRlciA9IGtleVNldC5pdGVyYXRvcigpOwotICAJd2hpbGUoa2V5c0l0ZXIuaGFzTmV4dCgpKQotICAJewotICAJICBTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzSXRlci5uZXh0KCk7Ci0gIAkgIFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UgPSAoVmFsaWRhdGlvbk1lc3NhZ2UpbmVzdGVkTWVzc2FnZXMuZ2V0KGtleSk7Ci0gIAkgIG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlW10gY29udmVydGVkTWVzc2FnZSA9IGNvbnZlcnRWYWxpZGF0aW9uTWVzc2FnZXMobmV3IFZhbGlkYXRpb25NZXNzYWdlW117bWVzc2FnZX0pOwotICAJICAKLSAgCSAgY29udmVydGVkTWFwLnB1dChrZXksIGNvbnZlcnRlZE1lc3NhZ2VbMF0pOwotICAJfQotICAJcmV0dXJuIGNvbnZlcnRlZE1hcDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLSAgICovCi0vLyAgcHVibGljIHZvaWQgcnVuKCkKLS8vICB7Ci0vLyAgICAvLyBPbmx5IHJ1biB0aGUgdmFsaWRhdGlvbiBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIGlzIGF2YWlsYWJsZS4KLS8vICAgIGlmIChmaWxlSXNPSyhmaWxlKSkKLS8vICAgIHsKLS8vICAgICAgaWYgKHNob3dEaWFsb2cpCi0vLyAgICAgIHsKLS8vICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBpcyBkaXJ0eSAtIHByb21wdHMgdXNlciB0byBzYXZlLgotLy8gICAgICAgIGNoZWNrSWZGaWxlRGlydHkoZmlsZSk7Ci0vLyAgICAgIH0KLS8vICAgICAgc3VwZXIucnVuKCk7Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBUZXN0IHdoZXRoZXIgdGhlIGZpbGUgZ2l2ZW4gaXMgT0sgdG8gdXNlLiBBIGZpbGUgaXMgT0sgdG8gdXNlIGlmIDEuIEl0IGlzCi0gICAqIG5vdCBudWxsIDIuIEl0IGV4aXN0cy4gMy4gVGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgZmlsZSBpcyBhY2Nlc3NpYmxlLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIE9LIHRvIHZhbGlkYXRlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgT0sgdG8gdmFsaWRhdGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0vLyAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUlzT0soSUZpbGUgZmlsZSkKLS8vICB7Ci0vLyAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0vLyAgICB7Ci0vLyAgICAgIHJldHVybiB0cnVlOwotLy8gICAgfQotLy8gICAgcmV0dXJuIGZhbHNlOwotLy8gIH0KLQotICAvKioKLSAgICogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgZGlydHkuIEEgZmlsZSBpcyBkaXJ0eSBpZiB0aGVyZSBpcyBhbiBvcGVuIGVkaXRvciBmb3IKLSAgICogdGhlIGZpbGUgdGhhdCBjb250YWlucyBjaGFuZ2VzIHRoYXQgaGF2ZW4ndCBiZWVuIHNhdmVkLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGRpcnR5LgotICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCBjaGVja0lmRmlsZURpcnR5KElGaWxlIGZpbGUpCi0vLyAgewotLy8gICAgSUVkaXRvclBhcnRbXSBkaXJ0eUVkaXRvcnMgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0RGlydHlFZGl0b3JzKCk7Ci0vLwotLy8gICAgaW50IG51bWVkaXRvcnMgPSBkaXJ0eUVkaXRvcnMubGVuZ3RoOwotLy8gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1lZGl0b3JzOyBpKyspCi0vLyAgICB7Ci0vLyAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGRpcnR5RWRpdG9yc1tpXS5nZXRFZGl0b3JJbnB1dCgpOwotLy8gICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpCi0vLyAgICAgIHsKLS8vICAgICAgICBGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKEZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0vLyAgICAgICAgaWYgKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkuZXF1YWxzKGZpbGUpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKF9VSV9TQVZFX0RJUlRZX0ZJTEVfTUVTU0FHRSk7Ci0vLyAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoX1VJX1NBVkVfRElSVFlfRklMRV9USVRMRSk7Ci0vLyAgICAgICAgICBpZiAoTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBkaXJ0eUVkaXRvcnNbaV0uZG9TYXZlKG51bGwpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgLy8gVGhlcmUgY2FuIG9ubHkgYmUgb25lIG9wZW4gZWRpdG9yL2ZpbGUgc28gd2UgY2FuIGJyZWFrLgotLy8gICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLwotLy8gICAgfQotLy8gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbWFya2VyIG9uIHRoZSBmaWxlIG9mIHRoZSBpbmRpY2F0ZWQgdHlwZSBmb3IgZWFjaAotICAgKiBWYWxpZGF0aW9uTWVzc2FnZSBpbiB0aGUgYXJyYXkuCi0gICAqIAotICAgKiBAcGFyYW0gaUZpbGUKLSAgICogICAgICAgICAgVGhlIGZpbGUgdG8gYWRkIHRoZSBtYXJrZXJzIHRvLgotICAgKiBAcGFyYW0gdmFsTWVzc2FnZXMKLSAgICogICAgICAgICAgVGhlIGFycmF5IG9mIG1lc3NhZ2VzIHRvIGFkZCBhcyBtYXJrZXJzLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBjcmVhdGVNYXJrZXJzKElGaWxlIGlGaWxlLCBWYWxpZGF0aW9uTWVzc2FnZVtdIHZhbE1lc3NhZ2VzKQotLy8gIHsKLS8vICAgIGlmICghZmlsZUlzT0soaUZpbGUpKQotLy8gICAgewotLy8gICAgICByZXR1cm47Ci0vLyAgICB9Ci0vLyAgICBpbnQgbnVtVmFsTWVzc2FnZXMgPSB2YWxNZXNzYWdlcy5sZW5ndGg7Ci0vLyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbE1lc3NhZ2VzOyBpKyspCi0vLyAgICB7Ci0vLyAgICAgIFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gdmFsTWVzc2FnZXNbaV07Ci0vLwotLy8gICAgICBpbnQgbGluZSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldExpbmUoKTsKLS8vICAgICAgaW50IGNvbHVtbiA9IHZhbGlkYXRpb25NZXNzYWdlLmdldENvbHVtbigpOwotLy8gICAgICBTdHJpbmcgbWVzc2FnZSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKTsKLS8vICAgICAgaW50IHNldmVyaXR5ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKTsKLS8vICAgICAgSU1hcmtlciBtYXJrZXIgPSBudWxsOwotLy8gICAgICAKLS8vICAgICAgYm9vbGVhbiBoYXNOZXN0ZWRFcnJvcnMgPSBmYWxzZTsKLS8vICAgICAgTGlzdCBuZXN0ZWRlcnJvcnMgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXROZXN0ZWRNZXNzYWdlcygpOwotLy8gICAgICBpZihuZXN0ZWRlcnJvcnMgIT0gbnVsbCAmJiAhbmVzdGVkZXJyb3JzLmlzRW1wdHkoKSkKLS8vICAgICAgewotLy8gICAgICAgIGhhc05lc3RlZEVycm9ycyA9IHRydWU7Ci0vLyAgICAgICAgbWVzc2FnZSArPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UpOyAKLS8vICAgICAgfQotLy8gICAgICBpZiAoc2V2ZXJpdHkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0VSUk9SKQotLy8gICAgICB7Ci0vLyAgICAgICAgbWFya2VyID0gZ2V0T3JDcmVhdGVSZXBvcnRlcigpLmFkZEVycm9yTWVzc2FnZShpRmlsZSwgbWVzc2FnZSwgbGluZSwgY29sdW1uKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChzZXZlcml0eSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORykKLS8vICAgICAgewotLy8gICAgICAgIG1hcmtlciA9IGdldE9yQ3JlYXRlUmVwb3J0ZXIoKS5hZGRXYXJuaW5nTWVzc2FnZShpRmlsZSwgbWVzc2FnZSwgbGluZSwgY29sdW1uKTsKLS8vICAgICAgfQotLy8gICAgICAKLS8vICAgICAgaWYgKGhhc05lc3RlZEVycm9ycyAmJiBtYXJrZXIgIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAgIHRyeQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoImdyb3VwTmFtZSIsIFJFRkVSRU5DRURfRklMRV9FUlJPUl9PUEVOICsgdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0VVJJKCkgKyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfQ0xPU0UpOwotLy8gICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkRPTkUsIHRydWUpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0vLyAgICAgICAgewotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICAKLS8vICAgIH0KLS8vICB9Ci0KLSAgLyoqCi0gICAqIFNob3cgYSBkaWFsb2cgY29udGFpbmluZyB0aGUgc3RhdHVzIG9mIHRoZSB2YWxpZGF0aW9uLiBXaWxsIGRpc3BsYXkgdmFsaWQKLSAgICogb3IgaW52YWxpZCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGVyZSBhcmUgZXJyb3JzIG9yIG5vdC4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0aW9uT3V0Y29tZQotICAgKiAgICAgICAgICBUaGUgb3V0Y29tZSBvZiB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNob3dEaWFsb2coVmFsaWRhdGlvbk91dGNvbWUgdmFsaWRhdGlvbk91dGNvbWUpCi0gIHsKLSAgICBTdHJpbmcgdGl0bGUsIG1lc3NhZ2U7Ci0gICAgaWYgKHZhbGlkYXRpb25PdXRjb21lLmlzVmFsaWQpCi0gICAgewotICAgICAgaWYgKHZhbGlkYXRpb25PdXRjb21lLmhhc01lc3NhZ2VzKQotICAgICAgewotICAgICAgICBzaG93UHJvYmxlbXNWaWV3KCk7Ci0gICAgICAgIHRpdGxlID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVkFMSURBVElPTl9TVUNDRUVERUQiKTsKLSAgICAgICAgbWVzc2FnZSA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX1RIRV9XU0RMX0ZJTEVfSVNfVkFMSURfV0lUSF9XQVJOSU5HUyIpOwotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGl0bGUgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9WQUxJREFUSU9OX1NVQ0NFRURFRCIpOwotICAgICAgICBtZXNzYWdlID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfVEhFX1dTRExfRklMRV9JU19WQUxJRCIpOwotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICh2YWxpZGF0aW9uT3V0Y29tZS5pc1dTRExWYWxpZCkKLSAgICAgIHsKLSAgICAgICAgdGl0bGUgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9WQUxJREFUSU9OX0ZBSUxFRCIpOwotICAgICAgICBtZXNzYWdlID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfVEhFX1dTRExfRklMRV9JU19WQUxJRF9XU0RMMTEiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGl0bGUgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9WQUxJREFUSU9OX0ZBSUxFRCIpOwotICAgICAgICBtZXNzYWdlID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfVEhFX1dTRExfRklMRV9JU19OT1RfVkFMSUQiKTsKLSAgICAgIH0KLSAgICAgIHNob3dQcm9ibGVtc1ZpZXcoKTsKLSAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgfQotICAKLSAgLyoqCi0gICAqIFNob3cgdGhlIHByb2JsZW1zIHZpZXcgaWYgaXQgaXMgbm90IGFscmVhZHkgdmlzaWJsZS4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgc2hvd1Byb2JsZW1zVmlldygpCi0vLyAgewotLy8gICAgSVdvcmtiZW5jaFdpbmRvdyBkdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0vLyAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gZHcuZ2V0QWN0aXZlUGFnZSgpOwotLy8gICAgSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IHBhZ2UuZ2V0QWN0aXZlUGFydCgpOwotLy8gICAgdHJ5Ci0vLyAgICB7Ci0vLyAgICAgIGlmIChwYWdlICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBwYWdlLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyIpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkKLS8vICAgIHsKLS8vICAgIH0KLS8vICAgIHBhZ2UuYWN0aXZhdGUoYWN0aXZlUGFydCk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBJZiBhIHJlcG9ydGVyIGRvZXNuJ3QgZXhpc3QgY3JlYXRlcyBpdCBvciB1c2VzIHRoZSByZXBvcnRlciBhbHJlYWR5Ci0gICAqIGNyZWF0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgcmVwb3J0ZXIKLSAgICovCi0vLyAgcHJvdGVjdGVkIElSZXBvcnRlciBnZXRPckNyZWF0ZVJlcG9ydGVyKCkKLS8vICB7Ci0vLyAgICBpZiAocmVwb3J0ZXIgPT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgcmVwb3J0ZXIgPSBuZXcgV29ya2JlbmNoUmVwb3J0ZXIoZmlsZS5nZXRQcm9qZWN0KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotLy8gICAgfQotLy8gICAgcmV0dXJuIHJlcG9ydGVyOwotLy8gIH0KLQotICAvKioKLSAgICogQ2xlYXIgYWxsIHRoZSBtYXJrZXJzIG9uIHRoZSBnaXZlbiByZXNvdXJjZSBnZW5lcmF0ZWQgYnkgdGhpcyB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcmVzb3VyY2UgLQotICAgKiAgICAgICAgICB0aGUgcmVzcm91Y2UgdG8gY2xlYXIgYWxsIHRoZSBtYXJrZXJzIGZyb20KLSAgICovCi0vLyAgcHVibGljIHZvaWQgY2xlYXJNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSkKLS8vICB7Ci0vLyAgICBnZXRPckNyZWF0ZVJlcG9ydGVyKCkucmVtb3ZlQWxsTWVzc2FnZXMocmVzb3VyY2UpOwotLy8gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdGlvbk91dGNvbWUKLSAgewotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXU0RMVmFsaWQgPSB0cnVlOwotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTWVzc2FnZXMgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBWYWxpZGF0aW9uT3V0Y29tZSgpCi0gICAgewotICAgIH0KLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRlV1NETEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMTk5ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogQW4gYWN0aW9uIGRlbGVnYXRlIGZvciB0aGUgV1NETCB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVdTRExBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZQotewotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUpCi0gIHsKLSAgICBWYWxpZGF0ZVdTRExBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVXU0RMQWN0aW9uKGZpbGUsIHRydWUpOwotICAgIHZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcihuZXcgVmFsaWRhdG9yKCkpOwotICAgIHZhbGlkYXRlQWN0aW9uLnJ1bigpOwkKLSAgfQotIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKElBY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgCUlGaWxlIGZpbGUgPSBudWxsOwotICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICBPYmplY3QgZWxlbWVudCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICB7Ci0gICAgICAgIGZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgCi0gICAgaWYgKGZpbGUgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgIAotICAgICAgdmFsaWRhdGUoZmlsZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gIAl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9WYWxpZGF0ZVdTRExQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRlV1NETFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q4ZjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRlV1NETFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuV1NETENvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2dFbnRpdHlIb2xkZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgcmVxdWlyZWQgZm9yIGVjbGlwc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVdTRExQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19GSUxFID0gInZhbGlkYXRld3NkbHVpIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0ZVdTRExQbHVnaW4gaW5zdGFuY2U7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZWJ1bmRsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSB3c2RsVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0ZVdTRExQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgewotICAgIHN1cGVyKGRlc2NyaXB0b3IpOwotLy8gICAgaW5zdGFuY2UgPSB0aGlzOwotLy8gICAgd3NkbFZhbGlkYXRvclJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKENvbnN0YW50cy5XU0RMX1ZBTElEQVRPUl9QUk9QRVJUSUVTX0ZJTEUpOwotLy8gICAgcmVzb3VyY2VidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUFJPUEVSVElFU19GSUxFKTsKLS8vCi0vLyAgICAvLyBDb25maWd1cmUgdGhlIFhNTCBjYXRhbG9nLgotLy8gICAgbmV3IEV4dFhNTENhdGFsb2dQbHVnaW5SZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotLy8gICAgbmV3IFdTRExWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcigKLS8vICAgICAgImV4dHZhbGlkYXRvciIsCi0vLyAgICAgICJleHR2YWxpZGF0b3IiLAotLy8gICAgICBXU0RMVmFsaWRhdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIuRVhUX1ZBTElEQVRPUikKLS8vICAgICAgLnJlYWRSZWdpc3RyeSgpOwotLy8KLS8vICAgIC8vIHJlZ2lzdGVyIGFueSBXU0RMIDEuMSB2YWxpZGF0b3JzIGRlZmluZWQKLS8vICAgIG5ldyBXU0RMMTFWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcigid3NkbDExdmFsaWRhdG9yIiwgInZhbGlkYXRvciIpLnJlYWRSZWdpc3RyeSgpOwotLy8KLS8vICAgIFdTRExDb25maWd1cmF0b3IucmVnaXN0ZXJEZWZhdWx0VmFsaWRhdG9ycyh3c2RsVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGUpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgIGluc3RhbmNlID0gdGhpczsKLSAgICB3c2RsVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQ29uc3RhbnRzLldTRExfVkFMSURBVE9SX1BST1BFUlRJRVNfRklMRSk7Ci0gICAgcmVzb3VyY2VidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUFJPUEVSVElFU19GSUxFKTsKLQotICAgIC8vIENvbmZpZ3VyZSB0aGUgWE1MIGNhdGFsb2cuCi0gICAgbmV3IEV4dFhNTENhdGFsb2dQbHVnaW5SZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotICAgIG5ldyBXU0RMVmFsaWRhdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIoCi0gICAgICAiZXh0dmFsaWRhdG9yIiwKLSAgICAgICJleHR2YWxpZGF0b3IiLAotICAgICAgV1NETFZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyLkVYVF9WQUxJREFUT1IpCi0gICAgICAucmVhZFJlZ2lzdHJ5KCk7Ci0KLSAgICAvLyByZWdpc3RlciBhbnkgV1NETCAxLjEgdmFsaWRhdG9ycyBkZWZpbmVkCi0gICAgbmV3IFdTREwxMVZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyKCJ3c2RsMTF2YWxpZGF0b3IiLCAidmFsaWRhdG9yIikucmVhZFJlZ2lzdHJ5KCk7Ci0KLSAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyRGVmYXVsdFZhbGlkYXRvcnMod3NkbFZhbGlkYXRvclJlc291cmNlQnVuZGxlKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgWE1MQ2F0YWxvZy5yZXNldCgpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbiBvYmplY3QuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbiBvYmplY3QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGVXU0RMUGx1Z2luIGdldEluc3RhbmNlKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbGwgVVJMIG9mIHRoaXMgcGx1Z2luLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgaW5zdGFsbCB1cmwgb2YgdGhpcyBwbHVnaW4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFsbFVSTCgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZShnZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpKS5nZXRGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIFJlc291cmNlQnVuZGxlIGhlbHBlciBtZXRob2RzCi0gICAqIAotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnaW4uCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgcGx1Z2luCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlYnVuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIFdTREwgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgV1NETCB2YWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRXU0RMVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGUoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxWYWxpZGF0b3JSZXNvdXJjZUJ1bmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBpZC4KLSAgICogCi0gICAqIEBwYXJhbSBzdHJpbmdJRCAtIHRoZSBpZCBmb3IgdGhlIHN0cmluZwotICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBpZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIHN0cmluZ0lEKQotICB7Ci0gICAgcmV0dXJuIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKHN0cmluZ0lEKTsKLSAgfQotfQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgdGhlIHBsdWdpbiBtYW5pZmVzdHMgYW5kIHJlZ2lzdGVycyBlYWNoIFdTRExFeHRlbnNpb25WYWxpZGF0b3IKLSAqLwotY2xhc3MgV1NETFZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTT1VSQ0VCVU5ETEUgPSAicmVzb3VyY2VidW5kbGUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXU0RMX1ZBTElEQVRPUiA9IDA7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVYVF9WQUxJREFUT1IgPSAxOwotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvblBvaW50SWQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFnTmFtZTsKLSAgcHJvdGVjdGVkIGludCB2YWxpZGF0b3JUeXBlOwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBXU0RMVmFsaWRhdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIoU3RyaW5nIGV4dGVuc2lvblBvaW50SWQsIFN0cmluZyB0YWdOYW1lLCBpbnQgdmFsaWRhdG9yVHlwZSkKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uUG9pbnRJZCA9IGV4dGVuc2lvblBvaW50SWQ7Ci0gICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKLSAgICB0aGlzLnZhbGlkYXRvclR5cGUgPSB2YWxpZGF0b3JUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBleHRlbnNpb25Qb2ludElkKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgd2l0aCBhbiBleHRlbnNpb24gbGlrZToKLSAgICoKLSAgICogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudmFsaWRhdGUud3NkbC5XU0RMRXh0ZW5zaW9uVmFsaWRhdG9yIgotICAgKiAgICAgICAgICAgIGlkPSJzb2FwVmFsaWRhdG9yIgotICAgKiAgICAgICAgICAgIG5hbWU9IlNPQVAgVmFsaWRhdG9yIj4+Ci0gICAqICAgPHZhbGlkYXRvcj4KLSAgICogICAgICAgIDxydW4gY2xhc3M9IiBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnNvYXAuU09BUFZhbGlkYXRvciIvPgotICAgKiAgIDwvdmFsaWRhdG9yPgotICAgKiAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB2YWx1ZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgKiA8L2V4dGVuc2lvbj4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyh0YWdOYW1lKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotICAgICAgU3RyaW5nIHJlc291cmNlQnVuZGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1JFU09VUkNFQlVORExFKTsKLQotICAgICAgaWYgKHZhbGlkYXRvckNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KLSAgICAgICAgICAvLyAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbigpLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAvLwkJCQltb2RpZmllZCB0byByZXNvbHZlIGNlcnRhaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgcGx1Z2luIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZAotCi0gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KLSAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKHZhbGlkYXRvclR5cGUgPT0gV1NETF9WQUxJREFUT1IpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgIFdTRExDb25maWd1cmF0b3IucmVnaXN0ZXJXU0RMVmFsaWRhdG9yKG5hbWVzcGFjZSwgdmFsaWRhdG9yQ2xhc3MsIHJlc291cmNlQnVuZGxlLCBwbHVnaW5Mb2FkZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3JUeXBlID09IEVYVF9WQUxJREFUT1IpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgIFdTRExDb25maWd1cmF0b3IucmVnaXN0ZXJFeHRlbnNpb25WYWxpZGF0b3IobmFtZXNwYWNlLCB2YWxpZGF0b3JDbGFzcywgcmVzb3VyY2VCdW5kbGUsIHBsdWdpbkxvYWRlcik7Ci0gICAgICAgICAgfQotLy8gICAgICAgICAgcmVnaXN0ZXJXU0RMVmFsaWRhdG9yUGx1Z2luRXh0ZW5zaW9uV2l0aENsYXNzTmFtZSgKLS8vICAgICAgICAgICAgcGx1Z2luTG9hZGVyLAotLy8gICAgICAgICAgICBXU0RMVmFsaWRhdG9yRXh0ZW5zaW9uQ2xhc3MsCi0vLyAgICAgICAgICAgIFdTRExWYWxpZGF0b3JFeHRlbnNpb25OYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBleHRlbnNpb24gdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUgYW5kIG5hbWVzcGFjZXMuCi0gICAqIAotICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgLSB0aGUgY2xhc3MgbG9hZGVyIHRvIGNyZWF0ZSB0aGUgdmFsaWRhdG9yCi0gICAqIEBwYXJhbSBjbGFzc05hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHZhbGlkYXRvcgotICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIG5hbWVzcGFjZSBvZiB0aGUgZXh0ZW5zaW9uIHZhbGlkYXRvcgotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcldTRExWYWxpZGF0b3JQbHVnaW5FeHRlbnNpb25XaXRoQ2xhc3NOYW1lKAotLy8gICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsCi0vLyAgICBTdHJpbmcgY2xhc3NOYW1lLAotLy8gICAgU3RyaW5nIG5hbWVzcGFjZSkKLS8vICAgIHRocm93cyBFeGNlcHRpb24KLS8vICB7Ci0vLyAgICB0cnkKLS8vICAgIHsKLS8vICAgICAgQ2xhc3MgdmFsaWRhdG9yRXh0ZW5zaW9uQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0vLwotLy8gICAgICAKLS8vICAgICAgLy9JVmFsaWRhdG9yRXh0ZW5zaW9uUGx1Z2luIHZhbGlkYXRvckhhbmRsZXIgPSAoSVZhbGlkYXRvckV4dGVuc2lvblBsdWdpbil2YWxpZGF0b3JFeHRlbnNpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotLy8gICAgICAvL2FkZChuYW1lc3BhY2UsIHZhbGlkYXRvckhhbmRsZXIuZ2V0VmFsaWRhdG9yKCkpOwotLy8gICAgfQotLy8gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotLy8gICAgewotLy8gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0vLyAgICAgIC8vVE9ETzogd3JpdGUgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGxvZyBmaWxlIC0gdXNlIGN1c3RvbSBsb2cgd3JpdGVyIGNsYXNzCi0vLyAgICAgIC8vVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoIldTREwgVmFsaWRhdG9yIGNvdWxkIG5vdCByZWdpc3RlciB0aGUgZXh0ZW5zaW9uIHZhbGlkYXRvci4iICsgZS5nZXRNZXNzYWdlKCkpOwkKLS8vICAgIH0KLS8vICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBsb2FkZWQgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSAtIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHZhbGlkYXRvcgotICAgKiBAcGFyYW0gdmFsaWRhdG9yRXh0ZW5zaW9uIC0gdGhlIGV4dGVuc2lvbiB2YWxpZGF0b3IKLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgYWRkKFN0cmluZyBuYW1lc3BhY2UsIElXU0RMVmFsaWRhdG9yIHZhbGlkYXRvckV4dGVuc2lvbikKLS8vICB7Ci0vLyAgICBpZiAodmFsaWRhdG9yVHlwZSA9PSBXU0RMX1ZBTElEQVRPUikKLS8vICAgIHsKLS8vICAgICAgV1NETENvbmZpZ3VyYXRvci5yZWdpc3RlcldTRExWYWxpZGF0b3IobmFtZXNwYWNlLCB2YWxpZGF0b3JFeHRlbnNpb24pOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAodmFsaWRhdG9yVHlwZSA9PSBXU0lfVkFMSURBVE9SKQotLy8gICAgewotLy8gICAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyV1NJVmFsaWRhdG9yKG5hbWVzcGFjZSwgdmFsaWRhdG9yRXh0ZW5zaW9uKTsKLS8vICAgIH0KLS8vICB9Ci19Ci0KLS8qKgotICogUmVhZCBXU0RsIDEuMSBleHRlbnNpb24gdmFsaWRhdG9ycy4KLSAqIAotICogIDxleHRlbnNpb24KLSAqICAgICBwb2ludD0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi52YWxpZGF0b3IiCi0gKiAgICAgaWQ9IndzZGxWYWxpZGF0b3IiCi0gKiAgICAgbmFtZT0iJV9VSV9XU0RMX1ZBTElEQVRPUiI+Ci0gKiAgICA8d3NkbDExdmFsaWRhdG9yCi0gKiAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gKiAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5zb2FwLndzZGwxMS5TT0FQVmFsaWRhdG9yIgotICogICAgICAgcmVzb3VyY2VidW5kbGU9InZhbGlkYXRld3NkbHNvYXAiLz4KLSAqICAgPC9leHRlbnNpb24+Ci0gKiAgCi0gKi8KLWNsYXNzIFdTREwxMVZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTT1VSQ0VCVU5ETEUgPSAicmVzb3VyY2VidW5kbGUiOwotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvblBvaW50SWQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFnTmFtZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnRJZCAtIHRoZSBpZCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0gICAqIEBwYXJhbSB0YWdOYW1lIC0gdGhlIHRhZyBuYW1lIG9mIHRoZSBleHRlbnNpb24gcG9pbnQKLSAgICovCi0gIHB1YmxpYyBXU0RMMTFWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcihTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCwgU3RyaW5nIHRhZ05hbWUpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvblBvaW50SWQgPSBleHRlbnNpb25Qb2ludElkOwotICAgIHRoaXMudGFnTmFtZSA9IHRhZ05hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgaGFuZGxlIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnRzIHRoYXQgbWF0Y2gKLSAgICogdGhlIHNwZWRpZmllZCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYW5kIGRlYWwgd2l0aCB0aGUgZXh0ZW5zaW9uIHBvaW50cy4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBleHRlbnNpb24gcG9pbnQgZWxlbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyh0YWdOYW1lKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotICAgICAgU3RyaW5nIHJlc291cmNlQnVuZGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1JFU09VUkNFQlVORExFKTsKLQotICAgICAgaWYgKHZhbGlkYXRvckNsYXNzICE9IG51bGwgJiYgbmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KLSAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKG5hbWVzcGFjZSwgdmFsaWRhdG9yQ2xhc3MsIHJlc291cmNlQnVuZGxlLCBwbHVnaW5Mb2FkZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Z2luIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggV1NETEV4dGVuc2lvblZhbGlkYXRvcgotICovCi1jbGFzcyBFeHRYTUxDYXRhbG9nUGx1Z2luUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAieG1sY2F0YWxvZyI7Ci0gIAotICAvKioKLSAgICogVGhlIHhtbGNhdGFsb2cgZWxlbWVudCBhbGxvdyBhZGRpbmcgYW4gZXh0ZW5zaW9uIFhNTCBDYXRhbG9nIHN1Y2ggYXMKLSAgICogPHhtbGNhdGFsb2cgY2xhc3M9Im9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuRXh0WE1MQ2F0YWxvZyI+Ci0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRfQ0FUQUxPR19UQUdfTkFNRSA9ICJ4bWxjYXRhbG9nIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgZW50aXR5IGVsZW1lbnQgYWxsb3dzIGFkZGluZyBzcGVjaWZpYyBYTUwgY2F0YWxvZyBlbnRpdGllcyBzdWNoIGFzCi0gICAqIDxlbnRpdHkKLSAgICogICBwdWJsaWNpZD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIAotICAgKiAgIHN5c3RlbWlkPSJ4c2Qvd3NkbC54c2QiIC8+Ci0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEFHX05BTUUgPSAiZW50aXR5IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BVQkxJQ19JRCA9ICJwdWJsaWNJZCI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TWVNURU1fSUQgPSAibG9jYXRpb24iOwotICAKLSAgLyoqCi0gICAqIFRoZSBzY2hlbWFkaXIgZWxlbWVudCBhbGxvd3MgYWRkaW5nIGEgZGlyZWN0b3Igb2Ygc2NoZW1hcyB0byB0aGUgWE1MIGNhdGFsb2cgc3VjaCBhcwotICAgKiA8c2NoZW1hZGlyIGxvY2F0aW9uPSJjOlxteXNjaGVtYWRpciIgLz4KLSAgICogTm90ZTogSXQgaXMgbW9yZSBleHBlbnNpdmUgdG8gdXNlIHRoaXMgbWV0aG9kIHRoZW4gdGhlIGVudGl0eSBtZXRob2QKLSAgICogb2YgYWRkaW5nIHNjaGVtYXMgdG8gdGhlIGNhdGFsb2cgYXMgdGhpcyBtZXRob2QgcmVxdWlyZXMgdGhhdCBhbGwgb2YKLSAgICogdGhlIHNjaGVtYXMgYmUgcmVhZC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9ESVJfVEFHX05BTUUgPSAic2NoZW1hZGlyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnRJZDsKLQotICAvKioKLSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHdpdGggYW4gZXh0ZW5zaW9uIGxpa2U6Ci0gICAqCi0gICAqIDxleHRlbnNpb24gcG9pbnQ9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLndzZGwuV1NETEV4dGVuc2lvblZhbGlkYXRvciIKLSAgICogICAgICAgICAgICBpZD0ic29hcFZhbGlkYXRvciIKLSAgICogICAgICAgICAgICBuYW1lPSJTT0FQIFZhbGlkYXRvciI+PgotICAgKiAgIDx2YWxpZGF0b3I+Ci0gICAqICAgICAgICA8cnVuIGNsYXNzPSIgY29tLmlibS5ldG9vbHMudmFsaWRhdGUud3NkbC5zb2FwLlNPQVBWYWxpZGF0b3IiLz4KLSAgICogICA8L3ZhbGlkYXRvcj4KLSAgICogICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdmFsdWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICogPC9leHRlbnNpb24+Ci0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFN0cmluZyBlbGVtZW50bmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotICAgIC8vIEV4dGVuc2lvbiBYTUwgQ2F0YWxvZ3MuCi0gICAgaWYgKGVsZW1lbnRuYW1lLmVxdWFscyhFWFRfQ0FUQUxPR19UQUdfTkFNRSkpCi0gICAgewotICAgICAgU3RyaW5nIHhtbENhdGFsb2dDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0KLSAgICAgIGlmICh4bWxDYXRhbG9nQ2xhc3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBtb2RpZmllZCB0byByZXNvbHZlIGNlcnRhaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgcGx1Z2luIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZAotICAgICAgICAgIENsYXNzTG9hZGVyIHBsdWdpbkxvYWRlciA9Ci0gICAgICAgICAgICBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwotICAgICAgICAgIC8vCQkJCQlDbGFzc0xvYWRlciBwbHVnaW5Mb2FkZXIgPQotICAgICAgICAgIC8vCQkJCQkJZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0UGx1Z2luKCkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgIFhNTENhdGFsb2cuc2V0RXh0ZW5zaW9uWE1MQ2F0YWxvZyh4bWxDYXRhbG9nQ2xhc3MsIHBsdWdpbkxvYWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFhNTCBDYXRhbG9nIGVudGl0ZXMuCi0gICAgZWxzZSBpZihlbGVtZW50bmFtZS5lcXVhbHMoRU5USVRZX1RBR19OQU1FKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHVibGljaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFVCTElDX0lEKTsKLSAgICAgIFN0cmluZyBzeXN0ZW1pZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TWVNURU1fSUQpOwotICAgICAgaWYocHVibGljaWQgPT0gbnVsbCB8fCBzeXN0ZW1pZCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgc3lzdGVtaWQgPSBnZXRBYnNvbHV0ZUxvY2F0aW9uKHN5c3RlbWlkLCBidW5kbGUpOwotICAgICAgCi0gICAgICBYTUxDYXRhbG9nLmFkZEVudGl0eShuZXcgWE1MQ2F0YWxvZ0VudGl0eUhvbGRlcihwdWJsaWNpZCwgc3lzdGVtaWQpKTsKLSAgICB9Ci0gICAgLy8gU2NoZW1hIGRpcmVjdG9yaWVzIGZvciB0aGUgWE1MIENhdGFsb2cuCi0gICAgZWxzZSBpZihlbGVtZW50bmFtZS5lcXVhbHMoU0NIRU1BX0RJUl9UQUdfTkFNRSkpCi0gICAgewotICAgICAgU3RyaW5nIGxvY2F0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xPQ0FUSU9OKTsKLSAgICAgIGlmKGxvY2F0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGxvY2F0aW9uID0gZ2V0QWJzb2x1dGVMb2NhdGlvbihsb2NhdGlvbiwgYnVuZGxlKTsKLSAgICAgICAgWE1MQ2F0YWxvZy5hZGRTY2hlbWFEaXIobG9jYXRpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEFic29sdXRlTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uLCBCdW5kbGUgYnVuZGxlKQotICB7Ci0gICAgVVJMIHVybCA9IG51bGw7Ci0gICAgaWYoYnVuZGxlICE9IG51bGwpCi0gICAgewotICAgICAgdXJsID0gYnVuZGxlLmdldEVudHJ5KGxvY2F0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgaWYodXJsICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHVybCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKTsKLSAgICAgICAgcmV0dXJuIHVybC50b0V4dGVybmFsRm9ybSgpOwotICAgICAgfQotICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy9VbmFibGUgdG8gcmVnaXN0ZXIgdGhlIHNjaGVtYS4KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxvY2F0aW9uOwotICB9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2JhOWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklSdWxlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLkhlbHBlcjsKLQotCi0vKioKLSAqIEEgdmFsaWRhdG9yIHRvIHBsdWcgdGhlIFdTREwgdmFsaWRhdG9yIGludG8gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvcgotewotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gSUZpbGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZQotICAgKiAgICAgICAgICBUaGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUpCi0gIHsKLSAgICBWYWxpZGF0ZVdTRExBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVXU0RMQWN0aW9uKGZpbGUsIGZhbHNlKTsKLSAgICB2YWxpZGF0ZUFjdGlvbi5zZXRWYWxpZGF0b3IodGhpcyk7Ci0gICAgdmFsaWRhdGVBY3Rpb24ucnVuKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmNvcmUuSUhlbHBlciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5JUmVwb3J0ZXIsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmNvcmUuSUZpbGVEZWx0YVtdKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZURlbHRhW10gY2hhbmdlZEZpbGVzKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGNoYW5nZWRGaWxlcyAhPSBudWxsICYmIGNoYW5nZWRGaWxlcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlZEZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBJRmlsZURlbHRhIGNoYW5nZWRGaWxlID0gY2hhbmdlZEZpbGVzW2ldOwotCi0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGNoYW5nZWRGaWxlLmdldEZpbGVOYW1lKCk7Ci0gICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0W10gcGFybXMgPSB7ZmlsZU5hbWV9OwotCi0gICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgaGVscGVyLmxvYWRNb2RlbChIZWxwZXIuR0VUX0ZJTEUsIHBhcm1zKTsKLSAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKEhlbHBlcikgaGVscGVyKS5pc0luSmF2YUJ1aWxkUGF0aChmaWxlKSAmJiAhKChIZWxwZXIpaGVscGVyKS5pc0luSmF2YVNvdXJjZVBhdGgoZmlsZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsaWRhdGVJZk5lZWRlZChmaWxlLCBoZWxwZXIsIHJlcG9ydGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBPYmplY3RbXSBwYXJtcyA9IHt0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpfTsKLSAgICAgIENvbGxlY3Rpb24gZmlsZXMgPSAoQ29sbGVjdGlvbikgaGVscGVyLmxvYWRNb2RlbChIZWxwZXIuR0VUX1BST0pFQ1RfRklMRVMsIHBhcm1zKTsKLSAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBmaWxlcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgdmFsaWRhdGVJZk5lZWRlZChmaWxlLCBoZWxwZXIsIHJlcG9ydGVyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGZpbGUKLSAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAqIEBwYXJhbSBydWxlR3JvdXAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUsIElSZXBvcnRlciByZXBvcnRlciwgaW50IHJ1bGVHcm91cCkKLSAgewotICAgIFZhbGlkYXRlV1NETEFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZVdTRExBY3Rpb24oZmlsZSwgZmFsc2UpOwotICAgIHZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcih0aGlzKTsKLSAgICB2YWxpZGF0ZUFjdGlvbi5ydW4oKTsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZmlsZSBpZiB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUKLSAgICogQHBhcmFtIG1vZGVsCi0gICAqIEBwYXJhbSBoZWxwZXIKLSAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlmTmVlZGVkKElGaWxlIGZpbGUsIE9iamVjdCBtb2RlbCwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotICB7Ci0gICAgaWYgKG1vZGVsID09IG51bGwpCi0gICAgewotICAgICAgdmFsaWRhdGVJZk5lZWRlZChmaWxlLCBoZWxwZXIsIHJlcG9ydGVyKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVW5wYWNrcyB0aGUgZmlsZU1vZGVsUGFpciBhbmQgcmV0dXJucyBhbiBJRmlsZSBvYmplY3QuCi0gICAqLwotICBwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgSUZpbGUgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLSAgICB7Ci0gICAgICBMaXN0IGZpbGVNb2RlbFBhaXIgPSAoTGlzdCkgb2JqZWN0OwotICAgICAgaWYgKGZpbGVNb2RlbFBhaXIuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGZpbGUgPSBmaWxlTW9kZWxQYWlyLmdldCgwKTsKLSAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IChJRmlsZSkgZmlsZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBmaWxlIGlmIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZQotICAgKiAgICAgICAgICBUaGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGhlbHBlcgotICAgKiAgICAgICAgICBBbiBhaWQgZm9yIHRoZSB2YWxpZGF0aW9uLgotICAgKiBAcGFyYW0gcmVwb3J0ZXIKLSAgICogICAgICAgICAgVGhlIHJlcG9ydGVyIHRvIHJlcG9ydCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSWZOZWVkZWQoSUZpbGUgZmlsZSwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotICB7Ci0gICAgVmFsaWRhdG9yTWFuYWdlciBtZ3IgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKTsKLSAgICBpZiAobWdyLmlzTWVzc2FnZUxpbWl0RXhjZWVkZWQoZmlsZSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAvLyBQYXNzIGluIGEgIm51bGwiIHNvIHRoYXQgbG9hZE1vZGVsIGRvZXNuJ3QgYXR0ZW1wdCB0byBjYXN0IHRoZSByZXN1bHQgaW50byBhIFJlZk9iamVjdC4KLSAgICBJbnRlZ2VyIHJ1bGVHcm91cEludCA9IChJbnRlZ2VyKSBoZWxwZXIubG9hZE1vZGVsKElSdWxlR3JvdXAuUEFTU19MRVZFTCwgbnVsbCk7IAotICAgIGludCBydWxlR3JvdXAgPSAocnVsZUdyb3VwSW50ID09IG51bGwpID8gSVJ1bGVHcm91cC5QQVNTX0ZVTEwgOiBydWxlR3JvdXBJbnQuaW50VmFsdWUoKTsKLQotICAgIHZhbGlkYXRlKGZpbGUsIHJlcG9ydGVyLCBydWxlR3JvdXApOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklWYWxpZGF0b3IjY2xlYW51cChjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKQotICB7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9XU0RMVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9XU0RMVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MDM3ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvV1NETFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHZlcjsKLQotLyoqCi0gKiBBbiBFY2xpcHNlIFdTREwgdmFsaWRhdG9yLiBUaGlzIHZhbGlkYXRvciBpcyB0aGUgZGVmYXVsdCB2YWxpZGF0b3IKLSAqIHVzZWQgaW4gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiBUaGVyZSBpcyBvbmx5IGEgc2luZ2xlIGluc3RhbmNlIG9mCi0gKiB0aGlzIHZhbGlkYXRvci4gV2hlbiBjcmVhdGVkLCB0aGlzIHZhbGlkYXRvciByZWdpc3RlcnMgYWxsIGV4dGVuc2lvbgotICogVVJJIHJlc29sdmVycy4KLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0b3IgCi17Ci0JcHJpdmF0ZSBzdGF0aWMgV1NETFZhbGlkYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLldTRExWYWxpZGF0b3Igd3NkbFZhbGlkYXRvcjsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IgcmVnaXN0ZXJzIGFsbCBvZiB0aGUgVVJJIHJlc29sdmVycyBkZWZpbmVkIHZpYSB0aGUKLQkgKiBXU0RMIFVSSSByZXNvbHZlciBleHRlbnNpb24gcG9pbnQgd2l0aCB0aGUgV1NETCB2YWxpZGF0b3IuIAotCSAqIAotCSAqLwotCXByaXZhdGUgV1NETFZhbGlkYXRvcigpCi0JewotCSAgdGhpcy53c2RsVmFsaWRhdG9yID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuV1NETFZhbGlkYXRvcigpOwotCSAgVVJJUmVzb2x2ZXJSZWdpc3RyeVJlYWRlciB1cmlSUiA9IG5ldyBVUklSZXNvbHZlclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JICBMaXN0IHJlc29sdmVycyA9IHVyaVJSLnJlYWRSZWdpc3RyeSgpOwotCSAgSXRlcmF0b3IgcmVzb2x2ZXJJdGVyID0gcmVzb2x2ZXJzLml0ZXJhdG9yKCk7Ci0JICB3aGlsZShyZXNvbHZlckl0ZXIuaGFzTmV4dCgpKQotCSAgewotCSAgCUlVUklSZXNvbHZlciByZXNvbHZlciA9IChJVVJJUmVzb2x2ZXIpcmVzb2x2ZXJJdGVyLm5leHQoKTsKLQkgIAl3c2RsVmFsaWRhdG9yLmFkZFVSSVJlc29sdmVyKHJlc29sdmVyKTsKLQkgIH0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBFY2xpcHNlIFdTREwgdmFsaWRhdG9yLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGlzIEVjbGlwc2UgV1NETCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0RMVmFsaWRhdG9yIGdldEluc3RhbmNlKCkKLQl7Ci0JCWlmKGluc3RhbmNlID09IG51bGwpCi0JCXsKLQkJCWluc3RhbmNlID0gbmV3IFdTRExWYWxpZGF0b3IoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgV1NETCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlVVJJIFRoZSBVUkkgb2YgdGhlIFdTREwgZmlsZS4KLQkgKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiByZXBvcnQgd2l0aCB0aGUgdmFsaWRhdGlvbiByZXN1bHRzLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyBmaWxlVVJJKQotCXsKLQkJcmV0dXJuIHdzZGxWYWxpZGF0b3IudmFsaWRhdGUoZmlsZVVSSSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdGV4dC9XU0RMVmFsaWRhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS90ZXh0L1dTRExWYWxpZGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjJiOTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS90ZXh0L1dTRExWYWxpZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLnRleHQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5XU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLldTRExDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nRW50aXR5SG9sZGVyOwotCi1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwuU3RyaW5nVXRpbHM7Ci0KLS8qKgotICogQSBjb21tYW5kZSBsaW5lIHRvb2wgdG8gcnVuIFdTREwgVmFsaWRhdGlvbiBvbiBhIHNpbmdsZSBvciBtdWx0aXBsZSBmaWxlcy4KLSAqIAotICogT3B0aW9ucwotICogLXNjaGVtYURpciBkaXJlY3RvcnkgICAgICAgOiBhIGRpcmVjdG9yeSBvZiBzY2hlbWFzIHRvIGxvYWQgaW50byB0aGUgY2F0YWxvZwotICogLXNjaGVtYSBuYW1lc3BhY2UgbG9jYXRpb24gOiBhIHNjaGVtYSB0byBsb2FkIGludG8gdGhlIHJlZ2lzdHJ5Ci0gKiAtd3NkbDExdiBjbGFzc25hbWUgbmFtZXNwYWNlIHJlc291cmNlYnVuZGxlIDogcmVnaXN0ZXIgYSBXU0RMIDEuMSBleHRlbnNpb24gdmFsaWRhdG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGxvYWQgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Ugd2l0aCB0aGUgZ2l2ZW4gcmVzb3VyY2VidW5kbGUKLSAqIC13c2l2IHZhbGlkYXRvckNsYXNzIG5hbWVzcGFjZSBwcm9wZXJ0aWVzZmlsZSA6IHJlZ2lzdGVyIGEgV1MtSSB2YWxpZGF0b3IKLSAqIC11cmlyZXNvbHZlciBVUklSZXNvbHZlckNsYXNzIDogcmVnaXN0ZXIgYW4gZXh0ZW5zaW9uIFVSSSByZXNvbHZlcgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRlCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEZJTEVfUFJFRklYID0gImZpbGU6Ly8vIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9QUk9QRVJUSUVTID0KLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50cy5XU0RMX1ZBTElEQVRPUl9QUk9QRVJUSUVTX0ZJTEU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9QUk9QRVJUSUVTID0gInZhbGlkYXRld3NkbHVpIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9FUlJPUl9XUk9OR19BUkdVTUVOVFMgPSAiX0VSUk9SX1dST05HX0FSR1VNRU5UUyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfSU5GT1JNQVRJT05fREVMSU1JVEVSID0gIl9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUgPSAiX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1VJX1ZBTElEID0gIl9VSV9WQUxJRCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfSU5WQUxJRCA9ICJfVUlfSU5WQUxJRCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfRVJST1JfTUFSS0VSID0gIl9VSV9FUlJPUl9NQVJLRVIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1VJX1dBUk5JTkdfTUFSS0VSID0gIl9VSV9XQVJOSU5HX01BUktFUiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfRVJST1JfVU5BQkxFX1RPX0xPQURfRVhUX1ZBTElEQVRPUiA9ICJfRVJST1JfVU5BQkxFX1RPX0xPQURfRVhUX1ZBTElEQVRPUiI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fV1NETDExVkFMID0gIi13c2RsMTF2IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VYVFZBTCA9ICItZXh0diI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TQ0hFTUFESVIgPSAiLXNjaGVtYURpciI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TQ0hFTUEgPSAiLXNjaGVtYSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9VUklSRVNPTFZFUiA9ICItdXJpcmVzb2x2ZXIiOwotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19FTVBUWSA9ICIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1NQQUNFID0gIiAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0RBU0ggPSAiLSI7Ci0gIAotICAKLSAgcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotICBwcm90ZWN0ZWQgTGlzdCBlcnJvcnMgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCB3YXJuaW5ncyA9IG51bGw7Ci0gIHByb3RlY3RlZCBXU0RMVmFsaWRhdG9yIHdzZGxWYWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIENvbnN0dWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRlKCkKLSAgewotICAJd3NkbFZhbGlkYXRvciA9IG5ldyBXU0RMVmFsaWRhdG9yKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFVSSVJlc29sdmVyKElVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAJd3NkbFZhbGlkYXRvci5hZGRVUklSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0gIH0KLQotICAvKioKLSAgICogUnVuIFdTREwgdmFsaWRhdGlvbiBvbiBhIGdpdmVuIGZpbGUuCi0gICAqIAotICAgKiBAcGFyYW0gZGlyZWN0b3J5IC0gdGhlIGN1cnJlbnQgZGlyIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgZmlsZSBuYW1lcwotICAgKiBAcGFyYW0gZmlsZW5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcGFyYW0gdmFsaWRhdG9yUkIgLSB0aGUgV1NETCB2YWxpZGF0b3IgcmVzb3VyY2UgYnVuZGxlCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZUZpbGUoU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nIGZpbGVuYW1lLCBSZXNvdXJjZUJ1bmRsZSB2YWxpZGF0b3JSQikKLSAgICB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICAvLwlyZXNvbHZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZQotICAgIFN0cmluZyBmaWxlbG9jYXRpb24gPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCB0ZXN0ID0gU3RyaW5nVXRpbHMuZ2V0VVJMKG5ldyBVUkwoRklMRV9QUkVGSVggKyBkaXJlY3RvcnkgKyAiLyIpLCBmaWxlbmFtZSk7Ci0gICAgICBmaWxlbG9jYXRpb24gPSB0ZXN0LnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzb2x2ZSBXU0RMIGZpbGUgbG9jYXRpb24iKTsKLSAgICB9Ci0gICAgLy8gcnVuIHZhbGlkYXRpb24gb24gdGhlIGZpbGUgYW5kIHJlY29yZCB0aGUgZXJyb3JzIGFuZCB3YXJuaW5ncwotICAgIFZhbGlkYXRpb25SZXBvcnQgdmFsUmVwb3J0ID0gd3NkbFZhbGlkYXRvci52YWxpZGF0ZShmaWxlbG9jYXRpb24pOwotICAgIHJldHVybiB2YWxSZXBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIFN0cmluZyB3aXRoIGZvcm1hdHRlZCBvdXRwdXQgZm9yIGEgbGlzdCBvZiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbWVzc2FnZXMgdG8gZ2V0LgotICAgKiBAcGFyYW0gZXJyb3JtYXJrZXIgVGhlIG1hcmtlciB0byB1c2UgdG8gbGFiZWwgZXJyb3IgbWVzc2FnZXMuCi0gICAqIEBwYXJhbSB3YXJuaW5nbWFya2VyIFRoZSBtYXJrZXIgdG8gdXNlIHRvIGxhYmVsIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqIEByZXR1cm4gQSBzdHJpbmcgd2l0aCBhIGZvcm1hdHRlZCBsaXN0IG9mIHRoZSBtZXNzYWdlcy4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TWVzc2FnZXMoVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcywgU3RyaW5nIGVycm9ybWFya2VyLCBTdHJpbmcgd2FybmluZ21hcmtlcikKLSAgewotICAgIFN0cmluZ0J1ZmZlciBvdXRwdXRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKG1lc3NhZ2VzICE9IG51bGwpCi0gICAgewotICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBtZXNzYWdlcyB0aGF0IGxvb2tzIGxpa2UKLSAgICAgIC8vIEVSUk9SIDE6MSBFcnJvciBtZXNzYWdlIGNvbnRlbnQKLSAgICAgIGludCBudW1NZXNzYWdlcyA9IG1lc3NhZ2VzLmxlbmd0aDsKLSAgICAgIFN0cmluZyBtYXJrZXIgPSBudWxsOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1NZXNzYWdlczsgaSsrKQotICAgICAgewotICAgICAgICBWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZXNbaV07Ci0gICAgICAgIGludCBzZXZlcml0eSA9IG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKTsKLSAgICAgICAgaWYgKHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIG1hcmtlciA9IGVycm9ybWFya2VyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgbWFya2VyID0gd2FybmluZ21hcmtlcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtYXJrZXIgPSBTVFJJTkdfRU1QVFk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0cHV0QnVmZmVyCi0gICAgICAgICAgLmFwcGVuZChtYXJrZXIpCi0gICAgICAgICAgLmFwcGVuZChTVFJJTkdfU1BBQ0UpCi0gICAgICAgICAgLmFwcGVuZChtZXNzYWdlLmdldExpbmUoKSkKLSAgICAgICAgICAuYXBwZW5kKCI6IikKLSAgICAgICAgICAuYXBwZW5kKG1lc3NhZ2UuZ2V0Q29sdW1uKCkpCi0gICAgICAgICAgLmFwcGVuZChTVFJJTkdfU1BBQ0UpCi0gICAgICAgICAgLmFwcGVuZChtZXNzYWdlLmdldE1lc3NhZ2UoKSkKLSAgICAgICAgICAuYXBwZW5kKCJcbiIpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0QnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1haW4gZW50cnkgcG9pbnQgaW50byB0aGUgY29tbWFuZCBsaW5lIHRvb2wuIAotICAgKiBDaGVja3MgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsIHJlZ2lzdGVycyB0aGUgZGVmYXVsdCB2YWxpZGF0b3JzIGFuZCBydW5zIHZhbGlkYXRpb24gb24gdGhlCi0gICAqIGxpc3Qgb2YgZmlsZXMuCi0gICAqIAotICAgKiBAcGFyYW0gYXJncyAtIHRoZSBhcmd1bWVudHMgdG8gdGhlIHZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIExpc3Qgd3NkbEZpbGVzID0gbmV3IFZlY3RvcigpOwotICAgIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc0dlbiA9IG51bGw7Ci0gICAgUmVzb3VyY2VCdW5kbGUgdmFsaWRhdG9yUkIgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlQnVuZGxlIHVpUkIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVUlfUFJPUEVSVElFUyk7Ci0gICAgICBtZXNzR2VuID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IodWlSQik7Ci0gICAgICB2YWxpZGF0b3JSQiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShWQUxJREFUT1JfUFJPUEVSVElFUyk7Ci0gICAgfQotICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlZhbGlkYXRpb24gZmFpbGVkOiBVbmFibGUgdG8gbG9hZCB0aGUgcHJvcGVydGllcyBmaWxlLiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBubyBhcmd1bWVudHMgc3BlY2lmaWVkLiBQcmludCB1c2FnZS4KLSAgICBpZiAoYXJncy5sZW5ndGggPCAxKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzR2VuLmdldFN0cmluZyhfRVJST1JfV1JPTkdfQVJHVU1FTlRTKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IGFyZ3NsZW5ndGggPSBhcmdzLmxlbmd0aDsKLQotICAgIC8vIHJlZ2lzdGVyIHRoZSBkZWZhdWx0IHZhbGlkYXRvcnMKLSAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyRGVmYXVsdFZhbGlkYXRvcnModmFsaWRhdG9yUkIpOwotCi0gICAgV1NETFZhbGlkYXRlIHdzZGxWYWxpZGF0b3IgPSBuZXcgV1NETFZhbGlkYXRlKCk7Ci0gICAgLy8gZ28gdGhyb3VnaCB0aGUgcGFyYW1ldGVycwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnc2xlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJhbSA9IGFyZ3NbaV07Ci0KLSAgICAgIC8vIHJlZ2lzdGVyaW5nIGEgdmFsaWRhdG9yCi0gICAgICBpZiAocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShXU0RMVmFsaWRhdGUuUEFSQU1fV1NETDExVkFMKSB8fCBwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKFdTRExWYWxpZGF0ZS5QQVJBTV9FWFRWQUwpKQotICAgICAgewotCi0gICAgICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IGFyZ3NbKytpXTsKLSAgICAgICAgaWYgKCF2YWxpZGF0b3JDbGFzcy5zdGFydHNXaXRoKFdTRExWYWxpZGF0ZS5TVFJJTkdfREFTSCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gYXJnc1srK2ldOwotCi0gICAgICAgICAgaWYgKCFuYW1lc3BhY2Uuc3RhcnRzV2l0aChXU0RMVmFsaWRhdGUuU1RSSU5HX0RBU0gpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0aWVzRmlsZSA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzRmlsZS5zdGFydHNXaXRoKFdTRExWYWxpZGF0ZS5TVFJJTkdfREFTSCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByb3BlcnRpZXNGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShXU0RMVmFsaWRhdGUuUEFSQU1fV1NETDExVkFMKSkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKG5hbWVzcGFjZSwgdmFsaWRhdG9yQ2xhc3MsIHByb3BlcnRpZXNGaWxlLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShXU0RMVmFsaWRhdGUuUEFSQU1fRVhUVkFMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgV1NETENvbmZpZ3VyYXRvci5yZWdpc3RlckV4dGVuc2lvblZhbGlkYXRvcihuYW1lc3BhY2UsIHZhbGlkYXRvckNsYXNzLCBwcm9wZXJ0aWVzRmlsZSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgaS0tOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpZGF0b3JDbGFzcyA9IG51bGw7Ci0gICAgICAgICAgaS0tOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIC8vIHJlZ2lzdGVyaW5nIGEgZGlyZWN0b3J5IHdpdGggc2NoZW1hcwotICAgICAgZWxzZSBpZiAocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShXU0RMVmFsaWRhdGUuUEFSQU1fU0NIRU1BRElSKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHhzZERpciA9IGFyZ3NbKytpXTsKLSAgICAgICAgWE1MQ2F0YWxvZy5hZGRTY2hlbWFEaXIoeHNkRGlyKTsKLSAgICAgIH0KLSAgICAgIC8vIHJlZ2lzdGVyaW5nIGEgc2NoZW1hCi0gICAgICBlbHNlIGlmIChwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKFdTRExWYWxpZGF0ZS5QQVJBTV9TQ0hFTUEpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcHVibGljaWQgPSBhcmdzWysraV07Ci0gICAgICAgIFN0cmluZyBzeXN0ZW1pZCA9IGFyZ3NbKytpXTsKLSAgICAgICAgWE1MQ2F0YWxvZy5hZGRFbnRpdHkobmV3IFhNTENhdGFsb2dFbnRpdHlIb2xkZXIocHVibGljaWQsIHN5c3RlbWlkKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoUEFSQU1fVVJJUkVTT0xWRVIpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJDbGFzcyA9IGFyZ3NbKytpXTsKLSAgICAgICAgd3NkbFZhbGlkYXRvci5hZGRVUklSZXNvbHZlcihuZXcgVVJJUmVzb2x2ZXJEZWxlZ2F0ZShyZXNvbHZlckNsYXNzLCBudWxsKS5nZXRVUklSZXNvbHZlcigpKTsKLSAgICAgIH0KLSAgICAgIC8vIGEgZmlsZSB0byB2YWxpZGF0ZQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZighcGFyYW0uc3RhcnRzV2l0aChXU0RMVmFsaWRhdGUuU1RSSU5HX0RBU0gpKQotICAgICAgICB7ICAKLSAgICAgICAgICB3c2RsRmlsZXMuYWRkKHBhcmFtKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotICAgIC8vIHZhbGlkYXRlIHRoZSBmaWxlCi0gICAgU3RyaW5nQnVmZmVyIG91dHB1dEJ1ZmZlciA9IG51bGw7Ci0gICAgU3RyaW5nIGluZm9EZWxpbSA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIpOwotICAgIFN0cmluZyB2YWxpZCA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9WQUxJRCk7Ci0gICAgU3RyaW5nIGludmFsaWQgPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfSU5WQUxJRCk7Ci0gICAgU3RyaW5nIGVycm9ybWFya2VyID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX0VSUk9SX01BUktFUik7Ci0gICAgU3RyaW5nIHdhcm5pbmdtYXJrZXIgPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfV0FSTklOR19NQVJLRVIpOwotCi0gICAgSXRlcmF0b3IgZmlsZXNJdGVyID0gd3NkbEZpbGVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGZpbGVzSXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgb3V0cHV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgU3RyaW5nIHdzZGxGaWxlID0gKFN0cmluZylmaWxlc0l0ZXIubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFZhbGlkYXRpb25SZXBvcnQgdmFsUmVwb3J0ID0gd3NkbFZhbGlkYXRvci52YWxpZGF0ZUZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpLCB3c2RsRmlsZSwgdmFsaWRhdG9yUkIpOwotCi0gICAgICAgIG91dHB1dEJ1ZmZlci5hcHBlbmQoaW5mb0RlbGltKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgIG91dHB1dEJ1ZmZlci5hcHBlbmQobWVzc0dlbi5nZXRTdHJpbmcoX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUsIHdzZGxGaWxlKSkuYXBwZW5kKCIgLSAiKTsKLSAgICAgICAgaWYgKCF2YWxSZXBvcnQuaGFzRXJyb3JzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKHZhbGlkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKGludmFsaWQpOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dEJ1ZmZlci5hcHBlbmQoIlxuIikuYXBwZW5kKGluZm9EZWxpbSkuYXBwZW5kKCJcbiIpOwotICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKHdzZGxWYWxpZGF0b3IuZ2V0TWVzc2FnZXModmFsUmVwb3J0LmdldFZhbGlkYXRpb25NZXNzYWdlcygpLCBlcnJvcm1hcmtlciwgd2FybmluZ21hcmtlcikpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ob3V0cHV0QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBMb2FkIGEgdmFsaWRhdG9yIGludG8gdGhlIHdzZGwgdmFsaWRhdGlvbiBmcmFtZXdvcmsgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIG5hbWVzcGFjZSB0aGUgdmFsaWRhdG9yIGNoZWNrcwotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3MgLSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhlIGltcGxlbWVudHMgSVdTRExWYWxpZGF0b3IKLSAgICogQHBhcmFtIHByb3BlcnRpZXNGaWxlIC0gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIHZhbGlkYXRvcgotICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICAgLSB0aGUgdHlwZSBvZiB2YWxpZGF0b3IgLSBXU0RMIG9yIFdTLUkKLSAgICogQHBhcmFtIG1lc3NHZW4gICAgICAgIC0gYSBNZXNzYWdlR2VuZXJhdG9yIGZvciBwcm9kdWNpbmcgZXJyb3IgbWVzc2FnZXMKLSAgICovCi0vLyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvYWRFeHRlbnNpb25WYWxpZGF0b3IoCi0vLyAgICBTdHJpbmcgbmFtZXNwYWNlLAotLy8gICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzLAotLy8gICAgU3RyaW5nIHByb3BlcnRpZXNGaWxlLAotLy8gICAgSW50ZWdlciB0eXBlLAotLy8gICAgTWVzc2FnZUdlbmVyYXRvciBtZXNzR2VuKQotLy8gIHsKLS8vICAgIHRyeQotLy8gICAgewotLy8gICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0vLyAgICAgIElXU0RMVmFsaWRhdG9yIHZhbGlkYXRvciA9IChJV1NETFZhbGlkYXRvciljbGFzc0xvYWRlci5sb2FkQ2xhc3ModmFsaWRhdG9yQ2xhc3MpLm5ld0luc3RhbmNlKCk7Ci0vLyAgICAgIC8vIGlmIG5vIHByb3BlcnRpZXMgZmlsZSBpcyBzcGVjaWZpZWQgd2UgY2FuIHN0aWxsIGxvYWQgdGhlIHZhbGlkYXRvcgotLy8gICAgICBpZiAocHJvcGVydGllc0ZpbGUgIT0gbnVsbCAmJiAhcHJvcGVydGllc0ZpbGUuZXF1YWxzKCIiKSkKLS8vICAgICAgewotLy8gICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHByb3BlcnRpZXNGaWxlKTsKLS8vICAgICAgICB2YWxpZGF0b3Iuc2V0UmVzb3VyY2VCdW5kbGUocmIpOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UKLS8vICAgICAgewotLy8gICAgICAgIHByb3BlcnRpZXNGaWxlID0gbnVsbDsKLS8vICAgICAgfQotLy8KLS8vICAgICAgVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlclZhbGlkYXRvcihuYW1lc3BhY2UsIHZhbGlkYXRvciwgdHlwZSk7Ci0vLyAgICB9Ci0vLyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLyAgICB7Ci0vLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzR2VuLmdldFN0cmluZyhfRVJST1JfVU5BQkxFX1RPX0xPQURfRVhUX1ZBTElEQVRPUiwgbmFtZXNwYWNlLCBlKSk7Ci0vLyAgICB9Ci0vLwotLy8gIH0KLSAgLy8JLyoqCi0gIC8vCSAqIGxvYWRXU0RMMTFFeHRlbnNpb25WYWxpZGF0b3IKLSAgLy8JICogTG9hZCBhbiBleHRlbnNpb24gdmFsaWRhdG9yIGludG8gdGhlIFdTREwgMS4xIHZhbGlkYXRvcgotICAvLyAgICogQHBhcmFtIG5hbWVzcGFjZQotICAvLyAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzCi0gIC8vICAgKiBAcGFyYW0gcHJvcGVydGllc0ZpbGUKLSAgLy8gICAqIEBwYXJhbSB0eXBlCi0gIC8vICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIKLSAgLy8gICAqLwotICAvLyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvYWRXU0RMMTFFeHRlbnNpb25WYWxpZGF0b3IoCi0gIC8vCQkJU3RyaW5nIG5hbWVzcGFjZSwKLSAgLy8JCQlTdHJpbmcgdmFsaWRhdG9yQ2xhc3MsCi0gIC8vCQkJU3RyaW5nIHJlc291cmNlQnVuZGxlLAotICAvLwkJCUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICAvLwkJewotICAvLwkJCXRyeQotICAvLyB7Ci0gIC8vIAlDbGFzcyB2YWxjbGFzcyA9IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyh2YWxpZGF0b3JDbGFzcyk7Ci0gIC8vIAlJV1NETDExVmFsaWRhdG9yIHZhbGlkYXRvciA9IChJV1NETDExVmFsaWRhdG9yKXZhbGNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gIC8vIAl2YWxpZGF0b3Iuc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlKSk7Ci0gIC8vIAlXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKG5hbWVzcGFjZSx2YWxpZGF0b3IpOwotICAvLyB9Ci0gIC8vIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAvLyB7Ci0gIC8vCSBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBsb2FkIHRoZSBXU0RMIDEuMSB2YWxpZGF0b3IgZm9yIG5hbWVzcGFjZSAiCi0gIC8vICsgbmFtZXNwYWNlICsgZSk7Ci0gIC8vIH0KLSAgLy8KLSAgLy8JCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvdmFsaWRhdGV3c2RsdWkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvdmFsaWRhdGV3c2RsdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5ZTgwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL3ZhbGlkYXRld3NkbHVpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIS0tIEVjbGlwc2UgVUkgTWVzc2FnZSBEaWFsb2cKLV9WQUxJREFUSU9OX1NVQ0NFRURFRCAgICAgICAgICAgICAgICAgICAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1fVkFMSURBVElPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgPSBWYWxpZGF0aW9uIEZhaWxlZAotX1VJX1RIRV9XU0RMX0ZJTEVfSVNfVkFMSUQgICAgICAgICAgICAgICAgID0gVGhlIFdTREwgZmlsZSBpcyB2YWxpZC4KLV9VSV9USEVfV1NETF9GSUxFX0lTX05PVF9WQUxJRCAgICAgICAgICAgICA9IFRoZSBXU0RMIGZpbGUgaXMgbm90IHZhbGlkLiBTZWUgdGhlIFByb2JsZW1zIHZpZXcgZm9yIGEgbGlzdCBvZiB0aGUgdmFsaWRhdGlvbiBlcnJvcnMuCi1fVUlfVEhFX1dTRExfRklMRV9JU19WQUxJRF9XU0RMMTEgICAgICAgICAgPSBUaGUgV1NETCBmaWxlIGlzIHZhbGlkIGFjY29yZGluZyB0byB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIGhvd2V2ZXIgYW4gZXh0ZW5zaW9uIHZhbGlkYXRvciBoYXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSBmaWxlIGlzIG5vdCB2YWxpZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciBhIGxpc3Qgb2YgdGhlIHZhbGlkYXRpb24gZXJyb3JzLgotX1VJX1RIRV9XU0RMX0ZJTEVfSVNfVkFMSURfV0lUSF9XQVJOSU5HUyAgID0gVGhlIFdTREwgZmlsZSBpcyB2YWxpZCBob3dldmVyIHdhcm5pbmdzIGhhdmUgYmVlbiBpc3N1ZWQuIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIHRoZSB2YWxpZGF0aW9uIHdhcm5pbmdzLgotCi0hLS0gQW50IFVJCi1fVUlfSU5GT1JNQVRJT05fREVMSU1JVEVSICAgICAgICAgICAgICAgICAgPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV9VSV9FUlJPUl9NQVJLRVIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVSUk9SICAKLV9VSV9XQVJOSU5HX01BUktFUiAgICAgICAgICAgICAgICAgICAgICAgICA9IFdBUk5JTkcKLV9VSV9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFZBTElECi1fVUlfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJTlZBTElECi1fVUlfQUNUSU9OX1ZBTElEQVRJTkdfRklMRSAgICAgICAgICAgICAgICAgPSBWYWxpZGF0aW5nIHswfQotCi1fRVJST1JfTk9fRklMRV9TUEVDSUZJRUQgICAgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gcnVuIFdTREwgVmFsaWRhdGlvbi4gWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgZmlsZS4KLQotX0VYQ19VTkFCTEVfVE9fVkFMSURBVEVfRklMRSAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIHZhbGlkYXRlIHRoZSBXU0RMIGZpbGUgezB9LiB7MX0KLV9FWENfV1NETF9GQUlMX09OX0VSUk9SICAgICAgICAgICAgICAgICAgICA9IFRoZSBXU0RMIGZpbGUgaXMgbm90IHZhbGlkLiAoRmFpbCBPbiBFcnJvciBpcyBlbmFibGVkLikKLQotIS0tIFRleHQgVUkKLV9FUlJPUl9XUk9OR19BUkdVTUVOVFMgICAgICAgICAgICAgICAgICAgICA9IFVzYWdlOiBXU0RMVmFsaWRhdGUgZmlsZW5hbWUiCi1fRVJST1JfVU5BQkxFX1RPX0xPQURfRVhUX1ZBTElEQVRPUiAgICAgICAgPSBVbmFibGUgdG8gbG9hZCB0aGUgdmFsaWRhdG9yIGZvciBuYW1lc3BhY2UgezB9LiB7MX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjZDAzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL3FuYW1lLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvd3NkbDRqLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDI2NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXdzZGwuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Qud3NkbF8xLjAuMC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmM1M2I2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWNkZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHdzZGwuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBncmFiamFycy54bWwsXAotICAgICAgICAgICAgICAgeHNkLwotamFycy5jb21waWxlLm9yZGVyID0gd3NkbC5qYXIKLXNvdXJjZS53c2RsLmphciA9IHNyYy8KLW91dHB1dC53c2RsLmphciA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IGxpYi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBncmFiamFycy54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHhzZC8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkY2ExOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIgotCW5hbWU9Im9yZy5lY2xpcHNlLndzdC53c2RsIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwiPgotCQk8dHlwZSBuYW1lPSJCaW5kaW5nRmF1bHQiIC8+Ci0JCTx0eXBlIG5hbWU9IkJpbmRpbmdPdXRwdXQiIC8+Ci0JCTx0eXBlIG5hbWU9IlR5cGVzIiAvPgotCQk8dHlwZSBuYW1lPSJPcGVyYXRpb24iIC8+Ci0JCTx0eXBlIG5hbWU9IkZhdWx0IiAvPgotCQk8dHlwZSBuYW1lPSJFeHRlbnNpYmlsaXR5RWxlbWVudCIgLz4KLQkJPHR5cGUgbmFtZT0iTWVzc2FnZSIgLz4KLQkJPHR5cGUgbmFtZT0iRXh0ZW5zaWJsZUVsZW1lbnQiIC8+Ci0JCTx0eXBlIG5hbWU9IkJpbmRpbmdJbnB1dCIgLz4KLQkJPHR5cGUgbmFtZT0iUG9ydFR5cGUiIC8+Ci0JCTx0eXBlIG5hbWU9IlNlcnZpY2UiIC8+Ci0JCTx0eXBlIG5hbWU9IklucHV0IiAvPgotCQk8dHlwZSBuYW1lPSJXU0RMRWxlbWVudCIgLz4KLQkJPHR5cGUgbmFtZT0iUG9ydCIgLz4KLQkJPHR5cGUgbmFtZT0iTmFtZXNwYWNlIiAvPgotCQk8dHlwZSBuYW1lPSJQYXJ0IiAvPgotCQk8dHlwZSBuYW1lPSJEZWZpbml0aW9uIiAvPgotCQk8dHlwZSBuYW1lPSJJbXBvcnQiIC8+Ci0JCTx0eXBlIG5hbWU9IlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiAvPgotCQk8dHlwZSBuYW1lPSJXU0RMUGx1Z2luIiAvPgotCQk8dHlwZSBuYW1lPSJXU0RMRmFjdG9yeSIgLz4KLQkJPHR5cGUgbmFtZT0iTWVzc2FnZVJlZmVyZW5jZSIgLz4KLQkJPHR5cGUgbmFtZT0iVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiAvPgotCQk8dHlwZSBuYW1lPSJPdXRwdXQiIC8+Ci0JCTx0eXBlIG5hbWU9IkJpbmRpbmciIC8+Ci0JCTx0eXBlIG5hbWU9IkJpbmRpbmdPcGVyYXRpb24iIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwiPgotCQk8dHlwZSBuYW1lPSJXU0RMQ29uc3RhbnRzIiAvPgotCQk8dHlwZSBuYW1lPSJFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSIgLz4KLQkJPHR5cGUgbmFtZT0iV1NETFJlc291cmNlRmFjdG9yeUltcGwiIC8+Ci0JCTx0eXBlIG5hbWU9IkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSIgLz4KLQkJPHR5cGUgbmFtZT0iV1NETFJlc291cmNlSW1wbCIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwIj4KLQkJPHR5cGUgbmFtZT0iU09BUEJvZHkiIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBIZWFkZXJGYXVsdCIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUEFkZHJlc3MiIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBGYWN0b3J5IiAvPgotCQk8dHlwZSBuYW1lPSJTT0FQSGVhZGVyIiAvPgotCQk8dHlwZSBuYW1lPSJTT0FQQmluZGluZyIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUEhlYWRlckJhc2UiIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBGYXVsdCIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUE9wZXJhdGlvbiIgLz4KLQk8L3BhY2thZ2U+Ci08IS0tIHByb3Zpc2lvbmFsIEFQSXMgLS0+Ci08IS0tCi0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lIj4KLQkJPHR5cGUgbmFtZT0iTUlNRUNvbnRlbnQiIC8+Ci0JCTx0eXBlIG5hbWU9Ik1JTUVQYWNrYWdlIiAvPgotCQk8dHlwZSBuYW1lPSJNSU1FTXVsdGlwYXJ0UmVsYXRlZCIgLz4KLQkJPHR5cGUgbmFtZT0iTUlNRVBhcnQiIC8+Ci0JCTx0eXBlIG5hbWU9Ik1JTUVNaW1lWG1sIiAvPgotCQk8dHlwZSBuYW1lPSJNSU1FRmFjdG9yeSIgLz4KLQk8L3BhY2thZ2U+Ci0tLT4KLTwhLS0KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAiPgotCQk8dHlwZSBuYW1lPSJIVFRQRmFjdG9yeSIgLz4KLQkJPHR5cGUgbmFtZT0iSFRUUE9wZXJhdGlvbiIgLz4KLQkJPHR5cGUgbmFtZT0iSFRUUFVybEVuY29kZWQiIC8+Ci0JCTx0eXBlIG5hbWU9IkhUVFBQYWNrYWdlIiAvPgotCQk8dHlwZSBuYW1lPSJIVFRQQWRkcmVzcyIgLz4KLQkJPHR5cGUgbmFtZT0iSFRUUFVybFJlcGxhY2VtZW50IiAvPgotCQk8dHlwZSBuYW1lPSJIVFRQQmluZGluZyIgLz4KLQk8L3BhY2thZ2U+Ci0tLT4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9ncmFiamFycy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2dyYWJqYXJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2ZWRiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2dyYWJqYXJzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImNvcHlKYXJzIiBiYXNlZGlyPSIuIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5OYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLQk8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiIvPgotCi0JPHRhcmdldCBuYW1lPSJjb3B5SmFycyIgaWY9ImRvd25sb2FkUGF0aCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY29weUphcnMyIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjb3B5SmFyczIiIGlmPSJwbHVnaW5zUGF0aCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY29weUphcnMzIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNvcHlKYXJzMyIgaWY9InBsdWdpbk5hbWUiPgotCQk8Y29weSB0b2Rpcj0iJHtwbHVnaW5zUGF0aH0vJHtwbHVnaW5OYW1lfSR7dmVyc2lvbn0vbGliIiBvdmVyd3JpdGU9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Rvd25sb2FkUGF0aH0vJHtwbHVnaW5OYW1lfSR7dmVyc2lvbn0iPgotCQkJCTxmaWxlbmFtZSBuYW1lPSIqLmphciIvPgotCQkJPC9maWxlc2V0PgotCQk8L2NvcHk+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjbGVhbnVwSmFycyIgaWY9InBsdWdpbnNQYXRoIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbnVwSmFyczIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW51cEphcnMyIiBpZj0icGx1Z2luTmFtZSI+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7cGx1Z2luc1BhdGh9LyR7cGx1Z2luTmFtZX0ke3ZlcnNpb259L2xpYiI+Ci0JCQkJPGZpbGVuYW1lIG5hbWU9IiouamFyIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2xpYi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9saWIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5MmYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2xpYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotKi5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ2YzRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBXU0RMIE1vZGVsCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCi1fRVJST1JfSU5WQUxJRF9XU0RMID0gVGhlIGlucHV0IHNvdXJjZSBpcyBub3QgYSB2YWxpZCBXU0RMIGRvY3VtZW50LgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NTg1MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luJEltcGxlbWVudGF0aW9uIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3c2RsLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi9xbmFtZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJsaWIvd3NkbDRqLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZGVwZW5kZW5jeWNoZWNrZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnhzZCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmRlcGVuZGVuY3ljaGVja2VyLnJlcXVpcmVkRmlsZXMiPgotICAgICAgPHJlcXVpcmVkRmlsZQotICAgICAgICAgICAgcGx1Z2luUmVsYXRpdmVQYXRoPSJsaWIvcW5hbWUuamFyIgotICAgICAgICAgICAgbG9jYXRpb25VUkw9Imh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvd3NkbDRqL3dzZGw0ai1iaW4tMS40LnppcD9kb3dubG9hZCIvPgotICAgICAgPHJlcXVpcmVkRmlsZQotICAgICAgICAgICAgcGx1Z2luUmVsYXRpdmVQYXRoPSJsaWIvd3NkbDRqLmphciIKLSAgICAgICAgICAgIGxvY2F0aW9uVVJMPSJodHRwOi8vcHJkb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L3dzZGw0ai93c2RsNGotYmluLTEuNC56aXA/ZG93bmxvYWQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcmllcyIgbmFtZT0iV1NETCBFeHRlbnNpYmlsaXR5IEVsZW1lbnQgRmFjdG9yaWVzIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9XU0RMIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLSAgICAgIDxwYXJzZXIKLSAgICAgICAgICAgIHR5cGU9IndzZGwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCI+Ci0gICAgICA8L3BhcnNlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd3NkbC8yMDAzL0hUVFAiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLmV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIj4KLSAgICAgPGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotICAgICAJbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsLkhUVFBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkiLz4gIAotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzZGwvMjAwMy9NSU1FIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC5leHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcmllcyI+Ci0gICAgIDxleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLSAgICAgCW5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIKLSAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwudXRpbC5NSU1FRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ii8+ICAKLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93c2RsLzIwMDMvU09BUCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzZGwuZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3JpZXMiPgotICAgICA8ZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ci0gICAgIAluYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWwuU09BUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSIvPiAgCi0gIDwvZXh0ZW5zaW9uPgotPCEtLQotICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIuY2F0YWxvZ0NvbnRyaWJ1dG9yIj4KLSAgICAgPGNhdGFsb2dDb250cmlidXRvciBjYXRhbG9nSWQ9ImRlZmF1bHQiPgotICAgICAgIDxtYXBwaW5nSW5mbyBrZXk9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB1cmk9InhzZC93c2RsLnhzZCIvPgotICAgICAgIDxtYXBwaW5nSW5mbyBrZXk9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHVyaT0ieHNkL3NvYXAueHNkIi8+Ci0gICAgICAgPG1hcHBpbmdJbmZvIGtleT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgdXJpPSJ4c2QvaHR0cC54c2QiLz4gICAgICAgCi0gICAgICAgPG1hcHBpbmdJbmZvIGtleT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgdXJpPSJ4c2Qvd3NkbC1taW1lLnhzZCIvPiAgICAgIAotICAgICAgIDxtYXBwaW5nSW5mbyBrZXk9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB1cmk9InhzZC9zb2FwZW5jLnhzZCIvPgotICAgICA8L2NhdGFsb2dDb250cmlidXRvcj4KLSAgPC9leHRlbnNpb24+Ci0gIC0tPgotCi0gIDwhLS0gZGVmaW5lIGEgd3NkbCBjb250ZW50IHR5cGUgLS0+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgICAgICAgIDxjb250ZW50LXR5cGUKLSAgICAgICAgICAgICAgIHByaW9yaXR5PSJoaWdoIgotICAgICAgICAgICAgICAgbmFtZT0iV1NETCBDb250ZW50IFR5cGUiCi0gICAgICAgICAgICAgICBpZD0id3NkbHNvdXJjZSIKLSAgICAgICAgICAgICAgIGJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCSAgIGRlZmF1bHQtY2hhcnNldD0iVVRGLTgiCi0JCQkgICBmaWxlLWV4dGVuc2lvbnM9IndzZGwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAKLSAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL0hUVFAuZ2VubW9kZWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9IVFRQLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTA1ZmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL0hUVFAuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4NCi08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCINCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSINCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLmh0dHAvc3JjIg0KLSAgICBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLmh0dHAuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5odHRwLmVkaXRvci9zcmMiDQotICAgIG1vZGVsUGx1Z2luSUQ9ImNvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5odHRwIiBtb2RlbE5hbWU9IkhUVFAiIGVkaXRQbHVnaW5DbGFzcz0iIg0KLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0iIiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMvbW9kZWwvWFNELmdlbm1vZGVsIy8veHNkIj4NCi0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxodHRwLm1kbDwvZm9yZWlnbk1vZGVsPg0KLSAgPGZvcmVpZ25Nb2RlbD5WQUJBU0VfUExVR0lOU19QQVRIPC9mb3JlaWduTW9kZWw+DQotICA8Zm9yZWlnbk1vZGVsPi4uLy4uLy4uPC9mb3JlaWduTW9kZWw+DQotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXU0RMIiBiYXNlUGFja2FnZT0iY29tLmlibS5ldG9vbHMiIGVjb3JlUGFja2FnZT0id3NkbC5lY29yZSMvIj4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vUU5hbWUiLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vT3BlcmF0aW9uVHlwZSIvPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9ET01FbGVtZW50Ii8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1dTRExFeGNlcHRpb24iLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRG9jdW1lbnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2RvY3VtZW50YXRpb25FbGVtZW50Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9lbGVtZW50Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9nZXRFbmNsb3NpbmdEZWZpbml0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9zZXRFbmNsb3NpbmdEZWZpbml0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbi9kZWZpbml0aW9uIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0VHlwZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9lT3BlcmF0aW9ucyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PcGVyYXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3N0eWxlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUlucHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VPdXRwdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUZhdWx0cyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VQYXJhbWV0ZXJPcmRlcmluZyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9lUGFydHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUGFydCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudE5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvdHlwZU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvdHlwZURlZmluaXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudERlY2xhcmF0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VNZXNzYWdlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmciPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmcvZVBvcnRUeXBlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZy9lQmluZGluZ09wZXJhdGlvbnMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZU9wZXJhdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nRmF1bHRzIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1NlcnZpY2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL2VQb3J0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydC9lQmluZGluZyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9yZXF1aXJlZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZWxlbWVudFR5cGUiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbiI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3RhcmdldE5hbWVzcGFjZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9sb2NhdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lbmNvZGluZyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU1lc3NhZ2VzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lUG9ydFR5cGVzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lQmluZGluZ3MiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VTZXJ2aWNlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU5hbWVzcGFjZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VUeXBlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZUltcG9ydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vZ2V0RG9jdW1lbnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vc2V0RG9jdW1lbnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50L2RvY3VtZW50Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbXBvcnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2xvY2F0aW9uVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9JbXBvcnQvZURlZmluaXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lU2NoZW1hIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvZ2V0U2NoZW1hIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvc2V0U2NoZW1hIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYS9zY2hlbWEiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9lRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZXh0RWxlbWVudCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW5wdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL091dHB1dCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRmF1bHQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2VJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2dldElucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQvaW5wdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L2VPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZ2V0T3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0L291dHB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZUZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZ2V0RmF1bHQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdC9mYXVsdCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTmFtZXNwYWNlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9VUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uL29wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9pbnB1dE5hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9vdXRwdXROYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbnMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbiI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2FkZEZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdC9mYXVsdCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0L25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRQYXJhbWV0ZXJPcmRlcmluZyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0UGFyYW1ldGVyT3JkZXJpbmcvcGFyYW1ldGVyT3JkZXIiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldElucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldElucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dC9pbnB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0T3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0T3V0cHV0L291dHB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUlucHV0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lJbnB1dC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lJbnB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPdXRwdXQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUZhdWx0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lGYXVsdC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lGYXVsdC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lNZXNzYWdlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2FkZFBhcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0L3BhcnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cy9wYXJ0T3JkZXIiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQYXJ0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS92YWx1ZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQvcG9ydCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUG9ydCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9nZXRCaW5kaW5nIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnQvc2V0QmluZGluZy9iaW5kaW5nIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZyI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbi9iaW5kaW5nT3BlcmF0aW9uIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL2lucHV0TmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL291dHB1dE5hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9ucyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0UG9ydFR5cGUiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvc2V0UG9ydFR5cGUvcG9ydFR5cGUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdC9iaW5kaW5nRmF1bHQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldE9wZXJhdGlvbiIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uL29wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0L2JpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nT3V0cHV0L2JpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nSW5wdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3V0cHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0ZhdWx0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRCaW5kaW5nL2JpbmRpbmciLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQvaW1wb3J0RGVmIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE1lc3NhZ2UvbWVzc2FnZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUvcG9ydFR5cGUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRTZXJ2aWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZS9zZXJ2aWNlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0ZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmciLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbXBvcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUlucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUGFydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydFR5cGUiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVNlcnZpY2UiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5ncyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xL25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlL3ByZWZpeCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGUvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4L25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RXh0ZW5zaW9uUmVnaXN0cnkvZXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXREb2N1bWVudEJhc2VVUkkiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSS9kb2N1bWVudEJhc2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVUeXBlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlU2VydmljZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZUJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0VHlwZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0VHlwZXMvdHlwZXMiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbXBvcnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lMaXN0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWFwIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVVJMIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1R5cGVzIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMS9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJdGVyYXRvciIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVR5cGVzIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50L3BhcmVudCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50L2NoaWxkcmVuIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC9zY2hlbWEiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvZU1lc3NhZ2UiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgPC9nZW5QYWNrYWdlcz4NCi0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkhUVFAiIGJhc2VQYWNrYWdlPSJjb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmciIGVjb3JlUGFja2FnZT0iaHR0cC5lY29yZSMvIj4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0hUVFBCaW5kaW5nIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaHR0cC5lY29yZSMvL0hUVFBCaW5kaW5nL3ZlcmIiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSFRUUE9wZXJhdGlvbiI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGh0dHAuZWNvcmUjLy9IVFRQT3BlcmF0aW9uL2xvY2F0aW9uVVJJIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0hUVFBVcmxSZXBsYWNlbWVudCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSFRUUFVybEVuY29kZWQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0hUVFBBZGRyZXNzIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaHR0cC5lY29yZSMvL0hUVFBBZGRyZXNzL2xvY2F0aW9uVVJJIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0lIVFRQQWRkcmVzcyIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSUhUVFBCaW5kaW5nIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9JSFRUUE9wZXJhdGlvbiIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSUhUVFBVcmxFbmNvZGVkIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9JSFRUUFVybFJlcGxhY2VtZW50Ii8+DQotICA8L2dlblBhY2thZ2VzPg0KLTwvZ2VubW9kZWw6R2VuTW9kZWw+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvTUlNRS5nZW5tb2RlbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL01JTUUuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjZjOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvTUlNRS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/Pg0KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIg0KLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIg0KLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcubWltZS9zcmMiDQotICAgIGVkaXREaXJlY3Rvcnk9Ii9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcubWltZS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLm1pbWUuZWRpdG9yL3NyYyINCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLm1pbWUiIG1vZGVsTmFtZT0iTUlNRSIgZWRpdFBsdWdpbkNsYXNzPSIiDQotICAgIGVkaXRvclBsdWdpbkNsYXNzPSIiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vLi4vb3JnLmVjbGlwc2UueHNkL3NyYy9tb2RlbC9YU0QuZ2VubW9kZWwjLy94c2QiPg0KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXG1pbWUubWRsPC9mb3JlaWduTW9kZWw+DQotICA8Zm9yZWlnbk1vZGVsPlZBQkFTRV9QTFVHSU5TX1BBVEg8L2ZvcmVpZ25Nb2RlbD4NCi0gIDxmb3JlaWduTW9kZWw+Li4vLi4vLi48L2ZvcmVpZ25Nb2RlbD4NCi0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1JTUUiIGJhc2VQYWNrYWdlPSJjb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmciIGVjb3JlUGFja2FnZT0ibWltZS5lY29yZSMvIj4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtaW1lLmVjb3JlIy8vTGlzdCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vTUlNRUNvbnRlbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtaW1lLmVjb3JlIy8vTUlNRUNvbnRlbnQvdHlwZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtaW1lLmVjb3JlIy8vTUlNRUNvbnRlbnQvZVBhcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVDb250ZW50L3NldFBhcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im1pbWUuZWNvcmUjLy9NSU1FQ29udGVudC9zZXRQYXJ0L3BhcnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1pbWUuZWNvcmUjLy9NSU1FQ29udGVudC9nZXRQYXJ0Ii8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibWltZS5lY29yZSMvL01JTUVQYXJ0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVQYXJ0L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJtaW1lLmVjb3JlIy8vTUlNRVBhcnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZXh0ZW5zaWJpbGl0eUVsZW1lbnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1pbWUuZWNvcmUjLy9NSU1FUGFydC9nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vTUlNRU11bHRpcGFydFJlbGF0ZWQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbWltZS5lY29yZSMvL01JTUVNdWx0aXBhcnRSZWxhdGVkL2VNSU1FUGFydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRU11bHRpcGFydFJlbGF0ZWQvYWRkTUlNRVBhcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im1pbWUuZWNvcmUjLy9NSU1FTXVsdGlwYXJ0UmVsYXRlZC9hZGRNSU1FUGFydC9taW1lUGFydCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVNdWx0aXBhcnRSZWxhdGVkL2dldE1JTUVQYXJ0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1pbWUuZWNvcmUjLy9NSU1FTWltZVhtbCI+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1pbWUuZWNvcmUjLy9NSU1FTWltZVhtbC9lUGFydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRU1pbWVYbWwvc2V0UGFydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibWltZS5lY29yZSMvL01JTUVNaW1lWG1sL3NldFBhcnQvcGFydCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVNaW1lWG1sL2dldFBhcnQiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vSU1JTUVQYXJ0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1pbWUuZWNvcmUjLy9JTUlNRU11bHRpcGFydFJlbGF0ZWQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibWltZS5lY29yZSMvL0lNSU1FQ29udGVudCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vSU1JTUVNaW1lWG1sIi8+DQotICA8L2dlblBhY2thZ2VzPg0KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV1NETCIgYmFzZVBhY2thZ2U9ImNvbS5pYm0uZXRvb2xzIiBlY29yZVBhY2thZ2U9IndzZGwuZWNvcmUjLyI+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1FOYW1lIi8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL09wZXJhdGlvblR5cGUiLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRWxlbWVudCIvPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9XU0RMRXhjZXB0aW9uIi8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL0RPTURvY3VtZW50Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9kb2N1bWVudGF0aW9uRWxlbWVudCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZWxlbWVudCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24vZGVmaW5pdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydFR5cGUiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvZU9wZXJhdGlvbnMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9zdHlsZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VJbnB1dCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lT3V0cHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VGYXVsdHMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lUGFyYW1ldGVyT3JkZXJpbmciLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL01lc3NhZ2UvZVBhcnRzIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1BhcnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L2VsZW1lbnROYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L3R5cGVOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L3R5cGVEZWZpbml0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VsZW1lbnREZWNsYXJhdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC9lTWVzc2FnZSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VQb3J0VHlwZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmcvZUJpbmRpbmdPcGVyYXRpb25zIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ0ZhdWx0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9TZXJ2aWNlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vU2VydmljZS9lUG9ydHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BvcnQvZUJpbmRpbmciLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcmVxdWlyZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50L2VsZW1lbnRUeXBlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0RlZmluaXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi90YXJnZXROYW1lc3BhY2UiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vbG9jYXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZW5jb2RpbmciLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VNZXNzYWdlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVBvcnRUeXBlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZUJpbmRpbmdzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lU2VydmljZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VOYW1lc3BhY2VzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lVHlwZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VJbXBvcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2dldERvY3VtZW50Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudC9kb2N1bWVudCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW1wb3J0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0ltcG9ydC9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0ltcG9ydC9sb2NhdGlvblVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2VEZWZpbml0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9JbXBvcnQvZVNjaGVtYSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L2dldFNjaGVtYSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0ltcG9ydC9zZXRTY2hlbWEvc2NoZW1hIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZUV4dGVuc2liaWxpdHlFbGVtZW50cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50L2V4dEVsZW1lbnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lucHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PdXRwdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0ZhdWx0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9lSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9nZXRJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0L2lucHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9lT3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L2dldE91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9zZXRPdXRwdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dC9vdXRwdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2VGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2dldEZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQvZmF1bHQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL05hbWVzcGFjZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvcHJlZml4Ii8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0VHlwZSI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2FkZE9wZXJhdGlvbi9vcGVyYXRpb24iLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9uYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vaW5wdXROYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vb3V0cHV0TmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb25zIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24iPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQvZmF1bHQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0UGFyYW1ldGVyT3JkZXJpbmciLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0UGFyYW1ldGVyT3JkZXJpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldFBhcmFtZXRlck9yZGVyaW5nL3BhcmFtZXRlck9yZGVyIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQvaW5wdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldE91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dC9vdXRwdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbnB1dCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvZ2V0TWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JT3V0cHV0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPdXRwdXQvZ2V0TWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lGYXVsdCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvZ2V0TWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWVzc2FnZSI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydC9wYXJ0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMvcGFydE9yZGVyIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUGFydCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvdmFsdWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lTZXJ2aWNlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JU2VydmljZS9hZGRQb3J0L3BvcnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvZ2V0QmluZGluZyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvc2V0QmluZGluZyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0L3NldEJpbmRpbmcvYmluZGluZyIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmciPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2FkZEJpbmRpbmdPcGVyYXRpb24vYmluZGluZ09wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9pbnB1dE5hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9vdXRwdXROYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbnMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldFBvcnRUeXBlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9zZXRQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlL3BvcnRUeXBlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQvYmluZGluZ0ZhdWx0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0L25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbi9vcGVyYXRpb24iLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dC9iaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nT3V0cHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ091dHB1dC9iaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0lucHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ091dHB1dCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdGYXVsdCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2liaWxpdHlFbGVtZW50Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbiI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkQmluZGluZy9iaW5kaW5nIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkSW1wb3J0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkSW1wb3J0L2ltcG9ydERlZiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UvcHJlZml4Ii8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlL3BvcnRUeXBlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2Uvc2VydmljZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0lucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nT3BlcmF0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlSW1wb3J0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlTWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlT3BlcmF0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBhcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnRUeXBlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVTZXJ2aWNlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZy9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZ3MiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMuMSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMuMS9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2VzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFByZWZpeCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFByZWZpeC9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEV4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5L2V4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RG9jdW1lbnRCYXNlVVJJIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXREb2N1bWVudEJhc2VVUkkiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXREb2N1bWVudEJhc2VVUkkvZG9jdW1lbnRCYXNlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlVHlwZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZy9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlUG9ydFR5cGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFR5cGVzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzL3R5cGVzIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSW1wb3J0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTGlzdCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1hcCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVVSTCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9UeXBlcyI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSXRlcmF0b3IiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lUeXBlcyIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC9wYXJlbnQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC9jaGlsZHJlbiIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQvc2NoZW1hIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZS9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL2VNZXNzYWdlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gIDwvZ2VuUGFja2FnZXM+DQotPC9nZW5tb2RlbDpHZW5Nb2RlbD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9TT0FQLmdlbm1vZGVsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvU09BUC5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2NGRhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9TT0FQLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+DQotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiDQotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiDQotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5zb2FwL3NyYyINCi0gICAgZWRpdERpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5zb2FwLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcuc29hcC5lZGl0b3Ivc3JjIg0KLSAgICBtb2RlbFBsdWdpbklEPSJjb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcuc29hcCIgbW9kZWxOYW1lPSJTT0FQIiBlZGl0UGx1Z2luQ2xhc3M9IiINCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9IiIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjL21vZGVsL1hTRC5nZW5tb2RlbCMvL3hzZCI+DQotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2Vcc29hcC5tZGw8L2ZvcmVpZ25Nb2RlbD4NCi0gIDxmb3JlaWduTW9kZWw+VkFCQVNFX1BMVUdJTlNfUEFUSDwvZm9yZWlnbk1vZGVsPg0KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLi8uLjwvZm9yZWlnbk1vZGVsPg0KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iU09BUCIgYmFzZVBhY2thZ2U9ImNvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZyIgZWNvcmVQYWNrYWdlPSJzb2FwLmVjb3JlIy8iPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InNvYXAuZWNvcmUjLy9JU3RyaW5nIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQQmluZGluZyI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEJpbmRpbmcvdHJhbnNwb3J0VVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEJpbmRpbmcvc3R5bGUiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzb2FwLmVjb3JlIy8vU09BUEJvZHkiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBCb2R5L3VzZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBCb2R5L25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBCb2R5L2VuY29kaW5nU3R5bGVzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzb2FwLmVjb3JlIy8vU09BUEJvZHkvcGFydHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzb2FwLmVjb3JlIy8vU09BUEhlYWRlckJhc2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBIZWFkZXJCYXNlL3VzZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBIZWFkZXJCYXNlL25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBIZWFkZXJCYXNlL2VuY29kaW5nU3R5bGVzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzb2FwLmVjb3JlIy8vU09BUEhlYWRlckJhc2UvbWVzc2FnZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc29hcC5lY29yZSMvL1NPQVBIZWFkZXJCYXNlL3BhcnQiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzb2FwLmVjb3JlIy8vU09BUEZhdWx0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQRmF1bHQvdXNlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEZhdWx0L25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBGYXVsdC9lbmNvZGluZ1N0eWxlcyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQT3BlcmF0aW9uL3NvYXBBY3Rpb25VUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQT3BlcmF0aW9uL3N0eWxlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBBZGRyZXNzIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQQWRkcmVzcy9sb2NhdGlvblVSSSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQSGVhZGVyRmF1bHQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBIZWFkZXIiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzb2FwLmVjb3JlIy8vU09BUEhlYWRlci9oZWFkZXJGYXVsdHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgPC9nZW5QYWNrYWdlcz4NCi0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IldTREwiIGJhc2VQYWNrYWdlPSJjb20uaWJtLmV0b29scyIgZWNvcmVQYWNrYWdlPSJ3c2RsLmVjb3JlIy8iPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9RTmFtZSIvPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9PcGVyYXRpb25UeXBlIi8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL0RPTUVsZW1lbnQiLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vV1NETEV4Y2VwdGlvbiIvPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9ET01Eb2N1bWVudCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2RvY3VtZW50YXRpb25FbGVtZW50Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZWxlbWVudCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24vZGVmaW5pdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydFR5cGUiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvZU9wZXJhdGlvbnMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vc3R5bGUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lSW5wdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lT3V0cHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUZhdWx0cyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lUGFyYW1ldGVyT3JkZXJpbmciLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL01lc3NhZ2UvZVBhcnRzIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1BhcnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudE5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L3R5cGVOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC90eXBlRGVmaW5pdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudERlY2xhcmF0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC9lTWVzc2FnZSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmcvZVBvcnRUeXBlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VCaW5kaW5nT3BlcmF0aW9ucyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ091dHB1dCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ0ZhdWx0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9TZXJ2aWNlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vU2VydmljZS9lUG9ydHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydC9lQmluZGluZyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcmVxdWlyZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9lbGVtZW50VHlwZSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3RhcmdldE5hbWVzcGFjZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vbG9jYXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lbmNvZGluZyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lTWVzc2FnZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVBvcnRUeXBlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lQmluZGluZ3MiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVNlcnZpY2VzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VOYW1lc3BhY2VzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VUeXBlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lSW1wb3J0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9nZXREb2N1bWVudCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vc2V0RG9jdW1lbnQvZG9jdW1lbnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0ltcG9ydCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0ltcG9ydC9sb2NhdGlvblVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lRGVmaW5pdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lU2NoZW1hIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvZ2V0U2NoZW1hIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvc2V0U2NoZW1hIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYS9zY2hlbWEiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2dldEV4dGVuc2liaWxpdHlFbGVtZW50cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudC9leHRFbGVtZW50Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbnB1dCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vT3V0cHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9GYXVsdCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9lSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9nZXRJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0L2lucHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L2VPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZ2V0T3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0L291dHB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9lRmF1bHQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9nZXRGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L3NldEZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L3NldEZhdWx0L2ZhdWx0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9OYW1lc3BhY2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9VUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvcHJlZml4Ii8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0VHlwZSI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2FkZE9wZXJhdGlvbi9vcGVyYXRpb24iLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9uYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vaW5wdXROYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vb3V0cHV0TmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb25zIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24iPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQvZmF1bHQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0UGFyYW1ldGVyT3JkZXJpbmciLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0UGFyYW1ldGVyT3JkZXJpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldFBhcmFtZXRlck9yZGVyaW5nL3BhcmFtZXRlck9yZGVyIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQvaW5wdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldE91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dC9vdXRwdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbnB1dCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvZ2V0TWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JT3V0cHV0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPdXRwdXQvZ2V0TWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lGYXVsdCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvZ2V0TWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWVzc2FnZSI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydC9wYXJ0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMvcGFydE9yZGVyIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUGFydCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvdmFsdWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lTZXJ2aWNlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JU2VydmljZS9hZGRQb3J0L3BvcnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvZ2V0QmluZGluZyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvc2V0QmluZGluZyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0L3NldEJpbmRpbmcvYmluZGluZyIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmciPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2FkZEJpbmRpbmdPcGVyYXRpb24vYmluZGluZ09wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9pbnB1dE5hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9vdXRwdXROYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbnMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldFBvcnRUeXBlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9zZXRQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlL3BvcnRUeXBlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQvYmluZGluZ0ZhdWx0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0L25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbi9vcGVyYXRpb24iLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dC9iaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nT3V0cHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ091dHB1dC9iaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0lucHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ091dHB1dCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdGYXVsdCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2liaWxpdHlFbGVtZW50Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbiI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkQmluZGluZy9iaW5kaW5nIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkSW1wb3J0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkSW1wb3J0L2ltcG9ydERlZiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UvcHJlZml4Ii8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlL3BvcnRUeXBlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2Uvc2VydmljZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0lucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nT3BlcmF0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlSW1wb3J0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlTWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlT3BlcmF0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBhcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnRUeXBlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVTZXJ2aWNlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZy9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZ3MiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMuMSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMuMS9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2VzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFByZWZpeCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFByZWZpeC9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEV4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5L2V4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RG9jdW1lbnRCYXNlVVJJIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXREb2N1bWVudEJhc2VVUkkiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXREb2N1bWVudEJhc2VVUkkvZG9jdW1lbnRCYXNlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlVHlwZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZy9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlUG9ydFR5cGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFR5cGVzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzL3R5cGVzIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSW1wb3J0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTGlzdCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1hcCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVVSTCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9UeXBlcyI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSXRlcmF0b3IiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lUeXBlcyIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcGFyZW50Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50L2NoaWxkcmVuIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50L3NjaGVtYSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL2VNZXNzYWdlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gIDwvZ2VuUGFja2FnZXM+DQotPC9nZW5tb2RlbDpHZW5Nb2RlbD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9odHRwLmVjb3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvaHR0cC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhODc5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9odHRwLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4NCi08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCINCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iaHR0cCINCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvSFRUUCIgbnNQcmVmaXg9Imh0dHAiPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIVFRQQmluZGluZyIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JSFRUUEJpbmRpbmciPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyYiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhUVFBPcGVyYXRpb24iIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSUhUVFBPcGVyYXRpb24iPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb25VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIVFRQVXJsUmVwbGFjZW1lbnQiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSUhUVFBVcmxSZXBsYWNlbWVudCIvPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIVFRQVXJsRW5jb2RlZCIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JSFRUUFVybEVuY29kZWQiLz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSFRUUEFkZHJlc3MiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSUhUVFBBZGRyZXNzIj4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUhUVFBBZGRyZXNzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSFRUUEJpbmRpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklIVFRQT3BlcmF0aW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklIVFRQVXJsRW5jb2RlZCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUhUVFBVcmxSZXBsYWNlbWVudCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+DQotPC9lY29yZTpFUGFja2FnZT4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9taW1lLmVjb3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvbWltZS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmYWE0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9taW1lLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4NCi08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCINCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibWltZSINCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvTUlNRSIgbnNQcmVmaXg9Im1pbWUiPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNSU1FQ29udGVudCIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JTUlNRUNvbnRlbnQiPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0UGFydCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBhcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQYXJ0IiBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzZGwuZWNvcmUjLy9QYXJ0Ii8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTUlNRVBhcnQiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSU1JTUVQYXJ0Ij4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZXh0ZW5zaWJpbGl0eUVsZW1lbnQiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NkbC5lY29yZSMvL0lFeHRlbnNpYmlsaXR5RWxlbWVudCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBlVHlwZT0iIy8vTGlzdCIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1JTUVNdWx0aXBhcnRSZWxhdGVkIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50ICMvL0lNSU1FTXVsdGlwYXJ0UmVsYXRlZCI+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRNSU1FUGFydCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1pbWVQYXJ0IiBlVHlwZT0iIy8vSU1JTUVQYXJ0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNSU1FUGFydHMiIGVUeXBlPSIjLy9MaXN0Ii8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlTUlNRVBhcnQiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL01JTUVQYXJ0IiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1JTUVNaW1lWG1sIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50ICMvL0lNSU1FTWltZVhtbCI+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRQYXJ0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UGFydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBhcnQiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NkbC5lY29yZSMvL1BhcnQiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJTUlNRVBhcnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklNSU1FTXVsdGlwYXJ0UmVsYXRlZCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1JTUVDb250ZW50IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJTUlNRU1pbWVYbWwiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikxpc3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIvPg0KLTwvZWNvcmU6RVBhY2thZ2U+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvc29hcC5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL3NvYXAuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjgzZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvc29hcC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+DQotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiDQotICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ic29hcCINCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvU09BUCIgbnNQcmVmaXg9InNvYXAiPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQQmluZGluZyIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc3BvcnRVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0eWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU09BUEJvZHkiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuY29kaW5nU3R5bGVzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9JU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJ0cyIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzZGwuZWNvcmUjLy9QYXJ0Ii8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU09BUEhlYWRlckJhc2UiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuY29kaW5nU3R5bGVzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9JU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlIiBsb3dlckJvdW5kPSIxIg0KLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2RsLmVjb3JlIy8vTWVzc2FnZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFydCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2RsLmVjb3JlIy8vUGFydCIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBGYXVsdCIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5jb2RpbmdTdHlsZXMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL0lTdHJpbmciLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQT3BlcmF0aW9uIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBBY3Rpb25VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0eWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU09BUEFkZHJlc3MiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb25VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQSGVhZGVyRmF1bHQiIGVTdXBlclR5cGVzPSIjLy9TT0FQSGVhZGVyQmFzZSIvPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQSGVhZGVyIiBlU3VwZXJUeXBlcz0iIy8vU09BUEhlYWRlckJhc2UiPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGVhZGVyRmF1bHRzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9TT0FQSGVhZGVyRmF1bHQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSVN0cmluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4NCi08L2Vjb3JlOkVQYWNrYWdlPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL3dzZGwuZWNvcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC93c2RsLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGFkNmI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL3dzZGwuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCINCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0id3NkbCINCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd3NkbC8yMDAzL1dTREwiIG5zUHJlZml4PSJ3c2RsIj4NCi0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuJiN4RDsmI3hBOyYjeEQ7JiN4QTtXU0RMIGRlc2NyaWJlcyBuZXR3b3JrIHNlcnZpY2VzIGFzIHNldHMgb2YgZW5kcG9pbnRzIG9wZXJhdGluZyBvbiBtZXNzYWdlcy4gVGhlIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGFyZSBkZXNjcmliZWQgYWJzdHJhY3RseSwgYW5kIHRoZW4gYm91bmQgdG8gYSBjb25jcmV0ZSBuZXR3b3JrIHByb3RvY29sIGFuZCBtZXNzYWdlIGZvcm1hdCB0byBkZWZpbmUgYW4gZW5kcG9pbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkmI3hEOyYjeEE7LSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUmI3hEOyYjeEE7LSAyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmcsIHNob3dzIHRoZSBuYW1lc3BhY2UgYW5kIGltcG9ydCBtZWNoYW5pc20mI3hEOyYjeEE7LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbSYjeEQ7JiN4QTstIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwmI3hEOyYjeEE7LSAyLjMgTWVzc2FnZXMsIDIuNCBQb3J0VHlwZXMsIDIuNSBCaW5kaW5ncyBhbmQgMi43IFNlcnZpY2VzLCBzaG93IHRoZSBtYWpvciBXU0RMIGVsZW1lbnRzIGFuZCB0aGVpciByZWxhdGlvbnMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4iLz4NCi0gIDwvZUFubm90YXRpb25zPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBsYW5ndWFnZSBlbGVtZW50LiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEVuY2xvc2luZ0RlZmluaXRpb24iIGVUeXBlPSIjLy9EZWZpbml0aW9uIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZGVmaW5pdGlvbiIgZVR5cGU9IiMvL0RlZmluaXRpb24iLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRvY3VtZW50YXRpb25FbGVtZW50IiBlVHlwZT0iIy8vRE9NRWxlbWVudCIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWxlbWVudCIgZVR5cGU9IiMvL0RPTUVsZW1lbnQiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0VHlwZSIgZVN1cGVyVHlwZXM9IiMvL1dTRExFbGVtZW50ICMvL0lQb3J0VHlwZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InFOYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuZGVmaW5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb3h5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVPcGVyYXRpb25zIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9PcGVyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3BlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQgIy8vSU9wZXJhdGlvbiI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50LiBBIFdTREwgb3BlcmF0aW9uIGlzIGFuIGFic3RyYWN0IGRlc2NyaXB0aW9uIG9mIGFuIGFjdGlvbiBzdXBwb3J0ZWQgYnkgYSBzZXJ2aWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0eWxlIiBlVHlwZT0iIy8vT3BlcmF0aW9uVHlwZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5kZWZpbmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJveHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUlucHV0IiBlVHlwZT0iIy8vSW5wdXQiDQotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU91dHB1dCIgZVR5cGU9IiMvL091dHB1dCINCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlRmF1bHRzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9GYXVsdCIgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQYXJhbWV0ZXJPcmRlcmluZyIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iIy8vUGFydCIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2UiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCAjLy9JTWVzc2FnZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG1lc3NhZ2UgZWxlbWVudC4gQSBXU0RMIG1lc3NhZ2UgaXMgYW4gYWJzdHJhY3QsIHR5cGVkIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgYmVpbmcgY29tbXVuaWNhdGVkLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InFOYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuZGVmaW5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb3h5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQYXJ0cyIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iIy8vUGFydCIgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYXJ0IiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQgIy8vSVBhcnQiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwYXJ0IGVsZW1lbnQuIFBhcnRzIGRlc2NyaWJlIHRoZSBsb2dpY2FsIGFic3RyYWN0IGNvbnRlbnQgb2YgYSBtZXNzYWdlLiBFYWNoIHBhcnQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdHlwZSBmcm9tIHNvbWUgdHlwZSBzeXN0ZW0uICIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVsZW1lbnROYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVOYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InR5cGVEZWZpbml0aW9uIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5lY29yZSMvL1hTRFR5cGVEZWZpbml0aW9uIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50RGVjbGFyYXRpb24iIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vLi4vb3JnLmVjbGlwc2UueHNkL3NyYy14c2QvbW9kZWwvWFNELmVjb3JlIy8vWFNERWxlbWVudERlY2xhcmF0aW9uIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlTWVzc2FnZSIgZVR5cGU9IiMvL01lc3NhZ2UiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCaW5kaW5nIiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSUJpbmRpbmciPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBiaW5kaW5nIGVsZW1lbnQuIEEgYmluZGluZyBkZWZpbmVzIG1lc3NhZ2UgZm9ybWF0IGFuZCBwcm90b2NvbCBkZXRhaWxzIGZvciBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBkZWZpbmVkIGJ5IGEgcGFydGljdWxhciBwb3J0VHlwZS4gVGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIGEgZ2l2ZW4gcG9ydFR5cGUuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icU5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5kZWZpbmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJveHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBvcnRUeXBlIiBsb3dlckJvdW5kPSIxIg0KLSAgICAgICAgZVR5cGU9IiMvL1BvcnRUeXBlIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlQmluZGluZ09wZXJhdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL0JpbmRpbmdPcGVyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmluZGluZ09wZXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZy4gQW4gb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aGluIHRoZSBiaW5kaW5nJ3MgcG9ydFR5cGUuICIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVPcGVyYXRpb24iIGxvd2VyQm91bmQ9IjEiDQotICAgICAgICBlVHlwZT0iIy8vT3BlcmF0aW9uIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlQmluZGluZ0lucHV0IiBlVHlwZT0iIy8vQmluZGluZ0lucHV0Ig0KLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVCaW5kaW5nT3V0cHV0IiBlVHlwZT0iIy8vQmluZGluZ091dHB1dCINCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlQmluZGluZ0ZhdWx0cyIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iIy8vQmluZGluZ0ZhdWx0IiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlcnZpY2UiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JU2VydmljZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InFOYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuZGVmaW5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb3h5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQb3J0cyIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iIy8vUG9ydCIgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0IiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSVBvcnQiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlQmluZGluZyIgbG93ZXJCb3VuZD0iMSINCi0gICAgICAgIGVUeXBlPSIjLy9CaW5kaW5nIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCAjLy9JRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuIFdTREwgYWxsb3dzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXF1aXJlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVsZW1lbnRUeXBlIiBlVHlwZT0iIy8vUU5hbWUiDQotICAgICAgICB0cmFuc2llbnQ9InRydWUiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSURlZmluaXRpb24iPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldERvY3VtZW50IiBlVHlwZT0iIy8vRE9NRG9jdW1lbnQiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldERvY3VtZW50Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZG9jdW1lbnQiIGVUeXBlPSIjLy9ET01Eb2N1bWVudCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icU5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5jb2RpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVNZXNzYWdlcyIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iIy8vTWVzc2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQb3J0VHlwZXMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL1BvcnRUeXBlIiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUJpbmRpbmdzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9CaW5kaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVNlcnZpY2VzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9TZXJ2aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU5hbWVzcGFjZXMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL05hbWVzcGFjZSIgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVUeXBlcyIgZVR5cGU9IiMvL1R5cGVzIg0KLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVJbXBvcnRzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9JbXBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW1wb3J0IiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQgIy8vSUltcG9ydCI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFNjaGVtYSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjLXhzZC9tb2RlbC9YU0QuZWNvcmUjLy9YU0RTY2hlbWEiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFNjaGVtYSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjLXhzZC9tb2RlbC9YU0QuZWNvcmUjLy9YU0RTY2hlbWEiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb25VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVEZWZpbml0aW9uIiBlVHlwZT0iIy8vRGVmaW5pdGlvbiIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVNjaGVtYSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjLXhzZC9tb2RlbC9YU0QuZWNvcmUjLy9YU0RTY2hlbWEiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbnNpYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIgZVR5cGU9IiMvL0lMaXN0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImV4dEVsZW1lbnQiIGVUeXBlPSIjLy9JRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4dGVuc2liaWxpdHlFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklucHV0IiBlU3VwZXJUeXBlcz0iIy8vTWVzc2FnZVJlZmVyZW5jZSAjLy9XU0RMRWxlbWVudCAjLy9JSW5wdXQiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50LiBBbiBpbnB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRwdXQiIGVTdXBlclR5cGVzPSIjLy9NZXNzYWdlUmVmZXJlbmNlICMvL1dTRExFbGVtZW50ICMvL0lPdXRwdXQiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudC4gQW4gb3V0cHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGYXVsdCIgZVN1cGVyVHlwZXM9IiMvL01lc3NhZ2VSZWZlcmVuY2UgIy8vV1NETEVsZW1lbnQgIy8vSUZhdWx0Ij4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudC4gRmF1bHQgZWxlbWVudHMgc3BlY2lmeSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIGFueSBlcnJvciBtZXNzYWdlcyB0aGF0IG1heSBiZSBvdXRwdXQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCaW5kaW5nSW5wdXQiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JQmluZGluZ0lucHV0Ij4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gaW5wdXQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRJbnB1dCIgZVR5cGU9IiMvL0lJbnB1dCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0SW5wdXQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJpbnB1dCIgZVR5cGU9IiMvL0lJbnB1dCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUlucHV0IiBsb3dlckJvdW5kPSIxIg0KLSAgICAgICAgZVR5cGU9IiMvL0lucHV0Ii8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmluZGluZ091dHB1dCIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lCaW5kaW5nT3V0cHV0Ij4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRPdXRwdXQiIGVUeXBlPSIjLy9JT3V0cHV0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRPdXRwdXQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJvdXRwdXQiIGVUeXBlPSIjLy9JT3V0cHV0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlT3V0cHV0IiBsb3dlckJvdW5kPSIxIg0KLSAgICAgICAgZVR5cGU9IiMvL091dHB1dCIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJpbmRpbmdGYXVsdCIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lCaW5kaW5nRmF1bHQiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGYXVsdCIgZVR5cGU9IiMvL0lGYXVsdCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0RmF1bHQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJmYXVsdCIgZVR5cGU9IiMvL0lGYXVsdCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUZhdWx0IiBsb3dlckJvdW5kPSIxIg0KLSAgICAgICAgZVR5cGU9IiMvL0ZhdWx0Ii8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUU5hbWUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5RTmFtZSBjbGFzcy4gQSBRTmFtZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lc3BhY2UiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IlVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3BlcmF0aW9uVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuT3BlcmF0aW9uVHlwZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPTkVfV0FZPTEmI3hEOyYjeEE7UkVRVUVTVF9SRVNQT05TRT0yJiN4RDsmI3hBO1NPTElDSVRfUkVTUE9OU0U9MyYjeEQ7JiN4QTtOT1RJRklDQVRJT049NCIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJUG9ydFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLlBvcnRUeXBlIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnRUeXBlIG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZE9wZXJhdGlvbiI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im9wZXJhdGlvbiIgZVR5cGU9IiMvL0lPcGVyYXRpb24iLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE9wZXJhdGlvbiIgZVR5cGU9IiMvL0lPcGVyYXRpb24iPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImlucHV0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJvdXRwdXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRPcGVyYXRpb25zIiBlVHlwZT0iIy8vSUxpc3QiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJT3BlcmF0aW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5PcGVyYXRpb24iDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEZhdWx0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZmF1bHQiIGVUeXBlPSIjLy9JRmF1bHQiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZhdWx0IiBlVHlwZT0iIy8vSUZhdWx0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmF1bHRzIiBlVHlwZT0iIy8vSU1hcCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UGFyYW1ldGVyT3JkZXJpbmciIGVUeXBlPSIjLy9JTGlzdCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0UGFyYW1ldGVyT3JkZXJpbmciPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJhbWV0ZXJPcmRlciIgZVR5cGU9IiMvL0lMaXN0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRJbnB1dCIgZVR5cGU9IiMvL0lJbnB1dCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0SW5wdXQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJpbnB1dCIgZVR5cGU9IiMvL0lJbnB1dCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T3V0cHV0IiBlVHlwZT0iIy8vSU91dHB1dCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0T3V0cHV0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ib3V0cHV0IiBlVHlwZT0iIy8vSU91dHB1dCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklJbnB1dCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuSW5wdXQiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRNZXNzYWdlIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU91dHB1dCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuT3V0cHV0Ig0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldE1lc3NhZ2UiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJRmF1bHQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkZhdWx0Ig0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0TWVzc2FnZSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklNZXNzYWdlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5NZXNzYWdlIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk1lc3NhZ2Ugbm9uLU1PRiBpbnRlcmZhY2UiLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRQYXJ0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFydCIgZVR5cGU9IiMvL0lQYXJ0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQYXJ0IiBlVHlwZT0iIy8vSVBhcnQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQYXJ0cyIgZVR5cGU9IiMvL0lNYXAiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE9yZGVyZWRQYXJ0cyIgZVR5cGU9IiMvL0lMaXN0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFydE9yZGVyIiBlVHlwZT0iIy8vSUxpc3QiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJUGFydCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuUGFydCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5QYXJ0IG5vbi1NT0YgaW50ZXJmYWNlIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0RXh0ZW5zaW9uQXR0cmlidXRlIiBlRXhjZXB0aW9ucz0iIy8vV1NETEV4Y2VwdGlvbiI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL1FOYW1lIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIgZVR5cGU9IiMvL0lJdGVyYXRvciIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIiBlVHlwZT0iIy8vUU5hbWUiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJU2VydmljZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuU2VydmljZSINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5TZXJ2aWNlIG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZFBvcnQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwb3J0IiBlVHlwZT0iIy8vSVBvcnQiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBvcnRzIiBlVHlwZT0iIy8vSU1hcCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UG9ydCIgZVR5cGU9IiMvL0lQb3J0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklQb3J0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5Qb3J0Ig0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZyIgZVR5cGU9IiMvL0lCaW5kaW5nIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRCaW5kaW5nIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iYmluZGluZyIgZVR5cGU9IiMvL0lCaW5kaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUJpbmRpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkJpbmRpbmciDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iYmluZGluZ09wZXJhdGlvbiIgZVR5cGU9IiMvL0lCaW5kaW5nT3BlcmF0aW9uIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nT3BlcmF0aW9uIiBlVHlwZT0iIy8vSUJpbmRpbmdPcGVyYXRpb24iPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImlucHV0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJvdXRwdXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nT3BlcmF0aW9ucyIgZVR5cGU9IiMvL0lMaXN0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQb3J0VHlwZSIgZVR5cGU9IiMvL0lQb3J0VHlwZSIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0UG9ydFR5cGUiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwb3J0VHlwZSIgZVR5cGU9IiMvL0lQb3J0VHlwZSIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklCaW5kaW5nT3BlcmF0aW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkQmluZGluZ0ZhdWx0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iYmluZGluZ0ZhdWx0IiBlVHlwZT0iIy8vSUJpbmRpbmdGYXVsdCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZ0ZhdWx0IiBlVHlwZT0iIy8vSUJpbmRpbmdGYXVsdCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmdGYXVsdHMiIGVUeXBlPSIjLy9JTWFwIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRPcGVyYXRpb24iIGVUeXBlPSIjLy9JT3BlcmF0aW9uIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRPcGVyYXRpb24iPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJvcGVyYXRpb24iIGVUeXBlPSIjLy9JT3BlcmF0aW9uIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nSW5wdXQiIGVUeXBlPSIjLy9JQmluZGluZ0lucHV0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRCaW5kaW5nSW5wdXQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nSW5wdXQiIGVUeXBlPSIjLy9JQmluZGluZ0lucHV0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nT3V0cHV0IiBlVHlwZT0iIy8vSUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldEJpbmRpbmdPdXRwdXQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nT3V0cHV0IiBlVHlwZT0iIy8vSUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQmluZGluZ0lucHV0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5CaW5kaW5nSW5wdXQiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0lucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQmluZGluZ091dHB1dCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuQmluZGluZ091dHB1dCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQmluZGluZ0ZhdWx0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJET01FbGVtZW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLnczYy5kb20uRWxlbWVudCI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklFeHRlbnNpYmlsaXR5RWxlbWVudCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSURlZmluaXRpb24iIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkRlZmluaXRpb24iDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRGVmaW5pdGlvbiBub24tTU9GIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRCaW5kaW5nIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iYmluZGluZyIgZVR5cGU9IiMvL0lCaW5kaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRJbXBvcnQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJpbXBvcnREZWYiIGVUeXBlPSIjLy9JSW1wb3J0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRNZXNzYWdlIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGROYW1lc3BhY2UiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwcmVmaXgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZXNwYWNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRQb3J0VHlwZSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBvcnRUeXBlIiBlVHlwZT0iIy8vSVBvcnRUeXBlIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRTZXJ2aWNlIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ic2VydmljZSIgZVR5cGU9IiMvL0lTZXJ2aWNlIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVCaW5kaW5nRmF1bHQiIGVUeXBlPSIjLy9JQmluZGluZ0ZhdWx0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVCaW5kaW5nSW5wdXQiIGVUeXBlPSIjLy9JQmluZGluZ0lucHV0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVCaW5kaW5nT3V0cHV0IiBlVHlwZT0iIy8vSUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iIGVUeXBlPSIjLy9JQmluZGluZ09wZXJhdGlvbiIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlQmluZGluZyIgZVR5cGU9IiMvL0lCaW5kaW5nIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVGYXVsdCIgZVR5cGU9IiMvL0lGYXVsdCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlSW1wb3J0IiBlVHlwZT0iIy8vSUltcG9ydCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlSW5wdXQiIGVUeXBlPSIjLy9JSW5wdXQiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZU1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlT3BlcmF0aW9uIiBlVHlwZT0iIy8vSU9wZXJhdGlvbiIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlT3V0cHV0IiBlVHlwZT0iIy8vSU91dHB1dCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlUGFydCIgZVR5cGU9IiMvL0lQYXJ0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVQb3J0IiBlVHlwZT0iIy8vSVBvcnQiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZVBvcnRUeXBlIiBlVHlwZT0iIy8vSVBvcnRUeXBlIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVTZXJ2aWNlIiBlVHlwZT0iIy8vSVNlcnZpY2UiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmciIGVUeXBlPSIjLy9JQmluZGluZyI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZ3MiIGVUeXBlPSIjLy9JTWFwIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRJbXBvcnRzIiBlVHlwZT0iIy8vSU1hcCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0SW1wb3J0cyIgZVR5cGU9IiMvL0lMaXN0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZXNwYWNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1lc3NhZ2VzIiBlVHlwZT0iIy8vSU1hcCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TmFtZXNwYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXROYW1lc3BhY2VzIiBlVHlwZT0iIy8vSU1hcCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UG9ydFR5cGUiIGVUeXBlPSIjLy9JUG9ydFR5cGUiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBvcnRUeXBlcyIgZVR5cGU9IiMvL0lNYXAiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFByZWZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U2VydmljZSIgZVR5cGU9IiMvL0lTZXJ2aWNlIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTZXJ2aWNlcyIgZVR5cGU9IiMvL0lNYXAiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEV4dGVuc2lvblJlZ2lzdHJ5IiBlVHlwZT0iIy8vSUV4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRFeHRlbnNpb25SZWdpc3RyeSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImV4dGVuc2lvblJlZ2lzdHJ5IiBlVHlwZT0iIy8vSUV4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXREb2N1bWVudEJhc2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldERvY3VtZW50QmFzZVVSSSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImRvY3VtZW50QmFzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlVHlwZXMiIGVUeXBlPSIjLy9JVHlwZXMiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InJlbW92ZVNlcnZpY2UiIGVUeXBlPSIjLy9JU2VydmljZSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0icmVtb3ZlQmluZGluZyIgZVR5cGU9IiMvL0lCaW5kaW5nIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJyZW1vdmVQb3J0VHlwZSIgZVR5cGU9IiMvL0lQb3J0VHlwZSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0icmVtb3ZlTWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRUeXBlcyIgZVR5cGU9IiMvL0lUeXBlcyIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0VHlwZXMiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ0eXBlcyIgZVR5cGU9IiMvL0lUeXBlcyIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklJbXBvcnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkltcG9ydCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbXBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklMaXN0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJTWFwIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLk1hcCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTWFwIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVVSTCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSTCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLm5ldC5VUkwgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJRXh0ZW5zaW9uUmVnaXN0cnkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZXMiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JVHlwZXMiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCB0eXBlcyBlbGVtZW50LiBUaGUgdHlwZXMgZWxlbWVudCBlbmNsb3NlcyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSBleGNoYW5nZWQgbWVzc2FnZXMuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U2NoZW1hcyIgZVR5cGU9IiMvL0lMaXN0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTY2hlbWFzIiBlVHlwZT0iIy8vSUxpc3QiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSXRlcmF0b3IiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuSXRlcmF0b3IiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV1NETEV4Y2VwdGlvbiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXhjZXB0aW9uIGNsYXNzLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJVHlwZXMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLlR5cGVzIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlR5cGVzIG5vbi1NT0YgaW50ZXJmYWNlIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoaWxkcmVuIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzY2hlbWEiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vLi4vb3JnLmVjbGlwc2UueHNkL3NyYy14c2QvbW9kZWwvWFNELmVjb3JlIy8vWFNEU2NoZW1hIg0KLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJET01Eb2N1bWVudCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy53M2MuZG9tLkRvY3VtZW50Ij4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRG9jdW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1lc3NhZ2VSZWZlcmVuY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQiPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU1lc3NhZ2UiIGxvd2VyQm91bmQ9IjEiDQotICAgICAgICBlVHlwZT0iIy8vTWVzc2FnZSIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotPC9lY29yZTpFUGFja2FnZT4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC93c2RsLmdlbm1vZGVsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvd3NkbC5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0NDVkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC93c2RsLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiDQotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiDQotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYyINCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC53c2RsLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Im9yZy5lY2xpcHNlLndzdC53c2RsLmVkaXRvci9zcmMiDQotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLndzdC53c2RsIiBtb2RlbE5hbWU9IldTREwiIGVkaXRQbHVnaW5DbGFzcz0iIiBlZGl0b3JQbHVnaW5DbGFzcz0iIg0KLSAgICB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5nZW5tb2RlbCMvL3hzZCI+DQotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcV1NETC5tZGw8L2ZvcmVpZ25Nb2RlbD4NCi0gIDxmb3JlaWduTW9kZWw+VkFCQVNFX1BMVUdJTlNfUEFUSDwvZm9yZWlnbk1vZGVsPg0KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLi8uLjwvZm9yZWlnbk1vZGVsPg0KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV1NETCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLndzdCIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSINCi0gICAgICBlY29yZVBhY2thZ2U9IndzZGwuZWNvcmUjLyI+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1FOYW1lIi8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL09wZXJhdGlvblR5cGUiLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRWxlbWVudCIvPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9XU0RMRXhjZXB0aW9uIi8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL0RPTURvY3VtZW50Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9kb2N1bWVudGF0aW9uRWxlbWVudCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZWxlbWVudCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24vZGVmaW5pdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydFR5cGUiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvZU9wZXJhdGlvbnMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9zdHlsZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VJbnB1dCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lT3V0cHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VGYXVsdHMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lUGFyYW1ldGVyT3JkZXJpbmciLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL01lc3NhZ2UvZVBhcnRzIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1BhcnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L2VsZW1lbnROYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L3R5cGVOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L3R5cGVEZWZpbml0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VsZW1lbnREZWNsYXJhdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC9lTWVzc2FnZSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VQb3J0VHlwZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmcvZUJpbmRpbmdPcGVyYXRpb25zIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ0ZhdWx0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9TZXJ2aWNlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vU2VydmljZS9lUG9ydHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BvcnQvZUJpbmRpbmciLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcmVxdWlyZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50L2VsZW1lbnRUeXBlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0RlZmluaXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi90YXJnZXROYW1lc3BhY2UiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vbG9jYXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZW5jb2RpbmciLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VNZXNzYWdlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVBvcnRUeXBlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZUJpbmRpbmdzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lU2VydmljZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VOYW1lc3BhY2VzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lVHlwZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VJbXBvcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2dldERvY3VtZW50Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudC9kb2N1bWVudCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW1wb3J0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0ltcG9ydC9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0ltcG9ydC9sb2NhdGlvblVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2VEZWZpbml0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9JbXBvcnQvZVNjaGVtYSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L2dldFNjaGVtYSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0ltcG9ydC9zZXRTY2hlbWEvc2NoZW1hIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZUV4dGVuc2liaWxpdHlFbGVtZW50cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50L2V4dEVsZW1lbnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lucHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PdXRwdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0ZhdWx0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9lSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9nZXRJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0L2lucHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9lT3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L2dldE91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9zZXRPdXRwdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dC9vdXRwdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2VGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2dldEZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQvZmF1bHQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL05hbWVzcGFjZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvcHJlZml4Ii8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0VHlwZSI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2FkZE9wZXJhdGlvbi9vcGVyYXRpb24iLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9uYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vaW5wdXROYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vb3V0cHV0TmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb25zIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24iPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQvZmF1bHQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0UGFyYW1ldGVyT3JkZXJpbmciLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0UGFyYW1ldGVyT3JkZXJpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldFBhcmFtZXRlck9yZGVyaW5nL3BhcmFtZXRlck9yZGVyIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQvaW5wdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldE91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dC9vdXRwdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbnB1dCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvZ2V0TWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JT3V0cHV0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPdXRwdXQvZ2V0TWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lGYXVsdCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvZ2V0TWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWVzc2FnZSI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydC9wYXJ0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMvcGFydE9yZGVyIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUGFydCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvdmFsdWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lTZXJ2aWNlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JU2VydmljZS9hZGRQb3J0L3BvcnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvZ2V0QmluZGluZyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvc2V0QmluZGluZyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0L3NldEJpbmRpbmcvYmluZGluZyIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmciPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2FkZEJpbmRpbmdPcGVyYXRpb24vYmluZGluZ09wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9pbnB1dE5hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9vdXRwdXROYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbnMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldFBvcnRUeXBlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9zZXRQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlL3BvcnRUeXBlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQvYmluZGluZ0ZhdWx0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0L25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbi9vcGVyYXRpb24iLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dC9iaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nT3V0cHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ091dHB1dC9iaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0lucHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ091dHB1dCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdGYXVsdCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2liaWxpdHlFbGVtZW50Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbiI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkQmluZGluZy9iaW5kaW5nIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkSW1wb3J0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkSW1wb3J0L2ltcG9ydERlZiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UvcHJlZml4Ii8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlL3BvcnRUeXBlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2Uvc2VydmljZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0lucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nT3BlcmF0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlSW1wb3J0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlTWVzc2FnZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlT3BlcmF0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBhcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnRUeXBlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVTZXJ2aWNlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZy9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZ3MiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMuMSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMuMS9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2VzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFByZWZpeCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFByZWZpeC9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEV4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5L2V4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RG9jdW1lbnRCYXNlVVJJIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXREb2N1bWVudEJhc2VVUkkiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXREb2N1bWVudEJhc2VVUkkvZG9jdW1lbnRCYXNlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlVHlwZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZy9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlUG9ydFR5cGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFR5cGVzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzL3R5cGVzIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSW1wb3J0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTGlzdCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1hcCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVVSTCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2lvblJlZ2lzdHJ5Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9UeXBlcyI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSXRlcmF0b3IiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lUeXBlcyIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvY2hpbGRyZW4iLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50L3NjaGVtYSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZS9lTWVzc2FnZSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICA8L2dlblBhY2thZ2VzPg0KLTwvZ2VubW9kZWw6R2VuTW9kZWw+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWE2YjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjZ2V0RVBvcnRUeXBlIDxlbT5FUG9ydCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjZ2V0RUJpbmRpbmdPcGVyYXRpb25zIDxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmcoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpbmRpbmcgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5CaW5kaW5newotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRRTmFtZShRTmFtZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdfUU5hbWUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUU5hbWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUU5hbWUgZ2V0UU5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFFOYW1lKFFOYW1lIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5kZWZpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRVbmRlZmluZWQoYm9vbGVhbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdfVW5kZWZpbmVkKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWJvb2xlYW4gaXNVbmRlZmluZWQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3h5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm94eTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFByb3h5KGJvb2xlYW4pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nX1Byb3h5KCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWJvb2xlYW4gaXNQcm94eSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJveHk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFByb3h5KGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFJlc291cmNlVVJJKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdfUmVzb3VyY2VVUkkoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldFJlc291cmNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFJlc291cmNlVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVQb3J0IFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FUG9ydCBUeXBlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUG9ydCBUeXBlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RVBvcnRUeXBlKFBvcnRUeXBlKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ19FUG9ydFR5cGUoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUG9ydFR5cGUgZ2V0RVBvcnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRFUG9ydFR5cGUgPGVtPkVQb3J0IFR5cGU8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFUG9ydFR5cGUoUG9ydFR5cGUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZyBPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbn0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ19FQmluZGluZ09wZXJhdGlvbnMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFQmluZGluZ09wZXJhdGlvbnMoKTsKLQotfSAvLyBCaW5kaW5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGU5NTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZyBGYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQSBmYXVsdCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZhdWx0IHdpdGggdGhlIHNhbWUgbmFtZS4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0RUZhdWx0IDxlbT5FRmF1bHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0ZhdWx0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nRmF1bHQgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5CaW5kaW5nRmF1bHR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0ZhdWx0X05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVGYXVsdDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVGYXVsdDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUZhdWx0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RUZhdWx0KEZhdWx0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpCi0gICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlGYXVsdCBnZXRFRmF1bHQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0RUZhdWx0IDxlbT5FRmF1bHQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUZhdWx0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RUZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVGYXVsdChGYXVsdCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JamF2YXgud3NkbC5GYXVsdCBnZXRGYXVsdCgpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRGYXVsdChqYXZheC53c2RsLkZhdWx0IGZhdWx0KTsKLQotfSAvLyBCaW5kaW5nRmF1bHQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ0lucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMGY0YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ0lucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIElucHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdJbnB1dCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZ0lucHV0IGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnQsIGphdmF4LndzZGwuQmluZGluZ0lucHV0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdJbnB1dF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVJbnB1dChJbnB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdJbnB1dF9FSW5wdXQoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JSW5wdXQgZ2V0RUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFSW5wdXQoSW5wdXQgdmFsdWUpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWphdmF4LndzZGwuSW5wdXQgZ2V0SW5wdXQoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0SW5wdXQoamF2YXgud3NkbC5JbnB1dCBpbnB1dCk7Ci0KLX0gLy8gQmluZGluZ0lucHV0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NGUzYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmcgT3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdJbnB1dCA8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ091dHB1dCA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdGYXVsdHMgPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nT3BlcmF0aW9uIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnQsIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbnsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU9wZXJhdGlvbjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU9wZXJhdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVPcGVyYXRpb24oT3BlcmF0aW9uKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ09wZXJhdGlvbl9FT3BlcmF0aW9uKCkKLSAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU9wZXJhdGlvbiBnZXRFT3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVPcGVyYXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVPcGVyYXRpb24oT3BlcmF0aW9uIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUJpbmRpbmcgSW5wdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FQmluZGluZyBJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdJbnB1dCgpCi0gICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nSW5wdXQgZ2V0RUJpbmRpbmdJbnB1dCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdJbnB1dCA8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFQmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUJpbmRpbmcgT3V0cHV0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBPdXRwdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ09wZXJhdGlvbl9FQmluZGluZ091dHB1dCgpCi0gICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nT3V0cHV0IGdldEVCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ091dHB1dCA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVCaW5kaW5nT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZyBGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBGYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nRmF1bHRzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0ZhdWx0IiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFQmluZGluZ0ZhdWx0cygpOwotCi19IC8vIEJpbmRpbmdPcGVyYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdPdXRwdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdPdXRwdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZGY1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3V0cHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIE91dHB1dDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3V0cHV0I2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ091dHB1dCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZ091dHB1dCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ091dHB1dF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ091dHB1dCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RU91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVPdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVPdXRwdXQ8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFT3V0cHV0KE91dHB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdPdXRwdXRfRU91dHB1dCgpCi0gICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlPdXRwdXQgZ2V0RU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FT3V0cHV0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFT3V0cHV0KE91dHB1dCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JamF2YXgud3NkbC5PdXRwdXQgZ2V0T3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE91dHB1dChqYXZheC53c2RsLk91dHB1dCBvdXRwdXQpOwotCi19IC8vIEJpbmRpbmdPdXRwdXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0RlZmluaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjZjdjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVNZXNzYWdlcyA8ZW0+RU1lc3NhZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RVBvcnRUeXBlcyA8ZW0+RVBvcnQgVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFQmluZGluZ3MgPGVtPkVCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVTZXJ2aWNlcyA8ZW0+RVNlcnZpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RU5hbWVzcGFjZXMgPGVtPkVOYW1lc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RVR5cGVzIDxlbT5FVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFSW1wb3J0cyA8ZW0+RUltcG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbigpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVmaW5pdGlvbiBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb257Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFRhcmdldE5hbWVzcGFjZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX1RhcmdldE5hbWVzcGFjZSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldExvY2F0aW9uKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fTG9jYXRpb24oKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFN0cmluZyBnZXRMb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldExvY2F0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fRW5jb2RpbmcoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldEVuY29kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRFbmNvZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FTWVzc2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FTWVzc2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU1lc3NhZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FTWVzc2FnZXMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFTWVzc2FnZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVBvcnQgVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZX0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX0VQb3J0VHlwZXMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVBvcnRUeXBlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FQmluZGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFQmluZGluZ3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZX0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVNlcnZpY2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVTZXJ2aWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fRVNlcnZpY2VzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuU2VydmljZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVNlcnZpY2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVOYW1lc3BhY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTmFtZXNwYWNlfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FTmFtZXNwYWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FTmFtZXNwYWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVOYW1lc3BhY2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVUeXBlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVR5cGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RVR5cGVzKFR5cGVzKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FVHlwZXMoKQotICAgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JVHlwZXMgZ2V0RVR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFVHlwZXMgPGVtPkVUeXBlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFVHlwZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RVR5cGVzKFR5cGVzIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUltcG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVJbXBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVJbXBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FSW1wb3J0cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLkltcG9ydCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RUltcG9ydHMoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLkRPTURvY3VtZW50IiBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIHBhcmFtZXRlcnM9Im9yZy5lY2xpcHNlLndzZGwuRE9NRG9jdW1lbnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCk7Ci0KLX0gLy8gRGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0V4dGVuc2liaWxpdHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzhjZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0RWxlbWVudFR5cGUgPGVtPkVsZW1lbnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5kcyBXU0RMRWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRSZXF1aXJlZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfUmVxdWlyZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1JlcXVpcmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldEVsZW1lbnRUeXBlKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUU5hbWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRFbGVtZW50VHlwZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldEVsZW1lbnRUeXBlIDxlbT5FbGVtZW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0RWxlbWVudFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgdmFsdWUpOwotCi19IC8vIEV4dGVuc2liaWxpdHlFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9FeHRlbnNpYmxlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRXh0ZW5zaWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzYWYzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9FeHRlbnNpYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbnNpYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQjZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cyA8ZW0+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2libGVFbGVtZW50IGV4dGVuZHMgV1NETEVsZW1lbnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50fS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUxpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpOwotCi19IC8vIEV4dGVuc2libGVFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9GYXVsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3ODY2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9GYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudC4gRmF1bHQgZWxlbWVudHMgc3BlY2lmeSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIGFueSBlcnJvciBtZXNzYWdlcyB0aGF0IG1heSBiZSBvdXRwdXQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RmF1bHQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZhdWx0IGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZSwgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuRmF1bHR7Ci19IC8vIEZhdWx0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9JbXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0ltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzE0NTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0ltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0RURlZmluaXRpb24gPGVtPkVEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCNnZXRFU2NoZW1hIDxlbT5FU2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEltcG9ydCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1wb3J0IGV4dGVuZHMgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuSW1wb3J0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lc3BhY2VVUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0SW1wb3J0X05hbWVzcGFjZVVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldExvY2F0aW9uVVJJKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEltcG9ydF9Mb2NhdGlvblVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FRGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVEZWZpbml0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FRGVmaW5pdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVEZWZpbml0aW9uKERlZmluaXRpb24pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRJbXBvcnRfRURlZmluaXRpb24oKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRGVmaW5pdGlvbiBnZXRFRGVmaW5pdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCNnZXRFRGVmaW5pdGlvbiA8ZW0+RURlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RURlZmluaXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFRGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFRGVmaW5pdGlvbihEZWZpbml0aW9uIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVNjaGVtYTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVTY2hlbWE8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVTY2hlbWE8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFU2NoZW1hKFhTRFNjaGVtYSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEltcG9ydF9FU2NoZW1hKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVhTRFNjaGVtYSBnZXRFU2NoZW1hKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldEVTY2hlbWEgPGVtPkVTY2hlbWE8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVNjaGVtYTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVTY2hlbWEoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RVNjaGVtYShYU0RTY2hlbWEgdmFsdWUpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVhTRFNjaGVtYSBnZXRTY2hlbWEoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpOwotCi19IC8vIEltcG9ydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvSW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0lucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MjgxZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvSW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5wdXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQuIEFuIGlucHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRJbnB1dCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5wdXQgZXh0ZW5kcyBNZXNzYWdlUmVmZXJlbmNlLCBXU0RMRWxlbWVudCwgamF2YXgud3NkbC5JbnB1dHsKLX0gLy8gSW5wdXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2ZTU4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG1lc3NhZ2UgZWxlbWVudC4gQSBXU0RMIG1lc3NhZ2UgaXMgYW4gYWJzdHJhY3QsIHR5cGVkIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgYmVpbmcgY29tbXVuaWNhdGVkLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjZ2V0RVBhcnRzIDxlbT5FUGFydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZSBleHRlbmRzIFdTRExFbGVtZW50LCBqYXZheC53c2RsLk1lc3NhZ2V7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZV9RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZV9VbmRlZmluZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3h5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJveHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3h5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0UHJveHkoYm9vbGVhbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE1lc3NhZ2VfUHJveHkoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm94eTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UHJveHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0UmVzb3VyY2VVUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZV9SZXNvdXJjZVVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVBhcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBhcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVQYXJ0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE1lc3NhZ2VfRVBhcnRzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUGFydCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVBhcnRzKCk7Ci0KLX0gLy8gTWVzc2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvTWVzc2FnZVJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvTWVzc2FnZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWM0MWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2VSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgUmVmZXJlbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2VSZWZlcmVuY2UjZ2V0RU1lc3NhZ2UgPGVtPkVNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE1lc3NhZ2VSZWZlcmVuY2UoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VSZWZlcmVuY2UgZXh0ZW5kcyBXU0RMRWxlbWVudHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlUmVmZXJlbmNlX05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RU1lc3NhZ2UoTWVzc2FnZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE1lc3NhZ2VSZWZlcmVuY2VfRU1lc3NhZ2UoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIE1lc3NhZ2UgZ2V0RU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RU1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFTWVzc2FnZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgc2V0RU1lc3NhZ2UoTWVzc2FnZSB2YWx1ZSk7Ci0KLX0gLy8gTWVzc2FnZVJlZmVyZW5jZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9OYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzMDA1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9OYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTmFtZXNwYWNlI2dldFVSSSA8ZW0+VVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk5hbWVzcGFjZSNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXROYW1lc3BhY2UoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVzcGFjZSBleHRlbmRzIEVPYmplY3R7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVSSShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXROYW1lc3BhY2VfVVJJKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXRVUkkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UjZ2V0VVJJIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0VVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFVSSShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFByZWZpeChTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXROYW1lc3BhY2VfUHJlZml4KCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXRQcmVmaXgoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UHJlZml4KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgdmFsdWUpOwotCi19IC8vIE5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyZTdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50LiBBIFdTREwgb3BlcmF0aW9uIGlzIGFuIGFic3RyYWN0IGRlc2NyaXB0aW9uIG9mIGFuIGFjdGlvbiBzdXBwb3J0ZWQgYnkgYSBzZXJ2aWNlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRFT3V0cHV0IDxlbT5FT3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRFRmF1bHRzIDxlbT5FRmF1bHRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRFUGFyYW1ldGVyT3JkZXJpbmcgPGVtPkVQYXJhbWV0ZXIgT3JkZXJpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPcGVyYXRpb24gZXh0ZW5kcyBXU0RMRWxlbWVudCwgamF2YXgud3NkbC5PcGVyYXRpb257Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0eWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFN0eWxlKE9wZXJhdGlvblR5cGUpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRPcGVyYXRpb25fU3R5bGUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uVHlwZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlPcGVyYXRpb25UeXBlIGdldFN0eWxlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFN0eWxlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFN0eWxlKE9wZXJhdGlvblR5cGUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuZGVmaW5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0VW5kZWZpbmVkKGJvb2xlYW4pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRPcGVyYXRpb25fVW5kZWZpbmVkKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWJvb2xlYW4gaXNVbmRlZmluZWQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3h5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJveHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3h5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0UHJveHkoYm9vbGVhbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE9wZXJhdGlvbl9Qcm94eSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlib29sZWFuIGlzUHJveHkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJveHk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFByb3h5KGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFJlc291cmNlVVJJKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE9wZXJhdGlvbl9SZXNvdXJjZVVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRSZXNvdXJjZVVSSShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FSW5wdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FSW5wdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVJbnB1dChJbnB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE9wZXJhdGlvbl9FSW5wdXQoKQotICAgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JSW5wdXQgZ2V0RUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFSW5wdXQoSW5wdXQgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FT3V0cHV0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU91dHB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU91dHB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVPdXRwdXQoT3V0cHV0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX0VPdXRwdXQoKQotICAgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JT3V0cHV0IGdldEVPdXRwdXQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FT3V0cHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFT3V0cHV0KE91dHB1dCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5GYXVsdH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUZhdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FRmF1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX0VGYXVsdHMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5GYXVsdCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RUZhdWx0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FUGFyYW1ldGVyIE9yZGVyaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBhcmFtZXRlciBPcmRlcmluZzwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLlBhcnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCk7Ci0KLX0gLy8gT3BlcmF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9PdXRwdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL091dHB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA5ZGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL091dHB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRPdXRwdXQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dHB1dCBleHRlbmRzIE1lc3NhZ2VSZWZlcmVuY2UsIFdTRExFbGVtZW50LCBqYXZheC53c2RsLk91dHB1dHsKLX0gLy8gT3V0cHV0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9QYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9QYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NWIwOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFbGVtZW50TmFtZSA8ZW0+RWxlbWVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldFR5cGVEZWZpbml0aW9uIDxlbT5UeXBlIERlZmluaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFbGVtZW50RGVjbGFyYXRpb24gPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFTWVzc2FnZSA8ZW0+RU1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFydCBleHRlbmRzIFdTRExFbGVtZW50LCBqYXZheC53c2RsLlBhcnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRFbGVtZW50TmFtZShRTmFtZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBhcnRfRWxlbWVudE5hbWUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUU5hbWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUU5hbWUgZ2V0RWxlbWVudE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldEVsZW1lbnROYW1lIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0RWxlbWVudE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RWxlbWVudE5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFR5cGVOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydF9UeXBlTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRUeXBlTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRUeXBlTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRUeXBlTmFtZShRTmFtZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgRGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIERlZmluaXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBhcnRfVHlwZURlZmluaXRpb24oKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFhTRFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRUeXBlRGVmaW5pdGlvbiA8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIERlZmluaXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRUeXBlRGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgc2V0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IERlY2xhcmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFbGVtZW50RGVjbGFyYXRpb24gPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICB2b2lkIHNldEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FTWVzc2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVNZXNzYWdlKE1lc3NhZ2UpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRQYXJ0X0VNZXNzYWdlKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU1lc3NhZ2UgZ2V0RU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FTWVzc2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVNZXNzYWdlKE1lc3NhZ2UgdmFsdWUpOwotCi19IC8vIFBhcnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1BvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhNjFmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Qb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnQgZWxlbWVudC4gQSBwb3J0IGRlZmluZXMgYW4gaW5kaXZpZHVhbCBlbmRwb2ludCBieSBzcGVjaWZ5aW5nIGEgc2luZ2xlIGFkZHJlc3MgZm9yIGEgYmluZGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnQjZ2V0RUJpbmRpbmcgPGVtPkVCaW5kaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvcnQgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5Qb3J0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRfTmFtZSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVCaW5kaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUJpbmRpbmc8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RUJpbmRpbmcoQmluZGluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRfRUJpbmRpbmcoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JQmluZGluZyBnZXRFQmluZGluZygpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnQjZ2V0RUJpbmRpbmcgPGVtPkVCaW5kaW5nPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RUJpbmRpbmcoQmluZGluZyB2YWx1ZSk7Ci0KLX0gLy8gUG9ydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUG9ydFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1BvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjNiMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0VHlwZSBlbGVtZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjEgYW5kIGFuIEludGVyZmFjZSBjb21wb25lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMi4gQSBwb3J0IHR5cGUgb3IgSW50ZXJmYWNlIGlzIGEgbmFtZWQgc2V0IG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgYW5kIHRoZSBhYnN0cmFjdCBtZXNzYWdlcyBpbnZvbHZlZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUjZ2V0RU9wZXJhdGlvbnMgPGVtPkVPcGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRUeXBlKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb3J0VHlwZSBleHRlbmRzIFdTRExFbGVtZW50LCBqYXZheC53c2RsLlBvcnRUeXBlewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRRTmFtZShRTmFtZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRUeXBlX1FOYW1lKCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLlFOYW1lIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVFOYW1lIGdldFFOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydFR5cGVfVW5kZWZpbmVkKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWJvb2xlYW4gaXNVbmRlZmluZWQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJveHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm94eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJveHk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRQcm94eShib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydFR5cGVfUHJveHkoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJveHk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFByb3h5KGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFJlc291cmNlVVJJKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRUeXBlX1Jlc291cmNlVVJJKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXRSZXNvdXJjZVVSSSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb259LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVPcGVyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVPcGVyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydFR5cGVfRU9wZXJhdGlvbnMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVPcGVyYXRpb25zKCk7Ci0KLX0gLy8gUG9ydFR5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1NlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjMTUxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjZ2V0RVBvcnRzIDxlbT5FUG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0U2VydmljZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZSBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLlNlcnZpY2V7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0U2VydmljZV9RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0U2VydmljZV9VbmRlZmluZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3h5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJveHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3h5PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0UHJveHkoYm9vbGVhbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFNlcnZpY2VfUHJveHkoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm94eTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UHJveHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0UmVzb3VyY2VVUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0U2VydmljZV9SZXNvdXJjZVVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5TZXJ2aWNlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFNlcnZpY2VfRVBvcnRzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUG9ydCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVBvcnRzKCk7Ci0KLX0gLy8gU2VydmljZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1R5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOTEwNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFR5cGVzKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlcyBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLlR5cGVzewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIHBhcmFtZXRlcnM9IiIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlMaXN0IGdldFNjaGVtYXMoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUxpc3QgZ2V0U2NoZW1hcyhTdHJpbmcgbmFtZXNwYWNlVVJJKTsKLQotfSAvLyBUeXBlcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2ZjljYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50I2dldFBhcmVudCA8ZW0+UGFyZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRDaGlsZHJlbiA8ZW0+Q2hpbGRyZW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoaWxkcmVuPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50fS4KLSAgICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0UGFyZW50IDxlbT5QYXJlbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hpbGRyZW48L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hpbGRyZW48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRfQ2hpbGRyZW4oKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50I2dldFBhcmVudAotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIG9wcG9zaXRlPSJwYXJlbnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVMaXN0IGdldENoaWxkcmVuKCk7Ci0KLX0gLy8gVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0NWJhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBsYW5ndWFnZSBlbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuV1NETEVsZW1lbnQjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5XU0RMRWxlbWVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFdTRExFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMRWxlbWVudCBleHRlbmRzIEVPYmplY3R7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldERvY3VtZW50YXRpb25FbGVtZW50KEVsZW1lbnQpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRXU0RMRWxlbWVudF9Eb2N1bWVudGF0aW9uRWxlbWVudCgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5ET01FbGVtZW50IgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVsZW1lbnQgZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5XU0RMRWxlbWVudCNnZXREb2N1bWVudGF0aW9uRWxlbWVudCA8ZW0+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldERvY3VtZW50YXRpb25FbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldERvY3VtZW50YXRpb25FbGVtZW50KEVsZW1lbnQgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBUaGlzIGlzIHRoZSB1bmRlcmx5aW5nIERPTSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvbmVudCwgCi0gICAqIGkuZS4sIHRoZSB7QGxpbmsgI3VwZGF0ZUVsZW1lbnQoKSBzZXJpYWxpemF0aW9ufSBvZiB0aGlzIGNvbXBvbmVudC4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldEVsZW1lbnQoRWxlbWVudCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFdTRExFbGVtZW50X0VsZW1lbnQoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuRE9NRWxlbWVudCIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuV1NETEVsZW1lbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldEVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRGVmaW5pdGlvbiBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVuY2xvc2luZ0RlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKTsKLQotICAvKioKLSAgICogRW5zdXJlcyB0aGF0IHRoZSB1bmRlcmx5aW5nIERPTSB7QGxpbmsgI2dldEVsZW1lbnQgZWxlbWVudH0gYm90aCBleGlzdHMgYW5kIGlzIHVwLXRvLWRhdGUgd2l0aCByZXNwZWN0IHRvIHRoZSBtb2RlbCwKLSAgICogaS5lLiwgaXQgc2VyaWFsaXplcyB0aGUgY29tcG9uZW50IGFuZCBtYWludGFpbnMgYW4gYXNzb2NpYXRpb24gd2l0aCB0aGF0IHNlcmlhbGl6YXRpb24uCi0gICAqIEBzZWUgI3VwZGF0ZUVsZW1lbnQoYm9vbGVhbikKLSAgICogQHNlZSAjZ2V0RWxlbWVudAotICAgKi8KLSAgdm9pZCB1cGRhdGVFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIEVuc3VyZXMgdGhhdCB0aGUgdW5kZXJseWluZyBET00ge0BsaW5rICNnZXRFbGVtZW50IGVsZW1lbnR9IGJvdGggZXhpc3RzIGFuZCBpcyB1cC10by1kYXRlIHdpdGggcmVzcGVjdCB0byB0aGUgbW9kZWwsCi0gICAqIGkuZS4sIGl0IHNlcmlhbGl6ZXMgdGhlIGNvbXBvbmVudCBhbmQgbWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIHdpdGggdGhhdCBzZXJpYWxpemF0aW9uLgotICAgKiBGb3IgPGNvZGU+ZGVlcCA9PSB0cnVlPC9jb2RlPiwgCi0gICAqIG9yIHdoZW4gPGNvZGU+e0BsaW5rICNnZXRFbGVtZW50IGdldEVsZW1lbnQoKX0gPT0gbnVsbDwvY29kZT4sIAotICAgKiB0aGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMge0BsaW5rICN1cGRhdGVFbGVtZW50KCl9OwotICAgKiBvdGhlcndpc2UsIGl0IHVwZGF0ZXMganVzdCB0aGUgRE9NIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcG9uZW50IHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdGUuCi0gICAqIEBzZWUgI3VwZGF0ZUVsZW1lbnQoKQotICAgKiBAc2VlICNnZXRFbGVtZW50Ci0gICAqLwotICB2b2lkIHVwZGF0ZUVsZW1lbnQoYm9vbGVhbiBkZWVwKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogVGhpcyByZXByZXNlbnRzIHRoZSBjb25jcmV0ZSBjb250YWluZXIgb2YgdGhpcyBjb21wb25lbnQsIAotICAgKiBpLmUuLCB0aGUgaW52ZXJzZSBvZiB0aGUgYmxhY2sgZGlhbW9uZCByZWxhdGlvbnMgaW4gdGhlIFVNTCBtb2RlbC4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIHJlZmVyZW5jZS4KLSAgICovCi0gIFdTRExFbGVtZW50IGdldENvbnRhaW5lcigpOwotICAKLSAgLyoqCi0gICAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGhhcyBjaGFuZ2VkOwotICAgKiB0aGUgZWxlbWVudCBzaG91bGQgdHlwaWNhbGx5IGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgcmV0dXJuZWQge0BsaW5rICNnZXRFbGVtZW50fS4KLSAgICogSXQgaXMgZXhwZWN0ZWQgdGhhdCBjbGllbnRzIHdpbGwgbm90IGNhbGwgdGhpcyB0aGVtc2VsdmVzIAotICAgKiBzaW5jZSB0aGUgRE9NIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGUgdW5kZXJseWluZyBET00gd2lsbCBpbnZva2UgdGhlc2UgYXV0b21hdGljYWxseS4KLSAgICovCi0gIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCk7Ci0KLX0gLy8gV1NETEVsZW1lbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmM2ODY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeXsKLSAgLyoqCi0gICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JV1NETEZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEZhY3RvcnlJbXBsKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydCBUeXBlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgVHlwZTwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlQb3J0VHlwZSBjcmVhdGVQb3J0VHlwZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZTwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJ0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcnQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUGFydCBjcmVhdGVQYXJ0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUJpbmRpbmcgY3JlYXRlQmluZGluZygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUJpbmRpbmdPcGVyYXRpb24gY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmljZTwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUG9ydCBjcmVhdGVQb3J0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWZpbml0aW9uPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCURlZmluaXRpb24gY3JlYXRlRGVmaW5pdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltcG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbXBvcnQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JSW1wb3J0IGNyZWF0ZUltcG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklucHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklucHV0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUlucHV0IGNyZWF0ZUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dHB1dDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlPdXRwdXQgY3JlYXRlT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRmF1bHQgY3JlYXRlRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmcgSW5wdXQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JQmluZGluZ0lucHV0IGNyZWF0ZUJpbmRpbmdJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUJpbmRpbmdPdXRwdXQgY3JlYXRlQmluZGluZ091dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZyBGYXVsdDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nRmF1bHQgY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TmFtZXNwYWNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlOYW1lc3BhY2UgY3JlYXRlTmFtZXNwYWNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHlwZXM8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHlwZXM8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JVHlwZXMgY3JlYXRlVHlwZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JV1NETFBhY2thZ2UgZ2V0V1NETFBhY2thZ2UoKTsKLQotfSAvL1dTRExGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGFja2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmNjhjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgV1NETCBtb2RlbCBjb250YWlucyBjbGFzc2VzIGZvciB0aGUgV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIChXU0RMKS4KLSAqIAotICogV1NETCBkZXNjcmliZXMgbmV0d29yayBzZXJ2aWNlcyBhcyBzZXRzIG9mIGVuZHBvaW50cyBvcGVyYXRpbmcgb24gbWVzc2FnZXMuIFRoZSBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBhcmUgZGVzY3JpYmVkIGFic3RyYWN0bHksIGFuZCB0aGVuIGJvdW5kIHRvIGEgY29uY3JldGUgbmV0d29yayBwcm90b2NvbCBhbmQgbWVzc2FnZSBmb3JtYXQgdG8gZGVmaW5lIGFuIGVuZHBvaW50LgotICogCi0gKiBXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLgotICogCi0gKiBUaGUgbW9kZWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkaWFncmFtcywgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcHRlcnMgaW4gdGhlIFdTREwgMS4xIHNwZWNpZmljYXRpb24gKGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvTk9URS13c2RsLTIwMDEwMzE1KQotICogLSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUKLSAqIC0gMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nLCBzaG93cyB0aGUgbmFtZXNwYWNlIGFuZCBpbXBvcnQgbWVjaGFuaXNtCi0gKiAtIDIuMS4zIEV4dGVuc2liaWxpdHksIHNob3dzIHRoZSBXU0RMIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtCi0gKiAtIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwKLSAqIC0gMi4zIE1lc3NhZ2VzLCAyLjQgUG9ydFR5cGVzLCAyLjUgQmluZGluZ3MgYW5kIDIuNyBTZXJ2aWNlcywgc2hvdyB0aGUgbWFqb3IgV1NETCBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zLgotICogCi0gKiBUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMRmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UKLXsKLSAgLyoqCi0gICAqIFRoZSBwYWNrYWdlIG5hbWUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBTdHJpbmcgZU5BTUUgPSAid3NkbCI7Ci0KLSAgLyoqCi0gICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL1dTREwiOwotCi0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFN0cmluZyBlTlNfUFJFRklYID0gIndzZGwiOwotCi0gIC8qKgotICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgV1NETFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMUGFja2FnZUltcGwuaW5pdCgpOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5XU0RMRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExFbGVtZW50SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFdTRExFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFdTRExfRUxFTUVOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgV1NETF9FTEVNRU5UX19FTEVNRU5UID0gMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlBvcnRUeXBlSW1wbCA8ZW0+UG9ydCBUeXBlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5Qb3J0VHlwZUltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEUgPSAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9UWVBFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9fUU5BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfX1VOREVGSU5FRCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3h5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9UWVBFX19QUk9YWSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9fUkVTT1VSQ0VfVVJJID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9fRU9QRVJBVElPTlMgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UG9ydCBUeXBlPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9GRUFUVVJFX0NPVU5UID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCA8ZW0+T3BlcmF0aW9uPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5PcGVyYXRpb25JbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTiA9IDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19TVFlMRSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fX05BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fX1VOREVGSU5FRCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3h5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19QUk9YWSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fUkVTT1VSQ0VfVVJJID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUlucHV0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19FSU5QVVQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3V0cHV0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19FT1VUUFVUID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19FRkFVTFRTID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhcmFtZXRlciBPcmRlcmluZzwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19FUEFSQU1FVEVSX09SREVSSU5HID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLk1lc3NhZ2VJbXBsIDxlbT5NZXNzYWdlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5NZXNzYWdlSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgTUVTU0FHRSA9IDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19FTEVNRU5UID0gV1NETF9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19RTkFNRSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuZGVmaW5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfX1VOREVGSU5FRCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3h5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9fUFJPWFkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19SRVNPVVJDRV9VUkkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfX0VQQVJUUyA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NZXNzYWdlPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlBhcnRJbXBsIDxlbT5QYXJ0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5QYXJ0SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgUEFSVCA9IDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19FTEVNRU5UID0gV1NETF9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBBUlRfX05BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19FTEVNRU5UX05BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19UWVBFX05BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIERlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19UWVBFX0RFRklOSVRJT04gPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IERlY2xhcmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fRUxFTUVOVF9ERUNMQVJBVElPTiA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fRU1FU1NBR0UgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UGFydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX0ZFQVRVUkVfQ09VTlQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5FeHRlbnNpYmxlRWxlbWVudEltcGwgPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRXh0ZW5zaWJsZUVsZW1lbnRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgRVhURU5TSUJMRV9FTEVNRU5UID0gMTI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdJbXBsIDxlbT5CaW5kaW5nPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgQklORElORyA9IDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fUU5BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19VTkRFRklORUQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfX1BST1hZID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fUkVTT1VSQ0VfVVJJID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBvcnQgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfX0VQT1JUX1RZUEUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZyBPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19FQklORElOR19PUEVSQVRJT05TID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJpbmRpbmc8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwgPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nT3BlcmF0aW9uSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEJpbmRpbmdPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgQklORElOR19PUEVSQVRJT04gPSA2OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PUEVSQVRJT05fX05BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PUEVSQVRJT05fX0VPUEVSQVRJT04gPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZyBJbnB1dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVCaW5kaW5nIE91dHB1dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZyBGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19GQVVMVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlNlcnZpY2VJbXBsIDxlbT5TZXJ2aWNlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5TZXJ2aWNlSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgU0VSVklDRSA9IDc7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFNFUlZJQ0VfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fUU5BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19VTkRFRklORUQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFNFUlZJQ0VfX1BST1hZID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fUkVTT1VSQ0VfVVJJID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19FUE9SVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+U2VydmljZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5Qb3J0SW1wbCA8ZW0+UG9ydDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuUG9ydEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRQb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFBPUlQgPSA4OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9fTkFNRSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVCaW5kaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9fRUJJTkRJTkcgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UG9ydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgRVhURU5TSUJJTElUWV9FTEVNRU5UID0gOTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UID0gV1NETF9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwgPGVtPkRlZmluaXRpb248L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OID0gMTA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19MT0NBVElPTiA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fUU5BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VOQ09ESU5HID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU1lc3NhZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FTUVTU0FHRVMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUG9ydCBUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRVBPUlRfVFlQRVMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VCSU5ESU5HUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTZXJ2aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRVNFUlZJQ0VTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU5hbWVzcGFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VOQU1FU1BBQ0VTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRVRZUEVTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUltcG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VJTVBPUlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5EZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5JbXBvcnRJbXBsIDxlbT5JbXBvcnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkltcG9ydEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJbXBvcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU1QT1JUID0gMTE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElNUE9SVF9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfX05BTUVTUEFDRV9VUkkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfX0xPQ0FUSU9OX1VSSSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVEZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1QT1JUX19FREVGSU5JVElPTiA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTY2hlbWE8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfX0VTQ0hFTUEgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW1wb3J0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElNUE9SVF9GRUFUVVJFX0NPVU5UID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuTWVzc2FnZVJlZmVyZW5jZUltcGwgPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5NZXNzYWdlUmVmZXJlbmNlSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE1lc3NhZ2VSZWZlcmVuY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9SRUZFUkVOQ0UgPSA0NjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX1JFRkVSRU5DRV9fTkFNRSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5JbnB1dEltcGwgPGVtPklucHV0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5JbnB1dEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJTlBVVCA9IDEzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IE1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU5QVVRfX0VMRU1FTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTlBVVF9fTkFNRSA9IE1FU1NBR0VfUkVGRVJFTkNFX19OQU1FOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTlBVVF9fRU1FU1NBR0UgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0U7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW5wdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU5QVVRfRkVBVFVSRV9DT1VOVCA9IE1FU1NBR0VfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuT3V0cHV0SW1wbCA8ZW0+T3V0cHV0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5PdXRwdXRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0T3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE9VVFBVVCA9IDE0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9VVFBVVF9fRUxFTUVOVCA9IE1FU1NBR0VfUkVGRVJFTkNFX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9VVFBVVF9fTkFNRSA9IE1FU1NBR0VfUkVGRVJFTkNFX19OQU1FOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPVVRQVVRfX0VNRVNTQUdFID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk91dHB1dDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPVVRQVVRfRkVBVFVSRV9DT1VOVCA9IE1FU1NBR0VfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRmF1bHRJbXBsIDxlbT5GYXVsdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRmF1bHRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgRkFVTFQgPSAxNTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEZBVUxUX19FTEVNRU5UID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRkFVTFRfX05BTUUgPSBNRVNTQUdFX1JFRkVSRU5DRV9fTkFNRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRkFVTFRfX0VNRVNTQUdFID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEZBVUxUX0ZFQVRVUkVfQ09VTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdJbnB1dEltcGwgPGVtPkJpbmRpbmcgSW5wdXQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdJbnB1dEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRCaW5kaW5nSW5wdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgQklORElOR19JTlBVVCA9IDE2OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19JTlBVVF9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0lOUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19JTlBVVF9fTkFNRSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVRfX0VJTlBVVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nIElucHV0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVRfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdPdXRwdXRJbXBsIDxlbT5CaW5kaW5nIE91dHB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ091dHB1dEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRCaW5kaW5nT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1VUUFVUID0gMTc7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09VVFBVVF9fTkFNRSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09VVFBVVF9fRU9VVFBVVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nIE91dHB1dDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09VVFBVVF9GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ0ZhdWx0SW1wbCA8ZW0+QmluZGluZyBGYXVsdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ0ZhdWx0SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEJpbmRpbmdGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0ZBVUxUID0gMTg7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0ZBVUxUX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfRkFVTFRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0ZBVUxUX19OQU1FID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUZhdWx0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVF9fRUZBVUxUID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVF9GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuTmFtZXNwYWNlSW1wbCA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5OYW1lc3BhY2VJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0TmFtZXNwYWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE5BTUVTUEFDRSA9IDE5OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTkFNRVNQQUNFX19VUkkgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTkFNRVNQQUNFX19QUkVGSVggPSAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBOQU1FU1BBQ0VfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0VHlwZSA8ZW0+SVBvcnQgVHlwZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuUG9ydFR5cGUKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJUG9ydFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVBPUlRfVFlQRSA9IDIwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklQb3J0IFR5cGU8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVBPUlRfVFlQRV9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLk9wZXJhdGlvbiA8ZW0+SU9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuT3BlcmF0aW9uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SU9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJT1BFUkFUSU9OID0gMjE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuSW5wdXQgPGVtPklJbnB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuSW5wdXQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJSW5wdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUlOUFVUID0gMjI7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUlucHV0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElJTlBVVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLk91dHB1dCA8ZW0+SU91dHB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuT3V0cHV0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJT1VUUFVUID0gMjM7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU91dHB1dDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJT1VUUFVUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuRmF1bHQgPGVtPklGYXVsdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuRmF1bHQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUZBVUxUID0gMjQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElGQVVMVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLk1lc3NhZ2UgPGVtPklNZXNzYWdlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5NZXNzYWdlCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SU1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU1FU1NBR0UgPSAyNTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JTWVzc2FnZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTUVTU0FHRV9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLlBhcnQgPGVtPklQYXJ0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5QYXJ0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SVBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVBBUlQgPSAyNjsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JUGFydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJUEFSVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLlNlcnZpY2UgPGVtPklTZXJ2aWNlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5TZXJ2aWNlCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SVNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVNFUlZJQ0UgPSAyNzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JU2VydmljZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJU0VSVklDRV9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLlBvcnQgPGVtPklQb3J0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5Qb3J0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SVBvcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVBPUlQgPSAyODsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JUG9ydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJUE9SVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmcgPGVtPklCaW5kaW5nPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUJJTkRJTkcgPSAyOTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JQmluZGluZzwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJQklORElOR19GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElCaW5kaW5nT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElCSU5ESU5HX09QRVJBVElPTiA9IDMwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJQklORElOR19PUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgPGVtPklCaW5kaW5nIElucHV0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJQmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElCSU5ESU5HX0lOUFVUID0gMzE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUJpbmRpbmcgSW5wdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfSU5QVVRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IDxlbT5JQmluZGluZyBPdXRwdXQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJQmluZGluZ091dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJQklORElOR19PVVRQVVQgPSAzMjsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JQmluZGluZyBPdXRwdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfT1VUUFVUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IDxlbT5JQmluZGluZyBGYXVsdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUJpbmRpbmdGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJQklORElOR19GQVVMVCA9IDMzOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklCaW5kaW5nIEZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElCSU5ESU5HX0ZBVUxUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJRVhURU5TSUJJTElUWV9FTEVNRU5UID0gMzQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuRGVmaW5pdGlvbiA8ZW0+SURlZmluaXRpb248L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLkRlZmluaXRpb24KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJRGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJREVGSU5JVElPTiA9IDM1OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElERUZJTklUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuSW1wb3J0IDxlbT5JSW1wb3J0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5JbXBvcnQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJSW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElJTVBPUlQgPSAzNjsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSW1wb3J0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElJTVBPUlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YS51dGlsLkxpc3QgPGVtPklMaXN0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YS51dGlsLkxpc3QKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJTGlzdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJTElTVCA9IDM3OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklMaXN0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElMSVNUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmEudXRpbC5NYXAgPGVtPklNYXA8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZhLnV0aWwuTWFwCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SU1hcCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJTUFQID0gMzg7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU1hcDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTUFQX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmEubmV0LlVSTCA8ZW0+SVVSTDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmEubmV0LlVSTAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElVUkwoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVVSTCA9IDM5OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklVUkw8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVVSTF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgPGVtPklFeHRlbnNpb24gUmVnaXN0cnk8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJRXh0ZW5zaW9uUmVnaXN0cnkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUVYVEVOU0lPTl9SRUdJU1RSWSA9IDQwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklFeHRlbnNpb24gUmVnaXN0cnk8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUVYVEVOU0lPTl9SRUdJU1RSWV9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlR5cGVzSW1wbCA8ZW0+VHlwZXM8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlR5cGVzSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFR5cGVzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFRZUEVTID0gNDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBUWVBFU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVFlQRVNfX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVFlQRVNfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UeXBlczwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBUWVBFU19GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmEudXRpbC5JdGVyYXRvciA8ZW0+SUl0ZXJhdG9yPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUl0ZXJhdG9yKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElJVEVSQVRPUiA9IDQyOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklJdGVyYXRvcjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJSVRFUkFUT1JfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5UeXBlcyA8ZW0+SVR5cGVzPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5UeXBlcwotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElUeXBlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJVFlQRVMgPSA0MzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JVHlwZXM8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVRZUEVTX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCA8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQgPSA0NDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBVTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVCA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEUgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoaWxkcmVuPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBVTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fQ0hJTERSRU4gPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCA8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UID0gNDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRCA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UU5hbWU8L2VtPicgZGF0YSB0eXBlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgUU5BTUUgPSA0NzsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5PcGVyYXRpb24gVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE9wZXJhdGlvblR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX1RZUEUgPSA0ODsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5ET00gRWxlbWVudDwvZW0+JyBkYXRhIHR5cGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRET01FbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IERPTV9FTEVNRU5UID0gNDk7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RXhjZXB0aW9uPC9lbT4nIGRhdGEgdHlwZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0V1NETEV4Y2VwdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBXU0RMX0VYQ0VQVElPTiA9IDUwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRPTSBEb2N1bWVudDwvZW0+JyBkYXRhIHR5cGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RE9NRG9jdW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgRE9NX0RPQ1VNRU5UID0gNTE7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFdTRExFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCNnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpCi0gICAqIEBzZWUgI2dldFdTRExFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMRWxlbWVudF9Eb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50I2dldEVsZW1lbnQoKQotICAgKiBAc2VlICNnZXRXU0RMRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0V1NETEVsZW1lbnRfRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSA8ZW0+UG9ydCBUeXBlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcnQgVHlwZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0UG9ydFR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5RTmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNnZXRRTmFtZSgpCi0gICAqIEBzZWUgI2dldFBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9RTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmRlZmluZWQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjaXNVbmRlZmluZWQoKQotICAgKiBAc2VlICNnZXRQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm94eTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNpc1Byb3h5KCkKLSAgICogQHNlZSAjZ2V0UG9ydFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFBvcnRUeXBlX1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBzZWUgI2dldFBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9SZXNvdXJjZVVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0RU9wZXJhdGlvbnMgPGVtPkVPcGVyYXRpb25zPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FT3BlcmF0aW9uczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNnZXRFT3BlcmF0aW9ucygpCi0gICAqIEBzZWUgI2dldFBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRQb3J0VHlwZV9FT3BlcmF0aW9ucygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3R5bGU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldFN0eWxlKCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRPcGVyYXRpb25fU3R5bGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldE5hbWUoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmRlZmluZWQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2lzVW5kZWZpbmVkKCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRPcGVyYXRpb25fVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2lzUHJveHkgPGVtPlByb3h5PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJveHk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2lzUHJveHkoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9Qcm94eSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBzZWUgI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0T3BlcmF0aW9uX1Jlc291cmNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RUlucHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRFSW5wdXQoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FSW5wdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVPdXRwdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVPdXRwdXQoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0RUZhdWx0cyA8ZW0+RUZhdWx0czwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RUZhdWx0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0RUZhdWx0cygpCi0gICAqIEBzZWUgI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0T3BlcmF0aW9uX0VGYXVsdHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRFUGFyYW1ldGVyT3JkZXJpbmcgPGVtPkVQYXJhbWV0ZXIgT3JkZXJpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVQYXJhbWV0ZXIgT3JkZXJpbmc8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVQYXJhbWV0ZXJPcmRlcmluZygpCi0gICAqIEBzZWUgI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1lc3NhZ2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0TWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UU5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNnZXRRTmFtZSgpCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE1lc3NhZ2VfUU5hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmRlZmluZWQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNpc1VuZGVmaW5lZCgpCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE1lc3NhZ2VfVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb3h5PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjaXNQcm94eSgpCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE1lc3NhZ2VfUHJveHkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE1lc3NhZ2VfUmVzb3VyY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjZ2V0RVBhcnRzIDxlbT5FUGFydHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVQYXJ0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2dldEVQYXJ0cygpCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldE1lc3NhZ2VfRVBhcnRzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQgPGVtPlBhcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFydDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRQYXJ0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldE5hbWUoKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQYXJ0X05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldEVsZW1lbnROYW1lIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRFbGVtZW50TmFtZSgpCi0gICAqIEBzZWUgI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFBhcnRfRWxlbWVudE5hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldFR5cGVOYW1lIDxlbT5UeXBlIE5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIE5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRUeXBlTmFtZSgpCi0gICAqIEBzZWUgI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFBhcnRfVHlwZU5hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldFR5cGVEZWZpbml0aW9uIDxlbT5UeXBlIERlZmluaXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UeXBlIERlZmluaXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRUeXBlRGVmaW5pdGlvbigpCi0gICAqIEBzZWUgI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldFBhcnRfVHlwZURlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldEVsZW1lbnREZWNsYXJhdGlvbiA8ZW0+RWxlbWVudCBEZWNsYXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRQYXJ0X0VsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0RU1lc3NhZ2UgPGVtPkVNZXNzYWdlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RU1lc3NhZ2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRFTWVzc2FnZSgpCi0gICAqIEBzZWUgI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldFBhcnRfRU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyA8ZW0+QmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEJpbmRpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlFOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0UU5hbWUoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1FOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5kZWZpbmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjaXNVbmRlZmluZWQoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm94eTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2lzUHJveHkoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1Jlc291cmNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyNnZXRFUG9ydFR5cGUgPGVtPkVQb3J0IFR5cGU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FUG9ydCBUeXBlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0RVBvcnRUeXBlKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ19FUG9ydFR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0RUJpbmRpbmdPcGVyYXRpb25zIDxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ19FQmluZGluZ09wZXJhdGlvbnMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiA8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0QmluZGluZ09wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ09wZXJhdGlvbl9OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RU9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVPcGVyYXRpb24oKQotICAgKiBAc2VlICNnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRCaW5kaW5nT3BlcmF0aW9uX0VPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVCaW5kaW5nSW5wdXQgPGVtPkVCaW5kaW5nIElucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0lucHV0KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FQmluZGluZ0lucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ091dHB1dCA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdPdXRwdXQoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVCaW5kaW5nRmF1bHRzIDxlbT5FQmluZGluZyBGYXVsdHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVCaW5kaW5nRmF1bHRzKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FQmluZGluZ0ZhdWx0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlIDxlbT5TZXJ2aWNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZpY2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0U2VydmljZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UU5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNnZXRRTmFtZSgpCi0gICAqIEBzZWUgI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VfUU5hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmRlZmluZWQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNpc1VuZGVmaW5lZCgpCi0gICAqIEBzZWUgI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VfVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb3h5PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjaXNQcm94eSgpCi0gICAqIEBzZWUgI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VfUHJveHkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBzZWUgI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VfUmVzb3VyY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjZ2V0RVBvcnRzIDxlbT5FUG9ydHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVQb3J0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2dldEVQb3J0cygpCi0gICAqIEBzZWUgI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VfRVBvcnRzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQgPGVtPlBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRQb3J0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0I2dldE5hbWUoKQotICAgKiBAc2VlICNnZXRQb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0X05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0I2dldEVCaW5kaW5nIDxlbT5FQmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVCaW5kaW5nPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQjZ2V0RUJpbmRpbmcoKQotICAgKiBAc2VlICNnZXRQb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRQb3J0X0VCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2lzUmVxdWlyZWQgPGVtPlJlcXVpcmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVxdWlyZWQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjaXNSZXF1aXJlZCgpCi0gICAqIEBzZWUgI2dldEV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudF9SZXF1aXJlZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldEVsZW1lbnRUeXBlIDxlbT5FbGVtZW50IFR5cGU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbGVtZW50IFR5cGU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0RWxlbWVudFR5cGUoKQotICAgKiBAc2VlICNnZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiA8ZW0+RGVmaW5pdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWZpbml0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldERlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX1RhcmdldE5hbWVzcGFjZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRMb2NhdGlvbigpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldERlZmluaXRpb25fTG9jYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlFOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0UU5hbWUoKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX1FOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmNvZGluZzwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVuY29kaW5nKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0RGVmaW5pdGlvbl9FbmNvZGluZygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFTWVzc2FnZXMgPGVtPkVNZXNzYWdlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RU1lc3NhZ2VzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RU1lc3NhZ2VzKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FTWVzc2FnZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RVBvcnRUeXBlcyA8ZW0+RVBvcnQgVHlwZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVQb3J0IFR5cGVzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RVBvcnRUeXBlcygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRVBvcnRUeXBlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFQmluZGluZ3MgPGVtPkVCaW5kaW5nczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RUJpbmRpbmdzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RUJpbmRpbmdzKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RVNlcnZpY2VzIDxlbT5FU2VydmljZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVTZXJ2aWNlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVTZXJ2aWNlcygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRVNlcnZpY2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVOYW1lc3BhY2VzIDxlbT5FTmFtZXNwYWNlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RU5hbWVzcGFjZXM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFTmFtZXNwYWNlcygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVUeXBlcyA8ZW0+RVR5cGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RVR5cGVzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RVR5cGVzKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FVHlwZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RUltcG9ydHMgPGVtPkVJbXBvcnRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FSW1wb3J0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVJbXBvcnRzKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FSW1wb3J0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQgPGVtPkltcG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbXBvcnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJbXBvcnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQHNlZSAjZ2V0SW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRJbXBvcnRfTmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldExvY2F0aW9uVVJJKCkKLSAgICogQHNlZSAjZ2V0SW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRJbXBvcnRfTG9jYXRpb25VUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQjZ2V0RURlZmluaXRpb24gPGVtPkVEZWZpbml0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RURlZmluaXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldEVEZWZpbml0aW9uKCkKLSAgICogQHNlZSAjZ2V0SW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRURlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQjZ2V0RVNjaGVtYSA8ZW0+RVNjaGVtYTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVTY2hlbWE8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldEVTY2hlbWEoKQotICAgKiBAc2VlICNnZXRJbXBvcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEltcG9ydF9FU2NoZW1hKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50IDxlbT5FeHRlbnNpYmxlIEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5zaWJsZSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRFeHRlbnNpYmxlRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQjZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cyA8ZW0+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50I2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgKiBAc2VlICNnZXRFeHRlbnNpYmxlRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0RXh0ZW5zaWJsZUVsZW1lbnRfRUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dCA8ZW0+SW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldE91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdCA8ZW0+RmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dCA8ZW0+QmluZGluZyBJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0QmluZGluZ0lucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dCNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nSW5wdXRfTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dCNnZXRFSW5wdXQgPGVtPkVJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQjZ2V0RUlucHV0KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRCaW5kaW5nSW5wdXRfRUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQgPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0TmFtZSgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldEJpbmRpbmdPdXRwdXRfTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVPdXRwdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dCNnZXRFT3V0cHV0KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ091dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ091dHB1dF9FT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdCA8ZW0+QmluZGluZyBGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CaW5kaW5nIEZhdWx0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0QmluZGluZ0ZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdCNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ0ZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nRmF1bHRfTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdCNnZXRFRmF1bHQgPGVtPkVGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQjZ2V0RUZhdWx0KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ0ZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRCaW5kaW5nRmF1bHRfRUZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldE5hbWVzcGFjZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZSNnZXRVUkkgPGVtPlVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UjZ2V0VVJJKCkKLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXROYW1lc3BhY2VfVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZml4PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZSNnZXRQcmVmaXgoKQotICAgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE5hbWVzcGFjZV9QcmVmaXgoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0VHlwZSA8ZW0+SVBvcnQgVHlwZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JUG9ydCBUeXBlPC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuUG9ydFR5cGUKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuUG9ydFR5cGUiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SVBvcnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuT3BlcmF0aW9uIDxlbT5JT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5PcGVyYXRpb24KLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuT3BlcmF0aW9uIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5JbnB1dCA8ZW0+SUlucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLklucHV0Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLklucHV0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLk91dHB1dCA8ZW0+SU91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuT3V0cHV0Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLk91dHB1dCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuRmF1bHQgPGVtPklGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5GYXVsdAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5GYXVsdCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5NZXNzYWdlIDxlbT5JTWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTWVzc2FnZTwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLk1lc3NhZ2UKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuTWVzc2FnZSIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJTWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLlBhcnQgPGVtPklQYXJ0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklQYXJ0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuUGFydAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5QYXJ0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElQYXJ0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuU2VydmljZSA8ZW0+SVNlcnZpY2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVNlcnZpY2U8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5TZXJ2aWNlCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLlNlcnZpY2UiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SVNlcnZpY2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0IDxlbT5JUG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JUG9ydDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLlBvcnQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuUG9ydCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJUG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmcgPGVtPklCaW5kaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklCaW5kaW5nPC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZwotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5CaW5kaW5nIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiA8ZW0+SUJpbmRpbmcgT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24KLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJQmluZGluZ09wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCA8ZW0+SUJpbmRpbmcgSW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUJpbmRpbmcgSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuQmluZGluZ0lucHV0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElCaW5kaW5nSW5wdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IDxlbT5JQmluZGluZyBPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ091dHB1dAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IDxlbT5JQmluZGluZyBGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JQmluZGluZyBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUJpbmRpbmdGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5EZWZpbml0aW9uIDxlbT5JRGVmaW5pdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JRGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkRlZmluaXRpb24KLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuRGVmaW5pdGlvbiIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJRGVmaW5pdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkltcG9ydCA8ZW0+SUltcG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSW1wb3J0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuSW1wb3J0Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLkltcG9ydCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJSW1wb3J0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5JTGlzdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTGlzdDwvZW0+Jy4KLSAgICogQHNlZSBqYXZhLnV0aWwuTGlzdAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLkxpc3QiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUxpc3QoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLk1hcCA8ZW0+SU1hcDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTWFwPC9lbT4nLgotICAgKiBAc2VlIGphdmEudXRpbC5NYXAKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5NYXAiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SU1hcCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZhLm5ldC5VUkwgPGVtPklVUkw8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVVSTDwvZW0+Jy4KLSAgICogQHNlZSBqYXZhLm5ldC5VUkwKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubmV0LlVSTCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJVVJMKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSA8ZW0+SUV4dGVuc2lvbiBSZWdpc3RyeTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JRXh0ZW5zaW9uIFJlZ2lzdHJ5PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeQotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElFeHRlbnNpb25SZWdpc3RyeSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlcyA8ZW0+VHlwZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VHlwZXM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXMKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5JdGVyYXRvciA8ZW0+SUl0ZXJhdG9yPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklJdGVyYXRvcjwvZW0+Jy4KLSAgICogQHNlZSBqYXZhLnV0aWwuSXRlcmF0b3IKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5JdGVyYXRvciIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJSXRlcmF0b3IoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5UeXBlcyA8ZW0+SVR5cGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklUeXBlczwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLlR5cGVzCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLlR5cGVzIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElUeXBlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0Q2hpbGRyZW4gPGVtPkNoaWxkcmVuPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DaGlsZHJlbjwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0Q2hpbGRyZW4oKQotICAgKiBAc2VlICNnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudF9DaGlsZHJlbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TY2hlbWE8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0U2NoZW1hKCkKLSAgICogQHNlZSAjZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50X1NjaGVtYSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlIDxlbT5NZXNzYWdlIFJlZmVyZW5jZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlIFJlZmVyZW5jZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRNZXNzYWdlUmVmZXJlbmNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldE5hbWUoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlUmVmZXJlbmNlX05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVNZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2UjZ2V0RU1lc3NhZ2UoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRNZXNzYWdlUmVmZXJlbmNlX0VNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UU5hbWU8L2VtPicuCi0gICAqIEBzZWUgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRURhdGFUeXBlIGdldFFOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZheC53c2RsLk9wZXJhdGlvblR5cGUgPGVtPk9wZXJhdGlvbiBUeXBlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5PcGVyYXRpb24gVHlwZTwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLk9wZXJhdGlvblR5cGUKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuT3BlcmF0aW9uVHlwZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRURhdGFUeXBlIGdldE9wZXJhdGlvblR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy53M2MuZG9tLkVsZW1lbnQgPGVtPkRPTSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5ET00gRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcudzNjLmRvbS5FbGVtZW50IgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFRGF0YVR5cGUgZ2V0RE9NRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIDxlbT5FeGNlcHRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkV4Y2VwdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLldTRExFeGNlcHRpb24KLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRURhdGFUeXBlIGdldFdTRExFeGNlcHRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy53M2MuZG9tLkRvY3VtZW50IDxlbT5ET00gRG9jdW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRPTSBEb2N1bWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcudzNjLmRvbS5Eb2N1bWVudAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLnczYy5kb20uRG9jdW1lbnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVEYXRhVHlwZSBnZXRET01Eb2N1bWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBXU0RMRmFjdG9yeSBnZXRXU0RMRmFjdG9yeSgpOwotCi19IC8vV1NETFBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmZjZiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eS5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eS5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ai5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGUgPGI+UGx1Z2luPC9iPiBmb3IgdGhlIG1vZGVsLgotICogVGhlIFdTREwgbW9kZWwgbmVlZHMgdG8gYmUgYWJsZSB0byBydW4gd2l0aGluIGFuIEVjbGlwc2Ugd29ya2JlbmNoLAotICogd2l0aGluIGEgaGVhZGxlc3MgRWNsaXBzZSB3b3Jrc3BhY2UsIG9yIGp1c3Qgc3RhbmQtYWxvbmUgYXMgcGFydCAKLSAqIG9mIHNvbWUgb3RoZXIgYXBwbGljYXRpb24uCi0gKiBUbyBzdXBwb3J0IHRoaXMsIGFsbCBhY2Nlc3MgaXMgZGlyZWN0ZWQgdG8gdGhlIHN0YXRpYyBtZXRob2RzLAotICogd2hpY2ggY2FuIHJlZGlyZWN0IHRoZSBzZXJ2aWNlIGFzIGFwcG9wcmlhdGUgdG8gdGhlIHJ1bnRpbWUuCi0gKiBEdXJpbmcgc3RhbmQtYWxvbmUgaW52b2NhdGlvbiBubyBwbHVnaW4gaW5pdGlhbGl6YXRpb24gdGFrZXMgcGxhY2UuCi0gKiBJbiB0aGlzIGNhc2UgeW91IHdpbGwgbmVlZCB0aGUgcmVzb3VyY2VzIGphciBvbiB0aGUgY2xhc3MgcGF0aC4KLSAqIEBzZWUgI2dldEJhc2VVUkwKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdTRExQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4gCi17Ci0gIC8qKgotICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwbHVnaW4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdTRExQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgV1NETFBsdWdpbigpOwotCi0gIC8qKgotICAgKiBUaGUgb25lIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAqLwotICBzdGF0aWMgcHJpdmF0ZSBJbXBsZW1lbnRhdGlvbiBwbHVnaW47Ci0gIAotICBwcml2YXRlIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbCBleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLQotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotICAgKi8KLSAgcHJpdmF0ZSBXU0RMUGx1Z2luKCkKLSAgewotICAgIHN1cGVyKG5ldyBSZXNvdXJjZUxvY2F0b3JbXSB7fSk7Ci0gIH0KLQotICAvKgotICAgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGJhc2UgY2xhc3MuCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpCi0gIHsKLSAgICByZXR1cm4gcGx1Z2luOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0gICAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkKLSAgewotICAgIHJldHVybiBwbHVnaW47Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VQbHVnaW4KLSAgewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwbHVnaW4uCi0gICAgICovCi0gICAgcHVibGljIEltcGxlbWVudGF0aW9uKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpCi0gICAgewotICAgICAgc3VwZXIoZGVzY3JpcHRvcik7Ci0KLSAgICAgIC8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCi0gICAgICAvLwotICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsIGludGVybmFsR2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkgPSBuZXcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsKCk7Ci0gICAgICBpZiAocGx1Z2luICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICAgIH0gIAotICAgIH0KLSAgICByZXR1cm4gZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICByZXR1cm4gaW50ZXJuYWxHZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeShuYW1lc3BhY2UpOwotICB9Ci0gIAotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkoKQotICB7ICAgCi0gICAgcmV0dXJuIGludGVybmFsR2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkoKTsKLSAgfQotICAKLSAgcHVibGljIFdTRExGYWN0b3J5IGNyZWF0ZVdTREw0SkZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBXU0RMRmFjdG9yeUltcGwoKTsgICAJCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJiNjZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRTY2hlbWEoWFNEU2NoZW1hKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRfU2NoZW1hKCkKLSAgICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBYU0RTY2hlbWEgZ2V0U2NoZW1hKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldFNjaGVtYSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSB2YWx1ZSk7Ci0KLX0gLy8gWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQQWRkcmVzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YWI1ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZGRyZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzcyNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUEFkZHJlc3MoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUVFBBZGRyZXNzIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvY2F0aW9uVVJJKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQQWRkcmVzc19Mb2NhdGlvblVSSSgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzcyNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEhUVFBBZGRyZXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzMyNTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmcjZ2V0VmVyYiA8ZW0+VmVyYjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2dldEhUVFBCaW5kaW5nKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQQmluZGluZyBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyYjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJiPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJiKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQQmluZGluZ19WZXJiKCkKLQkgKiBAbW9kZWwgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJiKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmcjZ2V0VmVyYiA8ZW0+VmVyYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyYihTdHJpbmcgdmFsdWUpOwotCi19IC8vIEhUVFBCaW5kaW5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU4MmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGwuSFRUUEZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBCaW5kaW5nIGNyZWF0ZUhUVFBCaW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQT3BlcmF0aW9uIGNyZWF0ZUhUVFBPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBVcmxSZXBsYWNlbWVudCBjcmVhdGVIVFRQVXJsUmVwbGFjZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXJsIEVuY29kZWQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVybCBFbmNvZGVkPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQVXJsRW5jb2RlZCBjcmVhdGVIVFRQVXJsRW5jb2RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZGRyZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZGRyZXNzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQQWRkcmVzcyBjcmVhdGVIVFRQQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQUGFja2FnZSBnZXRIVFRQUGFja2FnZSgpOwotCi19IC8vSFRUUEZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBhOWExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24jZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2dldEhUVFBPcGVyYXRpb24oKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUVFBPcGVyYXRpb24gZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYXRpb24gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2NhdGlvblVSSShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUE9wZXJhdGlvbl9Mb2NhdGlvblVSSSgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2F0aW9uVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSFRUUE9wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxYzMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJodHRwIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9IVFRQIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gImh0dHAiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuaW1wbC5IVFRQUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQQmluZGluZ0ltcGwgPGVtPkJpbmRpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQQmluZGluZ0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRIVFRQQmluZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIVFRQX0JJTkRJTkcgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19fVkVSQiA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmluZGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0JJTkRJTkdfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUE9wZXJhdGlvbkltcGwgPGVtPk9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBPcGVyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SFRUUE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIVFRQX09QRVJBVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX09QRVJBVElPTl9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfT1BFUkFUSU9OX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfT1BFUkFUSU9OX19MT0NBVElPTl9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX09QRVJBVElPTl9GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQVXJsUmVwbGFjZW1lbnRJbXBsIDxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQVXJsUmVwbGFjZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SFRUUFVybFJlcGxhY2VtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhUVFBfVVJMX1JFUExBQ0VNRU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9SRVBMQUNFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfUkVQTEFDRU1FTlRfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9SRVBMQUNFTUVOVF9GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQVXJsRW5jb2RlZEltcGwgPGVtPlVybCBFbmNvZGVkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFVybEVuY29kZWRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SFRUUFVybEVuY29kZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfRU5DT0RFRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfRU5DT0RFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9FTkNPREVEX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlVybCBFbmNvZGVkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX0VOQ09ERURfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUEFkZHJlc3NJbXBsIDxlbT5BZGRyZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUEFkZHJlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SFRUUEFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFRUUF9BRERSRVNTID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1NfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1NfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1NfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQUREUkVTU19fTE9DQVRJT05fVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BZGRyZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQUREUkVTU19GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIDxlbT5JSFRUUCBBZGRyZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRJSFRUUEFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUhUVFBfQUREUkVTUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklIVFRQIEFkZHJlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUhUVFBfQUREUkVTU19GRUFUVVJFX0NPVU5UID0gMDsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyA8ZW0+SUhUVFAgQmluZGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SUhUVFBCaW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElIVFRQX0JJTkRJTkcgPSA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSFRUUCBCaW5kaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElIVFRQX0JJTkRJTkdfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24gPGVtPklIVFRQIE9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRJSFRUUE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSFRUUF9PUEVSQVRJT04gPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSFRUUCBPcGVyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUhUVFBfT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZCA8ZW0+SUhUVFAgVXJsIEVuY29kZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldElIVFRQVXJsRW5jb2RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSFRUUF9VUkxfRU5DT0RFRCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklIVFRQIFVybCBFbmNvZGVkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElIVFRQX1VSTF9FTkNPREVEX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgPGVtPklIVFRQIFVybCBSZXBsYWNlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldElIVFRQVXJsUmVwbGFjZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUhUVFBfVVJMX1JFUExBQ0VNRU5UID0gOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUhUVFAgVXJsIFJlcGxhY2VtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElIVFRQX1VSTF9SRVBMQUNFTUVOVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nIDxlbT5CaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEhUVFBCaW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZyNnZXRWZXJiIDxlbT5WZXJiPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyYjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZyNnZXRWZXJiKCkKLQkgKiBAc2VlICNnZXRIVFRQQmluZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SFRUUEJpbmRpbmdfVmVyYigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SFRUUE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbiNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24jZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBzZWUgI2dldEhUVFBPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEhUVFBPcGVyYXRpb25fTG9jYXRpb25VUkkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRIVFRQVXJsUmVwbGFjZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsRW5jb2RlZCA8ZW0+VXJsIEVuY29kZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VXJsIEVuY29kZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEhUVFBVcmxFbmNvZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MgPGVtPkFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SFRUUEFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MjZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBzZWUgI2dldEhUVFBBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRIVFRQQWRkcmVzc19Mb2NhdGlvblVSSSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MgPGVtPklIVFRQIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUhUVFAgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElIVFRQQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcgPGVtPklIVFRQIEJpbmRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUhUVFAgQmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElIVFRQQmluZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiA8ZW0+SUhUVFAgT3BlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklIVFRQIE9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24KLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJSFRUUE9wZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQgPGVtPklIVFRQIFVybCBFbmNvZGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklIVFRQIFVybCBFbmNvZGVkPC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQiIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUhUVFBVcmxFbmNvZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgPGVtPklIVFRQIFVybCBSZXBsYWNlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSFRUUCBVcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElIVFRQVXJsUmVwbGFjZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBGYWN0b3J5IGdldEhUVFBGYWN0b3J5KCk7Ci0KLX0gLy9IVFRQUGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBVcmxFbmNvZGVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUFVybEVuY29kZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2YzAwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUFVybEVuY29kZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVybCBFbmNvZGVkPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQVXJsRW5jb2RlZCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUFVybEVuY29kZWQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQgewotfSAvLyBIVFRQVXJsRW5jb2RlZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBVcmxSZXBsYWNlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBVcmxSZXBsYWNlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQxZGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQVXJsUmVwbGFjZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVybCBSZXBsYWNlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUFVybFJlcGxhY2VtZW50KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQVXJsUmVwbGFjZW1lbnQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IHsKLX0gLy8gSFRUUFVybFJlcGxhY2VtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQQWRkcmVzc0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBBZGRyZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTE3NGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBBZGRyZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWwuSFRUUENvbnN0YW50czsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBBZGRyZXNzSW1wbCNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUEFkZHJlc3NJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSFRUUEFkZHJlc3MgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvblVSSSgpIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb25VUkkoKSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvblVSSSA9IExPQ0FUSU9OX1VSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIVFRQQWRkcmVzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBIVFRQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUEFkZHJlc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJJKCkgewotCQlyZXR1cm4gbG9jYXRpb25VUkk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIG5ld0xvY2F0aW9uVVJJKSB7Ci0JCVN0cmluZyBvbGRMb2NhdGlvblVSSSA9IGxvY2F0aW9uVVJJOwotCQlsb2NhdGlvblVSSSA9IG5ld0xvY2F0aW9uVVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSSwgb2xkTG9jYXRpb25VUkksIGxvY2F0aW9uVVJJKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSToKLQkJCQlyZXR1cm4gZ2V0TG9jYXRpb25VUkkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0JCQkJc2V0TG9jYXRpb25VUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0JCQkJc2V0TG9jYXRpb25VUkkoTE9DQVRJT05fVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSToKLQkJCQlyZXR1cm4gTE9DQVRJT05fVVJJX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvblVSSSAhPSBudWxsIDogIUxPQ0FUSU9OX1VSSV9FREVGQVVMVC5lcXVhbHMobG9jYXRpb25VUkkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb25VUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2F0aW9uVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgCXNldExvY2F0aW9uVVJJCi0gICAgICAoSFRUUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIEhUVFBDb25zdGFudHMuTE9DQVRJT05fVVJJX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBBZGRyZXNzX0xvY2F0aW9uVVJJKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxIVFRQQ29uc3RhbnRzLkxPQ0FUSU9OX1VSSV9BVFRSSUJVVEUsZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgfQotICB9Ci19IC8vSFRUUEFkZHJlc3NJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQQmluZGluZ0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBCaW5kaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQ2ZjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBCaW5kaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWwuSFRUUENvbnN0YW50czsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQQmluZGluZ0ltcGwjZ2V0VmVyYiA8ZW0+VmVyYjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBCaW5kaW5nSW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhUVFBCaW5kaW5nIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyYigpIDxlbT5WZXJiPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJiKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJCX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcmIoKSA8ZW0+VmVyYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyYigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJiID0gVkVSQl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIVFRQQmluZGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBIVFRQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUEJpbmRpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcmIoKSB7Ci0JCXJldHVybiB2ZXJiOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcmIoU3RyaW5nIG5ld1ZlcmIpIHsKLQkJU3RyaW5nIG9sZFZlcmIgPSB2ZXJiOwotCQl2ZXJiID0gbmV3VmVyYjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19WRVJCLCBvbGRWZXJiLCB2ZXJiKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX1ZFUkI6Ci0JCQkJcmV0dXJuIGdldFZlcmIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19WRVJCOgotCQkJCXNldFZlcmIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19WRVJCOgotCQkJCXNldFZlcmIoVkVSQl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19WRVJCOgotCQkJCXJldHVybiBWRVJCX0VERUZBVUxUID09IG51bGwgPyB2ZXJiICE9IG51bGwgOiAhVkVSQl9FREVGQVVMVC5lcXVhbHModmVyYik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2ZXJiOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJiKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgCXNldFZlcmIKLSAgICAgIChIVFRQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgSFRUUENvbnN0YW50cy5WRVJCX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBCaW5kaW5nX1ZlcmIoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LEhUVFBDb25zdGFudHMuVkVSQl9BVFRSSUJVVEUsZ2V0VmVyYigpKTsKLSAgICB9Ci0gIH0KLQotfSAvL0hUVFBCaW5kaW5nSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlYTYwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEhUVFBGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElORzogcmV0dXJuIGNyZWF0ZUhUVFBCaW5kaW5nKCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OOiByZXR1cm4gY3JlYXRlSFRUUE9wZXJhdGlvbigpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVDogcmV0dXJuIGNyZWF0ZUhUVFBVcmxSZXBsYWNlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEOiByZXR1cm4gY3JlYXRlSFRUUFVybEVuY29kZWQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTOiByZXR1cm4gY3JlYXRlSFRUUEFkZHJlc3MoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQQmluZGluZyBjcmVhdGVIVFRQQmluZGluZygpIHsKLQkJSFRUUEJpbmRpbmdJbXBsIGh0dHBCaW5kaW5nID0gbmV3IEhUVFBCaW5kaW5nSW1wbCgpOwotCQlyZXR1cm4gaHR0cEJpbmRpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBPcGVyYXRpb24gY3JlYXRlSFRUUE9wZXJhdGlvbigpIHsKLQkJSFRUUE9wZXJhdGlvbkltcGwgaHR0cE9wZXJhdGlvbiA9IG5ldyBIVFRQT3BlcmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gaHR0cE9wZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUFVybFJlcGxhY2VtZW50IGNyZWF0ZUhUVFBVcmxSZXBsYWNlbWVudCgpIHsKLQkJSFRUUFVybFJlcGxhY2VtZW50SW1wbCBodHRwVXJsUmVwbGFjZW1lbnQgPSBuZXcgSFRUUFVybFJlcGxhY2VtZW50SW1wbCgpOwotCQlyZXR1cm4gaHR0cFVybFJlcGxhY2VtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQVXJsRW5jb2RlZCBjcmVhdGVIVFRQVXJsRW5jb2RlZCgpIHsKLQkJSFRUUFVybEVuY29kZWRJbXBsIGh0dHBVcmxFbmNvZGVkID0gbmV3IEhUVFBVcmxFbmNvZGVkSW1wbCgpOwotCQlyZXR1cm4gaHR0cFVybEVuY29kZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBBZGRyZXNzIGNyZWF0ZUhUVFBBZGRyZXNzKCkgewotCQlIVFRQQWRkcmVzc0ltcGwgaHR0cEFkZHJlc3MgPSBuZXcgSFRUUEFkZHJlc3NJbXBsKCk7Ci0JCXJldHVybiBodHRwQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUFBhY2thZ2UgZ2V0SFRUUFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSFRUUFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSFRUUFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEhUVFBQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci19IC8vSFRUUEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQT3BlcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUE9wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyZDQwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQT3BlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbC5IVFRQQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUE9wZXJhdGlvbkltcGwjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBPcGVyYXRpb25JbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSFRUUE9wZXJhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvblVSSSgpIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uVVJJID0gTE9DQVRJT05fVVJJX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhUVFBPcGVyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBPcGVyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJJKCkgewotCQlyZXR1cm4gbG9jYXRpb25VUkk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIG5ld0xvY2F0aW9uVVJJKSB7Ci0JCVN0cmluZyBvbGRMb2NhdGlvblVSSSA9IGxvY2F0aW9uVVJJOwotCQlsb2NhdGlvblVSSSA9IG5ld0xvY2F0aW9uVVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fTE9DQVRJT05fVVJJLCBvbGRMb2NhdGlvblVSSSwgbG9jYXRpb25VUkkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0xPQ0FUSU9OX1VSSToKLQkJCQlyZXR1cm4gZ2V0TG9jYXRpb25VUkkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fTE9DQVRJT05fVVJJOgotCQkJCXNldExvY2F0aW9uVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0xPQ0FUSU9OX1VSSToKLQkJCQlzZXRMb2NhdGlvblVSSShMT0NBVElPTl9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0xPQ0FUSU9OX1VSSToKLQkJCQlyZXR1cm4gTE9DQVRJT05fVVJJX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvblVSSSAhPSBudWxsIDogIUxPQ0FUSU9OX1VSSV9FREVGQVVMVC5lcXVhbHMobG9jYXRpb25VUkkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb25VUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2F0aW9uVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgCXNldExvY2F0aW9uVVJJCi0gICAgICAoSFRUUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIEhUVFBDb25zdGFudHMuTE9DQVRJT05fVVJJX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBPcGVyYXRpb25fTG9jYXRpb25VUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LEhUVFBDb25zdGFudHMuTE9DQVRJT05fVVJJX0FUVFJJQlVURSxnZXRMb2NhdGlvblVSSSgpKTsKLSAgICB9Ci0gIH0KLQotfSAvL0hUVFBPcGVyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQUGFja2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2JiYTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RQYWNrYWdlSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBIVFRQUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaHR0cEJpbmRpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaHR0cE9wZXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaHR0cFVybEVuY29kZWRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaHR0cEFkZHJlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaWh0dHBBZGRyZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGlodHRwQmluZGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpaHR0cE9wZXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpaHR0cFVybEVuY29kZWRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaWh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEhUVFBQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSFRUUEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSFRUUFBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEhUVFBQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChIVFRQUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlLgotCQlIVFRQUGFja2FnZUltcGwgdGhlSFRUUFBhY2thZ2UgPSAoSFRUUFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBIVFRQUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYU0RQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJV1NETFBhY2thZ2VJbXBsIHRoZVdTRExQYWNrYWdlID0gKFdTRExQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KFdTRExQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoV1NETFBhY2thZ2UuZU5TX1VSSSkgOiBXU0RMUGFja2FnZUltcGwuZUlOU1RBTkNFKTsKLQotCQkvLyBTdGVwIDE6IGNyZWF0ZSBtZXRhLW1vZGVsIG9iamVjdHMKLQkJdGhlSFRUUFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdTRExQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIFN0ZXAgMjogY29tcGxldGUgaW5pdGlhbGl6YXRpb24KLQkJdGhlSFRUUFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXU0RMUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJcmV0dXJuIHRoZUhUVFBQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SFRUUEJpbmRpbmcoKSB7Ci0JCXJldHVybiBodHRwQmluZGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIVFRQQmluZGluZ19WZXJiKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaHR0cEJpbmRpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhUVFBPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBodHRwT3BlcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEhUVFBPcGVyYXRpb25fTG9jYXRpb25VUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlodHRwT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRIVFRQVXJsUmVwbGFjZW1lbnQoKSB7Ci0JCXJldHVybiBodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRIVFRQVXJsRW5jb2RlZCgpIHsKLQkJcmV0dXJuIGh0dHBVcmxFbmNvZGVkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SFRUUEFkZHJlc3MoKSB7Ci0JCXJldHVybiBodHRwQWRkcmVzc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIVFRQQWRkcmVzc19Mb2NhdGlvblVSSSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWh0dHBBZGRyZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSFRUUEFkZHJlc3MoKSB7Ci0JCXJldHVybiBpaHR0cEFkZHJlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSFRUUEJpbmRpbmcoKSB7Ci0JCXJldHVybiBpaHR0cEJpbmRpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJSFRUUE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIGlodHRwT3BlcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUhUVFBVcmxFbmNvZGVkKCkgewotCQlyZXR1cm4gaWh0dHBVcmxFbmNvZGVkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUhUVFBVcmxSZXBsYWNlbWVudCgpIHsKLQkJcmV0dXJuIGlodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBGYWN0b3J5IGdldEhUVFBGYWN0b3J5KCkgewotCQlyZXR1cm4gKEhUVFBGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWh0dHBCaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEhUVFBfQklORElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaHR0cEJpbmRpbmdFQ2xhc3MsIEhUVFBfQklORElOR19fVkVSQik7Ci0KLQkJaHR0cE9wZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIVFRQX09QRVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaHR0cE9wZXJhdGlvbkVDbGFzcywgSFRUUF9PUEVSQVRJT05fX0xPQ0FUSU9OX1VSSSk7Ci0KLQkJaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEhUVFBfVVJMX1JFUExBQ0VNRU5UKTsKLQotCQlodHRwVXJsRW5jb2RlZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIVFRQX1VSTF9FTkNPREVEKTsKLQotCQlodHRwQWRkcmVzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIVFRQX0FERFJFU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGh0dHBBZGRyZXNzRUNsYXNzLCBIVFRQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSSk7Ci0KLQkJaWh0dHBBZGRyZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKElIVFRQX0FERFJFU1MpOwotCi0JCWlodHRwQmluZGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSFRUUF9CSU5ESU5HKTsKLQotCQlpaHR0cE9wZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSFRUUF9PUEVSQVRJT04pOwotCi0JCWlodHRwVXJsRW5jb2RlZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSFRUUF9VUkxfRU5DT0RFRCk7Ci0KLQkJaWh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSFRUUF9VUkxfUkVQTEFDRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdTRExQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJaHR0cEJpbmRpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCWh0dHBCaW5kaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUhUVFBCaW5kaW5nKCkpOwotCQlodHRwT3BlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQlodHRwT3BlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUhUVFBPcGVyYXRpb24oKSk7Ci0JCWh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUhUVFBVcmxSZXBsYWNlbWVudCgpKTsKLQkJaHR0cFVybEVuY29kZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCWh0dHBVcmxFbmNvZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUhUVFBVcmxFbmNvZGVkKCkpOwotCQlodHRwQWRkcmVzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJaHR0cEFkZHJlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSFRUUEFkZHJlc3MoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhodHRwQmluZGluZ0VDbGFzcywgSFRUUEJpbmRpbmcuY2xhc3MsICJIVFRQQmluZGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhUVFBCaW5kaW5nX1ZlcmIoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcmIiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0JCWluaXRFQ2xhc3MoaHR0cE9wZXJhdGlvbkVDbGFzcywgSFRUUE9wZXJhdGlvbi5jbGFzcywgIkhUVFBPcGVyYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIVFRQT3BlcmF0aW9uX0xvY2F0aW9uVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhdGlvblVSSSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLQkJaW5pdEVDbGFzcyhodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MsIEhUVFBVcmxSZXBsYWNlbWVudC5jbGFzcywgIkhUVFBVcmxSZXBsYWNlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0KLQkJaW5pdEVDbGFzcyhodHRwVXJsRW5jb2RlZEVDbGFzcywgSFRUUFVybEVuY29kZWQuY2xhc3MsICJIVFRQVXJsRW5jb2RlZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0KLQkJaW5pdEVDbGFzcyhodHRwQWRkcmVzc0VDbGFzcywgSFRUUEFkZHJlc3MuY2xhc3MsICJIVFRQQWRkcmVzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhUVFBBZGRyZXNzX0xvY2F0aW9uVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhdGlvblVSSSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpaHR0cEFkZHJlc3NFQ2xhc3MsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzLmNsYXNzLCAiSUhUVFBBZGRyZXNzIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSk7Ci0KLQkJaW5pdEVDbGFzcyhpaHR0cEJpbmRpbmdFQ2xhc3MsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nLmNsYXNzLCAiSUhUVFBCaW5kaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSk7Ci0KLQkJaW5pdEVDbGFzcyhpaHR0cE9wZXJhdGlvbkVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbi5jbGFzcywgIklIVFRQT3BlcmF0aW9uIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSk7Ci0KLQkJaW5pdEVDbGFzcyhpaHR0cFVybEVuY29kZWRFQ2xhc3MsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkLmNsYXNzLCAiSUhUVFBVcmxFbmNvZGVkIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSk7Ci0KLQkJaW5pdEVDbGFzcyhpaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQuY2xhc3MsICJJSFRUUFVybFJlcGxhY2VtZW50IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLX0gLy9IVFRQUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBVcmxFbmNvZGVkSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFVybEVuY29kZWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZTBmMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFVybEVuY29kZWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VXJsIEVuY29kZWQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQVXJsRW5jb2RlZEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBIVFRQVXJsRW5jb2RlZCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhUVFBVcmxFbmNvZGVkSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEhUVFBQYWNrYWdlLmVJTlNUQU5DRS5nZXRIVFRQVXJsRW5jb2RlZCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vSFRUUFVybEVuY29kZWRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQVXJsUmVwbGFjZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQVXJsUmVwbGFjZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZTg1YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFVybFJlcGxhY2VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VcmwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQVXJsUmVwbGFjZW1lbnRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSFRUUFVybFJlcGxhY2VtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSFRUUFVybFJlcGxhY2VtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEhUVFBQYWNrYWdlLmVJTlNUQU5DRS5nZXRIVFRQVXJsUmVwbGFjZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9IVFRQVXJsUmVwbGFjZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzg2YTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLQotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSFRUUFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSFRUUFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhUVFBTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgSFRUUFN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBCaW5kaW5nKEhUVFBCaW5kaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIVFRQQmluZGluZ0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBPcGVyYXRpb24oSFRUUE9wZXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSFRUUE9wZXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBVcmxSZXBsYWNlbWVudChIVFRQVXJsUmVwbGFjZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhUVFBVcmxSZXBsYWNlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBVcmxFbmNvZGVkKEhUVFBVcmxFbmNvZGVkIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIVFRQVXJsRW5jb2RlZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBBZGRyZXNzKEhUVFBBZGRyZXNzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIVFRQQWRkcmVzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQQWRkcmVzcyhqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUhUVFBBZGRyZXNzQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSUhUVFBCaW5kaW5nKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJSFRUUEJpbmRpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUE9wZXJhdGlvbihqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJSFRUUE9wZXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQVXJsRW5jb2RlZChqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUhUVFBVcmxFbmNvZGVkQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSUhUVFBVcmxSZXBsYWNlbWVudChqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlIVFRQVXJsUmVwbGFjZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmcgPGVtPkJpbmRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhUVFBCaW5kaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbiA8ZW0+T3BlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhUVFBPcGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhUVFBVcmxSZXBsYWNlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxFbmNvZGVkIDxlbT5VcmwgRW5jb2RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSFRUUFVybEVuY29kZWRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzcyA8ZW0+QWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSFRUUEFkZHJlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIDxlbT5JSFRUUCBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlIVFRQQWRkcmVzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcgPGVtPklIVFRQIEJpbmRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSUhUVFBCaW5kaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIDxlbT5JSFRUUCBPcGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSFRUUE9wZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQgPGVtPklIVFRQIFVybCBFbmNvZGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlIVFRQVXJsRW5jb2RlZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IDxlbT5JSFRUUCBVcmwgUmVwbGFjZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlIVFRQVXJsUmVwbGFjZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9IVFRQQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NmExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGZpbmFsIGNsYXNzIEhUVFBDb25zdGFudHMgCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1NfRUxFTUVOVF9UQUcgPSAiYWRkcmVzcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfRUxFTUVOVF9UQUcgPSAiYmluZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTl9FTEVNRU5UX1RBRyA9ICJvcGVyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5DT0RFRF9FTEVNRU5UX1RBRyA9ICJ1cmxFbmNvZGVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1JFUExBQ0VNRU5UX0VMRU1FTlRfVEFHID0gInVybFJlcGxhY2VtZW50IjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9VUklfQVRUUklCVVRFID0ibG9jYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJCX0FUVFJJQlVURSA9InZlcmIiOwotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPyBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NWE0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBIVFRQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgaWYgKEhUVFBDb25zdGFudHMuSFRUUF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIGlmIChIVFRQQ29uc3RhbnRzLkFERFJFU1NfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUEFkZHJlc3MoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEhUVFBDb25zdGFudHMuQklORElOR19FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEhUVFBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIVFRQQmluZGluZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoSFRUUENvbnN0YW50cy5PUEVSQVRJT05fRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUE9wZXJhdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoSFRUUENvbnN0YW50cy5VUkxfRU5DT0RFRF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gSFRUUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhUVFBVcmxFbmNvZGVkKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChIVFRQQ29uc3RhbnRzLlVSTF9SRVBMQUNFTUVOVF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gSFRUUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhUVFBVcmxSZXBsYWNlbWVudCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5oYW5kbGVkIGxvY2FsTmFtZTogIiArIGxvY2FsTmFtZSk7Ci0gICAgICAgIHJldHVybiBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5oYW5kbGVkIG5hbWVzcGFjZTogIiArIG5hbWVzcGFjZSk7Ci0gICAgICByZXR1cm4gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUFN3aXRjaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODI4NGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci0KLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEhUVFBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBIVFRQUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCUVDbGFzcyB0aGVFQ2xhc3MgPSB0aGVFT2JqZWN0LmVDbGFzcygpOwotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkc6IHsKLQkJCQkJSFRUUEJpbmRpbmcgaHR0cEJpbmRpbmcgPSAoSFRUUEJpbmRpbmcpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIVFRQQmluZGluZyhodHRwQmluZGluZyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBCaW5kaW5nKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUhUVFBCaW5kaW5nKGh0dHBCaW5kaW5nKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoaHR0cEJpbmRpbmcpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cEJpbmRpbmcpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OOiB7Ci0JCQkJCUhUVFBPcGVyYXRpb24gaHR0cE9wZXJhdGlvbiA9IChIVFRQT3BlcmF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSFRUUE9wZXJhdGlvbihodHRwT3BlcmF0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cE9wZXJhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlIVFRQT3BlcmF0aW9uKGh0dHBPcGVyYXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChodHRwT3BlcmF0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBPcGVyYXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UOiB7Ci0JCQkJCUhUVFBVcmxSZXBsYWNlbWVudCBodHRwVXJsUmVwbGFjZW1lbnQgPSAoSFRUUFVybFJlcGxhY2VtZW50KXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSFRUUFVybFJlcGxhY2VtZW50KGh0dHBVcmxSZXBsYWNlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBVcmxSZXBsYWNlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlIVFRQVXJsUmVwbGFjZW1lbnQoaHR0cFVybFJlcGxhY2VtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoaHR0cFVybFJlcGxhY2VtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBVcmxSZXBsYWNlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRDogewotCQkJCQlIVFRQVXJsRW5jb2RlZCBodHRwVXJsRW5jb2RlZCA9IChIVFRQVXJsRW5jb2RlZCl0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhUVFBVcmxFbmNvZGVkKGh0dHBVcmxFbmNvZGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cFVybEVuY29kZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSFRUUFVybEVuY29kZWQoaHR0cFVybEVuY29kZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChodHRwVXJsRW5jb2RlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwVXJsRW5jb2RlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTOiB7Ci0JCQkJCUhUVFBBZGRyZXNzIGh0dHBBZGRyZXNzID0gKEhUVFBBZGRyZXNzKXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSFRUUEFkZHJlc3MoaHR0cEFkZHJlc3MpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwQWRkcmVzcyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlIVFRQQWRkcmVzcyhodHRwQWRkcmVzcyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGh0dHBBZGRyZXNzKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBBZGRyZXNzKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CaW5kaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQQmluZGluZyhIVFRQQmluZGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcGVyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBPcGVyYXRpb24oSFRUUE9wZXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBVcmxSZXBsYWNlbWVudChIVFRQVXJsUmVwbGFjZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VcmwgRW5jb2RlZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VcmwgRW5jb2RlZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSFRUUFVybEVuY29kZWQoSFRUUFVybEVuY29kZWQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZGRyZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFkZHJlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBBZGRyZXNzKEhUVFBBZGRyZXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgQWRkcmVzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUEFkZHJlc3MoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBCaW5kaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIEJpbmRpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQQmluZGluZyhqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIE9wZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBPcGVyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQT3BlcmF0aW9uKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBVcmwgRW5jb2RlZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBVcmwgRW5jb2RlZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSUhUVFBVcmxFbmNvZGVkKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgVXJsIFJlcGxhY2VtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIFVybCBSZXBsYWNlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSUhUVFBVcmxSZXBsYWNlbWVudChqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSFRUUFN3aXRjaApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2NmY4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCNnZXRFUGFydCA8ZW0+RVBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSNnZXRNSU1FQ29udGVudCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTUlNRUNvbnRlbnQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRUNvbnRlbnRfVHlwZSgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVQYXJ0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FUGFydDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUGFydDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RVBhcnQoUGFydCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSNnZXRNSU1FQ29udGVudF9FUGFydCgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQYXJ0IGdldEVQYXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FUGFydDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RVBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVQYXJ0KFBhcnQgdmFsdWUpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFydChTdHJpbmcgcGFydCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIHBhcmFtZXRlcnM9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhcnQoKTsKLQotfSAvLyBNSU1FQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1ZTExOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRUZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsLk1JTUVGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNSU1FQ29udGVudCBjcmVhdGVNSU1FQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJ0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJ0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNSU1FUGFydCBjcmVhdGVNSU1FUGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVNdWx0aXBhcnRSZWxhdGVkIGNyZWF0ZU1JTUVNdWx0aXBhcnRSZWxhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbWUgWG1sPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaW1lIFhtbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRU1pbWVYbWwgY3JlYXRlTUlNRU1pbWVYbWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRVBhY2thZ2UgZ2V0TUlNRVBhY2thZ2UoKTsKLQotfSAvL01JTUVGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRU1pbWVYbWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FTWltZVhtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDc5NGM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FTWltZVhtbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaW1lIFhtbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWwjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRU1pbWVYbWwoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVNaW1lWG1sIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FUGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVQYXJ0KFBhcnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRU1pbWVYbWxfRVBhcnQoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGFydCBnZXRFUGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sI2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFUGFydChQYXJ0IHZhbHVlKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcnQoU3RyaW5nIHBhcnQpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYXJ0KCk7Ci0KLX0gLy8gTUlNRU1pbWVYbWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FTXVsdGlwYXJ0UmVsYXRlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVNdWx0aXBhcnRSZWxhdGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTRmZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVNdWx0aXBhcnRSZWxhdGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkI2dldEVNSU1FUGFydCA8ZW0+RU1JTUUgUGFydDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlI2dldE1JTUVNdWx0aXBhcnRSZWxhdGVkKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RU1JTUUgUGFydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FTUlNRSBQYXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU1JTUUgUGFydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSNnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZF9FTUlNRVBhcnQoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFTUlNRVBhcnQoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIGFkZE1JTUVQYXJ0KE1JTUVQYXJ0IG1pbWVQYXJ0KTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTGlzdCIgcGFyYW1ldGVycz0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1JTUVQYXJ0cygpOwotCi19IC8vIE1JTUVNdWx0aXBhcnRSZWxhdGVkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRVBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTI5MDNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FRmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibWltZSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvTUlNRSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJtaW1lIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLmltcGwuTUlNRVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRUNvbnRlbnRJbXBsIDxlbT5Db250ZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0TUlNRUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlNRV9DT05URU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfX0VQQVJUID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFydEltcGwgPGVtPlBhcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFydEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRNSU1FUGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSU1FX1BBUlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfUEFSVF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfUEFSVF9fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfUEFSVF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBhcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9QQVJUX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbCA8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTVVMVElQQVJUX1JFTEFURURfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTUlNRSBQYXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVNaW1lWG1sSW1wbCA8ZW0+TWltZSBYbWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FTWltZVhtbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRNSU1FTWltZVhtbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NSU1FX1hNTF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTUlNRV9YTUxfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTUlNRV9YTUxfX0VQQVJUID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NaW1lIFhtbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgPGVtPklNSU1FIFBhcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldElNSU1FUGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTUlNRV9QQVJUID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU1JTUUgUGFydDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUlNRV9QQVJUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCA8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldElNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTUlNRV9NVUxUSVBBUlRfUkVMQVRFRCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklNSU1FIE11bHRpcGFydCBSZWxhdGVkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNSU1FX01VTFRJUEFSVF9SRUxBVEVEX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCA8ZW0+SU1JTUUgQ29udGVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0SU1JTUVDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNSU1FX0NPTlRFTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JTUlNRSBDb250ZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNSU1FX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIDxlbT5JTUlNRSBNaW1lIFhtbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0SU1JTUVNaW1lWG1sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNSU1FX01JTUVfWE1MID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU1JTUUgTWltZSBYbWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1JTUVfTUlNRV9YTUxfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxpc3Q8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldExpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTElTVCA9IDg7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNSU1FQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0TUlNRUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1JTUVDb250ZW50X1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVQYXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldEVQYXJ0KCkKLQkgKiBAc2VlICNnZXRNSU1FQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TUlNRUNvbnRlbnRfRVBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydCA8ZW0+UGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNSU1FUGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIDxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQjZ2V0RU1JTUVQYXJ0IDxlbT5FTUlNRSBQYXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FTUlNRSBQYXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkI2dldEVNSU1FUGFydCgpCi0JICogQHNlZSAjZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1JTUVNdWx0aXBhcnRSZWxhdGVkX0VNSU1FUGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sIDxlbT5NaW1lIFhtbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NaW1lIFhtbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TUlNRU1pbWVYbWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sI2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVQYXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sI2dldEVQYXJ0KCkKLQkgKiBAc2VlICNnZXRNSU1FTWltZVhtbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TUlNRU1pbWVYbWxfRVBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IDxlbT5JTUlNRSBQYXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklNSU1FIFBhcnQ8L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJTUlNRVBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIDxlbT5JTUlNRSBNdWx0aXBhcnQgUmVsYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTUlNRSBNdWx0aXBhcnQgUmVsYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQgPGVtPklNSU1FIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU1JTUUgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElNSU1FQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwgPGVtPklNSU1FIE1pbWUgWG1sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklNSU1FIE1pbWUgWG1sPC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwiIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SU1JTUVNaW1lWG1sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS51dGlsLkxpc3QgPGVtPkxpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxpc3Q8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuTGlzdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVGYWN0b3J5IGdldE1JTUVGYWN0b3J5KCk7Ci0KLX0gLy9NSU1FUGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRVBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjYjgyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRVBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRVBhcnQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVQYXJ0IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBhZGRFeHRlbnNpYmlsaXR5RWxlbWVudChqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5MaXN0IiBwYXJhbWV0ZXJzPSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0KLX0gLy8gTUlNRVBhcnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTZhMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwudXRpbC5NSU1FQ29uc3RhbnRzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRUNvbnRlbnRJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVDb250ZW50SW1wbCNnZXRFUGFydCA8ZW0+RVBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FQ29udGVudEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBNSU1FQ29udGVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUGFydCgpIDxlbT5FUGFydDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RVBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQYXJ0IGVQYXJ0ID0gbnVsbDsKLQkKLSAgICBwcml2YXRlIFN0cmluZyBwYXJ0OyAvLyBUQkQKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNSU1FQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TUlNRUNvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnQgZ2V0RVBhcnQoKSB7Ci0JCWlmIChlUGFydCAhPSBudWxsICYmIGVQYXJ0LmVJc1Byb3h5KCkpIHsKLQkJCVBhcnQgb2xkRVBhcnQgPSBlUGFydDsKLQkJCWVQYXJ0ID0gKFBhcnQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVQYXJ0KTsKLQkJCWlmIChlUGFydCAhPSBvbGRFUGFydCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRVBBUlQsIG9sZEVQYXJ0LCBlUGFydCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlUGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFydCBiYXNpY0dldEVQYXJ0KCkgewotCQlyZXR1cm4gZVBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RVBhcnQoUGFydCBuZXdFUGFydCkgewotCQlQYXJ0IG9sZEVQYXJ0ID0gZVBhcnQ7Ci0JCWVQYXJ0ID0gbmV3RVBhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRVBBUlQsIG9sZEVQYXJ0LCBlUGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0KFN0cmluZyBwYXJ0KSB7Ci0gICAgICB0aGlzLnBhcnQgPSBwYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnQoKSB7Ci0gICAgICByZXR1cm4gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VQQVJUOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RVBhcnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFUGFydCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRVBBUlQ6Ci0JCQkJc2V0RVBhcnQoKFBhcnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FUEFSVDoKLQkJCQlzZXRFUGFydCgoUGFydCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FUEFSVDoKLQkJCQlyZXR1cm4gZVBhcnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAJc2V0UGFydAotICAgICAgKE1JTUVDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBNSU1FQ29uc3RhbnRzLlBBUlRfQVRUUklCVVRFKSk7Ci0gIAlzZXRUeXBlCi0gICAgICAoTUlNRUNvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIE1JTUVDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IE1JTUVQYWNrYWdlLmVJTlNUQU5DRS4gZ2V0TUlNRUNvbnRlbnRfRVBhcnQoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LE1JTUVDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUsZ2V0UGFydCgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuIGdldE1JTUVDb250ZW50X1R5cGUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LE1JTUVDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsZ2V0VHlwZSgpKTsKLSAgICB9Ci0gIH0KLQotfSAvL01JTUVDb250ZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzOGE1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBNSU1FRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlQ6IHJldHVybiBjcmVhdGVNSU1FQ29udGVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlQ6IHJldHVybiBjcmVhdGVNSU1FUGFydCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEOiByZXR1cm4gY3JlYXRlTUlNRU11bHRpcGFydFJlbGF0ZWQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTDogcmV0dXJuIGNyZWF0ZU1JTUVNaW1lWG1sKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5MSVNUOgotCQkJCXJldHVybiBjcmVhdGVMaXN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5MSVNUOgotCQkJCXJldHVybiBjb252ZXJ0TGlzdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRUNvbnRlbnQgY3JlYXRlTUlNRUNvbnRlbnQoKSB7Ci0JCU1JTUVDb250ZW50SW1wbCBtaW1lQ29udGVudCA9IG5ldyBNSU1FQ29udGVudEltcGwoKTsKLQkJcmV0dXJuIG1pbWVDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FUGFydCBjcmVhdGVNSU1FUGFydCgpIHsKLQkJTUlNRVBhcnRJbXBsIG1pbWVQYXJ0ID0gbmV3IE1JTUVQYXJ0SW1wbCgpOwotCQlyZXR1cm4gbWltZVBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVNdWx0aXBhcnRSZWxhdGVkIGNyZWF0ZU1JTUVNdWx0aXBhcnRSZWxhdGVkKCkgewotCQlNSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwgbWltZU11bHRpcGFydFJlbGF0ZWQgPSBuZXcgTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsKCk7Ci0JCXJldHVybiBtaW1lTXVsdGlwYXJ0UmVsYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRU1pbWVYbWwgY3JlYXRlTUlNRU1pbWVYbWwoKSB7Ci0JCU1JTUVNaW1lWG1sSW1wbCBtaW1lTWltZVhtbCA9IG5ldyBNSU1FTWltZVhtbEltcGwoKTsKLQkJcmV0dXJuIG1pbWVNaW1lWG1sOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZUxpc3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChMaXN0KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExpc3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVQYWNrYWdlIGdldE1JTUVQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1JTUVQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1JTUVQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBNSU1FUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotfSAvL01JTUVGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRU1pbWVYbWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FTWltZVhtbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1NGI0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FTWltZVhtbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsLk1JTUVDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWltZSBYbWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVNaW1lWG1sSW1wbCNnZXRFUGFydCA8ZW0+RVBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FTWltZVhtbEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBNSU1FTWltZVhtbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RVBhcnQoKSA8ZW0+RVBhcnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFydCBlUGFydCA9IG51bGw7Ci0JCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFydDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNSU1FTWltZVhtbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TUlNRU1pbWVYbWwoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFydCBnZXRFUGFydCgpIHsKLQkJaWYgKGVQYXJ0ICE9IG51bGwgJiYgZVBhcnQuZUlzUHJveHkoKSkgewotCQkJUGFydCBvbGRFUGFydCA9IGVQYXJ0OwotCQkJZVBhcnQgPSAoUGFydCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZVBhcnQpOwotCQkJaWYgKGVQYXJ0ICE9IG9sZEVQYXJ0KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRVBBUlQsIG9sZEVQYXJ0LCBlUGFydCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlUGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFydCBiYXNpY0dldEVQYXJ0KCkgewotCQlyZXR1cm4gZVBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RVBhcnQoUGFydCBuZXdFUGFydCkgewotCQlQYXJ0IG9sZEVQYXJ0ID0gZVBhcnQ7Ci0JCWVQYXJ0ID0gbmV3RVBhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VQQVJULCBvbGRFUGFydCwgZVBhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydChTdHJpbmcgcGFydCkgewotICAgICAgdGhpcy5wYXJ0ID0gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0KCkgewotICAgICAgcmV0dXJuIHBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRVBBUlQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFUGFydCgpOwotCQkJCXJldHVybiBiYXNpY0dldEVQYXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FUEFSVDoKLQkJCQlzZXRFUGFydCgoUGFydCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VQQVJUOgotCQkJCXNldEVQYXJ0KChQYXJ0KW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FUEFSVDoKLQkJCQlyZXR1cm4gZVBhcnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgCXNldFBhcnQKLSAgICAgIChNSU1FQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgTUlNRUNvbnN0YW50cy5QQVJUX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gTUlNRVBhY2thZ2UuZUlOU1RBTkNFLiBnZXRNSU1FQ29udGVudF9FUGFydCgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsTUlNRUNvbnN0YW50cy5QQVJUX0FUVFJJQlVURSxnZXRQYXJ0KCkpOwotICAgIH0KLSAgfQotCi19IC8vTUlNRU1pbWVYbWxJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjA2MThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aXBhcnQgUmVsYXRlZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsI2dldEVNSU1FUGFydCA8ZW0+RU1JTUUgUGFydDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1JTUVNdWx0aXBhcnRSZWxhdGVkIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFTUlNRVBhcnQoKSA8ZW0+RU1JTUUgUGFydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFTUlNRVBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlTUlNRVBhcnQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1JTUVQYWNrYWdlLmVJTlNUQU5DRS5nZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFTUlNRVBhcnQoKSB7Ci0JCWlmIChlTUlNRVBhcnQgPT0gbnVsbCkgewotCQkJZU1JTUVQYXJ0ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1JTUVQYXJ0LmNsYXNzLCB0aGlzLCBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUKTsKLQkJfQotCQlyZXR1cm4gZU1JTUVQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1JTUVQYXJ0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IG1pbWVQYXJ0KSB7Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNSU1FUGFydHMoKSB7Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VNSU1FX1BBUlQ6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RU1JTUVQYXJ0KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VNSU1FX1BBUlQ6Ci0JCQkJcmV0dXJuIGdldEVNSU1FUGFydCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVDoKLQkJCQlnZXRFTUlNRVBhcnQoKS5jbGVhcigpOwotCQkJCWdldEVNSU1FUGFydCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VNSU1FX1BBUlQ6Ci0JCQkJZ2V0RU1JTUVQYXJ0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVDoKLQkJCQlyZXR1cm4gZU1JTUVQYXJ0ICE9IG51bGwgJiYgIWVNSU1FUGFydC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgfQotCi19IC8vTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FUGFja2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDE2ZGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMUGFja2FnZUltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RQYWNrYWdlSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBNSU1FUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWltZUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWltZVBhcnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWltZU1pbWVYbWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW1pbWVQYXJ0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGltaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbWltZUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW1pbWVNaW1lWG1sRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGxpc3RFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNSU1FUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIE1JTUVGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1JTUVQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChNSU1FUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoTUlNRVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZS4KLQkJTUlNRVBhY2thZ2VJbXBsIHRoZU1JTUVQYWNrYWdlID0gKE1JTUVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgTUlNRVBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJWFNEUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdTRExQYWNrYWdlSW1wbCB0aGVXU0RMUGFja2FnZSA9IChXU0RMUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChXU0RMUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KFdTRExQYWNrYWdlLmVOU19VUkkpIDogV1NETFBhY2thZ2VJbXBsLmVJTlNUQU5DRSk7Ci0KLQkJLy8gU3RlcCAxOiBjcmVhdGUgbWV0YS1tb2RlbCBvYmplY3RzCi0JCXRoZU1JTUVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXU0RMUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBTdGVwIDI6IGNvbXBsZXRlIGluaXRpYWxpemF0aW9uCi0JCXRoZU1JTUVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV1NETFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCXJldHVybiB0aGVNSU1FUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1JTUVDb250ZW50KCkgewotCQlyZXR1cm4gbWltZUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TUlNRUNvbnRlbnRfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1pbWVDb250ZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TUlNRUNvbnRlbnRfRVBhcnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltaW1lQ29udGVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TUlNRVBhcnQoKSB7Ci0JCXJldHVybiBtaW1lUGFydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1JTUVNdWx0aXBhcnRSZWxhdGVkKCkgewotCQlyZXR1cm4gbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWRfRU1JTUVQYXJ0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1JTUVNaW1lWG1sKCkgewotCQlyZXR1cm4gbWltZU1pbWVYbWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TUlNRU1pbWVYbWxfRVBhcnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltaW1lTWltZVhtbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SU1JTUVQYXJ0KCkgewotCQlyZXR1cm4gaW1pbWVQYXJ0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SU1JTUVNdWx0aXBhcnRSZWxhdGVkKCkgewotCQlyZXR1cm4gaW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SU1JTUVDb250ZW50KCkgewotCQlyZXR1cm4gaW1pbWVDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SU1JTUVNaW1lWG1sKCkgewotCQlyZXR1cm4gaW1pbWVNaW1lWG1sRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TGlzdCgpIHsKLQkJcmV0dXJuIGxpc3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVGYWN0b3J5IGdldE1JTUVGYWN0b3J5KCkgewotCQlyZXR1cm4gKE1JTUVGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCW1pbWVDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTUVfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWltZUNvbnRlbnRFQ2xhc3MsIE1JTUVfQ09OVEVOVF9fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWltZUNvbnRlbnRFQ2xhc3MsIE1JTUVfQ09OVEVOVF9fRVBBUlQpOwotCi0JCW1pbWVQYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTUVfUEFSVCk7Ci0KLQkJbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUlNRV9NVUxUSVBBUlRfUkVMQVRFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MsIE1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VNSU1FX1BBUlQpOwotCi0JCW1pbWVNaW1lWG1sRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTUVfTUlNRV9YTUwpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1pbWVNaW1lWG1sRUNsYXNzLCBNSU1FX01JTUVfWE1MX19FUEFSVCk7Ci0KLQkJaW1pbWVQYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElNSU1FX1BBUlQpOwotCi0JCWltaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTUlNRV9NVUxUSVBBUlRfUkVMQVRFRCk7Ci0KLQkJaW1pbWVDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKElNSU1FX0NPTlRFTlQpOwotCi0JCWltaW1lTWltZVhtbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTUlNRV9NSU1FX1hNTCk7Ci0KLQkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLQkJbGlzdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShMSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJV1NETFBhY2thZ2VJbXBsIHRoZVdTRExQYWNrYWdlID0gKFdTRExQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXU0RMUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCW1pbWVDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQltaW1lQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElNSU1FQ29udGVudCgpKTsKLQkJbWltZVBhcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCW1pbWVQYXJ0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SU1JTUVQYXJ0KCkpOwotCQltaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJTUlNRU11bHRpcGFydFJlbGF0ZWQoKSk7Ci0JCW1pbWVNaW1lWG1sRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQltaW1lTWltZVhtbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElNSU1FTWltZVhtbCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKG1pbWVDb250ZW50RUNsYXNzLCBNSU1FQ29udGVudC5jbGFzcywgIk1JTUVDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TUlNRUNvbnRlbnRfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1JTUVDb250ZW50X0VQYXJ0KCksIHRoZVdTRExQYWNrYWdlLmdldFBhcnQoKSwgbnVsbCwgImVQYXJ0IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotCQlFT3BlcmF0aW9uIG9wID0gYWRkRU9wZXJhdGlvbihtaW1lQ29udGVudEVDbGFzcywgbnVsbCwgInNldFBhcnQiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcnQiKTsKLQotCQlhZGRFT3BlcmF0aW9uKG1pbWVDb250ZW50RUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0UGFydCIpOwotCi0JCWluaXRFQ2xhc3MobWltZVBhcnRFQ2xhc3MsIE1JTUVQYXJ0LmNsYXNzLCAiTUlNRVBhcnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtaW1lUGFydEVDbGFzcywgbnVsbCwgImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Iik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoZVdTRExQYWNrYWdlLmdldElFeHRlbnNpYmlsaXR5RWxlbWVudCgpLCAiZXh0ZW5zaWJpbGl0eUVsZW1lbnQiKTsKLQotCQlhZGRFT3BlcmF0aW9uKG1pbWVQYXJ0RUNsYXNzLCB0aGlzLmdldExpc3QoKSwgImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIpOwotCi0JCWluaXRFQ2xhc3MobWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MsIE1JTUVNdWx0aXBhcnRSZWxhdGVkLmNsYXNzLCAiTUlNRU11bHRpcGFydFJlbGF0ZWQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZF9FTUlNRVBhcnQoKSwgdGhpcy5nZXRNSU1FUGFydCgpLCBudWxsLCAiZU1JTUVQYXJ0IiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLCBudWxsLCAiYWRkTUlNRVBhcnQiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTUlNRVBhcnQoKSwgIm1pbWVQYXJ0Iik7Ci0KLQkJYWRkRU9wZXJhdGlvbihtaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcywgdGhpcy5nZXRMaXN0KCksICJnZXRNSU1FUGFydHMiKTsKLQotCQlpbml0RUNsYXNzKG1pbWVNaW1lWG1sRUNsYXNzLCBNSU1FTWltZVhtbC5jbGFzcywgIk1JTUVNaW1lWG1sIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TUlNRU1pbWVYbWxfRVBhcnQoKSwgdGhlV1NETFBhY2thZ2UuZ2V0UGFydCgpLCBudWxsLCAiZVBhcnQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtaW1lTWltZVhtbEVDbGFzcywgbnVsbCwgInNldFBhcnQiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcnQiKTsKLQotCQlhZGRFT3BlcmF0aW9uKG1pbWVNaW1lWG1sRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0UGFydCIpOwotCi0JCWluaXRFQ2xhc3MoaW1pbWVQYXJ0RUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydC5jbGFzcywgIklNSU1FUGFydCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZC5jbGFzcywgIklNSU1FTXVsdGlwYXJ0UmVsYXRlZCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaW1pbWVDb250ZW50RUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudC5jbGFzcywgIklNSU1FQ29udGVudCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaW1pbWVNaW1lWG1sRUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbC5jbGFzcywgIklNSU1FTWltZVhtbCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGxpc3RFRGF0YVR5cGUsIExpc3QuY2xhc3MsICJMaXN0IiwgSVNfU0VSSUFMSVpBQkxFKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotfSAvL01JTUVQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRVBhcnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FUGFydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0NDg0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FUGFydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FUGFydEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBNSU1FUGFydCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1JTUVQYXJ0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1JTUVQYWNrYWdlLmVJTlNUQU5DRS5nZXRNSU1FUGFydCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50KSB7Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSB7Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vTUlNRVBhcnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg4N2UxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1JTUVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTUlNRVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTUlNRVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1JTUVTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgTUlNRVN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1JTUVDb250ZW50KE1JTUVDb250ZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNSU1FQ29udGVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1JTUVQYXJ0KE1JTUVQYXJ0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNSU1FUGFydEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1JTUVNdWx0aXBhcnRSZWxhdGVkKE1JTUVNdWx0aXBhcnRSZWxhdGVkIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNSU1FTXVsdGlwYXJ0UmVsYXRlZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1JTUVNaW1lWG1sKE1JTUVNaW1lWG1sIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNSU1FTWltZVhtbEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FUGFydChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSU1JTUVQYXJ0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSU1JTUVNdWx0aXBhcnRSZWxhdGVkKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJTUlNRU11bHRpcGFydFJlbGF0ZWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRUNvbnRlbnQoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlNSU1FQ29udGVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FTWltZVhtbChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSU1JTUVNaW1lWG1sQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNSU1FQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0IDxlbT5QYXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNSU1FUGFydEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIDxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTUlNRU11bHRpcGFydFJlbGF0ZWRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbCA8ZW0+TWltZSBYbWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1JTUVNaW1lWG1sQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCA8ZW0+SU1JTUUgUGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJTUlNRVBhcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIDxlbT5JTUlNRSBNdWx0aXBhcnQgUmVsYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJTUlNRU11bHRpcGFydFJlbGF0ZWRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IDxlbT5JTUlNRSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlNSU1FQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwgPGVtPklNSU1FIE1pbWUgWG1sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlNSU1FTWltZVhtbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01JTUVBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg5ODk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTUlNRUNvbnN0YW50cyAKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9FTEVNRU5UX1RBRyA9ICJjb250ZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9YTUxfRUxFTUVOVF9UQUcgPSAibWltZVhNTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJUEFSVF9SRUxBVEVEX0VMRU1FTlRfVEFHID0gIm11bHRpcGFydFJlbGF0ZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUX0VMRU1FTlRfVEFHID0gInBhcnQiOwotCSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUX0FUVFJJQlVURSA9InBhcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFJJQlVURSA9InR5cGUiOwotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPyBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4YTBmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBNSU1FRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgaWYgKE1JTUVDb25zdGFudHMuTUlNRV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIGlmIChNSU1FQ29uc3RhbnRzLkNPTlRFTlRfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBNSU1FRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTUlNRUNvbnRlbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE1JTUVDb25zdGFudHMuTUlNRV9YTUxfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBNSU1FRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTUlNRU1pbWVYbWwoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE1JTUVDb25zdGFudHMuTVVMVElQQVJUX1JFTEFURURfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBNSU1FRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTUlNRU11bHRpcGFydFJlbGF0ZWQoKTsKLSAgICAgIH0KLSAgICAgIC8qIFRPRE8gLSBmaXggdGhlIHJvc2UgbW9kZWwKLSAgICAgIGVsc2UgaWYgKCJwYXJ0Ii5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIE1JTUVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNSU1FUGFydCgpOwotICAgICAgfQotICAgICAgKi8KLQkgIGVsc2UKLQkgIHsKLQkgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVuaGFuZGxlZCBsb2NhbE5hbWU6ICIgKyBsb2NhbE5hbWUpOwotCSAgICByZXR1cm4gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVuaGFuZGxlZCBuYW1lc3BhY2U6ICIgKyBuYW1lc3BhY2UpOwotICAgICAgcmV0dXJuIFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhNTZkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2ggZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1JTUVTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTUlNRVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1JTUVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJc3dpdGNoICh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVDogewotCQkJCQlNSU1FQ29udGVudCBtaW1lQ29udGVudCA9IChNSU1FQ29udGVudCl0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1JTUVDb250ZW50KG1pbWVDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJTUlNRUNvbnRlbnQobWltZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChtaW1lQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChtaW1lQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUOiB7Ci0JCQkJCU1JTUVQYXJ0IG1pbWVQYXJ0ID0gKE1JTUVQYXJ0KXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTUlNRVBhcnQobWltZVBhcnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChtaW1lUGFydCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlNSU1FUGFydChtaW1lUGFydCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG1pbWVQYXJ0KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVQYXJ0KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEOiB7Ci0JCQkJCU1JTUVNdWx0aXBhcnRSZWxhdGVkIG1pbWVNdWx0aXBhcnRSZWxhdGVkID0gKE1JTUVNdWx0aXBhcnRSZWxhdGVkKXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTUlNRU11bHRpcGFydFJlbGF0ZWQobWltZU11bHRpcGFydFJlbGF0ZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChtaW1lTXVsdGlwYXJ0UmVsYXRlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlNSU1FTXVsdGlwYXJ0UmVsYXRlZChtaW1lTXVsdGlwYXJ0UmVsYXRlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG1pbWVNdWx0aXBhcnRSZWxhdGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVNdWx0aXBhcnRSZWxhdGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MOiB7Ci0JCQkJCU1JTUVNaW1lWG1sIG1pbWVNaW1lWG1sID0gKE1JTUVNaW1lWG1sKXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTUlNRU1pbWVYbWwobWltZU1pbWVYbWwpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChtaW1lTWltZVhtbCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlNSU1FTWltZVhtbChtaW1lTWltZVhtbCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG1pbWVNaW1lWG1sKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVNaW1lWG1sKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FQ29udGVudChNSU1FQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFydDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTUlNRVBhcnQoTUlNRVBhcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTUlNRU11bHRpcGFydFJlbGF0ZWQoTUlNRU11bHRpcGFydFJlbGF0ZWQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaW1lIFhtbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaW1lIFhtbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTUlNRU1pbWVYbWwoTUlNRU1pbWVYbWwgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTUlNRSBQYXJ0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNSU1FIFBhcnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FUGFydChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNSU1FIE11bHRpcGFydCBSZWxhdGVkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNSU1FIE11bHRpcGFydCBSZWxhdGVkPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRU11bHRpcGFydFJlbGF0ZWQoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTUlNRSBDb250ZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNSU1FIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FQ29udGVudChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNSU1FIE1pbWUgWG1sPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNSU1FIE1pbWUgWG1sPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRU1pbWVYbWwoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTUlNRVN3aXRjaApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBBZGRyZXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlZmVhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEFkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQWRkcmVzcygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEFkZHJlc3MgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3MgewotCi0KLX0gLy8gU09BUEFkZHJlc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQQmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDdmNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyNnZXRUcmFuc3BvcnRVUkkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQmluZGluZygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEJpbmRpbmcgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmcgewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zcG9ydCBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zcG9ydCBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRUcmFuc3BvcnRVUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQmluZGluZ19UcmFuc3BvcnRVUkkoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldFRyYW5zcG9ydFVSSSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0VHJhbnNwb3J0VVJJIDxlbT5UcmFuc3BvcnQgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zcG9ydCBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRUcmFuc3BvcnRVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0VHJhbnNwb3J0VVJJKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3R5bGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0U3R5bGUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQmluZGluZ19TdHlsZSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0U3R5bGUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFN0eWxlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFN0eWxlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU09BUEJpbmRpbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQQm9keS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCb2R5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTVhYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb2R5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRVc2UgPGVtPlVzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldEVuY29kaW5nU3R5bGVzIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRQYXJ0cyA8ZW0+UGFydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQm9keSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEJvZHkgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHkgewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2U8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRVc2UoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQm9keV9Vc2UoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldFVzZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0VXNlIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFVzZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWVzcGFjZVVSSShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBCb2R5X05hbWVzcGFjZVVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBCb2R5X0VuY29kaW5nU3R5bGVzKCkKLSAgICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuSVN0cmluZyIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlMaXN0IGdldEVuY29kaW5nU3R5bGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQm9keV9QYXJ0cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0IgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUxpc3QgZ2V0UGFydHMoKTsKLQotfSAvLyBTT0FQQm9keQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3YzI0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotICAvKioKLSAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEZhY3RvcnlJbXBsKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBCaW5kaW5nIGNyZWF0ZVNPQVBCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Qm9keTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Cb2R5PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBCb2R5IGNyZWF0ZVNPQVBCb2R5KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGVhZGVyIEJhc2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGVhZGVyIEJhc2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEhlYWRlckJhc2UgY3JlYXRlU09BUEhlYWRlckJhc2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GYXVsdDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GYXVsdDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQRmF1bHQgY3JlYXRlU09BUEZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQT3BlcmF0aW9uIGNyZWF0ZVNPQVBPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZGRyZXNzPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFkZHJlc3M8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEFkZHJlc3MgY3JlYXRlU09BUEFkZHJlc3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXIgRmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGVhZGVyIEZhdWx0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBIZWFkZXJGYXVsdCBjcmVhdGVTT0FQSGVhZGVyRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXI8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGVhZGVyPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBIZWFkZXIgY3JlYXRlU09BUEhlYWRlcigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQUGFja2FnZSBnZXRTT0FQUGFja2FnZSgpOwotCi19IC8vU09BUEZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1NmJmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldFVzZSA8ZW0+VXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEZhdWx0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQRmF1bHQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0IHsKLQotfSAvLyBTT0FQRmF1bHQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEhlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZmY2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyI2dldEhlYWRlckZhdWx0cyA8ZW0+SGVhZGVyIEZhdWx0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXIoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBIZWFkZXIgZXh0ZW5kcyBTT0FQSGVhZGVyQmFzZXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlYWRlciBGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGVhZGVyIEZhdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IZWFkZXIgRmF1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyX0hlYWRlckZhdWx0cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0IiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRIZWFkZXJGYXVsdHMoKTsKLQotfSAvLyBTT0FQSGVhZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEhlYWRlckJhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWJiOWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGVhZGVyIEJhc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFVzZSA8ZW0+VXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRQYXJ0IDxlbT5QYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEhlYWRlckJhc2UoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBIZWFkZXJCYXNlIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vc2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVzZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXJCYXNlX1VzZSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0VXNlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRVc2UgPGVtPlVzZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2U8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRVc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0VXNlKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0TmFtZXNwYWNlVVJJKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEhlYWRlckJhc2VfTmFtZXNwYWNlVVJJKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbmNvZGluZyBTdHlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEhlYWRlckJhc2VfRW5jb2RpbmdTdHlsZXMoKQotICAgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5JU3RyaW5nIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVuY29kaW5nU3R5bGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0TWVzc2FnZShNZXNzYWdlKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyQmFzZV9NZXNzYWdlKCkKLSAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU1lc3NhZ2UgZ2V0TWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0TWVzc2FnZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRNZXNzYWdlKE1lc3NhZ2UgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldFBhcnQoUGFydCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEhlYWRlckJhc2VfUGFydCgpCi0gICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlQYXJ0IGdldFBhcnQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFBhcnQgPGVtPlBhcnQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UGFydChQYXJ0IHZhbHVlKTsKLQotfSAvLyBTT0FQSGVhZGVyQmFzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJGYXVsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQ4ODUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyRmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlciBGYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5ncy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXJGYXVsdCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEhlYWRlckZhdWx0IGV4dGVuZHMgU09BUEhlYWRlckJhc2UgewotfSAvLyBTT0FQSGVhZGVyRmF1bHQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY2YjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24jZ2V0U29hcEFjdGlvblVSSSA8ZW0+U29hcCBBY3Rpb24gVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbiNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQT3BlcmF0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQT3BlcmF0aW9uIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb24gewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBBY3Rpb24gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBBY3Rpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEFjdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRTb2FwQWN0aW9uVVJJKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUE9wZXJhdGlvbl9Tb2FwQWN0aW9uVVJJKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXRTb2FwQWN0aW9uVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFNvYXBBY3Rpb25VUkkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEFjdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRTb2FwQWN0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFNvYXBBY3Rpb25VUkkoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3R5bGU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRTdHlsZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBPcGVyYXRpb25fU3R5bGUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldFN0eWxlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFN0eWxlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFN0eWxlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU09BUE9wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmYWU1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBuYW1lLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBlTkFNRSA9ICJzb2FwIjsKLQotICAvKioKLSAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL1NPQVAiOwotCi0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJzb2FwIjsKLQotICAvKioKLSAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwuaW5pdCgpOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCaW5kaW5nSW1wbCA8ZW0+QmluZGluZzwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEJpbmRpbmdJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUFBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HID0gMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX1NUWUxFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJpbmRpbmc8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQklORElOR19GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCb2R5SW1wbCA8ZW0+Qm9keTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEJvZHlJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUFBhY2thZ2VJbXBsI2dldFNPQVBCb2R5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZID0gMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQk9EWV9fVVNFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX05BTUVTUEFDRV9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZyBTdHlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX0VOQ09ESU5HX1NUWUxFUyA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19QQVJUUyA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Cb2R5PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwgPGVtPkhlYWRlciBCYXNlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUEhlYWRlckJhc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFID0gMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19VU0UgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfX05BTUVTUEFDRV9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZyBTdHlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVMgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0UgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfX1BBUlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SGVhZGVyIEJhc2U8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQRmF1bHRJbXBsIDxlbT5GYXVsdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEZhdWx0SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUID0gMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfRkFVTFRfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19VU0UgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfRkFVTFRfX05BTUVTUEFDRV9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZyBTdHlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVMgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RmF1bHQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfRkFVTFRfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQT3BlcmF0aW9uSW1wbCA8ZW0+T3BlcmF0aW9uPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQT3BlcmF0aW9uSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT04gPSA0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT05fX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX09QRVJBVElPTl9fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQWN0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX09QRVJBVElPTl9fU09BUF9BQ1RJT05fVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT05fX1NUWUxFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQWRkcmVzc0ltcGwgPGVtPkFkZHJlc3M8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBBZGRyZXNzSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQQWRkcmVzcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfQUREUkVTUyA9IDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BZGRyZXNzPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0FERFJFU1NfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyRmF1bHRJbXBsIDxlbT5IZWFkZXIgRmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJGYXVsdEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUEhlYWRlckZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFQgPSA2OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBTT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19FTEVNRU5UID0gU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19SRVFVSVJFRCA9IFNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19FTEVNRU5UX1RZUEUgPSBTT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfX1VTRSA9IFNPQVBfSEVBREVSX0JBU0VfX1VTRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfX05BTUVTUEFDRV9VUkkgPSBTT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUyA9IFNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfX01FU1NBR0UgPSBTT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9fUEFSVCA9IFNPQVBfSEVBREVSX0JBU0VfX1BBUlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SGVhZGVyIEZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9GRUFUVVJFX0NPVU5UID0gU09BUF9IRUFERVJfQkFTRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVySW1wbCA8ZW0+SGVhZGVyPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVySW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQSGVhZGVyKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVIgPSA3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBTT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19FTEVNRU5UID0gU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19SRVFVSVJFRCA9IFNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19FTEVNRU5UX1RZUEUgPSBTT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX1VTRSA9IFNPQVBfSEVBREVSX0JBU0VfX1VTRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX05BTUVTUEFDRV9VUkkgPSBTT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX0VOQ09ESU5HX1NUWUxFUyA9IFNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX01FU1NBR0UgPSBTT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9fUEFSVCA9IFNPQVBfSEVBREVSX0JBU0VfX1BBUlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWFkZXIgRmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFMgPSBTT0FQX0hFQURFUl9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkVBVFVSRV9DT1VOVCA9IFNPQVBfSEVBREVSX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SVN0cmluZzwvZW0+JyBkYXRhIHR5cGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRJU3RyaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgSVNUUklORyA9IDg7Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nIDxlbT5CaW5kaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEJpbmRpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0VHJhbnNwb3J0VVJJIDxlbT5UcmFuc3BvcnQgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc3BvcnQgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyNnZXRUcmFuc3BvcnRVUkkoKQotICAgKiBAc2VlICNnZXRTT0FQQmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQQmluZGluZ19UcmFuc3BvcnRVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdHlsZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0U3R5bGUoKQotICAgKiBAc2VlICNnZXRTT0FQQmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQQmluZGluZ19TdHlsZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkgPGVtPkJvZHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Cb2R5PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVDbGFzcyBnZXRTT0FQQm9keSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRVc2UgPGVtPlVzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRVc2UoKQotICAgKiBAc2VlICNnZXRTT0FQQm9keSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9Vc2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAc2VlICNnZXRTT0FQQm9keSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9OYW1lc3BhY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0RW5jb2RpbmdTdHlsZXMoKQotICAgKiBAc2VlICNnZXRTT0FQQm9keSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9FbmNvZGluZ1N0eWxlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldFBhcnRzIDxlbT5QYXJ0czwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5QYXJ0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0UGFydHMoKQotICAgKiBAc2VlICNnZXRTT0FQQm9keSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRVJlZmVyZW5jZSBnZXRTT0FQQm9keV9QYXJ0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UgPGVtPkhlYWRlciBCYXNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SGVhZGVyIEJhc2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUNsYXNzIGdldFNPQVBIZWFkZXJCYXNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFVzZSA8ZW0+VXNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFVzZSgpCi0gICAqIEBzZWUgI2dldFNPQVBIZWFkZXJCYXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBIZWFkZXJCYXNlX1VzZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBzZWUgI2dldFNPQVBIZWFkZXJCYXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBIZWFkZXJCYXNlX05hbWVzcGFjZVVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldEVuY29kaW5nU3R5bGVzIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRFbmNvZGluZ1N0eWxlcygpCi0gICAqIEBzZWUgI2dldFNPQVBIZWFkZXJCYXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBIZWFkZXJCYXNlX0VuY29kaW5nU3R5bGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk1lc3NhZ2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldE1lc3NhZ2UoKQotICAgKiBAc2VlICNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRVJlZmVyZW5jZSBnZXRTT0FQSGVhZGVyQmFzZV9NZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFBhcnQgPGVtPlBhcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlBhcnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFBhcnQoKQotICAgKiBAc2VlICNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRVJlZmVyZW5jZSBnZXRTT0FQSGVhZGVyQmFzZV9QYXJ0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQgPGVtPkZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVDbGFzcyBnZXRTT0FQRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldFVzZSA8ZW0+VXNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXRVc2UoKQotICAgKiBAc2VlICNnZXRTT0FQRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEZhdWx0X1VzZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQHNlZSAjZ2V0U09BUEZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBGYXVsdF9OYW1lc3BhY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXRFbmNvZGluZ1N0eWxlcygpCi0gICAqIEBzZWUgI2dldFNPQVBGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQRmF1bHRfRW5jb2RpbmdTdHlsZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVDbGFzcyBnZXRTT0FQT3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24jZ2V0U29hcEFjdGlvblVSSSA8ZW0+U29hcCBBY3Rpb24gVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIEFjdGlvbiBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24jZ2V0U29hcEFjdGlvblVSSSgpCi0gICAqIEBzZWUgI2dldFNPQVBPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUE9wZXJhdGlvbl9Tb2FwQWN0aW9uVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24jZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdHlsZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbiNnZXRTdHlsZSgpCi0gICAqIEBzZWUgI2dldFNPQVBPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUE9wZXJhdGlvbl9TdHlsZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3MgPGVtPkFkZHJlc3M8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BZGRyZXNzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcwotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVDbGFzcyBnZXRTT0FQQWRkcmVzcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcyNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzI2dldExvY2F0aW9uVVJJKCkKLSAgICogQHNlZSAjZ2V0U09BUEFkZHJlc3MoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEFkZHJlc3NfTG9jYXRpb25VUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdCA8ZW0+SGVhZGVyIEZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SGVhZGVyIEZhdWx0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEhlYWRlckZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5IZWFkZXI8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEhlYWRlcigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXIjZ2V0SGVhZGVyRmF1bHRzIDxlbT5IZWFkZXIgRmF1bHRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhlYWRlciBGYXVsdHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXIjZ2V0SGVhZGVyRmF1bHRzKCkKLSAgICogQHNlZSAjZ2V0U09BUEhlYWRlcigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRVJlZmVyZW5jZSBnZXRTT0FQSGVhZGVyX0hlYWRlckZhdWx0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SVN0cmluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5JU3RyaW5nPC9lbT4nLgotICAgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRURhdGFUeXBlIGdldElTdHJpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBGYWN0b3J5IGdldFNPQVBGYWN0b3J5KCk7Ci0KLX0gLy9TT0FQUGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEFkZHJlc3NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQWRkcmVzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwN2Q0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQWRkcmVzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBBZGRyZXNzSW1wbCNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEFkZHJlc3NJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEFkZHJlc3MgewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb25VUkkoKSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uVVJJID0gTE9DQVRJT05fVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQQWRkcmVzc0ltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEFkZHJlc3MoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIG5ld0xvY2F0aW9uVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZExvY2F0aW9uVVJJID0gbG9jYXRpb25VUkk7Ci0gICAgbG9jYXRpb25VUkkgPSBuZXdMb2NhdGlvblVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSSwgb2xkTG9jYXRpb25VUkksIGxvY2F0aW9uVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRMb2NhdGlvblVSSSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgc2V0TG9jYXRpb25VUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotICAgICAgICBzZXRMb2NhdGlvblVSSShMT0NBVElPTl9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotICAgICAgICByZXR1cm4gTE9DQVRJT05fVVJJX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvblVSSSAhPSBudWxsIDogIUxPQ0FUSU9OX1VSSV9FREVGQVVMVC5lcXVhbHMobG9jYXRpb25VUkkpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb25VUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQobG9jYXRpb25VUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldExvY2F0aW9uVVJJCi0gICAgICAoU09BUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFNPQVBDb25zdGFudHMuTE9DQVRJT05fQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEFkZHJlc3NfTG9jYXRpb25VUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuTE9DQVRJT05fQVRUUklCVVRFLGdldExvY2F0aW9uVVJJKCkpOwotICAgIH0KLSAgfQotfSAvL1NPQVBBZGRyZXNzSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEJpbmRpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTc3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQmluZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCaW5kaW5nSW1wbCNnZXRUcmFuc3BvcnRVUkkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCaW5kaW5nSW1wbCNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ0ltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQQmluZGluZyB7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0VVJJKCkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VHJhbnNwb3J0VVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0VVJJKCkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VHJhbnNwb3J0VVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zcG9ydFVSSSA9IFRSQU5TUE9SVF9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdHlsZSA9IFNUWUxFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQQmluZGluZ0ltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNwb3J0VVJJKCkKLSAgewotICAgIHJldHVybiB0cmFuc3BvcnRVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc3BvcnRVUkkoU3RyaW5nIG5ld1RyYW5zcG9ydFVSSSkKLSAgewotICAgIFN0cmluZyBvbGRUcmFuc3BvcnRVUkkgPSB0cmFuc3BvcnRVUkk7Ci0gICAgdHJhbnNwb3J0VVJJID0gbmV3VHJhbnNwb3J0VVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fVFJBTlNQT1JUX1VSSSwgb2xkVHJhbnNwb3J0VVJJLCB0cmFuc3BvcnRVUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIHN0eWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIG5ld1N0eWxlKQotICB7Ci0gICAgU3RyaW5nIG9sZFN0eWxlID0gc3R5bGU7Ci0gICAgc3R5bGUgPSBuZXdTdHlsZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1NUWUxFLCBvbGRTdHlsZSwgc3R5bGUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRUcmFuc3BvcnRVUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19TVFlMRToKLSAgICAgICAgcmV0dXJuIGdldFN0eWxlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fVFJBTlNQT1JUX1VSSToKLSAgICAgICAgc2V0VHJhbnNwb3J0VVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fU1RZTEU6Ci0gICAgICAgIHNldFN0eWxlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkk6Ci0gICAgICAgIHNldFRyYW5zcG9ydFVSSShUUkFOU1BPUlRfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1NUWUxFOgotICAgICAgICBzZXRTdHlsZShTVFlMRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19UUkFOU1BPUlRfVVJJOgotICAgICAgICByZXR1cm4gVFJBTlNQT1JUX1VSSV9FREVGQVVMVCA9PSBudWxsID8gdHJhbnNwb3J0VVJJICE9IG51bGwgOiAhVFJBTlNQT1JUX1VSSV9FREVGQVVMVC5lcXVhbHModHJhbnNwb3J0VVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19TVFlMRToKLSAgICAgICAgcmV0dXJuIFNUWUxFX0VERUZBVUxUID09IG51bGwgPyBzdHlsZSAhPSBudWxsIDogIVNUWUxFX0VERUZBVUxULmVxdWFscyhzdHlsZSk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh0cmFuc3BvcnRVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodHJhbnNwb3J0VVJJKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHN0eWxlOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHN0eWxlKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0JCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0U3R5bGUKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5TVFlMRV9BVFRSSUJVVEUpKTsKLSAgICBzZXRUcmFuc3BvcnRVUkkKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5UUkFOU1BPUlRfQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdfU3R5bGUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuU1RZTEVfQVRUUklCVVRFLGdldFN0eWxlKCkpOwotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQQmluZGluZ19UcmFuc3BvcnRVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuVFJBTlNQT1JUX0FUVFJJQlVURSxnZXRUcmFuc3BvcnRVUkkoKSk7Ci0gICAgfQotICB9Ci19IC8vU09BUEJpbmRpbmdJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQm9keUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBCb2R5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWNkYzhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBCb2R5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb2R5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQm9keUltcGwjZ2V0VXNlIDxlbT5Vc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCb2R5SW1wbCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCb2R5SW1wbCNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQm9keUltcGwjZ2V0UGFydHMgPGVtPlBhcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEJvZHlJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEJvZHkgewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZSgpIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2UoKSA8ZW0+VXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2UgPSBVU0VfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gTkFNRVNQQUNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5jb2RpbmdTdHlsZXMoKSA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RW5jb2RpbmdTdHlsZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBFTGlzdCBlbmNvZGluZ1N0eWxlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRzKCkgPGVtPlBhcnRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UGFydHMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBFTGlzdCBwYXJ0cyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBCb2R5SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQQm9keSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXRVc2UoKQotICB7Ci0gICAgcmV0dXJuIHVzZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgbmV3VXNlKQotICB7Ci0gICAgU3RyaW5nIG9sZFVzZSA9IHVzZTsKLSAgICB1c2UgPSBuZXdVc2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9CT0RZX19VU0UsIG9sZFVzZSwgdXNlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuZXdOYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIG5hbWVzcGFjZVVSSSA9IG5ld05hbWVzcGFjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0gIH0KLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdTdHlsZXMoTGlzdCBsaXN0KQotewotICBlbmNvZGluZ1N0eWxlcyA9IChFTGlzdClsaXN0OwotfQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgTGlzdCBnZXRFbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICBpZiAoZW5jb2RpbmdTdHlsZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbmNvZGluZ1N0eWxlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRU5DT0RJTkdfU1RZTEVTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFydHMoTGlzdCBsaXN0KQotICB7Ci0gICAgcGFydHMgPSAoRUxpc3QpbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFBhcnRzKCkKLSAgewotICAgIGlmIChwYXJ0cyA9PSBudWxsKQotICAgIHsKLSAgICAgIHBhcnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChQYXJ0LmNsYXNzLCB0aGlzLCBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1BBUlRTKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHBhcnRzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIExpc3QgaW1wbGljaXRQYXJ0cyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAKLSAgICAgIC8vIFRyeSB0byBmaW5kIGFuIGltcGxpY2l0IG9uZS4KLSAgICAgIGlmKGVDb250YWluZXIoKSBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICAgIHsKLSAgICAgIAlNZXNzYWdlIG1lc3NhZ2UgPSAoKEJpbmRpbmdJbnB1dCllQ29udGFpbmVyKCkpLmdldEVJbnB1dCgpLmdldEVNZXNzYWdlKCk7Ci0gICAgICAJaWYobWVzc2FnZS5nZXRFUGFydHMoKS5zaXplKCkgPiAwKQotICAgICAgCXsKLSAgICAgIAkgIGltcGxpY2l0UGFydHMuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGlmKGVDb250YWluZXIoKSBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQpCi0gICAgICB7Ci0gICAgICAJTWVzc2FnZSBtZXNzYWdlID0gKChCaW5kaW5nT3V0cHV0KWVDb250YWluZXIoKSkuZ2V0RU91dHB1dCgpLmdldEVNZXNzYWdlKCk7Ci0gICAgICAJaWYobWVzc2FnZS5nZXRFUGFydHMoKS5zaXplKCkgPiAwKQotICAgICAgCXsKLSAgICAgIAkgIGltcGxpY2l0UGFydHMuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGlmKGVDb250YWluZXIoKSBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLSAgICAgIHsKLSAgICAgIAlNZXNzYWdlIG1lc3NhZ2UgPSAoKEJpbmRpbmdGYXVsdCllQ29udGFpbmVyKCkpLmdldEVGYXVsdCgpLmdldEVNZXNzYWdlKCk7Ci0gICAgICAJaWYobWVzc2FnZS5nZXRFUGFydHMoKS5zaXplKCkgPiAwKQotICAgICAgCXsKLSAgICAgIAkgIGltcGxpY2l0UGFydHMuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIHJldHVybiBpbXBsaWNpdFBhcnRzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcGFydHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19VU0U6Ci0gICAgICAgIHJldHVybiBnZXRVc2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICByZXR1cm4gZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19QQVJUUzoKLSAgICAgICAgcmV0dXJuIGdldFBhcnRzKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fVVNFOgotICAgICAgICBzZXRVc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUEFSVFM6Ci0gICAgICAgIGdldFBhcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0UGFydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1BBUlRTOgotICAgICAgICBnZXRQYXJ0cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19VU0U6Ci0gICAgICAgIHJldHVybiBVU0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzZSAhPSBudWxsIDogIVVTRV9FREVGQVVMVC5lcXVhbHModXNlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVVJJICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUEFSVFM6Ci0gICAgICAgIHJldHVybiBwYXJ0cyAhPSBudWxsICYmICFwYXJ0cy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh1c2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodXNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZW5jb2RpbmdTdHlsZXM6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RpbmdTdHlsZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSkpCi0gICAgICBzZXRVc2UoY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSkpOwotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKSkKLSAgICAgIHNldE5hbWVzcGFjZVVSSShjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKSk7Ci0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLkVOQ09ESU5HX1NUWUxFX0FUVFJJQlVURSkpIAotICAgIHsKLSAgICAgIFN0cmluZyBlbmNvZGluZ1N0eWxlcyA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLkVOQ09ESU5HX1NUWUxFX0FUVFJJQlVURSk7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbmNvZGluZ1N0eWxlcyk7Ci0gICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIAlnZXRFbmNvZGluZ1N0eWxlcygpLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotICAgIH0gICAKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICAvLyBUQkQgLSByZXNvbHZlIFBhcnRzIHJlZmVyZW5jZSBoZXJlLgotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBCb2R5X1VzZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5VU0VfQVRUUklCVVRFLGdldFVzZSgpKTsKLSAgICAgIGlmKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQQm9keV9OYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSxnZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBCb2R5X0VuY29kaW5nU3R5bGVzKCkpCi0gICAgICB7Ci0gICAgICAgIExpc3QgZW5jb2RpbmdTdHlsZUxpc3QgPSBnZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZXMgPSAiIjsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBlbmNvZGluZ1N0eWxlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVuY29kaW5nU3R5bGVzLmVxdWFscygiIikpIC8vIGZpcnN0IGl0ZXJhdGlvbgotICAgICAgICAgICAgZW5jb2RpbmdTdHlsZXMgKz0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIAllbmNvZGluZ1N0eWxlcyArPSAiICIgKyAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWVuY29kaW5nU3R5bGVzLmVxdWFscygiIikpCi0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFLGVuY29kaW5nU3R5bGVzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzd2l0Y2ggKFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoY2hpbGQpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5QQVJUIDoKLSAgICAgICAgUGFydCBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICAgICAgcGFydC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHBhcnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIGdldFBhcnRzKCkuYWRkKHBhcnQpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgKi8KLX0gLy9TT0FQQm9keUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmY2RhZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgU09BUEZhY3RvcnkgewotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBGYWN0b3J5SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0gIHsKLSAgICBzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElORzogcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWTogcmV0dXJuIGNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0U6IHJldHVybiBjcmVhdGVTT0FQSGVhZGVyQmFzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUOiByZXR1cm4gY3JlYXRlU09BUEZhdWx0KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OOiByZXR1cm4gY3JlYXRlU09BUE9wZXJhdGlvbigpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1M6IHJldHVybiBjcmVhdGVTT0FQQWRkcmVzcygpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVDogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUjogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXIoKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLklTVFJJTkc6Ci0gICAgICAgIHJldHVybiBjcmVhdGVJU3RyaW5nRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5JU1RSSU5HOgotICAgICAgICByZXR1cm4gY29udmVydElTdHJpbmdUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEJpbmRpbmcgY3JlYXRlU09BUEJpbmRpbmcoKQotICB7Ci0gICAgU09BUEJpbmRpbmdJbXBsIHNvYXBCaW5kaW5nID0gbmV3IFNPQVBCaW5kaW5nSW1wbCgpOwotICAgIHJldHVybiBzb2FwQmluZGluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQQm9keSBjcmVhdGVTT0FQQm9keSgpCi0gIHsKLSAgICBTT0FQQm9keUltcGwgc29hcEJvZHkgPSBuZXcgU09BUEJvZHlJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBCb2R5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBIZWFkZXJCYXNlIGNyZWF0ZVNPQVBIZWFkZXJCYXNlKCkKLSAgewotICAgIFNPQVBIZWFkZXJCYXNlSW1wbCBzb2FwSGVhZGVyQmFzZSA9IG5ldyBTT0FQSGVhZGVyQmFzZUltcGwoKTsKLSAgICByZXR1cm4gc29hcEhlYWRlckJhc2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEZhdWx0IGNyZWF0ZVNPQVBGYXVsdCgpCi0gIHsKLSAgICBTT0FQRmF1bHRJbXBsIHNvYXBGYXVsdCA9IG5ldyBTT0FQRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQT3BlcmF0aW9uIGNyZWF0ZVNPQVBPcGVyYXRpb24oKQotICB7Ci0gICAgU09BUE9wZXJhdGlvbkltcGwgc29hcE9wZXJhdGlvbiA9IG5ldyBTT0FQT3BlcmF0aW9uSW1wbCgpOwotICAgIHJldHVybiBzb2FwT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBBZGRyZXNzIGNyZWF0ZVNPQVBBZGRyZXNzKCkKLSAgewotICAgIFNPQVBBZGRyZXNzSW1wbCBzb2FwQWRkcmVzcyA9IG5ldyBTT0FQQWRkcmVzc0ltcGwoKTsKLSAgICByZXR1cm4gc29hcEFkZHJlc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEhlYWRlckZhdWx0IGNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpCi0gIHsKLSAgICBTT0FQSGVhZGVyRmF1bHRJbXBsIHNvYXBIZWFkZXJGYXVsdCA9IG5ldyBTT0FQSGVhZGVyRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBIZWFkZXJGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQSGVhZGVyIGNyZWF0ZVNPQVBIZWFkZXIoKQotICB7Ci0gICAgU09BUEhlYWRlckltcGwgc29hcEhlYWRlciA9IG5ldyBTT0FQSGVhZGVySW1wbCgpOwotICAgIHJldHVybiBzb2FwSGVhZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVJU3RyaW5nRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJU3RyaW5nVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUFBhY2thZ2UgZ2V0U09BUFBhY2thZ2UoKQotICB7Ci0gICAgcmV0dXJuIChTT0FQUGFja2FnZSlnZXRFUGFja2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBkZXByZWNhdGVkCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHN0YXRpYyBTT0FQUGFja2FnZSBnZXRQYWNrYWdlKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLX0gLy9TT0FQRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBGYXVsdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBGYXVsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyODE4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWwuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmF1bHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBGYXVsdEltcGwjZ2V0VXNlIDxlbT5Vc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBGYXVsdEltcGwjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQRmF1bHRJbXBsI2dldEVuY29kaW5nU3R5bGVzIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQRmF1bHRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEZhdWx0IHsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2UoKSA8ZW0+VXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlKCkgPGVtPlVzZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRVc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNlID0gVVNFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IE5BTUVTUEFDRV9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuY29kaW5nU3R5bGVzKCkgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVuY29kaW5nU3R5bGVzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW5jb2RpbmdTdHlsZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQRmF1bHRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXRVc2UoKQotICB7Ci0gICAgcmV0dXJuIHVzZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgbmV3VXNlKQotICB7Ci0gICAgU3RyaW5nIG9sZFVzZSA9IHVzZTsKLSAgICB1c2UgPSBuZXdVc2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fVVNFLCBvbGRVc2UsIHVzZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmV3TmFtZXNwYWNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICBuYW1lc3BhY2VVUkkgPSBuZXdOYW1lc3BhY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSSwgb2xkTmFtZXNwYWNlVVJJLCBuYW1lc3BhY2VVUkkpKTsKLSAgfQotCi1wcml2YXRlIFN0cmluZyBuYW1lOwotcHVibGljIFN0cmluZyBnZXROYW1lKCkKLXsKLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi17Ci0gIHRoaXMubmFtZSA9IG5hbWU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEVuY29kaW5nU3R5bGVzKExpc3QgbGlzdCkKLXsKLSAgZW5jb2RpbmdTdHlsZXMgPSAoRUxpc3QpbGlzdDsKLX0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIExpc3QgZ2V0RW5jb2RpbmdTdHlsZXMoKQotICB7Ci0gICAgaWYgKGVuY29kaW5nU3R5bGVzID09IG51bGwpCi0gICAgewotICAgICAgZW5jb2RpbmdTdHlsZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVMpOwotICAgIH0KLSAgICByZXR1cm4gZW5jb2RpbmdTdHlsZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1VTRToKLSAgICAgICAgcmV0dXJuIGdldFVzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19VU0U6Ci0gICAgICAgIHNldFVzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19VU0U6Ci0gICAgICAgIHJldHVybiBVU0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzZSAhPSBudWxsIDogIVVTRV9FREVGQVVMVC5lcXVhbHModXNlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzICE9IG51bGwgJiYgIWVuY29kaW5nU3R5bGVzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHVzZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1c2UpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZXNwYWNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBlbmNvZGluZ1N0eWxlczogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChlbmNvZGluZ1N0eWxlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0TmFtZQotICAgICAgKFNPQVBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBTT0FQQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKSk7Ci0gICAgc2V0TmFtZXNwYWNlVVJJCi0gICAgICAoU09BUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX1VSSV9BVFRSSUJVVEUpKTsKLSAgICBzZXRVc2UKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5VU0VfQVRUUklCVVRFKSk7Ci0gICAgCi0gICAgLy8gVEJEIC0gaGFuZGxlIGVuY29kaW5nU3R5bGVzCi0gICAgCi0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEZhdWx0X05hbWVzcGFjZVVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfVVJJX0FUVFJJQlVURSxnZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdF9Vc2UoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSxnZXRVc2UoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdF9FbmNvZGluZ1N0eWxlcygpKQotICAgICAgICA7IC8vIFRCRCAtIGhhbmRsZSBlbmNvZGluZ1N0eWxlcwotICAgICAgaWYgKGdldE5hbWUoKSAhPSBudWxsKQotICAgICAgCW5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLGdldE5hbWUoKSk7IC8vIFJldmlzaXQgUm9zZSBtb2RlbAotICAgIH0KLSAgfQotCi19IC8vU09BUEZhdWx0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckJhc2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyQmFzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyYjA1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyQmFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlciBCYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwjZ2V0VXNlIDxlbT5Vc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJCYXNlSW1wbCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJCYXNlSW1wbCNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwjZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckJhc2VJbXBsI2dldFBhcnQgPGVtPlBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQSGVhZGVyQmFzZUltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQSGVhZGVyQmFzZSB7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlKCkgPGVtPlVzZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRVc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZSgpIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZSA9IFVTRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmNvZGluZ1N0eWxlcygpIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbmNvZGluZ1N0eWxlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIEVMaXN0IGVuY29kaW5nU3R5bGVzID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZSgpIDxlbT5NZXNzYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0KCkgPGVtPlBhcnQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UGFydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFBhcnQgcGFydCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBIZWFkZXJCYXNlSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyQmFzZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXRVc2UoKQotICB7Ci0gICAgcmV0dXJuIHVzZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgbmV3VXNlKQotICB7Ci0gICAgU3RyaW5nIG9sZFVzZSA9IHVzZTsKLSAgICB1c2UgPSBuZXdVc2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fVVNFLCBvbGRVc2UsIHVzZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmV3TmFtZXNwYWNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICBuYW1lc3BhY2VVUkkgPSBuZXdOYW1lc3BhY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSSwgb2xkTmFtZXNwYWNlVVJJLCBuYW1lc3BhY2VVUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICBpZiAoZW5jb2RpbmdTdHlsZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbmNvZGluZ1N0eWxlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUyk7Ci0gICAgfQotICAgIHJldHVybiBlbmNvZGluZ1N0eWxlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgTWVzc2FnZSBvbGRNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgIG1lc3NhZ2UgPSAoTWVzc2FnZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpbWVzc2FnZSk7Ci0gICAgICBpZiAobWVzc2FnZSAhPSBvbGRNZXNzYWdlKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0UsIG9sZE1lc3NhZ2UsIG1lc3NhZ2UpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgTWVzc2FnZSBiYXNpY0dldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKE1lc3NhZ2UgbmV3TWVzc2FnZSkKLSAgewotICAgIE1lc3NhZ2Ugb2xkTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgbWVzc2FnZSA9IG5ld01lc3NhZ2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTUVTU0FHRSwgb2xkTWVzc2FnZSwgbWVzc2FnZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFBhcnQgZ2V0UGFydCgpCi0gIHsKLSAgICBpZiAocGFydCAhPSBudWxsICYmIHBhcnQuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBQYXJ0IG9sZFBhcnQgPSBwYXJ0OwotICAgICAgcGFydCA9IChQYXJ0KWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClwYXJ0KTsKLSAgICAgIGlmIChwYXJ0ICE9IG9sZFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUEFSVCwgb2xkUGFydCwgcGFydCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBQYXJ0IGJhc2ljR2V0UGFydCgpCi0gIHsKLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnQoUGFydCBuZXdQYXJ0KQotICB7Ci0gICAgUGFydCBvbGRQYXJ0ID0gcGFydDsKLSAgICBwYXJ0ID0gbmV3UGFydDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19QQVJULCBvbGRQYXJ0LCBwYXJ0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1VTRToKLSAgICAgICAgcmV0dXJuIGdldFVzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRNZXNzYWdlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1BBUlQ6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UGFydCgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRQYXJ0KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19VU0U6Ci0gICAgICAgIHNldFVzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19QQVJUOgotICAgICAgICBzZXRQYXJ0KChQYXJ0KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0U6Ci0gICAgICAgIHNldE1lc3NhZ2UoKE1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUEFSVDoKLSAgICAgICAgc2V0UGFydCgoUGFydCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fVVNFOgotICAgICAgICByZXR1cm4gVVNFX0VERUZBVUxUID09IG51bGwgPyB1c2UgIT0gbnVsbCA6ICFVU0VfRURFRkFVTFQuZXF1YWxzKHVzZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0U6Ci0gICAgICAgIHJldHVybiBtZXNzYWdlICE9IG51bGw7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1BBUlQ6Ci0gICAgICAgIHJldHVybiBwYXJ0ICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh1c2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodXNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZW5jb2RpbmdTdHlsZXM6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RpbmdTdHlsZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpKQotICAgICAgc2V0VXNlKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpKTsKLSAgICBpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpCi0gICAgICBzZXROYW1lc3BhY2VVUkkoY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpOwotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5FTkNPRElOR19TVFlMRV9BVFRSSUJVVEUpKSAKLSAgICB7Ci0gICAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZXMgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5FTkNPRElOR19TVFlMRV9BVFRSSUJVVEUpOwotICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZW5jb2RpbmdTdHlsZXMpOwotICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAJZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICB9IAotICAgIAotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgUU5hbWUgbWVzc2FnZVFOYW1lID0gY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpOwotICAgICAgTWVzc2FnZSBuZXdNZXNzYWdlID0gKG1lc3NhZ2VRTmFtZSAhPSBudWxsKSA/IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKSA6IG51bGw7Ci0gICAgICBpZiAobmV3TWVzc2FnZSAhPSBudWxsICYmIG5ld01lc3NhZ2UgIT0gZ2V0TWVzc2FnZSgpKQotICAgICAgICBzZXRNZXNzYWdlKG5ld01lc3NhZ2UpOwotICAgICAgCi0gICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5QQVJUX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUpOwotICAgICAgICBQYXJ0IG5ld1BhcnQgPSAobmV3TWVzc2FnZSAhPSBudWxsKSA/IChQYXJ0KSBuZXdNZXNzYWdlLmdldFBhcnQocGFydE5hbWUpIDogbnVsbDsKLSAgICAgICAgaWYgKG5ld1BhcnQgIT0gbnVsbCAmJiBuZXdQYXJ0ICE9IGdldFBhcnQoKSkKLSAgICAgICAgICBzZXRQYXJ0KG5ld1BhcnQpOwotICAgICAgfSAgIAotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9CSAgCi0gCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2VfVXNlKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUsZ2V0VXNlKCkpOwotICAgICAgaWYoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBIZWFkZXJCYXNlX05hbWVzcGFjZVVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFLGdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2VfRW5jb2RpbmdTdHlsZXMoKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlTGlzdCA9IGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZ1N0eWxlcyA9ICIiOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVuY29kaW5nU3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZW5jb2RpbmdTdHlsZXMuZXF1YWxzKCIiKSkgLy8gZmlyc3QgaXRlcmF0aW9uCi0gICAgICAgICAgICBlbmNvZGluZ1N0eWxlcyArPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICBlbHNlCi0gIAkgICAgICAgIGVuY29kaW5nU3R5bGVzICs9ICIgIiArIChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZW5jb2RpbmdTdHlsZXMuZXF1YWxzKCIiKSkKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5FTkNPRElOR19TVFlMRV9BVFRSSUJVVEUsZW5jb2RpbmdTdHlsZXMpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlUmVmZXJlbmNlKGVSZWZlcmVuY2UpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlUmVmZXJlbmNlID09IG51bGwgfHwgZVJlZmVyZW5jZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2VfTWVzc2FnZSgpKQotICAgICAgewotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxTmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgU09BUENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyQmFzZV9QYXJ0KCkpCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IGdldFBhcnQoKTsKLSAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgU09BUENvbnN0YW50cy5QQVJUX0FUVFJJQlVURSxwYXJ0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0gLy9TT0FQSGVhZGVyQmFzZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBIZWFkZXJGYXVsdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBIZWFkZXJGYXVsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyMzlmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlciBGYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBIZWFkZXJGYXVsdEltcGwgZXh0ZW5kcyBTT0FQSGVhZGVyQmFzZUltcGwgaW1wbGVtZW50cyBTT0FQSGVhZGVyRmF1bHQgewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgU09BUEhlYWRlckZhdWx0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyRmF1bHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19VU0U6Ci0gICAgICAgIHJldHVybiBnZXRVc2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0TWVzc2FnZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUEFSVDoKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRQYXJ0KCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldFBhcnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fVVNFOgotICAgICAgICBzZXRVc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fTUVTU0FHRToKLSAgICAgICAgc2V0TWVzc2FnZSgoTWVzc2FnZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1BBUlQ6Ci0gICAgICAgIHNldFBhcnQoKFBhcnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19VU0U6Ci0gICAgICAgIHNldFVzZShVU0VfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19QQVJUOgotICAgICAgICBzZXRQYXJ0KChQYXJ0KW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1VTRToKLSAgICAgICAgcmV0dXJuIFVTRV9FREVGQVVMVCA9PSBudWxsID8gdXNlICE9IG51bGwgOiAhVVNFX0VERUZBVUxULmVxdWFscyh1c2UpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFOgotICAgICAgICByZXR1cm4gbWVzc2FnZSAhPSBudWxsOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUEFSVDoKLSAgICAgICAgcmV0dXJuIHBhcnQgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLX0gLy9TT0FQSGVhZGVyRmF1bHRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZTUxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJJbXBsI2dldEhlYWRlckZhdWx0cyA8ZW0+SGVhZGVyIEZhdWx0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBIZWFkZXJJbXBsIGV4dGVuZHMgU09BUEhlYWRlckJhc2VJbXBsIGltcGxlbWVudHMgU09BUEhlYWRlciB7Ci0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWFkZXJGYXVsdHMoKSA8ZW0+SGVhZGVyIEZhdWx0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEhlYWRlckZhdWx0cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIEVMaXN0IGhlYWRlckZhdWx0cyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBIZWFkZXJJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBIZWFkZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFTGlzdCBnZXRIZWFkZXJGYXVsdHMoKQotICB7Ci0gICAgaWYgKGhlYWRlckZhdWx0cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGhlYWRlckZhdWx0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTT0FQSGVhZGVyRmF1bHQuY2xhc3MsIHRoaXMsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhlYWRlckZhdWx0czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRIZWFkZXJGYXVsdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1VTRToKLSAgICAgICAgcmV0dXJuIGdldFVzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICByZXR1cm4gZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX01FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRNZXNzYWdlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19QQVJUOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFBhcnQoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0UGFydCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fSEVBREVSX0ZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGdldEhlYWRlckZhdWx0cygpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19VU0U6Ci0gICAgICAgIHNldFVzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fUEFSVDoKLSAgICAgICAgc2V0UGFydCgoUGFydCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFM6Ci0gICAgICAgIGdldEhlYWRlckZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEhlYWRlckZhdWx0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX01FU1NBR0U6Ci0gICAgICAgIHNldE1lc3NhZ2UoKE1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1BBUlQ6Ci0gICAgICAgIHNldFBhcnQoKFBhcnQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFM6Ci0gICAgICAgIGdldEhlYWRlckZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fVVNFOgotICAgICAgICByZXR1cm4gVVNFX0VERUZBVUxUID09IG51bGwgPyB1c2UgIT0gbnVsbCA6ICFVU0VfRURFRkFVTFQuZXF1YWxzKHVzZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVVJJICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzICE9IG51bGwgJiYgIWVuY29kaW5nU3R5bGVzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX01FU1NBR0U6Ci0gICAgICAgIHJldHVybiBtZXNzYWdlICE9IG51bGw7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19QQVJUOgotICAgICAgICByZXR1cm4gcGFydCAhPSBudWxsOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fSEVBREVSX0ZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGhlYWRlckZhdWx0cyAhPSBudWxsICYmICFoZWFkZXJGYXVsdHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgaWYgKFNPQVBDb25zdGFudHMuSEVBREVSX0ZBVUxUX0VMRU1FTlRfVEFHLmVxdWFscyhlbGVtZW50LmdldExvY2FsTmFtZSgpKSkKLSAgICB7Ci0gICAgICBTT0FQSGVhZGVyRmF1bHQgZmF1bHQgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlckZhdWx0KCk7Ci0gICAgICBmYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICBmYXVsdC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgIGdldEhlYWRlckZhdWx0cygpLmFkZChmYXVsdCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgU09BUEhlYWRlciBoZWFkZXIgPSAoU09BUEhlYWRlcikgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFNPQVBIZWFkZXJGYXVsdCkKLSAgICB7Ci0gICAgICBoZWFkZXIuZ2V0SGVhZGVyRmF1bHRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotfSAvL1NPQVBIZWFkZXJJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQT3BlcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUE9wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3NTRjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQT3BlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBPcGVyYXRpb25JbXBsI2dldFNvYXBBY3Rpb25VUkkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUE9wZXJhdGlvbkltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUE9wZXJhdGlvbkltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQT3BlcmF0aW9uIHsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQWN0aW9uVVJJKCkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTb2FwQWN0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0FDVElPTl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQWN0aW9uVVJJKCkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTb2FwQWN0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNvYXBBY3Rpb25VUkkgPSBTT0FQX0FDVElPTl9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdHlsZSA9IFNUWUxFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQT3BlcmF0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQT3BlcmF0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvYXBBY3Rpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBBY3Rpb25VUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb2FwQWN0aW9uVVJJKFN0cmluZyBuZXdTb2FwQWN0aW9uVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFNvYXBBY3Rpb25VUkkgPSBzb2FwQWN0aW9uVVJJOwotICAgIHNvYXBBY3Rpb25VUkkgPSBuZXdTb2FwQWN0aW9uVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TT0FQX0FDVElPTl9VUkksIG9sZFNvYXBBY3Rpb25VUkksIHNvYXBBY3Rpb25VUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIHN0eWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIG5ld1N0eWxlKQotICB7Ci0gICAgU3RyaW5nIG9sZFN0eWxlID0gc3R5bGU7Ci0gICAgc3R5bGUgPSBuZXdTdHlsZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fU1RZTEUsIG9sZFN0eWxlLCBzdHlsZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIGdldFNvYXBBY3Rpb25VUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NUWUxFOgotICAgICAgICByZXR1cm4gZ2V0U3R5bGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fU09BUF9BQ1RJT05fVVJJOgotICAgICAgICBzZXRTb2FwQWN0aW9uVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSToKLSAgICAgICAgc2V0U29hcEFjdGlvblVSSShTT0FQX0FDVElPTl9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoU1RZTEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIFNPQVBfQUNUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gc29hcEFjdGlvblVSSSAhPSBudWxsIDogIVNPQVBfQUNUSU9OX1VSSV9FREVGQVVMVC5lcXVhbHMoc29hcEFjdGlvblVSSSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgcmV0dXJuIFNUWUxFX0VERUZBVUxUID09IG51bGwgPyBzdHlsZSAhPSBudWxsIDogIVNUWUxFX0VERUZBVUxULmVxdWFscyhzdHlsZSk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChzb2FwQWN0aW9uVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHNvYXBBY3Rpb25VUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgc3R5bGU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoc3R5bGUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldFNvYXBBY3Rpb25VUkkKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5TT0FQX0FDVElPTl9BVFRSSUJVVEUpKTsKLSAgICBzZXRTdHlsZQotICAgICAgKFNPQVBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBTT0FQQ29uc3RhbnRzLlNUWUxFX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBPcGVyYXRpb25fU29hcEFjdGlvblVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5TT0FQX0FDVElPTl9BVFRSSUJVVEUsZ2V0U29hcEFjdGlvblVSSSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUE9wZXJhdGlvbl9TdHlsZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5TVFlMRV9BVFRSSUJVVEUsZ2V0U3R5bGUoKSk7Ci0gICAgfQotICB9Ci0KLX0gLy9TT0FQT3BlcmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUFBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyNTQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFBhY2thZ2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFNPQVBQYWNrYWdlIHsKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcEJpbmRpbmdFQ2xhc3MgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgRUNsYXNzIHNvYXBCb2R5RUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwSGVhZGVyQmFzZUVDbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcEZhdWx0RUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwT3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwQWRkcmVzc0VDbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcEhlYWRlckZhdWx0RUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwSGVhZGVyRUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBpU3RyaW5nRURhdGFUeXBlID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotICAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotICAgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLSAgICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotICAgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotICAgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2VOU19VUkkKLSAgICogQHNlZSAjaW5pdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBTT0FQUGFja2FnZUltcGwoKQotICB7Ci0gICAgc3VwZXIoZU5TX1VSSSwgU09BUEZhY3RvcnkuZUlOU1RBTkNFKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0gICAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0gICAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0gICAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotICAgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0gICAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0gICAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLSAgICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0gICAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLSAgICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLSAgICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLSAgICogdGhvc2Ugb2YgYW5vdGhlci4KLSAgICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotICAgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2VOU19VUkkKLSAgICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLSAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHN0YXRpYyBTT0FQUGFja2FnZSBpbml0KCkKLSAgewotICAgIGlmIChpc0luaXRlZCkgcmV0dXJuIChTT0FQUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoU09BUFBhY2thZ2UuZU5TX1VSSSk7Ci0KLSAgICAvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlLgotICAgIFNPQVBQYWNrYWdlSW1wbCB0aGVTT0FQUGFja2FnZSA9IChTT0FQUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IFNPQVBQYWNrYWdlSW1wbCgpKTsKLQotICAgIGlzSW5pdGVkID0gdHJ1ZTsKLQotICAgIC8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotICAgIFhTRFBhY2thZ2VJbXBsLmluaXQoKTsKLQotICAgIC8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0gICAgV1NETFBhY2thZ2VJbXBsIHRoZVdTRExQYWNrYWdlID0gKFdTRExQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KFdTRExQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoV1NETFBhY2thZ2UuZU5TX1VSSSkgOiBXU0RMUGFja2FnZUltcGwuZUlOU1RBTkNFKTsKLQotICAgIC8vIFN0ZXAgMTogY3JlYXRlIG1ldGEtbW9kZWwgb2JqZWN0cwotICAgIHRoZVNPQVBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotICAgIHRoZVdTRExQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0gICAgLy8gU3RlcCAyOiBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgotICAgIHRoZVNPQVBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLSAgICB0aGVXU0RMUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLSAgICByZXR1cm4gdGhlU09BUFBhY2thZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNPQVBCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBzb2FwQmluZGluZ0VDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBCaW5kaW5nX1RyYW5zcG9ydFVSSSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEJpbmRpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBCaW5kaW5nX1N0eWxlKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwQmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQQm9keSgpCi0gIHsKLSAgICByZXR1cm4gc29hcEJvZHlFQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9Vc2UoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBCb2R5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9OYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBCb2R5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9FbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEJvZHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNPQVBCb2R5X1BhcnRzKCkKLSAgewotICAgIHJldHVybiAoRVJlZmVyZW5jZSlzb2FwQm9keUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQSGVhZGVyQmFzZSgpCi0gIHsKLSAgICByZXR1cm4gc29hcEhlYWRlckJhc2VFQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9Vc2UoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBIZWFkZXJCYXNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9OYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBIZWFkZXJCYXNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9FbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEhlYWRlckJhc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNPQVBIZWFkZXJCYXNlX01lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIChFUmVmZXJlbmNlKXNvYXBIZWFkZXJCYXNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTT0FQSGVhZGVyQmFzZV9QYXJ0KCkKLSAgewotICAgIHJldHVybiAoRVJlZmVyZW5jZSlzb2FwSGVhZGVyQmFzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQRmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBGYXVsdEVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBGYXVsdF9Vc2UoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBGYXVsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEZhdWx0X05hbWVzcGFjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEZhdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQRmF1bHRfRW5jb2RpbmdTdHlsZXMoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBGYXVsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQT3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBzb2FwT3BlcmF0aW9uRUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUE9wZXJhdGlvbl9Tb2FwQWN0aW9uVVJJKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQT3BlcmF0aW9uX1N0eWxlKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNPQVBBZGRyZXNzKCkKLSAgewotICAgIHJldHVybiBzb2FwQWRkcmVzc0VDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBBZGRyZXNzX0xvY2F0aW9uVVJJKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwQWRkcmVzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQSGVhZGVyRmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBIZWFkZXJGYXVsdEVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U09BUEhlYWRlcigpCi0gIHsKLSAgICByZXR1cm4gc29hcEhlYWRlckVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNPQVBIZWFkZXJfSGVhZGVyRmF1bHRzKCkKLSAgewotICAgIHJldHVybiAoRVJlZmVyZW5jZSlzb2FwSGVhZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldElTdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIGlTdHJpbmdFRGF0YVR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIChTT0FQRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotICAgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLSAgewotICAgIGlmIChpc0NyZWF0ZWQpIHJldHVybjsKLSAgICBpc0NyZWF0ZWQgPSB0cnVlOwotCi0gICAgLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0gICAgc29hcEJpbmRpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9CSU5ESU5HKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBCaW5kaW5nRUNsYXNzLCBTT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkkpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEJpbmRpbmdFQ2xhc3MsIFNPQVBfQklORElOR19fU1RZTEUpOwotCi0gICAgc29hcEJvZHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9CT0RZKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBCb2R5RUNsYXNzLCBTT0FQX0JPRFlfX1VTRSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwQm9keUVDbGFzcywgU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBCb2R5RUNsYXNzLCBTT0FQX0JPRFlfX0VOQ09ESU5HX1NUWUxFUyk7Ci0gICAgY3JlYXRlRVJlZmVyZW5jZShzb2FwQm9keUVDbGFzcywgU09BUF9CT0RZX19QQVJUUyk7Ci0KLSAgICBzb2FwSGVhZGVyQmFzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0hFQURFUl9CQVNFKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBIZWFkZXJCYXNlRUNsYXNzLCBTT0FQX0hFQURFUl9CQVNFX19VU0UpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEhlYWRlckJhc2VFQ2xhc3MsIFNPQVBfSEVBREVSX0JBU0VfX05BTUVTUEFDRV9VUkkpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEhlYWRlckJhc2VFQ2xhc3MsIFNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUyk7Ci0gICAgY3JlYXRlRVJlZmVyZW5jZShzb2FwSGVhZGVyQmFzZUVDbGFzcywgU09BUF9IRUFERVJfQkFTRV9fTUVTU0FHRSk7Ci0gICAgY3JlYXRlRVJlZmVyZW5jZShzb2FwSGVhZGVyQmFzZUVDbGFzcywgU09BUF9IRUFERVJfQkFTRV9fUEFSVCk7Ci0KLSAgICBzb2FwRmF1bHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9GQVVMVCk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwRmF1bHRFQ2xhc3MsIFNPQVBfRkFVTFRfX1VTRSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwRmF1bHRFQ2xhc3MsIFNPQVBfRkFVTFRfX05BTUVTUEFDRV9VUkkpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEZhdWx0RUNsYXNzLCBTT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVMpOwotCi0gICAgc29hcE9wZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX09QRVJBVElPTik7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwT3BlcmF0aW9uRUNsYXNzLCBTT0FQX09QRVJBVElPTl9fU09BUF9BQ1RJT05fVVJJKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBPcGVyYXRpb25FQ2xhc3MsIFNPQVBfT1BFUkFUSU9OX19TVFlMRSk7Ci0KLSAgICBzb2FwQWRkcmVzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0FERFJFU1MpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEFkZHJlc3NFQ2xhc3MsIFNPQVBfQUREUkVTU19fTE9DQVRJT05fVVJJKTsKLQotICAgIHNvYXBIZWFkZXJGYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0hFQURFUl9GQVVMVCk7Ci0KLSAgICBzb2FwSGVhZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfSEVBREVSKTsKLSAgICBjcmVhdGVFUmVmZXJlbmNlKHNvYXBIZWFkZXJFQ2xhc3MsIFNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTKTsKLQotICAgIC8vIENyZWF0ZSBkYXRhIHR5cGVzCi0gICAgaVN0cmluZ0VEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShJU1RSSU5HKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0gICAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gIHsKLSAgICBpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0gICAgc2V0TmFtZShlTkFNRSk7Ci0gICAgc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0gICAgc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLSAgICAvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0gICAgV1NETFBhY2thZ2VJbXBsIHRoZVdTRExQYWNrYWdlID0gKFdTRExQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXU0RMUGFja2FnZS5lTlNfVVJJKTsKLQotICAgIC8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLSAgICBzb2FwQmluZGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwQm9keUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwSGVhZGVyQmFzZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwRmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0gICAgc29hcE9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwQWRkcmVzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwSGVhZGVyRmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTT0FQSGVhZGVyQmFzZSgpKTsKLSAgICBzb2FwSGVhZGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U09BUEhlYWRlckJhc2UoKSk7Ci0KLSAgICAvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotICAgIGluaXRFQ2xhc3Moc29hcEJpbmRpbmdFQ2xhc3MsIFNPQVBCaW5kaW5nLmNsYXNzLCAiU09BUEJpbmRpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBCaW5kaW5nX1RyYW5zcG9ydFVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHJhbnNwb3J0VVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQQmluZGluZ19TdHlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3R5bGUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0gICAgaW5pdEVDbGFzcyhzb2FwQm9keUVDbGFzcywgU09BUEJvZHkuY2xhc3MsICJTT0FQQm9keSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEJvZHlfVXNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1c2UiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBCb2R5X05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQQm9keV9FbmNvZGluZ1N0eWxlcygpLCB0aGlzLmdldElTdHJpbmcoKSwgImVuY29kaW5nU3R5bGVzIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVSZWZlcmVuY2UoZ2V0U09BUEJvZHlfUGFydHMoKSwgdGhlV1NETFBhY2thZ2UuZ2V0UGFydCgpLCBudWxsLCAicGFydHMiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotICAgIGluaXRFQ2xhc3Moc29hcEhlYWRlckJhc2VFQ2xhc3MsIFNPQVBIZWFkZXJCYXNlLmNsYXNzLCAiU09BUEhlYWRlckJhc2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBIZWFkZXJCYXNlX1VzZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXNlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQSGVhZGVyQmFzZV9OYW1lc3BhY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVSSSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEhlYWRlckJhc2VfRW5jb2RpbmdTdHlsZXMoKSwgdGhpcy5nZXRJU3RyaW5nKCksICJlbmNvZGluZ1N0eWxlcyIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFUmVmZXJlbmNlKGdldFNPQVBIZWFkZXJCYXNlX01lc3NhZ2UoKSwgdGhlV1NETFBhY2thZ2UuZ2V0TWVzc2FnZSgpLCBudWxsLCAibWVzc2FnZSIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVSZWZlcmVuY2UoZ2V0U09BUEhlYWRlckJhc2VfUGFydCgpLCB0aGVXU0RMUGFja2FnZS5nZXRQYXJ0KCksIG51bGwsICJwYXJ0IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotICAgIGluaXRFQ2xhc3Moc29hcEZhdWx0RUNsYXNzLCBTT0FQRmF1bHQuY2xhc3MsICJTT0FQRmF1bHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBGYXVsdF9Vc2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVzZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEZhdWx0X05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQRmF1bHRfRW5jb2RpbmdTdHlsZXMoKSwgdGhpcy5nZXRJU3RyaW5nKCksICJlbmNvZGluZ1N0eWxlcyIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0gICAgaW5pdEVDbGFzcyhzb2FwT3BlcmF0aW9uRUNsYXNzLCBTT0FQT3BlcmF0aW9uLmNsYXNzLCAiU09BUE9wZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUE9wZXJhdGlvbl9Tb2FwQWN0aW9uVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb2FwQWN0aW9uVVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQT3BlcmF0aW9uX1N0eWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzdHlsZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLSAgICBpbml0RUNsYXNzKHNvYXBBZGRyZXNzRUNsYXNzLCBTT0FQQWRkcmVzcy5jbGFzcywgIlNPQVBBZGRyZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQQWRkcmVzc19Mb2NhdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb25VUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0gICAgaW5pdEVDbGFzcyhzb2FwSGVhZGVyRmF1bHRFQ2xhc3MsIFNPQVBIZWFkZXJGYXVsdC5jbGFzcywgIlNPQVBIZWFkZXJGYXVsdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0KLSAgICBpbml0RUNsYXNzKHNvYXBIZWFkZXJFQ2xhc3MsIFNPQVBIZWFkZXIuY2xhc3MsICJTT0FQSGVhZGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLSAgICBpbml0RVJlZmVyZW5jZShnZXRTT0FQSGVhZGVyX0hlYWRlckZhdWx0cygpLCB0aGlzLmdldFNPQVBIZWFkZXJGYXVsdCgpLCBudWxsLCAiaGVhZGVyRmF1bHRzIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLSAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLSAgICBpbml0RURhdGFUeXBlKGlTdHJpbmdFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIklTdHJpbmciLCBJU19TRVJJQUxJWkFCTEUpOwotCi0gICAgLy8gQ3JlYXRlIHJlc291cmNlCi0gICAgY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0gIH0KLX0gLy9TT0FQUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWQyZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLio7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFNPQVBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQQWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG1vZGVsUGFja2FnZSA9IFNPQVBQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgewotICAgICAgcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotICAgIG5ldyBTT0FQU3dpdGNoKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQQmluZGluZyhTT0FQQmluZGluZyBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQQmluZGluZ0FkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBCb2R5KFNPQVBCb2R5IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBCb2R5QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlckJhc2UoU09BUEhlYWRlckJhc2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlU09BUEhlYWRlckJhc2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQRmF1bHQoU09BUEZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBGYXVsdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBPcGVyYXRpb24oU09BUE9wZXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQT3BlcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU09BUEFkZHJlc3MoU09BUEFkZHJlc3Mgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlU09BUEFkZHJlc3NBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyRmF1bHQoU09BUEhlYWRlckZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXJGYXVsdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBIZWFkZXIoU09BUEhlYWRlciBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQSGVhZGVyQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICB9OwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0gICAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICB7Ci0gICAgcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyA8ZW0+QmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQQmluZGluZ0FkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkgPGVtPkJvZHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEJvZHlBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlIDxlbT5IZWFkZXIgQmFzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQSGVhZGVyQmFzZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0IDxlbT5GYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEZhdWx0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uIDxlbT5PcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQT3BlcmF0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcyA8ZW0+QWRkcmVzczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3MKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQQWRkcmVzc0FkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0IDxlbT5IZWFkZXIgRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJGYXVsdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlciA8ZW0+SGVhZGVyPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEhlYWRlckFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfSAvL1NPQVBBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzkwYzMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU09BUENvbnN0YW50cyAKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUkVTU19FTEVNRU5UX1RBRyA9ICJhZGRyZXNzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19FTEVNRU5UX1RBRyA9ICJiaW5kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWV9FTEVNRU5UX1RBRyA9ICJib2R5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfRUxFTUVOVF9UQUcgPSAiZmF1bHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRUxFTUVOVF9UQUcgPSAiaGVhZGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0ZBVUxUX0VMRU1FTlRfVEFHID0gImhlYWRlcmZhdWx0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OX0VMRU1FTlRfVEFHID0gIm9wZXJhdGlvbiI7Ci0JICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOwotIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0FDVElPTl9BVFRSSUJVVEUgPSJzb2FwQWN0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfQVRUUklCVVRFID0ic3R5bGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9BVFRSSUJVVEUgPSJsb2NhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9BVFRSSUJVVEUgPSJ0cmFuc3BvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQVRUUklCVVRFID0idXNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0FUVFJJQlVURSA9Im5hbWVzcGFjZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUklfQVRUUklCVVRFID0ibmFtZXNwYWNlVVJJIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSJuYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFID0iZW5jb2RpbmdTdHlsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfQVRUUklCVVRFID0ibWVzc2FnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfQVRUUklCVVRFID0icGFydCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIDogbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTJkYWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgaWYgKFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIGlmIChTT0FQQ29uc3RhbnRzLkFERFJFU1NfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEFkZHJlc3MoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFNPQVBDb25zdGFudHMuQklORElOR19FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQmluZGluZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoU09BUENvbnN0YW50cy5CT0RZX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChTT0FQQ29uc3RhbnRzLkZBVUxUX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgCXJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEZhdWx0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChTT0FQQ29uc3RhbnRzLk9QRVJBVElPTl9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBPcGVyYXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFNPQVBDb25zdGFudHMuSEVBREVSX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgCXJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlcigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoU09BUENvbnN0YW50cy5IRUFERVJfRkFVTFRfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAJcmV0dXJuIFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQSGVhZGVyRmF1bHQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVuaGFuZGxlZCBsb2NhbE5hbWU6ICIgKyBsb2NhbE5hbWUpOwotICAgICAgICByZXR1cm4gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVuaGFuZGxlZCBuYW1lc3BhY2U6ICIgKyBuYW1lc3BhY2UpOwotICAgICAgcmV0dXJuIFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmMzQwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLio7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUFN3aXRjaCB7Ci0gIC8qKgotICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFNPQVBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQU3dpdGNoKCkKLSAgewotICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtb2RlbFBhY2thZ2UgPSBTT0FQUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KQotICB7Ci0gICAgRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0gICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotICAgICAgewotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElORzoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gKFNPQVBCaW5kaW5nKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQQmluZGluZyhzb2FwQmluZGluZyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBCaW5kaW5nKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWToKLSAgICAgICAgewotICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gKFNPQVBCb2R5KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQQm9keShzb2FwQm9keSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJvZHkpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBCb2R5KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJvZHkpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0U6Ci0gICAgICAgIHsKLSAgICAgICAgICBTT0FQSGVhZGVyQmFzZSBzb2FwSGVhZGVyQmFzZSA9IChTT0FQSGVhZGVyQmFzZSl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlU09BUEhlYWRlckJhc2Uoc29hcEhlYWRlckJhc2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXJCYXNlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChzb2FwSGVhZGVyQmFzZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXJCYXNlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUOgotICAgICAgICB7Ci0gICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IChTT0FQRmF1bHQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVNPQVBGYXVsdChzb2FwRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc29hcEZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTjoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IChTT0FQT3BlcmF0aW9uKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQT3BlcmF0aW9uKHNvYXBPcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBPcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBPcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwT3BlcmF0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1M6Ci0gICAgICAgIHsKLSAgICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IChTT0FQQWRkcmVzcyl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlU09BUEFkZHJlc3Moc29hcEFkZHJlc3MpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBBZGRyZXNzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChzb2FwQWRkcmVzcyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBBZGRyZXNzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVDoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBIZWFkZXJGYXVsdCBzb2FwSGVhZGVyRmF1bHQgPSAoU09BUEhlYWRlckZhdWx0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyRmF1bHQoc29hcEhlYWRlckZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyQmFzZShzb2FwSGVhZGVyRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXJGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc29hcEhlYWRlckZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEhlYWRlckZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUjoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyKHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNPQVBIZWFkZXJCYXNlKHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwSGVhZGVyKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEJpbmRpbmcoU09BUEJpbmRpbmcgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJvZHk8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Qm9keTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEJvZHkoU09BUEJvZHkgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlciBCYXNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlciBCYXNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyQmFzZShTT0FQSGVhZGVyQmFzZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBGYXVsdChTT0FQRmF1bHQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBPcGVyYXRpb24oU09BUE9wZXJhdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWRkcmVzczwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZGRyZXNzPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQQWRkcmVzcyhTT0FQQWRkcmVzcyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVhZGVyIEZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlciBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlckZhdWx0KFNPQVBIZWFkZXJGYXVsdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVhZGVyPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlcjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlcihTT0FQSGVhZGVyIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19IC8vU09BUFN3aXRjaApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9leHRlbnNpYmlsaXR5L0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwYjc5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9leHRlbnNpYmlsaXR5L0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvcgotewotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTE9BRElOR19FUlJPUiA9ICJDTEFTU19MT0FESU5HX0VSUk9SIjsKLSAgCi0gIHByb3RlY3RlZCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOyAgCi0gIHByb3RlY3RlZCBPYmplY3QgZmFjdG9yeTsKLQotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvcihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZ2V0RXh0ZW5zaWJsaXR5RWxlbWVudEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgIGZhY3RvcnkgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KXRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGZhY3RvcnkgPSBDTEFTU19MT0FESU5HX0VSUk9SOwotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFjdG9yeSAhPSBDTEFTU19MT0FESU5HX0VSUk9SID8gKEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSlmYWN0b3J5IDogbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaWJsaXR5RWxlbWVudEZhY3RvcnkoRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmMwMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkKLXsKLSAgcHJvdGVjdGVkIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcgbmFtZXNwYWNlLCBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCi0gIHsKLSAgICBtYXAucHV0KG5hbWVzcGFjZSwgZGVzY3JpcHRvcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgcmVzdWx0ID0gbnVsbDsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvciltYXAuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkZXNjcmlwdG9yLmdldEV4dGVuc2libGl0eUVsZW1lbnRGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRmFjdG9yeShTdHJpbmcgbmFtZXNwYWNlLCBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZmFjdG9yeSkKLSAgewotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yKG51bGwsbmFtZXNwYWNlLG51bGwpOwotICAgIGRlc2NyaXB0b3Iuc2V0RXh0ZW5zaWJsaXR5RWxlbWVudEZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgbWFwLnB1dChuYW1lc3BhY2UsZGVzY3JpcHRvcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNTQwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9leHRlbnNpYmlsaXR5L0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmV4dGVuc2liaWxpdHk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IFdTRExQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OQU1FID0gImV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbCBleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLQotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIoRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsIGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5leHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSA9IGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLSAgewotICAgIElQbHVnaW5SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyByZXNvbHZlKFVSTCBwbGF0Zm9ybVVSTCwgU3RyaW5nIHJlbGF0aXZlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIHJlc29sdmVkVVJMID0gUGxhdGZvcm0ucmVzb2x2ZShwbGF0Zm9ybVVSTCk7Ci0gICAgcmV0dXJuIHJlc29sdmVkVVJMLnRvU3RyaW5nKCkgKyByZWxhdGl2ZVBhdGg7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTUVOVF9OQU1FKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkRWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDbGFzc0xvYWRlciBwbHVnaW5DbGFzc3NMb2FkZXIgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwotICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IoY2xhc3NOYW1lLG5hbWVzcGFjZSxwbHVnaW5DbGFzc3NMb2FkZXIpOwotICAgICAgICAgIGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5LnB1dChuYW1lc3BhY2UsIGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nRmF1bHRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdGYXVsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkNDhkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdGYXVsdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIEZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ZhdWx0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ZhdWx0SW1wbCNnZXRFRmF1bHQgPGVtPkVGYXVsdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdGYXVsdEltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBCaW5kaW5nRmF1bHQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUZhdWx0KCkgPGVtPkVGYXVsdDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEZhdWx0IGVGYXVsdCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ0ZhdWx0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdGYXVsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0gICAgbmFtZSA9IG5ld05hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRmF1bHQgZ2V0RUZhdWx0KCkKLSAgewotICAgIGlmIChlRmF1bHQgIT0gbnVsbCAmJiBlRmF1bHQuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBGYXVsdCBvbGRFRmF1bHQgPSBlRmF1bHQ7Ci0gICAgICBlRmF1bHQgPSAoRmF1bHQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVGYXVsdCk7Ci0gICAgICBpZiAoZUZhdWx0ICE9IG9sZEVGYXVsdCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRkFVTFQsIG9sZEVGYXVsdCwgZUZhdWx0KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlRmF1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBGYXVsdCBiYXNpY0dldEVGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZUZhdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFRmF1bHQoRmF1bHQgbmV3RUZhdWx0KQotICB7Ci0gICAgRmF1bHQgb2xkRUZhdWx0ID0gZUZhdWx0OwotICAgIGVGYXVsdCA9IG5ld0VGYXVsdDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRkFVTFQsIG9sZEVGYXVsdCwgZUZhdWx0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5GYXVsdCBnZXRGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUZhdWx0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYXVsdChqYXZheC53c2RsLkZhdWx0IGZhdWx0KQotICB7Ci0gICAgc2V0RUZhdWx0KChGYXVsdCkgZmF1bHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRkFVTFQ6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RUZhdWx0KCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVGYXVsdCgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VGQVVMVDoKLSAgICAgICAgc2V0RUZhdWx0KChGYXVsdCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VGQVVMVDoKLSAgICAgICAgc2V0RUZhdWx0KChGYXVsdCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRkFVTFQ6Ci0gICAgICAgIHJldHVybiBlRmF1bHQgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3VwZXIuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCxyZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5yZW1vdmUoaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpIGNvbXBvbmVudDsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZ0ZhdWx0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdGYXVsdF9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5GQVVMVCk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotICAKLSAgLy8gUmVzb2x2ZSB0aGUgcmVmZXJlbmNlIHRvIEZhdWx0Ci0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZVJlZmVyZW5jZXMoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvcCA9IChCaW5kaW5nT3BlcmF0aW9uKWdldENvbnRhaW5lcigpOwotICAgICAgT3BlcmF0aW9uIG9wID0gYm9wLmdldEVPcGVyYXRpb24oKTsKLSAgICAgIGlmIChvcCAhPSBudWxsKQotICAgICAgewotICAgICAgCS8vIFRCRCAtIFJldmlzaXQgQVBJLiBHZXQgdGhlIGZpcnN0IEZhdWx0LgotICAgICAgICBzZXRGYXVsdCgoRmF1bHQpb3AuZ2V0RUZhdWx0cygpLmdldCgwKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLX0gLy9CaW5kaW5nRmF1bHRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjY3NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ltcGwjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ltcGwjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbXBsI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbXBsI2dldEVQb3J0VHlwZSA8ZW0+RVBvcnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbXBsI2dldEVCaW5kaW5nT3BlcmF0aW9ucyA8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdJbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQmluZGluZwotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5ERUZJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlZmluZWQgPSBVTkRFRklORURfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST1hZX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm94eSA9IFBST1hZX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVVJJID0gUkVTT1VSQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUG9ydFR5cGUoKSA8ZW0+RVBvcnQgVHlwZTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFBvcnRUeXBlIGVQb3J0VHlwZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5nT3BlcmF0aW9ucygpIDxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVCaW5kaW5nT3BlcmF0aW9ucygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlQmluZGluZ09wZXJhdGlvbnMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHFOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRRTmFtZShRTmFtZSBuZXdRTmFtZSkKLSAgewotICAgIFFOYW1lIG9sZFFOYW1lID0gcU5hbWU7Ci0gICAgcU5hbWUgPSBuZXdRTmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX19RTkFNRSwgb2xkUU5hbWUsIHFOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCkKLSAgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIG5ld1VuZGVmaW5lZCkKLSAgewotICAgIGJvb2xlYW4gb2xkVW5kZWZpbmVkID0gdW5kZWZpbmVkOwotICAgIHVuZGVmaW5lZCA9IG5ld1VuZGVmaW5lZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX19VTkRFRklORUQsIG9sZFVuZGVmaW5lZCwgdW5kZWZpbmVkKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIHByb3h5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eShib29sZWFuIG5ld1Byb3h5KQotICB7Ci0gICAgYm9vbGVhbiBvbGRQcm94eSA9IHByb3h5OwotICAgIHByb3h5ID0gbmV3UHJveHk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19fUFJPWFksIG9sZFByb3h5LCBwcm94eSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVVJJKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIG5ld1Jlc291cmNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFJlc291cmNlVVJJID0gcmVzb3VyY2VVUkk7Ci0gICAgcmVzb3VyY2VVUkkgPSBuZXdSZXNvdXJjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX19SRVNPVVJDRV9VUkksIG9sZFJlc291cmNlVVJJLCByZXNvdXJjZVVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUG9ydFR5cGUgZ2V0RVBvcnRUeXBlKCkKLSAgewotICAgIGlmIChlUG9ydFR5cGUgIT0gbnVsbCAmJiBlUG9ydFR5cGUuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBvbGRFUG9ydFR5cGUgPSBlUG9ydFR5cGU7Ci0gICAgICBlUG9ydFR5cGUgPSAoUG9ydFR5cGUpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVQb3J0VHlwZSk7Ci0gICAgICBpZiAoZVBvcnRUeXBlICE9IG9sZEVQb3J0VHlwZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5CSU5ESU5HX19FUE9SVF9UWVBFLCBvbGRFUG9ydFR5cGUsIGVQb3J0VHlwZSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZVBvcnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUG9ydFR5cGUgYmFzaWNHZXRFUG9ydFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGVQb3J0VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RVBvcnRUeXBlKFBvcnRUeXBlIG5ld0VQb3J0VHlwZSkKLSAgewotICAgIFBvcnRUeXBlIG9sZEVQb3J0VHlwZSA9IGVQb3J0VHlwZTsKLSAgICBlUG9ydFR5cGUgPSBuZXdFUG9ydFR5cGU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19fRVBPUlRfVFlQRSwgb2xkRVBvcnRUeXBlLCBlUG9ydFR5cGUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVCaW5kaW5nT3BlcmF0aW9ucygpCi0gIHsKLSAgICBpZiAoZUJpbmRpbmdPcGVyYXRpb25zID09IG51bGwpCi0gICAgewotICAgICAgZUJpbmRpbmdPcGVyYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEJpbmRpbmdPcGVyYXRpb24uY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlMpOwotICAgIH0KLSAgICByZXR1cm4gZUJpbmRpbmdPcGVyYXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhbiBvcGVyYXRpb24gYmluZGluZyB0byBiaW5kaW5nLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmdPcGVyYXRpb24oamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBnZXRCaW5kaW5nT3BlcmF0aW9ucygpLmFkZChiaW5kaW5nT3BlcmF0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gYmluZGluZy4gTm90ZSB0aGF0IG9wZXJhdGlvbiBuYW1lcyBjYW4KLSAgICogYmUgb3ZlcmxvYWRlZCB3aXRoaW4gYSBQb3J0VHlwZS4gSW4gY2FzZSBvZiBvdmVybG9hZGluZywgdGhlCi0gICAqIG5hbWVzIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1lc3NhZ2VzIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIKLSAgICogcmVmaW5lIHRoZSBzZWFyY2guCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIG9wZXJhdGlvbiBiaW5kaW5nLgotICAgKiBAcGFyYW0gaW5wdXROYW1lIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBtZXNzYWdlOyBpZiB0aGlzIGlzIG51bGwKLSAgICogaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcGFyYW0gb3V0cHV0TmFtZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IG1lc3NhZ2U7IGlmIHRoaXMgaXMgbnVsbAotICAgKiBpdCB3aWxsIGJlIGlnbm9yZWQuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGJpbmRpbmcsIG9yIG51bGwgaWYgdGhlcmUgd2Fzbid0Ci0gICAqIGFueSBtYXRjaGluZyBvcGVyYXRpb24gYmluZGluZwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gZ2V0QmluZGluZ09wZXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGlucHV0TmFtZSwgU3RyaW5nIG91dHB1dE5hbWUpCi0gIHsKLSAgICBJdGVyYXRvciBvcEJpbmRpbmdJdGVyYXRvciA9IGdldEJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAob3BCaW5kaW5nSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBvcCA9IChqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24pIG9wQmluZGluZ0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChvcCA9PSBudWxsKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgU3RyaW5nIG9wTmFtZSA9IG9wLmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3BOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICghbmFtZS5lcXVhbHMob3BOYW1lKSkKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuYW1lICE9IG51bGwgfHwgb3BOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9wID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgaW5wdXROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGphdmF4LndzZGwuQmluZGluZ0lucHV0IGlucHV0ID0gb3AuZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG9wSW5wdXROYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotICAgICAgICAgIGlmIChvcElucHV0TmFtZSA9PSBudWxsIHx8ICFvcElucHV0TmFtZS5lcXVhbHMoaW5wdXROYW1lKSkKLSAgICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgb3AgPSBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAmJiBvdXRwdXROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGphdmF4LndzZGwuQmluZGluZ091dHB1dCBvdXRwdXQgPSBvcC5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvcE91dHB1dE5hbWUgPSBvdXRwdXQuZ2V0TmFtZSgpOwotICAgICAgICAgIGlmIChvcE91dHB1dE5hbWUgPT0gbnVsbCB8fCAhb3BPdXRwdXROYW1lLmVxdWFscyhvdXRwdXROYW1lKSkKLSAgICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgb3AgPSBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG9wOwotICAgIH0gLy8gZW5kIHdoaWxlCi0gICAgcmV0dXJuIG51bGw7IC8vIGJpbmRpbmcgb3BlcmF0aW9uIG5vdCBmb3VuZAotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIG9wZXJhdGlvbiBiaW5kaW5ncyBkZWZpbmVkIGhlcmUuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ09wZXJhdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIGdldEVCaW5kaW5nT3BlcmF0aW9ucygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuUG9ydFR5cGUgZ2V0UG9ydFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGdldEVQb3J0VHlwZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UG9ydFR5cGUoamF2YXgud3NkbC5Qb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIHNldEVQb3J0VHlwZSgoUG9ydFR5cGUpIHBvcnRUeXBlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQmluZGluZ09wZXJhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUFJPWFk6Ci0gICAgICAgIHJldHVybiBpc1Byb3h5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FUE9SVF9UWVBFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVQb3J0VHlwZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFUG9ydFR5cGUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUJJTkRJTkdfT1BFUkFUSU9OUzoKLSAgICAgICAgcmV0dXJuIGdldEVCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19RTkFNRToKLSAgICAgICAgc2V0UU5hbWUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19QUk9YWToKLSAgICAgICAgc2V0UHJveHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FUE9SVF9UWVBFOgotICAgICAgICBzZXRFUG9ydFR5cGUoKFBvcnRUeXBlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FQklORElOR19PUEVSQVRJT05TOgotICAgICAgICBnZXRFQmluZGluZ09wZXJhdGlvbnMoKS5jbGVhcigpOwotICAgICAgICBnZXRFQmluZGluZ09wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKFFOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSShSRVNPVVJDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VQT1JUX1RZUEU6Ci0gICAgICAgIHNldEVQb3J0VHlwZSgoUG9ydFR5cGUpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUJJTkRJTkdfT1BFUkFUSU9OUzoKLSAgICAgICAgZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCAhPSBVTkRFRklORURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1BST1hZOgotICAgICAgICByZXR1cm4gcHJveHkgIT0gUFJPWFlfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRVBPUlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGVQb3J0VHlwZSAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FQklORElOR19PUEVSQVRJT05TOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdPcGVyYXRpb25zICE9IG51bGwgJiYgIWVCaW5kaW5nT3BlcmF0aW9ucy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHFOYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHVuZGVmaW5lZDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1bmRlZmluZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJveHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJveHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQotICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICBzZXRRTmFtZShxbmFtZSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBjb21wb25lbnQ7Ci0KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZy5nZXRFQmluZGluZ09wZXJhdGlvbnMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk9QRVJBVElPTiA6Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICBhZGRCaW5kaW5nT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQscmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHJlbW92ZSh0aGlzLCBpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKE9iamVjdCBjb21wb25lbnQsIE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IGdldExpc3QoY29tcG9uZW50LCBtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0IGdldExpc3QoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBudWxsOwotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBjb21wb25lbnQ7Ci0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ09wZXJhdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGJpbmRpbmcuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nX1FOYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlUmVmZXJlbmNlKGVSZWZlcmVuY2UpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlUmVmZXJlbmNlID09IG51bGwgfHwgZVJlZmVyZW5jZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ19FUG9ydFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBnZXRFUG9ydFR5cGUoKTsKLSAgICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxTmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIiMiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuQklORElORyk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEJpbmRpbmdPcGVyYXRpb25JbXBsKSBvcGVyYXRpb24pLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIFFOYW1lIHBvcnRUeXBlUU5hbWUgPSBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpKTsKLSAgICAgIFBvcnRUeXBlIG5ld1BvcnRUeXBlID0gcG9ydFR5cGVRTmFtZSAhPSBudWxsID8gKFBvcnRUeXBlKSBkZWZpbml0aW9uLmdldFBvcnRUeXBlKHBvcnRUeXBlUU5hbWUpIDogbnVsbDsKLSAgICAgIGlmIChuZXdQb3J0VHlwZSAhPSBnZXRFUG9ydFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0RVBvcnRUeXBlKG5ld1BvcnRUeXBlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotfSAvL0JpbmRpbmdJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbnB1dEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0lucHV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDZhYmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0lucHV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIElucHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0lucHV0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0lucHV0SW1wbCNnZXRFSW5wdXQgPGVtPkVJbnB1dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdJbnB1dEltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBCaW5kaW5nSW5wdXQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUlucHV0KCkgPGVtPkVJbnB1dDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUlucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIElucHV0IGVJbnB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ0lucHV0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0gICAgbmFtZSA9IG5ld05hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgSW5wdXQgZ2V0RUlucHV0KCkKLSAgewotICAgIGlmIChlSW5wdXQgIT0gbnVsbCAmJiBlSW5wdXQuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBJbnB1dCBvbGRFSW5wdXQgPSBlSW5wdXQ7Ci0gICAgICBlSW5wdXQgPSAoSW5wdXQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVJbnB1dCk7Ci0gICAgICBpZiAoZUlucHV0ICE9IG9sZEVJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FSU5QVVQsIG9sZEVJbnB1dCwgZUlucHV0KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlSW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBJbnB1dCBiYXNpY0dldEVJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZUlucHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFSW5wdXQoSW5wdXQgbmV3RUlucHV0KQotICB7Ci0gICAgSW5wdXQgb2xkRUlucHV0ID0gZUlucHV0OwotICAgIGVJbnB1dCA9IG5ld0VJbnB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FSU5QVVQsIG9sZEVJbnB1dCwgZUlucHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5JbnB1dCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUlucHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChqYXZheC53c2RsLklucHV0IGlucHV0KQotICB7Ci0gICAgc2V0RUlucHV0KChJbnB1dCkgaW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FSU5QVVQ6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RUlucHV0KCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVJbnB1dCgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FSU5QVVQ6Ci0gICAgICAgIHJldHVybiBlSW5wdXQgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxpYXRpb24gbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXROYW1lKG5hbWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnJlbW92ZShpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gKEJpbmRpbmdJbnB1dCkgY29tcG9uZW50OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZEFsbChiaW5kaW5nSW5wdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ0lucHV0X05hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLklOUFVUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0gIAotICAvLyBSZXNvbHZlIHRoZSByZWZlcmVuY2UgdG8gSW5wdXQKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm9wID0gKEJpbmRpbmdPcGVyYXRpb24pZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBPcGVyYXRpb24gb3AgPSBib3AuZ2V0RU9wZXJhdGlvbigpOwotICAgICAgaWYgKG9wICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldElucHV0KG9wLmdldEVJbnB1dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotfSAvL0JpbmRpbmdJbnB1dEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ09wZXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ09wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4N2Y1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdPcGVyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZyBPcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nT3BlcmF0aW9uSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwjZ2V0RU9wZXJhdGlvbiA8ZW0+RU9wZXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdPcGVyYXRpb25JbXBsI2dldEVCaW5kaW5nSW5wdXQgPGVtPkVCaW5kaW5nIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwjZ2V0RUJpbmRpbmdPdXRwdXQgPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdPcGVyYXRpb25JbXBsI2dldEVCaW5kaW5nRmF1bHRzIDxlbT5FQmluZGluZyBGYXVsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nT3BlcmF0aW9uSW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJpbmRpbmdPcGVyYXRpb24KLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU9wZXJhdGlvbigpIDxlbT5FT3BlcmF0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBlT3BlcmF0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUJpbmRpbmdJbnB1dCgpIDxlbT5FQmluZGluZyBJbnB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmdJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nSW5wdXQgZUJpbmRpbmdJbnB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5nT3V0cHV0KCkgPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmdPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ091dHB1dCBlQmluZGluZ091dHB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5nRmF1bHRzKCkgPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZ0ZhdWx0cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlQmluZGluZ0ZhdWx0cyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBNYXAgYmluZGluZ0ZhdWx0czsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3BlcmF0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdPcGVyYXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPcGVyYXRpb24gZ2V0RU9wZXJhdGlvbigpCi0gIHsKLSAgICBpZiAoZU9wZXJhdGlvbiAhPSBudWxsICYmIGVPcGVyYXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBPcGVyYXRpb24gb2xkRU9wZXJhdGlvbiA9IGVPcGVyYXRpb247Ci0gICAgICBlT3BlcmF0aW9uID0gKE9wZXJhdGlvbillUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZU9wZXJhdGlvbik7Ci0gICAgICBpZiAoZU9wZXJhdGlvbiAhPSBvbGRFT3BlcmF0aW9uKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OLCBvbGRFT3BlcmF0aW9uLCBlT3BlcmF0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uIGJhc2ljR2V0RU9wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZU9wZXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RU9wZXJhdGlvbihPcGVyYXRpb24gbmV3RU9wZXJhdGlvbikKLSAgewotICAgIE9wZXJhdGlvbiBvbGRFT3BlcmF0aW9uID0gZU9wZXJhdGlvbjsKLSAgICBlT3BlcmF0aW9uID0gbmV3RU9wZXJhdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTiwgb2xkRU9wZXJhdGlvbiwgZU9wZXJhdGlvbikpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZ0lucHV0IGdldEVCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGVCaW5kaW5nSW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IG5ld0VCaW5kaW5nSW5wdXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgb2xkRUJpbmRpbmdJbnB1dCA9IGVCaW5kaW5nSW5wdXQ7Ci0gICAgZUJpbmRpbmdJbnB1dCA9IG5ld0VCaW5kaW5nSW5wdXQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgIHsKLSAgICAgIEVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQsIG9sZEVCaW5kaW5nSW5wdXQsIG5ld0VCaW5kaW5nSW5wdXQpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgbmV3RUJpbmRpbmdJbnB1dCkKLSAgewotICAgIGlmIChuZXdFQmluZGluZ0lucHV0ICE9IGVCaW5kaW5nSW5wdXQpCi0gICAgewotICAgICAgTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0gICAgICBpZiAoZUJpbmRpbmdJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZUJpbmRpbmdJbnB1dCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCwgbnVsbCwgbXNncyk7Ci0gICAgICBpZiAobmV3RUJpbmRpbmdJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RUJpbmRpbmdJbnB1dCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCwgbnVsbCwgbXNncyk7Ci0gICAgICBtc2dzID0gYmFzaWNTZXRFQmluZGluZ0lucHV0KG5ld0VCaW5kaW5nSW5wdXQsIG1zZ3MpOwotICAgICAgaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCwgbmV3RUJpbmRpbmdJbnB1dCwgbmV3RUJpbmRpbmdJbnB1dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZ091dHB1dCBnZXRFQmluZGluZ091dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZUJpbmRpbmdPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgbmV3RUJpbmRpbmdPdXRwdXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBCaW5kaW5nT3V0cHV0IG9sZEVCaW5kaW5nT3V0cHV0ID0gZUJpbmRpbmdPdXRwdXQ7Ci0gICAgZUJpbmRpbmdPdXRwdXQgPSBuZXdFQmluZGluZ091dHB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgewotICAgICAgRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG9sZEVCaW5kaW5nT3V0cHV0LCBuZXdFQmluZGluZ091dHB1dCk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG5ld0VCaW5kaW5nT3V0cHV0KQotICB7Ci0gICAgaWYgKG5ld0VCaW5kaW5nT3V0cHV0ICE9IGVCaW5kaW5nT3V0cHV0KQotICAgIHsKLSAgICAgIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotICAgICAgaWYgKGVCaW5kaW5nT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllQmluZGluZ091dHB1dCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld0VCaW5kaW5nT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFQmluZGluZ091dHB1dCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG51bGwsIG1zZ3MpOwotICAgICAgbXNncyA9IGJhc2ljU2V0RUJpbmRpbmdPdXRwdXQobmV3RUJpbmRpbmdPdXRwdXQsIG1zZ3MpOwotICAgICAgaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG5ld0VCaW5kaW5nT3V0cHV0LCBuZXdFQmluZGluZ091dHB1dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUJpbmRpbmdGYXVsdHMoKQotICB7Ci0gICAgaWYgKGVCaW5kaW5nRmF1bHRzID09IG51bGwpCi0gICAgewotICAgICAgZUJpbmRpbmdGYXVsdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmluZGluZ0ZhdWx0LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVCaW5kaW5nRmF1bHRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIGZhdWx0IGJpbmRpbmcuCi0gICAqIEBwYXJhbSBmYXVsdCB0aGUgbmV3IGZhdWx0IGJpbmRpbmcKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nRmF1bHQoamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICB7Ci0gICAgZ2V0RUJpbmRpbmdGYXVsdHMoKS5hZGQoKEJpbmRpbmdGYXVsdCliaW5kaW5nRmF1bHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIGZhdWx0IGJpbmRpbmcuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGZhdWx0IGJpbmRpbmcuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZmF1bHQgYmluZGluZywgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIGZhdWx0IGJpbmRpbmcKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgZ2V0QmluZGluZ0ZhdWx0KFN0cmluZyBuYW1lKQotICB7Ci0gICAgQmluZGluZ0ZhdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgQmluZGluZ0ZhdWx0IGZhdWx0ID0gKEJpbmRpbmdGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBpZiAobmFtZS5lcXVhbHMoZmF1bHQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZmF1bHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIGZhdWx0IGJpbmRpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiBiaW5kaW5nLgotICAgKiBAcmV0dXJuIG5hbWVzIG9mIGZhdWx0IGJpbmRpbmdzCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRCaW5kaW5nRmF1bHRzKCkKLSAgewotICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpIGkubmV4dCgpOwotICAgICAgaGFzaE1hcC5wdXQoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwgYmluZGluZ0ZhdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hNYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5PcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRFT3BlcmF0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb24oamF2YXgud3NkbC5PcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgc2V0RU9wZXJhdGlvbigoT3BlcmF0aW9uKSBvcGVyYXRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZ0lucHV0IGdldEJpbmRpbmdJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUJpbmRpbmdJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFNldCB0aGUgaW5wdXQgb2YgdGhpcyBvcGVyYXRpb24gYmluZGluZy4KLSAgICogQHBhcmFtIGlucHV0IHRoZSBkZXNpcmVkIGlucHV0Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QmluZGluZ0lucHV0KGphdmF4LndzZGwuQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkKLSAgewotICAgIHNldEVCaW5kaW5nSW5wdXQoKEJpbmRpbmdJbnB1dCkgYmluZGluZ0lucHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgZ2V0QmluZGluZ091dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUJpbmRpbmdPdXRwdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBTZXQgdGhlIG91dHB1dCBvZiB0aGlzIG9wZXJhdGlvbiBiaW5kaW5nLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdPdXRwdXQoamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpCi0gIHsKLSAgICBzZXRFQmluZGluZ091dHB1dCgoQmluZGluZ091dHB1dCkgYmluZGluZ091dHB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICAgIHJldHVybiBiYXNpY1NldEVCaW5kaW5nSW5wdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVDoKLSAgICAgICAgICByZXR1cm4gYmFzaWNTZXRFQmluZGluZ091dHB1dChudWxsLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUJpbmRpbmdGYXVsdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVPcGVyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RU9wZXJhdGlvbigpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQ6Ci0gICAgICAgIHJldHVybiBnZXRFQmluZGluZ0lucHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQ6Ci0gICAgICAgIHJldHVybiBnZXRFQmluZGluZ091dHB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICByZXR1cm4gZ2V0RUJpbmRpbmdGYXVsdHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VPUEVSQVRJT046Ci0gICAgICAgIHNldEVPcGVyYXRpb24oKE9wZXJhdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICBzZXRFQmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQ6Ci0gICAgICAgIHNldEVCaW5kaW5nT3V0cHV0KChCaW5kaW5nT3V0cHV0KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICBnZXRFQmluZGluZ0ZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVCaW5kaW5nRmF1bHRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OOgotICAgICAgICBzZXRFT3BlcmF0aW9uKChPcGVyYXRpb24pbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICBzZXRFQmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVDoKLSAgICAgICAgc2V0RUJpbmRpbmdPdXRwdXQoKEJpbmRpbmdPdXRwdXQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0ZBVUxUUzoKLSAgICAgICAgZ2V0RUJpbmRpbmdGYXVsdHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgIT0gbnVsbCAmJiAhZUV4dGVuc2liaWxpdHlFbGVtZW50cy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTjoKLSAgICAgICAgcmV0dXJuIGVPcGVyYXRpb24gIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdJbnB1dCAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdPdXRwdXQgIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0ZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGVCaW5kaW5nRmF1bHRzICE9IG51bGwgJiYgIWVCaW5kaW5nRmF1bHRzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuSU5QVVQgOgotICAgICAgewotICAgICAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0lucHV0KCk7Ci0gICAgICAgIGlucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgIGlucHV0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICBzZXRCaW5kaW5nSW5wdXQoaW5wdXQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5PVVRQVVQgOgotICAgICAgewotICAgICAgICBCaW5kaW5nT3V0cHV0IG91dHB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICAgIG91dHB1dC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICBvdXRwdXQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIHNldEJpbmRpbmdPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRkFVTFQgOgotICAgICAgewotICAgICAgICBCaW5kaW5nRmF1bHQgZmF1bHQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgICAgIGZhdWx0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgIGZhdWx0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICBhZGRCaW5kaW5nRmF1bHQoZmF1bHQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEVCaW5kaW5nSW5wdXQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEVCaW5kaW5nT3V0cHV0KG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgY29tcG9uZW50OwotCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCkpOwotICAgIH0KLQotICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCkpOwotICAgIH0KLQotICAgIGxpc3QuYWRkQWxsKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZ09wZXJhdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdPcGVyYXRpb25fTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuT1BFUkFUSU9OKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgQmluZGluZ0lucHV0IGlucHV0ID0gZ2V0RUJpbmRpbmdJbnB1dCgpOwotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEJpbmRpbmdJbnB1dEltcGwpIGlucHV0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICBCaW5kaW5nT3V0cHV0IG91dHB1dCA9IGdldEVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEJpbmRpbmdPdXRwdXRJbXBsKSBvdXRwdXQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgQmluZGluZ0ZhdWx0IGZhdWx0ID0gKEJpbmRpbmdGYXVsdCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoQmluZGluZ0ZhdWx0SW1wbCkgZmF1bHQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotICAKLSAgLy8gUmVzb2x2ZSB0aGUgcmVmZXJlbmNlIHRvIE9wZXJhdGlvbgotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0T3BlcmF0aW9uKHBvcnRUeXBlLmdldE9wZXJhdGlvbihnZXROYW1lKCksbnVsbCxudWxsKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLX0gLy9CaW5kaW5nT3BlcmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nT3V0cHV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nT3V0cHV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWJmYTRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ091dHB1dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIE91dHB1dDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdPdXRwdXRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nT3V0cHV0SW1wbCNnZXRFT3V0cHV0IDxlbT5FT3V0cHV0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmluZGluZ091dHB1dEltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBCaW5kaW5nT3V0cHV0Ci17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVPdXRwdXQoKSA8ZW0+RU91dHB1dDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBPdXRwdXQgZU91dHB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ091dHB1dEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKLSAgICBuYW1lID0gbmV3TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT3V0cHV0IGdldEVPdXRwdXQoKQotICB7Ci0gICAgaWYgKGVPdXRwdXQgIT0gbnVsbCAmJiBlT3V0cHV0LmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgT3V0cHV0IG9sZEVPdXRwdXQgPSBlT3V0cHV0OwotICAgICAgZU91dHB1dCA9IChPdXRwdXQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVPdXRwdXQpOwotICAgICAgaWYgKGVPdXRwdXQgIT0gb2xkRU91dHB1dCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRU9VVFBVVCwgb2xkRU91dHB1dCwgZU91dHB1dCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZU91dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE91dHB1dCBiYXNpY0dldEVPdXRwdXQoKQotICB7Ci0gICAgcmV0dXJuIGVPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVPdXRwdXQoT3V0cHV0IG5ld0VPdXRwdXQpCi0gIHsKLSAgICBPdXRwdXQgb2xkRU91dHB1dCA9IGVPdXRwdXQ7Ci0gICAgZU91dHB1dCA9IG5ld0VPdXRwdXQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VPVVRQVVQsIG9sZEVPdXRwdXQsIGVPdXRwdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk91dHB1dCBnZXRPdXRwdXQoKQotICB7Ci0gICAgcmV0dXJuIGdldEVPdXRwdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dChqYXZheC53c2RsLk91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBzZXRFT3V0cHV0KChPdXRwdXQpIG91dHB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VPVVRQVVQ6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RU91dHB1dCgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFT3V0cHV0KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FT1VUUFVUOgotICAgICAgICBzZXRFT3V0cHV0KChPdXRwdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VPVVRQVVQ6Ci0gICAgICAgIHNldEVPdXRwdXQoKE91dHB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VPVVRQVVQ6Ci0gICAgICAgIHJldHVybiBlT3V0cHV0ICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQobmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQscmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkucmVtb3ZlKGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IChCaW5kaW5nT3V0cHV0KSBjb21wb25lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKGJpbmRpbmdPdXRwdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ091dHB1dF9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5PVVRQVVQpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLSAgCi0gIC8vIFJlc29sdmUgdGhlIHJlZmVyZW5jZSB0byBPdXRwdXQKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm9wID0gKEJpbmRpbmdPcGVyYXRpb24pZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBPcGVyYXRpb24gb3AgPSBib3AuZ2V0RU9wZXJhdGlvbigpOwotICAgICAgaWYgKG9wICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldE91dHB1dChvcC5nZXRFT3V0cHV0KCkpOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9Ci19IC8vQmluZGluZ091dHB1dEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRGVmaW5pdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4MjQ5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0RlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ldmVudHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uZXZlbnRzLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uZXZlbnRzLkV2ZW50VGFyZ2V0OwotaW1wb3J0IG9yZy53M2MuZG9tLmV2ZW50cy5NdXRhdGlvbkV2ZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVNZXNzYWdlcyA8ZW0+RU1lc3NhZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RVBvcnRUeXBlcyA8ZW0+RVBvcnQgVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbCNnZXRFQmluZGluZ3MgPGVtPkVCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVTZXJ2aWNlcyA8ZW0+RVNlcnZpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RU5hbWVzcGFjZXMgPGVtPkVOYW1lc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RVR5cGVzIDxlbT5FVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbCNnZXRFSW1wb3J0cyA8ZW0+RUltcG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZpbml0aW9uSW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERlZmluaXRpb24KLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb24gPSBMT0NBVElPTl9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuY29kaW5nKCkgPGVtPkVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbmNvZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5jb2RpbmcoKSA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVuY29kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZyA9IEVOQ09ESU5HX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFTWVzc2FnZXMoKSA8ZW0+RU1lc3NhZ2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVNZXNzYWdlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlTWVzc2FnZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUG9ydFR5cGVzKCkgPGVtPkVQb3J0IFR5cGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVQb3J0VHlwZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZVBvcnRUeXBlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5ncygpIDxlbT5FQmluZGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmdzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVCaW5kaW5ncyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVTZXJ2aWNlcygpIDxlbT5FU2VydmljZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVNlcnZpY2VzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVTZXJ2aWNlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVOYW1lc3BhY2VzKCkgPGVtPkVOYW1lc3BhY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVOYW1lc3BhY2VzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVOYW1lc3BhY2VzID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RVR5cGVzKCkgPGVtPkVUeXBlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVR5cGVzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFR5cGVzIGVUeXBlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVJbXBvcnRzKCkgPGVtPkVJbXBvcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVJbXBvcnRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVJbXBvcnRzID0gbnVsbDsKLQotICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5OwotICBwcml2YXRlIFN0cmluZyBkb2N1bWVudEJhc2VVUkk7Ci0gIHByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIHByaXZhdGUgSGFzaE1hcCBuYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICBTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIHRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFLCBvbGRUYXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKQotICB7Ci0gICAgU3RyaW5nIG9sZExvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19MT0NBVElPTiwgb2xkTG9jYXRpb24sIGxvY2F0aW9uKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG5ld1FOYW1lKQotICB7Ci0gICAgUU5hbWUgb2xkUU5hbWUgPSBxTmFtZTsKLSAgICBxTmFtZSA9IG5ld1FOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FLCBvbGRRTmFtZSwgcU5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpCi0gIHsKLSAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBuZXdFbmNvZGluZykKLSAgewotICAgIFN0cmluZyBvbGRFbmNvZGluZyA9IGVuY29kaW5nOwotICAgIGVuY29kaW5nID0gbmV3RW5jb2Rpbmc7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5DT0RJTkcsIG9sZEVuY29kaW5nLCBlbmNvZGluZykpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RU1lc3NhZ2VzKCkKLSAgewotICAgIGlmIChlTWVzc2FnZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlTWVzc2FnZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZS5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVNZXNzYWdlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVQb3J0VHlwZXMoKQotICB7Ci0gICAgaWYgKGVQb3J0VHlwZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlUG9ydFR5cGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBvcnRUeXBlLmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FUE9SVF9UWVBFUyk7Ci0gICAgfQotICAgIHJldHVybiBlUG9ydFR5cGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUJpbmRpbmdzKCkKLSAgewotICAgIGlmIChlQmluZGluZ3MgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlQmluZGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmluZGluZy5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUJJTkRJTkdTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVCaW5kaW5nczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVTZXJ2aWNlcygpCi0gIHsKLSAgICBpZiAoZVNlcnZpY2VzID09IG51bGwpCi0gICAgewotICAgICAgZVNlcnZpY2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2UuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VTRVJWSUNFUyk7Ci0gICAgfQotICAgIHJldHVybiBlU2VydmljZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFTmFtZXNwYWNlcygpCi0gIHsKLSAgICBpZiAoZU5hbWVzcGFjZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlTmFtZXNwYWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChOYW1lc3BhY2UuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQU1FU1BBQ0VTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVOYW1lc3BhY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgVHlwZXMgZ2V0RVR5cGVzKCkKLSAgewotICAgIHJldHVybiBlVHlwZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVUeXBlcyhUeXBlcyBuZXdFVHlwZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBUeXBlcyBvbGRFVHlwZXMgPSBlVHlwZXM7Ci0gICAgZVR5cGVzID0gbmV3RVR5cGVzOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTLCBvbGRFVHlwZXMsIG5ld0VUeXBlcyk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFVHlwZXMoVHlwZXMgbmV3RVR5cGVzKQotICB7Ci0gICAgaWYgKG5ld0VUeXBlcyAhPSBlVHlwZXMpCi0gICAgewotICAgICAgTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0gICAgICBpZiAoZVR5cGVzICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllVHlwZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVMsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld0VUeXBlcyAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RVR5cGVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTLCBudWxsLCBtc2dzKTsKLSAgICAgIG1zZ3MgPSBiYXNpY1NldEVUeXBlcyhuZXdFVHlwZXMsIG1zZ3MpOwotICAgICAgaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VUWVBFUywgbmV3RVR5cGVzLCBuZXdFVHlwZXMpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbXNnKQotICB7Ci0gICAgc3VwZXIuZU5vdGlmeShtc2cpOwotICAgIAotICAgIC8vIGNzLi4gaWYgd2UndmUgYWRkZWQgYSBUeXBlcyBlbGVtZW50LCBhbmQgdGhpcyBkZWZpbml0aW9uIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSByZXNvdXJjZQotICAgIC8vIHdlIG5lZWQgdG8gc2V0IHRoZSBzY2hlbWFMb2NhdGlvbnMgZm9yIGFueSBpbmxpbmUgc2NoZW1hTG9jYXRpb25zLgotICAgIC8vIElmIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgdGhlIHNjaGVtYUxvY2F0aW9uJ3Mgd2lsbCBiZSBzZXQgdmlhIFdTRExSZXNvdXJjZUltcGwuYXR0YWNoZWQoRU9iamVjdCBvKQotICAgIC8vCi0gICAgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fRVR5cGVzKCkgJiYKLSAgICAgICAgbXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQpCi0gICAgewotICAgICAgaWYgKGVSZXNvdXJjZSgpIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCAmJiBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0SW5saW5lU2NoZW1hTG9jYXRpb25zKGVSZXNvdXJjZSgpKTsKLSAgICAgIH0gICAgCi0gICAgfSAgICAgICAgCi0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFSW1wb3J0cygpCi0gIHsKLSAgICBpZiAoZUltcG9ydHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlSW1wb3J0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbXBvcnQuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVJbXBvcnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIGJpbmRpbmcgdG8gdGhpcyBXU0RMIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gYmluZGluZyB0aGUgYmluZGluZyB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmcoamF2YXgud3NkbC5CaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBnZXRFQmluZGluZ3MoKS5hZGQoKEJpbmRpbmcpIGJpbmRpbmcpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhbiBpbXBvcnQgdG8gdGhpcyBXU0RMIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gaW1wb3J0RGVmIHRoZSBpbXBvcnQgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoamF2YXgud3NkbC5JbXBvcnQgaW1wb3J0RGVmKQotICB7Ci0gICAgZ2V0RUltcG9ydHMoKS5hZGQoKEltcG9ydCkgaW1wb3J0RGVmKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBtZXNzYWdlIHRvIHRoaXMgV1NETCBkZXNjcmlwdGlvbi4KLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGphdmF4LndzZGwuTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgZ2V0RU1lc3NhZ2VzKCkuYWRkKChNZXNzYWdlKW1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaXMgYSB3YXkgdG8gYWRkIGEgbmFtZXNwYWNlIGFzc29jaWF0aW9uIHRvIGEgZGVmaW5pdGlvbi4KLSAgICogSXQgaXMgc2ltaWxhciB0byBhZGRpbmcgYSBuYW1lc3BhY2UgcHJlZml4IGRlY2xhcmF0aW9uIHRvIHRoZQotICAgKiB0b3Agb2YgYSAmbHQ7d3NkbDpkZWZpbml0aW9uJmd0OyBlbGVtZW50LiBUaGlzIGhhcyBub3RoaW5nIHRvIGRvCi0gICAqIHdpdGggdGhlICZsdDt3c2RsOmltcG9ydCZndDsgZWxlbWVudDsgdGhlcmUgYXJlIHNlcGFyYXRlIG1ldGhvZHMgZm9yCi0gICAqIGRlYWxpbmcgd2l0aCBpbmZvcm1hdGlvbiBkZXNjcmliZWQgYnkgJmx0O3dzZGw6aW1wb3J0Jmd0OyBlbGVtZW50cy4KLSAgICogVGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZSBhc3NvY2lhdGlvbiAod2hpY2ggY2FuIGJlCi0gICAqIG92ZXJyaWRkZW4pIGJldHdlZW4gdGhlIG51bGwgcHJlZml4IGFuZAotICAgKiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLy4KLSAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IHRvIHVzZSBmb3IgdGhpcyBuYW1lc3BhY2UgKHdoZW4KLSAgICogcmVuZGVyaW5nIHRoaXMgaW5mb3JtYXRpb24gYXMgWE1MKS4gVXNlIG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nCi0gICAqIHRvIGRlc2NyaWJlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSAoaS5lLiB4bWxucz0iLi4uIikuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgdGhlIG5hbWVzcGFjZSBVUkkgdG8gYXNzb2NpYXRlIHRoZSBwcmVmaXgKLSAgICogd2l0aC4gSWYgeW91IHVzZSBudWxsLCB0aGUgbmFtZXNwYWNlIGFzc29jaWF0aW9uIHdpbGwgYmUgcmVtb3ZlZC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgIHByZWZpeCA9ICIiOwotCi0gICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEZpcnN0LCBjaGVjayBpZiB0aGVyZSBpcyB0aGlzIG5hbWVzcGFjZSBhbHJlYWR5LgotICAgICAgU3RyaW5nIGV4aXN0aW5nUHJlZml4ID0gZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICBpZiAoZXhpc3RpbmdQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICAvLyBNYWtlIHN1cmUgdGhlIHByZWZpeCBpcyBub3QgYWxyZWFkeSB1c2VkIGZvciBhIGRpZmZlcmVudCBuYW1lc3BhY2UKLSAgICAgIE1hcCBuYW1lc3BhY2VzID0gZ2V0TmFtZXNwYWNlcygpOwotICAgICAgU3RyaW5nIGV4aXN0aW5nTmFtZXNwYWNlID0gKFN0cmluZykgbmFtZXNwYWNlcy5nZXQocHJlZml4KTsKLSAgICAgIGlmIChleGlzdGluZ05hbWVzcGFjZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lc3BhY2VzLnB1dChwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTdXBwb3J0IGZvciBOYW1lc3BhY2UKLSAgICAgICAgTmFtZXNwYWNlIGVucyA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOYW1lc3BhY2UoKTsKLSAgICAgICAgZW5zLnNldFByZWZpeChwcmVmaXgpOwotICAgICAgICBlbnMuc2V0VVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIGdldEVOYW1lc3BhY2VzKCkuYWRkKGVucyk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIFRoZSBwcmVmaXggaXMgdGFrZW4gYWxyZWFkeS4gTWFrZSBhIHVuaXF1ZSBwcmVmaXgKLSAgICAgIGlmIChwcmVmaXguZW5kc1dpdGgoIjEiKSkKLSAgICAgICAgcHJlZml4ID0gcHJlZml4LnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDI7OyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXggKyBpOwotICAgICAgICBpZiAoIW5hbWVzcGFjZXMuY29udGFpbnNLZXkobmV3UHJlZml4KSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzcGFjZXMucHV0KG5ld1ByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBTdXBwb3J0IGZvciBOYW1lc3BhY2UKLSAgICAgICAgICBOYW1lc3BhY2UgZW5zID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5hbWVzcGFjZSgpOwotICAgICAgICAgIGVucy5zZXRQcmVmaXgocHJlZml4KTsKLSAgICAgICAgICBlbnMuc2V0VVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgZ2V0RU5hbWVzcGFjZXMoKS5hZGQoZW5zKTsKLSAgICAgICAgICAKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IC8vIGVuZCBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGdldE5hbWVzcGFjZXMoKS5yZW1vdmUocHJlZml4KTsKLSAgICAgIAotICAgICAgLy8gU3VwcG9ydCBmb3IgTmFtZXNwYWNlCi0gICAgICBnZXRFTmFtZXNwYWNlcygpLnJlbW92ZShwcmVmaXgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBwb3J0VHlwZSB0byB0aGlzIFdTREwgZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSBwb3J0VHlwZSB0aGUgcG9ydFR5cGUgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQb3J0VHlwZShqYXZheC53c2RsLlBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgZ2V0RVBvcnRUeXBlcygpLmFkZCgoUG9ydFR5cGUpcG9ydFR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIHNlcnZpY2UgdG8gdGhpcyBXU0RMIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gc2VydmljZSB0aGUgc2VydmljZSB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoamF2YXgud3NkbC5TZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBnZXRFU2VydmljZXMoKS5hZGQoKFNlcnZpY2Upc2VydmljZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IGJpbmRpbmcgZmF1bHQuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZyBmYXVsdAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nRmF1bHQgY3JlYXRlQmluZGluZ0ZhdWx0KCkKLSAgewotICAgIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgYmluZGluZyBpbnB1dC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBiaW5kaW5nIGlucHV0Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIEJpbmRpbmdJbnB1dCBjcmVhdGVCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICByZXR1cm4gYmluZGluZ0lucHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBiaW5kaW5nIG91dHB1dC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBiaW5kaW5nIG91dHB1dAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKQotICB7Ci0gICAgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICByZXR1cm4gYmluZGluZ091dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgYmluZGluZyBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZyBvcGVyYXRpb24KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCkKLSAgewotICAgIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IGJpbmRpbmcuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmcgY3JlYXRlQmluZGluZygpCi0gIHsKLSAgICBqYXZheC53c2RsLkJpbmRpbmcgYmluZGluZyA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZygpOwotICAgIGJpbmRpbmcuc2V0VW5kZWZpbmVkKHRydWUpOwotICAgIHJldHVybiBiaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBmYXVsdC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBmYXVsdAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBGYXVsdCBjcmVhdGVGYXVsdCgpCi0gIHsKLSAgICBqYXZheC53c2RsLkZhdWx0IGZhdWx0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVGYXVsdCgpOwotICAgIHJldHVybiBmYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgaW1wb3J0LgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGltcG9ydAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkltcG9ydCBjcmVhdGVJbXBvcnQoKQotICB7Ci0gICAgamF2YXgud3NkbC5JbXBvcnQgaW1wb3J0RGVmID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVJbXBvcnQoKTsKLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBpbnB1dC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBpbnB1dAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBJbnB1dCBjcmVhdGVJbnB1dCgpCi0gIHsKLSAgICBqYXZheC53c2RsLklucHV0IGlucHV0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVJbnB1dCgpOwotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgbWVzc2FnZS4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBtZXNzYWdlCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkKLSAgewotICAgIGphdmF4LndzZGwuTWVzc2FnZSBtZXNzYWdlID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgbWVzc2FnZS5zZXRVbmRlZmluZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IG9wZXJhdGlvbi4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBvcGVyYXRpb24KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpCi0gIHsKLSAgICBqYXZheC53c2RsLk9wZXJhdGlvbiBvcGVyYXRpb24gPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIG9wZXJhdGlvbi5zZXRVbmRlZmluZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgb3V0cHV0LgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG91dHB1dAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KCkKLSAgewotICAgIGphdmF4LndzZGwuT3V0cHV0IG91dHB1dCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0gICAgcmV0dXJuIG91dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgcGFydC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBwYXJ0Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIFBhcnQgY3JlYXRlUGFydCgpCi0gIHsKLSAgICBqYXZheC53c2RsLlBhcnQgcGFydCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlUGFydCgpOwotICAgIHJldHVybiBwYXJ0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBwb3J0LgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHBvcnQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgUG9ydCBjcmVhdGVQb3J0KCkKLSAgewotICAgIGphdmF4LndzZGwuUG9ydCBwb3J0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVQb3J0KCk7Ci0gICAgcmV0dXJuIHBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IHBvcnQgdHlwZS4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBwb3J0IHR5cGUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0VHlwZSBjcmVhdGVQb3J0VHlwZSgpCi0gIHsKLSAgICBqYXZheC53c2RsLlBvcnRUeXBlIHBvcnRUeXBlID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgIHBvcnRUeXBlLnNldFVuZGVmaW5lZCh0cnVlKTsKLSAgICByZXR1cm4gcG9ydFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IHNlcnZpY2UuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgc2VydmljZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlNlcnZpY2UgY3JlYXRlU2VydmljZSgpCi0gIHsKLSAgICBqYXZheC53c2RsLlNlcnZpY2Ugc2VydmljZSA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZSgpOwotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIGJpbmRpbmcuIEFsc28gY2hlY2tzIGltcG9ydGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgYmluZGluZy4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBiaW5kaW5nLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgYmluZGluZwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmcgZ2V0QmluZGluZyhRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLkJpbmRpbmcpIHJlc29sdmVXU0RMRWxlbWVudChXU0RMQ29uc3RhbnRzLkJJTkRJTkcsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIGJpbmRpbmdzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldEJpbmRpbmdzKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVNYXAoV1NETENvbnN0YW50cy5CSU5ESU5HLCBnZXRFQmluZGluZ3MoKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAqIEdldCBhIG1hcCBvZiBsaXN0cyBjb250YWluaW5nIGFsbCB0aGUgaW1wb3J0cyBkZWZpbmVkIGhlcmUuCi0gICAgKiBUaGUgbWFwJ3Mga2V5cyBhcmUgdGhlIG5hbWVzcGFjZVVSSXMsIGFuZCB0aGUgbWFwJ3MgdmFsdWVzCi0gICAgKiBhcmUgbGlzdHMuIFRoZXJlIGlzIG9uZSBsaXN0IGZvciBlYWNoIG5hbWVzcGFjZVVSSSBmb3Igd2hpY2gKLSAgICAqIGltcG9ydHMgaGF2ZSBiZWVuIGRlZmluZWQuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRJbXBvcnRzKCkKLSAgewotICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJbXBvcnQgdGhlSW1wb3J0ID0gKEltcG9ydCkgaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcga2V5ID0gdGhlSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKGtleSA9PSBudWxsKQotICAgICAgewotICAgICAgICBrZXkgPSAiIjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbnVsbDsKLSAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IChMaXN0KW1hcC5nZXQoa2V5KTsKLSAgICAgICAgbGlzdC5hZGQodGhlSW1wb3J0KTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGxpc3QuYWRkKHRoZUltcG9ydCk7ICAgICAgIAotICAgICAgfQotICAgICAgbWFwLnB1dChrZXksbGlzdCk7ICAgICAgCi0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBsaXN0IG9mIGltcG9ydHMgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlVVJJLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIHRoZSBuYW1lc3BhY2VVUkkgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgKiBkZXNpcmVkIGltcG9ydHMuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGltcG9ydHMKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbXBvcnRzKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSW1wb3J0IHRoZUltcG9ydCA9IChJbXBvcnQpIGkubmV4dCgpOwotICAgICAgaWYgKFdTRExDb25zdGFudHMuaXNNYXRjaGluZ05hbWVzcGFjZShuYW1lc3BhY2VVUkksIHRoZUltcG9ydC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHRoZUltcG9ydCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuIEFsc28gY2hlY2tzIGltcG9ydGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgbWVzc2FnZS4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgbWVzc2FnZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk1lc3NhZ2UgZ2V0TWVzc2FnZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLk1lc3NhZ2UpIHJlc29sdmVXU0RMRWxlbWVudChXU0RMQ29uc3RhbnRzLk1FU1NBR0UsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVNYXAoV1NETENvbnN0YW50cy5NRVNTQUdFLCBnZXRFTWVzc2FnZXMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBuYW1lc3BhY2UgVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWZpeC4gT3IgbnVsbCBpZgotICAgKiB0aGVyZSBpcyBubyBuYW1lc3BhY2UgVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWZpeC4gVGhpcyBpcwotICAgKiB1bnJlbGF0ZWQgdG8gdGhlICZsdDt3c2RsOmltcG9ydCZndDsgZWxlbWVudC4KLSAgICogQHNlZSAjYWRkTmFtZXNwYWNlKFN0cmluZywgU3RyaW5nKQotICAgKiBAc2VlICNnZXRQcmVmaXgoU3RyaW5nKQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgZ2V0TmFtZXNwYWNlcygpLmdldChwcmVmaXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgbmFtZXNwYWNlIGFzc29jaWF0aW9ucyBpbiB0aGlzIGRlZmluaXRpb24uIFRoZSBrZXlzIGFyZQotICAgKiB0aGUgcHJlZml4ZXMsIGFuZCB0aGUgbmFtZXNwYWNlIFVSSXMgYXJlIHRoZSB2YWx1ZXMuIFRoaXMgaXMKLSAgICogdW5yZWxhdGVkIHRvIHRoZSAmbHQ7d3NkbDppbXBvcnQmZ3Q7IGVsZW1lbnQuCi0gICAqIEBzZWUgI2FkZE5hbWVzcGFjZShTdHJpbmcsIFN0cmluZykKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZXMoKQotICB7ICAgIAotICAgIHJldHVybiBuYW1lc3BhY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIHBvcnRUeXBlLiBBbHNvIGNoZWNrcyBpbXBvcnRlZCBkb2N1bWVudHMuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBvcnRUeXBlLgotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHBvcnRUeXBlLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgcG9ydFR5cGUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0VHlwZSBnZXRQb3J0VHlwZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlBvcnRUeXBlKSByZXNvbHZlV1NETEVsZW1lbnQoV1NETENvbnN0YW50cy5QT1JUX1RZUEUsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIHBvcnRUeXBlcyBkZWZpbmVkIGhlcmUuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRQb3J0VHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZU1hcChXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSwgZ2V0RVBvcnRUeXBlcygpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYSBwcmVmaXggYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlIFVSSS4gT3IgbnVsbCBpZgotICAgKiB0aGVyZSBhcmUgbm8gcHJlZml4ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlIFVSSS4gVGhpcyBpcwotICAgKiB1bnJlbGF0ZWQgdG8gdGhlICZsdDt3c2RsOmltcG9ydCZndDsgZWxlbWVudC4KLSAgICogQHNlZSAjYWRkTmFtZXNwYWNlKFN0cmluZywgU3RyaW5nKQotICAgKiBAc2VlICNnZXROYW1lc3BhY2UoU3RyaW5nKQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBpZiAobmFtZXNwYWNlVVJJID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIEl0ZXJhdG9yIGVudHJ5SXRlcmF0b3IgPSBnZXROYW1lc3BhY2VzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChlbnRyeUl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbnRyeUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIFN0cmluZyBhc3NvY05hbWVzcGFjZVVSSSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgIGlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKGFzc29jTmFtZXNwYWNlVVJJKSAmJiBwcmVmaXggIT0gIiIpIC8vIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIHNlcnZpY2UuIEFsc28gY2hlY2tzIGltcG9ydGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgc2VydmljZS4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBzZXJ2aWNlLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgc2VydmljZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlNlcnZpY2UgZ2V0U2VydmljZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlNlcnZpY2UpIHJlc29sdmVXU0RMRWxlbWVudChXU0RMQ29uc3RhbnRzLlNFUlZJQ0UsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIHNlcnZpY2VzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldFNlcnZpY2VzKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVNYXAoV1NETENvbnN0YW50cy5TRVJWSUNFLCBnZXRFU2VydmljZXMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBFeHRlbnNpb25SZWdpc3RyeSBmb3IgdGhpcyBEZWZpbml0aW9uLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBnZXRFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogU2V0IHRoZSBFeHRlbnNpb25SZWdpc3RyeSBmb3IgdGhpcyBEZWZpbml0aW9uLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvblJlZ2lzdHJ5KEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25SZWdpc3RyeSA9IGV4dGVuc2lvblJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudEJhc2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudEJhc2VVUkkoU3RyaW5nIGRvY3VtZW50QmFzZSkKLSAgewotICAgIHNldExvY2F0aW9uKGRvY3VtZW50QmFzZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5UeXBlcyBjcmVhdGVUeXBlcygpCi0gIHsKLSAgICBqYXZheC53c2RsLlR5cGVzIHR5cGVzID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVUeXBlcygpOwotICAgIHJldHVybiB0eXBlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlNlcnZpY2UgcmVtb3ZlU2VydmljZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlNlcnZpY2UpIGdldFNlcnZpY2VzKCkucmVtb3ZlKG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZyByZW1vdmVCaW5kaW5nKFFOYW1lIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gKGphdmF4LndzZGwuQmluZGluZykgZ2V0QmluZGluZ3MoKS5yZW1vdmUobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0VHlwZSByZW1vdmVQb3J0VHlwZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlBvcnRUeXBlKSBnZXRQb3J0VHlwZXMoKS5yZW1vdmUobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5NZXNzYWdlIHJlbW92ZU1lc3NhZ2UoUU5hbWUgbmFtZSkKLSAgewotICAgIHJldHVybiAoamF2YXgud3NkbC5NZXNzYWdlKSBnZXRNZXNzYWdlcygpLnJlbW92ZShuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlR5cGVzIGdldFR5cGVzKCkKLSAgewotICAgIHJldHVybiBnZXRFVHlwZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVzKGphdmF4LndzZGwuVHlwZXMgdHlwZXMpCi0gIHsKLSAgICBzZXRFVHlwZXMoKFR5cGVzKSB0eXBlcyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFNldHMgdGhlIG93bmVyIGRvY3VtZW50LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RU1lc3NhZ2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FUE9SVF9UWVBFUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVQb3J0VHlwZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVCaW5kaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVNFUlZJQ0VTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVNlcnZpY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTkFNRVNQQUNFUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVOYW1lc3BhY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgICAgcmV0dXJuIGJhc2ljU2V0RVR5cGVzKG51bGwsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUltcG9ydHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgcmV0dXJuIGdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19MT0NBVElPTjoKLSAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FOgotICAgICAgICByZXR1cm4gZ2V0UU5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5DT0RJTkc6Ci0gICAgICAgIHJldHVybiBnZXRFbmNvZGluZygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTUVTU0FHRVM6Ci0gICAgICAgIHJldHVybiBnZXRFTWVzc2FnZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVM6Ci0gICAgICAgIHJldHVybiBnZXRFUG9ydFR5cGVzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUzoKLSAgICAgICAgcmV0dXJuIGdldEVCaW5kaW5ncygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FU0VSVklDRVM6Ci0gICAgICAgIHJldHVybiBnZXRFU2VydmljZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5BTUVTUEFDRVM6Ci0gICAgICAgIHJldHVybiBnZXRFTmFtZXNwYWNlcygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgIHJldHVybiBnZXRFVHlwZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUlNUE9SVFM6Ci0gICAgICAgIHJldHVybiBnZXRFSW1wb3J0cygpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICBzZXRUYXJnZXROYW1lc3BhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fTE9DQVRJT046Ci0gICAgICAgIHNldExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQ09ESU5HOgotICAgICAgICBzZXRFbmNvZGluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTUVTU0FHRVM6Ci0gICAgICAgIGdldEVNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVNZXNzYWdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVM6Ci0gICAgICAgIGdldEVQb3J0VHlwZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFUG9ydFR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FQklORElOR1M6Ci0gICAgICAgIGdldEVCaW5kaW5ncygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVCaW5kaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVNFUlZJQ0VTOgotICAgICAgICBnZXRFU2VydmljZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFU2VydmljZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQU1FU1BBQ0VTOgotICAgICAgICBnZXRFTmFtZXNwYWNlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVOYW1lc3BhY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgIHNldEVUeXBlcygoVHlwZXMpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICBnZXRFSW1wb3J0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVJbXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1RBUkdFVF9OQU1FU1BBQ0U6Ci0gICAgICAgIHNldFRhcmdldE5hbWVzcGFjZShUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19MT0NBVElPTjoKLSAgICAgICAgc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FOgotICAgICAgICBzZXRRTmFtZShRTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5DT0RJTkc6Ci0gICAgICAgIHNldEVuY29kaW5nKEVOQ09ESU5HX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTUVTU0FHRVM6Ci0gICAgICAgIGdldEVNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVM6Ci0gICAgICAgIGdldEVQb3J0VHlwZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUzoKLSAgICAgICAgZ2V0RUJpbmRpbmdzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FU0VSVklDRVM6Ci0gICAgICAgIGdldEVTZXJ2aWNlcygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5BTUVTUEFDRVM6Ci0gICAgICAgIGdldEVOYW1lc3BhY2VzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgIHNldEVUeXBlcygoVHlwZXMpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUlNUE9SVFM6Ci0gICAgICAgIGdldEVJbXBvcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICByZXR1cm4gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgOiAhVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fTE9DQVRJT046Ci0gICAgICAgIHJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQ09ESU5HOgotICAgICAgICByZXR1cm4gRU5DT0RJTkdfRURFRkFVTFQgPT0gbnVsbCA/IGVuY29kaW5nICE9IG51bGwgOiAhRU5DT0RJTkdfRURFRkFVTFQuZXF1YWxzKGVuY29kaW5nKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTOgotICAgICAgICByZXR1cm4gZU1lc3NhZ2VzICE9IG51bGwgJiYgIWVNZXNzYWdlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VQT1JUX1RZUEVTOgotICAgICAgICByZXR1cm4gZVBvcnRUeXBlcyAhPSBudWxsICYmICFlUG9ydFR5cGVzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUJJTkRJTkdTOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdzICE9IG51bGwgJiYgIWVCaW5kaW5ncy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VTRVJWSUNFUzoKLSAgICAgICAgcmV0dXJuIGVTZXJ2aWNlcyAhPSBudWxsICYmICFlU2VydmljZXMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTkFNRVNQQUNFUzoKLSAgICAgICAgcmV0dXJuIGVOYW1lc3BhY2VzICE9IG51bGwgJiYgIWVOYW1lc3BhY2VzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTOgotICAgICAgICByZXR1cm4gZVR5cGVzICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICByZXR1cm4gZUltcG9ydHMgIT0gbnVsbCAmJiAhZUltcG9ydHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh0YXJnZXROYW1lc3BhY2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGxvY2F0aW9uOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGxvY2F0aW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHFOYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVuY29kaW5nOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGVuY29kaW5nKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gSGFuZC1jb2RlZCBtZXRob2RzCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZVNldCBnbG9iYWxSZXNvdXJjZVNldDsKLQotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBSZXNvdXJjZVNldCBnZXRHbG9iYWxSZXNvdXJjZVNldCgpCi0gIHsKLSAgICBpZiAoZ2xvYmFsUmVzb3VyY2VTZXQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnbG9iYWxSZXNvdXJjZVNldCA9IGNyZWF0ZVJlc291cmNlU2V0KCk7Ci0gICAgICAvL1N0cmluZyBiYXNlVVJMID0gV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRCYXNlVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJCYXNlIFVSTCBpczogIiArIGJhc2VVUkwpOwotICAgIH0KLQotICAgIHJldHVybiBnbG9iYWxSZXNvdXJjZVNldDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlUmVzb3VyY2VTZXQoKQotICB7Ci0gICAgUmVzb3VyY2VTZXQgcmVzdWx0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotICAgIHJlc3VsdC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZURlZmluaXRpb24obm9kZSwgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gY3JlYXRlRGVmaW5pdGlvbihOb2RlIG5vZGUsIFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uKG5vZGUsbG9jYXRpb24sdHJ1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgRGVmaW5pdGlvbiBjcmVhdGVEZWZpbml0aW9uKE5vZGUgbm9kZSwgU3RyaW5nIGxvY2F0aW9uLCBib29sZWFuIHVzZUV4dGVuc2lvbkZhY3RvcmllcykKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgKChEZWZpbml0aW9uSW1wbClkZWZpbml0aW9uKS5zZXRVc2VFeHRlbnNpb25GYWN0b3JpZXModXNlRXh0ZW5zaW9uRmFjdG9yaWVzKTsKLSAgICBkZWZpbml0aW9uLnNldEVsZW1lbnQoKEVsZW1lbnQpIG5vZGUpOwotICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGxvY2F0aW9uKTsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHJpdmF0ZSBXU0RMRWxlbWVudCByZXNvbHZlV1NETEVsZW1lbnQoaW50IHR5cGUsIExpc3QgbGlzdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSkKLSAgewotICAgIFdTRExFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgICAgUU5hbWUgdGhlUU5hbWUgPSBnZXRRTmFtZUZvcldTRExFbGVtZW50KHR5cGUsIHdzZGxFbGVtZW50KTsKLSAgICAgICAgaWYgKHFuYW1lLmVxdWFscyh0aGVRTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB3c2RsRWxlbWVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBIYXNoTWFwIGNyZWF0ZU1hcChpbnQgdHlwZSwgTGlzdCBsaXN0KQotICB7Ci0gICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgIFFOYW1lIHRoZVFOYW1lID0gZ2V0UU5hbWVGb3JXU0RMRWxlbWVudCh0eXBlLCB3c2RsRWxlbWVudCk7Ci0gICAgICBpZiAodGhlUU5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWFwLnB1dCh0aGVRTmFtZSwgd3NkbEVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLSAgcHJpdmF0ZSBRTmFtZSBnZXRRTmFtZUZvcldTRExFbGVtZW50KGludCB0eXBlLCBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgewotICAgIFFOYW1lIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVNTQUdFIDoKLSAgICAgICAgcmVzdWx0ID0gKChNZXNzYWdlKSB3c2RsRWxlbWVudCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuUE9SVF9UWVBFIDoKLSAgICAgICAgcmVzdWx0ID0gKChQb3J0VHlwZSkgd3NkbEVsZW1lbnQpLmdldFFOYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLkJJTkRJTkcgOgotICAgICAgICByZXN1bHQgPSAoKEJpbmRpbmcpIHdzZGxFbGVtZW50KS5nZXRRTmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5TRVJWSUNFIDoKLSAgICAgICAgcmVzdWx0ID0gKChTZXJ2aWNlKSB3c2RsRWxlbWVudCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKgotICAgKiBUQkQgLSBSZXZpc2l0Ci0gICAqIExvb2sgZm9yIGFuIG9iamVjdCBpbiB0aGUgaW1wb3J0ZWQgZGVmaW5pdGlvbnMuCi0gICAqLwotICBwcml2YXRlIFdTRExFbGVtZW50IHJlc29sdmVXU0RMRWxlbWVudChpbnQgdHlwZSwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSkKLSAgewotICAgIFdTRExFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuTUVTU0FHRSA6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSwgcW5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSA6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCksIHFuYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc29sdmVXU0RMRWxlbWVudCh0eXBlLCBkZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLCBxbmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuU0VSVklDRSA6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZGVmaW5pdGlvbi5nZXRFU2VydmljZXMoKSwgcW5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLSAgLy8KLSAgLy8gUmVjb25jaWxpYXRpb24gbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRWxlbWVudCBvbGRFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmIChvbGRFbGVtZW50IGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpCi0gICAgewotICAgICAgRXZlbnRUYXJnZXQgb2xkRXZlbnRUYXJnZXQgPSAoKEV2ZW50VGFyZ2V0KW9sZEVsZW1lbnQpOwotICAgICAgb2xkRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTm9kZUluc2VydGVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICAgIG9sZEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTU5vZGVSZW1vdmVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICAgIG9sZEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUF0dHJNb2RpZmllZCIsIGdldEV2ZW50TGlzdGVuZXIoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIHN1cGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFdmVudFRhcmdldCkKLSAgICB7Ci0gICAgICBFdmVudFRhcmdldCBldmVudFRhcmdldCA9ICgoRXZlbnRUYXJnZXQpZWxlbWVudCk7Ci0gICAgICBldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJET01Ob2RlSW5zZXJ0ZWQiLCBnZXRFdmVudExpc3RlbmVyKCksIHRydWUpOwotICAgICAgZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTm9kZVJlbW92ZWQiLCBnZXRFdmVudExpc3RlbmVyKCksIHRydWUpOwotICAgICAgZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQXR0ck1vZGlmaWVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgaWYgKGNoYW5nZWRFbGVtZW50ID09IGdldEVsZW1lbnQoKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgc2V0VGFyZ2V0TmFtZXNwYWNlKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIikpOwotICAgICAgc2V0UU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJLCBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkpOwotICAgICAgZ2V0RU5hbWVzcGFjZXMoKS5jbGVhcigpOwotICAgICAgZ2V0TmFtZXNwYWNlcygpLmNsZWFyKCk7Ci0gICAgICAvL2dldE5hbWVzcGFjZXMoKS5wdXQoIiIsIG51bGwpOwotCi0gICAgICBOYW1lZE5vZGVNYXAgbWFwID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBtYXAuaXRlbShpKTsKLSAgICAgICAgU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgaWYgKCJ4bWxucyIuZXF1YWxzKGF0dHIuZ2V0UHJlZml4KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgbnNQcmVmaXggPSBhdHRyLmdldExvY2FsTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJ4bWxucyIuZXF1YWxzKGF0dHIuZ2V0Tm9kZU5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBuc1ByZWZpeCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5zUHJlZml4ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXROYW1lc3BhY2VzKCkucHV0KG5zUHJlZml4LCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLkJJTkRJTkcgOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICAgICAgICBiaW5kaW5nLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgYmluZGluZy5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBDUzogd2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byB1bnNldCB0aGlzIGVsZW1lbnQgd2hlbiBpdHMgcmVtb3ZlZAotICAgICAgICAgIC8vZGVmaW5pdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChjaGlsZCk7ICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLklNUE9SVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbXBvcnQgaSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbXBvcnQoKTsKLSAgICAgICAgICBpLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgaS5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRJbXBvcnQoaSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVNTQUdFIDoKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgbWVzc2FnZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHRoaXMpOwotICAgICAgICAgIG1lc3NhZ2Uuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgYWRkTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICAgIHBvcnRUeXBlLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgcG9ydFR5cGUuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuU0VSVklDRSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICBzZXJ2aWNlLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgc2VydmljZS5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuVFlQRVMgOgotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGdldEVUeXBlcygpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgVHlwZXMgdHlwZXMgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVR5cGVzKCk7Ci0gICAgICAgICAgICB0eXBlcy5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHRoaXMpOwotICAgICAgICAgICAgdHlwZXMuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgICBzZXRFVHlwZXModHlwZXMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgZGVmYXVsdCA6Ci0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gZ2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkgPyAKLSAgICAgICAgICAoKFdTRExGYWN0b3J5SW1wbClXU0RMRmFjdG9yeS5lSU5TVEFOQ0UpLmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KGdldE5hbWVzcGFjZShjaGlsZCksZ2V0TG9jYWxOYW1lKGNoaWxkKSkgOgotICAgICAgICAgICgoV1NETEZhY3RvcnlJbXBsKVdTRExGYWN0b3J5LmVJTlNUQU5DRSkuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICAgIAkgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbih0aGlzKTsKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBUeXBlcykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgICAgaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgPT0gbW9kZWxPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIGRlZmluaXRpb24uc2V0RVR5cGVzKG51bGwpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gZ2V0TGlzdChjb21wb25lbnQsIG1vZGVsT2JqZWN0KTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0TGlzdChPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGNvbXBvbmVudDsKLQotICAgIC8vIHRvZG8uLi4gdXNlIFdTRExTd2l0Y2gKLSAgICAvLwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBJbXBvcnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2UpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkZWZpbml0aW9uLmdldEVQb3J0VHlwZXMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKSk7Ci0gICAgbGlzdC5hZGQoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHVibGljIERvY3VtZW50IHVwZGF0ZURvY3VtZW50KCkKLSAgewotICAgIGRvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoKTsKLSAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gIH0KLQotICBwcml2YXRlIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBXU0RMUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuREVGSU5JVElPTik7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIE9iamVjdCBvYmogPSBudWxsOwotCi0gICAgVHlwZXMgdHlwZXMgPSBnZXRFVHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChUeXBlc0ltcGwpIHR5cGVzKS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFSW1wb3J0cygpKTsKLSAgICBhZGRDaGlsZEVsZW1lbnRzKG5ld0VsZW1lbnQsIGdldEVNZXNzYWdlcygpKTsKLSAgICBhZGRDaGlsZEVsZW1lbnRzKG5ld0VsZW1lbnQsIGdldEVQb3J0VHlwZXMoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFQmluZGluZ3MoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFU2VydmljZXMoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZEVsZW1lbnRzKEVsZW1lbnQgcGFyZW50LCBMaXN0IGMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50SW1wbCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudEltcGwpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSB3c2RsRWxlbWVudC5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZVJlZmVyZW5jZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UpCi0gIHsKLSAgICAvLyBBZGQgbmFtZXNwYWNlIHByZWZpeCBpbmZvCi0gICAgLy8gVEJEIC0gTmVlZCB0byByZXZpc2l0LgotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAoZVJlZmVyZW5jZSA9PSBudWxsICYmIHRoZUVsZW1lbnQgIT0gbnVsbCkgCi0gICAgLy8gV2UgYXJlIHVwZGF0aW5nIHRoZSBEZWZpbml0aW9uIGVsZW1lbnQuCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXROYW1lc3BhY2VzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgIFN0cmluZyB1cmkgPSBudWxsOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBwcmVmaXggPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgdXJpID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKHByZWZpeCAhPSAiIikKLSAgICAgICAgICB0aGVFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhTRENvbnN0YW50cy5YTUxOU19VUklfMjAwMCwgInhtbG5zOiIgKyBwcmVmaXgsIHVyaSk7Ci0gICAgICAgIGVsc2UgaWYgKHVyaSAhPSBudWxsKQotICAgICAgICAgIC8vIEhhbmRsZSBkZWZhdWx0IG5hbWVzcGFjZSwgZS5nLiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgdGhlRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYU0RDb25zdGFudHMuWE1MTlNfVVJJXzIwMDAsICJ4bWxucyIsIHVyaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7ICAgIAotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOyAKLSAgICAKLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgLy9pZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fRW5jb2RpbmcoKSkKLSAgICAgIC8vICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuRU5DT0RJTkdfQVRUUklCVVRFLCBnZXRFbmNvZGluZygpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVmaW5pdGlvbl9RTmFtZSgpKQotICAgICAgICBpZiAoZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fVGFyZ2V0TmFtZXNwYWNlKCkpCi0gICAgICAgIGlmIChnZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFLCBnZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0RGVmaW5pdGlvbnMoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKG5hbWVzcGFjZSwgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKHRoaXMpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRJbXBvcnRzKG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgICgoSW1wb3J0SW1wbCkgdGhlSW1wb3J0KS5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsKLSAgICAgIERlZmluaXRpb24gaW1wb3J0ZWREZWZpbml0aW9uID0gdGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoaW1wb3J0ZWREZWZpbml0aW9uICE9IG51bGwgJiYgV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKG5hbWVzcGFjZSwgaW1wb3J0ZWREZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoaW1wb3J0ZWREZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVFbGVtZW50RGVjbGFyYXRpb25VUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIGludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZigiIyIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSByZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpLCB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlU2NoZW1hKG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKSBpLm5leHQoKTsKLSAgICAgIHJlc3VsdCA9IHNjaGVtYS5yZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ291bGQgbm90IHJlc29sdmUuIFRyeSBhZ2FpbnN0IGFsbCA8aW1wb3J0PmVkIGFuZCBpbmxpbmVkIHNjaGVtYXMuCi0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0SW1wb3J0ZWRPcklubGluZWRTY2hlbWFzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWkubmV4dCgpOwotICAgICAgcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24obmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIHJlc29sdmVUeXBlRGVmaW5pdGlvblVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoIiMiKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcmVzdWx0ID0gcmVzb2x2ZVR5cGVEZWZpbml0aW9uKHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpLCB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIHJlc29sdmVUeXBlRGVmaW5pdGlvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlU2NoZW1hKG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWkubmV4dCgpOwotICAgICAgcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVUeXBlRGVmaW5pdGlvbihuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8vIENvdWxkIG5vdCByZXNvbHZlLiBUcnkgYWdhaW5zdCBhbGwgPGltcG9ydD5lZCBhbmQgaW5saW5lZCBzY2hlbWFzLgotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEltcG9ydGVkT3JJbmxpbmVkU2NoZW1hcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSlpLm5leHQoKTsKLSAgICAgIHJlc3VsdCA9IHNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24obmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OyAvLyBGYWlsZWQgdG8gcmVzb2x2ZS4KLSAgfQotCi0gIC8qKgotICAJKiBUaGlzIHJldHVybnMgc2V0IG9mIHNjaGVtYXMgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlIGFzIGl0J3MgdGFyZ2V0IG5hbWVzcGFjZS4KLSAgCSovCi0gIHB1YmxpYyBDb2xsZWN0aW9uIHJlc29sdmVTY2hlbWEoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIGlmICgiIi5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSBudWxsOwotICAgIH0KLQotICAgIGlmIChYU0RDb25zdGFudHMuaXNTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UobmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKG5hbWVzcGFjZSkpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RDb25zdGFudHMuaXNTY2hlbWFJbnN0YW5jZU5hbWVzcGFjZShuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFJbnN0YW5jZShuYW1lc3BhY2UpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBnZXRJbXBvcnRlZE9ySW5saW5lZFNjaGVtYXMobmFtZXNwYWNlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldEltcG9ydGVkT3JJbmxpbmVkU2NoZW1hcyhTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgIGlmIChXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UodGhlSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lc3BhY2UpKQotICAgICAgewotICAgICAgICAoKEltcG9ydEltcGwpIHRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGdldEVUeXBlcygpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGkubmV4dCgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgICB7ICAKLSAgICAgICAgICBsaXN0LmFkZChzY2hlbWEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IGNvbXBvbmVudCA9IGoubmV4dCgpOwotICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNESW1wb3J0IHRoZUltcG9ydCA9IChYU0RJbXBvcnQpY29tcG9uZW50OwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHModGhlSW1wb3J0LmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKChYU0RJbXBvcnRJbXBsKXRoZUltcG9ydCkuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBpbXBvcnRlZFNjaGVtYSA9IHRoZUltcG9ydC5nZXRSZXNvbHZlZFNjaGVtYSgpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKGltcG9ydGVkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGltcG9ydGVkU2NoZW1hKTsKLSAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICAgIAotICAgICAgfSAgICAgCi0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0SW1wb3J0ZWRPcklubGluZWRTY2hlbWFzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJbXBvcnQgdGhlSW1wb3J0ID0gKEltcG9ydCkgaS5uZXh0KCk7Ci0gICAgICAoKEltcG9ydEltcGwpIHRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gdGhlSW1wb3J0LmdldEVTY2hlbWEoKTsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgbGlzdC5hZGQoc2NoZW1hKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdldEVUeXBlcygpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGRBbGwoZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFdmVudExpc3RlbmVyIGV2ZW50TGlzdGVuZXI7Ci0gIHByb3RlY3RlZCBOb2RlIGRlbGV0aW9uTm9kZTsKLQotICBwdWJsaWMgTm9kZSBnZXREZWxldGlvbk5vZGUoKQotICB7Ci0gICAgcmV0dXJuIGRlbGV0aW9uTm9kZTsKLSAgfQotCi0gIHByb3RlY3RlZCBFdmVudExpc3RlbmVyIGdldEV2ZW50TGlzdGVuZXIoKQotICB7Ci0gICAgaWYgKGV2ZW50TGlzdGVuZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBldmVudExpc3RlbmVyID0gCi0gICAgICAgIG5ldyBFdmVudExpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNdXRhdGlvbkV2ZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBNdXRhdGlvbkV2ZW50IG11dGF0aW9uRXZlbnQgPSAoTXV0YXRpb25FdmVudClldmVudDsKLSAgICAgICAgICAgICAgaWYgKG11dGF0aW9uRXZlbnQuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpbXV0YXRpb25FdmVudC5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uRXZlbnQuZ2V0QXR0ckNoYW5nZSgpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgV1NETEVsZW1lbnRJbXBsIGxpc3RlbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscygiRE9NTm9kZVJlbW92ZWQiKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uTm9kZSA9IChOb2RlKWV2ZW50LmdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVsZW1lbnRDb250ZW50c0NoYW5nZWQoKEVsZW1lbnQpbm9kZS5nZXRQYXJlbnROb2RlKCkpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGlvbk5vZGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgV1NETEVsZW1lbnRJbXBsIGxpc3RlbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVsZW1lbnRBdHRyaWJ1dGVzQ2hhbmdlZCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIHJldHVybiBldmVudExpc3RlbmVyOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChOb2RlIG5vZGUpCi0gIHsKLSAgICAvLyBXZSBjb25zaWRlciBhbGwgcGFyZW50cyBzbyB0aGF0IHRoZXkgY2FuIGhhbmRsZSBvdGhlciBjb250YWluZWQgbm9kZXMgdGhhdCBvdGhlcndpc2UgZG9uJ3QgY29ycmVzcG9uZCB0byBhIGNvbXBvbmVudC4KLSAgICAvLwotICAgIExpc3QgcGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgIHsKLSAgICAgIG5vZGUgPSAoKEF0dHIpbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTa2lwIGFoZWFkIHRvIGFuIGVsZW1lbnQuCi0gICAgICAvLwotICAgICAgZm9yIChOb2RlIHNjYW5Ob2RlID0gbm9kZTsgc2Nhbk5vZGUgIT0gbnVsbDsgc2Nhbk5vZGUgPSBzY2FuTm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBpZiAoc2Nhbk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIG5vZGUgPSBzY2FuTm9kZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAKLSAgICAgIC8vIFNraXAgYmFjayB0byBhbiBlbGVtZW50LgotICAgICAgLy8KLSAgICAgIGZvciAoTm9kZSBzY2FuTm9kZSA9IG5vZGU7IHNjYW5Ob2RlICE9IG51bGw7IHNjYW5Ob2RlID0gc2Nhbk5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChzY2FuTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZSA9IHNjYW5Ob2RlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAKLSAgICAvLyBOYXZpZ2F0ZSBvdXQgdGhyb3VnaCB0aGUgZWxlbWVudHMuCi0gICAgLy8KLSAgICBmb3IgKE5vZGUgcGFyZW50ID0gbm9kZTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpCi0gICAgewotICAgICAgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBwYXJlbnRzLmFkZChwYXJlbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIFdTRExFbGVtZW50IGJlc3RXU0RMRWxlbWVudCA9IGdldEJlc3RXU0RMRWxlbWVudChwYXJlbnRzKTsKLSAgICByZXR1cm4gYmVzdFdTRExFbGVtZW50OwotICB9Ci0gIAotICAvLwotICAvLwotICAvLwotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdHJ1ZTsgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRVc2VFeHRlbnNpb25GYWN0b3JpZXMoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAJdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFVzZUV4dGVuc2lvbkZhY3RvcmllcygpCi0gIHsKLSAgCXJldHVybiB1c2VFeHRlbnNpb25GYWN0b3JpZXM7Ci0gIH0KLSAgCi0gIC8vIFNlZSBCdWcgNTM2NgotICBwdWJsaWMgdm9pZCByZW1vdmVBbGwoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgZG9jdW1lbnQgPSBudWxsOwotICAgICBlbGVtZW50ID0gbnVsbDsKLSAgICAgZ2V0RVNlcnZpY2VzKCkuY2xlYXIoKTsKLSAgICAgZ2V0RUJpbmRpbmdzKCkuY2xlYXIoKTsKLSAgICAgZ2V0RVBvcnRUeXBlcygpLmNsZWFyKCk7Ci0gICAgIGdldEVNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgIHNldEVUeXBlcyhudWxsKTsKLSAgICAgZ2V0RUltcG9ydHMoKS5jbGVhcigpOwotICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICB9IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbmxpbmVTY2hlbWFMb2NhdGlvbnMoUmVzb3VyY2UgcmVzb3VyY2UpCi0gIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBpbmxpbmUgc2NoZW1hcyBsb2NhdGlvbiAKLSAgICBUeXBlcyB0eXBlcyA9IHRoaXMuZ2V0RVR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBqID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGoubmV4dCgpOwotICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZWwuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgIAkvLyBXZSBuZWVkIHRoaXMgdHJ5LWNhdGNoIGJsb2NrIGluIGNhc2Ugd2UgZW5jb3VudGVyIGFuIGV4Y2VwdGlvbiB3aGlsZSBhdHRlbXB0aW5nCi0gICAgICAgIAkvLyB0byByZXNvbHZlIHRoZSBzY2hlbWEuICBJbiB0aGUgY2FzZSBvZiB0aGUgV1NETCBFZGl0b3IsIHdlIGdldCBhCi0gICAgICAgIAkvLyAnY2Fubm90IGNyZWF0ZSBwYXJ0IGV4Y2VwdGlvbicuLi4uLi5TZWUgZWNsaXBzZSBidWd6aWxsYSBidWcgODk4NTUKLSAgICAgICAgCXRyeQotICAgICAgICAJewotICAgICAgICAJCXNjaGVtYS5zZXRTY2hlbWFMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgIAl9Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgCi0gICAgfSAgICAgIAotICB9ICAKLSAgCi19IC8vRGVmaW5pdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0V4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4NDI0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0V4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCNnZXRFbGVtZW50VHlwZSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlcXVpcmVkKCkgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1JlcXVpcmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVxdWlyZWQoKSA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUmVxdWlyZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZCA9IFJFUVVJUkVEX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudFR5cGUoKSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgRUxFTUVOVF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudFR5cGUoKSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSBlbGVtZW50VHlwZSA9IEVMRU1FTlRfVFlQRV9FREVGQVVMVDsKLQotICBwcml2YXRlIEhhc2hNYXAgYmVhblByb3BlcnR5RGVzY3JpcHRvcnM7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gcmVxdWlyZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gbmV3UmVxdWlyZWQpCi0gIHsKLSAgICBib29sZWFuIG9sZFJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gICAgcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVELCBvbGRSZXF1aXJlZCwgcmVxdWlyZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKGVDbGFzcygpLmdldEVQYWNrYWdlKCkuZ2V0TnNVUkkoKSwgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgbmV3RWxlbWVudFR5cGUpCi0gIHsKLSAgICBRTmFtZSBvbGRFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotICAgIGVsZW1lbnRUeXBlID0gbmV3RWxlbWVudFR5cGU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEUsIG9sZEVsZW1lbnRUeXBlLCBlbGVtZW50VHlwZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHJlcXVpcmVkOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVsZW1lbnRUeXBlOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGVsZW1lbnRUeXBlKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldFJlcXVpcmVkKCkKLSAgICovCi0gIHB1YmxpYyBCb29sZWFuIGdldFJlcXVpcmVkKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbihpc1JlcXVpcmVkKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50I3NldFJlcXVpcmVkKEJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChCb29sZWFuIHJlcXVpcmVkKQotICB7Ci0gICAgc2V0UmVxdWlyZWQocmVxdWlyZWQuYm9vbGVhblZhbHVlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciBhIGdpdmVuIGNsYXNzLgotICAgKi8KLSAgcHVibGljIGphdmEudXRpbC5NYXAgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuQ2xhc3MgY2xhenopCi0gIHsKLSAgICAvLyBMb29rdXAgcHJvcGVydGllcyBjYWNoZQotICAgIE1hcCBwcm9wZXJ0aWVzID0gbnVsbDsKLSAgICBpZiAoYmVhblByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkKLSAgICAgIGJlYW5Qcm9wZXJ0eURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBlbHNlCi0gICAgICBwcm9wZXJ0aWVzID0gKE1hcCkgYmVhblByb3BlcnR5RGVzY3JpcHRvcnMuZ2V0KGNsYXp6KTsKLQotICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0gICAgewotICAgICAgLy8gSW50cm9zcGVjdCB0aGUgYmVhbgotICAgICAgQXJyYXlMaXN0IGJpbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBCZWFuSW5mbyBiaW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhjbGF6eik7Ci0gICAgICAgIGlmIChiaW5mbyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYmluZm9zLmFkZChiaW5mbyk7Ci0gICAgICAgICAgQmVhbkluZm9bXSBhYmluZm8gPSBiaW5mby5nZXRBZGRpdGlvbmFsQmVhbkluZm8oKTsKLSAgICAgICAgICBpZiAoYWJpbmZvICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBhYmluZm8ubGVuZ3RoOyBiKyspCi0gICAgICAgICAgICAgIGJpbmZvcy5hZGQoYWJpbmZvW2JdKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIFRCRCAtIGhhbmRsZSBleGNlcHRpb24KLSAgICAgIH0KLQotICAgICAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGIgPSBiaW5mb3MuaXRlcmF0b3IoKTsgYi5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCZWFuSW5mbyBiaW5mbyA9IChCZWFuSW5mbykgYi5uZXh0KCk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHBkZXNjID0gYmluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBpZiAocGRlc2MgPT0gbnVsbCkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBwZGVzYy5sZW5ndGg7IHArKykKLSAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChwZGVzY1twXS5nZXROYW1lKCksIHBkZXNjW3BdKTsKLSAgICAgIH0KLSAgICAgIGJlYW5Qcm9wZXJ0eURlc2NyaXB0b3JzLnB1dChjbGF6eiwgcHJvcGVydGllcyk7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50ID09IG51bGwgJiYgIWlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVsZW1lbnQoKTogUHJlc2VydmluZyBvbGQgZWxlbWVudCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RWxlbWVudEdlbihlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBzdXBlci5yZWNvbmNpbGVBdHRyaWJ1dGVzKGNoYW5nZWRFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVJlY29uY2lsaWF0aW9uKHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IEVNRiAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLQotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgLy8gVGhpcyBpcyBhbiBvbGQgZWxlbWVudC4KLSAgICB7Ci0gICAgICBuZXdFbGVtZW50ID0gKEVsZW1lbnQpIGRvY3VtZW50LmltcG9ydE5vZGUoZWxlbWVudCwgdHJ1ZSk7IAotICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIFN0cmluZyBxdWFsaWZpZXIgPSBkZWZpbml0aW9uLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIChxdWFsaWZpZXIgPT0gbnVsbCA/ICIiIDogcXVhbGlmaWVyICsgIjoiKSArIGdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLX0gLy9FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0V4dGVuc2libGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NlNjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5zaWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRXh0ZW5zaWJsZUVsZW1lbnRJbXBsI2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMgPGVtPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJsZUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSA8ZW0+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFeHRlbnNpYmxlRWxlbWVudEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbnNpYmxlRWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gIHsKLSAgICBpZiAoZUV4dGVuc2liaWxpdHlFbGVtZW50cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXh0ZW5zaWJpbGl0eUVsZW1lbnQuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMpOwotICAgIH0KLSAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpCi0gIHsKLSAgICBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGQoZXh0RWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvLwotICAvLwotICAvLwotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgaWYgKCFXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UoY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCksIFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKSkKLSAgICB7ICAKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkgPyAKLSAgICAgICAgICAoKFdTRExGYWN0b3J5SW1wbClXU0RMRmFjdG9yeS5lSU5TVEFOQ0UpLmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KGdldE5hbWVzcGFjZShjaGlsZCksZ2V0TG9jYWxOYW1lKGNoaWxkKSkgOgotICAgICAgICAgICAgKChXU0RMRmFjdG9yeUltcGwpV1NETEZhY3RvcnkuZUlOU1RBTkNFKS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZChleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkKLSAgewotICAJLy8gVXNlIGV4dGVuc2lvbiBmYWN0b3JpZXMgYnkgZGVmYXVsdC4KLSAgICByZXR1cm4gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpID09IG51bGwgPyAKLSAgICAgIHRydWUgOiAKLSAgICAgICgoRGVmaW5pdGlvbkltcGwpZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKS5nZXRVc2VFeHRlbnNpb25GYWN0b3JpZXMoKTsKLSAgfQotICAKLX0gLy9FeHRlbnNpYmxlRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRmF1bHRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0ZhdWx0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRhMjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmF1bHRJbXBsIGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBGYXVsdAotewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBGYXVsdEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRGYXVsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0VNRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIGVNZXNzYWdlICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLkZBVUxUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vRmF1bHRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0ltcG9ydEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW1wb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTg1NGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW1wb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETE1vZGVsTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5JbXBvcnRJbXBsI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkltcG9ydEltcGwjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkltcG9ydEltcGwjZ2V0RURlZmluaXRpb24gPGVtPkVEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuSW1wb3J0SW1wbCNnZXRFU2NoZW1hIDxlbT5FU2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0SW1wbCBleHRlbmRzIFdTRExFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEltcG9ydAotewotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXNvbHZlZDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gTkFNRVNQQUNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvblVSSSgpIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvblVSSSA9IExPQ0FUSU9OX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RURlZmluaXRpb24oKSA8ZW0+RURlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVEZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZURlZmluaXRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFU2NoZW1hKCkgPGVtPkVTY2hlbWE8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVTY2hlbWEoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGVTY2hlbWEgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEltcG9ydEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbXBvcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuZXdOYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIG5hbWVzcGFjZVVSSSA9IG5ld05hbWVzcGFjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgbmV3TG9jYXRpb25VUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTG9jYXRpb25VUkkgPSBsb2NhdGlvblVSSTsKLSAgICBsb2NhdGlvblVSSSA9IG5ld0xvY2F0aW9uVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLklNUE9SVF9fTE9DQVRJT05fVVJJLCBvbGRMb2NhdGlvblVSSSwgbG9jYXRpb25VUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RURlZmluaXRpb24oKQotICB7Ci0gICAgaWYgKGVEZWZpbml0aW9uICE9IG51bGwgJiYgZURlZmluaXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIG9sZEVEZWZpbml0aW9uID0gZURlZmluaXRpb247Ci0gICAgICBlRGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllRGVmaW5pdGlvbik7Ci0gICAgICBpZiAoZURlZmluaXRpb24gIT0gb2xkRURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTiwgb2xkRURlZmluaXRpb24sIGVEZWZpbml0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gYmFzaWNHZXRFRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZURlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVEZWZpbml0aW9uKERlZmluaXRpb24gbmV3RURlZmluaXRpb24pCi0gIHsKLSAgICBEZWZpbml0aW9uIG9sZEVEZWZpbml0aW9uID0gZURlZmluaXRpb247Ci0gICAgZURlZmluaXRpb24gPSBuZXdFRGVmaW5pdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX0VERUZJTklUSU9OLCBvbGRFRGVmaW5pdGlvbiwgZURlZmluaXRpb24pKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRFU2NoZW1hKCkKLSAgewotICAgIGlmIChlU2NoZW1hICE9IG51bGwgJiYgZVNjaGVtYS5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBvbGRFU2NoZW1hID0gZVNjaGVtYTsKLSAgICAgIGVTY2hlbWEgPSAoWFNEU2NoZW1hKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllU2NoZW1hKTsKLSAgICAgIGlmIChlU2NoZW1hICE9IG9sZEVTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BLCBvbGRFU2NoZW1hLCBlU2NoZW1hKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlU2NoZW1hOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGJhc2ljR2V0RVNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gZVNjaGVtYTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RVNjaGVtYShYU0RTY2hlbWEgbmV3RVNjaGVtYSkKLSAgewotICAgIFhTRFNjaGVtYSBvbGRFU2NoZW1hID0gZVNjaGVtYTsKLSAgICBlU2NoZW1hID0gbmV3RVNjaGVtYTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX0VTQ0hFTUEsIG9sZEVTY2hlbWEsIGVTY2hlbWEpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiBnZXRFU2NoZW1hKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHNldEVTY2hlbWEoc2NoZW1hKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uVVJJKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fRURFRklOSVRJT046Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RURlZmluaXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVTY2hlbWEoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RVNjaGVtYSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTE9DQVRJT05fVVJJOgotICAgICAgICBzZXRMb2NhdGlvblVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VERUZJTklUSU9OOgotICAgICAgICBzZXRFRGVmaW5pdGlvbigoRGVmaW5pdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBzZXRFU2NoZW1hKChYU0RTY2hlbWEpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19MT0NBVElPTl9VUkk6Ci0gICAgICAgIHNldExvY2F0aW9uVVJJKExPQ0FUSU9OX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTjoKLSAgICAgICAgc2V0RURlZmluaXRpb24oKERlZmluaXRpb24pbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBzZXRFU2NoZW1hKChYU0RTY2hlbWEpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb25VUkkgIT0gbnVsbCA6ICFMT0NBVElPTl9VUklfRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTjoKLSAgICAgICAgcmV0dXJuIGVEZWZpbml0aW9uICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fRVNDSEVNQToKLSAgICAgICAgcmV0dXJuIGVTY2hlbWEgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZXNwYWNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBsb2NhdGlvblVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChsb2NhdGlvblVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIEltcG9ydCNnZXREZWZpbml0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkRlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0RURlZmluaXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIEltcG9ydCNzZXREZWZpbml0aW9uKERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc2V0RURlZmluaXRpb24oKG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24pIGRlZmluaXRpb24pOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0TmFtZXNwYWNlVVJJKFdTRExDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpKTsKLSAgICBzZXRMb2NhdGlvblVSSShXU0RMQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgV1NETENvbnN0YW50cy5MT0NBVElPTl9BVFRSSUJVVEUpKTsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGlzIGJvb2xlYW4gdG8gZmFsc2UgYmVjYXVzZSB0aGUgSW1wb3J0IG1heSBwb2ludCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbi4KLSAgICAvLyBTbyB3ZSBuZWVkIHdlIHNob3VsZCB2aWV3IHRoaXMgaW1wb3J0IGFzIHVucmVzb2x2ZWQuCi0gICAgcmVzb2x2ZWQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEltcG9ydF9OYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUsIGdldE5hbWVzcGFjZVVSSSgpKTsKLQotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbXBvcnRfTG9jYXRpb25VUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLkxPQ0FUSU9OX0FUVFJJQlVURSwgZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuSU1QT1JUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCkKLSAgewotICAgIHJlc29sdmUoZ2V0TmFtZXNwYWNlVVJJKCksIGdldExvY2F0aW9uVVJJKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICBpZiAoIXJlc29sdmVkKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwgJiYgZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGRlZmluaXRpb24uZVJlc291cmNlKCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotICAgICAgICAgIGlmIChyZXNvdXJjZVNldCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24oZGVmaW5pdGlvbiwgbmFtZXNwYWNlLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgICAgIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHJlc29sdmVkTG9jYXRpb24pOwotICAgICAgICAgICAgUmVzb3VyY2UgcmVzb2x2ZWRSZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHVyaSk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZS5sb2FkKGlucHV0U3RyZWFtLCByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbiBlcnJvciB0byBmYWlsIHRvIHJlc29sdmUuCi0gICAgICAgICAgICAgICAgLy8gSWYgYSByZXNvdXJjZSBpcyBhY3R1YWxseSBjcmVhdGVkLCAKLSAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXBwZW5zIG9ubHkgd2hlbiB3ZSBjYW4gY3JlYXRlIGFuIGlucHV0IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAvLyB0aGVuIGl0J3MgYW4gZXJyb3IgaWYgaXQncyBub3QgYSBnb29kIHdzZGwgb3Igc2NoZW1hCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzb3VyY2UgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZURlZmluaXRpb24gPSAoKFdTRExSZXNvdXJjZUltcGwpIHJlc29sdmVkUmVzb3VyY2UpLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChyZXNvbHZlZFJlc291cmNlIGluc3RhbmNlb2YgWFNEUmVzb3VyY2VJbXBsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZVNjaGVtYSA9ICgoWFNEUmVzb3VyY2VJbXBsKSByZXNvbHZlZFJlc291cmNlKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlRGVmaW5pdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVMb2NhdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBzY2hlbWFMb2NhdGlvbikKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIFdTRExNb2RlbExvY2F0b3IgbG9jYXRvciA9IChXU0RMTW9kZWxMb2NhdG9yKUVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihkZWZpbml0aW9uLmVSZXNvdXJjZSgpLCBXU0RMTW9kZWxMb2NhdG9yLmNsYXNzKTsKLSAgICBpZiAobG9jYXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGxvY2F0b3IucmVzb2x2ZVVSSShkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpLCBuYW1lc3BhY2UsIHNjaGVtYUxvY2F0aW9uKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFRPRE8uLi4gdGhlcmUncyBzb21lIGRlZmF1bHQgcmVzb2x2aW5nIHdlJ2xsIG5lZWQgdG8gZG8gaGVyZQotICAgICAgLy8gc2VlIFhTRFNjaGVtYURpcmVjdGl2ZQotICAgICAgVVJJIGJhc2VMb2NhdGlvblVSSSA9IGNyZWF0ZVVSSShkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgIFVSSSBsb2NhdGlvblVSSSA9IFVSSS5jcmVhdGVVUkkoc2NoZW1hTG9jYXRpb24pOwotICAgICAgcmV0dXJuIGxvY2F0aW9uVVJJLnJlc29sdmUoYmFzZUxvY2F0aW9uVVJJKS50b1N0cmluZygpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIC8vVE9ETy4uLiBwdXNoIGRvd24gdG8gRU1GCi0gIHByaXZhdGUgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIHVyaVN0cmluZykKLSAgewotICAgIGlmIChoYXNQcm90b2NvbCh1cmlTdHJpbmcpKQotICAgICAgIHJldHVybiBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7Ci0gICAgZWxzZQotICAgICAgIHJldHVybiBVUkkuY3JlYXRlRmlsZVVSSSh1cmlTdHJpbmcpOwotICB9Ci0KLSAgLy9UT0RPLi4uIHB1c2ggZG93biB0byBFTUYgIAotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKCI6Iik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggPiAyKSAvLyBhc3N1bWUgcHJvdG9jb2wgd2l0aCBiZSBsZW5ndGggMyBzbyB0aGF0IHRoZSdDJyBpbiAnQzovJyBpcyBub3QgaW50ZXJwcmV0ZWQgYXMgYSBwcm90b2NvbAotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotfSAvL0ltcG9ydEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW5wdXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0lucHV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTdlZTA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW5wdXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklucHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5wdXRJbXBsIGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBJbnB1dAotewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBJbnB1dEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0VNRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIGVNZXNzYWdlICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLklOUFVUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vSW5wdXRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTUxZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZUltcGwjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZUltcGwjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VJbXBsI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZUltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VJbXBsI2dldEVQYXJ0cyA8ZW0+RVBhcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBNZXNzYWdlCi17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UU5hbWUoKSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSBxTmFtZSA9IFFOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVbmRlZmluZWQoKSA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVTkRFRklORURfRURFRkFVTFQgPSBmYWxzZTsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVbmRlZmluZWQoKSA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHVuZGVmaW5lZCA9IFVOREVGSU5FRF9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJPWFlfRURFRkFVTFQgPSBmYWxzZTsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm94eSgpIDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNQcm94eSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHByb3h5ID0gUFJPWFlfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVSSSgpIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VVUkkgPSBSRVNPVVJDRV9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVQYXJ0cygpIDxlbT5FUGFydHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVBhcnRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVQYXJ0cyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBNYXAgcGFydHM7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG5ld1FOYW1lKQotICB7Ci0gICAgUU5hbWUgb2xkUU5hbWUgPSBxTmFtZTsKLSAgICBxTmFtZSA9IG5ld1FOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfX1FOQU1FLCBvbGRRTmFtZSwgcU5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRlZmluZWQoKQotICB7Ci0gICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gbmV3VW5kZWZpbmVkKQotICB7Ci0gICAgYm9vbGVhbiBvbGRVbmRlZmluZWQgPSB1bmRlZmluZWQ7Ci0gICAgdW5kZWZpbmVkID0gbmV3VW5kZWZpbmVkOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfX1VOREVGSU5FRCwgb2xkVW5kZWZpbmVkLCB1bmRlZmluZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gcHJveHk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5KGJvb2xlYW4gbmV3UHJveHkpCi0gIHsKLSAgICBib29sZWFuIG9sZFByb3h5ID0gcHJveHk7Ci0gICAgcHJveHkgPSBuZXdQcm94eTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5NRVNTQUdFX19QUk9YWSwgb2xkUHJveHksIHByb3h5KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVVSSShTdHJpbmcgbmV3UmVzb3VyY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkUmVzb3VyY2VVUkkgPSByZXNvdXJjZVVSSTsKLSAgICByZXNvdXJjZVVSSSA9IG5ld1Jlc291cmNlVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfX1JFU09VUkNFX1VSSSwgb2xkUmVzb3VyY2VVUkksIHJlc291cmNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFUGFydHMoKQotICB7Ci0gICAgaWYgKGVQYXJ0cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVQYXJ0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJ0LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5NRVNTQUdFX19FUEFSVFMpOwotICAgIH0KLSAgICByZXR1cm4gZVBhcnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIHBhcnQgdG8gdGhpcyBtZXNzYWdlLgotICAgKiBAcGFyYW0gcGFydCB0aGUgcGFydCB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFBhcnQoamF2YXgud3NkbC5QYXJ0IHBhcnQpCi0gIHsKLSAgICBnZXRFUGFydHMoKS5hZGQoKFBhcnQpcGFydCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFydC4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcGFydC4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBwYXJ0LCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgcGFydAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlBhcnQgZ2V0UGFydChTdHJpbmcgbmFtZSkKLSAgewotICAgIFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFUGFydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGkubmV4dCgpOwotICAgICAgaWYgKG5hbWUuZXF1YWxzKHBhcnQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcGFydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGFsbCB0aGUgcGFydHMgZGVmaW5lZCBoZXJlLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0UGFydHMoKQotICB7Ci0gICAgSGFzaE1hcCBoYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFUGFydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGkubmV4dCgpOwotICAgICAgaGFzaE1hcC5wdXQocGFydC5nZXROYW1lKCksIHBhcnQpOwotICAgIH0KLSAgICByZXR1cm4gaGFzaE1hcDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldE9yZGVyZWRQYXJ0cyhMaXN0IHBhcnRPcmRlcikKLSAgewotICAgIExpc3Qgb3JkZXJlZFBhcnRzID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChwYXJ0T3JkZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcmRlcmVkUGFydHMuYWRkQWxsKGdldEVQYXJ0cygpKTsKLSAgICAgIHJldHVybiBvcmRlcmVkUGFydHM7Ci0gICAgfQotCi0gICAgSXRlcmF0b3IgcGFydE5hbWVJdGVyYXRvciA9IHBhcnRPcmRlci5pdGVyYXRvcigpOwotICAgIHdoaWxlIChwYXJ0TmFtZUl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFydE5hbWUgPSAoU3RyaW5nKSBwYXJ0TmFtZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGphdmF4LndzZGwuUGFydCBwYXJ0ID0gZ2V0UGFydChwYXJ0TmFtZSk7Ci0gICAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgICBvcmRlcmVkUGFydHMuYWRkKHBhcnQpOwotICAgIH0KLQotICAgIHJldHVybiBvcmRlcmVkUGFydHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRVBBUlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVBhcnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUFJPWFk6Ci0gICAgICAgIHJldHVybiBpc1Byb3h5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19FUEFSVFM6Ci0gICAgICAgIHJldHVybiBnZXRFUGFydHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1BST1hZOgotICAgICAgICBzZXRQcm94eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VQQVJUUzoKLSAgICAgICAgZ2V0RVBhcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RVBhcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKFFOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSShSRVNPVVJDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VQQVJUUzoKLSAgICAgICAgZ2V0RVBhcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBRTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcU5hbWUgIT0gbnVsbCA6ICFRTkFNRV9FREVGQVVMVC5lcXVhbHMocU5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiB1bmRlZmluZWQgIT0gVU5ERUZJTkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBSRVNPVVJDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVVJJICE9IG51bGwgOiAhUkVTT1VSQ0VfVVJJX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVVSSSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VQQVJUUzoKLSAgICAgICAgcmV0dXJuIGVQYXJ0cyAhPSBudWxsICYmICFlUGFydHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChxTmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChxTmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCB1bmRlZmluZWQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodW5kZWZpbmVkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHByb3h5OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHByb3h5KTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHJlc291cmNlVVJJKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSBudWxsOwotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICB7Ci0gICAgICBuZXdOYW1lID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgfQotICAgIGlmIChuZXdOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmV3TmFtZSk7Ci0gICAgICBzZXRRTmFtZShxbmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBBUlQgOgotICAgICAgICB7Ci0gICAgICAgICAgUGFydCBwYXJ0ID0gKChXU0RMUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSkpLmdldFdTRExGYWN0b3J5KCkuY3JlYXRlUGFydCgpOwotICAgICAgICAgIHBhcnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICAgIHBhcnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgZ2V0RVBhcnRzKCkuYWRkKHBhcnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZV9RTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLk1FU1NBR0UpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEVQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFBhcnQpCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBvYmo7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKFBhcnRJbXBsKSBwYXJ0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotfSAvL01lc3NhZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VSZWZlcmVuY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTdiOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlUmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5NZXNzYWdlUmVmZXJlbmNlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZVJlZmVyZW5jZUltcGwjZ2V0RU1lc3NhZ2UgPGVtPkVNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVzc2FnZVJlZmVyZW5jZUltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBNZXNzYWdlUmVmZXJlbmNlCi17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVNZXNzYWdlKCkgPGVtPkVNZXNzYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFTWVzc2FnZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlIGVNZXNzYWdlID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlUmVmZXJlbmNlSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VSZWZlcmVuY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlIGdldEVNZXNzYWdlKCkKLSAgewotICAgIGlmIChlTWVzc2FnZSAhPSBudWxsICYmIGVNZXNzYWdlLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgTWVzc2FnZSBvbGRFTWVzc2FnZSA9IGVNZXNzYWdlOwotICAgICAgZU1lc3NhZ2UgPSAoTWVzc2FnZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZU1lc3NhZ2UpOwotICAgICAgaWYgKGVNZXNzYWdlICE9IG9sZEVNZXNzYWdlKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRSwgb2xkRU1lc3NhZ2UsIGVNZXNzYWdlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlTWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE1lc3NhZ2UgYmFzaWNHZXRFTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZU1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVNZXNzYWdlKE1lc3NhZ2UgbmV3RU1lc3NhZ2UpCi0gIHsKLSAgICBNZXNzYWdlIG9sZEVNZXNzYWdlID0gZU1lc3NhZ2U7Ci0gICAgZU1lc3NhZ2UgPSBuZXdFTWVzc2FnZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0UsIG9sZEVNZXNzYWdlLCBlTWVzc2FnZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RU1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RU1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOgotICAgICAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOgotICAgICAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOgotICAgICAgICByZXR1cm4gZU1lc3NhZ2UgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxpYXRpb24gbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldE5hbWUoV1NETENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsICJuYW1lIikpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZVJlZmVyZW5jZV9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlUmVmZXJlbmNlX0VNZXNzYWdlKCkpCi0gICAgICB7Ci0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxTmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOyAgICAgIAotICAgICAgUU5hbWUgbWVzc2FnZVFOYW1lID0gY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiKSk7Ci0gICAgICBNZXNzYWdlIG5ld01lc3NhZ2UgPSBtZXNzYWdlUU5hbWUgIT0gbnVsbCA/IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKSA6IG51bGw7Ci0gICAgICBpZiAobmV3TWVzc2FnZSAhPSBnZXRFTWVzc2FnZSgpKQotICAgICAgewotICAgICAgICBzZXRFTWVzc2FnZShuZXdNZXNzYWdlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotfSAvL01lc3NhZ2VSZWZlcmVuY2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL05hbWVzcGFjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGMyOGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5OYW1lc3BhY2VJbXBsI2dldFVSSSA8ZW0+VVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTmFtZXNwYWNlSW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVzcGFjZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE5hbWVzcGFjZQotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVSSSgpIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVSSSgpIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UHJlZml4KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UHJlZml4KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBQUkVGSVhfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgTmFtZXNwYWNlSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVzcGFjZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIG5ld1VSSSkKLSAgewotICAgIFN0cmluZyBvbGRVUkkgPSB1cmk7Ci0gICAgdXJpID0gbmV3VVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk5BTUVTUEFDRV9fVVJJLCBvbGRVUkksIHVyaSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIG5ld1ByZWZpeCkKLSAgewotICAgIFN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXg7Ci0gICAgcHJlZml4ID0gbmV3UHJlZml4OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk5BTUVTUEFDRV9fUFJFRklYLCBvbGRQcmVmaXgsIHByZWZpeCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1VSSToKLSAgICAgICAgcmV0dXJuIGdldFVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1BSRUZJWDoKLSAgICAgICAgcmV0dXJuIGdldFByZWZpeCgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19VUkk6Ci0gICAgICAgIHNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1BSRUZJWDoKLSAgICAgICAgc2V0UHJlZml4KChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1VSSToKLSAgICAgICAgc2V0VVJJKFVSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19QUkVGSVg6Ci0gICAgICAgIHNldFByZWZpeChQUkVGSVhfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19VUkk6Ci0gICAgICAgIHJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19QUkVGSVg6Ci0gICAgICAgIHJldHVybiBQUkVGSVhfRURFRkFVTFQgPT0gbnVsbCA/IHByZWZpeCAhPSBudWxsIDogIVBSRUZJWF9FREVGQVVMVC5lcXVhbHMocHJlZml4KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAoVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHVyaSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBwcmVmaXg6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLX0gLy9OYW1lc3BhY2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL09wZXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3BlcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzNiOGQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3BlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0RUlucHV0IDxlbT5FSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2dldEVGYXVsdHMgPGVtPkVGYXVsdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2dldEVQYXJhbWV0ZXJPcmRlcmluZyA8ZW0+RVBhcmFtZXRlciBPcmRlcmluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvbkltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBPcGVyYXRpb24KLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0U3R5bGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9wZXJhdGlvblR5cGUgU1RZTEVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0U3R5bGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uVHlwZSBzdHlsZSA9IFNUWUxFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVOREVGSU5FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdW5kZWZpbmVkID0gVU5ERUZJTkVEX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm94eSgpIDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNQcm94eSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9YWV9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJveHkgPSBQUk9YWV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVSSSgpIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVVSSSA9IFJFU09VUkNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUlucHV0KCkgPGVtPkVJbnB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUlucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIElucHV0IGVJbnB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVPdXRwdXQoKSA8ZW0+RU91dHB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBPdXRwdXQgZU91dHB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVGYXVsdHMoKSA8ZW0+RUZhdWx0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFRmF1bHRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVGYXVsdHMgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKSA8ZW0+RVBhcmFtZXRlciBPcmRlcmluZzwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZVBhcmFtZXRlck9yZGVyaW5nID0gbnVsbDsKLQotICBwcml2YXRlIE1hcCBmYXVsdHM7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE9wZXJhdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE9wZXJhdGlvblR5cGUgZ2V0U3R5bGUoKQotICB7Ci0gICAgaWYgKHN0eWxlID09IG51bGwpCi0gICAgICBzdHlsZSA9IGRlZHVjZU9wZXJhdGlvblR5cGUoZ2V0RWxlbWVudCgpKTsKLSAgICAKLSAgICAvLyBUaGUgdmFsdWUgb2Ygc3R5bGUgaXMgdXBkYXRlZCB3aGVuCi0gICAgLy8gMSkgdGhlIFdTREwgaXMgbG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZSwKLSAgICAvLyAyKSB0aGUgc2V0U3R5bGUoKSBtZXRob2QgaXMgY2FsbGVkLCBhbmQKLSAgICAvLyAzKSB0aGUgY2hpbGRyZW4gb2YgdGhlIE9wZXJhdGlvbiAoRE9NKSBlbGVtZW50IGFyZSBtYW5pcHVsYXRlZC4KLSAgICByZXR1cm4gc3R5bGU7Ci0gIH0KLQotICBwcml2YXRlIE9wZXJhdGlvblR5cGUgZGVkdWNlT3BlcmF0aW9uVHlwZShFbGVtZW50IG9wZXJhdGlvbikKLSAgewotICAgIGlmIChvcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgICAgIAotICAJaW50IHN0YXRlID0gMDsKLSAgCWludCBtZXNzYWdlUmVmVHlwZSA9IC0xOwotICAJTm9kZSBjaGlsZCA9IG51bGw7Ci0gIAlOb2RlTGlzdCBjaGlsZHJlbiA9IG9wZXJhdGlvbi5nZXRDaGlsZE5vZGVzKCk7Ci0gIAkKLSAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgY29udGludWU7Ci0gICAgICAKLSAgICAgIG1lc3NhZ2VSZWZUeXBlID0gV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZSgoRWxlbWVudCljaGlsZCk7Ci0gICAgICBzd2l0Y2ggKHN0YXRlKQotCSAgewotICAgICAgICBjYXNlIDA6IC8vIGluaXRpYWwgc3RhdGUgICAgIAotICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLklOUFVUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAxOyAKLSAgICAgICAgICBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLk9VVFBVVCA9PSBtZXNzYWdlUmVmVHlwZSkKLSAgICAgICAgICAgIHN0YXRlID0gMjsgCi0gICAgICAgICAgZWxzZSBpZiAoV1NETENvbnN0YW50cy5ET0NVTUVOVEFUSU9OID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgIAlzdGF0ZSA9IDA7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6IC8vIG9uZS13YXkgb3IgcmVxdWVzdC1yZXNwb25zZQotICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLkZBVUxUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAxMTsgLy8gb25lLXdheQotICAgICAgICAgIGVsc2UgaWYgKFdTRExDb25zdGFudHMuT1VUUFVUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAzOyAvLyByZXF1ZXN0LXJlc3BvbnNlCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOiAvLyBvbmUtd2F5Ci0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuRkFVTFQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDExOyAvLyBvbmUtd2F5Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6IC8vIHNvbGljaXQtcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uCi0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuSU5QVVQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDQ7IC8vIHNvbGljaXQtcmVzcG9uc2UKLSAgICAgICAgICBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLkZBVUxUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAyMTsgLy8gbm90aWZpY2F0aW9uCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAvLyBub3RpZmljYXRpb24KLSAgICAgICAgICBpZiAoV1NETENvbnN0YW50cy5GQVVMVCA9PSBtZXNzYWdlUmVmVHlwZSkKLSAgICAgICAgICAgIHN0YXRlID0gMjE7IC8vIG5vdGlmaWNhdGlvbgotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRlID0gLTE7IC8vIGNhbm5vdCBoYXBwZW4KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOiAvLyByZXF1ZXN0LXJlc3BvbnNlIAotICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLkZBVUxUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAzOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRlID0gLTE7IC8vIGNhbm5vdCBoYXBwZW4KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OiAvLyBzb2xpY2l0LXJlc3BvbnNlCi0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuRkFVTFQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDQ7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvLyBjYW5ub3QgaGFwcGVuICgtMSkKLSAgICAgICAgICBicmVhazsKLQkgIH0KLSAgICB9Ci0gICAgCi0gICAgT3BlcmF0aW9uVHlwZSBvcFR5cGUgPSBudWxsOwotICAgIHN3aXRjaCAoc3RhdGUpCi0JewotICAgICAgY2FzZSAxOgotICAgICAgY2FzZSAxMToKLSAgICAgIAlvcFR5cGUgPSBPcGVyYXRpb25UeXBlLk9ORV9XQVk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgY2FzZSAyMToKLSAgICAgIAlvcFR5cGUgPSBPcGVyYXRpb25UeXBlLk5PVElGSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAJb3BUeXBlID0gT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgIAlvcFR5cGUgPSBPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogLy8gaW52YWxpZAotICAgICAgICBicmVhazsKLQl9Ci0gICAgcmV0dXJuIG9wVHlwZTsgICAgCi0gIH0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdHlsZShPcGVyYXRpb25UeXBlIG5ld1N0eWxlKQotICB7Ci0gICAgT3BlcmF0aW9uVHlwZSBvbGRTdHlsZSA9IHN0eWxlOwotICAgIHN0eWxlID0gbmV3U3R5bGU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKLSAgICBuYW1lID0gbmV3TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRlZmluZWQoKQotICB7Ci0gICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gbmV3VW5kZWZpbmVkKQotICB7Ci0gICAgYm9vbGVhbiBvbGRVbmRlZmluZWQgPSB1bmRlZmluZWQ7Ci0gICAgdW5kZWZpbmVkID0gbmV3VW5kZWZpbmVkOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fVU5ERUZJTkVELCBvbGRVbmRlZmluZWQsIHVuZGVmaW5lZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3h5KCkKLSAgewotICAgIHJldHVybiBwcm94eTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJveHkoYm9vbGVhbiBuZXdQcm94eSkKLSAgewotICAgIGJvb2xlYW4gb2xkUHJveHkgPSBwcm94eTsKLSAgICBwcm94eSA9IG5ld1Byb3h5OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFksIG9sZFByb3h5LCBwcm94eSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVVJJKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIG5ld1Jlc291cmNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFJlc291cmNlVVJJID0gcmVzb3VyY2VVUkk7Ci0gICAgcmVzb3VyY2VVUkkgPSBuZXdSZXNvdXJjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSSwgb2xkUmVzb3VyY2VVUkksIHJlc291cmNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBJbnB1dCBnZXRFSW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGVJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RUlucHV0KElucHV0IG5ld0VJbnB1dCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIElucHV0IG9sZEVJbnB1dCA9IGVJbnB1dDsKLSAgICBlSW5wdXQgPSBuZXdFSW5wdXQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgIHsKLSAgICAgIEVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVCwgb2xkRUlucHV0LCBuZXdFSW5wdXQpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUlucHV0KElucHV0IG5ld0VJbnB1dCkKLSAgewotICAgIGlmIChuZXdFSW5wdXQgIT0gZUlucHV0KQotICAgIHsKLSAgICAgIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotICAgICAgaWYgKGVJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZUlucHV0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld0VJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RUlucHV0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQsIG51bGwsIG1zZ3MpOwotICAgICAgbXNncyA9IGJhc2ljU2V0RUlucHV0KG5ld0VJbnB1dCwgbXNncyk7Ci0gICAgICBpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQsIG5ld0VJbnB1dCwgbmV3RUlucHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPdXRwdXQgZ2V0RU91dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZU91dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RU91dHB1dChPdXRwdXQgbmV3RU91dHB1dCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIE91dHB1dCBvbGRFT3V0cHV0ID0gZU91dHB1dDsKLSAgICBlT3V0cHV0ID0gbmV3RU91dHB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgewotICAgICAgRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRU9VVFBVVCwgb2xkRU91dHB1dCwgbmV3RU91dHB1dCk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFT3V0cHV0KE91dHB1dCBuZXdFT3V0cHV0KQotICB7Ci0gICAgaWYgKG5ld0VPdXRwdXQgIT0gZU91dHB1dCkKLSAgICB7Ci0gICAgICBOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLSAgICAgIGlmIChlT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllT3V0cHV0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVULCBudWxsLCBtc2dzKTsKLSAgICAgIGlmIChuZXdFT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFT3V0cHV0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVULCBudWxsLCBtc2dzKTsKLSAgICAgIG1zZ3MgPSBiYXNpY1NldEVPdXRwdXQobmV3RU91dHB1dCwgbXNncyk7Ci0gICAgICBpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVULCBuZXdFT3V0cHV0LCBuZXdFT3V0cHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFRmF1bHRzKCkKLSAgewotICAgIGlmIChlRmF1bHRzID09IG51bGwpCi0gICAgewotICAgICAgZUZhdWx0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChGYXVsdC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FRkFVTFRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVGYXVsdHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKQotICB7Ci0gICAgaWYgKGVQYXJhbWV0ZXJPcmRlcmluZyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVQYXJhbWV0ZXJPcmRlcmluZyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoUGFydC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FUEFSQU1FVEVSX09SREVSSU5HKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVQYXJhbWV0ZXJPcmRlcmluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBmYXVsdCBtZXNzYWdlIHRoYXQgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgKiBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBmYXVsdCB0aGUgbmV3IGZhdWx0IG1lc3NhZ2UKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRGYXVsdChqYXZheC53c2RsLkZhdWx0IGZhdWx0KQotICB7Ci0gICAgZ2V0RUZhdWx0cygpLmFkZCgoRmF1bHQpZmF1bHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIGZhdWx0IG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGZhdWx0IG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZmF1bHQgbWVzc2FnZSwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIG1lc3NhZ2UKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5GYXVsdCBnZXRGYXVsdChTdHJpbmcgbmFtZSkKLSAgewotICAgIEZhdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBpZiAobmFtZS5lcXVhbHMoZmF1bHQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZmF1bHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIGZhdWx0IG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGlvbi4KLSAgICogQHJldHVybiBuYW1lcyBvZiBmYXVsdCBtZXNzYWdlcwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0RmF1bHRzKCkKLSAgewotICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBoYXNoTWFwLnB1dChmYXVsdC5nZXROYW1lKCksIGZhdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hNYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgUGFydCBuYW1lcy4gTm90ZSB0aGF0IAotICAgKiBnZXRQYXJhbWV0ZXJFT3JkZXJpbmcoKSByZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBQYXJ0cy4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRQYXJhbWV0ZXJPcmRlcmluZygpCi0gIHsKLSAgICBMaXN0IG9yZGVyaW5nID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVQYXJhbWV0ZXJPcmRlcmluZygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGkubmV4dCgpOwotICAgICAgICBvcmRlcmluZy5hZGQocGFydC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUQkQgLSBoYW5kbGUgZXhjZXB0aW9uCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvcmRlcmluZy5pc0VtcHR5KCkgPyBudWxsIDogb3JkZXJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJPcmRlcmluZyhMaXN0IHBhcmFtZXRlck9yZGVyKQotICB7Ci0gICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICBpZiAocGFyYW1ldGVyT3JkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJhbWV0ZXJPcmRlci5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgICAgIHBhcnQuc2V0TmFtZSgoU3RyaW5nKSBpLm5leHQoKSk7Ci0gICAgICAgIGdldEVQYXJhbWV0ZXJPcmRlcmluZygpLmFkZChwYXJ0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5JbnB1dCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUlucHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChqYXZheC53c2RsLklucHV0IGlucHV0KQotICB7Ci0gICAgc2V0RUlucHV0KChJbnB1dCkgaW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuT3V0cHV0IGdldE91dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RU91dHB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0KGphdmF4LndzZGwuT3V0cHV0IG91dHB1dCkKLSAgewotICAgIHNldEVPdXRwdXQoKE91dHB1dCkgb3V0cHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgICByZXR1cm4gYmFzaWNTZXRFSW5wdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICAgIHJldHVybiBiYXNpY1NldEVPdXRwdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FRkFVTFRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUZhdWx0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1NUWUxFOgotICAgICAgICByZXR1cm4gZ2V0U3R5bGUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIGlzVW5kZWZpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1BST1hZOgotICAgICAgICByZXR1cm4gaXNQcm94eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgcmV0dXJuIGdldEVJbnB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQ6Ci0gICAgICAgIHJldHVybiBnZXRFT3V0cHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGdldEVGYXVsdHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FUEFSQU1FVEVSX09SREVSSU5HOgotICAgICAgICByZXR1cm4gZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoKE9wZXJhdGlvblR5cGUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICBzZXRFT3V0cHV0KChPdXRwdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUZBVUxUUzoKLSAgICAgICAgZ2V0RUZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVGYXVsdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRVBBUkFNRVRFUl9PUkRFUklORzoKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fU1RZTEU6Ci0gICAgICAgIHNldFN0eWxlKFNUWUxFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KFBST1hZX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoUkVTT1VSQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQ6Ci0gICAgICAgIHNldEVPdXRwdXQoKE91dHB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VGQVVMVFM6Ci0gICAgICAgIGdldEVGYXVsdHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRVBBUkFNRVRFUl9PUkRFUklORzoKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fU1RZTEU6Ci0gICAgICAgIHJldHVybiBTVFlMRV9FREVGQVVMVCA9PSBudWxsID8gc3R5bGUgIT0gbnVsbCA6ICFTVFlMRV9FREVGQVVMVC5lcXVhbHMoc3R5bGUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gdW5kZWZpbmVkICE9IFVOREVGSU5FRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQ6Ci0gICAgICAgIHJldHVybiBlSW5wdXQgIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICByZXR1cm4gZU91dHB1dCAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VGQVVMVFM6Ci0gICAgICAgIHJldHVybiBlRmF1bHRzICE9IG51bGwgJiYgIWVGYXVsdHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VQQVJBTUVURVJfT1JERVJJTkc6Ci0gICAgICAgIHJldHVybiBlUGFyYW1ldGVyT3JkZXJpbmcgIT0gbnVsbCAmJiAhZVBhcmFtZXRlck9yZGVyaW5nLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAoc3R5bGU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoc3R5bGUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHVuZGVmaW5lZDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1bmRlZmluZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJveHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJveHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyAKLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc3R5bGUgPSBkZWR1Y2VPcGVyYXRpb25UeXBlKGNoYW5nZWRFbGVtZW50KTsKLSAgICBzdXBlci5lbGVtZW50Q2hhbmdlZChjaGFuZ2VkRWxlbWVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgICBzd2l0Y2ggKFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoY2hpbGQpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5JTlBVVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbnB1dCBpbnB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbnB1dCgpOwotICAgICAgICAgIGlucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgaW5wdXQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgc2V0SW5wdXQoaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuT1VUUFVUIDoKLSAgICAgICAgewotICAgICAgICAgIE91dHB1dCBvdXRwdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0gICAgICAgICAgb3V0cHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgb3V0cHV0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIHNldE91dHB1dChvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRkFVTFQgOgotICAgICAgICB7Ci0gICAgICAgICAgRmF1bHQgZmF1bHQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmF1bHQoKTsKLSAgICAgICAgICBmYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgIGZhdWx0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIGFkZEZhdWx0KGZhdWx0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIElucHV0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5zZXRFSW5wdXQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5zZXRFT3V0cHV0KG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBjb21wb25lbnQ7Ci0KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAob3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQob3BlcmF0aW9uLmdldEVJbnB1dCgpKTsKLSAgICB9Ci0KLSAgICBpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkpOwotICAgIH0KLQotICAgIGxpc3QuYWRkQWxsKG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE9wZXJhdGlvbl9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRPcGVyYXRpb25fU3R5bGUoKSkKLSAgICAgIHsKLSAgICAgICAgT3BlcmF0aW9uVHlwZSB0YXJnZXRUeXBlID0gZ2V0U3R5bGUoKTsKLSAgICAgICAgT3BlcmF0aW9uVHlwZSBjdXJyZW50VHlwZSA9IGRlZHVjZU9wZXJhdGlvblR5cGUodGhlRWxlbWVudCk7Ci0gICAgICAgIGlmICh0YXJnZXRUeXBlLmVxdWFscyhjdXJyZW50VHlwZSkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBlbHNlIGlmICgodGFyZ2V0VHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFKSB8fCB0YXJnZXRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKQotICAgICAgICAgICAgICAgICAgJiYgKGN1cnJlbnRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpIHx8IGN1cnJlbnRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKSkKLSAgICAgICAgCXJlb3JkZXJDaGlsZHJlbigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgc3R5bGUgPSBkZWR1Y2VPcGVyYXRpb25UeXBlKHRoZUVsZW1lbnQpOyAvLyBzd2l0Y2ggYmFjay4gbm8gc3VwcG9ydCBmb3IgdGhlIG90aGVyIHR5cGVzCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBTd2l0Y2ggPGlucHV0PiBhbmQgPG91dHB1dD4KLSAgcHJpdmF0ZSB2b2lkIHJlb3JkZXJDaGlsZHJlbigpCi0gIHsKLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGdldEVsZW1lbnQoKS5nZXRDaGlsZE5vZGVzKCk7IC8vIFRoZXJlIGFyZSBjaGlsZHJlbi4KLSAgICAKLSAgICAvLyBGaW5kIG91dCB0aGUgcG9zaXRpb25zIG9mIDxpbnB1dD4gYW5kIDxvdXRwdXQ+Ci0gICAgTm9kZSBjdXJyZW50ID0gbnVsbDsKLSAgICBOb2RlIGlucHV0ID0gbnVsbDsKLSAgICBOb2RlIG91dHB1dCA9IG51bGw7Ci0gICAgTm9kZSByZWZlcmVuY2UgPSBudWxsOwotICAgIGZvciAoaW50IGk9MDsgaTxub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGN1cnJlbnQgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgaWYgKGN1cnJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgIAlpZiAoV1NETENvbnN0YW50cy5JTlBVVCA9PSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKChFbGVtZW50KWN1cnJlbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXQgPSBjdXJyZW50OwotICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlZmVyZW5jZSA9IG5vZGVMaXN0Lml0ZW0oaSsxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLk9VVFBVVCA9PSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKChFbGVtZW50KWN1cnJlbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0cHV0ID0gY3VycmVudDsKLSAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlZmVyZW5jZSA9IG5vZGVMaXN0Lml0ZW0oaSsxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gLy8gZW5kIGZvcgotICAgIAotICAgIGlmIChpbnB1dCAhPSBudWxsICYmIG91dHB1dCAhPSBudWxsICYmIHJlZmVyZW5jZSAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcGFyZW50ID0gZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGdldFN0eWxlKCkuZXF1YWxzKE9wZXJhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRSkpCi0gICAgICB7Ci0gICAgICAJLy8gY3VycmVudCBvcmRlcjogPG91dHB1dD4gPGlucHV0PgotICAgICAgICBzd2l0Y2hDaGlsZHJlbihwYXJlbnQsb3V0cHV0LGlucHV0LHJlZmVyZW5jZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChnZXRTdHlsZSgpLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKQotICAgICAgewotICAgICAgICAvLyBjdXJyZW50IG9yZGVyOiA8aW5wdXQ+IDxvdXRwdXQ+Ci0gICAgICAgIHN3aXRjaENoaWxkcmVuKHBhcmVudCxpbnB1dCxvdXRwdXQscmVmZXJlbmNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzd2l0Y2hDaGlsZHJlbihOb2RlIHBhcmVudCwgTm9kZSBjaGlsZDEsIE5vZGUgY2hpbGQyLCBOb2RlIG5leHRPZkNoaWxkMikKLSAgewotICAgIC8vIGN1cnJlbnQgbm9kZSBzZXF1ZW5jZTogPGNoaWxkMT4gPGNoaWxkMj4gPG5leHRPZkNoaWxkMj4KLSAgICBuaWNlUmVtb3ZlQ2hpbGQocGFyZW50LGNoaWxkMik7Ci0gICAgbmljZUluc2VydEJlZm9yZShwYXJlbnQsY2hpbGQyLGNoaWxkMSk7Ci0gICAgbmljZVJlbW92ZUNoaWxkKHBhcmVudCxjaGlsZDEpOwotICAgIG5pY2VJbnNlcnRCZWZvcmUocGFyZW50LGNoaWxkMSxuZXh0T2ZDaGlsZDIpOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuT1BFUkFUSU9OKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSW5wdXQgaW5wdXQgPSBnZXRFSW5wdXQoKTsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChJbnB1dEltcGwpIGlucHV0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICBPdXRwdXQgb3V0cHV0ID0gZ2V0RU91dHB1dCgpOwotICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChPdXRwdXRJbXBsKSBvdXRwdXQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoRmF1bHRJbXBsKSBmYXVsdCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0gCi0gIAotfSAvL09wZXJhdGlvbkltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3V0cHV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9PdXRwdXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYzc2MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9PdXRwdXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXRJbXBsIGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBPdXRwdXQKLXsKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3V0cHV0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dHB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTUVTU0FHRToKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFTWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0VNRVNTQUdFOgotICAgICAgICBzZXRFTWVzc2FnZSgob3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRU1FU1NBR0U6Ci0gICAgICAgIHJldHVybiBlTWVzc2FnZSAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5PVVRQVVQpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLX0gLy9PdXRwdXRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BhcnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BhcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNTliMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9QYXJ0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBhcnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5QYXJ0SW1wbCNnZXRFbGVtZW50TmFtZSA8ZW0+RWxlbWVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUGFydEltcGwjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBhcnRJbXBsI2dldFR5cGVEZWZpbml0aW9uIDxlbT5UeXBlIERlZmluaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5QYXJ0SW1wbCNnZXRFbGVtZW50RGVjbGFyYXRpb24gPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5QYXJ0SW1wbCNnZXRFTWVzc2FnZSA8ZW0+RU1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJ0SW1wbCBleHRlbmRzIFdTRExFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFBhcnQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnROYW1lKCkgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RWxlbWVudE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFFOYW1lIEVMRU1FTlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnROYW1lKCkgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RWxlbWVudE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgZWxlbWVudE5hbWUgPSBFTEVNRU5UX05BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlTmFtZSgpIDxlbT5UeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFR5cGVOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBRTmFtZSBUWVBFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlTmFtZSgpIDxlbT5UeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFR5cGVOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFFOYW1lIHR5cGVOYW1lID0gVFlQRV9OQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlRGVmaW5pdGlvbigpIDxlbT5UeXBlIERlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFR5cGVEZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkgPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU1lc3NhZ2UoKSA8ZW0+RU1lc3NhZ2U8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2UgZU1lc3NhZ2UgPSBudWxsOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9QQVJUX0VYVEVOU0lPTlMgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9wYXJ0LWV4dGVuc2lvbnMvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRVNTQUdFID0gIm1lc3NhZ2UiOwotICBwcml2YXRlIE1hcCBleHRlbnNpb25BdHRyaWJ1dGVzID0gbmV3IEV4dGVuc2lvbkF0dHJpYnV0ZU1hcCgpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFBhcnRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0gICAgbmFtZSA9IG5ld05hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUEFSVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShRTmFtZSBuZXdFbGVtZW50TmFtZSkKLSAgewotICAgIFFOYW1lIG9sZEVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gICAgZWxlbWVudE5hbWUgPSBuZXdFbGVtZW50TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX05BTUUsIG9sZEVsZW1lbnROYW1lLCBlbGVtZW50TmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShRTmFtZSBuZXdUeXBlTmFtZSkKLSAgewotICAgIFFOYW1lIG9sZFR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gICAgdHlwZU5hbWUgPSBuZXdUeXBlTmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QQVJUX19UWVBFX05BTUUsIG9sZFR5cGVOYW1lLCB0eXBlTmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oKQotICB7Ci0gICAgaWYgKHR5cGVEZWZpbml0aW9uICE9IG51bGwgJiYgdHlwZURlZmluaXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiBvbGRUeXBlRGVmaW5pdGlvbiA9IHR5cGVEZWZpbml0aW9uOwotICAgICAgdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXR5cGVEZWZpbml0aW9uKTsKLSAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBvbGRUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5QQVJUX19UWVBFX0RFRklOSVRJT04sIG9sZFR5cGVEZWZpbml0aW9uLCB0eXBlRGVmaW5pdGlvbikpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHlwZURlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBYU0RUeXBlRGVmaW5pdGlvbiBiYXNpY0dldFR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiB0eXBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gbmV3VHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBvbGRUeXBlRGVmaW5pdGlvbiA9IHR5cGVEZWZpbml0aW9uOwotICAgIHR5cGVEZWZpbml0aW9uID0gbmV3VHlwZURlZmluaXRpb247Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9ERUZJTklUSU9OLCBvbGRUeXBlRGVmaW5pdGlvbiwgdHlwZURlZmluaXRpb24pKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICB7Ci0gICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsICYmIGVsZW1lbnREZWNsYXJhdGlvbi5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBvbGRFbGVtZW50RGVjbGFyYXRpb24gPSBlbGVtZW50RGVjbGFyYXRpb247Ci0gICAgICBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbiAhPSBvbGRFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9ERUNMQVJBVElPTiwgb2xkRWxlbWVudERlY2xhcmF0aW9uLCBlbGVtZW50RGVjbGFyYXRpb24pKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVsZW1lbnREZWNsYXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiBiYXNpY0dldEVsZW1lbnREZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudERlY2xhcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG5ld0VsZW1lbnREZWNsYXJhdGlvbikKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBvbGRFbGVtZW50RGVjbGFyYXRpb24gPSBlbGVtZW50RGVjbGFyYXRpb247Ci0gICAgZWxlbWVudERlY2xhcmF0aW9uID0gbmV3RWxlbWVudERlY2xhcmF0aW9uOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT04sIG9sZEVsZW1lbnREZWNsYXJhdGlvbiwgZWxlbWVudERlY2xhcmF0aW9uKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlIGdldEVNZXNzYWdlKCkKLSAgewotICAgIGlmIChlTWVzc2FnZSAhPSBudWxsICYmIGVNZXNzYWdlLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgTWVzc2FnZSBvbGRFTWVzc2FnZSA9IGVNZXNzYWdlOwotICAgICAgZU1lc3NhZ2UgPSAoTWVzc2FnZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZU1lc3NhZ2UpOwotICAgICAgaWYgKGVNZXNzYWdlICE9IG9sZEVNZXNzYWdlKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLlBBUlRfX0VNRVNTQUdFLCBvbGRFTWVzc2FnZSwgZU1lc3NhZ2UpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVNZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZSBiYXNpY0dldEVNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBlTWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RU1lc3NhZ2UoTWVzc2FnZSBuZXdFTWVzc2FnZSkKLSAgewotICAgIE1lc3NhZ2Ugb2xkRU1lc3NhZ2UgPSBlTWVzc2FnZTsKLSAgICBlTWVzc2FnZSA9IG5ld0VNZXNzYWdlOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBBUlRfX0VNRVNTQUdFLCBvbGRFTWVzc2FnZSwgZU1lc3NhZ2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkF0dHJpYnV0ZShRTmFtZSBuYW1lLCBRTmFtZSB2YWx1ZSkKLSAgewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBuYW1lLmdldExvY2FsUGFydCgpOwotICAgIFN0cmluZyBuc1VSSSA9IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgaWYgKGxvY2FsTmFtZSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICBleHRlbnNpb25BdHRyaWJ1dGVzLnJlbW92ZShuYW1lKTsKLSAgICBlbHNlCi0gICAgICBleHRlbnNpb25BdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMoKQotICB7Ci0gICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKGV4dGVuc2lvbkF0dHJpYnV0ZXMpOwotCi0gICAgLy8gQWRqdXN0IG1lc3NhZ2VOYW1lIGF0dHJpYnV0ZQotICAgIFFOYW1lIG1lc3NhZ2VOYW1lID0gZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBnZXRNZXNzYWdlKCkuZ2V0UU5hbWUoKSA6IG51bGw7Ci0gICAgaWYgKG1lc3NhZ2VOYW1lICE9IG51bGwpCi0gICAgICBtYXAucHV0KG5ldyBRTmFtZShOU19VUklfUEFSVF9FWFRFTlNJT05TLCBBVFRSX01FU1NBR0UpLCBtZXNzYWdlTmFtZSk7Ci0gICAgZWxzZQotICAgICAgbWFwLnJlbW92ZShuZXcgUU5hbWUoTlNfVVJJX1BBUlRfRVhURU5TSU9OUywgQVRUUl9NRVNTQUdFKSk7Ci0KLSAgICByZXR1cm4gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKFFOYW1lIG5hbWUpCi0gIHsKLSAgICBpZiAobmFtZS5lcXVhbHMobmV3IFFOYW1lKE5TX1VSSV9QQVJUX0VYVEVOU0lPTlMsIEFUVFJfTUVTU0FHRSkpKQotICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKSAhPSBudWxsID8gZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCkgOiBudWxsOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAoUU5hbWUpIGV4dGVuc2lvbkF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk1lc3NhZ2UgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RU1lc3NhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9OQU1FOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9OQU1FOgotICAgICAgICByZXR1cm4gZ2V0VHlwZU5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9ERUZJTklUSU9OOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT046Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTUVTU0FHRToKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFTWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX05BTUU6Ci0gICAgICAgIHNldEVsZW1lbnROYW1lKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9OQU1FOgotICAgICAgICBzZXRUeXBlTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfREVGSU5JVElPTjoKLSAgICAgICAgc2V0VHlwZURlZmluaXRpb24oKFhTRFR5cGVEZWZpbml0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX0RFQ0xBUkFUSU9OOgotICAgICAgICBzZXRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRU1FU1NBR0U6Ci0gICAgICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX05BTUU6Ci0gICAgICAgIHNldEVsZW1lbnROYW1lKEVMRU1FTlRfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9OQU1FOgotICAgICAgICBzZXRUeXBlTmFtZShUWVBFX05BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfREVGSU5JVElPTjoKLSAgICAgICAgc2V0VHlwZURlZmluaXRpb24oKFhTRFR5cGVEZWZpbml0aW9uKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT046Ci0gICAgICAgIHNldEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VNRVNTQUdFOgotICAgICAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9OQU1FOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50TmFtZSAhPSBudWxsIDogIUVMRU1FTlRfTkFNRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudE5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19UWVBFX05BTUU6Ci0gICAgICAgIHJldHVybiBUWVBFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGVOYW1lICE9IG51bGwgOiAhVFlQRV9OQU1FX0VERUZBVUxULmVxdWFscyh0eXBlTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfREVGSU5JVElPTjoKLSAgICAgICAgcmV0dXJuIHR5cGVEZWZpbml0aW9uICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT046Ci0gICAgICAgIHJldHVybiBlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRU1FU1NBR0U6Ci0gICAgICAgIHJldHVybiBlTWVzc2FnZSAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZWxlbWVudE5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZWxlbWVudE5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgdHlwZU5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodHlwZU5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgTWFwIGdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKQotICB7Ci0gICAgcmV0dXJuIGV4dGVuc2lvbkF0dHJpYnV0ZXM7Ci0gIH0KLQotICBjbGFzcyBFeHRlbnNpb25BdHRyaWJ1dGVNYXAgZXh0ZW5kcyBIYXNoTWFwCi0gIHsKLSAgICBFeHRlbnNpb25BdHRyaWJ1dGVNYXAoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbCkKLSAgICB7Ci0gICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKSBrZXk7Ci0gICAgICBRTmFtZSB2YWx1ZSA9IChRTmFtZSkgdmFsOwotICAgICAgU3RyaW5nIGxOYW1lID0gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgIFN0cmluZyBuU3BhY2UgPSBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICBpZiAoTlNfVVJJX1BBUlRfRVhURU5TSU9OUy5lcXVhbHMoblNwYWNlKSAmJiBBVFRSX01FU1NBR0UuZXF1YWxzKGxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgamF2YXgud3NkbC5NZXNzYWdlIG1lc3NhZ2VQcm94eSA9IG5ldyBNZXNzYWdlSW1wbCgpOwotICAgICAgICBtZXNzYWdlUHJveHkuc2V0UU5hbWUodmFsdWUpOwotICAgICAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSkgbWVzc2FnZVByb3h5KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gICAgU3RyaW5nIG5hbWUgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhudWxsLCAibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZWxlbWVudEF0dHIgPSBXU0RMQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgV1NETENvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURSk7Ci0gICAgc2V0RWxlbWVudE5hbWUoZWxlbWVudEF0dHIgIT0gbnVsbCA/IGNyZWF0ZVFOYW1lKGRlZmluaXRpb24sIGVsZW1lbnRBdHRyKSA6IG51bGwpOwotCQkgICAgCi0gICAgU3RyaW5nIHR5cGVBdHRyID0gV1NETENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgIHNldFR5cGVOYW1lKHR5cGVBdHRyICE9IG51bGwgPyBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCB0eXBlQXR0cikgOiBudWxsKTsKLQotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIC8vc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFydF9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLQotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJ0X1R5cGVOYW1lKCkpCi0gICAgICAgIGlmIChnZXRUeXBlTmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldFR5cGVOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBnZXRUeXBlTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgCi0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnRfRWxlbWVudE5hbWUoKSkKLSAgICAgICAgaWYgKGdldEVsZW1lbnROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURSwgZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSArICIjIiArIGdldEVsZW1lbnROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJ0X1R5cGVEZWZpbml0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKHR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgdHlwZURlZmluaXRpb24uZ2V0VVJJKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZVJlZmVyZW5jZSA9PSBudWxsIHx8IGVSZWZlcmVuY2UgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgICBpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGVVUklWYWx1ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLkVMRU1FTlRfQVRUUklCVVRFLCBlbGVtZW50RGVjbC5nZXRVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5QQVJUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gbmV3RWxlbWVudERlY2xhcmF0aW9uID0gcmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50TmFtZSk7Ci0gICAgaWYgKG5ld0VsZW1lbnREZWNsYXJhdGlvbiAhPSBlbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgc2V0RWxlbWVudERlY2xhcmF0aW9uKG5ld0VsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgfQotCi0gICAgWFNEVHlwZURlZmluaXRpb24gbmV3VHlwZURlZmluaXRpb24gPSByZXNvbHZlVHlwZURlZmluaXRpb24odHlwZU5hbWUpOwotICAgIGlmIChuZXdUeXBlRGVmaW5pdGlvbiAhPSB0eXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBzZXRUeXBlRGVmaW5pdGlvbihuZXdUeXBlRGVmaW5pdGlvbik7Ci0gICAgfQotCi0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotCi0gIHByaXZhdGUgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24oUU5hbWUgcW5hbWUpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uSW1wbCBkZWZpbml0aW9uID0gKERlZmluaXRpb25JbXBsKSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBkZWZpbml0aW9uLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24ocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgWFNEVHlwZURlZmluaXRpb24gcmVzb2x2ZVR5cGVEZWZpbml0aW9uKFFOYW1lIHFuYW1lKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uSW1wbCBkZWZpbml0aW9uID0gKERlZmluaXRpb25JbXBsKSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBkZWZpbml0aW9uLnJlc29sdmVUeXBlRGVmaW5pdGlvbihxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IC8vUGFydEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzMDk0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUG9ydEltcGwjZ2V0RUJpbmRpbmcgPGVtPkVCaW5kaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydEltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBQb3J0Ci17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5nKCkgPGVtPkVCaW5kaW5nPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nIGVCaW5kaW5nID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBQb3J0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBPUlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmcgZ2V0RUJpbmRpbmcoKQotICB7Ci0gICAgaWYgKGVCaW5kaW5nICE9IG51bGwgJiYgZUJpbmRpbmcuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBCaW5kaW5nIG9sZEVCaW5kaW5nID0gZUJpbmRpbmc7Ci0gICAgICBlQmluZGluZyA9IChCaW5kaW5nKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllQmluZGluZyk7Ci0gICAgICBpZiAoZUJpbmRpbmcgIT0gb2xkRUJpbmRpbmcpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkcsIG9sZEVCaW5kaW5nLCBlQmluZGluZykpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJpbmRpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nIGJhc2ljR2V0RUJpbmRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGVCaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFQmluZGluZyhCaW5kaW5nIG5ld0VCaW5kaW5nKQotICB7Ci0gICAgQmluZGluZyBvbGRFQmluZGluZyA9IGVCaW5kaW5nOwotICAgIGVCaW5kaW5nID0gbmV3RUJpbmRpbmc7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkcsIG9sZEVCaW5kaW5nLCBlQmluZGluZykpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZyBnZXRCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRFQmluZGluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QmluZGluZyhqYXZheC53c2RsLkJpbmRpbmcgYmluZGluZykKLSAgewotICAgIHNldEVCaW5kaW5nKChCaW5kaW5nKSBiaW5kaW5nKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkc6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RUJpbmRpbmcoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RUJpbmRpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FQklORElORzoKLSAgICAgICAgc2V0RUJpbmRpbmcoKEJpbmRpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FQklORElORzoKLSAgICAgICAgc2V0RUJpbmRpbmcoKEJpbmRpbmcpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkc6Ci0gICAgICAgIHJldHVybiBlQmluZGluZyAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBzZXROYW1lKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQscmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkucmVtb3ZlKGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIFBvcnQgcG9ydCA9IChQb3J0KSBjb21wb25lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKHBvcnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0X0VCaW5kaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGdldEVCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxTmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5CSU5ESU5HX0FUVFJJQlVURSwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5QT1JUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZVJlZmVyZW5jZXMoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBRTmFtZSBiaW5kaW5nUU5hbWUgPSBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgiYmluZGluZyIpKTsKLSAgICAgIEJpbmRpbmcgbmV3QmluZGluZyA9IChiaW5kaW5nUU5hbWUgIT0gbnVsbCkgPyAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKGJpbmRpbmdRTmFtZSkgOiBudWxsOwotICAgICAgaWYgKG5ld0JpbmRpbmcgIT0gZ2V0RUJpbmRpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0RUJpbmRpbmcobmV3QmluZGluZyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLQotfSAvL1BvcnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Qb3J0VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM2Y2E5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0VHlwZUltcGwjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUG9ydFR5cGVJbXBsI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0VHlwZUltcGwjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0VHlwZUltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBvcnRUeXBlSW1wbCNnZXRFT3BlcmF0aW9ucyA8ZW0+RU9wZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0VHlwZUltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBQb3J0VHlwZQotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5ERUZJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlZmluZWQgPSBVTkRFRklORURfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST1hZX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm94eSA9IFBST1hZX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVVJJID0gUkVTT1VSQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFT3BlcmF0aW9ucygpIDxlbT5FT3BlcmF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFT3BlcmF0aW9ucygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlT3BlcmF0aW9ucyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgUG9ydFR5cGVJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydFR5cGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkKLSAgewotICAgIHJldHVybiBxTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UU5hbWUoUU5hbWUgbmV3UU5hbWUpCi0gIHsKLSAgICBRTmFtZSBvbGRRTmFtZSA9IHFOYW1lOwotICAgIHFOYW1lID0gbmV3UU5hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19RTkFNRSwgb2xkUU5hbWUsIHFOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCkKLSAgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIG5ld1VuZGVmaW5lZCkKLSAgewotICAgIGJvb2xlYW4gb2xkVW5kZWZpbmVkID0gdW5kZWZpbmVkOwotICAgIHVuZGVmaW5lZCA9IG5ld1VuZGVmaW5lZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1VOREVGSU5FRCwgb2xkVW5kZWZpbmVkLCB1bmRlZmluZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gcHJveHk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5KGJvb2xlYW4gbmV3UHJveHkpCi0gIHsKLSAgICBib29sZWFuIG9sZFByb3h5ID0gcHJveHk7Ci0gICAgcHJveHkgPSBuZXdQcm94eTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1BST1hZLCBvbGRQcm94eSwgcHJveHkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlVVJJKFN0cmluZyBuZXdSZXNvdXJjZVVSSSkKLSAgewotICAgIFN0cmluZyBvbGRSZXNvdXJjZVVSSSA9IHJlc291cmNlVVJJOwotICAgIHJlc291cmNlVVJJID0gbmV3UmVzb3VyY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkksIG9sZFJlc291cmNlVVJJLCByZXNvdXJjZVVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnMoKQotICB7Ci0gICAgaWYgKGVPcGVyYXRpb25zID09IG51bGwpCi0gICAgewotICAgICAgZU9wZXJhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoT3BlcmF0aW9uLmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VPUEVSQVRJT05TKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVPcGVyYXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhbiBvcGVyYXRpb24gdG8gdGhpcyBwb3J0IHR5cGUuCi0gICAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIG9wZXJhdGlvbiB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbihqYXZheC53c2RsLk9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBpZiAoIW9wZXJhdGlvbi5pc1VuZGVmaW5lZCgpKQotICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5hZGQob3BlcmF0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uIE5vdGUgdGhhdCBvcGVyYXRpb24gbmFtZXMgY2FuCi0gICAqIGJlIG92ZXJsb2FkZWQgd2l0aGluIGEgUG9ydFR5cGUuIEluIGNhc2Ugb2Ygb3ZlcmxvYWRpbmcsIHRoZQotICAgKiBuYW1lcyBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlcyBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyCi0gICAqIHJlZmluZSB0aGUgc2VhcmNoLgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBpbnB1dE5hbWUgdGhlIG5hbWUgb2YgdGhlIGlucHV0IG1lc3NhZ2U7IGlmIHRoaXMgaXMgbnVsbAotICAgKiAgICAgICAgaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcGFyYW0gb3V0cHV0TmFtZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IG1lc3NhZ2U7IGlmIHRoaXMgaXMgbnVsbAotICAgKiAgICAgICAgaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogICAgICAgICBhbnkgbWF0Y2hpbmcgb3BlcmF0aW9uCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuT3BlcmF0aW9uIGdldE9wZXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGlucHV0TmFtZSwgU3RyaW5nIG91dHB1dE5hbWUpCi0gIHsKLSAgICBJdGVyYXRvciBvcEl0ZXJhdG9yID0gZ2V0T3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKG9wSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGphdmF4LndzZGwuT3BlcmF0aW9uIG9wID0gKGphdmF4LndzZGwuT3BlcmF0aW9uKSBvcEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChvcCA9PSBudWxsKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgU3RyaW5nIG9wTmFtZSA9IG9wLmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3BOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICghbmFtZS5lcXVhbHMob3BOYW1lKSkKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuYW1lICE9IG51bGwgfHwgb3BOYW1lICE9IG51bGwpCi0gICAgICAgIG9wID0gbnVsbDsKLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgaW5wdXROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGphdmF4LndzZGwuSW5wdXQgaW5wdXQgPSBvcC5nZXRJbnB1dCgpOwotICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvcElucHV0TmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICAgICAgICBpZiAob3BJbnB1dE5hbWUgPT0gbnVsbCB8fCAhb3BJbnB1dE5hbWUuZXF1YWxzKGlucHV0TmFtZSkpCi0gICAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgb3V0cHV0TmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBqYXZheC53c2RsLk91dHB1dCBvdXRwdXQgPSBvcC5nZXRPdXRwdXQoKTsKLSAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG9wT3V0cHV0TmFtZSA9IG91dHB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKG9wT3V0cHV0TmFtZSA9PSBudWxsIHx8ICFvcE91dHB1dE5hbWUuZXF1YWxzKG91dHB1dE5hbWUpKQotICAgICAgICAgICAgb3AgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvcCAhPSBudWxsKQotICAgICAgICByZXR1cm4gb3A7Ci0gICAgfSAvLyBlbmQgd2hpbGUKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYWxsIHRoZSBvcGVyYXRpb25zIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRPcGVyYXRpb25zKCkKLSAgewotICAgIGlmICghaXNVbmRlZmluZWQoKSkKLSAgICAgIHJldHVybiBnZXRFT3BlcmF0aW9ucygpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIGlzVW5kZWZpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1BST1hZOgotICAgICAgICByZXR1cm4gaXNQcm94eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VPUEVSQVRJT05TOgotICAgICAgICByZXR1cm4gZ2V0RU9wZXJhdGlvbnMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19QUk9YWToKLSAgICAgICAgc2V0UHJveHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRU9QRVJBVElPTlM6Ci0gICAgICAgIGdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19RTkFNRToKLSAgICAgICAgc2V0UU5hbWUoUU5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoVU5ERUZJTkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKFJFU09VUkNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUzoKLSAgICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gdW5kZWZpbmVkICE9IFVOREVGSU5FRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUzoKLSAgICAgICAgcmV0dXJuIGVPcGVyYXRpb25zICE9IG51bGwgJiYgIWVPcGVyYXRpb25zLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAocU5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocU5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgdW5kZWZpbmVkOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHVuZGVmaW5lZCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBwcm94eTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChwcm94eSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCByZXNvdXJjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChyZXNvdXJjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICBzZXRRTmFtZShxbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuT1BFUkFUSU9OIDoKLSAgICAgICAgewotICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgb3BlcmF0aW9uLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICBvcGVyYXRpb24uc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5hZGQob3BlcmF0aW9uKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBnZXRMaXN0KGNvbXBvbmVudCwgbW9kZWxPYmplY3QpOwotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5yZW1vdmUobW9kZWxPYmplY3QpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTGlzdCBnZXRMaXN0KE9iamVjdCBjb21wb25lbnQsIE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbnVsbDsKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE9wZXJhdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgY29tcG9uZW50OwotCi0gICAgTGlzdCBsaXN0ID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydFR5cGVfUU5hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5QT1JUX1RZUEUpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChPcGVyYXRpb25JbXBsKSBvcGVyYXRpb24pLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vUG9ydFR5cGVJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YmU4ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlNlcnZpY2VJbXBsI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlNlcnZpY2VJbXBsI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5TZXJ2aWNlSW1wbCNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlNlcnZpY2VJbXBsI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5TZXJ2aWNlSW1wbCNnZXRFUG9ydHMgPGVtPkVQb3J0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VJbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU2VydmljZQotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5ERUZJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlZmluZWQgPSBVTkRFRklORURfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST1hZX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm94eSA9IFBST1hZX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVVJJID0gUkVTT1VSQ0VfVVJJX0VERUZBVUxUOwotCi0gIHByaXZhdGUgTWFwIHBvcnRzOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUG9ydHMoKSA8ZW0+RVBvcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVQb3J0cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlUG9ydHMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHFOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRRTmFtZShRTmFtZSBuZXdRTmFtZSkKLSAgewotICAgIFFOYW1lIG9sZFFOYW1lID0gcU5hbWU7Ci0gICAgcU5hbWUgPSBuZXdRTmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5TRVJWSUNFX19RTkFNRSwgb2xkUU5hbWUsIHFOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCkKLSAgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIG5ld1VuZGVmaW5lZCkKLSAgewotICAgIGJvb2xlYW4gb2xkVW5kZWZpbmVkID0gdW5kZWZpbmVkOwotICAgIHVuZGVmaW5lZCA9IG5ld1VuZGVmaW5lZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5TRVJWSUNFX19VTkRFRklORUQsIG9sZFVuZGVmaW5lZCwgdW5kZWZpbmVkKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIHByb3h5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eShib29sZWFuIG5ld1Byb3h5KQotICB7Ci0gICAgYm9vbGVhbiBvbGRQcm94eSA9IHByb3h5OwotICAgIHByb3h5ID0gbmV3UHJveHk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuU0VSVklDRV9fUFJPWFksIG9sZFByb3h5LCBwcm94eSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVVJJKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIG5ld1Jlc291cmNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFJlc291cmNlVVJJID0gcmVzb3VyY2VVUkk7Ci0gICAgcmVzb3VyY2VVUkkgPSBuZXdSZXNvdXJjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5TRVJWSUNFX19SRVNPVVJDRV9VUkksIG9sZFJlc291cmNlVVJJLCByZXNvdXJjZVVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RVBvcnRzKCkKLSAgewotICAgIGlmIChlUG9ydHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlUG9ydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUG9ydC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVQb3J0czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBwb3J0IHRvIHRoaXMgc2VydmljZS4KLSAgICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQb3J0KGphdmF4LndzZGwuUG9ydCBwb3J0KQotICB7Ci0gICAgZ2V0RVBvcnRzKCkuYWRkKChQb3J0KXBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIHBvcnRzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldFBvcnRzKCkKLSAgewotICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBpLm5leHQoKTsKLSAgICAgIGhhc2hNYXAucHV0KHBvcnQuZ2V0TmFtZSgpLCBwb3J0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hNYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBzcGVjaWZpZWQgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcG9ydC4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBwb3J0LCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgcG9ydAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlBvcnQgZ2V0UG9ydChTdHJpbmcgbmFtZSkKLSAgewotICAgIFBvcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFUG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGkubmV4dCgpOwotICAgICAgaWYgKG5hbWUuZXF1YWxzKHBvcnQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcG9ydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FUE9SVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFUG9ydHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUFJPWFk6Ci0gICAgICAgIHJldHVybiBpc1Byb3h5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FUE9SVFM6Ci0gICAgICAgIHJldHVybiBnZXRFUG9ydHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTOgotICAgICAgICBnZXRFUG9ydHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFUG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKFFOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSShSRVNPVVJDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VQT1JUUzoKLSAgICAgICAgZ2V0RVBvcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCAhPSBVTkRFRklORURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1BST1hZOgotICAgICAgICByZXR1cm4gcHJveHkgIT0gUFJPWFlfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTOgotICAgICAgICByZXR1cm4gZVBvcnRzICE9IG51bGwgJiYgIWVQb3J0cy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHFOYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHVuZGVmaW5lZDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1bmRlZmluZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJveHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJveHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQotICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICBzZXRRTmFtZShxbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuUE9SVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgKChXU0RMUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSkpLmdldFdTRExGYWN0b3J5KCkuY3JlYXRlUG9ydCgpOwotICAgICAgICAgIHBvcnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICAgIGdldEVQb3J0cygpLmFkZChwb3J0KTsKLSAgICAgICAgICBwb3J0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUoaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZW1vdmUoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gZ2V0TGlzdChtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0IGdldExpc3QoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFBvcnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0RVBvcnRzKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VfUU5hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5TRVJWSUNFKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFUG9ydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKFBvcnRJbXBsKSBwb3J0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICBpdGVyYXRvciA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotfSAvL1NlcnZpY2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1R5cGVzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9UeXBlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkOGIzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1R5cGVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLy9pbXBvcnQgY29tLmlibS53c2RsLmZhY3RvcnkuV1NETEZhY3RvcnlJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlc0ltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBUeXBlcwotewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBUeXBlc0ltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0gIHsKLSAgICBMaXN0IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHhzZGVlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgIGlmICh4c2RlZS5nZXRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBhcnJheUxpc3QuYWRkKHhzZGVlLmdldFNjaGVtYSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5TGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFNjaGVtYXMoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIExpc3Qgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTY2hlbWFzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKSBpLm5leHQoKTsKLSAgICAgIGlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgIHNjaGVtYXMuYWRkKHNjaGVtYSk7Ci0gICAgfQotICAgIHJldHVybiBzY2hlbWFzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIHN1cGVyLmVOb3RpZnkobXNnKTsKLSAgICAKLSAgICAvLyBjcy4uIGlmIHdlJ3ZlIGFkZGVkIGFuIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBhbmQgdGhlIFR5cGVzIG9iamVjdCBpcyBhbHJlYWR5IGF0dGFjaGVkIAotICAgIC8vIHRvIGEgcmVzb3VyY2Ugd2UgbmVlZCB0byBzZXQgdGhlIHNjaGVtYUxvY2F0aW9uIGZvciB0aGUgaW5saW5lIHNjaGVtYS4KLSAgICAvLyBJZiBub3QgeWV0IGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHRoZSBzY2hlbWFMb2NhdGlvbidzIHdpbGwgYmUgc2V0IHZpYSBXU0RMUmVzb3VyY2VJbXBsLmF0dGFjaGVkKEVPYmplY3QgbykKLSAgICAvLyAgICAgCi0gICAgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAmJgotICAgICAgICBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCkKLSAgICB7Ci0gICAgICBpZiAobXNnLmdldE5ld1ZhbHVlKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBlZSA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpbXNnLmdldE5ld1ZhbHVlKCk7Ci0gICAgICAgIGlmIChlZS5nZXRTY2hlbWEoKSAhPSBudWxsICYmIGVlLmdldFNjaGVtYSgpLmVSZXNvdXJjZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgZWUuZ2V0U2NoZW1hKCkuc2V0U2NoZW1hTG9jYXRpb24oZWUuZ2V0U2NoZW1hKCkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfSAgCi0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGlmICgic2NoZW1hIi5lcXVhbHMoY2hpbGQuZ2V0TG9jYWxOYW1lKCkpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCB4c2RlZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgICB4c2RlZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHhzZGVlLnNldEVsZW1lbnQoY2hpbGQpOyAvLyBjcyA6IHRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjcmVhdGluZyB0aGUgaW5saW5lIHNjaGVtYSAgICAgICAgICAgICAgIAotICAgICAgICBhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCh4c2RlZSk7ICAgICAgIAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgICAoKERlZmluaXRpb25JbXBsKWdldEVuY2xvc2luZ0RlZmluaXRpb24oKSkucmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcykgY29tcG9uZW50OwotICAgIExpc3QgbGlzdCA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBsaXN0LnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIFR5cGVzIHR5cGVzID0gKFR5cGVzKSBjb21wb25lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5UWVBFUyk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIC8vIEFkZCBjaGlsZHJlbgotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0KLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLQotICAgIEl0ZXJhdG9yIGl0ZXIgPSBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICBFbGVtZW50IGVsID0gbnVsbDsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICBlbCA9IGV4dGVuc2liaWxpdHkuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGVsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCByZVBhcmVudGVkID0gKEVsZW1lbnQpIGRvY3VtZW50LmltcG9ydE5vZGUoZWwsIHRydWUpOwotICAgICAgICAgIGV4dGVuc2liaWxpdHkuc2V0RWxlbWVudChyZVBhcmVudGVkKTsgLy8gcmVwbGFjZSB3aXRoIHRoZSBuZXcgb25lCi0gICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChyZVBhcmVudGVkKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRE9NRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAJRWxlbWVudCBjaGlsZCA9ICgoRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKWV4dGVuc2liaWxpdHkpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIAluZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotfSAvL1R5cGVzSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkZGQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwjZ2V0Q2hpbGRyZW4gPGVtPkNoaWxkcmVuPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudAotewotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoaWxkcmVuKCkgPGVtPkNoaWxkcmVuPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENoaWxkcmVuKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRUxpc3QgY2hpbGRyZW4gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gICAgewotICAgICAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgewotICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fQ0hJTERSRU4pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gICAgewotICAgICAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOOgotICAgICAgICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpIGdldENoaWxkcmVuKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fQ0hJTERSRU46Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgICAgIHNldEVsZW1lbnRUeXBlKChRTmFtZSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19DSElMRFJFTjoKLSAgICAgICAgICAgIGdldENoaWxkcmVuKCkuY2xlYXIoKTsKLSAgICAgICAgICAgIGdldENoaWxkcmVuKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fQ0hJTERSRU46Ci0gICAgICAgICAgICBnZXRDaGlsZHJlbigpLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOOgotICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgIWNoaWxkcmVuLmlzRW1wdHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gICAgfQotCi0gICAgLy8gCi0gICAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgICAvLwotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gICAgewotICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsICYmICFpc1JlY29uY2lsaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudCgpOiBQcmVzZXJ2aW5nIG9sZCBlbGVtZW50Iik7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc2V0RWxlbWVudEdlbihlbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLnJlY29uY2lsZUF0dHJpYnV0ZXMoKSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KCkiKTsKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIGV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETy4uICB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIGNoaWxkIHNob3VsZCBnbyBpbiB0aGUgaW4gY3VycmVudCBsaXN0Ci0gICAgICAgIC8vIHNvIHRoYXQgaXQgZG9lc24ndCBhbHdheXMgZW5kIHVwIGdvaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgCi0gICAgICAgIC8vIChzaW5jZSBhIG5ldyBlbGVtZW50IG1pZ2h0IGJlIGFkZGVkIGF0IHRoZSBzdGFydCkKLSAgICAgICAgZ2V0Q2hpbGRyZW4oKS5hZGQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOyAgICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gICAgewotICAgICAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdWVlID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgY29tcG9uZW50OwotICAgICAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVlZS5nZXRDaGlsZHJlbigpLnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudCgpOwotICAgICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLQotICAgICAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSAvLyBUaGlzIGlzIGFuIG9sZCBlbGVtZW50LgotICAgICAgICB7Ci0gICAgICAgICAgICBuZXdFbGVtZW50ID0gKEVsZW1lbnQpIGRvY3VtZW50LmltcG9ydE5vZGUoZWxlbWVudCwgdHJ1ZSk7Ci0gICAgICAgICAgICBlbGVtZW50ID0gbmV3RWxlbWVudDsKLSAgICAgICAgfSAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIFN0cmluZyBxdWFsaWZpZXIgPSBkZWZpbml0aW9uLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIChxdWFsaWZpZXIgPT0gbnVsbCA/ICIiIDogcXVhbGlmaWVyICsgIjoiKSArIGdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgcHJvcGVydGllcyA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gICAgewotICAgICAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGphdmEudXRpbC5NYXAuRW50cnkgZW50cnkgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IChqYXZhLnV0aWwuTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0gLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhN2FlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuV1NETEVsZW1lbnRJbXBsI2dldERvY3VtZW50YXRpb25FbGVtZW50IDxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5XU0RMRWxlbWVudEltcGwjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExFbGVtZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV1NETEVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIDxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldERvY3VtZW50YXRpb25FbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbGVtZW50IERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERvY3VtZW50YXRpb25FbGVtZW50KCkgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRWxlbWVudCBkb2N1bWVudGF0aW9uRWxlbWVudCA9IERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnQoKSA8ZW0+RWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRWxlbWVudCBFTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudCgpIDxlbT5FbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudCA9IEVMRU1FTlRfRURFRkFVTFQ7Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZ0RPTSA9IGZhbHNlOwotICBwcm90ZWN0ZWQgRUxpc3Qgd3NkbENvbnRlbnRzOwotCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBlbmNsb3NpbmdEZWZpbml0aW9uOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExFbGVtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldERvY3VtZW50YXRpb25FbGVtZW50KCkKLSAgewotICAgIHJldHVybiBkb2N1bWVudGF0aW9uRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRWxlbWVudCBuZXdEb2N1bWVudGF0aW9uRWxlbWVudCkKLSAgewotICAgIEVsZW1lbnQgb2xkRG9jdW1lbnRhdGlvbkVsZW1lbnQgPSBkb2N1bWVudGF0aW9uRWxlbWVudDsKLSAgICBkb2N1bWVudGF0aW9uRWxlbWVudCA9IG5ld0RvY3VtZW50YXRpb25FbGVtZW50OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5ULCBvbGREb2N1bWVudGF0aW9uRWxlbWVudCwgZG9jdW1lbnRhdGlvbkVsZW1lbnQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudEdlbihFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBFbGVtZW50IG9sZEVsZW1lbnQgPSBlbGVtZW50OwotICAgIGVsZW1lbnQgPSBuZXdFbGVtZW50OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRUxFTUVOVCwgb2xkRWxlbWVudCwgZWxlbWVudCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBlbmNsb3NpbmdEZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKGRvY3VtZW50YXRpb25FbGVtZW50OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVsZW1lbnQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZWxlbWVudCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsYXRpb24gbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBXU0RMQ29udGVudHNFTGlzdCBleHRlbmRzIEVDb250ZW50c0VMaXN0Ci0gIHsKLSAgICBXU0RMQ29udGVudHNFTGlzdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGVTdHJ1Y3R1cmFsRmVhdHVyZXMpCi0gICAgewotICAgICAgc3VwZXIoZU9iamVjdCwgZVN0cnVjdHVyYWxGZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3RJdGVyYXRvciBuZXdMaXN0SXRlcmF0b3IoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRmVhdHVyZUl0ZXJhdG9ySW1wbChlT2JqZWN0LCBlU3RydWN0dXJhbEZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGVkKEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUpCi0gICAgewotICAgICAgRVJlZmVyZW5jZSBlUmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGVTdHJ1Y3R1cmFsRmVhdHVyZTsKLSAgICAgIHJldHVybiAhZVJlZmVyZW5jZS5pc1RyYW5zaWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGJhc2ljTGlzdCgpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBXU0RMQ29udGVudHNFTGlzdChlT2JqZWN0LCBlU3RydWN0dXJhbEZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgYmFzaWNJdGVyYXRvcigpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBGZWF0dXJlSXRlcmF0b3JJbXBsKGVPYmplY3QsIGVTdHJ1Y3R1cmFsRmVhdHVyZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmVhdHVyZUl0ZXJhdG9ySW1wbCBleHRlbmRzIEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvckltcGwKLSAgICB7Ci0gICAgICBwdWJsaWMgRmVhdHVyZUl0ZXJhdG9ySW1wbChFT2JqZWN0IGVPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyKGVPYmplY3QsIChFU3RydWN0dXJhbEZlYXR1cmVbXSkgKChCYXNpY0VMaXN0KSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkpLmRhdGEoKSk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBGZWF0dXJlSXRlcmF0b3JJbXBsKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlW10gZVN0cnVjdHVyYWxGZWF0dXJlcykKLSAgICAgIHsKLSAgICAgICAgc3VwZXIoZU9iamVjdCwgZVN0cnVjdHVyYWxGZWF0dXJlcyk7Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZWQoRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSkKLSAgICAgIHsKLSAgICAgICAgRVJlZmVyZW5jZSBlUmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGVTdHJ1Y3R1cmFsRmVhdHVyZTsKLSAgICAgICAgcmV0dXJuICFlUmVmZXJlbmNlLmlzVHJhbnNpZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVMaXN0IGdldFdTRExDb250ZW50cygpCi0gIHsKLSAgICBpZiAod3NkbENvbnRlbnRzID09IG51bGwpCi0gICAgewotICAgICAgd3NkbENvbnRlbnRzID0gbmV3IFdTRExDb250ZW50c0VMaXN0KHRoaXMsIChFU3RydWN0dXJhbEZlYXR1cmVbXSkgKChCYXNpY0VMaXN0KSBlQ2xhc3MoKS5nZXRFQWxsQ29udGFpbm1lbnRzKCkpLmRhdGEoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHdzZGxDb250ZW50czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgIHNldEVsZW1lbnRHZW4obnVsbCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGNvbnRlbnRzID0gZ2V0V1NETENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29udGVudHMuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIFdTRExFbGVtZW50SW1wbCBjb250ZW50ID0gKFdTRExFbGVtZW50SW1wbCkgb2JqOwotICAgICAgICAgIGNvbnRlbnQuc2V0RWxlbWVudChudWxsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RWxlbWVudEdlbihlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBlTm90aWZpY2F0aW9uUmVxdWlyZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsKLSAgICBpbnQgZXZlbnRUeXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotICAgIE9iamVjdCBmZWF0dXJlID0gbXNnLmdldEZlYXR1cmUoKTsKLSAgICBPYmplY3Qgb2xkVmFsdWUgPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLSAgICBPYmplY3QgbmV3VmFsdWUgPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQotICAgIGlmIChlQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLmNvbnRhaW5zKGZlYXR1cmUpKQotICAgIHsKLSAgICAgIEVSZWZlcmVuY2UgZVJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBmZWF0dXJlOwotICAgICAgaWYgKGZlYXR1cmUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKSkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVOb3RpZnk6IG5hbWVzcGFjZXMiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVSZWZlcmVuY2UuaXNDb250YWlubWVudCgpICYmICFlUmVmZXJlbmNlLmlzVHJhbnNpZW50KCkpCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgICAgICAgICAgYWRvcHRDb250ZW50KGVSZWZlcmVuY2UsIChXU0RMRWxlbWVudCkgbmV3VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG5ld1ZhbHVlcyA9ICgoQ29sbGVjdGlvbikgbmV3VmFsdWUpLml0ZXJhdG9yKCk7IG5ld1ZhbHVlcy5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgbmV3VmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgYWRvcHRDb250ZW50KGVSZWZlcmVuY2UsIHdzZGxFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcnBoYW5Db250ZW50KGVSZWZlcmVuY2UsIChXU0RMRWxlbWVudCkgb2xkVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9sZFZhbHVlcyA9ICgoQ29sbGVjdGlvbikgb2xkVmFsdWUpLml0ZXJhdG9yKCk7IG9sZFZhbHVlcy5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBvbGRWYWx1ZXMubmV4dCgpOwotICAgICAgICAgICAgICBvcnBoYW5Db250ZW50KGVSZWZlcmVuY2UsIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uTU9WRSA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgbW92ZUNvbnRlbnQoZVJlZmVyZW5jZSwgKFdTRExFbGVtZW50KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uU0VUIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9ycGhhbkNvbnRlbnQoZVJlZmVyZW5jZSwgb2xkVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFkb3B0Q29udGVudChlUmVmZXJlbmNlLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChldmVudFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5NT1ZFIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5TRVQgOgotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5jb250YWlucyhmZWF0dXJlKSkKLSAgICB7Ci0gICAgICBFQXR0cmlidXRlIGVBdHRyaWJ1dGUgPSAoRUF0dHJpYnV0ZSkgZmVhdHVyZTsKLSAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLSAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uTU9WRSA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLSAgICAgICAgewotICAgICAgICAgIGNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5lTm90aWZ5KG1zZyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBvcnBoYW5Db250ZW50KEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgT2JqZWN0IG9iaikKLSAgewotICAgIGlmICghaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudCA9IGdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgIHsKLSAgICAgIAlXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudClvYmo7Ci0gICAgICAgIEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSB3c2RsRWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIG5pY2VSZW1vdmVDaGlsZChjb250ZW50RWxlbWVudC5nZXRQYXJlbnROb2RlKCksIGNvbnRlbnRFbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIAk7Ly9TeXN0ZW0ub3V0LnByaW50bG4oIldTRExFbGVtZW50Lm9ycGhhbkNvbnRlbnQoKSwgT2JqZWN0IGlzOiAiICsgb2JqKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIG5pY2VSZW1vdmVDaGlsZChOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgZG9tIHdyaXRlYmFjayBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3JjZU5pY2VSZW1vdmVDaGlsZChwYXJlbnQsIGNoaWxkKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZm9yY2VOaWNlUmVtb3ZlQ2hpbGQoTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpCi0gIHsKLSAgICB1cGRhdGluZ0RPTSA9IHRydWU7Ci0KLSAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLQotLy8gU3lzdGVtLm91dC5wcmludGxuKCI/KiIpOwotICAgIE5vZGUgcHJldmlvdXMgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICBpZiAocHJldmlvdXMgIT0gbnVsbCAmJiBwcmV2aW91cy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IChUZXh0KXByZXZpb3VzOwotICAgICAgU3RyaW5nIGRhdGEgPSB0ZXh0LmdldERhdGEoKTsKLSAgICAgIGludCBpbmRleCA9IGRhdGEubGFzdEluZGV4T2YoJ1xuJyk7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlmIChpbmRleCAtIDEgPiAwICYmIGRhdGEuY2hhckF0KGluZGV4IC0gMSkgPT0gJ1xyJykKLSAgICAgICAgewotLy9TeXN0ZW0ub3V0LnByaW50bG4oIjEqIik7Ci0gICAgICAgICAgdGV4dC5kZWxldGVEYXRhKGluZGV4IC0gMSwgZGF0YS5sZW5ndGgoKSAtIGluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0vL1N5c3RlbS5vdXQucHJpbnRsbigiMioiKTsKLSAgICAgICAgICB0ZXh0LmRlbGV0ZURhdGEoaW5kZXgsIGRhdGEubGVuZ3RoKCkgLSBpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJObyByZXR1cm4gYmVmb3JlISIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJObyB0ZXh0IG5vZGUgYmVmb3JlISIpOwotICAgIH0KLQotCi0gICAgaWYgKCFkb25lKQotICAgIHsKLSAgICAgIGZvciAoTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsgbmV4dCAhPSBudWxsOyBuZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpbmV4dDsKLSAgICAgICAgICBTdHJpbmcgZGF0YSA9IHRleHQuZ2V0RGF0YSgpOwotLyoKLSAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieHggIiArIGRhdGEubGVuZ3RoKCkgKyAiOjogIik7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCgpOyArK2kpCi0gICAgICAgICAgewotICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiICsgSW50ZWdlci50b0hleFN0cmluZygoaW50KWRhdGEuY2hhckF0KGkpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotKi8KLQotICAgICAgICAgIGludCBpbmRleCA9IGRhdGEuaW5kZXhPZignXG4nKTsKLSAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA8IGRhdGEubGVuZ3RoKCkgJiYgZGF0YS5jaGFyQXQoaW5kZXggKyAxKSA9PSAnXHInKQotICAgICAgICAgICAgewotICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiMyoiKTsKLSAgICAgICAgICAgICAgdGV4dC5kZWxldGVEYXRhKDAsIGluZGV4ICsgMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIjQqIik7Ci0gICAgICAgICAgICAgIHRleHQuZGVsZXRlRGF0YSgwLCBpbmRleCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHJldHVybiBhZnRlciEiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3ZpbmcgZnJvbS0tLS0tLS0tXG4gICAgICIgKyBwYXJlbnQpOwotLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZW1vdmluZy0tLS0tLS0tXG4gICAgICIgKyBjaGlsZCk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIAlwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCi0gICAgdXBkYXRpbmdET009ZmFsc2U7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgbW92ZUNvbnRlbnQoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgZG9tIHdyaXRlYmFjayBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibW92aW5nICIgKyB4c2RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgTm9kZSBwYXJlbnQgPSBnZXRBZG9wdGlvblBhcmVudE5vZGUoZVJlZmVyZW5jZSk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSB3c2RsRWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoY2hpbGQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBjb250ZW50cyA9IGdldFdTRExDb250ZW50cygpOwotICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50cy5pbmRleE9mKHdzZGxFbGVtZW50KTsKLSAgICAgICAgbmljZVJlbW92ZUNoaWxkKHBhcmVudCwgY2hpbGQpOwotICAgICAgICBuaWNlSW5zZXJ0QmVmb3JlCi0gICAgICAgICAgKHBhcmVudCwgCi0gICAgICAgICAgICBjaGlsZCwgCi0gICAgICAgICAgICArK2luZGV4ID09IGNvbnRlbnRzLnNpemUoKSA/ICAKLSAgICAgICAgICAgICAgbnVsbCA6IAotICAgICAgICAgICAgICAoKFdTRExFbGVtZW50KWNvbnRlbnRzLmdldChpbmRleCkpLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJtb3ZlZCAiICsgeHNkQ29uY3JldGVDb21wb25lbnQpOwotCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZG9wdENvbnRlbnQoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBvYmplY3Q7Ci0gICAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHsKLSAgICAgICAgaWYgKHdzZGxFbGVtZW50LmdldEVsZW1lbnQoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS5lbGVtZW50Q2hhbmdlZCh3c2RsRWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gd3NkbEVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgKGNoaWxkRWxlbWVudCA9PSBudWxsIHx8IGNoaWxkRWxlbWVudC5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwgJiYgY2hpbGRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSAhPSBnZXRFbGVtZW50KCkuZ2V0T3duZXJEb2N1bWVudCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdzZGxFbGVtZW50LnNldEVsZW1lbnQobnVsbCk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGhhbmRsZUVsZW1lbnRGb3JBZG9wdChlUmVmZXJlbmNlLCB3c2RsRWxlbWVudCk7Ci0gICAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS5hZG9wdEJ5KGRlZmluaXRpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBOb2RlIGdldEFkb3B0aW9uUGFyZW50Tm9kZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50Rm9yQWRvcHQoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgeyAKLSAgICAvLyBFc3RhYmxpc2ggRE9NIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAKLSAgICAKLSAgICBOb2RlIGFkb3B0aW9uUGFyZW50ID0gZ2V0QWRvcHRpb25QYXJlbnROb2RlKGVSZWZlcmVuY2UpOwotICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gd3NkbEVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgIEVsZW1lbnQgcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsOwotICAgIAotICAgIGZvciAoSXRlcmF0b3IgY29udGVudHMgPSBnZXRXU0RMQ29udGVudHMoKS5pdGVyYXRvcigpOyBjb250ZW50cy5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBpZiAoY29udGVudHMubmV4dCgpID09IHdzZGxFbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAoY29udGVudHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSAoKFdTRExFbGVtZW50KWNvbnRlbnRzLm5leHQoKSkuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIHdoaWxlIChyZWZlcmVuY2VkRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gcmVmZXJlbmNlZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOyAKLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQgPT0gYWRvcHRpb25QYXJlbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgCi0gICAgYm9vbGVhbiBpc05ldyA9IGZhbHNlOwotICAgIGlmIChjaGlsZEVsZW1lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAoKFdTRExFbGVtZW50SW1wbCl3c2RsRWxlbWVudCkuaXNSZWNvbmNpbGluZyA9IHRydWU7Ci0gICAgICBjaGlsZEVsZW1lbnQgPSAoKFdTRExFbGVtZW50SW1wbCl3c2RsRWxlbWVudCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgKChXU0RMRWxlbWVudEltcGwpd3NkbEVsZW1lbnQpLmlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgIGlzTmV3ID0gdHJ1ZTsKLSAgICAgIGlmIChjaGlsZEVsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJub3QgY3JlYXRlZCEgIiArIHdzZGxFbGVtZW50KTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGlzQXR0YWNoZWQgPSBmYWxzZTsKLSAgICBmb3IgKE5vZGUgcm9vdERvY3VtZW50ID0gY2hpbGRFbGVtZW50OyByb290RG9jdW1lbnQgIT0gbnVsbDsgcm9vdERvY3VtZW50ID0gcm9vdERvY3VtZW50LmdldFBhcmVudE5vZGUoKSkKLSAgICB7Ci0gICAgICBpZiAoV1NETENvbnN0YW50cy5ub2RlVHlwZShyb290RG9jdW1lbnQpID09IFdTRExDb25zdGFudHMuREVGSU5JVElPTikKLSAgICAgIHsKLSAgICAgICAgaXNBdHRhY2hlZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoIWlzQXR0YWNoZWQpCi0gICAgewotICAgICAgaWYgKHJlZmVyZW5jZWRFbGVtZW50ID09IG51bGwgJiYgCi0gICAgICAgICAgIWVSZWZlcmVuY2UuaXNNYW55KCkpCi0gICAgewotICAgICAgZm9yIChOb2RlIGNoaWxkID0gYWRvcHRpb25QYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSAoRWxlbWVudCljaGlsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAgIC8vcmVmZXJlbmNlZEVsZW1lbnQgPSBjb21wdXRlVG9wTGV2ZWxSZWZDaGlsZChhZG9wdGlvblBhcmVudCxjaGlsZEVsZW1lbnQpOyAgICAgCi0gICAgICBuaWNlSW5zZXJ0QmVmb3JlKGFkb3B0aW9uUGFyZW50LCBjaGlsZEVsZW1lbnQsIHJlZmVyZW5jZWRFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBuaWNlSW5zZXJ0QmVmb3JlKE5vZGUgcGFyZW50LCBOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZmVyZW5jZUNoaWxkKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBkb20gd3JpdGViYWNrIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yY2VOaWNlSW5zZXJ0QmVmb3JlKHBhcmVudCwgbmV3Q2hpbGQsIHJlZmVyZW5jZUNoaWxkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGZvcmNlTmljZUluc2VydEJlZm9yZShOb2RlIHBhcmVudCwgTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZlcmVuY2VDaGlsZCkKLSAgewotICAgIHVwZGF0aW5nRE9NID0gdHJ1ZTsKLQotICAgIExPT1A6Ci0gICAgZm9yIChOb2RlIGNoaWxkID0gcmVmZXJlbmNlQ2hpbGQgPT0gbnVsbCA/IHBhcmVudC5nZXRMYXN0Q2hpbGQoKSA6IHJlZmVyZW5jZUNoaWxkLmdldFByZXZpb3VzU2libGluZygpOyAKLSAgICAgICAgIGNoaWxkICE9IG51bGw7IAotICAgICAgICAgY2hpbGQgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICBUZXh0IHRleHQgPSAoVGV4dCljaGlsZDsKLSAgICAgICAgICBTdHJpbmcgZGF0YSA9IHRleHQuZ2V0RGF0YSgpOwotCi0vKgotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInh4ICIgKyBkYXRhLmxlbmd0aCgpICsgIjo6ICIpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGgoKTsgKytpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiICsgSW50ZWdlci50b0hleFN0cmluZygoaW50KWRhdGEuY2hhckF0KGkpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotKi8KLQotICAgICAgICAgIGludCBpbmRleCA9IGRhdGEubGFzdEluZGV4T2YoJ1xuJyk7Ci0gICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICAgIHsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW4gaGVyZSIpOwotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgZm9yIChOb2RlIGFuY2VzdG9yID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsgCi0gICAgICAgICAgICAgICAgIGFuY2VzdG9yICE9IG51bGwgJiYgYW5jZXN0b3IuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREU7IAotICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLmdldFBhcmVudE5vZGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5kZW50LmFwcGVuZCgiICAgICIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW5kZXggKyAxIDwgZGF0YS5sZW5ndGgoKSAmJiBkYXRhLmNoYXJBdChpbmRleCArIDEpID09ICdccicpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZXh0LnJlcGxhY2VEYXRhKGluZGV4ICsgMSwgZGF0YS5sZW5ndGgoKSAtIGluZGV4IC0gMSwgaW5kZW50ICsgIiAgICAiKTsKLQotICAgICAgICAgICAgLy8gc2V0Q29ycmVjdEluZGVudGF0aW9uKGluZGVudCwgbmV3VGV4dCk7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlQ2hpbGQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5kZW50LmFwcGVuZCgiICAgICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dCBuZXdUZXh0ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iICsgaW5kZW50KTsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zZXJ0ZWQuLi4iICsgbmV3VGV4dCk7Ci0gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1RleHQsIHJlZmVyZW5jZUNoaWxkKTsKLSAgICAgICAgICAgIHJlZmVyZW5jZUNoaWxkID0gbmV3VGV4dDsKLSAgICAgICAgICAgIGJyZWFrIExPT1A7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gCi0gICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICBicmVhayBMT09QOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIkluc2VydGVkLi4uIiArIG5ld0NoaWxkKTsKLSAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZlcmVuY2VDaGlsZCk7Ci0KLSAgICB1cGRhdGluZ0RPTSA9IGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY29tcHV0ZVRvcExldmVsUmVmQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5vZGVUb0FkZCkKLSAgewotICAJRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgIGludCBhID0gZ2V0UHJlY2VkZW5jZShub2RlVG9BZGQpOwotICAgICAgCQotICAgIGZvciAoTm9kZSBub2RlID0gcGFyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7Ci0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotCQkgICAgaW50IGIgPSBnZXRQcmVjZWRlbmNlKG5vZGUpOwotCQkgICAgaWYgKGIgPj0gYSkKLQkJICAgIHsKLQkJICAgICAgcmVzdWx0ID0gKEVsZW1lbnQpbm9kZTsJCi0JICAgICAgICBicmVhazsJICAgIAotCQkgICAgfSAgICAgICAgCi0gICAgICB9IAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcml2YXRlIEhhc2hNYXAgcHJlY2VkZW5jZU1hcCA9IGNyZWF0ZVByZWNlZGVuY2VNYXAoKTsKLQotICBwcml2YXRlIGludCBnZXRQcmVjZWRlbmNlKE5vZGUgbm9kZSkKLSAgewotICAJaW50IHJlc3VsdCA9IDI7Ci0gIAlTdHJpbmcgbG9jYWxOYW1lID0gbm9kZS5nZXRMb2NhbE5hbWUoKTsKLSAgCWlmIChsb2NhbE5hbWUgIT0gbnVsbCkKLSAgCXsgIAkKLSAgICAgIEludGVnZXIgaW50ZWdlciA9IChJbnRlZ2VyKXByZWNlZGVuY2VNYXAuZ2V0KGxvY2FsTmFtZSk7Ci0gICAgICBpZiAoaW50ZWdlciAhPSBudWxsKQotICAgICAgeyAgICAgIAotICAgICAgICByZXN1bHQgPSBpbnRlZ2VyLmludFZhbHVlKCk7Ci0gICAgICB9Ci0gIAl9Ci0gIAlyZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgCi0gIHByaXZhdGUgSGFzaE1hcCBjcmVhdGVQcmVjZWRlbmNlTWFwKCkKLQl7Ci0JCUhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoMSkpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLklNUE9SVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoMykpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLlRZUEVTX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig0KSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuTUVTU0FHRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNSkpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNikpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLkJJTkRJTkdfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDcpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5TRVJWSUNFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig4KSk7Ci0JCXJldHVybiBoYXNoTWFwOwotCX0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZG9wdEJ5KERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIGZvciAoSXRlcmF0b3IgY29tcG9uZW50cyA9IGdldFdTRExDb250ZW50cygpLml0ZXJhdG9yKCk7IGNvbXBvbmVudHMuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3QgY2hpbGQgPSBjb21wb25lbnRzLm5leHQoKTsKLSAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgIHsKLSAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIGNoaWxkKS5hZG9wdEJ5KGRlZmluaXRpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmdET00oKQotICB7Ci0gICAgcmV0dXJuIHVwZGF0aW5nRE9NOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIGlmICghaXNVcGRhdGluZ0RPTSgpKQotICAgIHsKLSAgICAgIGlmICghaXNSZWNvbmNpbGluZykKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY2hhbmdlRm9yICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgICAgcmVjb25jaWxlKGNoYW5nZWRFbGVtZW50KTsKLQotICAgICAgICBXU0RMRWxlbWVudCB0aGVDb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKHRoZUNvbnRhaW5lciAhPSBudWxsICYmIHRoZUNvbnRhaW5lci5nZXRFbGVtZW50KCkgPT0gY2hhbmdlZEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFdTRExFbGVtZW50SW1wbCkgdGhlQ29udGFpbmVyKS5lbGVtZW50Q2hhbmdlZChjaGFuZ2VkRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gICAgICAgIHRyYXZlcnNlVG9Sb290Rm9yUGF0Y2hpbmcoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgOyAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgaW50ZXJuYWwgcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICA7IC8vU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBET00gcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBUT0RPLi4uIHJlbW92ZSB0aGlzIG1ldGhvZCEKLSAgICovCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgcmV0dXJuIGdldFdTRExDb250ZW50cygpOwotICB9Ci0KLSAgLyoKLSAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0RWxlbWVudEZvck1vZGVsT2JqZWN0KE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIEVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChFbGVtZW50KSBtb2RlbE9iamVjdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKFdTRExFbGVtZW50KSBtb2RlbE9iamVjdCkuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICovCi0KLSAgcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENvbnRlbnROb2RlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChOb2RlIGNoaWxkID0gY2hhbmdlZEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgewotICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hZGQoY2hpbGQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gU29tZSBzdWJjbGFzc2VzIHVzZSB0aGlzIG1ldGhvZAotICBwcm90ZWN0ZWQgUU5hbWUgY3JlYXRlUU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgcHJlZml4ZWROYW1lKQotICB7Ci0gICAgUU5hbWUgcW5hbWUgPSBudWxsOwotICAgIGlmIChwcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSBwcmVmaXhlZE5hbWUuaW5kZXhPZigiOiIpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IChpbmRleCA9PSAtMSkgPyAiIiA6IHByZWZpeGVkTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBwcmVmaXhlZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgIHFuYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBxbmFtZTsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZGVlcCB8fCBnZXRFbGVtZW50KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjaGFuZ2VBdHRyaWJ1dGUobnVsbCk7Ci0gICAgICBjaGFuZ2VSZWZlcmVuY2UobnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudCgpCi0gIHsKLSAgICBpZiAoZ2V0RWxlbWVudCgpID09IG51bGwpCi0gICAgewotICAgICAgaXNSZWNvbmNpbGluZyA9IHRydWU7Ci0gICAgICBjcmVhdGVFbGVtZW50KCk7Ci0gICAgICBpc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhbmdlQXR0cmlidXRlKG51bGwpOwotICAgIGNoYW5nZVJlZmVyZW5jZShudWxsKTsKLQotICAgIE9iamVjdCBvYmogPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgY29udGFpbm1lbnRzID0gZUNsYXNzKCkuZ2V0RUFsbENvbnRhaW5tZW50cygpLml0ZXJhdG9yKCk7IGNvbnRhaW5tZW50cy5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEVSZWZlcmVuY2UgZVJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBjb250YWlubWVudHMubmV4dCgpOwotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50X1NjaGVtYSgpKQotICAgICAgewotICAgICAgICAvLyBUQkQgLSBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGFuZAotICAgICAgICAvLyBlUmVmZXJuY2UgaXMgWFNEU2NoZW1hLiBXaGF0IGRvIHdlIHdhbnQgdG8gZG8gZm9yIHVwZGF0ZT8KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCFlUmVmZXJlbmNlLmlzVHJhbnNpZW50KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlUmVmZXJlbmNlLmlzTWFueSgpKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBvYmplY3RzID0gKChDb2xsZWN0aW9uKSBlR2V0KGVSZWZlcmVuY2UpKS5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgb2JqID0gb2JqZWN0cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgfHwgb2JqID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFNraXAgaXQuIFByb2JhYmx5IHRoaXMgaXMgTmFtZXNwYWNlLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgb2JqOwotICAgICAgICAgICAgICAvL2hhbmRsZUVsZW1lbnRGb3JBZG9wdChlUmVmZXJlbmNlLCB3c2RsRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAoKFdTRExFbGVtZW50SW1wbCkgd3NkbEVsZW1lbnQpLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIGVHZXQoZVJlZmVyZW5jZSk7Ci0gICAgICAgICAgaWYgKHdzZGxFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy9oYW5kbGVFbGVtZW50Rm9yQWRvcHQoZVJlZmVyZW5jZSwgIHdzZGxFbGVtZW50KTsKLSAgICAgICAgICAgICAoKFdTRExFbGVtZW50SW1wbCkgd3NkbEVsZW1lbnQpLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gLy8gZW5kIGVsc2UgaWYKLSAgICB9IC8vIGVuZCBmb3IKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETEVsZW1lbnRfRWxlbWVudCgpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwgJiYgIWlzUmVjb25jaWxpbmcpCi0gICAgICB7Ci0gICAgICAgIGZvciAoTm9kZSByb290RG9jdW1lbnQgPSB0aGVFbGVtZW50LmdldFBhcmVudE5vZGUoKTsgcm9vdERvY3VtZW50ICE9IG51bGw7IHJvb3REb2N1bWVudCA9IHJvb3REb2N1bWVudC5nZXRQYXJlbnROb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocm9vdERvY3VtZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgICAgICAgaWYgKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWNvbmNpbGVBdHRyaWJ1dGVzKGdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVjb25jaWxlKGdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgdHJhdmVyc2VUb1Jvb3RGb3JQYXRjaGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZVRvUm9vdEZvclBhdGNoaW5nKCkKLSAgewotICAgIGlmICghaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICBXU0RMRWxlbWVudEltcGwgY29udGFpbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29udGFpbmVyLnRyYXZlcnNlVG9Sb290Rm9yUGF0Y2hpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGUoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotICAgIHJlY29uY2lsZUNvbnRlbnRzKGNoYW5nZWRFbGVtZW50KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVjb25jaWxlQ29udGVudHMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIExpc3QgcmVtYWluaW5nTW9kZWxPYmplY3RzID0gbmV3IEFycmF5TGlzdChnZXRXU0RMQ29udGVudHMoKSk7Ci0KLSAgICBDb2xsZWN0aW9uIGNvbnRlbnROb2RlcyA9IGdldENvbnRlbnROb2RlcyhjaGFuZ2VkRWxlbWVudCk7Ci0KLSAgICBFbGVtZW50IHRoZURvY3VtZW50YXRpb25FbGVtZW50ID0gbnVsbDsKLSAgICAKLSAgICAvLyBmb3IgZWFjaCBhcHBsaWNhYmxlIGNoaWxkIG5vZGUgb2YgY2hhbmdlZEVsZW1lbnQKLSAgICBMT09QIDogZm9yIChJdGVyYXRvciBpID0gY29udGVudE5vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpIGkubmV4dCgpOwotICAgICAgLy8gU2V0IERvY3VtZW50YXRpb24gZWxlbWVudCBpZiBleGlzdHMKLSAgICAgIGlmIChXU0RMQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcuZXF1YWxzKGNoaWxkLmdldExvY2FsTmFtZSgpKSAmJgotICAgICAgICAgIFdTRExDb25zdGFudHMuaXNNYXRjaGluZ05hbWVzcGFjZShjaGlsZC5nZXROYW1lc3BhY2VVUkkoKSwgV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpKQotICAgICAgewotICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0ICdkb2N1bWVudGF0aW9uJyBlbGVtZW50IGlzICd0aGUnIGRvY3VtZW50YXRpb24gZWxlbWVudAotICAgICAgICAvLyAndGhlcmUgY2FuIGJlIG9ubHkgb25lIScKLSAgICAgICAgaWYgKHRoZURvY3VtZW50YXRpb25FbGVtZW50ID09IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIHRoZURvY3VtZW50YXRpb25FbGVtZW50ID0gY2hpbGQ7Ci0gICAgICAgIH0gICAKLSAgICAgIH0gCi0gICAgICAvLyBnbyB0aHJ1IHRoZSBtb2RlbCBvYmplY3RzIHRvIGNvbGxlY3QgbWF0Y2hpbmcgb2JqZWN0IGZvciByZXVzZQotICAgICAgZm9yIChJdGVyYXRvciBjb250ZW50cyA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBjb250ZW50cy5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSAoT2JqZWN0KSBjb250ZW50cy5uZXh0KCk7Ci0gICAgICAgIGlmICgoKFdTRExFbGVtZW50KSBtb2RlbE9iamVjdCkuZ2V0RWxlbWVudCgpID09IGNoaWxkKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudHMucmVtb3ZlKCk7IC8vIHJlbW92ZXMgdGhlICdjaGlsZCcgTm9kZSBmcm9tIHRoZSByZW1haW5pbmdNb2RlbE9iamVjdHMgbGlzdAotICAgICAgICAgIGNvbnRpbnVlIExPT1A7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gaWYgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudCBoYXMgY2hhbmdlZC4uLiB1cGRhdGUgaXQKLSAgICAgIC8vCi0gICAgICBpZiAodGhlRG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGhlRG9jdW1lbnRhdGlvbkVsZW1lbnQpOyAgCi0gICAgICB9ICAKLSAgICAgIAotICAgICAgLy8gd2UgaGF2ZW4ndCBmb3VuZCBhIG1hdGNoaW5nIG1vZGVsIG9iamVjdCBmb3IgdGhlIE5vZGUsIHNlIHdlIG1heSBuZWVkIHRvCi0gICAgICAvLyBjcmVhdGUgYSBuZXcgbW9kZWwgb2JqZWN0Ci0gICAgICBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLCByZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICAgIH0KLQotICAgIC8vIG5vdyB3ZSBjYW4gcmVtb3ZlIHRoZSByZW1haW5pbmcgbW9kZWwgb2JqZWN0cwotICAgIGhhbmRsZVJlY29uY2lsaWF0aW9uKHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldEVuY2xvc2luZ0RlZmluaXRpb24oKQotICB7Ci0gICAgaWYgKGVuY2xvc2luZ0RlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHJldHVybiBlbmNsb3NpbmdEZWZpbml0aW9uOwotCi0gICAgLy8gVEJEIC0gUmV2aXNpdAotICAgIC8vRU9iamVjdCBjID0gZUNvbnRhaWVyKCk7IGMgIT0gbnVsbDsgYyA9IGMuZUNvbnRhaW50ZXIoKSkKLSAgICAvL3sKLQotICAgIGZvciAoV1NETEVsZW1lbnQgY29udGFpbmVyID0gdGhpczsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9ICgoV1NETEVsZW1lbnRJbXBsKSBjb250YWluZXIpLmdldENvbnRhaW5lcigpKQotICAgIHsKLSAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBlbmNsb3NpbmdEZWZpbml0aW9uID0gKERlZmluaXRpb24pIGNvbnRhaW5lcjsKLSAgICAgICAgcmV0dXJuIGVuY2xvc2luZ0RlZmluaXRpb247Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKgotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRSb290RW5jbG9zaW5nRGVmaW5pdGlvbigpCi0gIHsKLSAgICBpZiAoZW5jbG9zaW5nRGVmaW5pdGlvbiA9PSBudWxsKQotICAgICB7Ci0gICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGVSZXNvdXJjZSgpOwotICAgICAgTGlzdCBjb250ZW50cyA9IHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0gICAgICBpZiAoY29udGVudHMuc2l6ZSgpID09IDEgCi0gICAgICAgICAgJiYgY29udGVudHMuZ2V0KDApIGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICAgICAgZW5jbG9zaW5nRGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWNvbnRlbnRzLmdldCgwKTsKLSAgICB9IAotICAgIHJldHVybiBlbmNsb3NpbmdEZWZpbml0aW9uOwotICB9Ci0gICovCi0KLSAgcHVibGljIFdTRExFbGVtZW50IGdldENvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgV1NETEVsZW1lbnQgPyAoV1NETEVsZW1lbnQpIGVDb250YWluZXIoKSA6IG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBuaWNlU2V0QXR0cmlidXRlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGRvbSBhdHRyaWJ1dGUgd3JpdGViYWNrIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlTlMobnVsbCwgYXR0cmlidXRlKSkKLSAgICAgIHsKLSAgICAgICAgdXBkYXRpbmdET00gPSB0cnVlOwotICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotICAgICAgICB1cGRhdGluZ0RPTSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGVOUyhudWxsLCBhdHRyaWJ1dGUpIHx8ICFlbGVtZW50LmdldEF0dHJpYnV0ZU5TKG51bGwsIGF0dHJpYnV0ZSkuZXF1YWxzKHZhbHVlKSkKLSAgICB7Ci0gICAgICB1cGRhdGluZ0RPTSA9IHRydWU7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIGF0dHJpYnV0ZSwgdmFsdWUpOwotICAgICAgdXBkYXRpbmdET00gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIG5pY2VDcmVhdGVOYW1lc3BhY2VBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgdW5pcXVlIHByZWZpeCBmb3IgIm5hbWVzcGFjZS4iCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdXJpTGlzdCkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgZG9tIGF0dHJpYnV0ZSB3cml0ZWJhY2sgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAodXJpTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0aW5nRE9NID0gdHJ1ZTsKLSAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0gICAgICB1cGRhdGluZ0RPTSA9IGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih1cmlMaXN0LCAiICIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZUVsZW1lbnRzKCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcgdXJpID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHVyaTsKLSAgICAgICAgaW50IGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIjIik7Ci0gICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpbmRleCA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZXNwYWNlID0gdXJpLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxvY2FsTmFtZSA9IHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcXVhbGlmaWVyID0gWFNEQ29uc3RhbnRzLmxvb2t1cFF1YWxpZmllcihlbGVtZW50LCBuYW1lc3BhY2UpOwotICAgICAgICBpZiAocXVhbGlmaWVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBxdWFsaWZpZXIgPSBuaWNlQ3JlYXRlTmFtZXNwYWNlQXR0cmlidXRlKG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcU5hbWUgPSBxdWFsaWZpZXIgPT0gbnVsbCB8fCBxdWFsaWZpZXIubGVuZ3RoKCkgPT0gMCA/IGxvY2FsTmFtZSA6IHF1YWxpZmllciArICI6IiArIGxvY2FsTmFtZTsKLQotICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlLmFwcGVuZCgnICcpOwotICAgICAgICB9Ci0gICAgICAgIHZhbHVlLmFwcGVuZChxTmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGVOUyhudWxsLCBhdHRyaWJ1dGUpIHx8ICFlbGVtZW50LmdldEF0dHJpYnV0ZU5TKG51bGwsIGF0dHJpYnV0ZSkuZXF1YWxzKHZhbHVlLnRvU3RyaW5nKCkpKQotICAgICAgewotICAgICAgICB1cGRhdGluZ0RPTSA9IHRydWU7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgYXR0cmlidXRlLCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgdXBkYXRpbmdET00gPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkgLy8gU2hvdWxkIEkgbWFrZSB0aGlzIGFic3RyYWN0PwotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgRWxlbWVudCBjcmVhdGVFbGVtZW50KGludCBub2RlVHlwZSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBEZWZpbml0aW9uKQotICAgICAgZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSB0aGlzOwotICAgIGVsc2UKLSAgICAgIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLQotICAgIC8vIFJldHJpZXZlIHRoZSBuYW1lc3BhY2UgcHJlZml4IGZvciB0aGUgV1NETCBuYW1lc3BhY2UKLSAgICBTdHJpbmcgd3NkbE5hbWVzcGFjZSA9IFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJOwotICAgIFN0cmluZyBxdWFsaWZpZXIgPSBkZWZpbml0aW9uLmdldFByZWZpeCh3c2RsTmFtZXNwYWNlKTsKLQotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh3c2RsTmFtZXNwYWNlLCAocXVhbGlmaWVyID09IG51bGwgPyAiIiA6IHF1YWxpZmllciArICI6IikgKyBXU0RMQ29uc3RhbnRzLkVMRU1FTlRfVEFHU1tub2RlVHlwZV0pOwotCi0gICAgaWYgKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpID09IG51bGwpCi0gICAgICBkb2N1bWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsKLQotICAgIGlmIChnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpICE9IG51bGwpCi0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmltcG9ydE5vZGUoZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgdHJ1ZSkpOwotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChkZWVwKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgY29udGVudHMgPSBnZXRXU0RMQ29udGVudHMoKS5pdGVyYXRvcigpOyBjb250ZW50cy5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgY29udGVudCA9IGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBXU0RMRWxlbWVudEltcGwgZWxlbWVudCA9IChXU0RMRWxlbWVudEltcGwpIGNvbnRlbnQ7Ci0gICAgICAgICAgZWxlbWVudC5pc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgICAgICBlbGVtZW50LnJlY29uY2lsZVJlZmVyZW5jZXModHJ1ZSk7Ci0gICAgICAgICAgZWxlbWVudC5pc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRCZXN0V1NETEVsZW1lbnQoTGlzdCBlbGVtZW50UGF0aCkKLSAgewotICAgIFdTRExFbGVtZW50IHJlc3VsdCA9IHRoaXM7Ci0gICAgZm9yIChJdGVyYXRvciBjb21wb25lbnRzID0gZ2V0V1NETENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29tcG9uZW50cy5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBXU0RMRWxlbWVudEltcGwgY2hpbGRXU0RMRWxlbWVudCA9IChXU0RMRWxlbWVudEltcGwpY29tcG9uZW50cy5uZXh0KCk7Ci0gICAgICBpZiAoZWxlbWVudFBhdGguY29udGFpbnMoY2hpbGRXU0RMRWxlbWVudC5nZXRFbGVtZW50KCkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBjaGlsZFdTRExFbGVtZW50OwotICAgICAgICBXU0RMRWxlbWVudCBiZXR0ZXJXU0RMRWxlbWVudCA9IGNoaWxkV1NETEVsZW1lbnQuZ2V0QmVzdFdTRExFbGVtZW50KGVsZW1lbnRQYXRoKTsKLSAgICAgICAgaWYgKGJldHRlcldTRExFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBiZXR0ZXJXU0RMRWxlbWVudDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29uc2lkZXJBbGxDb250YWluc0ZvckJlc3RXU0RMRWxlbWVudCgpKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY29uc2lkZXJBbGxDb250YWluc0ZvckJlc3RXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gICAgcHVibGljIHZvaWQgZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBpZiAoIWlzVXBkYXRpbmdET00oKSkKLSAgICB7Ci0gICAgICBpZiAoIWlzUmVjb25jaWxpbmcpCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjaGFuZ2VGb3IgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgCi0gICAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgICByZWNvbmNpbGVBdHRyaWJ1dGVzKGNoYW5nZWRFbGVtZW50KTsKLQotICAgICAgICBXU0RMRWxlbWVudEltcGwgdGhlQ29udGFpbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKHRoZUNvbnRhaW5lciAhPSBudWxsICYmIHRoZUNvbnRhaW5lci5nZXRFbGVtZW50KCkgPT0gY2hhbmdlZEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICB0aGVDb250YWluZXIuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKGNoYW5nZWRFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgdHJhdmVyc2VUb1Jvb3RGb3JQYXRjaGluZygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGludGVybmFsIHJlY29uY2lsZSBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBET00gcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZWxlbWVudENvbnRlbnRzQ2hhbmdlZChFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgaWYgKCFpc1VwZGF0aW5nRE9NKCkpCi0gICAgewotICAgICAgaWYgKCFpc1JlY29uY2lsaW5nKQotICAgICAgewotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY2hhbmdlRm9yICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgIAotICAgICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgICAgcmVjb25jaWxlQ29udGVudHMoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgICAgIFdTRExFbGVtZW50SW1wbCB0aGVDb250YWluZXIgPSAoV1NETEVsZW1lbnRJbXBsKWdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAodGhlQ29udGFpbmVyICE9IG51bGwgJiYgdGhlQ29udGFpbmVyLmdldEVsZW1lbnQoKSA9PSBjaGFuZ2VkRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIHRoZUNvbnRhaW5lci5lbGVtZW50Q29udGVudHNDaGFuZ2VkKGNoYW5nZWRFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgdHJhdmVyc2VUb1Jvb3RGb3JQYXRjaGluZygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGludGVybmFsIHJlY29uY2lsZSBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBET00gcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcmVmaXgoTm9kZSBub2RlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgb2xkUHJlZml4LCBTdHJpbmcgbmV3UHJlZml4KQotICB7Ci0gICAgaWYgKChuYW1lc3BhY2UgPT0gbnVsbCA/IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCA6IG5hbWVzcGFjZS5lcXVhbHMobm9kZS5nZXROYW1lc3BhY2VVUkkoKSkpICYmCi0gICAgICAgICAgKG9sZFByZWZpeCA9PSBudWxsID8gbm9kZS5nZXRQcmVmaXgoKSA9PSBudWxsIDogb2xkUHJlZml4LmVxdWFscyhub2RlLmdldFByZWZpeCgpKSkpCi0gICAgewotICAgICAgbm9kZS5zZXRQcmVmaXgobmV3UHJlZml4KTsKLSAgICB9Ci0KLSAgICBmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKQotICAgIHsKLSAgICAgIHVwZGF0ZVByZWZpeChjaGlsZCwgbmFtZXNwYWNlLCBvbGRQcmVmaXgsIG5ld1ByZWZpeCk7Ci0gICAgfQotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0gICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgZWxzZSBpZiAoZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICByZXR1cm4gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldE5hbWVzcGFjZShuYW1lLnN1YnN0cmluZygwLGluZGV4KSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TG9jYWxOYW1lKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0gICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgaWYgKCBpbmRleCA9PSAtMSkKLSAgICAgIHJldHVybiBuYW1lOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKLSAgfQotCi19IC8vV1NETEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjZGZkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBXU0RMRmFjdG9yeQotewotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETEZhY3RvcnlJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQotICB7Ci0gICAgc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEU6IHJldHVybiBjcmVhdGVQb3J0VHlwZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT046IHJldHVybiBjcmVhdGVPcGVyYXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRTogcmV0dXJuIGNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVDogcmV0dXJuIGNyZWF0ZVBhcnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElORzogcmV0dXJuIGNyZWF0ZUJpbmRpbmcoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT046IHJldHVybiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0U6IHJldHVybiBjcmVhdGVTZXJ2aWNlKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlQ6IHJldHVybiBjcmVhdGVQb3J0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVDogcmV0dXJuIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT046IHJldHVybiBjcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVDogcmV0dXJuIGNyZWF0ZUltcG9ydCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVDogcmV0dXJuIGNyZWF0ZUlucHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVDogcmV0dXJuIGNyZWF0ZU91dHB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVDogcmV0dXJuIGNyZWF0ZUZhdWx0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVQ6IHJldHVybiBjcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVQ6IHJldHVybiBjcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFQ6IHJldHVybiBjcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFOiByZXR1cm4gY3JlYXRlTmFtZXNwYWNlKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTOiByZXR1cm4gY3JlYXRlVHlwZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQ6IHJldHVybiBjcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlQ6IHJldHVybiBjcmVhdGVYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5RTkFNRToKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVFOYW1lRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9UWVBFOgotICAgICAgICByZXR1cm4gY3JlYXRlT3BlcmF0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ET01fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURPTUVsZW1lbnRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FWENFUFRJT046Ci0gICAgICAgIHJldHVybiBjcmVhdGVXU0RMRXhjZXB0aW9uRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRPTV9ET0NVTUVOVDoKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURPTURvY3VtZW50RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlFOQU1FOgotICAgICAgICByZXR1cm4gY29udmVydFFOYW1lVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX1RZUEU6Ci0gICAgICAgIHJldHVybiBjb252ZXJ0T3BlcmF0aW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRPTV9FTEVNRU5UOgotICAgICAgICByZXR1cm4gY29udmVydERPTUVsZW1lbnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VYQ0VQVElPTjoKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRXU0RMRXhjZXB0aW9uVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRE9NX0RPQ1VNRU5UOgotICAgICAgICByZXR1cm4gY29udmVydERPTURvY3VtZW50VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUG9ydFR5cGUgY3JlYXRlUG9ydFR5cGUoKQotICB7Ci0gICAgUG9ydFR5cGVJbXBsIHBvcnRUeXBlID0gbmV3IFBvcnRUeXBlSW1wbCgpOwotICAgIHJldHVybiBwb3J0VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKQotICB7Ci0gICAgT3BlcmF0aW9uSW1wbCBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uSW1wbCgpOwotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoKQotICB7Ci0gICAgTWVzc2FnZUltcGwgbWVzc2FnZSA9IG5ldyBNZXNzYWdlSW1wbCgpOwotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUGFydCBjcmVhdGVQYXJ0KCkKLSAgewotICAgIFBhcnRJbXBsIHBhcnQgPSBuZXcgUGFydEltcGwoKTsKLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmcgY3JlYXRlQmluZGluZygpCi0gIHsKLSAgICBCaW5kaW5nSW1wbCBiaW5kaW5nID0gbmV3IEJpbmRpbmdJbXBsKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKQotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbkltcGwgYmluZGluZ09wZXJhdGlvbiA9IG5ldyBCaW5kaW5nT3BlcmF0aW9uSW1wbCgpOwotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU2VydmljZSBjcmVhdGVTZXJ2aWNlKCkKLSAgewotICAgIFNlcnZpY2VJbXBsIHNlcnZpY2UgPSBuZXcgU2VydmljZUltcGwoKTsKLSAgICByZXR1cm4gc2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFBvcnQgY3JlYXRlUG9ydCgpCi0gIHsKLSAgICBQb3J0SW1wbCBwb3J0ID0gbmV3IFBvcnRJbXBsKCk7Ci0gICAgcmV0dXJuIHBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBuZXcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKCk7Ci0gICAgcmV0dXJuIGV4dGVuc2liaWxpdHlFbGVtZW50OwotICB9ICAgCi0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBjcmVhdGVEZWZpbml0aW9uKCkKLSAgewotICAgIERlZmluaXRpb25JbXBsIGRlZmluaXRpb24gPSBuZXcgRGVmaW5pdGlvbkltcGwoKTsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEltcG9ydCBjcmVhdGVJbXBvcnQoKQotICB7Ci0gICAgSW1wb3J0SW1wbCBpbXBvcnRfID0gbmV3IEltcG9ydEltcGwoKTsKLSAgICByZXR1cm4gaW1wb3J0XzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIElucHV0IGNyZWF0ZUlucHV0KCkKLSAgewotICAgIElucHV0SW1wbCBpbnB1dCA9IG5ldyBJbnB1dEltcGwoKTsKLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KCkKLSAgewotICAgIE91dHB1dEltcGwgb3V0cHV0ID0gbmV3IE91dHB1dEltcGwoKTsKLSAgICByZXR1cm4gb3V0cHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRmF1bHQgY3JlYXRlRmF1bHQoKQotICB7Ci0gICAgRmF1bHRJbXBsIGZhdWx0ID0gbmV3IEZhdWx0SW1wbCgpOwotICAgIHJldHVybiBmYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmdJbnB1dCBjcmVhdGVCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgQmluZGluZ0lucHV0SW1wbCBiaW5kaW5nSW5wdXQgPSBuZXcgQmluZGluZ0lucHV0SW1wbCgpOwotICAgIHJldHVybiBiaW5kaW5nSW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKQotICB7Ci0gICAgQmluZGluZ091dHB1dEltcGwgYmluZGluZ091dHB1dCA9IG5ldyBCaW5kaW5nT3V0cHV0SW1wbCgpOwotICAgIHJldHVybiBiaW5kaW5nT3V0cHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZ0ZhdWx0IGNyZWF0ZUJpbmRpbmdGYXVsdCgpCi0gIHsKLSAgICBCaW5kaW5nRmF1bHRJbXBsIGJpbmRpbmdGYXVsdCA9IG5ldyBCaW5kaW5nRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5hbWVzcGFjZSBjcmVhdGVOYW1lc3BhY2UoKQotICB7Ci0gICAgTmFtZXNwYWNlSW1wbCBuYW1lc3BhY2UgPSBuZXcgTmFtZXNwYWNlSW1wbCgpOwotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBUeXBlcyBjcmVhdGVUeXBlcygpCi0gIHsKLSAgICBUeXBlc0ltcGwgdHlwZXMgPSBuZXcgVHlwZXNJbXBsKCk7Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCA9IG5ldyBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKCk7Ci0gICAgcmV0dXJuIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCA9IG5ldyBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKTsKLSAgICByZXR1cm4geHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgY3JlYXRlUU5hbWVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gKFFOYW1lKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRRTmFtZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uVHlwZSBjcmVhdGVPcGVyYXRpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotICB7Ci0gICAgcmV0dXJuIChPcGVyYXRpb25UeXBlKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRPcGVyYXRpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZURPTUVsZW1lbnRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gKEVsZW1lbnQpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY29udmVydERPTUVsZW1lbnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLSAgewotICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFdTRExFeGNlcHRpb24gY3JlYXRlV1NETEV4Y2VwdGlvbkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLSAgewotICAgIHJldHVybiAoV1NETEV4Y2VwdGlvbilzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBjb252ZXJ0V1NETEV4Y2VwdGlvblRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gKERvY3VtZW50KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRET01Eb2N1bWVudFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETFBhY2thZ2UgZ2V0V1NETFBhY2thZ2UoKQotICB7Ci0gICAgcmV0dXJuIChXU0RMUGFja2FnZSlnZXRFUGFja2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdTRExQYWNrYWdlIGdldFBhY2thZ2UoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgfQotICAKLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IFdTRExQbHVnaW4uSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KG5hbWVzcGFjZSk7Ci0gICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gIH0KLSAgCi0gIC8qCi0gIHB1YmxpYyB2b2lkIHNldEFsd2F5c1VzZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXByZWNhdGVkOiBXU0RMRmFjdG9yeUltcGwuc2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzIik7Ci0gIH0KLSAgKi8KLX0gLy9XU0RMRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvV1NETFBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2VjNGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvV1NETFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFdTRExQYWNrYWdlCi17Ci0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcG9ydFR5cGVFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgb3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIG1lc3NhZ2VFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcGFydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBwb3J0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGRlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaW1wb3J0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGV4dGVuc2libGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlucHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIG91dHB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBmYXVsdEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nSW5wdXRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgYmluZGluZ091dHB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nRmF1bHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgbmFtZXNwYWNlRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlQb3J0VHlwZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpT3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlJbnB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpT3V0cHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlGYXVsdEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpTWVzc2FnZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpUGFydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpU2VydmljZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpUG9ydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ0VDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ09wZXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ0lucHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlCaW5kaW5nT3V0cHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlCaW5kaW5nRmF1bHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlEZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlJbXBvcnRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaUxpc3RFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaU1hcEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpdXJsRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlFeHRlbnNpb25SZWdpc3RyeUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB0eXBlc0VDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpSXRlcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaVR5cGVzRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIHFOYW1lRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIG9wZXJhdGlvblR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRGF0YVR5cGUgZG9tRWxlbWVudEVEYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVEYXRhVHlwZSB3c2RsRXhjZXB0aW9uRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIGRvbURvY3VtZW50RURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLSAgICAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotICAgICAqIHBhY2thZ2UgVVJJIHZhbHVlLgotICAgICAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLSAgICAgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotICAgICAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0gICAgICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlI2VOU19VUkkKLSAgICAgKiBAc2VlICNpbml0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBXU0RMUGFja2FnZUltcGwoKQotICAgIHsKLSAgICAgICAgc3VwZXIoZU5TX1VSSSwgV1NETEZhY3RvcnkuZUlOU1RBTkNFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLSAgICAgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotICAgICAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0gICAgICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0gICAgICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotICAgICAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0gICAgICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotICAgICAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotICAgICAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLSAgICAgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotICAgICAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0gICAgICogdGhvc2Ugb2YgYW5vdGhlci4KLSAgICAgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0gICAgICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZU5TX1VSSQotICAgICAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV1NETFBhY2thZ2UgaW5pdCgpCi0gICAgewotICAgICAgICBpZiAoaXNJbml0ZWQpIHJldHVybiAoV1NETFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSk7Ci0KLSAgICAgICAgLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotICAgICAgICBXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBXU0RMUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXU0RMUGFja2FnZUltcGwoKSk7Ci0KLSAgICAgICAgaXNJbml0ZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotICAgICAgICBYU0RQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLSAgICAgICAgdGhlV1NETFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLSAgICAgICAgdGhlV1NETFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0gICAgICAgIC8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLSAgICAgICAgdGhlV1NETFBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoZVdTRExQYWNrYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETEVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdzZGxFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExFbGVtZW50X0RvY3VtZW50YXRpb25FbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgd3NkbEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMRWxlbWVudF9FbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgd3NkbEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFBvcnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwb3J0VHlwZUVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9RTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBvcnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfVW5kZWZpbmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBvcnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfUmVzb3VyY2VVUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwb3J0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRUeXBlX0VPcGVyYXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldE9wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9TdHlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgb3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3BlcmF0aW9uX1VuZGVmaW5lZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9SZXNvdXJjZVVSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBvcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRPcGVyYXRpb25fRU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FRmF1bHRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgb3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbWVzc2FnZUVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1FOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgbWVzc2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VfVW5kZWZpbmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgbWVzc2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VfUHJveHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBtZXNzYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZV9SZXNvdXJjZVVSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlX0VQYXJ0cygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFBhcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhcnRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFydF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFBhcnRfRWxlbWVudE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFydF9UeXBlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBhcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJ0X1R5cGVEZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcnRfRU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBwYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRCaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEJpbmRpbmdfUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19VbmRlZmluZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGJpbmRpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1Jlc291cmNlVVJJKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRVBvcnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRUJpbmRpbmdPcGVyYXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FT3BlcmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ09wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ09wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdGYXVsdHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VfUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBzZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZV9VbmRlZmluZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBzZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZV9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1Jlc291cmNlVVJJKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgc2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VfRVBvcnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0UG9ydCgpCi0gICAgewotICAgICAgICByZXR1cm4gcG9ydEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0X05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydF9FQmluZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudF9SZXF1aXJlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0RGVmaW5pdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gZGVmaW5pdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX1RhcmdldE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX0xvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldERlZmluaXRpb25fUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVmaW5pdGlvbl9FbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VNZXNzYWdlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VQb3J0VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FU2VydmljZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FTmFtZXNwYWNlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VUeXBlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VJbXBvcnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEltcG9ydCgpCi0gICAgewotICAgICAgICByZXR1cm4gaW1wb3J0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEltcG9ydF9OYW1lc3BhY2VVUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbXBvcnRfTG9jYXRpb25VUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRURlZmluaXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRVNjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGltcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2libGVFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBleHRlbnNpYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlucHV0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0T3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmF1bHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRCaW5kaW5nSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdJbnB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nSW5wdXRfTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGJpbmRpbmdJbnB1dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdJbnB1dF9FSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBiaW5kaW5nSW5wdXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEJpbmRpbmdPdXRwdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdPdXRwdXRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ091dHB1dF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ091dHB1dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPdXRwdXRfRU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdPdXRwdXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEJpbmRpbmdGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmluZGluZ0ZhdWx0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEJpbmRpbmdGYXVsdF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ0ZhdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdGYXVsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0TmFtZXNwYWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZXNwYWNlX1VSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG5hbWVzcGFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVzcGFjZV9QcmVmaXgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBuYW1lc3BhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElQb3J0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gaVBvcnRUeXBlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU9wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaU9wZXJhdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUlucHV0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaU91dHB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUZhdWx0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlNZXNzYWdlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVBhcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlQYXJ0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVNlcnZpY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlTZXJ2aWNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVBvcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlQb3J0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmdPcGVyYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmdJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUJpbmRpbmdJbnB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElCaW5kaW5nT3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpQmluZGluZ091dHB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElCaW5kaW5nRmF1bHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nRmF1bHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElEZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpRGVmaW5pdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElJbXBvcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlJbXBvcnRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUxpc3RFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJTWFwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpTWFwRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVVSTCgpCi0gICAgewotICAgICAgICByZXR1cm4gaXVybEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElFeHRlbnNpb25SZWdpc3RyeSgpCi0gICAgewotICAgICAgICByZXR1cm4gaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGVzRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUl0ZXJhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpSXRlcmF0b3JFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJVHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlUeXBlc0VDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudF9DaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50X1NjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VSZWZlcmVuY2VfTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlUmVmZXJlbmNlX0VNZXNzYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgbWVzc2FnZVJlZmVyZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0UU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0T3BlcmF0aW9uVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uVHlwZUVEYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRURhdGFUeXBlIGdldERPTUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvbUVsZW1lbnRFRGF0YVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVEYXRhVHlwZSBnZXRXU0RMRXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3c2RsRXhjZXB0aW9uRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0RE9NRG9jdW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvbURvY3VtZW50RURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBXU0RMRmFjdG9yeSBnZXRXU0RMRmFjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gKFdTRExGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0gICAgICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgewotICAgICAgICBpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0gICAgICAgIGlzQ3JlYXRlZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0gICAgICAgIHdzZGxFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTRExfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbEVsZW1lbnRFQ2xhc3MsIFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsRWxlbWVudEVDbGFzcywgV1NETF9FTEVNRU5UX19FTEVNRU5UKTsKLQotICAgICAgICBwb3J0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUX1RZUEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0VHlwZUVDbGFzcywgUE9SVF9UWVBFX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0VHlwZUVDbGFzcywgUE9SVF9UWVBFX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX0VPUEVSQVRJT05TKTsKLQotICAgICAgICBvcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1BFUkFUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fU1RZTEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fVU5ERUZJTkVEKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fUFJPWFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19FSU5QVVQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19FT1VUUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fRUZBVUxUUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uob3BlcmF0aW9uRUNsYXNzLCBPUEVSQVRJT05fX0VQQVJBTUVURVJfT1JERVJJTkcpOwotCi0gICAgICAgIG1lc3NhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fUU5BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VFQ2xhc3MsIE1FU1NBR0VfX1VOREVGSU5FRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fUFJPWFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VFQ2xhc3MsIE1FU1NBR0VfX1JFU09VUkNFX1VSSSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fRVBBUlRTKTsKLQotICAgICAgICBwYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUlQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBhcnRFQ2xhc3MsIFBBUlRfX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBhcnRFQ2xhc3MsIFBBUlRfX0VMRU1FTlRfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUocGFydEVDbGFzcywgUEFSVF9fVFlQRV9OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShwYXJ0RUNsYXNzLCBQQVJUX19UWVBFX0RFRklOSVRJT04pOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBhcnRFQ2xhc3MsIFBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT04pOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBhcnRFQ2xhc3MsIFBBUlRfX0VNRVNTQUdFKTsKLQotICAgICAgICBiaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShiaW5kaW5nRUNsYXNzLCBCSU5ESU5HX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShiaW5kaW5nRUNsYXNzLCBCSU5ESU5HX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX0VQT1JUX1RZUEUpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlMpOwotCi0gICAgICAgIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQklORElOR19PUEVSQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIEJJTkRJTkdfT1BFUkFUSU9OX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ09wZXJhdGlvbkVDbGFzcywgQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTKTsKLQotICAgICAgICBzZXJ2aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRUNsYXNzLCBTRVJWSUNFX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRUNsYXNzLCBTRVJWSUNFX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX0VQT1JUUyk7Ci0KLSAgICAgICAgcG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0RUNsYXNzLCBQT1JUX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShwb3J0RUNsYXNzLCBQT1JUX19FQklORElORyk7Ci0KLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVhURU5TSUJJTElUWV9FTEVNRU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFKTsKLQotICAgICAgICBkZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFRklOSVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0xPQ0FUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19RTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRU5DT0RJTkcpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0VNRVNTQUdFUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVBPUlRfVFlQRVMpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0VCSU5ESU5HUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVNFUlZJQ0VTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19FTkFNRVNQQUNFUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVRZUEVTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19FSU1QT1JUUyk7Ci0KLSAgICAgICAgaW1wb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElNUE9SVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoaW1wb3J0RUNsYXNzLCBJTVBPUlRfX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGltcG9ydEVDbGFzcywgSU1QT1JUX19MT0NBVElPTl9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGltcG9ydEVDbGFzcywgSU1QT1JUX19FREVGSU5JVElPTik7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoaW1wb3J0RUNsYXNzLCBJTVBPUlRfX0VTQ0hFTUEpOwotCi0gICAgICAgIGV4dGVuc2libGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYVEVOU0lCTEVfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMpOwotCi0gICAgICAgIGlucHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElOUFVUKTsKLQotICAgICAgICBvdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1VUUFVUKTsKLQotICAgICAgICBmYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGQVVMVCk7Ci0KLSAgICAgICAgYmluZGluZ0lucHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkdfSU5QVVQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdJbnB1dEVDbGFzcywgQklORElOR19JTlBVVF9fTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ0lucHV0RUNsYXNzLCBCSU5ESU5HX0lOUFVUX19FSU5QVVQpOwotCi0gICAgICAgIGJpbmRpbmdPdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQklORElOR19PVVRQVVQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIEJJTkRJTkdfT1VUUFVUX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3V0cHV0RUNsYXNzLCBCSU5ESU5HX09VVFBVVF9fRU9VVFBVVCk7Ci0KLSAgICAgICAgYmluZGluZ0ZhdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkdfRkFVTFQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdGYXVsdEVDbGFzcywgQklORElOR19GQVVMVF9fTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ0ZhdWx0RUNsYXNzLCBCSU5ESU5HX0ZBVUxUX19FRkFVTFQpOwotCi0gICAgICAgIG5hbWVzcGFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FU1BBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG5hbWVzcGFjZUVDbGFzcywgTkFNRVNQQUNFX19VUkkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG5hbWVzcGFjZUVDbGFzcywgTkFNRVNQQUNFX19QUkVGSVgpOwotCi0gICAgICAgIGlQb3J0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJUE9SVF9UWVBFKTsKLQotICAgICAgICBpT3BlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElPUEVSQVRJT04pOwotCi0gICAgICAgIGlJbnB1dEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSU5QVVQpOwotCi0gICAgICAgIGlPdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU9VVFBVVCk7Ci0KLSAgICAgICAgaUZhdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElGQVVMVCk7Ci0KLSAgICAgICAgaU1lc3NhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1FU1NBR0UpOwotCi0gICAgICAgIGlQYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElQQVJUKTsKLQotICAgICAgICBpU2VydmljZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJU0VSVklDRSk7Ci0KLSAgICAgICAgaVBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVBPUlQpOwotCi0gICAgICAgIGlCaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKElCSU5ESU5HKTsKLQotICAgICAgICBpQmluZGluZ09wZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJQklORElOR19PUEVSQVRJT04pOwotCi0gICAgICAgIGlCaW5kaW5nSW5wdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUJJTkRJTkdfSU5QVVQpOwotCi0gICAgICAgIGlCaW5kaW5nT3V0cHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElCSU5ESU5HX09VVFBVVCk7Ci0KLSAgICAgICAgaUJpbmRpbmdGYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJQklORElOR19GQVVMVCk7Ci0KLSAgICAgICAgaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKElFWFRFTlNJQklMSVRZX0VMRU1FTlQpOwotCi0gICAgICAgIGlEZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElERUZJTklUSU9OKTsKLQotICAgICAgICBpSW1wb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElJTVBPUlQpOwotCi0gICAgICAgIGlMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElMSVNUKTsKLQotICAgICAgICBpTWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKElNQVApOwotCi0gICAgICAgIGl1cmxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVVSTCk7Ci0KLSAgICAgICAgaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKElFWFRFTlNJT05fUkVHSVNUUlkpOwotCi0gICAgICAgIHR5cGVzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRZUEVTKTsKLQotICAgICAgICBpSXRlcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUlURVJBVE9SKTsKLQotICAgICAgICBpVHlwZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVRZUEVTKTsKLQotICAgICAgICB1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOKTsKLQotICAgICAgICB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUEpOwotCi0gICAgICAgIG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9SRUZFUkVOQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MsIE1FU1NBR0VfUkVGRVJFTkNFX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlUmVmZXJlbmNlRUNsYXNzLCBNRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0UpOwotCi0gICAgICAgIC8vIENyZWF0ZSBkYXRhIHR5cGVzCi0gICAgICAgIHFOYW1lRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFFOQU1FKTsKLSAgICAgICAgb3BlcmF0aW9uVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShPUEVSQVRJT05fVFlQRSk7Ci0gICAgICAgIGRvbUVsZW1lbnRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRE9NX0VMRU1FTlQpOwotICAgICAgICB3c2RsRXhjZXB0aW9uRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFdTRExfRVhDRVBUSU9OKTsKLSAgICAgICAgZG9tRG9jdW1lbnRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRE9NX0RPQ1VNRU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLSAgICAgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0gICAgICAgIHNldE5hbWUoZU5BTUUpOwotICAgICAgICBzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLSAgICAgICAgc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLSAgICAgICAgLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotICAgICAgICBYU0RQYWNrYWdlSW1wbCB0aGVYU0RQYWNrYWdlID0gKFhTRFBhY2thZ2VJbXBsKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYU0RQYWNrYWdlLmVOU19VUkkpOwotCi0gICAgICAgIC8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLSAgICAgICAgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXU0RMRWxlbWVudCgpKTsKLSAgICAgICAgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJUG9ydFR5cGUoKSk7Ci0gICAgICAgIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBvcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJT3BlcmF0aW9uKCkpOwotICAgICAgICBtZXNzYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gICAgICAgIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJTWVzc2FnZSgpKTsKLSAgICAgICAgcGFydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBwYXJ0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SVBhcnQoKSk7Ci0gICAgICAgIGJpbmRpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nKCkpOwotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKSk7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpKTsKLSAgICAgICAgc2VydmljZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2libGVFbGVtZW50KCkpOwotICAgICAgICBzZXJ2aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SVNlcnZpY2UoKSk7Ci0gICAgICAgIHBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElQb3J0KCkpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICAgICAgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2libGVFbGVtZW50KCkpOwotICAgICAgICBkZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SURlZmluaXRpb24oKSk7Ci0gICAgICAgIGltcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBpbXBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSW1wb3J0KCkpOwotICAgICAgICBleHRlbnNpYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBpbnB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1lc3NhZ2VSZWZlcmVuY2UoKSk7Ci0gICAgICAgIGlucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gICAgICAgIGlucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUlucHV0KCkpOwotICAgICAgICBvdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXNzYWdlUmVmZXJlbmNlKCkpOwotICAgICAgICBvdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXU0RMRWxlbWVudCgpKTsKLSAgICAgICAgb3V0cHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SU91dHB1dCgpKTsKLSAgICAgICAgZmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXNzYWdlUmVmZXJlbmNlKCkpOwotICAgICAgICBmYXVsdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBmYXVsdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElGYXVsdCgpKTsKLSAgICAgICAgYmluZGluZ0lucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKSk7Ci0gICAgICAgIGJpbmRpbmdJbnB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nSW5wdXQoKSk7Ci0gICAgICAgIGJpbmRpbmdPdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ091dHB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nT3V0cHV0KCkpOwotICAgICAgICBiaW5kaW5nRmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ0ZhdWx0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUJpbmRpbmdGYXVsdCgpKTsKLSAgICAgICAgdHlwZXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgdHlwZXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJVHlwZXMoKSk7Ci0gICAgICAgIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgICAgICB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgICAgICBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLSAgICAgICAgaW5pdEVDbGFzcyh3c2RsRWxlbWVudEVDbGFzcywgV1NETEVsZW1lbnQuY2xhc3MsICJXU0RMRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMRWxlbWVudF9Eb2N1bWVudGF0aW9uRWxlbWVudCgpLCB0aGlzLmdldERPTUVsZW1lbnQoKSwgImRvY3VtZW50YXRpb25FbGVtZW50IiwgbnVsbCwgMCwgMSwgV1NETEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTRExFbGVtZW50X0VsZW1lbnQoKSwgdGhpcy5nZXRET01FbGVtZW50KCksICJlbGVtZW50IiwgbnVsbCwgMCwgMSwgV1NETEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbih3c2RsRWxlbWVudEVDbGFzcywgdGhpcy5nZXREZWZpbml0aW9uKCksICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIik7Ci0KLSAgICAgICAgRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24od3NkbEVsZW1lbnRFQ2xhc3MsIG51bGwsICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0RGVmaW5pdGlvbigpLCAiZGVmaW5pdGlvbiIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MocG9ydFR5cGVFQ2xhc3MsIFBvcnRUeXBlLmNsYXNzLCAiUG9ydFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1FOYW1lKCksIHRoaXMuZ2V0UU5hbWUoKSwgInFOYW1lIiwgbnVsbCwgMCwgMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIFBvcnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQb3J0VHlwZV9Qcm94eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInByb3h5IiwgbnVsbCwgMCwgMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1Jlc291cmNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZVVSSSIsIG51bGwsIDAsIDEsIFBvcnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQb3J0VHlwZV9FT3BlcmF0aW9ucygpLCB0aGlzLmdldE9wZXJhdGlvbigpLCBudWxsLCAiZU9wZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhvcGVyYXRpb25FQ2xhc3MsIE9wZXJhdGlvbi5jbGFzcywgIk9wZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0T3BlcmF0aW9uX1N0eWxlKCksIHRoaXMuZ2V0T3BlcmF0aW9uVHlwZSgpLCAic3R5bGUiLCBudWxsLCAwLCAxLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE9wZXJhdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRPcGVyYXRpb25fVW5kZWZpbmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidW5kZWZpbmVkIiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRPcGVyYXRpb25fUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0T3BlcmF0aW9uX1Jlc291cmNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZVVSSSIsIG51bGwsIDAsIDEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0T3BlcmF0aW9uX0VJbnB1dCgpLCB0aGlzLmdldElucHV0KCksIG51bGwsICJlSW5wdXQiLCBudWxsLCAwLCAxLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldE9wZXJhdGlvbl9FT3V0cHV0KCksIHRoaXMuZ2V0T3V0cHV0KCksIG51bGwsICJlT3V0cHV0IiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRPcGVyYXRpb25fRUZhdWx0cygpLCB0aGlzLmdldEZhdWx0KCksIG51bGwsICJlRmF1bHRzIiwgbnVsbCwgMCwgLTEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpLCB0aGlzLmdldFBhcnQoKSwgbnVsbCwgImVQYXJhbWV0ZXJPcmRlcmluZyIsIG51bGwsIDAsIC0xLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhtZXNzYWdlRUNsYXNzLCBNZXNzYWdlLmNsYXNzLCAiTWVzc2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9RTmFtZSgpLCB0aGlzLmdldFFOYW1lKCksICJxTmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VfVW5kZWZpbmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidW5kZWZpbmVkIiwgbnVsbCwgMCwgMSwgTWVzc2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9Qcm94eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInByb3h5IiwgbnVsbCwgMCwgMSwgTWVzc2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9SZXNvdXJjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VVUkkiLCBudWxsLCAwLCAxLCBNZXNzYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlX0VQYXJ0cygpLCB0aGlzLmdldFBhcnQoKSwgbnVsbCwgImVQYXJ0cyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MocGFydEVDbGFzcywgUGFydC5jbGFzcywgIlBhcnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBhcnRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFBhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBhcnRfRWxlbWVudE5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAiZWxlbWVudE5hbWUiLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQYXJ0X1R5cGVOYW1lKCksIHRoaXMuZ2V0UU5hbWUoKSwgInR5cGVOYW1lIiwgbnVsbCwgMCwgMSwgUGFydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0UGFydF9UeXBlRGVmaW5pdGlvbigpLCB0aGVYU0RQYWNrYWdlLmdldFhTRFR5cGVEZWZpbml0aW9uKCksIG51bGwsICJ0eXBlRGVmaW5pdGlvbiIsIG51bGwsIDAsIDEsIFBhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCksIHRoZVhTRFBhY2thZ2UuZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCksIG51bGwsICJlbGVtZW50RGVjbGFyYXRpb24iLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQYXJ0X0VNZXNzYWdlKCksIHRoaXMuZ2V0TWVzc2FnZSgpLCBudWxsLCAiZU1lc3NhZ2UiLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoYmluZGluZ0VDbGFzcywgQmluZGluZy5jbGFzcywgIkJpbmRpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIEJpbmRpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIEJpbmRpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUmVzb3VyY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlVVJJIiwgbnVsbCwgMCwgMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ19FUG9ydFR5cGUoKSwgdGhpcy5nZXRQb3J0VHlwZSgpLCBudWxsLCAiZVBvcnRUeXBlIiwgbnVsbCwgMSwgMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ19FQmluZGluZ09wZXJhdGlvbnMoKSwgdGhpcy5nZXRCaW5kaW5nT3BlcmF0aW9uKCksIG51bGwsICJlQmluZGluZ09wZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIEJpbmRpbmdPcGVyYXRpb24uY2xhc3MsICJCaW5kaW5nT3BlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VPcGVyYXRpb24oKSwgdGhpcy5nZXRPcGVyYXRpb24oKSwgbnVsbCwgImVPcGVyYXRpb24iLCBudWxsLCAxLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nSW5wdXQoKSwgdGhpcy5nZXRCaW5kaW5nSW5wdXQoKSwgbnVsbCwgImVCaW5kaW5nSW5wdXQiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCksIHRoaXMuZ2V0QmluZGluZ091dHB1dCgpLCBudWxsLCAiZUJpbmRpbmdPdXRwdXQiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nRmF1bHRzKCksIHRoaXMuZ2V0QmluZGluZ0ZhdWx0KCksIG51bGwsICJlQmluZGluZ0ZhdWx0cyIsIG51bGwsIDAsIC0xLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3Moc2VydmljZUVDbGFzcywgU2VydmljZS5jbGFzcywgIlNlcnZpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIFNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIFNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUmVzb3VyY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlVVJJIiwgbnVsbCwgMCwgMSwgU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZV9FUG9ydHMoKSwgdGhpcy5nZXRQb3J0KCksIG51bGwsICJlUG9ydHMiLCBudWxsLCAwLCAtMSwgU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHBvcnRFQ2xhc3MsIFBvcnQuY2xhc3MsICJQb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQb3J0X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQb3J0X0VCaW5kaW5nKCksIHRoaXMuZ2V0QmluZGluZygpLCBudWxsLCAiZUJpbmRpbmciLCBudWxsLCAxLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIEV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEV4dGVuc2liaWxpdHlFbGVtZW50X1JlcXVpcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVxdWlyZWQiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKSwgdGhpcy5nZXRRTmFtZSgpLCAiZWxlbWVudFR5cGUiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZGVmaW5pdGlvbkVDbGFzcywgRGVmaW5pdGlvbi5jbGFzcywgIkRlZmluaXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldERlZmluaXRpb25fVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAwLCAxLCBEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXREZWZpbml0aW9uX0xvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhdGlvbiIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldERlZmluaXRpb25fUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXREZWZpbml0aW9uX0VuY29kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlbmNvZGluZyIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRU1lc3NhZ2VzKCksIHRoaXMuZ2V0TWVzc2FnZSgpLCBudWxsLCAiZU1lc3NhZ2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVBvcnRUeXBlcygpLCB0aGlzLmdldFBvcnRUeXBlKCksIG51bGwsICJlUG9ydFR5cGVzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRUJpbmRpbmdzKCksIHRoaXMuZ2V0QmluZGluZygpLCBudWxsLCAiZUJpbmRpbmdzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVNlcnZpY2VzKCksIHRoaXMuZ2V0U2VydmljZSgpLCBudWxsLCAiZVNlcnZpY2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKSwgdGhpcy5nZXROYW1lc3BhY2UoKSwgbnVsbCwgImVOYW1lc3BhY2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVR5cGVzKCksIHRoaXMuZ2V0VHlwZXMoKSwgbnVsbCwgImVUeXBlcyIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRUltcG9ydHMoKSwgdGhpcy5nZXRJbXBvcnQoKSwgbnVsbCwgImVJbXBvcnRzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihkZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldERPTURvY3VtZW50KCksICJnZXREb2N1bWVudCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihkZWZpbml0aW9uRUNsYXNzLCBudWxsLCAic2V0RG9jdW1lbnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRET01Eb2N1bWVudCgpLCAiZG9jdW1lbnQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGltcG9ydEVDbGFzcywgSW1wb3J0LmNsYXNzLCAiSW1wb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRJbXBvcnRfTmFtZXNwYWNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiLCBudWxsLCAwLCAxLCBJbXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEltcG9ydF9Mb2NhdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb25VUkkiLCBudWxsLCAwLCAxLCBJbXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldEltcG9ydF9FRGVmaW5pdGlvbigpLCB0aGlzLmdldERlZmluaXRpb24oKSwgbnVsbCwgImVEZWZpbml0aW9uIiwgbnVsbCwgMCwgMSwgSW1wb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRJbXBvcnRfRVNjaGVtYSgpLCB0aGVYU0RQYWNrYWdlLmdldFhTRFNjaGVtYSgpLCBudWxsLCAiZVNjaGVtYSIsIG51bGwsIDAsIDEsIEltcG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGltcG9ydEVDbGFzcywgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgImdldFNjaGVtYSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpbXBvcnRFQ2xhc3MsIG51bGwsICJzZXRTY2hlbWEiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgInNjaGVtYSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIEV4dGVuc2libGVFbGVtZW50LmNsYXNzLCAiRXh0ZW5zaWJsZUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0RXh0ZW5zaWJsZUVsZW1lbnRfRUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCksIG51bGwsICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIEV4dGVuc2libGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihleHRlbnNpYmxlRWxlbWVudEVDbGFzcywgbnVsbCwgImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUV4dGVuc2liaWxpdHlFbGVtZW50KCksICJleHRFbGVtZW50Iik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpbnB1dEVDbGFzcywgSW5wdXQuY2xhc3MsICJJbnB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKG91dHB1dEVDbGFzcywgT3V0cHV0LmNsYXNzLCAiT3V0cHV0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZmF1bHRFQ2xhc3MsIEZhdWx0LmNsYXNzLCAiRmF1bHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhiaW5kaW5nSW5wdXRFQ2xhc3MsIEJpbmRpbmdJbnB1dC5jbGFzcywgIkJpbmRpbmdJbnB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0QmluZGluZ0lucHV0X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nSW5wdXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldEJpbmRpbmdJbnB1dF9FSW5wdXQoKSwgdGhpcy5nZXRJbnB1dCgpLCBudWxsLCAiZUlucHV0IiwgbnVsbCwgMSwgMSwgQmluZGluZ0lucHV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oYmluZGluZ0lucHV0RUNsYXNzLCB0aGlzLmdldElJbnB1dCgpLCAiZ2V0SW5wdXQiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oYmluZGluZ0lucHV0RUNsYXNzLCBudWxsLCAic2V0SW5wdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJSW5wdXQoKSwgImlucHV0Iik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhiaW5kaW5nT3V0cHV0RUNsYXNzLCBCaW5kaW5nT3V0cHV0LmNsYXNzLCAiQmluZGluZ091dHB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0QmluZGluZ091dHB1dF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgQmluZGluZ091dHB1dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ091dHB1dF9FT3V0cHV0KCksIHRoaXMuZ2V0T3V0cHV0KCksIG51bGwsICJlT3V0cHV0IiwgbnVsbCwgMSwgMSwgQmluZGluZ091dHB1dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIHRoaXMuZ2V0SU91dHB1dCgpLCAiZ2V0T3V0cHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIG51bGwsICJzZXRPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3V0cHV0KCksICJvdXRwdXQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGJpbmRpbmdGYXVsdEVDbGFzcywgQmluZGluZ0ZhdWx0LmNsYXNzLCAiQmluZGluZ0ZhdWx0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nRmF1bHRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEJpbmRpbmdGYXVsdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpLCB0aGlzLmdldEZhdWx0KCksIG51bGwsICJlRmF1bHQiLCBudWxsLCAxLCAxLCBCaW5kaW5nRmF1bHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihiaW5kaW5nRmF1bHRFQ2xhc3MsIHRoaXMuZ2V0SUZhdWx0KCksICJnZXRGYXVsdCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihiaW5kaW5nRmF1bHRFQ2xhc3MsIG51bGwsICJzZXRGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElGYXVsdCgpLCAiZmF1bHQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKG5hbWVzcGFjZUVDbGFzcywgTmFtZXNwYWNlLmNsYXNzLCAiTmFtZXNwYWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXROYW1lc3BhY2VfVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJVUkkiLCBudWxsLCAwLCAxLCBOYW1lc3BhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE5hbWVzcGFjZV9QcmVmaXgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByZWZpeCIsIG51bGwsIDAsIDEsIE5hbWVzcGFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlQb3J0VHlwZUVDbGFzcywgamF2YXgud3NkbC5Qb3J0VHlwZS5jbGFzcywgIklQb3J0VHlwZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpUG9ydFR5cGVFQ2xhc3MsIG51bGwsICJhZGRPcGVyYXRpb24iKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3BlcmF0aW9uKCksICJvcGVyYXRpb24iKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVBvcnRUeXBlRUNsYXNzLCB0aGlzLmdldElPcGVyYXRpb24oKSwgImdldE9wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5wdXROYW1lIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvdXRwdXROYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpUG9ydFR5cGVFQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldE9wZXJhdGlvbnMiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlPcGVyYXRpb25FQ2xhc3MsIGphdmF4LndzZGwuT3BlcmF0aW9uLmNsYXNzLCAiSU9wZXJhdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpT3BlcmF0aW9uRUNsYXNzLCBudWxsLCAiYWRkRmF1bHQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJRmF1bHQoKSwgImZhdWx0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUZhdWx0KCksICJnZXRGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaU9wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRGYXVsdHMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldFBhcmFtZXRlck9yZGVyaW5nIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRQYXJhbWV0ZXJPcmRlcmluZyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElMaXN0KCksICJwYXJhbWV0ZXJPcmRlciIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaU9wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJSW5wdXQoKSwgImdldElucHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRJbnB1dCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElJbnB1dCgpLCAiaW5wdXQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SU91dHB1dCgpLCAiZ2V0T3V0cHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3V0cHV0KCksICJvdXRwdXQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlJbnB1dEVDbGFzcywgamF2YXgud3NkbC5JbnB1dC5jbGFzcywgIklJbnB1dCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUlucHV0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlJbnB1dEVDbGFzcywgbnVsbCwgInNldE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU91dHB1dEVDbGFzcywgamF2YXgud3NkbC5PdXRwdXQuY2xhc3MsICJJT3V0cHV0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpT3V0cHV0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPdXRwdXRFQ2xhc3MsIG51bGwsICJzZXRNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SU1lc3NhZ2UoKSwgIm1lc3NhZ2UiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlGYXVsdEVDbGFzcywgamF2YXgud3NkbC5GYXVsdC5jbGFzcywgIklGYXVsdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUZhdWx0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlGYXVsdEVDbGFzcywgbnVsbCwgInNldE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU1lc3NhZ2VFQ2xhc3MsIGphdmF4LndzZGwuTWVzc2FnZS5jbGFzcywgIklNZXNzYWdlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlNZXNzYWdlRUNsYXNzLCBudWxsLCAiYWRkUGFydCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQYXJ0KCksICJwYXJ0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlNZXNzYWdlRUNsYXNzLCB0aGlzLmdldElQYXJ0KCksICJnZXRQYXJ0Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpTWVzc2FnZUVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRQYXJ0cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpTWVzc2FnZUVDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0T3JkZXJlZFBhcnRzIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUxpc3QoKSwgInBhcnRPcmRlciIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaVBhcnRFQ2xhc3MsIGphdmF4LndzZGwuUGFydC5jbGFzcywgIklQYXJ0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlQYXJ0RUNsYXNzLCBudWxsLCAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRRTmFtZSgpLCAidmFsdWUiKTsKLSAgICAgICAgYWRkRUV4Y2VwdGlvbihvcCwgdGhpcy5nZXRXU0RMRXhjZXB0aW9uKCkpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVBhcnRFQ2xhc3MsIHRoaXMuZ2V0SUl0ZXJhdG9yKCksICJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpUGFydEVDbGFzcywgdGhpcy5nZXRRTmFtZSgpLCAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlTZXJ2aWNlRUNsYXNzLCBqYXZheC53c2RsLlNlcnZpY2UuY2xhc3MsICJJU2VydmljZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpU2VydmljZUVDbGFzcywgbnVsbCwgImFkZFBvcnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJUG9ydCgpLCAicG9ydCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVNlcnZpY2VFQ2xhc3MsIHRoaXMuZ2V0SU1hcCgpLCAiZ2V0UG9ydHMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVNlcnZpY2VFQ2xhc3MsIHRoaXMuZ2V0SVBvcnQoKSwgImdldFBvcnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlQb3J0RUNsYXNzLCBqYXZheC53c2RsLlBvcnQuY2xhc3MsICJJUG9ydCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVBvcnRFQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmcoKSwgImdldEJpbmRpbmciKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVBvcnRFQ2xhc3MsIG51bGwsICJzZXRCaW5kaW5nIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUJpbmRpbmcoKSwgImJpbmRpbmciKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nRUNsYXNzLCBqYXZheC53c2RsLkJpbmRpbmcuY2xhc3MsICJJQmluZGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgbnVsbCwgImFkZEJpbmRpbmdPcGVyYXRpb24iKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpLCAiYmluZGluZ09wZXJhdGlvbiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgdGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpLCAiZ2V0QmluZGluZ09wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5wdXROYW1lIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvdXRwdXROYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0QmluZGluZ09wZXJhdGlvbnMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nRUNsYXNzLCB0aGlzLmdldElQb3J0VHlwZSgpLCAiZ2V0UG9ydFR5cGUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaUJpbmRpbmdFQ2xhc3MsIG51bGwsICJzZXRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQb3J0VHlwZSgpLCAicG9ydFR5cGUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24uY2xhc3MsICJJQmluZGluZ09wZXJhdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgImFkZEJpbmRpbmdGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElCaW5kaW5nRmF1bHQoKSwgImJpbmRpbmdGYXVsdCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ0ZhdWx0KCksICJnZXRCaW5kaW5nRmF1bHQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldEJpbmRpbmdGYXVsdHMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCB0aGlzLmdldElPcGVyYXRpb24oKSwgImdldE9wZXJhdGlvbiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgInNldE9wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElPcGVyYXRpb24oKSwgIm9wZXJhdGlvbiIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiZ2V0QmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBudWxsLCAic2V0QmluZGluZ0lucHV0Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiYmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiZ2V0QmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgInNldEJpbmRpbmdPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiYmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUJpbmRpbmdJbnB1dEVDbGFzcywgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQuY2xhc3MsICJJQmluZGluZ0lucHV0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpQmluZGluZ091dHB1dEVDbGFzcywgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0LmNsYXNzLCAiSUJpbmRpbmdPdXRwdXQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nRmF1bHRFQ2xhc3MsIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0LmNsYXNzLCAiSUJpbmRpbmdGYXVsdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQuY2xhc3MsICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlEZWZpbml0aW9uRUNsYXNzLCBqYXZheC53c2RsLkRlZmluaXRpb24uY2xhc3MsICJJRGVmaW5pdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZEJpbmRpbmciKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZygpLCAiYmluZGluZyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZEltcG9ydCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElJbXBvcnQoKSwgImltcG9ydERlZiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZE5hbWVzcGFjZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJlZml4Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJhZGRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQb3J0VHlwZSgpLCAicG9ydFR5cGUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJhZGRTZXJ2aWNlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SVNlcnZpY2UoKSwgInNlcnZpY2UiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nRmF1bHQoKSwgImNyZWF0ZUJpbmRpbmdGYXVsdCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiY3JlYXRlQmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiY3JlYXRlQmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdPcGVyYXRpb24oKSwgImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nKCksICJjcmVhdGVCaW5kaW5nIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJRmF1bHQoKSwgImNyZWF0ZUZhdWx0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJSW1wb3J0KCksICJjcmVhdGVJbXBvcnQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElJbnB1dCgpLCAiY3JlYXRlSW5wdXQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJjcmVhdGVNZXNzYWdlIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJT3BlcmF0aW9uKCksICJjcmVhdGVPcGVyYXRpb24iKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElPdXRwdXQoKSwgImNyZWF0ZU91dHB1dCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBhcnQoKSwgImNyZWF0ZVBhcnQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElQb3J0KCksICJjcmVhdGVQb3J0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJUG9ydFR5cGUoKSwgImNyZWF0ZVBvcnRUeXBlIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAiY3JlYXRlU2VydmljZSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZygpLCAiZ2V0QmluZGluZyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRCaW5kaW5ncyIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SU1hcCgpLCAiZ2V0SW1wb3J0cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0SW1wb3J0cyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldE1lc3NhZ2VzIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0TmFtZXNwYWNlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwcmVmaXgiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldE5hbWVzcGFjZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBvcnRUeXBlKCksICJnZXRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRQb3J0VHlwZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRQcmVmaXgiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVSSSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAiZ2V0U2VydmljZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRTZXJ2aWNlcyIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUV4dGVuc2lvblJlZ2lzdHJ5KCksICJnZXRFeHRlbnNpb25SZWdpc3RyeSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgInNldEV4dGVuc2lvblJlZ2lzdHJ5Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUV4dGVuc2lvblJlZ2lzdHJ5KCksICJleHRlbnNpb25SZWdpc3RyeSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXREb2N1bWVudEJhc2VVUkkiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJzZXREb2N1bWVudEJhc2VVUkkiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRvY3VtZW50QmFzZSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVR5cGVzKCksICJjcmVhdGVUeXBlcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAicmVtb3ZlU2VydmljZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nKCksICJyZW1vdmVCaW5kaW5nIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBvcnRUeXBlKCksICJyZW1vdmVQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJyZW1vdmVNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElUeXBlcygpLCAiZ2V0VHlwZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJzZXRUeXBlcyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElUeXBlcygpLCAidHlwZXMiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlJbXBvcnRFQ2xhc3MsIGphdmF4LndzZGwuSW1wb3J0LmNsYXNzLCAiSUltcG9ydCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUxpc3RFQ2xhc3MsIExpc3QuY2xhc3MsICJJTGlzdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU1hcEVDbGFzcywgTWFwLmNsYXNzLCAiSU1hcCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaXVybEVDbGFzcywgVVJMLmNsYXNzLCAiSVVSTCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzLCBFeHRlbnNpb25SZWdpc3RyeS5jbGFzcywgIklFeHRlbnNpb25SZWdpc3RyeSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3ModHlwZXNFQ2xhc3MsIFR5cGVzLmNsYXNzLCAiVHlwZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbih0eXBlc0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0U2NoZW1hcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbih0eXBlc0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0U2NoZW1hcyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpSXRlcmF0b3JFQ2xhc3MsIEl0ZXJhdG9yLmNsYXNzLCAiSUl0ZXJhdG9yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpVHlwZXNFQ2xhc3MsIGphdmF4LndzZGwuVHlwZXMuY2xhc3MsICJJVHlwZXMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRfQ2hpbGRyZW4oKSwgdGhpcy5nZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSwgbnVsbCwgImNoaWxkcmVuIiwgbnVsbCwgMCwgLTEsIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLCBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudF9TY2hlbWEoKSwgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgbnVsbCwgInNjaGVtYSIsIG51bGwsIDAsIDEsIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MobWVzc2FnZVJlZmVyZW5jZUVDbGFzcywgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIk1lc3NhZ2VSZWZlcmVuY2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZVJlZmVyZW5jZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZVJlZmVyZW5jZV9FTWVzc2FnZSgpLCB0aGlzLmdldE1lc3NhZ2UoKSwgbnVsbCwgImVNZXNzYWdlIiwgbnVsbCwgMSwgMSwgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLSAgICAgICAgaW5pdEVEYXRhVHlwZShxTmFtZUVEYXRhVHlwZSwgUU5hbWUuY2xhc3MsICJRTmFtZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUob3BlcmF0aW9uVHlwZUVEYXRhVHlwZSwgT3BlcmF0aW9uVHlwZS5jbGFzcywgIk9wZXJhdGlvblR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RURhdGFUeXBlKGRvbUVsZW1lbnRFRGF0YVR5cGUsIEVsZW1lbnQuY2xhc3MsICJET01FbGVtZW50IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVEYXRhVHlwZSh3c2RsRXhjZXB0aW9uRURhdGFUeXBlLCBXU0RMRXhjZXB0aW9uLmNsYXNzLCAiV1NETEV4Y2VwdGlvbiIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUoZG9tRG9jdW1lbnRFRGF0YVR5cGUsIERvY3VtZW50LmNsYXNzLCAiRE9NRG9jdW1lbnQiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIC8vIENyZWF0ZSByZXNvdXJjZQotICAgICAgICBjcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLSAgICB9Ci0KLX0gLy9XU0RMUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzUxY2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFNjaGVtYSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTY2hlbWEoWFNEU2NoZW1hIG5ld1NjaGVtYSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIFhTRFNjaGVtYSBvbGRTY2hlbWEgPSBzY2hlbWE7Ci0gICAgc2NoZW1hID0gbmV3U2NoZW1hOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQSwgb2xkU2NoZW1hLCBuZXdTY2hlbWEpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBuZXdTY2hlbWEpCi0gIHsKLSAgICBpZiAobmV3U2NoZW1hICE9IHNjaGVtYSkKLSAgICB7Ci0gICAgICBOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNjaGVtYSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUEsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld1NjaGVtYSAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2NoZW1hKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQSwgbnVsbCwgbXNncyk7Ci0gICAgICBtc2dzID0gYmFzaWNTZXRTY2hlbWEobmV3U2NoZW1hLCBtc2dzKTsKLSAgICAgIGlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BLCBuZXdTY2hlbWEsIG5ld1NjaGVtYSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUE6Ci0gICAgICAgICAgcmV0dXJuIGJhc2ljU2V0U2NoZW1hKG51bGwsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICByZXR1cm4gZ2V0U2NoZW1hKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICBzZXRTY2hlbWEoKFhTRFNjaGVtYSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICBzZXRTY2hlbWEoKFhTRFNjaGVtYSludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQToKLSAgICAgICAgcmV0dXJuIHNjaGVtYSAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLldTRExFbGVtZW50SW1wbCNyZWNvbmNpbGUob3JnLnczYy5kb20uRWxlbWVudCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZShFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgZWxlbWVudCA9IGNoYW5nZWRFbGVtZW50OyAvLyBUaGlzIGxpbmUgbWF5IG5vdCBuZWVkZWQuICAgIAotICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgbmV3U2NoZW1hID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVTY2hlbWEoY2hhbmdlZEVsZW1lbnQpOwotICAgICAgc2V0U2NoZW1hKG5ld1NjaGVtYSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBjcmVhdGVTY2hlbWEoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJzY2hlbWEiKSAmJiBYU0RDb25zdGFudHMuaXNTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgeyAgICAgCi0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2NoZW1hKCk7IAotICAgICAgeHNkU2NoZW1hLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICByZXR1cm4geHNkU2NoZW1hOyAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgZWxzZSBpZiAoZ2V0U2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgIGVsZW1lbnQgPSBnZXRTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0KLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBpZiAobmV3RWxlbWVudCA9PSBudWxsICYmICFpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIGVsZW1lbnQgPSBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RWxlbWVudEdlbihuZXdFbGVtZW50KTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSxYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHKTsKLQotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgbmV3RWxlbWVudFR5cGUpCi0gIHsKLSAgICAvLyBTaG91bGQgbm90IGRvIGFueXRoaW5nLgotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotICAgIGlmIChnZXRTY2hlbWEoKSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIGNzLi4uIHdoeSBkbyB3ZSBuZWVkIHRvIGRvIHRoaXM/IGlzbid0IHRoZSBzY2hlbWEgdGFraW5nIGNhcmUgb2YgdGhpcyBpdHNlbGY/Ci0gICAgLy8KLSAgICBpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5TQ0hFTUFMT0NBVElPTl9BVFRSSUJVVEUpKQotICAgICAgCWdldFNjaGVtYSgpLnNldFNjaGVtYUxvY2F0aW9uKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuU0NIRU1BTE9DQVRJT05fQVRUUklCVVRFKSk7Ci0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpCi0gICAgCWdldFNjaGVtYSgpLnNldFNjaGVtYUxvY2F0aW9uKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpOwotICB9Ci0gIAotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAJaWYgKHNjaGVtYSA9PSBudWxsKSAvLyBrYiBOb3RlOiBUaGlzIGNhc2UgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbi4KLSAgCXsgICAgIAotICAJICAvLyBjcyAuLi4gd2h5IGRvIHdlIGRvIHRoaXMgaWYgaXRzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4/Ci0gIAkgIC8vIElzIHRoZXJlIGEgc2NlbmFyaW8gd2hlcmUgdGhpcyBpcyBhIHVzZWZ1bGwgZmFsbGJhY2s/Ci0gIAkgIC8vIFVuZGVyIHdoYXQgY29uZGl0aW9ucyBkb2VzIHRoaXMgY29kZSBnZXQgZXhlY3V0ZWQgKGkuZS4gd2h5IHdvdWxkIHNjaGVtYSA9PSBudWxsKT8KLSAgICAgIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgICAgc2NoZW1hLnNldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCJ4c2QiKTsKLSAgICAgIHNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly90ZW1wdXJpLm9yZy8iKTsKLSAgICAgIGphdmEudXRpbC5NYXAgcU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCA9IHNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwLnB1dCgiIiwgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0Ci0gICAgICAgIChzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKSxvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgICAgYWRvcHQoc2NoZW1hKTsKLSAgICAgIHNjaGVtYS51cGRhdGVFbGVtZW50KHRydWUpOwotICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAJYWRvcHQoc2NoZW1hKTsKLSAgICAgICAgc2NoZW1hLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLSAgfQotIAotICBwcml2YXRlIHZvaWQgYWRvcHQoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnVwZGF0ZURvY3VtZW50KCk7Ci0gICAgCi0gICAgaWYgKHhzZFNjaGVtYS5nZXREb2N1bWVudCgpICE9IG51bGwpCi0gICAgCXhzZFNjaGVtYS5zZXREb2N1bWVudChudWxsKTsKLSAgICAKLSAgICB4c2RTY2hlbWEuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotICB9Ci0gIAotICAvKgotICBwcml2YXRlIEVsZW1lbnQgYWRvcHQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpCi0gICAgICByZXR1cm4gZWxlbWVudDsKLQotICAgIERvY3VtZW50IGRvY3VtZW50ID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudCgpOwotICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgZG9jdW1lbnQgPSAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS51cGRhdGVEb2N1bWVudCgpOwotICAgIAotICAgIHJldHVybiAoRWxlbWVudClkb2N1bWVudC5pbXBvcnROb2RlKGVsZW1lbnQsdHJ1ZSk7Ci0gIH0KLSAgKi8KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRfU2NoZW1hKCkpCi0gICAgewotICAgICAgLy8gV2UgZ290IGEgbmV3IHNjaGVtYSBzbyByZS1wYXJlbnQgaXQuCi0gICAgICBzY2hlbWEuc2V0RG9jdW1lbnQobnVsbCk7Ci0gICAgICBzY2hlbWEuc2V0RWxlbWVudChudWxsKTsKLSAgICAgIGFkb3B0KHNjaGVtYSk7Ci0gICAgICBzY2hlbWEudXBkYXRlRWxlbWVudCgpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExFbGVtZW50X0VsZW1lbnQoKSkKLSAgICB7Ci0gICAgICAvLyBBcmUgd2UgY3JlYXRpbmcgYSBzY2hlbWEgdG9vIG1hbnkgdGltZXM/Ci0gICAgICBzZXRTY2hlbWEoY3JlYXRlU2NoZW1hKGVsZW1lbnQpKTsgLy8gZWxlbWVudCBpcyBub3QgbnVsbAotICAgIH0gICAgCi0gIH0KLX0gLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYmIxODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETEZhY3RvcnlJbXBsIGV4dGVuZHMgV1NETEZhY3RvcnkKLXsKLSAgCi0gIC8vcHVibGljIHN0YXRpYyBXU0RMRmFjdG9yeSBuZXdJbnN0YW5jZSgpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIC8vewotICAvLyAgcmV0dXJuIG5ldyBXU0RMRmFjdG9yeUltcGwoKTsKLSAgLy99Ci0gIAotICBwdWJsaWMgV1NETEZhY3RvcnlJbXBsKCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgRGVmaW5pdGlvbiBuZXdEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkgbmV3UG9wdWxhdGVkRXh0ZW5zaW9uUmVnaXN0cnkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMUmVhZGVyIG5ld1dTRExSZWFkZXIoKQotICB7Ci0gICAgV1NETFJlYWRlciByZWFkZXIgPSBuZXcgV1NETFJlYWRlckltcGwoKTsKLSAgICByZWFkZXIuc2V0RmFjdG9yeUltcGxOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICByZXR1cm4gcmVhZGVyOwotICB9Ci0gIAotICBwdWJsaWMgV1NETFdyaXRlciBuZXdXU0RMV3JpdGVyKCkKLSAgewotICAgIHJldHVybiBuZXcgV1NETFdyaXRlckltcGwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETFJlYWRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExSZWFkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNmVjZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETFJlYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETExvY2F0b3I7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU0RMUmVhZGVySW1wbCBpbXBsZW1lbnRzIFdTRExSZWFkZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeUltcGxOYW1lOwotICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dFJlZzsKLSAgCi0gIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBnZXRFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gZXh0UmVnOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBleHRSZWcpCi0gIHsKLSAgICB0aGlzLmV4dFJlZyA9IGV4dFJlZzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SW1wbE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZhY3RvcnlJbXBsTmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RmFjdG9yeUltcGxOYW1lKFN0cmluZyBmYWN0b3J5SW1wbE5hbWUpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdGhpcy5mYWN0b3J5SW1wbE5hbWUgPSBmYWN0b3J5SW1wbE5hbWU7Ci0gIH0KLQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7IAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWFkIHRoZSBXU0RMIGRvY3VtZW50IGFjY2Vzc2libGUgdmlhIHRoZSBzcGVjaWZpZWQKLSAgICogVVJJIGludG8gYSBXU0RMIGRlZmluaXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB3c2RsVVJJIGEgVVJJIChjYW4gYmUgYSBmaWxlbmFtZSBvciBVUkwpIHBvaW50aW5nIHRvIGEKLSAgICogV1NETCBYTUwgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbi4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgVVJJIHVyaTsgICAgCi0gICAgaWYgKGhhc1Byb3RvY29sKHdzZGxVUkkpKQotICAgICAgIHVyaSA9IFVSSS5jcmVhdGVVUkkod3NkbFVSSSk7Ci0gICAgZWxzZQotICAgICAgIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHdzZGxVUkkpOwotICAKLSAgICAvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQsIGNyZWF0ZSBhIHdzZGwgcmVzb3VyY2UsIGFuZCBsb2FkIHRoZSBtYWluIHdzZGwgZmlsZSBpbnRvIGl0LgotICAgIAotICAJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7ICAJCi0gIAlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQotICAJV1NETFJlc291cmNlSW1wbCB3c2RsTWFpblJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi53c2RsIikpOwotICAJd3NkbE1haW5SZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgCQotICAgIHRyeQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgIHdzZGxNYWluUmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0gICAgICAvL3dzZGxNYWluUmVzb3VyY2UubG9hZChyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5JTlZBTElEX1dTREwsIldTREwgVVJJOiAiK3dzZGxVUkksZSk7Ci0gICAgfQotICAgIAotICAgIC8vIFJldHVybiB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIG1haW4gcmVzb3VyY2UuCi0gICAgcmV0dXJuIHdzZGxNYWluUmVzb3VyY2UuZ2V0RGVmaW5pdGlvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgICAgIAotCQlpZiAodXJpICE9IG51bGwpCi0JCXsKLQkJICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZigiOiIpOwotCQkgIGlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA+IDIpIC8vIGFzc3VtZSBwcm90b2NvbCB3aXRoIGJlIGxlbmd0aCAzIHNvIHRoYXQgdGhlJ0MnIGluICdDOi8nIGlzIG5vdCBpbnRlcnByZXRlZCBhcyBhIHByb3RvY29sCi0JCSAgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCSAgfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0gIH0gCi0gIAotICAvKioKLSAgICogUmVhZCB0aGUgV1NETCBkb2N1bWVudCBhY2Nlc3NpYmxlIHZpYSB0aGUgc3BlY2lmaWVkCi0gICAqIFVSSSBpbnRvIGEgV1NETCBkZWZpbml0aW9uLgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dFVSSSB0aGUgY29udGV4dCBpbiB3aGljaCB0byByZXNvbHZlIHRoZQotICAgKiB3c2RsVVJJLCBpZiB0aGUgd3NkbFVSSSBpcyByZWxhdGl2ZS4gQ2FuIGJlIG51bGwsIGluIHdoaWNoCi0gICAqIGNhc2UgaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcGFyYW0gd3NkbFVSSSBhIFVSSSAoY2FuIGJlIGEgZmlsZW5hbWUgb3IgVVJMKSBwb2ludGluZyB0byBhCi0gICAqIFdTREwgWE1MIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24uCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiByZWFkV1NETChTdHJpbmcgY29udGV4dFVSSSwgU3RyaW5nIHdzZGxVUkkpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLCJOb3QgSW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBzcGVjaWZpZWQgJmx0O3dzZGw6ZGVmaW5pdGlvbnMmZ3Q7IGVsZW1lbnQgaW50byBhIFdTREwKLSAgICogZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgb2YgdGhlIFdTREwgZGVmaW5pdGlvbgotICAgKiBkZXNjcmliZWQgYnkgdGhlIGVsZW1lbnQuIFdpbGwgYmUgc2V0IGFzIHRoZSBkb2N1bWVudEJhc2VVUkkKLSAgICogb2YgdGhlIHJldHVybmVkIERlZmluaXRpb24uIENhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGl0Ci0gICAqIHdpbGwgYmUgaWdub3JlZC4KLSAgICogQHBhcmFtIGRlZmluaXRpb25zRWxlbWVudCB0aGUgJmx0O3dzZGw6ZGVmaW5pdGlvbnMmZ3Q7IGVsZW1lbnQKLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBkZXNjcmliZWQgYnkgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiByZWFkV1NETChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBFbGVtZW50IGRlZmluaXRpb25zRWxlbWVudCkKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgc3BlY2lmaWVkIFdTREwgZG9jdW1lbnQgaW50byBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgb2YgdGhlIFdTREwgZGVmaW5pdGlvbgotICAgKiBkZXNjcmliZWQgYnkgdGhlIGRvY3VtZW50LiBXaWxsIGJlIHNldCBhcyB0aGUgZG9jdW1lbnRCYXNlVVJJCi0gICAqIG9mIHRoZSByZXR1cm5lZCBEZWZpbml0aW9uLiBDYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBpdAotICAgKiB3aWxsIGJlIGlnbm9yZWQuCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgdGhlIFdTREwgZG9jdW1lbnQsIGFuIFhNTCAKLSAgICogZG9jdW1lbnQgb2JleWluZyB0aGUgV1NETCBzY2hlbWEuCi0gICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24gZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFN0cmluZyBkb2N1bWVudEJhc2VVUkksIERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIFdTREwgZG9jdW1lbnQgaW50byBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgb2YgdGhlIFdTREwgZGVmaW5pdGlvbgotICAgKiBkZXNjcmliZWQgYnkgdGhlIGRvY3VtZW50LiBXaWxsIGJlIHNldCBhcyB0aGUgZG9jdW1lbnRCYXNlVVJJCi0gICAqIG9mIHRoZSByZXR1cm5lZCBEZWZpbml0aW9uLiBDYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBpdAotICAgKiB3aWxsIGJlIGlnbm9yZWQuCi0gICAqIEBwYXJhbSBpbnB1dFNvdXJjZSBhbiBJbnB1dFNvdXJjZSBwb2ludGluZyB0byB0aGUKLSAgICogV1NETCBkb2N1bWVudCwgYW4gWE1MIGRvY3VtZW50IG9iZXlpbmcgdGhlIFdTREwgc2NoZW1hLgotICAgKiBAcmV0dXJuIHRoZSBkZWZpbml0aW9uIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnQgcG9pbnRlZCB0bwotICAgKiBieSB0aGUgSW5wdXRTb3VyY2UuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiByZWFkV1NETChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSkKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gIAlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbE1haW5SZXNvdXJjZSA9IChXU0RMUmVzb3VyY2VJbXBsKXJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIioud3NkbCIpKTsKLQotICAJdHJ5Ci0gICAgewotICAgICAgaWYgKGRvY3VtZW50QmFzZVVSSSAhPSBudWxsKQotICAgICAgICB3c2RsTWFpblJlc291cmNlLnNldFVSSShjcmVhdGVVUkkoZG9jdW1lbnRCYXNlVVJJKSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dChXU0RMUmVzb3VyY2VJbXBsLkNPTlRJTlVFX09OX0xPQURfRVJST1IsbmV3IEJvb2xlYW4oZmFsc2UpKTsKLSAgICAgIHdzZGxNYWluUmVzb3VyY2UubG9hZChpbnB1dFNvdXJjZS5nZXRCeXRlU3RyZWFtKCksIHJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uSU5WQUxJRF9XU0RMLCAiIiwgaW9lKTsKLSAgICB9Ci0gICAgCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd3NkbE1haW5SZXNvdXJjZS5nZXREZWZpbml0aW9uKCk7Ci0gICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGRvY3VtZW50QmFzZVVSSSk7Ci0gICAgCi0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIFdTREwgZG9jdW1lbnQgaW50byBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGxvY2F0b3IgQSBXU0RMTG9jYXRvciBvYmplY3QgdXNlZCB0byBwcm92aWRlIElucHV0U291cmNlcwotICAgKiBwb2ludGluZyB0byB0aGUgd3NkbCBmaWxlLgotICAgKiBAcmV0dXJuIHRoZSBkZWZpbml0aW9uIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFdTRExMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLCJOb3QgSW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIHByaXZhdGUgVVJJIGNyZWF0ZVVSSShTdHJpbmcgdXJpU3RyaW5nKQotICB7Ci0gICAgaWYgKGhhc1Byb3RvY29sKHVyaVN0cmluZykpCi0gICAgICAgcmV0dXJuIFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKLSAgICBlbHNlCi0gICAgICAgcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKHVyaVN0cmluZyk7Ci0gIH0gCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExXcml0ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL3dzZGw0ai9XU0RMV3JpdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFmMTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExXcml0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ajsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIFdTRExXcml0ZXJJbXBsIGltcGxlbWVudHMgV1NETFdyaXRlcgotewotICAvKioKLSAgICogU2V0cyB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICogPHA+Ci0gICAqIFRoZXJlIGFyZSBubyBtaW5pbXVtIGZlYXR1cmVzIHRoYXQgbXVzdCBiZSBzdXBwb3J0ZWQuCi0gICAqIDxwPgotICAgKiBBbGwgZmVhdHVyZSBuYW1lcyBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCwgSmF2YSBwYWNrYWdlIHN0eWxlLiBBbGwKLSAgICogbmFtZXMgc3RhcnRpbmcgd2l0aCBqYXZheC53c2RsLiBhcmUgcmVzZXJ2ZWQgZm9yIGZlYXR1cmVzIGRlZmluZWQKLSAgICogYnkgdGhlIEpXU0RMIHNwZWNpZmljYXRpb24uIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgaW1wbGVtZW50YXRpb24tCi0gICAqIHNwZWNpZmljIGZlYXR1cmVzIGJlIGZ1bGx5LXF1YWxpZmllZCB0byBtYXRjaCB0aGUgcGFja2FnZSBuYW1lCi0gICAqIG9mIHRoYXQgaW1wbGVtZW50YXRpb24uIEZvciBleGFtcGxlOiBjb20uYWJjLmZlYXR1cmVOYW1lCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRvIGJlIHNldC4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQgdGhlIGZlYXR1cmUgdG8uCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmZWF0dXJlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqIEBzZWUgI2dldEZlYXR1cmUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byBnZXQgdGhlIHZhbHVlIG9mLgotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmVhdHVyZSBuYW1lIGlzIG5vdCByZWNvZ25pemVkLgotICAgKiBAc2VlICNzZXRGZWF0dXJlKFN0cmluZywgYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEZlYXR1cmUoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgewotICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCBJbXBsZW1lbnRlZCIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIGRvY3VtZW50IGdlbmVyYXRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgV1NETCBtb2RlbC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudChEZWZpbml0aW9uIHdzZGxEZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gKChEZWZpbml0aW9uSW1wbCl3c2RsRGVmKS5nZXREb2N1bWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIHRoZSBzcGVjaWZpZWQgV1NETCBkZWZpbml0aW9uIHRvIHRoZSBzcGVjaWZpZWQgV3JpdGVyLgotICAgKgotICAgKiBAcGFyYW0gd3NkbERlZiB0aGUgV1NETCBkZWZpbml0aW9uIHRvIGJlIHdyaXR0ZW4uCi0gICAqIEBwYXJhbSBzaW5rIHRoZSBXcml0ZXIgdG8gd3JpdGUgdGhlIHhtbCB0by4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlV1NETChEZWZpbml0aW9uIHdzZGxEZWYsIFdyaXRlciBzaW5rKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotCi0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLSAgICAgIAotICAgICAgLy8gVW5sZXNzIGEgd2lkdGggaXMgc2V0LCB0aGVyZSB3aWxsIGJlIG9ubHkgbGluZSBicmVha3MgYnV0IG5vIGluZGVudGF0aW9uLgotICAgICAgLy8gVGhlIElCTSBKREsgYW5kIHRoZSBTdW4gSkRLIGRvbid0IGFncmVlIG9uIHRoZSBwcm9wZXJ0eSBuYW1lLAotICAgICAgLy8gc28gd2Ugc2V0IHRoZW0gYm90aC4KLSAgICAgIC8vCi0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbn1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7Ci0gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZW5jb2RpbmcpOwotICAgICAgfQotICAgICAgCi0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpd3NkbERlZikuZ2V0RG9jdW1lbnQoKTsKLSAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICAoKERlZmluaXRpb25JbXBsKXdzZGxEZWYpLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCl3c2RsRGVmKS5nZXREb2N1bWVudCgpOwotICAgICAgfQotICAgICAgCi0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoc2luaykpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uT1RIRVJfRVJST1IsIkZhaWxlZCB0byBzYXZlIERlZmluaXRpb25zLiIsZXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSB0aGUgc3BlY2lmaWVkIFdTREwgZGVmaW5pdGlvbiB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIHdzZGxEZWYgdGhlIFdTREwgZGVmaW5pdGlvbiB0byBiZSB3cml0dGVuLgotICAgKiBAcGFyYW0gc2luayB0aGUgT3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRoZSB4bWwgdG8uCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVdTREwoRGVmaW5pdGlvbiB3c2RsRGVmLCBPdXRwdXRTdHJlYW0gc2luaykgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotCi0gICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoKERlZmluaXRpb25JbXBsKXdzZGxEZWYpLmVSZXNvdXJjZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHJlc291cmNlLnNhdmUoc2luayxudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwiRmFpbGVkIHRvIHNhdmUgRGVmaW5pdGlvbnMuIixlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvUmVjb25jaWxhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1JlY29uY2lsYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQyYTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvUmVjb25jaWxhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vLyBUT0RPLi4uIHdoeSBkbyB3ZSBuZWVkIHRoaXM/Ci0vLyAKLXB1YmxpYyBpbnRlcmZhY2UgUmVjb25jaWxhYmxlIAotewotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCk7Ci0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKTsKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KTsKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTYyZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMU3dpdGNoOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgV1NETFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETEFkYXB0ZXJGYWN0b3J5KCkKLSAgewotICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtb2RlbFBhY2thZ2UgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgIHsKLSAgICAgIHJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotICAgIG5ldyBXU0RMU3dpdGNoKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVBvcnRUeXBlKFBvcnRUeXBlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVBvcnRUeXBlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVPcGVyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlKE1lc3NhZ2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVBhcnQoUGFydCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVQYXJ0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZyhCaW5kaW5nIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2UoU2VydmljZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTZXJ2aWNlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVBvcnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSW1wb3J0KEltcG9ydCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJbXBvcnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmxlRWxlbWVudChFeHRlbnNpYmxlRWxlbWVudCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVFeHRlbnNpYmxlRWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlucHV0KElucHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlucHV0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVPdXRwdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VGYXVsdChGYXVsdCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVGYXVsdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ0lucHV0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdPdXRwdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdGYXVsdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZU5hbWVzcGFjZShOYW1lc3BhY2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlTmFtZXNwYWNlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSVBvcnRUeXBlKGphdmF4LndzZGwuUG9ydFR5cGUgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSVBvcnRUeXBlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSU9wZXJhdGlvbihqYXZheC53c2RsLk9wZXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJT3BlcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUlucHV0KGphdmF4LndzZGwuSW5wdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUlucHV0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSU91dHB1dChqYXZheC53c2RsLk91dHB1dCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJT3V0cHV0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUZhdWx0KGphdmF4LndzZGwuRmF1bHQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUZhdWx0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSU1lc3NhZ2UoamF2YXgud3NkbC5NZXNzYWdlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlNZXNzYWdlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSVBhcnQoamF2YXgud3NkbC5QYXJ0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlQYXJ0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSVNlcnZpY2UoamF2YXgud3NkbC5TZXJ2aWNlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlTZXJ2aWNlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSVBvcnQoamF2YXgud3NkbC5Qb3J0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlQb3J0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUJpbmRpbmcoamF2YXgud3NkbC5CaW5kaW5nIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlCaW5kaW5nQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUJpbmRpbmdPcGVyYXRpb24oamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUJpbmRpbmdJbnB1dChqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJQmluZGluZ0lucHV0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUJpbmRpbmdPdXRwdXQoamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlCaW5kaW5nT3V0cHV0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUJpbmRpbmdGYXVsdChqYXZheC53c2RsLkJpbmRpbmdGYXVsdCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJQmluZGluZ0ZhdWx0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJRGVmaW5pdGlvbihqYXZheC53c2RsLkRlZmluaXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSURlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJSW1wb3J0KGphdmF4LndzZGwuSW1wb3J0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlJbXBvcnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJTGlzdChMaXN0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlMaXN0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSU1hcChNYXAgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSU1hcEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlVUkwoVVJMIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlVUkxBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaW9uUmVnaXN0cnkoRXh0ZW5zaW9uUmVnaXN0cnkgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUV4dGVuc2lvblJlZ2lzdHJ5QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlVHlwZXMoVHlwZXMgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlVHlwZXNBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJSXRlcmF0b3IoSXRlcmF0b3Igb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUl0ZXJhdG9yQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSVR5cGVzKGphdmF4LndzZGwuVHlwZXMgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSVR5cGVzQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VSZWZlcmVuY2UoTWVzc2FnZVJlZmVyZW5jZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlUmVmZXJlbmNlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLSAgICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICB7Ci0gICAgcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuV1NETEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSA8ZW0+UG9ydCBUeXBlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRUeXBlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uIDxlbT5PcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU9wZXJhdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCA8ZW0+UGFydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhcnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nIDxlbT5CaW5kaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ0FkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24gPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UgPGVtPlNlcnZpY2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydCA8ZW0+UG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiA8ZW0+RGVmaW5pdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlZmluaXRpb25BZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQgPGVtPkltcG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSW1wb3J0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQgPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbnNpYmxlRWxlbWVudEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLklucHV0IDxlbT5JbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRwdXRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5GYXVsdCA8ZW0+RmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRmF1bHRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nSW5wdXQgPGVtPkJpbmRpbmcgSW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdJbnB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPdXRwdXQgPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ091dHB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdGYXVsdCA8ZW0+QmluZGluZyBGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ0ZhdWx0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU5hbWVzcGFjZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLlBvcnRUeXBlIDxlbT5JUG9ydCBUeXBlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuUG9ydFR5cGUKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSVBvcnRUeXBlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuT3BlcmF0aW9uIDxlbT5JT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuT3BlcmF0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlPcGVyYXRpb25BZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5JbnB1dCA8ZW0+SUlucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuSW5wdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUlucHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuT3V0cHV0IDxlbT5JT3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuT3V0cHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlPdXRwdXRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5GYXVsdCA8ZW0+SUZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUZhdWx0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuTWVzc2FnZSA8ZW0+SU1lc3NhZ2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5NZXNzYWdlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlNZXNzYWdlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuUGFydCA8ZW0+SVBhcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5QYXJ0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlQYXJ0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuU2VydmljZSA8ZW0+SVNlcnZpY2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5TZXJ2aWNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlTZXJ2aWNlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuUG9ydCA8ZW0+SVBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5Qb3J0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlQb3J0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZyA8ZW0+SUJpbmRpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlCaW5kaW5nQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiA8ZW0+SUJpbmRpbmcgT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCA8ZW0+SUJpbmRpbmcgSW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUJpbmRpbmdJbnB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgPGVtPklCaW5kaW5nIE91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUJpbmRpbmdPdXRwdXRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgPGVtPklCaW5kaW5nIEZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlCaW5kaW5nRmF1bHRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5EZWZpbml0aW9uIDxlbT5JRGVmaW5pdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkRlZmluaXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSURlZmluaXRpb25BZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5JbXBvcnQgPGVtPklJbXBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5JbXBvcnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUltcG9ydEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuTGlzdCA8ZW0+SUxpc3Q8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YS51dGlsLkxpc3QKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUxpc3RBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLk1hcCA8ZW0+SU1hcDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZhLnV0aWwuTWFwCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlNYXBBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YS5uZXQuVVJMIDxlbT5JVVJMPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmEubmV0LlVSTAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJVVJMQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSA8ZW0+SUV4dGVuc2lvbiBSZWdpc3RyeTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUV4dGVuc2lvblJlZ2lzdHJ5QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuVHlwZXMgPGVtPlR5cGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVR5cGVzQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5JdGVyYXRvciA8ZW0+SUl0ZXJhdG9yPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvcgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJSXRlcmF0b3JBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5UeXBlcyA8ZW0+SVR5cGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuVHlwZXMKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSVR5cGVzQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZVJlZmVyZW5jZSA8ZW0+TWVzc2FnZSBSZWZlcmVuY2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlUmVmZXJlbmNlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfSAvL1dTRExBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETERlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZWY1MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMRGVmaW5pdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMUGFja2FnZUltcGw7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsOwotCi1wdWJsaWMgY2xhc3MgV1NETERlZmluaXRpb25GYWN0b3J5IGV4dGVuZHMgY29tLmlibS53c2RsLmZhY3RvcnkuV1NETEZhY3RvcnlJbXBsCi17Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgV1NETERlZmluaXRpb25GYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotICBwdWJsaWMgV1NETERlZmluaXRpb25GYWN0b3J5KCkKLSAgewotICAgIC8vIE1ha2Ugc3VyZSB0aGUgV1NETCBwYWNrYWdlIGlzIGluaXRpYWxpemVkLgotICAgIFdTRExQYWNrYWdlSW1wbC5pbml0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIERlZmluaXRpb24uCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5EZWZpbml0aW9uIG5ld0RlZmluaXRpb24oKQotICB7Ci0gICAgamF2YXgud3NkbC5EZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZURlZmluaXRpb24oKTsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgZmFjdG9yeQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICBpbnN0YW5jZSA9IG5ldyBXU0RMRGVmaW5pdGlvbkZhY3RvcnkoKTsKLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIFdTRExSZWFkZXIuCi0gICAqLwotICBwdWJsaWMgV1NETFJlYWRlciBuZXdXU0RMUmVhZGVyKCkKLSAgewotICAgIFdTRExSZWFkZXIgcmVhZGVyID0gbmV3IFdTRExSZWFkZXJJbXBsKCk7Ci0gICAgcmVhZGVyLnNldEZhY3RvcnlJbXBsTmFtZShnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgcmV0dXJuIHJlYWRlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExNb2RlbExvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETE1vZGVsTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTliMGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETE1vZGVsTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgaW50ZXJmYWNlIHVzZWQgYnkge0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydEltcGwgdG8gZmluZCByZWZlcmVuY2VkIHJlc291cmNlcy4KLSAqIFdoZW4gdGhlIHJlc291cmNlIHJlZmVyZW5jZWQgYnkgYSB3c2RsIGltcG9ydCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkLCAKLSAqIHRoZSBjb250YWluaW5nIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2V9Ci0gKiB3aWxsIGJlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWwjZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLE9iamVjdCkgaW5zcGVjdGVkfSAKLSAqIGZvciBhbiBhZGFwdGVyIHRoYXQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZS4KLSAqIEFzIHN1Y2gsIHlvdSBjYW4gcmVnaXN0ZXIgYW4gYWRhcHRlciBmYWN0b3J5IGxpa2UgdGhpcyB0byB0YWlsb3IgdGhlIGFsZ29yaXRobSB1c2VkIHRvIGxvY2F0ZSB0aGUgcmVzb3VyY2UgOgotICo8cHJlPgotICogIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotICogIHJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQKLSAqICAgIChuZXcgQWRhcHRlckZhY3RvcnlJbXBsKCkKLSAqICAgICB7Ci0gKiAgICAgICBjbGFzcyBDdXN0b21VUklSZXNvbHZlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgV1NETE1vZGVsTG9jYXRvcgotICogICAgICAgewotICogICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKTsKLSAqICAgICAgICAgewotICogICAgICAgICAgIHJldHVybiBudWxsOyAgLy8gQWRkaXRpb25hbCBsb2dpYy4uLgotICogICAgICAgICB9Ci0gKgotICogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICogICAgICAgICB7Ci0gKiAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gV1NETE1vZGVsTG9jYXRvci5jbGFzczsKLSAqICAgICAgICAgfQotICogICAgICAgfQotICoKLSAqICAgICAgIHByb3RlY3RlZCBDdXN0b21VUklSZXNvbHZlciBjdXN0b21VUklSZXNvbHZlciA9IG5ldyBDdXN0b21VUklSZXNvbHZlcigpOwotICoKLSAqICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gKiAgICAgICB7Ci0gKiAgICAgICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gKiAgICAgICB9Ci0gKgotICogICAgICAgcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkKLSAqICAgICAgIHsKLSAqICAgICAgICAgcmV0dXJuIGN1c3RvbVVSSVJlc29sdmVyOwotICogICAgICAgfQotICogICAgIH0pOwotICo8L3ByZT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsI2dldFJlZ2lzdGVyZWRBZGFwdGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSxPYmplY3QpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETE1vZGVsTG9jYXRvcgotewotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTc5YjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFdTRExVdGlsIGV4dGVuZHMgV1NETENvbnN0YW50cwotewotICBwcm90ZWN0ZWQgc3RhdGljIFdTRExVdGlsIGluc3RhbmNlOwotICAvLyAgcHJvdGVjdGVkIE5vZGVBc3NvY2lhdGlvbk1hbmFnZXIgbm9kZUFzc29jaWF0aW9uTWFuYWdlciA9IG5ldyBOb2RlQXNzb2NpYXRpb25NYW5hZ2VyKCk7Ci0KLSAgcHJvdGVjdGVkIEhhc2hNYXAgZWxlbWVudE5hbWVUb1R5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gIHB1YmxpYyBzdGF0aWMgV1NETFV0aWwgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgV1NETFV0aWwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIFdTRExVdGlsKCkKLSAgewotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChCSU5ESU5HX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihCSU5ESU5HKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KERFRklOSVRJT05fRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKERFRklOSVRJT04pKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoRE9DVU1FTlRBVElPTikpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChGQVVMVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoRkFVTFQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoSU1QT1JUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihJTVBPUlQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoSU5QVVRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKElOUFVUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KE1FU1NBR0VfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKE1FU1NBR0UpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoT1BFUkFUSU9OX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihPUEVSQVRJT04pKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoT1VUUFVUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihPVVRQVVQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoUEFSVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoUEFSVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChQT1JUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihQT1JUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFBPUlRfVFlQRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoUE9SVF9UWVBFKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFNFUlZJQ0VfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFNFUlZJQ0UpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoVFlQRVNfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFRZUEVTKSk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFdTRExUeXBlKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGludCByZXN1bHQgPSAtMTsKLQotICAgIEludGVnZXIgaW50ZWdlciA9IChJbnRlZ2VyKSBlbGVtZW50TmFtZVRvVHlwZU1hcC5nZXQoZWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgaWYgKGludGVnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpbnRlZ2VyLmludFZhbHVlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRQYXJlbnRFbGVtZW50Q2hhaW4oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHdoaWxlIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoMCwgZWxlbWVudCk7Ci0gICAgICBOb2RlIG5vZGUgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgIGVsZW1lbnQgPSAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgPyAoRWxlbWVudCkgbm9kZSA6IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyoKLSAgICBwdWJsaWMgT2JqZWN0IGZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBFbGVtZW50IHRhcmdldEVsZW1lbnQpCi0gICAgeyAgIAotICAgICAgT2JqZWN0IG8gPSBub2RlQXNzb2NpYXRpb25NYW5hZ2VyLmdldE1vZGVsT2JqZWN0Rm9yTm9kZShkZWZpbml0aW9uLCB0YXJnZXRFbGVtZW50KTsKLSAgICAgIHJldHVybiBvOwotICAgIH0KLSAgCi0gICAgICAgICAgICAgIAotICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRGb3JPYmplY3QoT2JqZWN0IG8pCi0gICAgeyAgICAgIAotICAgICAgTm9kZSBub2RlID0gbm9kZUFzc29jaWF0aW9uTWFuYWdlci5nZXROb2RlKG8pOyAgCi0gICAgICByZXR1cm4gKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpID8gKEVsZW1lbnQpbm9kZSA6IG51bGw7ICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBOb2RlIGdldE5vZGVGb3JPYmplY3QoT2JqZWN0IG8pCi0gICAgeyAgICAgIAotICAgICAgcmV0dXJuIG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIuZ2V0Tm9kZShvKTsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAKLSAgICBwdWJsaWMgSVR5cGVTeXN0ZW1Qcm92aWRlciBnZXRUeXBlU3lzdGVtUHJvdmlkZXIoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgIHsgICAgICAKLSAgICAgIHJldHVybiBXU0RMVG9ET01FbGVtZW50VXRpbC5nZXRUeXBlU3lzdGVtUHJvdmlkZXIoZGVmaW5pdGlvbik7ICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gIAotICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlU3lzdGVtUHJvdmlkZXIoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBJVHlwZVN5c3RlbVByb3ZpZGVyIHR5cGVTeXN0ZW1Qcm92aWRlcikKLSAgICB7ICAgICAgCi0gICAgICBXU0RMVG9ET01FbGVtZW50VXRpbC5zZXRUeXBlU3lzdGVtUHJvdmlkZXIoZGVmaW5pdGlvbiwgdHlwZVN5c3RlbVByb3ZpZGVyKTsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfSAgIAotICAqLwotCi0gIHB1YmxpYyBzdGF0aWMgUU5hbWUgY3JlYXRlUU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgcHJlZml4ZWROYW1lKQotICB7Ci0gICAgUU5hbWUgcW5hbWUgPSBudWxsOwotICAgIGlmIChwcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSBwcmVmaXhlZE5hbWUuaW5kZXhPZigiOiIpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IChpbmRleCA9PSAtMSkgPyBudWxsIDogcHJlZml4ZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICBpZiAocHJlZml4ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZShwcmVmaXgpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gcHJlZml4ZWROYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgIHFuYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcW5hbWU7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudE5vZGVzKEV4dGVuc2libGVFbGVtZW50IGV4dGVuc2libGVFbGVtZW50KQotICB7Ci0gICAgTGlzdCBjaGlsZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaS5uZXh0KCk7Ci0gICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgY2hpbGRMaXN0LmFkZChlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2hpbGRMaXN0OwotICAgIC8vcmV0dXJuIGV4dGVuc2libGVFbGVtZW50LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTRlZTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hTG9jYXRvckltcGwgc2NoZW1hTG9jYXRvciA9IG5ldyBYU0RTY2hlbWFMb2NhdG9ySW1wbCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHNjaGVtYUxvY2F0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODMzNTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdG9ySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hTG9jYXRvcgotewotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvciNsb2NhdGVTY2hlbWEob3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYSwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFhTRFNjaGVtYSBsb2NhdGVTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHJhd1NjaGVtYUxvY2F0aW9uVVJJLCBTdHJpbmcgcmVzb2x2ZWRTY2hlbWFMb2NhdGlvblVSSSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBudWxsOwotCi0gICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChFT2JqZWN0IHBhcmVudCA9IHhzZFNjaGVtYS5lQ29udGFpbmVyKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBwYXJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsICYmIGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCkuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9ICgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIG8pLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgbmFtZXNwYWNlVVJJLmVxdWFscyhzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRTY2hlbWEgPSBzY2hlbWE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXNvbHZlZFNjaGVtYTsgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0b3IuY2xhc3M7Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YzY5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLXsKLSAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTI4Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5Ci17Ci0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRmFjdG9yeShTdHJpbmcgbmFtZXNwYWNlLCBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmI5NGQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFdTRExDb25zdGFudHMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklORElORyA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRklOSVRJT04gPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET0NVTUVOVEFUSU9OID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFVTFQgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBPUlQgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlBVVCA9IDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0UgPSA2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVSQVRJT04gPSA3OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRQVVQgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUID0gOTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9SVCA9IDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUX1RZUEUgPSAxMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRSA9IDEyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFUyA9IDEzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UID0gMTQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEUgPSAxNTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTlNJQklMSVRZX0VMRU1FTlQgPSAyNDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0VMRU1FTlRfVEFHID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZJTklUSU9OX0VMRU1FTlRfVEFHID0gImRlZmluaXRpb25zIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRyA9ICJkb2N1bWVudGF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfRUxFTUVOVF9UQUcgPSAiZmF1bHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfRUxFTUVOVF9UQUcgPSAiaW1wb3J0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfRUxFTUVOVF9UQUcgPSAiaW5wdXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0VMRU1FTlRfVEFHID0gIm1lc3NhZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT05fRUxFTUVOVF9UQUcgPSAib3BlcmF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0VMRU1FTlRfVEFHID0gIm91dHB1dCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfRUxFTUVOVF9UQUcgPSAicGFydCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfRUxFTUVOVF9UQUcgPSAicG9ydCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfVFlQRV9FTEVNRU5UX1RBRyA9ICJwb3J0VHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRUxFTUVOVF9UQUcgPSAic2VydmljZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVTX0VMRU1FTlRfVEFHID0gInR5cGVzIjsKLQotICAvLyBjb21tb24KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSAibmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfQVRUUklCVVRFID0gIm1lc3NhZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0FUVFJJQlVURSA9ICJiaW5kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9BVFRSSUJVVEUgPSAidHlwZSI7Ci0KLSAgLy8gZGVmaW5pdGlvbnMKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU5DT0RJTkdfQVRUUklCVVRFID0gImVuY29kaW5nIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJ0YXJnZXROYW1lc3BhY2UiOwotCi0gIC8vIGJpbmRpbmcKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfVVJJX0FUVFJJQlVURSA9ICJyZXNvdXJjZVVSSSI7Ci0KLSAgLy8gcGFydAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTEVNRU5UX0FUVFJJQlVURSA9ICJlbGVtZW50IjsKLSAgCi0gIC8vIGltcG9ydAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMT0NBVElPTl9BVFRSSUJVVEUgPSAibG9jYXRpb24iOyAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJuYW1lc3BhY2UiOyAgCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCi0gIC8qKgotICAgKiBUaGUgdmFsdWUgPGNvZGU+aHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEiPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9GT1JfU0NIRU1BX1VSSV8xOTk5ID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hIjsKLQotICAvKioKLSAgICogVGhlIHZhbHVlIDxjb2RlPiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYSI8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDBfMTAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEiOwotCi0gIC8qKgotICAgKiBUaGUgdmFsdWUgPGNvZGU+Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTEVNRU5UX1RBR1MgPQotICAgIG5ldyBTdHJpbmdbXSB7Ci0gICAgICBCSU5ESU5HX0VMRU1FTlRfVEFHLAotICAgICAgREVGSU5JVElPTl9FTEVNRU5UX1RBRywKLSAgICAgIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcsCi0gICAgICBGQVVMVF9FTEVNRU5UX1RBRywKLSAgICAgIElNUE9SVF9FTEVNRU5UX1RBRywKLSAgICAgIElOUFVUX0VMRU1FTlRfVEFHLAotICAgICAgTUVTU0FHRV9FTEVNRU5UX1RBRywKLSAgICAgIE9QRVJBVElPTl9FTEVNRU5UX1RBRywKLSAgICAgIE9VVFBVVF9FTEVNRU5UX1RBRywKLSAgICAgIFBBUlRfRUxFTUVOVF9UQUcsCi0gICAgICBQT1JUX0VMRU1FTlRfVEFHLAotICAgICAgUE9SVF9UWVBFX0VMRU1FTlRfVEFHLAotICAgICAgU0VSVklDRV9FTEVNRU5UX1RBRywKLSAgICAgIFRZUEVTX0VMRU1FTlRfVEFHIH07Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbm9kZVR5cGUoU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRUxFTUVOVF9UQUdTLmxlbmd0aDsgKytpKQotICAgIHsKLSAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKEVMRU1FTlRfVEFHU1tpXSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBub2RlVHlwZShOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gaXNXU0RMTmFtZXNwYWNlKG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkpID8gbm9kZVR5cGUobm9kZS5nZXRMb2NhbE5hbWUoKSkgOiAtMTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG5hbWVzcGFjZSBpcyB0aGUgV1NETCBuYW1lc3BhY2Ugb3Igbm90LgotICAgKiBAcGFyYW0gbmFtZXNwYWNlIGEgbmFtZXNwYWNlLgotICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG5hbWVzcGFjZSBpcyB0aGUgV1NETCBuYW1lc3BhY2Ugb3Igbm90LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV1NETE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmV0dXJuIFdTRExfTkFNRVNQQUNFX1VSSS5lcXVhbHMobmFtZXNwYWNlKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hdGNoaW5nTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UxLCBTdHJpbmcgbmFtZXNwYWNlMikKLSAgewotICAgIHJldHVybiAobmFtZXNwYWNlMSA9PSBudWxsID8gbmFtZXNwYWNlMiA9PSBudWxsIDogbmFtZXNwYWNlMS5lcXVhbHMobmFtZXNwYWNlMikpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPyBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhMDM5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkKLSAgewotICAgIFJlc291cmNlIHJlc3VsdCA9IG5ldyBXU0RMUmVzb3VyY2VJbXBsKHVyaSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfSAvL1dTRExSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExSZXNvdXJjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY5M2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZTwvYj4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtb2RlbC4KLSAqIFRoaXMgc3BlY2lhbGl6ZWQgcmVzb3VyY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgaXQncyBvd24gd2F5IG9mIG1ha2luZyBrZXlzIGFuZCAKLSAqIGhyZWZzLCBhbmQgaXQncyBvd24gc2VyaWFsaXphdGlvbi4gVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgZm9yIHN1YmNsYXNzaW5nIAotICogb3V0c2lkZSBvZiB0aGUgbW9kZWwgaW1wbGVtZW50YXRpb247IGl0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgaXMgd2l0aCB0aGUgCi0gKiBSZXNvdXJjZSBmcmFtZXdvcmsuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFJlc291cmNlSW1wbCBleHRlbmRzIFJlc291cmNlSW1wbCAKLXsKLQotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRpbnVlT25Mb2FkRXJyb3IgPSB0cnVlOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRV9FWFRFTlNJT05fRkFDVE9SSUVTID0gIlVTRV9FWFRFTlNJT05fRkFDVE9SSUVTIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVElOVUVfT05fTE9BRF9FUlJPUiA9ICJDT05USU5VRV9PTl9MT0FEX0VSUk9SIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9FTkNPRElORyA9ICJXU0RMX0VOQ09ESU5HIjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuIAotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIAotICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4gCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMUmVzb3VyY2VJbXBsKFVSSSB1cmkpCi0gIHsKLSAgICBzdXBlcih1cmkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvcywgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RGVmaW5pdGlvbigpOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLSAgICAgICAgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWZpbml0aW9uLmdldEVsZW1lbnQoKSA9PSBudWxsKQotICAgICAgewotICAgICAgICAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICB9Ci0KLSAgICAgIGRvU2VyaWFsaXplKG9zLCBkb2N1bWVudCwgb3B0aW9ucyA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIG9wdGlvbnMuZ2V0KFdTRExfRU5DT0RJTkcpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UncyBEZWZpbml0aW9uLgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29udGVudHMoKS5zaXplKCkgPT0gMSAmJiBnZXRDb250ZW50cygpLmdldCgwKSBpbnN0YW5jZW9mIERlZmluaXRpb24gPyAoRGVmaW5pdGlvbikgZ2V0Q29udGVudHMoKS5nZXQoMCkgOiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRvU2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGRvU2VyaWFsaXplKG91dHB1dFN0cmVhbSwgZG9jdW1lbnQsIG51bGwpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRvU2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZW5jb2RpbmcpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotCi0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLSAgICAgIAotICAgICAgLy8gVW5sZXNzIGEgd2lkdGggaXMgc2V0LCB0aGVyZSB3aWxsIGJlIG9ubHkgbGluZSBicmVha3MgYnV0IG5vIGluZGVudGF0aW9uLgotICAgICAgLy8gVGhlIElCTSBKREsgYW5kIHRoZSBTdW4gSkRLIGRvbid0IGFncmVlIG9uIHRoZSBwcm9wZXJ0eSBuYW1lLAotICAgICAgLy8gc28gd2Ugc2V0IHRoZW0gYm90aC4KLSAgICAgIC8vCi0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbn1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7Ci0gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZW5jb2RpbmcpOwotICAgICAgfQotCi0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQob3V0cHV0U3RyZWFtKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgewotICAgICAgV1NETFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTG9hZHMgYSBuZXcge0BsaW5rIFdTRExSZXNvdXJjZUltcGx9IGludG8gdGhlIHJlc291cmNlIHNldC4KLSAgICogQHBhcmFtIHJlc291cmNlU2V0IHRoZSByZXNvdXJjZSBzZXQgdG8gaG9sZCB0aGUgbmV3IHJlc291cmNlLgotICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4KLSAgICogQHBhcmFtIGlucHV0U3RyZWFtIHRoZSBjb250ZW50cyBvZiB0aGUgbmV3IHJlc291cmNlLgotICAgKiBAcGFyYW0gb3B0aW9ucyBhbnkgb3B0aW9ucyB0byBpbmZsdWVuY2UgbG9hZGluZyBiZWhhdmlvci4KLSAgICogQHJldHVybiBhIG5ldyBXU0RMUmVzb3VyY2VJbXBsLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBUaGlzIHBhdHRlcm4gYXZvaWRzIGxvYWRpbmcgdGhlIElQcm9ncmVzc01vbml0b3IgY2xhc3Mgd2hlbiB0aGVyZSBpcyBubyBwcm9ncmVzcyBtb25pdG9yLgotICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBzdGFuZC1hbG9uZSBleGVjdXRpb24gdG8gd29yayBjb3JyZWN0bHkuCi0gICAgLy8KLSAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0gICAgT2JqZWN0IG1vbml0b3IgPSBvcHRpb25zID09IG51bGwgPyBudWxsIDogb3B0aW9ucy5nZXQoIldTRExfUFJPR1JFU1NfTU9OSVRPUiIpOwotICAgIGlmIChtb25pdG9yICE9IG51bGwpCi0gICAgewotICAgICAgcHJvZ3Jlc3NNb25pdG9yID0gKElQcm9ncmVzc01vbml0b3IpIG1vbml0b3I7Ci0gICAgICBwcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUoV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUxvYWRfcHJvZ3Jlc3MiKSk7Ci0gICAgICBwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhnZXRVUkkoKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBPYmplY3QgYmluZGluZ3MgPSBvcHRpb25zID09IG51bGwgPyBudWxsIDogb3B0aW9ucy5nZXQoVVNFX0VYVEVOU0lPTl9GQUNUT1JJRVMpOwotICAgIGlmIChiaW5kaW5ncyAhPSBudWxsICYmIGJpbmRpbmdzIGluc3RhbmNlb2YgQm9vbGVhbikgCi0gICAgICAvLyB0cnVlIGJ5IGRlZmF1bHQKLSAgICAgIHVzZUV4dGVuc2lvbkZhY3RvcmllcyA9ICgoQm9vbGVhbiliaW5kaW5ncykuYm9vbGVhblZhbHVlKCk7Ci0gCi0gICAgT2JqZWN0IGNvbnRpbnVlT25FcnJvciA9IG9wdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLmdldChDT05USU5VRV9PTl9MT0FEX0VSUk9SKTsKLSAgICBpZiAoY29udGludWVPbkVycm9yICE9IG51bGwgJiYgY29udGludWVPbkVycm9yIGluc3RhbmNlb2YgQm9vbGVhbikgCi0gICAgICAvLyB0cnVlIGJ5IGRlZmF1bHQKLSAgICAJY29udGludWVPbkxvYWRFcnJvciA9ICgoQm9vbGVhbiljb250aW51ZU9uRXJyb3IpLmJvb2xlYW5WYWx1ZSgpOwotICAgIAotICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQ3JlYXRlIGEgRE9NIGRvY3VtZW50Ci0gICAgICBkb2MgPSBnZXREb2N1bWVudChpbnB1dFN0cmVhbSwgbmV3IEludGVybmFsRXJyb3JIYW5kbGVyKCkpOwotCi0gICAgICBpZiAoZG9jICE9IG51bGwgJiYgZG9jLmdldERvY3VtZW50RWxlbWVudCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICghZmluZERlZmluaXRpb24oZG9jLmdldERvY3VtZW50RWxlbWVudCgpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjb250aW51ZU9uTG9hZEVycm9yKQotICAgICAgICAgICAgaGFuZGxlRGVmaW5pdGlvbkVsZW1lbnQoZG9jLmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oV1NETFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9FUlJPUl9JTlZBTElEX1dTREwiKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlRGVmaW5pdGlvbkVsZW1lbnQobnVsbCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgewotICAgICAgaWYgKGNvbnRpbnVlT25Mb2FkRXJyb3IpCi0gICAgICB7Ci0gICAgICAgIFdTRExQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0gICAgICAgIGhhbmRsZURlZmluaXRpb25FbGVtZW50KG51bGwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgCXRocm93IGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLQotICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaW5saW5lIHNjaGVtYXMgbG9jYXRpb24gCi0gICAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgZWwgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGoubmV4dCgpOwotICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBlbC5nZXRTY2hlbWEoKTsKLSAgICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICBzY2hlbWEuc2V0U2NoZW1hTG9jYXRpb24oZ2V0VVJJKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0gICAgewotICAgICAgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQnVpbGRzIGEgZG9jdW1lbnQgdXNpbmcgWGVyY2VzLgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gdGhlIGNvbnRlbnRzIHRvIHBhcnNlLgotICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSBoYW5kbGVkIHVzZWQgYnkgdGhlIHBhcnNlci4KLSAgICogQHJldHVybiBhIGRvY3VtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBDbGFzc0xvYWRlciBwcmV2aW91c0NsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0KLSAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCi0gICAgICAvLyBUQkQgLSBSZXZpc2l0Ci0gICAgICAvL0VudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyID0gY3JlYXRlRW50aXR5UmVzb2x2ZXIoKTsKLSAgICAgIC8vZG9jdW1lbnRCdWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKLQotICAgICAgZG9jdW1lbnRCdWlsZGVyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotCi0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZShpbnB1dFN0cmVhbSk7Ci0gICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSU9XcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJT1dyYXBwZWRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZpb3VzQ2xhc3NMb2FkZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGZpbmREZWZpbml0aW9uKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChXU0RMQ29uc3RhbnRzLm5vZGVUeXBlKGVsZW1lbnQpID09IFdTRExDb25zdGFudHMuREVGSU5JVElPTikKLSAgICB7Ci0gICAgICBoYW5kbGVEZWZpbml0aW9uRWxlbWVudChlbGVtZW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgIC8qCi0gICAgICBmb3IgKE5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGZpbmREZWZpbml0aW9uKChFbGVtZW50KSBjaGlsZCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICovCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZURlZmluaXRpb25FbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlZmluaXRpb24oKTsKLSAgICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikuc2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKHVzZUV4dGVuc2lvbkZhY3Rvcmllcyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkltcGwuY3JlYXRlRGVmaW5pdGlvbgotCSAgICAoZWxlbWVudCxnZXRVUkkoKS50b1N0cmluZygpLHVzZUV4dGVuc2lvbkZhY3Rvcmllcyk7Ci0gICAgfQotICAgIGdldENvbnRlbnRzKCkuYWRkKGRlZmluaXRpb24pOwotICAgIC8vIERvIHdlIG5lZWQgdGhlIG5leHQgbGluZT8KLSAgICAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS5yZWNvbmNpbGVSZWZlcmVuY2VzKHRydWUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHNlcmlhbGl6ZShvdXRwdXRTdHJlYW0sIGRvY3VtZW50LCBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBlbmNvZGluZykKLSAgewotICAgIGRvU2VyaWFsaXplKG91dHB1dFN0cmVhbSwgZG9jdW1lbnQsIGVuY29kaW5nKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgc2VyaWFsaXplKG91dHB1dFN0cmVhbSwgZWxlbWVudCwgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGVuY29kaW5nKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZG9TZXJpYWxpemUob3V0cHV0U3RyZWFtLCBlbGVtZW50LCBlbmNvZGluZyk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZG9TZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLQotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZW5jb2RpbmcpOwotICAgICAgfQotCi0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShlbGVtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBXU0RMUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgIH0KLSAgfQotIAotICBwcml2YXRlIGNsYXNzIEludGVybmFsRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV1NETCBQQVJTRSBFUlJPUjogIiArIGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXU0RMIFBBUlNFIEZBVEFMIEVSUk9SOiAiICsgZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldTREwgUEFSU0UgV0FSTklORzogIiArIGUpOwotICAgIH0KLSAgfSAKLSAgCi0gIAotICBwdWJsaWMgdm9pZCBhdHRhY2hlZChFT2JqZWN0IGVPYmplY3QpCi0gIHsKLSAgICBzdXBlci5hdHRhY2hlZChlT2JqZWN0KTsKLSAgICAgCi0gICAgLy8gd2UgbmVlZCB0byBhdHRhY2ggYSBYU0RTY2hlbWFMb2NhdG9yIGluIG9yZGVyIHRvIHJlc29sdmUgaW5saW5lIHNjaGVtYSBsb2NhdGlvbnMKLSAgICAvLyBpZiB0aGVyZSdzIG5vdCBhbHJlYWR5IG9uZSBhdHRhY2hlZAotICAgIFhTRFNjaGVtYUxvY2F0b3IgeHNkU2NoZW1hTG9jYXRvciA9IChYU0RTY2hlbWFMb2NhdG9yKUVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcih0aGlzLCBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzKTsKLSAgICBpZiAoeHNkU2NoZW1hTG9jYXRvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGdldFJlc291cmNlU2V0KCkuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5KCkpOyAgCi0gICAgfSAKLSAgICAKLSAgICBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIERlZmluaXRpb25JbXBsKQotICAgIHsKLSAgICAgIERlZmluaXRpb25JbXBsIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbkltcGwpIGVPYmplY3Q7Ci0gICAgICBkZWZpbml0aW9uLnNldElubGluZVNjaGVtYUxvY2F0aW9ucyh0aGlzKTsgICAgCi0gICAgfQotICB9Ci0gIC8qCi0gIHB1YmxpYyB2b2lkIHNldElubGluZVNjaGVtYUxvY2F0aW9ucyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBpbmxpbmUgc2NoZW1hcyBsb2NhdGlvbiAKLSAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBqID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGoubmV4dCgpOwotICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZWwuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgc2NoZW1hLnNldFNjaGVtYUxvY2F0aW9uKGdldFVSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgIAotICAgIH0gICAgICAKLSAgfSovCi19IC8vV1NETFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETFN3aXRjaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjlkNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFN3aXRjaCB7Ci0gIC8qKgotICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgV1NETFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETFN3aXRjaCgpCi0gIHsKLSAgICBpZiAobW9kZWxQYWNrYWdlID09IG51bGwpCi0gICAgewotICAgICAgbW9kZWxQYWNrYWdlID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KQotICB7Ci0gICAgRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0gICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRToKLSAgICAgICAgewotICAgICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQocG9ydFR5cGUpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZU9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG9wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0U6Ci0gICAgICAgIHsKLSAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChtZXNzYWdlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUOgotICAgICAgICB7Ci0gICAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVBhcnQocGFydCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQocGFydCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSVBhcnQocGFydCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElORzoKLSAgICAgICAgewotICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJsZUVsZW1lbnQoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRToKLSAgICAgICAgewotICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlUG9ydChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJUG9ydChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT046Ci0gICAgICAgIHsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbil0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudChkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbXBvcnQgaW1wb3J0XyA9IChJbXBvcnQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUltcG9ydChpbXBvcnRfKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChpbXBvcnRfKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSW1wb3J0KGltcG9ydF8pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUOgotICAgICAgICB7Ci0gICAgICAgICAgSW5wdXQgaW5wdXQgPSAoSW5wdXQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUlucHV0KGlucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXNzYWdlUmVmZXJlbmNlKGlucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChpbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUlucHV0KGlucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWVzc2FnZVJlZmVyZW5jZShvdXRwdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG91dHB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU91dHB1dChvdXRwdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUOgotICAgICAgICB7Ci0gICAgICAgICAgRmF1bHQgZmF1bHQgPSAoRmF1bHQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUZhdWx0KGZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXNzYWdlUmVmZXJlbmNlKGZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChmYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUZhdWx0KGZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IChCaW5kaW5nSW5wdXQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUJpbmRpbmdJbnB1dChiaW5kaW5nSW5wdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGJpbmRpbmdJbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUJpbmRpbmdJbnB1dChiaW5kaW5nSW5wdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGJpbmRpbmdJbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSAoQmluZGluZ091dHB1dCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlQmluZGluZ091dHB1dChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJQmluZGluZ091dHB1dChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUJpbmRpbmdGYXVsdChiaW5kaW5nRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGJpbmRpbmdGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUJpbmRpbmdGYXVsdChiaW5kaW5nRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGJpbmRpbmdGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFOgotICAgICAgICB7Ci0gICAgICAgICAgTmFtZXNwYWNlIG5hbWVzcGFjZSA9IChOYW1lc3BhY2UpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTOgotICAgICAgICB7Ci0gICAgICAgICAgVHlwZXMgdHlwZXMgPSAoVHlwZXMpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVR5cGVzKHR5cGVzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudCh0eXBlcyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSVR5cGVzKHR5cGVzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudCh0eXBlcyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQodW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudCh1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudCh1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UOgotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudCh4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudCh4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBUeXBlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgVHlwZTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBvcnRUeXBlKFBvcnRUeXBlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZShNZXNzYWdlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJ0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VQYXJ0KFBhcnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2UoU2VydmljZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlZmluaXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW1wb3J0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkltcG9ydDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUltcG9ydChJbXBvcnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmxlIEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmxlRWxlbWVudChFeHRlbnNpYmxlRWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5wdXQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJbnB1dChJbnB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgSW5wdXQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CaW5kaW5nIEZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZXNwYWNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlTmFtZXNwYWNlKE5hbWVzcGFjZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVBvcnQgVHlwZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUG9ydCBUeXBlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVBvcnRUeXBlKGphdmF4LndzZGwuUG9ydFR5cGUgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklPcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlPcGVyYXRpb24oamF2YXgud3NkbC5PcGVyYXRpb24gb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklJbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJSW5wdXQoamF2YXgud3NkbC5JbnB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU91dHB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSU91dHB1dChqYXZheC53c2RsLk91dHB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlGYXVsdChqYXZheC53c2RsLkZhdWx0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTWVzc2FnZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTWVzc2FnZTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlNZXNzYWdlKGphdmF4LndzZGwuTWVzc2FnZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVBhcnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVBhcnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJUGFydChqYXZheC53c2RsLlBhcnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklTZXJ2aWNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklTZXJ2aWNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVNlcnZpY2UoamF2YXgud3NkbC5TZXJ2aWNlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUG9ydDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlQb3J0KGphdmF4LndzZGwuUG9ydCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmc8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZyhqYXZheC53c2RsLkJpbmRpbmcgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ09wZXJhdGlvbihqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSUJpbmRpbmdJbnB1dChqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nT3V0cHV0KGphdmF4LndzZGwuQmluZGluZ091dHB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ0ZhdWx0KGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlEZWZpbml0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUltcG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSW1wb3J0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSUltcG9ydChqYXZheC53c2RsLkltcG9ydCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUxpc3Q8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUxpc3Q8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJTGlzdChMaXN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTWFwPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNYXA8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJTWFwKE1hcCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVVSTDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JVVJMPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVVSTChVUkwgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpb24gUmVnaXN0cnk8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2lvbiBSZWdpc3RyeTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZXM8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZXM8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VUeXBlcyhUeXBlcyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUl0ZXJhdG9yPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklJdGVyYXRvcjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlJdGVyYXRvcihJdGVyYXRvciBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVR5cGVzPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklUeXBlczwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlUeXBlcyhqYXZheC53c2RsLlR5cGVzIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZVJlZmVyZW5jZShNZXNzYWdlUmVmZXJlbmNlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0gLy9XU0RMU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL1dTREwubWRsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9XU0RMLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyNTgxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL1dTREwubWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzA3NDggKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0Mg0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA0LjUuODA1NGEiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMNCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwDQotCWxlZnRNYXJnaW4gCTAuMjUwMDAwDQotCXRvcE1hcmdpbiAgCTAuMjUwMDAwDQotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDANCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwDQotCWNsaXBJY29uTGFiZWxzIAlUUlVFDQotCWF1dG9SZXNpemUgCVRSVUUNCi0Jc25hcFRvR3JpZCAJVFJVRQ0KLQlncmlkWCAgICAgIAkxNg0KLQlncmlkWSAgICAgIAkxNg0KLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250DQotCSAgICBzaXplICAgICAgIAkxMA0KLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JICAgIGNvbG9yICAgICAgCTANCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCXNob3dNZXNzYWdlTnVtIAkxDQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFDQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikNCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciDQotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjQiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNzgiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDYzIg0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyINCi0JcXVpZHUgICAgICAJIjM5RTI3RjA4MDA2NSINCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIndzZGwiDQotCQlxdWlkICAgICAgIAkiM0FERkI4RTUwMjFFIg0KLQkJZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBXU0RMIG1vZGVsIGNvbnRhaW5zIGNsYXNzZXMgZm9yIHRoZSBXZWIgU2VydmljZXMgRGVzY3JpcHRpb24gTGFuZ3VhZ2UgKFdTREwpLg0KLXwNCi18V1NETCBkZXNjcmliZXMgbmV0d29yayBzZXJ2aWNlcyBhcyBzZXRzIG9mIGVuZHBvaW50cyBvcGVyYXRpbmcgb24gbWVzc2FnZXMuIFRoZSBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBhcmUgZGVzY3JpYmVkIGFic3RyYWN0bHksIGFuZCB0aGVuIGJvdW5kIHRvIGEgY29uY3JldGUgbmV0d29yayBwcm90b2NvbCBhbmQgbWVzc2FnZSBmb3JtYXQgdG8gZGVmaW5lIGFuIGVuZHBvaW50Lg0KLXwNCi18V1NETCBkZXNjcmliZXMgdGhlIGZvcm1hdHMgb2YgdGhlIG1lc3NhZ2VzIGV4Y2hhbmdlZCBieSB0aGUgc2VydmljZXMsIGFuZCBzdXBwb3J0cyB0aGUgWE1MIFNjaGVtYXMgc3BlY2lmaWNhdGlvbiBhcyBpdHMgY2Fub25pY2FsIHR5cGUgc3lzdGVtLiBUaGlzIHBhY2thZ2UgdXNlcyBhbiBYTUwgU2NoZW1hIEluZm9zZXQgbW9kZWwgcGFja2FnZSAoc2VlIHRoZSBYU0QgcGFja2FnZSkgdG8gZGVzY3JpYmUgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0cy4NCi18DQotfFRoZSBtb2RlbCBjb250YWlucyB0aGUgZm9sbG93aW5nIGRpYWdyYW1zLCBuYW1lZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBjaGFwdGVycyBpbiB0aGUgV1NETCAxLjEgc3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9OT1RFLXdzZGwtMjAwMTAzMTUpDQotfC0gMi4xIERlZmluaXRpb24sIHNob3dzIHRoZSBXU0RMIGRlZmluaXRpb24gZWxlbWVudCBhbmQgdGhlIFdTREwgZG9jdW1lbnQgc3RydWN0dXJlDQotfC0gMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nLCBzaG93cyB0aGUgbmFtZXNwYWNlIGFuZCBpbXBvcnQgbWVjaGFuaXNtDQotfC0gMi4xLjMgRXh0ZW5zaWJpbGl0eSwgc2hvd3MgdGhlIFdTREwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc20NCi18LSAyLjIgVHlwZXMsIHNob3dzIHRoZSB1c2Ugb2YgWE1MIFNjaGVtYSB0eXBlcyBpbiBXU0RMDQotfC0gMi4zIE1lc3NhZ2VzLCAyLjQgUG9ydFR5cGVzLCAyLjUgQmluZGluZ3MgYW5kIDIuNyBTZXJ2aWNlcywgc2hvdyB0aGUgbWFqb3IgV1NETCBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zLg0KLXwNCi18VGhlIFdTREwgY2xhc3NlcyBleHRlbmQgdGhlIGphdmF4LndzZGwgaW50ZXJmYWNlcyBkZWZpbmVkIGJ5IEpTUiAxMTAuIENsYXNzZXMgd2l0aCBpbnRlcmZhY2UgYW5kIGRhdGF0eXBlIHN0ZXJlb3R5cGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVzZSBub24tTU9GIGludGVyZmFjZXMuDQotCQkNCi0JCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1QzZBMzAyREQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbGFuZ3VhZ2UgZWxlbWVudC4iDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDRDE1Mjk2MDBDOCINCi0JCQkJcmVzdWx0ICAgICAJIkRlZmluaXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RW5jbG9zaW5nRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDRDE1MkI4MDM0NyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRlZmluaXRpb24iDQotCQkJCQl0eXBlICAgICAgIAkiRGVmaW5pdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZG9jdW1lbnRhdGlvbkVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQ0NFNDQzNjAyQTMiDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNGOTdEQkQzMDIwNyINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSINCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnRUeXBlIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydFR5cGUgZWxlbWVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4xIGFuZCBhbiBJbnRlcmZhY2UgY29tcG9uZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIuIEEgcG9ydCB0eXBlIG9yIEludGVyZmFjZSBpcyBhIG5hbWVkIHNldCBvZiBhYnN0cmFjdCBvcGVyYXRpb25zIGFuZCB0aGUgYWJzdHJhY3QgbWVzc2FnZXMgaW52b2x2ZWQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDOUI3MDE1MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRDgwMTlGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODhFMDAyMyINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRTMwMUU1Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOENERUIwMzE2Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0RkQwMUJBIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk9wZXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50LiBBIFdTREwgb3BlcmF0aW9uIGlzIGFuIGFic3RyYWN0IGRlc2NyaXB0aW9uIG9mIGFuIGFjdGlvbiBzdXBwb3J0ZWQgYnkgYSBzZXJ2aWNlLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUU5REU5ODAwM0MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkUyMDE3MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ3MjYwMUFDIg0KLQkJCQl0eXBlICAgICAgIAkiT3BlcmF0aW9uVHlwZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQkREOTY0MzAwNEMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjIzNTAwM0UiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0UyMjAxQUQiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDUyMDAxMUIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiTWVzc2FnZSINCi0JCQlxdWlkICAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG1lc3NhZ2UgZWxlbWVudC4gQSBXU0RMIG1lc3NhZ2UgaXMgYW4gYWJzdHJhY3QsIHR5cGVkIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgYmVpbmcgY29tbXVuaWNhdGVkLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDA1NTAxQzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOEQxMDJCQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODdDMDFGRSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRDIwMjI2Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNEIwMkIwIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ1NDIwMEYxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlBhcnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwYXJ0IGVsZW1lbnQuIFBhcnRzIGRlc2NyaWJlIHRoZSBsb2dpY2FsIGFic3RyYWN0IGNvbnRlbnQgb2YgYSBtZXNzYWdlLiBFYWNoIHBhcnQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdHlwZSBmcm9tIHNvbWUgdHlwZSBzeXN0ZW0uICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTk2RDAyRjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5M0YwMUJFIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODk3RTIzMDIzNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDRTcwQjcwM0M4Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudE5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjA4NzAzREIiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGVOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDRTcwQzMwM0M1Ig0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZyINCi0JCQlxdWlkICAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGJpbmRpbmcgZWxlbWVudC4gQSBiaW5kaW5nIGRlZmluZXMgbWVzc2FnZSBmb3JtYXQgYW5kIHByb3RvY29sIGRldGFpbHMgZm9yIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGRlZmluZWQgYnkgYSBwYXJ0aWN1bGFyIHBvcnRUeXBlLiBUaGVyZSBtYXkgYmUgYW55IG51bWJlciBvZiBiaW5kaW5ncyBmb3IgYSBnaXZlbiBwb3J0VHlwZS4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUZBMEYwMkYwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0MTAxMjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg5OTAxNEIiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUY0MDFBMyINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTZEMDE1MSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENERGMDM1QyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZy4gQW4gb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aGluIHRoZSBiaW5kaW5nJ3MgcG9ydFR5cGUuICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ2MDA5MjAyRjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBREU0MDFEQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUM0Q0IwMTk5Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlNlcnZpY2UiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBzZXJ2aWNlIGVsZW1lbnQuIEEgc2VydmljZSBncm91cHMgYSBzZXQgb2YgcmVsYXRlZCBwb3J0cyB0b2dldGhlci4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUZBMjAwMjVFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0RTAxQjQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCNDkwMjg3IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDhBNDAxNTEiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMjBEMDIwMyINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENDgxMDIyMCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENEM1MDFFMiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJQb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydCBlbGVtZW50LiBBIHBvcnQgZGVmaW5lcyBhbiBpbmRpdmlkdWFsIGVuZHBvaW50IGJ5IHNwZWNpZnlpbmcgYSBzaW5nbGUgYWRkcmVzcyBmb3IgYSBiaW5kaW5nIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDYwMENCMDBBQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NDUwMkM5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDlBMDAzOTEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuIFdTREwgYWxsb3dzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxNDkwM0QwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjEyNDAyQUIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0JEREY1MzUwMkMzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0FGOTU0M0MwMDczIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QjIxQTAyNzEiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4gVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgV1NETCBkb2N1bWVudC4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUZEQjgwM0Q0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjFGODAzODIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNEZDMjAxMkIiDQotCQkJCXJlc3VsdCAgICAgCSJET01Eb2N1bWVudCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXREb2N1bWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDRDE1MERFMDFFNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50Ig0KLQkJCQkJdHlwZSAgICAgICAJIkRPTURvY3VtZW50IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTQ3NDAwNEUiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjQwMzUyQjdDMDM5NiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4NTcwMkY1Ig0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDBEMDAwRCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJJbXBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIFdTREwgaW1wb3J0IGVsZW1lbnQuIFdTREwgYWxsb3dzIGFzc29jaWF0aW5nIGEgbmFtZXNwYWNlIHdpdGggYSBkb2N1bWVudCBsb2NhdGlvbiB1c2luZyBhbiBpbXBvcnQgZWxlbWVudC4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUVFNTgwMzdBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMjAwRDAzNDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWEiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NzJDMTAzNzkiDQotCQkJCXJlc3VsdCAgICAgCSJYU0RTY2hlbWEiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0U2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzk3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAic2NoZW1hIg0KLQkJCQkJdHlwZSAgICAgICAJIlhTRFNjaGVtYSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MEEwMDM2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTUxNDAyMTEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVGQ0ZBMDMzQSINCi0JCQlkb2N1bWVudGF0aW9uIAkiIFdTREwgYWxsb3dzIGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgKHJlZmVycmVkIHRvIGhlcmUgYXMgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cykgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9pbnQgb2YgZXh0ZW5zaWJpbGl0eS4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUZFM0MwM0Q0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMTJDMDNDRCINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxNDcwMjk1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0RWxlbWVudCINCi0JCQkJCXR5cGUgICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIg0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSW5wdXQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50LiBBbiBpbnB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzUwNDAyNUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjI4MDJFNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSINCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZFRTAzMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudC4gQW4gb3V0cHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzUwQzAzNUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjM1MDBERCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSINCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZGODAxQ0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRmF1bHQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50LiBGYXVsdCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgYW55IGVycm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGJlIG91dHB1dCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRTFDODIwMDJGMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyM0QwMzE5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDAyMDAyRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIGlucHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTFCMDExMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREVCMDEwMCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QjU5QjAwNzIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNBNDAyMDMiDQotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0SW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNCNTAzQTIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJSW5wdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzFFQTAyMEUiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ091dHB1dCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBOEYwMjhDIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTQzMDJBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUyMTAxMTEiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUI1QTQwMjdFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0Q5MDBGMSINCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzRjEwMzI2Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklPdXRwdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzIwMjAwQkUiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ0ZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOEE5RTAzQTYiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQSBmYXVsdCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZhdWx0IHdpdGggdGhlIHNhbWUgbmFtZS4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5Mzg2MDJDOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNzEwMzMzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNEYwMEJEIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTQxMzAzN0YiDQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTQyMTAxMDkiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCINCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QkY5RTAxNEEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUU5hbWUiDQotCQkJcXVpZCAgICAgICAJIjNBRThFRDIyMDE0MCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlFOYW1lIGNsYXNzLiBBIFFOYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NDlEQTkwMDNEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk5hbWVzcGFjZSINCi0JCQlxdWlkICAgICAgIAkiM0FFQTNDRDMwMDMwIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBuYW1lc3BhY2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzcGFjZSBwcmVmaXggdXNlZCBpbiBhIFdTREwgZG9jdW1lbnQuIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDI5MDFCMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByZWZpeCINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDMyMDIzNiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb25UeXBlIg0KLQkJCXF1aWQgICAgICAgCSIzQUVCNDc4MjAyNEYiDQotCQkJZG9jdW1lbnRhdGlvbiAJDQotfE9ORV9XQVk9MQ0KLXxSRVFVRVNUX1JFU1BPTlNFPTINCi18U09MSUNJVF9SRVNQT05TRT0zDQotfE5PVElGSUNBVElPTj00DQotCQkJDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uVHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMzUzMDNFMyINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJJUG9ydFR5cGUiDQotCQkJcXVpZCAgICAgICAJIjNCODRBNUJFMDMzMSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnRUeXBlIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QUMxMDFDQSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiINCi0JCQkJCXR5cGUgICAgICAgCSJJT3BlcmF0aW9uIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCQUYwMUE0Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0TmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dE5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkJGNzAzMUEiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTYzMjAwMEQiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU9wZXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3NzYwMEQxIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNDIwMDY1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiDQotCQkJCQl0eXBlICAgICAgIAkiSUZhdWx0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM1OTAyOEYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzcxMDJCMSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM4MTAxQjAiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2Qzk5MDMxRCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlck9yZGVyIg0KLQkJCQkJdHlwZSAgICAgICAJIklMaXN0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTRFNTAxOEQiDQotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0SW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJDNDAxMDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJSW5wdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJFNDAwOTQiDQotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkYwMDFEMiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJT3V0cHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBNzk5MDEyQiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJSW5wdXQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBN0VFMDAxNSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLklucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjMzMTAwRUYiDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYzNDcwMjc3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5JbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODAwMDAzOSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTgyOTAyN0QiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDNBMDM1RCINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ0NTAxQzgiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODM5MDFENSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJRmF1bHQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBODYxMDMxRCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ2QTAwQkQiDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NzUwMTMxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5GYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODcxMDIwOCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJTWVzc2FnZSINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4QUYwMDRGIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuTWVzc2FnZSBub24tTU9GIGludGVyZmFjZSINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzIyNDAyNzMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklQYXJ0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjNEMDIzMyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJUGFydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjU0MDI1RSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3JkZXJlZFBhcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyNjEwMjBEIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFydE9yZGVyIg0KLQkJCQkJdHlwZSAgICAgICAJIklMaXN0IikpDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOEJDMDI2MCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJUGFydCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE5M0YwMUJFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUGFydCBub24tTU9GIGludGVyZmFjZSINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvbkF0dHJpYnV0ZSINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4ODQ1MDA1MiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInZhbHVlIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCWV4Y2VwdGlvbnMgCSJXU0RMRXhjZXB0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjhBMDEwMUMzIg0KLQkJCQlyZXN1bHQgICAgIAkiSUl0ZXJhdG9yIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZSINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4QTJEMDJENSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIlFOYW1lIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5QYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NTAwMjMxIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklTZXJ2aWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUI0OTAyODciDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5TZXJ2aWNlIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUQ1NjAxRDEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklQb3J0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NURBMjAwMzYiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NURCMDAxQkMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUI1QjAwM0UiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBQjgwMDMyNiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MUYzMDJCNSINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTI2MzAyRjIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIg0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUI4QzAwMTYiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmciDQotCQkJcXVpZCAgICAgICAJIjNCODRBQkM2MDIxOSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmcgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjE2MDE1MyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdPcGVyYXRpb24iDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGNTAwMDY2Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0TmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dE5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RkE0MDFDNSINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyQTkwMjg0Ig0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyQkUwMUE4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiDQotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUJDRjAzMDIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCODRBREMwMDA3MiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTYwQkMwMDQxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0ZhdWx0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nRmF1bHQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBEOTAwOUQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTYwRkMwMDYxIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTMyRDAwMTciDQotCQkJCXJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzNGMDM3QiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiINCi0JCQkJCXR5cGUgICAgICAgCSJJT3BlcmF0aW9uIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MDkwMERBIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUxRDAwN0YiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nSW5wdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdJbnB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUzNDAzNDkiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1NDcwMkE2Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ091dHB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ091dHB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEQ0IwMjFDIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nSW5wdXQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBREVCMDEwMCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBREZFMDAwRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ091dHB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFFMjEwMTExIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ091dHB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUyRDAwNTAiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFFNEYwMEJEIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNUYwMDJBIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRjMyMDNEQiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5FbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRjU2MDI5MiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCODRCMTI0MDJBQiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTM1MDNEMSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxRDkwMTQyIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRGVmaW5pdGlvbiBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg4RjEwMzlEIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEltcG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTQ5MDI1OSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImltcG9ydERlZiINCi0JCQkJCXR5cGUgICAgICAgCSJJSW1wb3J0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTZFMDA1RSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGROYW1lc3BhY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk4NDAwNEIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwcmVmaXgiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlDNTAwNDUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSINCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRTZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5RTQwMUVFIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAic2VydmljZSINCi0JCQkJCXR5cGUgICAgICAgCSJJU2VydmljZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTE3MDM4QyINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMzIwMjg2Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNDYwMTNCIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTVDMDBCMCINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlGRTAzN0MiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTc1MDJFNyINCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbXBvcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE4MzAxNEMiDQotCQkJCXJlc3VsdCAgICAgCSJJSW1wb3J0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUlucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBOUQwMzNFIg0KLQkJCQlyZXN1bHQgICAgIAkiSUlucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFBRjAyNTQiDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFDMjAzQzQiDQotCQkJCXJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUU4MDBFRCINCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUY4MDI2RCINCi0JCQkJcmVzdWx0ICAgICAJIklQYXJ0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIwODAxREEiDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjE1MDM5QiINCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVTZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMzIwMTNBIg0KLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjQyMDA3NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCOTIwMzQxIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCQ0QwMDYwIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCRTcwMTQ0Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzE3MDEwNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2VzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDM0UwMDFEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEM2MjAxNEIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwcmVmaXgiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Qzc0MDExNSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OENCRTAwNzEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDREEwMUM2Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQcmVmaXgiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OENGRDAwMTciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4RDIzMDBBOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2VzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThEM0IwM0NFIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25SZWdpc3RyeSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUI4MDEyQiINCi0JCQkJcmVzdWx0ICAgICAJIklFeHRlbnNpb25SZWdpc3RyeSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25SZWdpc3RyeSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUQ3MDNCQiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpb25SZWdpc3RyeSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldERvY3VtZW50QmFzZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUZFMDIwOCINCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXREb2N1bWVudEJhc2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDYxODAzMjgiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudEJhc2UiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlVHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDA1NjAwODAiDQotCQkJCXJlc3VsdCAgICAgCSJJVHlwZXMiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDdFMDA0QyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZUJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBCQTAzNTUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEQ4MDI5QSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwRkEwMzA3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0VHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NzA2RjAzMUIiDQotCQkJCXJlc3VsdCAgICAgCSJJVHlwZXMiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0VHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NzA5NTAwRUUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJ0eXBlcyINCi0JCQkJCXR5cGUgICAgICAgCSJJVHlwZXMiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMUU3MDJBMSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJSW1wb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QjIwMjAxMTkiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbXBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5JbXBvcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjIwQzAyRUEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUxpc3QiDQotCQkJcXVpZCAgICAgICAJIjNCODVDMEEyMDNDNSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5MaXN0IGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTGlzdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMEFGMDI5NyINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJTWFwIg0KLQkJCXF1aWQgICAgICAgCSIzQjg5NkIwMzAwRDQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTWFwIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTWFwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCMTEwMkI1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklVUkwiDQotCQkJcXVpZCAgICAgICAJIjNCODlENTYzMDI3NCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEubmV0LlVSTCBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5uZXQuVVJMIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1NkUwM0UyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklFeHRlbnNpb25SZWdpc3RyeSINCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1OTMwMkE1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU5RjAyRTgiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiVHlwZXMiDQotCQkJcXVpZCAgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCB0eXBlcyBlbGVtZW50LiBUaGUgdHlwZXMgZWxlbWVudCBlbmNsb3NlcyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSBleGNoYW5nZWQgbWVzc2FnZXMuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQjAxMDMxMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0NBRENEM0IwMzgwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiDQotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0JCMjAwNTAiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWFzIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBRENGMzgwM0U2Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRjdFMDMwMSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklJdGVyYXRvciINCi0JCQlxdWlkICAgICAgIAkiM0M0Njg3REEwMTY3Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuSXRlcmF0b3IiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODgwODAwQjkiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiV1NETEV4Y2VwdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0M0Njg5NjUwMzEzIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXhjZXB0aW9uIGNsYXNzLiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0Njg5NzQwMzE1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0NBRENCQjIwMDUwIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuVHlwZXMgbm9uLU1PRiBpbnRlcmZhY2UiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBRENCRjEwMTczIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDQjI0QUVDMDFDQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjI3RjAwQjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTURvY3VtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0QxNTAyQzAyM0IiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRG9jdW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDRDE1MDYwMDE4MiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCXF1aWQgICAgICAgCSIzRjY3NzFEQjAyREMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y3NjJBNkEwMzA4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzRjY3ODBBMDAxQUIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQcm90ZWN0ZWQiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSINCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDODI0MDE4QyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDODI3MDFDMyINCi0JCQkJbGFiZWwgICAgICAJInBvcnRUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZU9wZXJhdGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQ0QiDQotCQkJCWxhYmVsICAgICAgCSJlT3BlcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSINCi0JCQlxdWlkICAgICAgIAkiM0FENUNFQkUwMEUyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQYXJ0cyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDRUJGMDA2MSINCi0JCQkJbGFiZWwgICAgICAJImVQYXJ0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEMzUyMDEwRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxNzYiDQotCQkJCWxhYmVsICAgICAgCSJlUG9ydFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTgwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEM0UxMDE3OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQzRTIwMjI1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ09wZXJhdGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMzkiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ09wZXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNTAzOEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVENDI2MDJGNSINCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVENDI2MDJGRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MDAzOTMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5NDEwMzFDIg0KLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5NDEwMzFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDlCODAxMUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDlCOTAyNEQiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDlCOTAyNjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMiDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNjAzMDFFMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBCNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZU1lc3NhZ2VzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2MDQwMEMxIg0KLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUiDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNjcxMDEwNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjcyMDM0QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjcyMDM1NCINCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTciDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNjc3MDA5NSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzgwMzdCIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkiDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNjdCMDMxMSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA3RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZVNlcnZpY2VzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2N0QwMDg5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVNlcnZpY2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEiDQotCQkJcXVpZCAgICAgICAJIjNBRDVGRDEzMDA3OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlEIg0KLQkJCQlsYWJlbCAgICAgIAkiZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzIg0KLQkJCXF1aWQgICAgICAgCSIzQURGMkU2NDAxRjUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MSINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nSW5wdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkU2NTAyNTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUiDQotCQkJcXVpZCAgICAgICAJIjNBREYyRUIzMDE2MyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRUI0MDEzQyINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nT3V0cHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNiINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRUI0MDEzRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNyINCi0JCQlxdWlkICAgICAgIAkiM0FERjJGOTQwMjREIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRjk1MDE5MCINCi0JCQkJbGFiZWwgICAgICAJImVJbnB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTlBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkiDQotCQkJcXVpZCAgICAgICAJIjNBREYyRkI4MDJGOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBBIg0KLQkJCQlsYWJlbCAgICAgIAkiZU91dHB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxIg0KLQkJCXF1aWQgICAgICAgCSIzQURGMzMxNjAxQTQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUZhdWx0cyINCi0JCQkJcXVpZCAgICAgICAJIjNBREYzMzE4MDM4NyINCi0JCQkJbGFiZWwgICAgICAJImVGYXVsdHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjMzMTgwMzg4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzMiDQotCQkJcXVpZCAgICAgICAJIjNBREYzNDAwMDNFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0ZhdWx0cyINCi0JCQkJcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQSINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nRmF1bHRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzQwMTAzQUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzUiDQotCQkJcXVpZCAgICAgICAJIjNBRTA5MUY0MDJGMyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQUUwOTFGODAxRkUiDQotCQkJCWxhYmVsICAgICAgCSJlRmF1bHQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNiINCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM3Ig0KLQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NTAwMkQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzgiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMjgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVOYW1lc3BhY2VzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNENTYwMzMyIg0KLQkJCQlsYWJlbCAgICAgIAkiZU5hbWVzcGFjZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM5Ig0KLQkJCXF1aWQgICAgICAgCSIzQUVBM0UzQTAwMkQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZURlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0UzQzAxRTgiDQotCQkJCWxhYmVsICAgICAgCSJlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDAiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0UzQzAxRjIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MSINCi0JCQlxdWlkICAgICAgIAkiM0FFQTQxMkYwMDM1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJcXVpZCAgICAgICAJIjNBRUE0MTMxMDI1NSINCi0JCQkJbGFiZWwgICAgICAJImVQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MiINCi0JCQkJcXVpZCAgICAgICAJIjNBRUE0MTMxMDI1RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQzIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNDAwQkQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUlucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEMjUwMDgzIg0KLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNTAwODQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NSINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFENzkwMEYyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3QTAxNEQiDQotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTRFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhCMUJFOTAwQzQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjhCMUJFOTAzMjciDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDgiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCMUJFOTAzMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDkiDQotCQkJcXVpZCAgICAgICAJIjNCOEIxQzEyMDNCMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjhCMUMxNDAwMUMiDQotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQzE0MDAyNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MSINCi0JCQlxdWlkICAgICAgIAkiM0I4QjFEQ0MwMkU1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVTY2hlbWEiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCMURDRTAyNzAiDQotCQkJCWxhYmVsICAgICAgCSJlU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTIiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCMURDRTAyN0EiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MyINCi0JCQlxdWlkICAgICAgIAkiM0I4QkVBMjcwMjlGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4QkVBMjkwMzU2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlVHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNkEiDQotCQkJCWxhYmVsICAgICAgCSJlVHlwZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU1Ig0KLQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5MzAzRTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMEUiDQotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTYiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTciDQotCQkJcXVpZCAgICAgICAJIjNDODY0REZGMDJFQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlSW1wb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY0REZGMDJFRCINCi0JCQkJbGFiZWwgICAgICAJImVJbXBvcnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTgiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTkiDQotCQkJcXVpZCAgICAgICAJIjNDQzM2MTQ1MDBGMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MCINCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MTQ2MDIzRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MTQ2MDIzRSINCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjEiDQotCQkJcXVpZCAgICAgICAJIjNGNzRFNzg0MDFCMSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNGNzRFNzg2MDAwRiINCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MiINCi0JCQkJcXVpZCAgICAgICAJIjNGNzRFNzg2MDAyMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSINCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MyINCi0JCQlxdWlkICAgICAgIAkiM0Y3ODk2QTIwMjZFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNoaWxkcmVuIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJDIg0KLQkJCQlsYWJlbCAgICAgIAkiY2hpbGRyZW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi43IFNlcnZpY2VzIg0KLQkJCXF1aWQgICAgICAgCSIzOUFEM0VGNjAxMjciDQotCQkJdGl0bGUgICAgICAJIjIuNyBTZXJ2aWNlcyINCi0JCQl6b29tICAgICAgIAk5MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDY2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2MTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSINCi0JCQkJd2lkdGggICAgICAJNTIwDQotCQkJCWhlaWdodCAgICAgCTQwNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiIEAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgNTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0ODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiINCi0JCQkJd2lkdGggICAgICAJMjc4DQotCQkJCWhlaWdodCAgICAgCTIxOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiIEAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDkwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklTZXJ2aWNlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTI2NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCAzODkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCXdpZHRoICAgICAgCTQxMA0KLQkJCQloZWlnaHQgICAgIAkzMDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NEUwMUI0Ig0KLQkJCQljbGllbnQgICAgIAlANA0KLQkJCQlzdXBwbGllciAgIAlAMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQwLCAzNzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDAsIDI5MikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0NCwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTMwMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiDQotCQkJCWNsaWVudCAgICAgCUA2DQotCQkJCXN1cHBsaWVyICAgCUAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMwLCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMCwgMTAwMikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDkxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY3NSwgODQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJCQl3aWR0aCAgICAgIAkzMDANCi0JCQkJaGVpZ2h0ICAgICAJMTY4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQ1MDJDOSINCi0JCQkJY2xpZW50ICAgICAJQDgNCi0JCQkJc3VwcGxpZXIgICAJQDINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwOSwgODI4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODA5LCA2MzcpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDEwDQotCQkJCWxvY2F0aW9uICAgCSgzNDMsIDkxNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRzIiBAMTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEzLCA5NDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjE4OTc4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUMiDQotCQkJCQljbGllbnQgICAgIAlAMTANCi0JCQkJCXN1cHBsaWVyICAgCUA4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM0MywgOTE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgOTE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzOSwgODgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwODAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCA5OTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMjg0NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwIiBAMTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2LCA3NDQpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNDMsIDkxNikNCi0JCQkJCSAgICAoMjU3LCA5MTYpDQotCQkJCQkgICAgKDI1NywgNjc5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjU3LCA2NzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAxLCA3OTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzcwOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEAxOA0KLQkJCQlsb2NhdGlvbiAgIAkoODg2LCAxMjcwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOUI4MDExRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZyIgQDE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE4DQotCQkJCQlsb2NhdGlvbiAgIAkoMzgsIDQyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTEyLCAxMjM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQ4NTcxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDlCOTAyNEQiDQotCQkJCQljbGllbnQgICAgIAlAMTgNCi0JCQkJCXN1cHBsaWVyICAgCUA2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM1LCAxMjcwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzAsIDEzMTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQyODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyIiBAMjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MiwgMTEwNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODc5NDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI2MSINCi0JCQkJCWNsaWVudCAgICAgCUAxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4ODYsIDEyNzApDQotCQkJCQkgICAgKDgxMiwgMTI3MCkNCi0JCQkJCSAgICAoODEyLCA5OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEyLCA5OTYpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi41IEJpbmRpbmdzIg0KLQkJCXF1aWQgICAgICAgCSIzOUFENTEyNzAyNTIiDQotCQkJdGl0bGUgICAgICAJIjIuNSBCaW5kaW5ncyINCi0JCQl6b29tICAgICAgIAk4NQ0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxMTQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCA2NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMzc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIgQDI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAzNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCAxMzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiINCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTU2OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIgQDI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTMzNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0lucHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTI4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIg0KLQkJCQl3aWR0aCAgICAgIAkyNzgNCi0JCQkJaGVpZ2h0ICAgICAJMTc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCIgQDI3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTYzOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ091dHB1dCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE1ODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSINCi0JCQkJd2lkdGggICAgICAJMzEyDQotCQkJCWhlaWdodCAgICAgCTE3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIgQDI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTU4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nRmF1bHQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTA4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiDQotCQkJCXdpZHRoICAgICAgCTI5MA0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgNDg2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJd2lkdGggICAgICAJNjkxDQotCQkJCWhlaWdodCAgICAgCTMwMQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEAzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTI4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDMxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNTg3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAzMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk3LCA1MzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCXdpZHRoICAgICAgCTQzMg0KLQkJCQloZWlnaHQgICAgIAkzMjINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJY2xpZW50ICAgICAJQDMyDQotCQkJCXN1cHBsaWVyICAgCUAyNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc5LCA1MjcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzksIDQyOCkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAMzQNCi0JCQkJbG9jYXRpb24gICAJKDEwMzksIDc0MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1MjAxMEYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlIiBAMzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzQNCi0JCQkJCWxvY2F0aW9uICAgCSg1NzUsIDU5OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ5LCA3ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5MjkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxNzYiDQotCQkJCQljbGllbnQgICAgIAlAMzQNCi0JCQkJCXN1cHBsaWVyICAgCUAyOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1OSwgNzQyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTIsIDcxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjE5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDM4DQotCQkJCQlQYXJlbnRfVmlldyAJQDM0DQotCQkJCQlsb2NhdGlvbiAgIAkoNTc1LCA1OTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc2LCA2OTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA5NDQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxODAiDQotCQkJCQljbGllbnQgICAgIAlAMzQNCi0JCQkJCXN1cHBsaWVyICAgCUAzMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTIwLCA3NDIpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBANDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxMDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzIsIDg1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQl3aWR0aCAgICAgIAk0NTANCi0JCQkJaGVpZ2h0ICAgICAJMzcwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEA0MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDYyNCwgMTQwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzYsIDEyODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTI3NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MyIgQDQyDQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCAxMzU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRDI0MDBCRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEA0Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCQkJbG9jYXRpb24gICAJKDk2LCAyODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzNywgMTMxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzUxNDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4MyINCi0JCQkJCWNsaWVudCAgICAgCUA0Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDMwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTM1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk0LCAxMzk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5NTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NCIgQDQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODQiDQotCQkJCQljbGllbnQgICAgIAlANDINCi0JCQkJCXN1cHBsaWVyICAgCUA0MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4MSwgMTM1OSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBANDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDE2NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODEyLCAxNTM5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIg0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ1IiBANDgNCi0JCQkJbG9jYXRpb24gICAJKDE0MzIsIDE2NTQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFENzkwMEYyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEA0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ1LCAxNjEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NzQ3NzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RCINCi0JCQkJCWNsaWVudCAgICAgCUA0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDMxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTY1NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjgxLCAxNjk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkwMjc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NiIgQDUyDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RSINCi0JCQkJCWNsaWVudCAgICAgCUA0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTY1NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBANTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDEwMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCXdpZHRoICAgICAgCTM2NA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREU0MDFEQyINCi0JCQkJY2xpZW50ICAgICAJQDUzDQotCQkJCXN1cHBsaWVyICAgCUAyNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTY2LCA5MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjYsIDYzNikpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1IiBANTUNCi0JCQkJbG9jYXRpb24gICAJKDQ1NywgMTAyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMTAxNzkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNiIgQDU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzUsIDkyMCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjI1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU1DQotCQkJCQlzdXBwbGllciAgIAlAMzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0NTcsIDEwMjIpDQotCQkJCQkgICAgKDI3NiwgMTAyMikNCi0JCQkJCSAgICAoMjc2LCA4NDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc2LCA4NDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMwLCA4ODQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3BlcmF0aW9ucyIgQDU5DQotCQkJCQlQYXJlbnRfVmlldyAJQDU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIDk3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ09wZXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTE2OTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEM0UyMDIzOSINCi0JCQkJCWNsaWVudCAgICAgCUA1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTAsIDEwMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY5LCA5ODApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODQ5NTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgMTA2NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyNzU2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBANjMNCi0JCQkJbG9jYXRpb24gICAJKDE0MTgsIDEwNDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjUwMzhBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb24iIEA2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxMDc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA2MDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGNSINCi0JCQkJCWNsaWVudCAgICAgCUA2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2MywgMTA0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg5LCAxMDA1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk2NzIxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4IiBANjcNCi0JCQkJCVBhcmVudF9WaWV3IAlANjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3MywgMTA3MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTU0MjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGRiINCi0JCQkJCWNsaWVudCAgICAgCUA2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3NCwgMTA0MCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBANjkNCi0JCQkJbG9jYXRpb24gICAJKDc4NywgMTE5MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NDAxRjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdJbnB1dCIgQDcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2OSwgMTE1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0lucHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTExOTA1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTEiDQotCQkJCQljbGllbnQgICAgIAlANjkNCi0JCQkJCXN1cHBsaWVyICAgCUA0MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc4NywgMTE5MCkNCi0JCQkJCSAgICAoNjM2LCAxMTkwKQ0KLQkJCQkJICAgICg2MzYsIDEyNzEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCAxMjcxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY4NSwgMTIyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0MDQ3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQiIEA3Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODUsIDExNDQpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MiINCi0JCQkJCWNsaWVudCAgICAgCUA2OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzg3LCAxMTkwKQ0KLQkJCQkJICAgICg5MjYsIDExOTApDQotCQkJCQkgICAgKDkyNiwgMTA5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjYsIDEwOTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODcxLCAxMTM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzU4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1IiBANzYNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEzMTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjMwMTYzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3V0cHV0IiBANzcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxMiwgMTQyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ091dHB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0NTA4Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNDIg0KLQkJCQkJY2xpZW50ICAgICAJQDc2DQotCQkJCQlzdXBwbGllciAgIAlANDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2NywgMTQ3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3NDU5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYiIEA4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODMsIDExNDApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRUI0MDEzRCINCi0JCQkJCWNsaWVudCAgICAgCUA3Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTA5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDMxLCAxMTg2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkwMTY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAODMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIwLCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzIsIDE5MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRmF1bHQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMTc4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEA4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxMiwgMTg1OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU3MTAzMzMiDQotCQkJCWNsaWVudCAgICAgCUA4NA0KLQkJCQlzdXBwbGllciAgIAlAMjgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDMsIDIwMDcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDIwMDcpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzMiIEA4Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1NiwgMTM1MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMDAzRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdGYXVsdHMiIEA4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4Ng0KLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODIsIDE3NTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzAwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdGYXVsdHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDMxNTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQSINCi0JCQkJCWNsaWVudCAgICAgCUA4Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NiwgMTg0NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA5LCAxNzk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MTk0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU2LCAxODA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE5MjkxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzQiIEA5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4Ng0KLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQiINCi0JCQkJCWNsaWVudCAgICAgCUA4Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1NiwgMTM1MikNCi0JCQkJCSAgICAoMTM1NiwgMTIxNykNCi0JCQkJCSAgICAoMTExNywgMTIxNykNCi0JCQkJCSAgICAoMTExNywgMTA5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTA5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTUyLCAxMTY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg3MDA4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM1IiBAOTQNCi0JCQkJbG9jYXRpb24gICAJKDE2NDAsIDE5NzApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjQwMkYzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdCIgQDk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDk0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzQsIDE5MTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUZhdWx0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2NDIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkUiDQotCQkJCQljbGllbnQgICAgIAlAOTQNCi0JCQkJCXN1cHBsaWVyICAgCUA4Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjMsIDE5NzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcxOCwgMjAxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MjI3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzYiIEA5OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5NA0KLQkJCQkJbG9jYXRpb24gICAJKC0zNDQsIDgxOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkYiDQotCQkJCQljbGllbnQgICAgIAlAOTQNCi0JCQkJCXN1cHBsaWVyICAgCUA4NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MTcsIDE5NzApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNDMwMkFCIg0KLQkJCQljbGllbnQgICAgIAlANDcNCi0JCQkJc3VwcGxpZXIgICAJQDI3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MDMsIDE2NTYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjQsIDE2NTYpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUxQjAxMTMiDQotCQkJCWNsaWVudCAgICAgCUA0MQ0KLQkJCQlzdXBwbGllciAgIAlAMjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ2NywgMTM4NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMzMSwgMTM4NSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi40IFBvcnRUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0FENUQxQzQwMzY2Ig0KLQkJCXRpdGxlICAgICAgCSIyLjQgUG9ydFR5cGVzIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iDQotCQkJem9vbSAgICAgICAJODANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSIgQDEwMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDE3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUG9ydFR5cGUiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDEyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIg0KLQkJCQl3aWR0aCAgICAgIAk3MTgNCi0JCQkJaGVpZ2h0ICAgICAJMTk2DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIgQDEwMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNiwgMTc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg3Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklPcGVyYXRpb24iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxMjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg3Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSINCi0JCQkJd2lkdGggICAgICAJODkxDQotCQkJCWhlaWdodCAgICAgCTE4OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUlucHV0IiBAMTAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTQzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW5wdXQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTM4NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1Ig0KLQkJCQl3aWR0aCAgICAgIAk2NDQNCi0JCQkJaGVpZ2h0ICAgICAJMTk0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IiBAMTA0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAxNzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTc1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJT3V0cHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE3MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCINCi0JCQkJd2lkdGggICAgICAJNjc0DQotCQkJCWhlaWdodCAgICAgCTE5NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IiBAMTA1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjA3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRmF1bHQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjAyNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIg0KLQkJCQl3aWR0aCAgICAgIAk2NDQNCi0JCQkJaGVpZ2h0ICAgICAJMTk2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDEwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgODAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTgsIDY3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCXdpZHRoICAgICAgCTY5NQ0KLQkJCQloZWlnaHQgICAgIAkyODENCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMTA3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU3NiwgODAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzI1LCA2OTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCXdpZHRoICAgICAgCTUyMA0KLQkJCQloZWlnaHQgICAgIAkyNDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAMTA4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcyOCwgMjExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NywgMjA2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEAxMDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAxNDcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzAsIDE0MjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTI1DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMTEwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgMTc5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgMTc0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCQl3aWR0aCAgICAgIAkyNzQNCi0JCQkJaGVpZ2h0ICAgICAJMTI1DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEAxMTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA3ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTQsIDYyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQl3aWR0aCAgICAgIAk2OTUNCi0JCQkJaGVpZ2h0ICAgICAJMzUyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTEyDQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCA3OTcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjQwMThDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb25zIiBAMTEzDQotCQkJCQlQYXJlbnRfVmlldyAJQDExMg0KLQkJCQkJbG9jYXRpb24gICAJKDU5MiwgMjY5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgNzQ4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzU5NjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQ0QiDQotCQkJCQljbGllbnQgICAgIAlAMTEyDQotCQkJCQlzdXBwbGllciAgIAlAMTExDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjA1LCA3OTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTc2LCA4NjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDAzOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NCwgOTIzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2MjQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicG9ydFR5cGUiIEAxMTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyDQotCQkJCQlsb2NhdGlvbiAgIAkoNTkyLCAyNjkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUMzIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMg0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA3OTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODgsIDc1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MzQ4OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MSIgQDExOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjEwNywgNzczKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUE0MTJGMDAzNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFyYW1ldGVyT3JkZXJpbmciIEAxMjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5DQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NSwgNjQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MzMzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTYsIDc3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzIsIDgyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5NjYxMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcxLCA4ODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMDYyMjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MiIgQDEyNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQkJCWxvY2F0aW9uICAgCSgxODE5LCAxMDEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjVGIg0KLQkJCQkJY2xpZW50ICAgICAJQDExOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5OSwgNzczKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEiIEAxMjUNCi0JCQkJbG9jYXRpb24gICAJKDE3MDIsIDE1MDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTYwMUE0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdHMiIEAxMjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNSwgMTk4MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc4OTkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDIwNDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ0LCAyMDIwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQ5NTgwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTMsIDE5NjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDUzNzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMiIgQDEzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjYxLCAxMDY5KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODgiDQotCQkJCQljbGllbnQgICAgIAlAMTI1DQotCQkJCQlzdXBwbGllciAgIAlAMTExDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDIsIDE1MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgOTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTAzOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzM2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjciIEAxMzMNCi0JCQkJbG9jYXRpb24gICAJKDExNzgsIDEyMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTQwMjREIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDEzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMTM0MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTk4MjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOTAiDQotCQkJCQljbGllbnQgICAgIAlAMTMzDQotCQkJCQlzdXBwbGllciAgIAlAMTA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3OCwgMTIzNCkNCi0JCQkJCSAgICAoOTgwLCAxMjM0KQ0KLQkJCQkJICAgICg5ODAsIDE0MTApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc4LCAxMjM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMTQxMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDYsIDEzNjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Nzc2NjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4IiBAMTM3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMw0KLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNiwgMTAzNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTUwMTlBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDExMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzgsIDEyMzQpDQotCQkJCQkgICAgKDEyNzcsIDEyMzQpDQotCQkJCQkgICAgKDEyNzcsIDk2MCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3NywgOTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NywgMTA1OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjQxMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOSIgQDE0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OCwgMTM0NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCODAyRjkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDE0MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYyLCAxNjY5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDA5MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEEiDQotCQkJCQljbGllbnQgICAgIAlAMTQwDQotCQkJCQlzdXBwbGllciAgIAlAMTEwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMTczMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NDYsIDE2NzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM2MzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwIiBAMTQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MA0KLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjcsIDEwMzcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCA5NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIzLCAxMDgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjkwMzQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRDgwMTlGIg0KLQkJCQljbGllbnQgICAgIAlAMTA2DQotCQkJCXN1cHBsaWVyICAgCUAxMDENCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRTIwMTcxIg0KLQkJCQljbGllbnQgICAgIAlAMTExDQotCQkJCXN1cHBsaWVyICAgCUAxMDINCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRUUwMzFEIg0KLQkJCQljbGllbnQgICAgIAlAMTA5DQotCQkJCXN1cHBsaWVyICAgCUAxMDMNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRjgwMUNEIg0KLQkJCQljbGllbnQgICAgIAlAMTEwDQotCQkJCXN1cHBsaWVyICAgCUAxMDQNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMDIwMDJEIg0KLQkJCQljbGllbnQgICAgIAlAMTA4DQotCQkJCXN1cHBsaWVyICAgCUAxMDUNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTUyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjIyNCwgMTQ1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzNywgMTMxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJd2lkdGggICAgICAJNTkzDQotCQkJCWhlaWdodCAgICAgCTMxMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiIEAxNTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTIwLCAyNTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDI0NjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZVJlZmVyZW5jZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiDQotCQkJCXdpZHRoICAgICAgCTY3Mg0KLQkJCQloZWlnaHQgICAgIAkxODANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE1NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyNCwgMjI3NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTUzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE1MjQsIDIyNzUpDQotCQkJCSAgICAoMTUyNCwgMjQ1NCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIzRDAzMTkiDQotCQkJCWNsaWVudCAgICAgCUAxMDgNCi0JCQkJc3VwcGxpZXIgICAJQDE1Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3NiwgMjE3NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzYsIDIyNzUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE1NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyMzUwMEREIg0KLQkJCQljbGllbnQgICAgIAlAMTEwDQotCQkJCXN1cHBsaWVyICAgCUAxNTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNzEsIDE4NTQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzcxLCAyMjc1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxNTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjI4MDJFNyINCi0JCQkJY2xpZW50ICAgICAJQDEwOQ0KLQkJCQlzdXBwbGllciAgIAlAMTUzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODAsIDE1MzQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODAsIDIyNzUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE1NCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYxIiBAMTU4DQotCQkJCWxvY2F0aW9uICAgCSgyMjA2LCAyMjU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNzRFNzg0MDFCMSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDE1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTgNCi0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY4LCAxNjcwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEyMjMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDBGIg0KLQkJCQkJY2xpZW50ICAgICAJQDE1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDE1Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDYsIDE2MTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYwLCAxNjc4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MiIgQDE2Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTgNCi0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDIzIg0KLQkJCQkJY2xpZW50ICAgICAJQDE1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDE1Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIyMDYsIDIyNTkpDQotCQkJCQkgICAgKDIyMDYsIDI1NTYpDQotCQkJCQkgICAgKDE4NTYsIDI1NTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTYsIDI1NTYpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xIERlZmluaXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTQ4QTAyNjIiDQotCQkJdGl0bGUgICAgICAJIjIuMSBEZWZpbml0aW9ucyINCi0JCQl6b29tICAgICAgIAk4Mw0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iIEAxNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDE5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDE2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRGVmaW5pdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxMTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiINCi0JCQkJd2lkdGggICAgICAJNzA2DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAxNjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODYsIDg5NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCXdpZHRoICAgICAgCTI5NA0KLQkJCQloZWlnaHQgICAgIAkxMjANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDE2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxMCwgNTQ1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkltcG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxODINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAxNjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjExMiwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwMCwgMTA1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxNjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgwOCwgMTQ4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5NiwgMTM2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyODANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAxNjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEyNCwgMTYwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDE2OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDI0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgMzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTEwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTUyOA0KLQkJCQloZWlnaHQgICAgIAk0MjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTMiIEAxNzANCi0JCQkJbG9jYXRpb24gICAJKDEzNTgsIDg2MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAxNzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTcwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTcxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDUzNSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzU2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1OCwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwMywgNTExKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU2NjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAxNzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTcwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODYsIDkwOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzkwOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkJCWNsaWVudCAgICAgCUAxNzANCi0JCQkJCXN1cHBsaWVyICAgCUAxNjQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzU4LCA4NjApDQotCQkJCQkgICAgKDEzNTgsIDk0OCkNCi0JCQkJCSAgICAoMTY3NywgOTQ4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDk0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDk4NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MjY1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NyIgQDE3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTYxMiwgNTk1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDE3OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzcNCi0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTEyKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkJCQljbGllbnQgICAgIAlAMTc3DQotCQkJCQlzdXBwbGllciAgIAlAMTY5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYxMiwgNTk1KQ0KLQkJCQkJICAgICgxNDY0LCA1OTUpDQotCQkJCQkgICAgKDE0NjQsIDQ1MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY0LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTI0LCA0OTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTg2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMTgxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE3Nw0KLQkJCQkJbG9jYXRpb24gICAJKDEyLCAyMjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjkyLCA1NTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUltcG9ydHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODAzMzUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNzcNCi0JCQkJCXN1cHBsaWVyICAgCUAxNjUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDEsIDU5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDY1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MTAwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc2LCA2NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMjU5NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMiIEAxODUNCi0JCQkJbG9jYXRpb24gICAJKDEyNzksIDExMzcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDMwMUUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE4NQ0KLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzOCwgNTkxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQjciDQotCQkJCQljbGllbnQgICAgIAlAMTg1DQotCQkJCQlzdXBwbGllciAgIAlAMTY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3OSwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMCwgNTg2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA0OTc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZXMiIEAxODkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTg1DQotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAxMTcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzEzNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEMxIg0KLQkJCQkJY2xpZW50ICAgICAJQDE4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE2Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNzksIDExMzcpDQotCQkJCQkgICAgKDEyNzksIDEyMDgpDQotCQkJCQkgICAgKDE4OTEsIDEyMDgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTEsIDEyMDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMTcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MzQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTcsIDEyNDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjQ0MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUiIEAxOTMNCi0JCQkJbG9jYXRpb24gICAJKDEyMTIsIDExNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzEwMTA0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2IiBAMTk0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE5Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDU5NCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzIwMzRBIg0KLQkJCQkJY2xpZW50ICAgICAJQDE5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDE2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTIsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYyNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1Nzk2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlcyIgQDE5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxOTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkxLCAxNDUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0VHlwZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MjM2OTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM1NCINCi0JCQkJCWNsaWVudCAgICAgCUAxOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxNjcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjEyLCAxMTU5KQ0KLQkJCQkJICAgICgxMjEyLCAxNDkwKQ0KLQkJCQkJICAgICgxNTg3LCAxNDkwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTg3LCAxNDkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMywgMTQ1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNTYxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxNTQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk1ODU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3IiBAMjAxDQotCQkJCWxvY2F0aW9uICAgCSgxMTE0LCAxNTg1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjc3MDA5NSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOCIgQDIwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMDENCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCA2ODApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3MSINCi0JCQkJCWNsaWVudCAgICAgCUAyMDENCi0JCQkJCXN1cHBsaWVyICAgCUAxNjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE0LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTU1LCA3NTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY3MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5ncyIgQDIwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMDENCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUxLCAxNjc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5ncyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2NjM0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzdCIg0KLQkJCQkJY2xpZW50ICAgICAJQDIwMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE2OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExMTQsIDE1ODUpDQotCQkJCQkgICAgKDExMTQsIDE3MTYpDQotCQkJCQkgICAgKDIxMTUsIDE3MTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDE3MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDUzLCAxNjc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQ1MDc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTQsIDE3NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTEwNzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyMDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgMjA0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyOCwgMTkyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOSIgQDIxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA2NiwgMTUzMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3QjAzMTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAiIEAyMTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMjEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDY2OSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDdGIg0KLQkJCQkJY2xpZW50ICAgICAJQDIxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDE2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMDksIDc1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxOTY5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVNlcnZpY2VzIiBAMjE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDIxMA0KLQkJCQkJbG9jYXRpb24gICAJKC01MjEsIC0xMTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkzLCAyMDI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTZXJ2aWNlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5MTgyNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDg5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDIxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDIwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwNjYsIDE1MzMpDQotCQkJCQkgICAgKDEwNjYsIDIwNTkpDQotCQkJCQkgICAgKDE2MTksIDIwNTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTksIDIwNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU0LCAyMDMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQwMTk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzIsIDIxMTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjA1MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFGODAzODIiDQotCQkJCWNsaWVudCAgICAgCUAxNjkNCi0JCQkJc3VwcGxpZXIgICAJQDE2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NCwgMjYzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg1LCAyNjMpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4zIEV4dGVuc2liaWxpdHkiDQotCQkJcXVpZCAgICAgICAJIjNBRDYwQzUxMDE5MiINCi0JCQl0aXRsZSAgICAgIAkiMi4xLjMgRXh0ZW5zaWJpbGl0eSINCi0JCQl6b29tICAgICAgIAk4MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDIxOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAxNTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTQsIDE1MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCXdpZHRoICAgICAgCTE4Mg0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEAyMjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDE4ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0ODcsIDE4MzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIyMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0MiwgMTY3NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJd2lkdGggICAgICAJMTgyDQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMjIyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCAyMzM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAyMjgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiDQotCQkJCXdpZHRoICAgICAgCTI3NA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iIEAyMjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDczNiwgMTc2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYzLCAxNzA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjQNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCAxMzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgODYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiINCi0JCQkJd2lkdGggICAgICAJODA0DQotCQkJCWhlaWdodCAgICAgCTE3Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBAMjI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDE5NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMTg5OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzQNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBAMjI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAyMTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NjMsIDIwOTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJCXdpZHRoICAgICAgCTMwOA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAyMjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMTI5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEyMzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTIyMg0KLQkJCQloZWlnaHQgICAgIAkxNDYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMjI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM1LCAxMzU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDIyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgNjg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwOSwgNTgwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5LCA2NDEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzEpDQotCQkJCXdpZHRoICAgICAgCTU2MA0KLQkJCQloZWlnaHQgICAgIAkyNDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjMwDQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDEwMzkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0ODAsIDEwMzkpDQotCQkJCSAgICAoNDgwLCA4MDgpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwQ0IwMEFBIg0KLQkJCQljbGllbnQgICAgIAlAMjIwDQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjYsIDE4MjQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY2LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODVCNUE0MDI3RSINCi0JCQkJY2xpZW50ICAgICAJQDIyNg0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk3LCAyMDc5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NywgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOTM4NjAyQzkiDQotCQkJCWNsaWVudCAgICAgCUAyMjINCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxOSwgMjI3MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTksIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1OUIwMDcyIg0KLQkJCQljbGllbnQgICAgIAlAMjI1DQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4OCwgMTg4NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4OCwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MDA5MjAyRjciDQotCQkJCWNsaWVudCAgICAgCUAyMjMNCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzk3LCAxNjk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzk3LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTBGMDJGMCINCi0JCQkJY2xpZW50ICAgICAJQDIxOQ0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDEsIDE1MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDEsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEQjgwM0Q0Ig0KLQkJCQljbGllbnQgICAgIAlAMjI3DQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMSwgMTIyMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMSwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiDQotCQkJCWNsaWVudCAgICAgCUAyMjgNCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDE0LCAxMzQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE0LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTIwMDI1RSINCi0JCQkJY2xpZW50ICAgICAJQDIyMQ0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNjYzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQyOSwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA1ODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA2NDQpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjUpDQotCQkJCXdpZHRoICAgICAgCTU2Mw0KLQkJCQloZWlnaHQgICAgIAkyMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAyNDENCi0JCQkJbG9jYXRpb24gICAJKDExOTEsIDY3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAyNDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjQxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg0NywgNjMxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJCQljbGllbnQgICAgIAlAMjQxDQotCQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjAsIDY3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzMCwgNjI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM5Njk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMjQ1DQotCQkJCQlQYXJlbnRfVmlldyAJQDI0MQ0KLQkJCQkJbG9jYXRpb24gICAJKDIzLCA1NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzU1LCA1MjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3OTA3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkJCWNsaWVudCAgICAgCUAyNDENCi0JCQkJCXN1cHBsaWVyICAgCUAyNDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjMsIDY3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTYsIDYyNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTQwMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYzLCA3NjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI0NzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IiBAMjQ5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDE5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIldTRExFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjMwLCAxNDUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTMpDQotCQkJCXdpZHRoICAgICAgCTc3NA0KLQkJCQloZWlnaHQgICAgIAkyNDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjUwDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCA0MDIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDI0OQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMDA4LCA0MDIpDQotCQkJCSAgICAoMTAwOCwgMzEyKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGRTNDMDNENCINCi0JCQkJY2xpZW50ICAgICAJQDIyOQ0KLQkJCQlzdXBwbGllciAgIAlAMjQ5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTIsIDU2OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ5MiwgNDAyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTQ5MDNEMCINCi0JCQkJY2xpZW50ICAgICAJQDI0MA0KLQkJCQlzdXBwbGllciAgIAlAMjI0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDE1LCA1NzEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE1LCAyNDYpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkRERjUzNTAyQzMiDQotCQkJCWNsaWVudCAgICAgCUAyNDANCi0JCQkJc3VwcGxpZXIgICAJQDI0OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc2MiwgNTcxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MiwgNDAyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE5MiwgMTQwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyOSwgMTMwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk5MjcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkJCQl3aWR0aCAgICAgIAk5NDUNCi0JCQkJaGVpZ2h0ICAgICAJMjM1DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjU1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBRUMwMUNCIg0KLQkJCQljbGllbnQgICAgIAlAMjU0DQotCQkJCXN1cHBsaWVyICAgCUAyNDANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3OTYsIDEyOTEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzk2LCA4MDUpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjMiIEAyNTYNCi0JCQkJbG9jYXRpb24gICAJKDI2MzksIDE3MzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTIwMjZFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY0IiBAMjU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDI1Ng0KLQkJCQkJbG9jYXRpb24gICAJKDYwNywgMzQyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjc5NywgMTM4MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJCIg0KLQkJCQkJY2xpZW50ICAgICAJQDI1Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDI1NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDI2MzksIDE3MzQpDQotCQkJCQkgICAgKDI4MjQsIDE3MzQpDQotCQkJCQkgICAgKDI4MjQsIDE0MjEpDQotCQkJCQkgICAgKDI2NjQsIDE0MjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM5LCAxNzM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2NjQsIDE0MjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNzMxLCAxNDc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjaGlsZHJlbiIgQDI2MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNTYNCi0JCQkJCWxvY2F0aW9uICAgCSg2MDcsIDM0MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzQsIDE2NTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2hpbGRyZW4iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTg1NjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkMiDQotCQkJCQljbGllbnQgICAgIAlAMjU2DQotCQkJCQlzdXBwbGllciAgIAlAMjU0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjYzOSwgMTczNCkNCi0JCQkJCSAgICAoMjE5MSwgMTczNCkNCi0JCQkJCSAgICAoMjE5MSwgMTUyNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzksIDE3MzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE5MSwgMTUyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNDUsIDE1OTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyINCi0JCQlxdWlkICAgICAgIAkiM0FFOEVENzIwMUJEIg0KLQkJCXRpdGxlICAgICAgCSIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciDQotCQkJem9vbSAgICAgICAJOTANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiIEAyNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjIsIDE3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW1wb3J0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTI3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiDQotCQkJCXdpZHRoICAgICAgCTU5OA0KLQkJCQloZWlnaHQgICAgIAkyMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSIgQDI2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTEzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCAxMDQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk5hbWVzcGFjZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJCXdpZHRoICAgICAgCTQ3OQ0KLQkJCQloZWlnaHQgICAgIAkyMTUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMjY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDExNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNjk0DQotCQkJCWhlaWdodCAgICAgCTE3Mw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDI2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0LCAyMzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTQ5MA0KLQkJCQloZWlnaHQgICAgIAkzMjANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzciIEAyNjcNCi0JCQkJbG9jYXRpb24gICAJKDMwOSwgNzg2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzRDU1MDAyRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTmFtZXNwYWNlcyIgQDI2OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNjcNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2MSwgOTU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VOYW1lc3BhY2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk4ODQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzMyIg0KLQkJCQkJY2xpZW50ICAgICAJQDI2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDI2NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDEwMjkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDgsIDk3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2ODcwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDkxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNTA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzgiIEAyNzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjY3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNjgsIDU5MikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRDU2MDMyOCINCi0JCQkJCWNsaWVudCAgICAgCUAyNjcNCi0JCQkJCXN1cHBsaWVyICAgCUAyNjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCA1NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzksIDU4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NDk2MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMjc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgNzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjU1LCA1ODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJd2lkdGggICAgICAJNDUyDQotCQkJCWhlaWdodCAgICAgCTMwNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MSIgQDI3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NiwgMTAwMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDQzAyRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVNjaGVtYSIgQDI3Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNzYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MTAsIC0xMDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxMDE4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyNzAiDQotCQkJCQljbGllbnQgICAgIAlAMjc2DQotCQkJCQlzdXBwbGllciAgIAlAMjY1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ4NiwgMTAwMSkNCi0JCQkJCSAgICAoMTYzMiwgMTAwMSkNCi0JCQkJCSAgICAoMTYzMiwgMTEzMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMiwgMTEzMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjMsIDEwMTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUyIiBAMjgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDI3Ng0KLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyN0EiDQotCQkJCQljbGllbnQgICAgIAlAMjc2DQotCQkJCQlzdXBwbGllciAgIAlAMjc1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NiwgODcyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzkiIEAyODENCi0JCQkJbG9jYXRpb24gICAJKDEwODcsIDQwMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQTAwMkQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDAiIEAyODINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjgxDQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNiwgNDgwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUYyIg0KLQkJCQkJY2xpZW50ICAgICAJQDI4MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDI3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODcsIDQwMykNCi0JCQkJCSAgICAoMTM2NCwgNDAzKQ0KLQkJCQkJICAgICgxMzY0LCA1NjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NCwgNTY4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVEZWZpbml0aW9uIiBAMjg0DQotCQkJCQlQYXJlbnRfVmlldyAJQDI4MQ0KLQkJCQkJbG9jYXRpb24gICAJKDY4NywgLTEyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNSwgMzYzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3NTMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRTgiDQotCQkJCQljbGllbnQgICAgIAlAMjgxDQotCQkJCQlzdXBwbGllciAgIAlAMjY2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDUsIDQwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNDU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE0OTEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMjg3DQotCQkJCWxvY2F0aW9uICAgCSg3MzcsIDgyNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAyODgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjg3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUyLCA2NDcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkJCQljbGllbnQgICAgIAlAMjg3DQotCQkJCQlzdXBwbGllciAgIAlAMjY2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzM3LCA4MjYpDQotCQkJCQkgICAgKDUxMCwgODI2KQ0KLQkJCQkJICAgICg1MTAsIDU0NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNTQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDU3LCA1OTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMjkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDI4Nw0KLQkJCQkJbG9jYXRpb24gICAJKC02NzEsIDEwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDQsIDc3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5OTE4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDI4Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDI3NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ2LCA4MjYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTgwLCA4NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzIyMTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2MiwgOTMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDBEMDM0MCINCi0JCQkJY2xpZW50ICAgICAJQDI3NQ0KLQkJCQlzdXBwbGllciAgIAlAMjYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTU1LCA1NjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCAzMzMpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMiBUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0I4NUFFNTkwMzdFIg0KLQkJCXRpdGxlICAgICAgCSIyLjIgVHlwZXMiDQotCQkJem9vbSAgICAgICAJOTANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTgxDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMjk2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMTIzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OTUsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDANCi0JCQkJaGVpZ2h0ICAgICAJMTc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDI5Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxNjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDYsIDE1MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDc4DQotCQkJCWhlaWdodCAgICAgCTE2Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDI5OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE5NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDE4MjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTE3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCXdpZHRoICAgICAgCTUzNQ0KLQkJCQloZWlnaHQgICAgIAkzMDUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAyOTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTA2NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJd2lkdGggICAgICAJNDY2DQotCQkJCWhlaWdodCAgICAgCTI1OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NyIgQDMwMA0KLQkJCQlsb2NhdGlvbiAgIAkoNzM1LCAxMTcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDBDNCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDMwMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDANCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NSwgMTEzMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTAwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDI5Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg2LCAxMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM5LCAxMjA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg4NzA1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0OCIgQDMwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDANCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMzEiDQotCQkJCQljbGllbnQgICAgIAlAMzAwDQotCQkJCQlzdXBwbGllciAgIAlAMjk5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODUsIDExNzIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OSIgQDMwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTI3LCAxNTkyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEIxQzEyMDNCMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb24iIEAzMDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzA1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY1LCAxMDk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY2LCAxNTU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3NTM5NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDFDIg0KLQkJCQkJY2xpZW50ICAgICAJQDMwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDI5Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk3LCAxNTkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA3LCAxNjQ1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU1ODc3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MCIgQDMwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDI2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDI5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDUyNywgMTU5MikNCi0JCQkJCSAgICAoNDM3LCAxNTkyKQ0KLQkJCQkJICAgICg0MzcsIDEzMTMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAxMzEzKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTUiIEAzMTANCi0JCQkJbG9jYXRpb24gICAJKDMyMiwgMTkxMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5MzAzRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAzMTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM4LCAxODcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ4NTYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMEUiDQotCQkJCQljbGllbnQgICAgIAlAMzEwDQotCQkJCQlzdXBwbGllciAgIAlAMjk4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxOTExKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQzLCAxOTY1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NiIgQDMxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDI5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDMyMiwgMTkxMSkNCi0JCQkJCSAgICAoMjI5LCAxOTExKQ0KLQkJCQkJICAgICgyMjksIDEzMTMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5LCAxMzEzKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMzE1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA2MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNSwgNTEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJd2lkdGggICAgICAJMzg5DQotCQkJCWhlaWdodCAgICAgCTIxNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDMxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTIyMg0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTMiIEAzMTcNCi0JCQkJbG9jYXRpb24gICAJKDIzNCwgNjA0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAzMTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzE3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCA2NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA3DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVR5cGVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjYxMDE3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiDQotCQkJCQljbGllbnQgICAgIAlAMzE3DQotCQkJCQlzdXBwbGllciAgIAlAMzE1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwNiwgNjA0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM4ODMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMzIxDQotCQkJCQlQYXJlbnRfVmlldyAJQDMxNw0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzIxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMywgMzEzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCQljbGllbnQgICAgIAlAMzE3DQotCQkJCQlzdXBwbGllciAgIAlAMzE2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0LCA2MDQpDQotCQkJCQkgICAgKDE3NCwgNjA0KQ0KLQkJCQkJICAgICgxNzQsIDIyNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMjI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4LCAyNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTc3MjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyIgQDMyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAyMDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVR5cGVzIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAxNTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCINCi0JCQkJd2lkdGggICAgICAJMjQ4DQotCQkJCWhlaWdodCAgICAgCTE2Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTksIDc1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MzkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiDQotCQkJCXdpZHRoICAgICAgCTc1Nw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMzI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDEyMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjksIDExMDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNjczDQotCQkJCWhlaWdodCAgICAgCTI1MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1OSIgQDMyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNiwgOTc1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ1MDBGMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MCIgQDMyOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjcNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0QiDQotCQkJCQljbGllbnQgICAgIAlAMzI3DQotCQkJCQlzdXBwbGllciAgIAlAMzI1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCA4NTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzc0LCA5MDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTY0ODkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDMzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjcNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDYsIDEwMzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA3NTc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNFIg0KLQkJCQkJY2xpZW50ICAgICAJQDMyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMyNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgMTA5MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODgsIDEwNTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTE1MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMzMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0QzQjAzODAiDQotCQkJCWNsaWVudCAgICAgCUAzMTUNCi0JCQkJc3VwcGxpZXIgICAJQDMyNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzA1LCA1MDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDUsIDMwNykpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAzMzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAyMjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE1LCAxMzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCQl3aWR0aCAgICAgIAk1MDANCi0JCQkJaGVpZ2h0ICAgICAJMjEyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzM1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQljbGllbnQgICAgIAlAMzE1DQotCQkJCXN1cHBsaWVyICAgCUAzMzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NCwgNTAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU0LCAzMzApKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzM2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDQ2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MCwgMzY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJd2lkdGggICAgICAJNjg3DQotCQkJCWhlaWdodCAgICAgCTIxNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDMzNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwNiwgNDkzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDMzOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTM2LCAzODYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJCQljbGllbnQgICAgIAlAMzM3DQotCQkJCQlzdXBwbGllciAgIAlAMzM0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIwNiwgNDkzKQ0KLQkJCQkJICAgICgxMDk0LCA0OTMpDQotCQkJCQkgICAgKDEwOTQsIDMzMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAzMzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAzNzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjgzMjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAzNDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzM3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NiwgNDU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDM5NzExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJCQljbGllbnQgICAgIAlAMzM3DQotCQkJCQlzdXBwbGllciAgIAlAMzM2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDgxLCA0OTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE1LCA1NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjQ5NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5NiwgMzkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk0OTE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MjdGMDBCNyINCi0JCQkJY2xpZW50ICAgICAJQDMyNQ0KLQkJCQlzdXBwbGllciAgIAlAMzM2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODEyLCA3NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCA1NzIpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMyBNZXNzYWdlcyINCi0JCQlxdWlkICAgICAgIAkiM0JDRTg1M0QwMkM4Ig0KLQkJCXRpdGxlICAgICAgCSIyLjMgTWVzc2FnZXMiDQotCQkJem9vbSAgICAgICAJODUNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIiBAMzQ2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDEyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTWVzc2FnZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgNzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiINCi0JCQkJd2lkdGggICAgICAJMzgwDQotCQkJCWhlaWdodCAgICAgCTMyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiIEAzNDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDEyNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUGFydCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiDQotCQkJCXdpZHRoICAgICAgCTYxNw0KLQkJCQloZWlnaHQgICAgIAkzMjQNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMzQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgODE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCA2OTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCXdpZHRoICAgICAgCTQ5Mg0KLQkJCQloZWlnaHQgICAgIAkyNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNDkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTk2RDAyRjEiDQotCQkJCWNsaWVudCAgICAgCUAzNDgNCi0JCQkJc3VwcGxpZXIgICAJQDM0Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwNCwgNjc4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwNCwgMzg2KSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMzUwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgNTA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQl3aWR0aCAgICAgIAk0MzINCi0JCQkJaGVpZ2h0ICAgICAJMzIyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4RDEwMkJBIg0KLQkJCQljbGllbnQgICAgIAlAMzUwDQotCQkJCXN1cHBsaWVyICAgCUAzNDYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NSwgNDk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCAzODgpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMSIgQDM1Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA5NTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJ0cyIgQDM1Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTINCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgODk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJ0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NzQ1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkYwMDYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDM1Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDM0OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDk1MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEwMDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODk4MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxMDYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQyMDM4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMiIgQDM1Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTINCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwNCwgODkzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNTciDQotCQkJCQljbGllbnQgICAgIAlAMzUyDQotCQkJCQlzdXBwbGllciAgIAlAMzUwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjg4LCA5NTIpDQotCQkJCQkgICAgKDQ0NSwgOTUyKQ0KLQkJCQkJICAgICg0NDUsIDgxNykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgODE3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzkzLCA5MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDc2MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKSkpKSkNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInhzZCINCi0JCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJYU0QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkib3JnLmVjbGlwc2UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkieHNkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHNkLzIwMDIvWFNEIikpDQotCQlxdWlkICAgICAgIAkiMzlBQkRDNkYwMUFBIg0KLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQW5ub3RhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0RTIwMzY2Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXBwbGljYXRpb25JbmZvcm1hdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RUJGMDJDOCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlckluZm9ybWF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFRUEwMTU3Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdGMDUwMUUyIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUF0dHIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2MTAzQkUiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjUyMDJCNCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ4RTIwMEVBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDAzQTAyMjEiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRUIwMkE4Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM4MDBEMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODdGN0IwMzg2Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2UiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjcyRDczNzAzOEYiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ3QkIwMzQ5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNDRjMwMjdEIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNEREIwM0I3Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNERTAwMkQ4Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMDIyMDM4MiINCi0JCQkJdHlwZSAgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzE5RDkwMzQxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREJvdW5kZWRGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1MUQwMzQ0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjNDMDIyNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzUyQTAwQ0MiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5RmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0RjAxMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1NkMwMTUzIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ2FyZGluYWxpdHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4QjgwMjg2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJBQTIwMzEwIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVyaXZhdGlvbk1ldGhvZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNkU0MDIwRSINCi0JCQkJdHlwZSAgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiDQotCQkJCWluaXR2ICAgICAgCSJyZXN0cmljdGlvbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MUQwMjZBIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBsZXhGaW5hbCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MzgwMEM1Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0E0MjAyQjgiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0I4QTAzRTYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjYxODAxNEQiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRkI5NzAwNkUiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMzFBRjVFMDNBNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTkwM0QyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRERCNTAxQTUiDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzgwMDM5NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpYyINCi0JCQlxdWlkICAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNENEMwRjRDMDFBMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldmVyaXR5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY5MUMwMDVEIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlhZ25vc3RpY1NldmVyaXR5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU1RkREMDI4MCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NDMwMTZCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGluZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MDdFMDIxMyINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2x1bW4iDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjExRTAyOTYiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWluaXR2ICAgICAgCSIxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm9kZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMDE2QjZCMDIwMCINCi0JCQkJdHlwZSAgICAgICAJIkRPTU5vZGUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbm5vdGF0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NEYwMTg2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjE3MDAyRSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjYwMzM5Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5pbGxhYmxlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGQjQwMjlGIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0NjgwMzY4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0QTAwM0I5Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0RTAwMDBFIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMTRDMDBCMiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNjgwMUMxIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUY2MjAzQ0YiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMzREQ0IwMDAxOCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERW51bWVyYXRpb25GYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzlEMDNDNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QzY0MDA1NCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyNTY4MDI1OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzM3NDAyNTMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWNldE5hbWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RkI0MDFFQyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVmZmVjdGl2ZVZhbHVlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUFFMzAzQjYiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERmVhdHVyZSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODEwMjBGIg0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODgwMEM1Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZvcm0iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTAyQjAzM0UiDQotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzFBMUIwMTZGIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZ2xvYmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTAwNzAzNzIiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmVhdHVyZVJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwNDQwMTg1Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERml4ZWRGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5OUUwMEMxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Qzg4MDFCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZBNjAwMjAxIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qjk5MDAxNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlEMjAwOEEiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnVuZGFtZW50YWxGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5RTgwMUQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzdCMDM5NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QUEzMDI0MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkZW50aXR5Q29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQxQzcwMTQzIg0KLQkJCQl0eXBlICAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESW1wb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RDkwMDNFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQjE1MDM2QyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbmNsdWRlIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEM3RDAyNTAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4REMwMzgxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiDQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETGVuZ3RoRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc4MDAyREYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3NkMwMDRCIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg5NjAwQzIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOEUwMzA5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFEMzEwM0FEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUUyMDFGNyINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE3NDAyN0QiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhjbHVzaXZlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE5MzAzNTQiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhJbmNsdXNpdmVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjgzMDNCOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhMZW5ndGhGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjdEMDBGQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdEQTAwRjMiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRXhjbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1OTAyODEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQyNDAwOTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRDEwMzk4Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUEyMDA4RSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUJFMDNFMiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTIwMzUzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkxlbmd0aEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3QzQwMEMwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Nzk5MDE1RSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBNjQwMjc5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21wb3NpdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGMUQwMUNGIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcG9zaXRvciINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkUyMDM4MSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI1NTAzODUiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUY2MDJFOCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZWRDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzAwMDE0MiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzA0MDMxRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzTmFtZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1N0YwMTI3Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidVJJIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU4NzAwRTIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGlhc1VSSSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1QUEwMkFGIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwOTYzMDI1RSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETm90YXRpb25EZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OTQzMDJGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU0RjAyM0MiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSWRlbnRpZmllciINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzJFMDBGMCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lkZW50aWZpZXIiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDMzNDAzOTciDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETnVtZXJpY0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NDIwMDc0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NUEzMDAxMiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNET3JkZXJlZEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NTkwMTJDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NEY2MDJEQSINCi0JCQkJdHlwZSAgICAgICAJIlhTRE9yZGVyZWQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhGQzAxRTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWluT2NjdXJzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOEUwM0IyIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1heE9jY3VycyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjk5MDNBRSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3ODBCRDkwMDU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXR0ZXJuRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkNBNTAzOEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0M3OTAzMTEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0QkEwMjNDIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTY4MDAyMTYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJCMzAxRDUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmUiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2QUE2MDMxQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4RjAwMkUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYSINCi0JCQlxdWlkICAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0RTUwM0REIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg2OEVDMDIyNiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5QkZGMDE4MCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUZvcm1EZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNEIwMTAyIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSINCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudEZvcm1EZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNzgwMEFDIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSINCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWxEZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEM0QTcwMDM4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2tEZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY1OUQwMkQ4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNEMjJENkQ4MDM1NiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb21wb3NpdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEU2MDM3MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOUIzMDMzMCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NvcGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NUY1NTAzMkIiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YXJpZXR5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzMxNTgwMEE5Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEVmFyaWV0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU0NEYwMTQ2Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2NUUwMzVBIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsaWRGYWNldHMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUIwRjAwQjYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRlcm0iDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhBQTAxRDMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjQ0MDA2OSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVG90YWxEaWdpdHNGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjYxMDMzNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlBQjAyMzIiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVHlwZURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJGNTAxM0EiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg2MjAwNDUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc4NTAwMjAxIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEV2hpdGVTcGFjZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaWxkY2FyZCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTNBMDA0MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQwRTkwMTlFIg0KLQkJCQl0eXBlICAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDRjg2MDIyMyINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9jZXNzQ29udGVudHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDEyRTAxRTQiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCREI3MDFGOSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDg0RjcwMDkyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOTAxNTAzREUiDQotCQkJCXR5cGUgICAgICAgCSJYU0RYUGF0aFZhcmlldHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCN0JCQkUxMDFCMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01BdHRyIg0KLQkJCXF1aWQgICAgICAgCSIzQkJGOEM4OTAxQjYiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkF0dHIiDQotCQkJCXF1aWQgICAgICAgCSIzQkJGOENCMDAwRDUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDMjc4NTBFMDM4MSINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODUxQjAzQzYiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4MTg5NzkwMjAwIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4MTg5REIwMzc0Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTU5vZGUiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2NEE1MDExNyINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uTm9kZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NUJGMDAyRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJWYWx1ZSINCi0JCQlxdWlkICAgICAgIAkiM0MwNDBCNUIwMzFGIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLmxhbmcuT2JqZWN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MwNDBCOEQwM0Q1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkE3QjBFODAxQTgiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wdGlvbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMTUwMkI3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTIyMDJEMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjkwMkYwIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1RDAwOUIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbml0ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MURDMDJFRCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvdW50YWJseUluZmluaXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxRUMwMTQxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhGaW5hbCINCi0JCQlxdWlkICAgICAgIAkiM0I5N0MyQ0EwMUNCIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFNzAwREEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkVBMDE2QSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNkQyMDExMiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb3NpdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQjg2OUI2MjAwMzciDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5QkQwMDAwMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNob2ljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5Q0I4MDExRSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcXVlbmNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDRTUwMDU3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbnQiDQotCQkJcXVpZCAgICAgICAJIjNCODY5RTI2MDFBRSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5RThFMDI1OCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOTkwMjcxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCODZBNzlGMDNBMiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW1wdHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdDRDAyRjAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaW1wbGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMTAwQ0UiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QzMDFCNyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRPbmx5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDcwMkU5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERlcml2YXRpb25NZXRob2QiDQotCQkJcXVpZCAgICAgICAJIjNCODZBMEIwMDBDRSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkEwQzgwMzI5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDQzAxNjIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpY1NldmVyaXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjhBNzAzMkYiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhdGFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4QzMwM0QwIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXJyb3IiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFNzAwRTMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3YXJuaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4RUEwMUZGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5mb3JtYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQkZFN0ZDMjAxOUEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNUE0MDNERiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NzkwMDQ1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2N0YwMUFDIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4MzAyMEIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI0NTAwNjkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERm9ybSINCi0JCQlxdWlkICAgICAgIAkiM0I5RjkxM0IwMUVCIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxdWFsaWZpZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTE2RjAwMjMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bnF1YWxpZmllZCINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MThDMDA3RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQlxdWlkICAgICAgIAkiM0I4NkExRTAwMjcyIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMjAwODUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXlyZWYiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMzAxNEYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlxdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxNjAzNjUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzVFQTAwMjMiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFueSINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYwMDAzNCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYyMDA1RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDY1MDExNyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkIg0KLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1MjAyRTQiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhbHNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQTkwMjcxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFydGlhbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUJCMDFGRiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRvdGFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQzQwMUIyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2Nlc3NDb250ZW50cyINCi0JCQlxdWlkICAgICAgIAkiM0I4RkY4QzcwMjg0Ig0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHJpY3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGODAwNDUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXgiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGNjAzOEIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJza2lwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RTgwMkJBIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzVCRTAyNzIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjhCMDBCOCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OTQwMjkxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNTAwMjk1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZUZpbmFsIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4MTAyMzAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgzMDEzOCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODgwMjRFIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RTAwMzc0Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1OTEwMEFFIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY2NDAyMzEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjZEMDIxNiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RWYXJpZXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhGRjc3MzAyNDkiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0b21pYyINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0E3MDJERiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRDAxMzkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FGMDM5RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQkVFRDBGNjAzNDIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByZXNlcnZlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMEYwMTE3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVwbGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTI3MDM0RCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbGxhcHNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjkwMzk2Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoVmFyaWV0eSINCi0JCQlxdWlkICAgICAgIAkiM0I4RkZCODkwMzNBIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZWxlY3RvciINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGQkFDMDE5MiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpZWxkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQjMwMjc4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY1Ig0KLQkJCXF1aWQgICAgICAgCSIzQzYyNkVBNzAxMDIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjYiDQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVBOTAxOTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjciDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQURDMDJGNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2OCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDIzOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REFERDAyNDIiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjkiDQotCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDA2RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDMwRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzE4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzEiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTZCMDJDQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTciDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzMiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MjZCMDE5NCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMwOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMxMyINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzUiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjA2MDI5MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjA3MDE3MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcyIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5NDA0RTAwNjciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzgiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyOUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyQTUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzkiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTlGMDA4NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzVBMDAwNkEiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MSINCi0JCQlxdWlkICAgICAgIAkiM0MyNzVEMzIwMjIwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgyIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc1RDNDMDEwRCINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MyINCi0JCQlxdWlkICAgICAgIAkiM0I2ODg3QkYwMTUwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTgiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODUiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MjVFMDFGOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA0NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDUwIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NTAxMEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODgiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NjAwRkEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQiINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4OSINCi0JCQlxdWlkICAgICAgIAkiM0I2RjFERTkwMThBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzZDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzODAiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkxIg0KLQkJCXF1aWQgICAgICAgCSIzQjkwMDY4ODAxQzIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTIiDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudEFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMUIiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50QW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkzIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNTAzNDAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTQiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZGRERENzAxMTMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTYiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGREREQTAyNkIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI3NSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzdERjAyNEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTgiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0UxMDBGRSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5OSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMDZFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwMCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzOTU5MDM0OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAzNEEiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAxIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5OEUzNjAzODYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OThFMzgwMDcyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OThFMzgwMDdDIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlQ29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwMyINCi0JCQlxdWlkICAgICAgIAkiM0I2ODUxQkEwMTI2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1MUJCMDE1MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUxIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwNSINCi0JCQlxdWlkICAgICAgIAkiM0I3NTFCMDgwM0M3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRhaW5lciINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjBDMDFDRSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRhaW5lciINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA2Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwNyINCi0JCQlxdWlkICAgICAgIAkiM0I3NTFCNDgwMjYxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RDb250YWluZXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODUiDQotCQkJCWxhYmVsICAgICAgCSJyb290Q29udGFpbmVyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDgiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMTAzNTYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEwIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFDMzMwMzMxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzM0IiDQotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExMSINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEEwMDY2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExMiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBCMDIzRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEIwMjQ5Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExMyINCi0JCQlxdWlkICAgICAgIAkiM0I2ODkxMTQwMUFGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNyINCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwMDU4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDNCRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0MwIg0KLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNyINCi0JCQlxdWlkICAgICAgIAkiM0I2ODMzRUYwMTYwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExOCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzM0YwMDI5OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzM0YwMDI5OSINCi0JCQkJbGFiZWwgICAgICAJImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCNDFFNjAyNTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQxRUEwMkY3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAzMEIiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIxIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5QzA1OTAxOTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUMwNUQwMUUzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUMwNUQwMUVEIg0KLQkJCQlsYWJlbCAgICAgIAkic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIzIg0KLQkJCXF1aWQgICAgICAgCSIzQzQyREJERDAyOTciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M0MkRCRTAwMTFFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMjgiDQotCQkJCWxhYmVsICAgICAgCSJzdWJzdGl0dXRpb25Hcm91cCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZEMjNCOTAxQ0QiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDIzQkEwMUM0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDRSINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjciDQotCQkJcXVpZCAgICAgICAJIjNCNkQ1OTcxMDJFQSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMDUiDQotCQkJCWxhYmVsICAgICAgCSJzaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI4Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU5NzUwMTE5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyOSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUI2NTMwMTdBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjb3BlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZEIg0KLQkJCQlsYWJlbCAgICAgIAkic2NvcGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCNjU0MDA2RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzMSINCi0JCQlxdWlkICAgICAgIAkiM0MyOTAxMDYwMkQ3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkRmVhdHVyZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwMTBCMDAwRSINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRmVhdHVyZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzMiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDE4MyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzQiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAzM0MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAzNDYiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5RDI5RTAxNEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicmVmZXJlbmNlZEtleSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQyQTgwMTY1Ig0KLQkJCQlsYWJlbCAgICAgIAkicmVmZXJlbmNlZEtleSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzYiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzciDQotCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNEMDAzRSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzgiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRTAyMkEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNlbGVjdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjM0Ig0KLQkJCQlsYWJlbCAgICAgIAkic2VsZWN0b3IiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzOSINCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMDI1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDM2NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZmllbGRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMzc5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZmllbGRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDEiDQotCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q4MDJGQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDIiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QyINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDMiDQotCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M1MDA3RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRENDNjAwNkIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzdEMDI1MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRENDNjAwNkMiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNzAyQzgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTgwM0UyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTkwMDA0Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0NyINCi0JCQlxdWlkICAgICAgIAkiM0I2QkNFQjEwMkY4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0OCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAxQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCNjAwMjUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDkiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNjA2MDI2RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTAiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNzAyMjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInBhcnRpY2xlcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM2MDcwMjIyIg0KLQkJCQlsYWJlbCAgICAgIAkicGFydGljbGVzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1MSINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTUwMDhBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1MiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDA5NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxNjAwQTAiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUzIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzdBQzAyNUEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3QUQwMzM4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibW9kZWxHcm91cCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOSINCi0JCQkJbGFiZWwgICAgICAJIm1vZGVsR3JvdXAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTUiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ1MDM5OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTYiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOEEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOUUiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NyINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEYwMjEyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1OCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEwMDBDOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEwMDBEMyINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTkiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0NzE1MDExOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjAiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQ3MUEwM0I1Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYxIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4M0M4OTAxMjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODNDOEEwMTEwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidGVybSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODNDOEEwMTExIg0KLQkJCQlsYWJlbCAgICAgIAkidGVybSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2MyINCi0JCQlxdWlkICAgICAgIAkiM0I2QURFNDIwMDlBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDJGRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAzMDgiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NSINCi0JCQlxdWlkICAgICAgIAkiM0I2QUU4MjQwMDUxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFODI2MDJBRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkI3Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NyINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhFNkIwMDNEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2OCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTZDMDEwNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTZDMDExMSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RDAxQkYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTcwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRThFMDE5OSINCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzEiDQotCQkJcXVpZCAgICAgICAJIjNCNjZGREZBMDBDMyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzIiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQjAyN0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlRGVjbGFyYXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQjAyN0UiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3MyINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFOTIwMjE2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MzAxOEMiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAwNDkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMzc0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMzdFIg0KLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzciDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRUZGMDI0RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzgiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUYwMDAyNUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibW9kZWxHcm91cERlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUYwMDAyNjQiDQotCQkJCWxhYmVsICAgICAgCSJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3OSINCi0JCQlxdWlkICAgICAgIAkiM0JGQzJBMTcwMUVEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MCINCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3MyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGQzJBMUEwMjdEIg0KLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODEiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRUE3MDIzRSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODIiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUVBODAzOEEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibm90YXRpb25EZWNsYXJhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QiINCi0JCQkJbGFiZWwgICAgICAJIm5vdGF0aW9uRGVjbGFyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MyINCi0JCQlxdWlkICAgICAgIAkiM0I2OUU0NTYwMjkwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4NCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFNDU3MDE2NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTZGIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODUiDQotCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E1MDExMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODYiDQotCQkJCXF1aWQgICAgICAgCSIzQjZENUNBNzAzQjQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNDOCINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4NyINCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1QUQwMzc0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4OCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAwNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImZhY2V0Q29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRjAwMTAiDQotCQkJCWxhYmVsICAgICAgCSJmYWNldENvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4OSINCi0JCQlxdWlkICAgICAgIAkiM0JDOEFFMDIwM0E4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5MCINCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA1MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JDOEFFMDYwMDY1Ig0KLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5MSINCi0JCQlxdWlkICAgICAgIAkiM0I2QzM0QjcwMjA4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5MiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNEJFMDI1OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1lbWJlclR5cGVEZWZpbml0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU5Ig0KLQkJCQlsYWJlbCAgICAgIAkibWVtYmVyVHlwZURlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5MyINCi0JCQlxdWlkICAgICAgIAkiM0I2QzM2MzIwMURCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5NCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNjM1MDA1OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImZ1bmRhbWVudGFsRmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzYzNTAwNjMiDQotCQkJCWxhYmVsICAgICAgCSJmdW5kYW1lbnRhbEZhY2V0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5NSINCi0JCQlxdWlkICAgICAgIAkiM0I2RDM1QUIwMjczIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5NiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQzNUIyMDI5MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMkE1Ig0KLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5NyINCi0JCQlxdWlkICAgICAgIAkiM0I2RDU1NzIwMTZDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5OCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDIyRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTU3NTAyNDMiDQotCQkJCWxhYmVsICAgICAgCSJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTkiDQotCQkJcXVpZCAgICAgICAJIjNCNjlFMjkxMDE1OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDAiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxOUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUUyOTIwMUE5Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMSINCi0JCQlxdWlkICAgICAgIAkiM0I5MDA2Q0YwMDg4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE1RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImRlcml2YXRpb25Bbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTY3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZGVyaXZhdGlvbkFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDMiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjMzMDI2NCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDQiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIzNDAyODQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMzQwMjhFIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDUiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjExMDI2RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDYiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAxRjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTIwMjAzIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNyINCi0JCQlxdWlkICAgICAgIAkiM0M2MjZFQjMwMDA1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwOCINCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUI0MDMyNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVCNDAzMzIiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwOSINCi0JCQlxdWlkICAgICAgIAkiM0JFQkRDODcwMjQ3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxMCINCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDJGOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQkVCREM4QzAzMDMiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjExIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjIyNzAzQ0QiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyMkIwMDYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiDQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbXBvbmVudHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2QyINCi0JCQkJbGFiZWwgICAgICAJImNvbXBvbmVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEzIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjI2OTAxNjUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZGlhZ25vc3RpY3MiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZGlhZ25vc3RpY3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTUiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2NDMxMDM1RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTYiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMjAxQzYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYWxsRGlhZ25vc3RpY3MiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNyINCi0JCQkJbGFiZWwgICAgICAJImFsbERpYWdub3N0aWNzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiDQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE3Ig0KLQkJCXF1aWQgICAgICAgCSIzQzIxRENDNzAwRUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkU2NoZW1hIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzIxRENDRTAwNDMiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZFNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE5Ig0KLQkJCXF1aWQgICAgICAgCSIzQzIxREQwQzAzREIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIwIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiDQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJpbmNvcnBvcmF0ZWRTY2hlbWEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNSINCi0JCQkJbGFiZWwgICAgICAJImluY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIxIg0KLQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNDAwNEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIyIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyMzkxMzYwMENBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwRDQiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIzIg0KLQkJCXF1aWQgICAgICAgCSIzQzI1RDNBNjAxMzEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVmZXJlbmNpbmdEaXJlY3RpdmVzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RDNBOTAzNzEiDQotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNSINCi0JCQlxdWlkICAgICAgIAkiM0MyNUVDRjAwMDVFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFQ0Y0MDAxRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RWZXJzaW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDI4Ig0KLQkJCQlsYWJlbCAgICAgIAkicm9vdFZlcnNpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNyINCi0JCQlxdWlkICAgICAgIAkiM0MyNUVEMEIwMTFCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyOCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRDBGMDEyMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm9yaWdpbmFsVmVyc2lvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRDBGMDEyQiINCi0JCQkJbGFiZWwgICAgICAJIm9yaWdpbmFsVmVyc2lvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI5Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUVBQjAwMUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMwIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTBCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFZlcnNpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRUFGMDExNSINCi0JCQkJbGFiZWwgICAgICAJImluY29ycG9yYXRlZFZlcnNpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzEiDQotCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzIiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwREYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJpdGVtVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBFMCINCi0JCQkJbGFiZWwgICAgICAJIml0ZW1UeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzMiDQotCQkJcXVpZCAgICAgICAJIjNDMjc4NDczMDE5NCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3NTAxRjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWFGb3JTY2hlbWEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3NTAxRkIiDQotCQkJCWxhYmVsICAgICAgCSJzY2hlbWFGb3JTY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNSINCi0JCQlxdWlkICAgICAgIAkiM0MyODgwRjUwM0Q5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MEY5MDAzQyINCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM2Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODgwRjkwMDQ2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzciDQotCQkJcXVpZCAgICAgICAJIjNDMjg4MkM1MDEzNyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzgiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWFyeUNvbXBvbmVudCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODgyQzcwMTEzIg0KLQkJCQlsYWJlbCAgICAgIAkicHJpbWFyeUNvbXBvbmVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzkiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBMEYyMDFBNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwRjMwMkU1Ig0KLQkJCQlsYWJlbCAgICAgIAkidHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQwIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwRjMwMkYwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQxIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTZEQjAxRTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTZERDAzREQiDQotCQkJCWxhYmVsICAgICAgCSJyb290VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0RFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MyINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3MTIwMTA4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTUxIg0KLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzE0MDE1QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDUiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBNzRCMDE3OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzaW1wbGVUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3NEQwMTdCIg0KLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ2Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3NEQwMTg1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0NyINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3RUQwM0MwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbXBsZXhUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3RjQwMTE3Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29tcGxleFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0OCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDEyMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDkiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBOTk0MDMwQSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwREQiDQotCQkJCWxhYmVsICAgICAgCSJyb290VHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBFNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTEiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMDg1MDI1QiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTIiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyNzAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDg2MDI3QSINCi0JCQkJbGFiZWwgICAgICAJIm1pbkZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1MyINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwOEQwMjUyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1NCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDhFMDA5MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDlCIg0KLQkJCQlsYWJlbCAgICAgIAkibWF4RmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU1Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQjAzOTYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQUMwM0M5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4SW5jbHVzaXZlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzRDQiDQotCQkJCWxhYmVsICAgICAgCSJtYXhJbmNsdXNpdmVGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTciDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFGMDMzOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTgiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAxRjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5JbmNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEIwMDIwMyINCi0JCQkJbGFiZWwgICAgICAJIm1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1OSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQjMwMjA3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2MCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI0MDE5MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTlBIg0KLQkJCQlsYWJlbCAgICAgIAkibWluRXhjbHVzaXZlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYxIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNjAyOEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYyIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjcwMjE3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMjEiDQotCQkJCWxhYmVsICAgICAgCSJtYXhFeGNsdXNpdmVGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjMiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDA1MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNDYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJsZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDI1MCINCi0JCQkJbGFiZWwgICAgICAJImxlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2NSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkYwMThDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2NiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA2QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIndoaXRlU3BhY2VGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA3NSINCi0JCQkJbGFiZWwgICAgICAJIndoaXRlU3BhY2VGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY3Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMjAyMUQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzMwMEFCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZW51bWVyYXRpb25GYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUMiDQotCQkJCWxhYmVsICAgICAgCSJlbnVtZXJhdGlvbkZhY2V0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2OSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzUwMTU5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3MCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInBhdHRlcm5GYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNjAwQkEiDQotCQkJCWxhYmVsICAgICAgCSJwYXR0ZXJuRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzEiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEM4MDJBNyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzIiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUY1Ig0KLQkJCQlsYWJlbCAgICAgIAkiY2FyZGluYWxpdHlGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3MyINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQ0IwMzlDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMENDMDNEMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm51bWVyaWNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMENDMDNEMSINCi0JCQkJbGFiZWwgICAgICAJIm51bWVyaWNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROdW1lcmljRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc1Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDRjAxOTkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDg1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4TGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEMjAwOEYiDQotCQkJCWxhYmVsICAgICAgCSJtYXhMZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzciDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ1MDBDNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzgiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBENjAwMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5MZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAyNyINCi0JCQkJbGFiZWwgICAgICAJIm1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3OSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwMERFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDNDRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAzRDciDQotCQkJCWxhYmVsICAgICAgCSJ0b3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgxIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQjAzNzciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgyIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzVBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERDMDM2NCINCi0JCQkJbGFiZWwgICAgICAJImZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODMiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDA0OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmRlcmVkRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQzMiDQotCQkJCWxhYmVsICAgICAgCSJvcmRlcmVkRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwRTMwMEQ5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEU0MDM4RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImJvdW5kZWRGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEU0MDM5OCINCi0JCQkJbGFiZWwgICAgICAJImJvdW5kZWRGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RCb3VuZGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg3Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NDAxRUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzYwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTWF4RmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NTAzNkEiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODkiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNTRGMDE0NSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTAiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOEMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOTYiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI1QzQwMTFDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNUM1MDIwRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjE3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkzIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQTAwQUEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTM4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNjJCMDE0MiINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTUiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNkIwMDNBNiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTYiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTIiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NyINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI3Q0EwMjZCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5OCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCN0NCMDE4NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQjAxOTAiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk5Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MDAwNjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAwIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODQxMDAyNyINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDEiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCODk4MDE2RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDIiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5OTAwNTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA2MCINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMyINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI4REMwMDUyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDNCOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0MzIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA1Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MDAxREIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMENGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTWluRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MTAwRDkiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNaW5GYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDciDQotCQkJcXVpZCAgICAgICAJIjNENEJCNEFFMDFDQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDgiDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRjAxMEYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNGYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDExQSINCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY0ZhY2V0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDkiDQotCQkJcXVpZCAgICAgICAJIjNENEJCNEQzMDI4RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTAiDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRENDAyRjMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljUGFydGljbGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGRCINCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1BhcnRpY2xlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMSINCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0RDkwMUY2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMiINCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNERBMDI4NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjhFIg0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljV2lsZGNhcmQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEzIg0KLQkJCXF1aWQgICAgICAgCSIzRDRDNjhGRjAxQkYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzE0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QzY5MDIwMzE3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QzY5MDIwMzE4Ig0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljV2lsZGNhcmQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQ0KLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiDQotCQkJcXVpZCAgICAgICAJIjNCNjg0NzY4MDEzOCINCi0JCQl0aXRsZSAgICAgIAkiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAMzYwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCA4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMzYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgNTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk0MCwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJd2lkdGggICAgICAJNDc0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzYyDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDIyNSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDkyOCwgMjI1KQ0KLQkJCQkgICAgKDkyOCwgMTM1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAMzYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMzIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjAsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzY0DQotCQkJCWxvY2F0aW9uICAgCSgxMjAzLCA3MDYpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMjAzLCA3MDYpDQotCQkJCSAgICAoMTIwMywgNjE1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEAzNjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCA1NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzcyLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJd2lkdGggICAgICAJNTIyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzY2DQotCQkJCWxvY2F0aW9uICAgCSg0NDQsIDcwOSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzY1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQ0NCwgNzA5KQ0KLQkJCQkgICAgKDQ0NCwgNjE1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjcNCi0JCQkJbG9jYXRpb24gICAJKDE1NzIsIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzYzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE1NzIsIDQ2NSkNCi0JCQkJICAgICgxNTcyLCAzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMzY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgODAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyOTAsIDc1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMzY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMTA1NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjIsIDEwMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEAzNzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEwNCwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MzYsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAkzNTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNzENCi0JCQkJbG9jYXRpb24gICAJKDQ1MywgMTIwMykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzY5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQ1MywgMTIwMykNCi0JCQkJICAgICg0NTMsIDExMTEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAMzcyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCXdpZHRoICAgICAgCTI0Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEAzNzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCA4MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0NiwgNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNzQNCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDk1MCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzczDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE4NzIsIDk1MCkNCi0JCQkJICAgICgxODcyLCA4NTUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM3NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgxLCA0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDM3Mg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxODEsIDQ2NSkNCi0JCQkJICAgICgxODEsIDM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAzNzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTI4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MCwgMTIzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTU1MA0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDM3Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzM0LCAxMDEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEAzNzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTQ4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OSwgMTQ0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJNjU2DQotCQkJCWhlaWdodCAgICAgCTExMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDM3OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTg0LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDMsIDE0NDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTYzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTU4MQ0KLQkJCQloZWlnaHQgICAgIAkxMTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMzgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDU2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjk0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAzODENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTA1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMDEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDM4Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCA1NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDYsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAzODMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDYsIDEyNTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCA1NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYwLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjgyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMzg1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDEyODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMiwgMTIzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAzODYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMCwgMTQ0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk2OTQNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEAzODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDI2LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCXdpZHRoICAgICAgCTMxOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDM4OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTQwMg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzODkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDdCQjAzNDkiDQotCQkJCWNsaWVudCAgICAgCUAzNzANCi0JCQkJc3VwcGxpZXIgICAJQDM2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NCwgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDM5MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgODAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY5MCwgNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzOTENCi0JCQkJbG9jYXRpb24gICAJKDk2MiwgOTQ3KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoOTYyLCA5NDcpDQotCQkJCSAgICAoOTYyLCA4NTUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzkyDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDM5Mw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTgsIDExNTQpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNjM1MzQNCi0JCQkJICAgIGhlaWdodCAgICAgCTY5DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIg0KLQkJCQljbGllbnQgICAgIAlAMzgzDQotCQkJCXN1cHBsaWVyICAgCUAzNjUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OSwgMTI0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OSwgNzA5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDM4Mw0KLQkJCQlzdXBwbGllciAgIAlAMzY5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTYsIDEyNDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTYsIDEyMDMpDQotCQkJCWRyYXdTdXBwbGllciAJQDM3MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIg0KLQkJCQljbGllbnQgICAgIAlAMzg0DQotCQkJCXN1cHBsaWVyICAgCUAzNzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NCwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg0LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM3NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5Ig0KLQkJCQljbGllbnQgICAgIAlAMzgyDQotCQkJCXN1cHBsaWVyICAgCUAzNjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMDIsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMDIsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhBQTAxRDMiDQotCQkJCWNsaWVudCAgICAgCUAzNjMNCi0JCQkJc3VwcGxpZXIgICAJQDM2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2OSwgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OSwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSINCi0JCQkJY2xpZW50ICAgICAJQDM4MA0KLQkJCQlzdXBwbGllciAgIAlAMzYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkwLCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDkwLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3Ig0KLQkJCQljbGllbnQgICAgIAlAMzY4DQotCQkJCXN1cHBsaWVyICAgCUAzNjUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUxMCwgNzQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA3MDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDAwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzgwMEQyIg0KLQkJCQljbGllbnQgICAgIAlAMzg1DQotCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjEsIDEyMjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzIxLCA5NDcpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDAxDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQwMg0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM3LCA4ODYpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTU4MTINCi0JCQkJICAgIGhlaWdodCAgICAgCTY0DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIg0KLQkJCQljbGllbnQgICAgIAlAMzc3DQotCQkJCXN1cHBsaWVyICAgCUAzNjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDAsIDEwMDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjAwLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDAzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQljbGllbnQgICAgIAlAMzc3DQotCQkJCXN1cHBsaWVyICAgCUAzNzMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEwMDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCA5NTApDQotCQkJCWRyYXdTdXBwbGllciAJQDM3NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlAMzY5DQotCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1MCwgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgOTQ3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJY2xpZW50ICAgICAJQDM3Mg0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NywgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4NEY3MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDM4OA0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDEyLCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDEyLCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QjgwMjg2Ig0KLQkJCQljbGllbnQgICAgIAlAMzY1DQotCQkJCXN1cHBsaWVyICAgCUAzNjANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNCwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODM0LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3Ig0KLQkJCQljbGllbnQgICAgIAlAMzYxDQotCQkJCXN1cHBsaWVyICAgCUAzNjANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTAsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTAsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiDQotCQkJCWNsaWVudCAgICAgCUAzODcNCi0JCQkJc3VwcGxpZXIgICAJQDM2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTcyLCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzIsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCWNsaWVudCAgICAgCUAzNzYNCi0JCQkJc3VwcGxpZXIgICAJQDM3Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MywgMTIyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2OTMsIDk1MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiDQotCQkJCWNsaWVudCAgICAgCUAzNzgNCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU5MCwgMTQzMikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDcwNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDk0MzAyRjEiDQotCQkJCWNsaWVudCAgICAgCUAzNzkNCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMSwgMTQzMikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzEsIDcwNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiDQotCQkJCWNsaWVudCAgICAgCUAzOTANCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTU5LCA3NDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDcwNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCWNsaWVudCAgICAgCUAzNzMNCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg3MiwgNzQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3MiwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCINCi0JCQkJY2xpZW50ICAgICAJQDM4MQ0KLQkJCQlzdXBwbGllciAgIAlAMzkwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjIsIDEwMDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjIsIDk0NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTYNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDE3DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk1LCAxMzg4KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE4Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDQyNTMxDQotCQkJCSAgICBoZWlnaHQgICAgIAk2Nw0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCQUEyMDMxMCINCi0JCQkJY2xpZW50ICAgICAJQDM4Ng0KLQkJCQlzdXBwbGllciAgIAlAMzcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOCwgMTQyOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM3NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDE4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAMzg2DQotCQkJCXN1cHBsaWVyICAgCUAzNjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY1NiwgMTQyOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMTIwMykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzcxKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuIENvbXBvbmVudCBSZWxhdGlvbnMgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIg0KLQkJCXF1aWQgICAgICAgCSIzNzRCMTgxOTAwMjgiDQotCQkJdGl0bGUgICAgICAJIjIuIENvbXBvbmVudCBSZWxhdGlvbnMgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIg0KLQkJCXpvb20gICAgICAgCTk2DQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBANDE5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzg0LCAxNjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY3MCwgMTU5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCXdpZHRoICAgICAgCTI0Ng0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA0MjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDE2MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDE1OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyOSIgQDQyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk0LCAxNjI3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNjUzMDE3QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY29wZSIgQDQyMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0MjENCi0JCQkJCWxvY2F0aW9uICAgCSgyODYsIC00ODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTUsIDE1ODkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NvcGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzEyNTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlCNjU0MDA2RCINCi0JCQkJCWNsaWVudCAgICAgCUA0MjENCi0JCQkJCXN1cHBsaWVyICAgCUA0MTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MSwgMTYyNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTY2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MTAxOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMwIiBANDI1DQotCQkJCQlQYXJlbnRfVmlldyAJQDQyMQ0KLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkUiDQotCQkJCQljbGllbnQgICAgIAlANDIxDQotCQkJCQlzdXBwbGllciAgIAlANDIwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMTYyNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMjcsIDE2MjcpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBANDI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDEyMzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4NCwgMTE5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA0MjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE3NiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDUxLCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNjgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjEiIEA0MjgNCi0JCQkJbG9jYXRpb24gICAJKDIyMjksIDExMTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDODkwMTIyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MiIgQDQyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0MjgNCi0JCQkJCWxvY2F0aW9uICAgCSg1NDksIC0yNDgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDOEEwMTEwIg0KLQkJCQkJY2xpZW50ICAgICAJQDQyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDQyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDEwNDUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidGVybSIgQDQzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0MjgNCi0JCQkJCWxvY2F0aW9uICAgCSg1NDksIC0yNDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTU3LCAxMTIxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Rlcm0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzQzMjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMSINCi0JCQkJCWNsaWVudCAgICAgCUA0MjgNCi0JCQkJCXN1cHBsaWVyICAgCUA0MjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyOSwgMTExMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3NCwgMTExOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExOTQwMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEA0MzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMTIzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDc2LCAxMTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCXdpZHRoICAgICAgCTUyMg0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA0MzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNzY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTc3LCA3MjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTM1Mg0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0OSIgQDQzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjIxOSwgODgwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNjA2MDI2RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTAiIEA0MzYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1NywgLTI0MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNzAyMjEiDQotCQkJCQljbGllbnQgICAgIAlANDM1DQotCQkJCQlzdXBwbGllciAgIAlANDM0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA4MjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGFydGljbGVzIiBANDM3DQotCQkJCQlQYXJlbnRfVmlldyAJQDQzNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTA1LCA4ODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFydGljbGVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU2NjI3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIyIg0KLQkJCQkJY2xpZW50ICAgICAJQDQzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE5LCA4ODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxOSwgOTM5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4MSwgODg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU2NjI3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NzYsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzOSwgOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjkyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANDQxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkwNSwgMTM4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAkzNTINCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQ0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTUiIEA0NDMNCi0JCQkJbG9jYXRpb24gICAJKDU5MCwgMTE0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVBQjAyNzMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk2IiBANDQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ0Mw0KLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDI5MSINCi0JCQkJCWNsaWVudCAgICAgCUA0NDMNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg1OTAsIDExNDApDQotCQkJCQkgICAgKDU0MCwgMTE0MCkNCi0JCQkJCSAgICAoNTQwLCAxMDQ1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU0MCwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA0NDUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDQzDQotCQkJCQlsb2NhdGlvbiAgIAkoMzAyLCAxNDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDExNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMDUzNTcxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyQTUiDQotCQkJCQljbGllbnQgICAgIAlANDQzDQotCQkJCQlzdXBwbGllciAgIAlANDQyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNTkwLCAxMTQwKQ0KLQkJCQkJICAgICg2NDEsIDExNDApDQotCQkJCQkgICAgKDY0MSwgMTA0NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MCwgMTE0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDEsIDEwNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODQsIDEwOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTIyNDQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQ0OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NSwgOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTU0NA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk3IiBANDQ5DQotCQkJCWxvY2F0aW9uICAgCSgxMTE5LCAxMTEyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0RGMDI0RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5OCIgQDQ1MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZEIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEwNDUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudFR5cGUiIEA0NTENCi0JCQkJCVBhcmVudF9WaWV3IAlANDQ5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1NjksIC04KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1OSwgMTEyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50VHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0UxMDBGRSINCi0JCQkJCWNsaWVudCAgICAgCUA0NDkNCi0JCQkJCXN1cHBsaWVyICAgCUA0MzMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MywgMTEyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDMiIEA0NTQNCi0JCQkJbG9jYXRpb24gICAJKDE0NTUsIDk4MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQTAxMjYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA0IiBANDU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ1NA0KLQkJCQkJbG9jYXRpb24gICAJKDE1OSwgLTU3MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQjAxNTAiDQotCQkJCQljbGllbnQgICAgIAlANDU0DQotCQkJCQlzdXBwbGllciAgIAlANDQ4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjgwLCA5ODIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmQiIEA0NTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDU0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NSwgOTI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2Mjg1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ1NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMCwgOTgyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1MCwgMTAyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0Mjg1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5OSIgQDQ1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTIxLCAxMjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDA2RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDAiIEA0NjANCi0JCQkJCVBhcmVudF9WaWV3IAlANDU5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg3MSwgLTM3NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAzNDkiDQotCQkJCQljbGllbnQgICAgIAlANDU5DQotCQkJCQlzdXBwbGllciAgIAlANDQ4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyMSwgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEwNDUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVXNlcyIgQDQ2MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDYyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMjUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVVzZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNjk5MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAzNEEiDQotCQkJCQljbGllbnQgICAgIAlANDU5DQotCQkJCQlzdXBwbGllciAgIAlANDQxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyMSwgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEzNzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzksIDEyNTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODgzNDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANDY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgNzY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTIyLCA3MjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzgwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJMzk4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANDY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDE2MzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjMsIDE1OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANDY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwMywgNDA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTA4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUzIiBANDY3DQotCQkJCWxvY2F0aW9uICAgCSgyMjE2LCA2MDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUMwMjVBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NCIgQDQ2OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTUyLCAtODE2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOCINCi0JCQkJCWNsaWVudCAgICAgCUA0NjcNCi0JCQkJCXN1cHBsaWVyICAgCUA0NjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxNiwgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDUwMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwIiBANDY5DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ2Nw0KLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCA2MjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MjYwOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSINCi0JCQkJCWNsaWVudCAgICAgCUA0NjcNCi0JCQkJCXN1cHBsaWVyICAgCUA0MzQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxNiwgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDY5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNTYsIDYzMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzMzY0NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA0NzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOSwgMTM4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MyIgQDQ3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTY3NiwgMTIwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdCRjAxNTAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODQiIEA0NzQNCi0JCQkJCVBhcmVudF9WaWV3IAlANDczDQotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBNyINCi0JCQkJCWNsaWVudCAgICAgCUA0NzMNCi0JCQkJCXN1cHBsaWVyICAgCUA0NzINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY3NiwgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc2LCAxMzcxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkIiBANDc1DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3Mw0KLQkJCQkJbG9jYXRpb24gICAJKDQxMiwgLTM0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTcsIDExMDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MjU3NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdDMDAwQTgiDQotCQkJCQljbGllbnQgICAgIAlANDczDQotCQkJCQlzdXBwbGllciAgIAlANDQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NzYsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTgsIDExMDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MTk2MzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzkiIEA0NzgNCi0JCQkJbG9jYXRpb24gICAJKDE0MjksIDE0MzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1OUYwMDg2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgwIiBANDc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3OA0KLQkJCQkJbG9jYXRpb24gICAJKC0zNjMsIC0xNDYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDY5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTAsIDE0MzgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVXNlcyIgQDQ4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzYzLCAtMTQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNSwgMTUwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVVc2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMyNTk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNkEiDQotCQkJCQljbGllbnQgICAgIAlANDc4DQotCQkJCQlzdXBwbGllciAgIAlANDQxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI0OCwgMTQzOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjcsIDEzOTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NjM1MzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA0ODMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODMsIDEzODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NyIgQDQ4NA0KLQkJCQlsb2NhdGlvbiAgIAkoNzc3LCAxNDI1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTg1MDEwRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4OCIgQDQ4NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTE5LCAtMzY3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTg2MDBGQSINCi0JCQkJCWNsaWVudCAgICAgCUA0ODQNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NiwgMTQyNSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDQ4Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTE5LCAtMzY3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzg0LCAxNTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA1OTI1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzcsIDE0MjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU4LCAxNDI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIxLCAxMzg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyNDQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDcxIiBANDg5DQotCQkJCWxvY2F0aW9uICAgCSgyMzcsIDEyMDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkIwMkNCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDcyIiBANDkwDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTYiDQotCQkJCQljbGllbnQgICAgIAlANDg5DQotCQkJCQlzdXBwbGllciAgIAlANDgzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzcsIDEzNzEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEA0OTENCi0JCQkJCVBhcmVudF9WaWV3IAlANDg5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNDMsIDcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzg4LCAxMjQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTZEMDBBNyINCi0JCQkJCWNsaWVudCAgICAgCUA0ODkNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NSwgMTI0NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMzkyNjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA0OTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA3ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDk0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4LCA3NDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MyIgQDQ5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzI4LCA3NzUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzUwMzQwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk0IiBANDk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NQ0KLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEQiDQotCQkJCQljbGllbnQgICAgIAlANDk1DQotCQkJCQlzdXBwbGllciAgIAlANDQ4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzI4LCA3NzUpDQotCQkJCQkgICAgKDc4OCwgNzc1KQ0KLQkJCQkJICAgICg3ODgsIDkzOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcyOCwgNzc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4OCwgOTM5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDQ5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTgsIDg4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4xNDA5NDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEUiDQotCQkJCQljbGllbnQgICAgIAlANDk1DQotCQkJCQlzdXBwbGllciAgIAlANDk0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcyOCwgNzc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3OSwgNzc1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDk5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzUwLCA4MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTUyNDM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA1MDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgNDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDE3LCA0MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTYwOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNSIgQDUwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYyOSwgNTc0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEMjlFMDE0RCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2VkS2V5IiBANTAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDUwMQ0KLQkJCQkJbG9jYXRpb24gICAJKC04MywgOTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzYxLCA2MDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVmZXJlbmNlZEtleSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43OTcyOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2NSINCi0JCQkJCWNsaWVudCAgICAgCUA1MDENCi0JCQkJCXN1cHBsaWVyICAgCUA1MDANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjI5LCA1NzQpDQotCQkJCQkgICAgKDE1NTUsIDU3NCkNCi0JCQkJCSAgICAoMTU1NSwgNTAxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyOSwgNTc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTUsIDUwMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjIsIDUzOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0NzYxOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM2IiBANTA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDUwMQ0KLQkJCQkJbG9jYXRpb24gICAJKC04MywgOTQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyQTgwMTZGIg0KLQkJCQkJY2xpZW50ICAgICAJQDUwMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUwMA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MjksIDU3NCkNCi0JCQkJCSAgICAoMTY4OSwgNTc0KQ0KLQkJCQkJICAgICgxNjg5LCA0NDQpDQotCQkJCQkgICAgKDE2MTYsIDQ0NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE2LCA0NDQpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzkiIEA1MDYNCi0JCQkJbG9jYXRpb24gICAJKDExOTcsIDYwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAwMjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQwIiBANTA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDUwNg0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSINCi0JCQkJCWNsaWVudCAgICAgCUA1MDYNCi0JCQkJCXN1cHBsaWVyICAgCUA1MDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDUwMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEA1MDgNCi0JCQkJCVBhcmVudF9WaWV3IAlANTA2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNSwgMzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTE5LCA2NTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmllbGRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM5MjUyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNzkiDQotCQkJCQljbGllbnQgICAgIAlANTA2DQotCQkJCQlzdXBwbGllciAgIAlANDY0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA3MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUzLCA2NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk5MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM3IiBANTExDQotCQkJCWxvY2F0aW9uICAgCSgxNDE1LCA2MDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzOCIgQDUxMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTENCi0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIyQSINCi0JCQkJCWNsaWVudCAgICAgCUA1MTENCi0JCQkJCXN1cHBsaWVyICAgCUA1MDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDUwMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDUxMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTENCi0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMywgNjUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDExMjE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiDQotCQkJCQljbGllbnQgICAgIAlANTExDQotCQkJCQlzdXBwbGllciAgIAlANDY0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE1LCA3MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzgxLCA2NTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTI1MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANTE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTU5OQ0KLQkJCQloZWlnaHQgICAgIAkyMDkNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4MSIgQDUxNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjM5NSwgNjA2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUE3MDIzRSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODIiIEA1MTgNCi0JCQkJCVBhcmVudF9WaWV3IAlANTE3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgMTc0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRUE4MDM4QSINCi0JCQkJCWNsaWVudCAgICAgCUA1MTcNCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzk1LCA2MDYpDQotCQkJCQkgICAgKDIzOTUsIDY1KQ0KLQkJCQkJICAgICgxNjExLCA2NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCA2NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJub3RhdGlvbkRlY2xhcmF0aW9ucyIgQDUxOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDg5LCAxMDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbm90YXRpb25EZWNsYXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDg5Nzc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzA3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhCIg0KLQkJCQkJY2xpZW50ICAgICAJQDUxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzOTUsIDYwNikNCi0JCQkJCSAgICAoMjM5NSwgMTYzMykNCi0JCQkJCSAgICAoMjA5OCwgMTYzMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk4LCAxNjMzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM0NCwgMTA1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4NzgyOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzciIEA1MjINCi0JCQkJbG9jYXRpb24gICAJKDE3NzIsIDI0OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVGRjAyNEYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc4IiBANTIzDQotCQkJCQlQYXJlbnRfVmlldyAJQDUyMg0KLQkJCQkJbG9jYXRpb24gICAJKC05NDgsIC0zMjcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVGMDAwMjVBIg0KLQkJCQkJY2xpZW50ICAgICAJQDUyMg0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzcyLCAyNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMjQ5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXBEZWZpbml0aW9ucyIgQDUyNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjINCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NiwgMzM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzU5Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI2NCINCi0JCQkJCWNsaWVudCAgICAgCUA1MjINCi0JCQkJCXN1cHBsaWVyICAgCUA0NjYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzcyLCAyNDkpDQotCQkJCQkgICAgKDE4MzIsIDI0OSkNCi0JCQkJCSAgICAoMTgzMiwgMzk1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MzIsIDM5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDM0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNzg2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzMiIEA1MjcNCi0JCQkJbG9jYXRpb24gICAJKDIzNDYsIDUxOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MjAyMTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc0IiBANTI4DQotCQkJCQlQYXJlbnRfVmlldyAJQDUyNw0KLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcyLCAxODU3KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjYzMDA3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QiINCi0JCQkJCWNsaWVudCAgICAgCUA1MjcNCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQ2LCA1MTgpDQotCQkJCQkgICAgKDIzNDYsIDE0OSkNCi0JCQkJCSAgICAoMTYxMSwgMTQ5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDE0OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIiBANTMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDUyNw0KLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA4LCAxOTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zNDk5NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MzAxOEMiDQotCQkJCQljbGllbnQgICAgIAlANTI3DQotCQkJCQlzdXBwbGllciAgIAlANDcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0NiwgNTE4KQ0KLQkJCQkJICAgICgyMzQ2LCAxNDQxKQ0KLQkJCQkJICAgICgyMTY2LCAxNDQxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNjYsIDE0NDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjk5LCAxOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ4ODYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3NSIgQDUzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzLCAxNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMDQ5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3NiIgQDUzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDM3NCINCi0JCQkJCWNsaWVudCAgICAgCUA1MzMNCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAzLCAxNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTU5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9ucyIgQDUzNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ5LCAxOTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjQ3NTcyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzdFIg0KLQkJCQkJY2xpZW50ICAgICAJQDUzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ5NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIwMywgMTU5KQ0KLQkJCQkJICAgICgxMDQsIDE1OSkNCi0JCQkJCSAgICAoMTA0LCA3ODQpDQotCQkJCQkgICAgKDE4OSwgNzg0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAzLCAxNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5LCA3ODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTUsIDIwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1OTcwMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzkiIEA1MzgNCi0JCQkJbG9jYXRpb24gICAJKDEwODcsIDMyOSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExNzAxRUQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgwIiBANTM5DQotCQkJCQlQYXJlbnRfVmlldyAJQDUzOA0KLQkJCQkJbG9jYXRpb24gICAJKC01NzcsIC0yMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExQTAyNzMiDQotCQkJCQljbGllbnQgICAgIAlANTM4DQotCQkJCQlzdXBwbGllciAgIAlANTE2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAyNjQpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEA1NDANCi0JCQkJCVBhcmVudF9WaWV3IAlANTM4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3NSwgMzM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMwOTUyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjdEIg0KLQkJCQkJY2xpZW50ICAgICAJQDUzOA0KLQkJCQkJc3VwcGxpZXIgICAJQDUwMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgMzk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxOCwgMzM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTA3MTQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3MSIgQDU0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNDgsIDMyMCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQTAwQzMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTcyIiBANTQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDU0Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RCINCi0JCQkJCWNsaWVudCAgICAgCUA1NDMNCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OSwgMzIyKQ0KLQkJCQkJICAgICg0OSwgNjgpDQotCQkJCQkgICAgKDEwMTMsIDY4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDksIDMyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCA2OCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiIEA1NDUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTQzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC0yODgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzgsIDEwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVEZWNsYXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk4NTM2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkIwMjdFIg0KLQkJCQkJY2xpZW50ICAgICAJQDU0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ5LCAzMjIpDQotCQkJCQkgICAgKDQ5LCAxNDE1KQ0KLQkJCQkJICAgICgxNzQsIDE0MTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMTQxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxLCAxMDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk2NzA2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDU0OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTQ4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1LCA0MTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNTAxDQotCQkJCWhlaWdodCAgICAgCTk3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjEiIEA1NDkNCi0JCQkJbG9jYXRpb24gICAJKDQ5OSwgNTg5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlDMDU5MDE5OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjIiIEA1NTANCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzLCAxMDkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUUzIg0KLQkJCQkJY2xpZW50ICAgICAJQDU0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU0OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ5OSwgNTg5KQ0KLQkJCQkJICAgICg0NTIsIDU4OSkNCi0JCQkJCSAgICAoNDUyLCA0OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTksIDU4OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTIsIDQ5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIiBANTUxDQotCQkJCQlQYXJlbnRfVmlldyAJQDU0OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODExLCA1ODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAk2LjUyMDgzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1RDAxRUQiDQotCQkJCQljbGllbnQgICAgIAlANTQ5DQotCQkJCQlzdXBwbGllciAgIAlANTQ4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDk5LCA1ODkpDQotCQkJCQkgICAgKDU0NywgNTg5KQ0KLQkJCQkJICAgICg1NDcsIDQ5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU0NywgNDk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDk5LCA1NTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE1IiBANTU0DQotCQkJCWxvY2F0aW9uICAgCSgyNDEsIDYxMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAwNTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE2IiBANTU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDU1NA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzQzLCAtMjE5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDNCRiINCi0JCQkJCWNsaWVudCAgICAgCUA1NTQNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQxLCA2MTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA0OTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEA1NTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANTU0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzNDMsIC0yMTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MDgsIDY5NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4NjQ0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE2Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDNDMCINCi0JCQkJCWNsaWVudCAgICAgCUA1NTQNCi0JCQkJCXN1cHBsaWVyICAgCUA0OTQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQxLCA2MTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA3MzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDY4NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxMDE2OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTciIEA1NTkNCi0JCQkJbG9jYXRpb24gICAJKDgzNywgNDYwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzM0VGMDE2MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTgiIEA1NjANCi0JCQkJCVBhcmVudF9WaWV3IAlANTU5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiDQotCQkJCQljbGllbnQgICAgIAlANTU5DQotCQkJCQlzdXBwbGllciAgIAlANTQ4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNywgNDYwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgNDYwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANTYxDQotCQkJCQlQYXJlbnRfVmlldyAJQDU1OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xODE5LCAtNjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDUyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1MTQ2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU1OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUwMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA4LCA0NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDQwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMDQzNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjkiIEA1NjQNCi0JCQkJbG9jYXRpb24gICAJKDU0MSwgMjQ2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRThEMDFCRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzAiIEA1NjUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTY0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMjMsIC0xODYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEUwMTk4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU2NA0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NDEsIDI0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAyNDYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudERlY2xhcmF0aW9ucyIgQDU2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0MywgMzM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDkzMDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OSINCi0JCQkJCWNsaWVudCAgICAgCUA1NjQNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg1NDEsIDI0NikNCi0JCQkJCSAgICAoMjI0LCAyNDYpDQotCQkJCQkgICAgKDIyNCwgNDAwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI0LCA0MDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODYsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDY5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjMiIEA1NjkNCi0JCQkJbG9jYXRpb24gICAJKDM1MywgNjIxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDNDJEQkREMDI5NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjQiIEA1NzANCi0JCQkJCVBhcmVudF9WaWV3IAlANTY5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTFFIg0KLQkJCQkJY2xpZW50ICAgICAJQDU2OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU0OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM1MywgNjIxKQ0KLQkJCQkJICAgICgzMDYsIDYyMSkNCi0JCQkJCSAgICAoMzA2LCA0OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDYsIDQ5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cCIgQDU3MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTcxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3OSwgNjM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTQuODA4NTExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMjgiDQotCQkJCQljbGllbnQgICAgIAlANTY5DQotCQkJCQlzdXBwbGllciAgIAlANTQ4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzUzLCA2MjEpDQotCQkJCQkgICAgKDQwMCwgNjIxKQ0KLQkJCQkJICAgICg0MDAsIDQ5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM1MywgNjIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNDk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUwLCA1ODMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY5NzY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIzLiBDb21wb25lbnQgQXR0cmlidXRlcyAgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5RTc4NjAyQzUiDQotCQkJdGl0bGUgICAgICAJIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBANTc0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2LCA0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2LCAxMDcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBuYW1lIDogU3RyaW5nIg0KLQkJCQkJIisgdGFyZ2V0TmFtZXNwYWNlIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTUzNA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA1NzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTY3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJNTEyDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA1NzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMTY4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTUyNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTU4NCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTUNCi0JCQkJICAgIG1heF93aWR0aCAgCTExMzkNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBkZXJpdmF0aW9uTWV0aG9kIDogWFNERGVyaXZhdGlvbk1ldGhvZCA9IHJlc3RyaWN0aW9uIg0KLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RDb21wbGV4RmluYWwiDQotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iDQotCQkJCQkiKyBjb250ZW50VHlwZUNhdGVnb3J5IDogWFNEQ29udGVudFR5cGVDYXRlZ29yeSINCi0JCQkJCSI8PDAuLio+PiArIHByb2hpYml0ZWRTdWJzdGl0dXRpb25zIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKSkNCi0JCQkJd2lkdGggICAgICAJMTE5Mg0KLQkJCQloZWlnaHQgICAgIAkzMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTc3DQotCQkJCWxvY2F0aW9uICAgCSg0NjMsIDM2MikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANTc0DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQ2MywgMzYyKQ0KLQkJCQkgICAgKDQ2MywgMjIxKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDU3OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCAxNjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTE5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMTU3OSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTU5Mg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhcmlldHkgOiBYU0RWYXJpZXR5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDU3OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDE0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCAzOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDk4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgcmVxdWlyZWQgOiBib29sZWFuIg0KLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSINCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpDQotCQkJCXdpZHRoICAgICAgCTU0OA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA1ODANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAxOTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgzMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg5MCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTEyNjANCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBuYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkgOiBYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCQkiPDwwLi4qPj4gKyBuYW1lc3BhY2VDb25zdHJhaW50IDogU3RyaW5nIg0KLQkJCQkJIisgcHJvY2Vzc0NvbnRlbnRzIDogWFNEUHJvY2Vzc0NvbnRlbnRzIikpDQotCQkJCXdpZHRoICAgICAgCTEzMDQNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA1ODENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE0NDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCAxMzg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAk1OTYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA1ODINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA1MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQ5MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiDQotCQkJCQkiKyBjb25zdHJhaW50IDogWFNEQ29uc3RyYWludCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDU4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMjk0LCA2OTcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDU4Mg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyOTQsIDY5NykNCi0JCQkJICAgICgyOTQsIDYwNSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANTg0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI1NiwgMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTk1LCA0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAk1NDANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBANTg1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDUxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDE4LCA0NjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDU4Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjY4NCwgOTYyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA1ODUNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjY4NCwgOTYyKQ0KLQkJCQkgICAgKDI2ODQsIDU3NikpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9zaXRvciIgQDU4Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDExMTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9zaXRvciIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxMDY2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUI2MjAwMzciDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWludCIgQDU4OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgNTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzgsIDQ2OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0MTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODY5RTI2MDFBRSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REZXJpdmF0aW9uTWV0aG9kIiBANTg5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE5MiwgMjI3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4MCwgMjIxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REZXJpdmF0aW9uTWV0aG9kIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4MCwgMjE2MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NkEwQjAwMENFIg0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IiBANTkwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCA4OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyODEsIDM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTFFMDAyNzIiDQotCQkJCXdpZHRoICAgICAgCTYyNQ0KLQkJCQloZWlnaHQgICAgIAkzMDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29udGVudFR5cGVDYXRlZ29yeSIgQDU5MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MDQsIDIyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIxMTUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIwNjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODZBNzlGMDNBMiINCi0JCQkJd2lkdGggICAgICAJNTE0DQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANTkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAxNjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MDgsIDE1MTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVmFyaWV0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcwOCwgMTQ2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY3NzMwMjQ5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjINCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2Nlc3NDb250ZW50cyIgQDU5Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMjI0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2Nlc3NDb250ZW50cyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMjEwNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY4QzcwMjg0Ig0KLQkJCQl3aWR0aCAgICAgIAk0MzgNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoVmFyaWV0eSIgQDU5NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3NjgsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgOTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhWYXJpZXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGQjg5MDMzQSINCi0JCQkJd2lkdGggICAgICAJMzgxDQotCQkJCWhlaWdodCAgICAgCTI1MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDU5NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAxODcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxNzg4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTczOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxODQ4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTk5DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbGlzdCINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIg0KLQkJCQkJIisgdW5pb24iKSkNCi0JCQkJd2lkdGggICAgICAJMzQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4RmluYWwiIEA1OTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMjAwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMTk0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxODkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzJDQTAxQ0IiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDIwMDEpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzODINCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIgQDU5Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDg1LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTA3NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1OTEwMEFFIg0KLQkJCQl3aWR0aCAgICAgIAk2NDgNCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIiBANTk4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0NDAsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDExMTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMDY2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVBNDAzREYiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDExNzYpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzYNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBzdWJzdGl0dXRpb24iDQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTYNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBANTk5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2NjQsIDIyNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIyMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMTYzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVCRTAyNzIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIyNzMpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTANCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIgQDYwMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgMjI0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxNTQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxMDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUVBMDAyMyINCi0JCQkJd2lkdGggICAgICAJNjk2DQotCQkJCWhlaWdodCAgICAgCTI5Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA2MDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2NCwgODgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDc0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCA4MDkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAkxMzU3DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbmlsbGFibGUgOiBib29sZWFuIg0KLQkJCQkJIjw8MC4uKj4+ICsgZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMgOiBYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyINCi0JCQkJCSI8PDAuLio+PiArIHN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyA6IFhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQkJCSIrIGFic3RyYWN0IDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAkxNDA0DQotCQkJCWhlaWdodCAgICAgCTI4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDYwMQ0KLQkJCQlzdXBwbGllciAgIAlANTgyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODEsIDczNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4MSwgNjk3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1ODMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDYwMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDgxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ5Mg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANjA0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDExNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjAsIDExMDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiINCi0JCQkJY2xpZW50ICAgICAJQDYwNA0KLQkJCQlzdXBwbGllciAgIAlANTg1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODYyLCAxMDg4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg2MiwgOTYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1ODYpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDYwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMzEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNjgsIDEyNjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzODYNCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjM3NSwgMTQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjA2DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIzNzUsIDE0NjUpDQotCQkJCSAgICAoMjM3NSwgMTM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCWNsaWVudCAgICAgCUA2MDYNCi0JCQkJc3VwcGxpZXIgICAJQDU4NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM2OCwgMTI0OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNjgsIDk2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTg2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MDkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUA1NzYNCi0JCQkJc3VwcGxpZXIgICAJQDYwNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgxOCwgMTUxMikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4MTgsIDE0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDYwNykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjEwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlANTc4DQotCQkJCXN1cHBsaWVyICAgCUA2MDYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDYsIDE1MDcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA2LCAxNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MDcpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDYxMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCAxMTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODE4LCAxMTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCINCi0JCQkJY2xpZW50ICAgICAJQDYxMQ0KLQkJCQlzdXBwbGllciAgIAlANTg1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTE1LCAxMDg5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgOTYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1ODYpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANjEzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgNTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDM0LCA0NjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTEzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAkxMTUwDQotCQkJCWhlaWdodCAgICAgCTE0NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiINCi0JCQkJY2xpZW50ICAgICAJQDYxMw0KLQkJCQlzdXBwbGllciAgIAlANTc0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY4LCA0NTYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY4LCAzNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDU3NykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA2MTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCA3ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzgsIDcwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNTAyDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA2MTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQzLCAyNjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjg0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSINCi0JCQkJY2xpZW50ICAgICAJQDYxNQ0KLQkJCQlzdXBwbGllciAgIAlANTc0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjkwLCA2OTEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjkwLCAzNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDU3NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjE4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIg0KLQkJCQljbGllbnQgICAgIAlANjAzDQotCQkJCXN1cHBsaWVyICAgCUA1ODINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MSwgODAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxLCA2OTcpDQotCQkJCWRyYXdTdXBwbGllciAJQDU4MykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjE5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQljbGllbnQgICAgIAlANTgyDQotCQkJCXN1cHBsaWVyICAgCUA1NzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM3MiwgNDE5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzcyLCAzNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDU3NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjIwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQljbGllbnQgICAgIAlANTg1DQotCQkJCXN1cHBsaWVyICAgCUA1NzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2ODcsIDQ0OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2ODcsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTc3KSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjQuIENvbXBvbmVudCBIaWVyYXJjaHksIFJlbGF0aW9ucyBhbmQgQXR0cmlidXRlcyAoUGFydCAyOiBEYXRhdHlwZXMpIg0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzI2NTAwNUYiDQotCQkJdGl0bGUgICAgICAJIjQuIENvbXBvbmVudCBIaWVyYXJjaHksIFJlbGF0aW9ucyBhbmQgQXR0cmlidXRlcyAoUGFydCAyOiBEYXRhdHlwZXMpIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IiBANjIxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCA4OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzIsIDg0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGaXhlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSINCi0JCQkJd2lkdGggICAgICAJMzM4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA2MjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3MjAsIDg5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDQsIDg0NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk0NTANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEA2MjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NiwgMTExMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbnVtZXJhdGlvbkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQkJd2lkdGggICAgICAJNDc4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEA2MjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzcsIDExMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGF0dGVybkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MjUNCi0JCQkJbG9jYXRpb24gICAJKDcxOCwgMTA0OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjIyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDcxOCwgMTA0OSkNCi0JCQkJICAgICg3MTgsIDk1OSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IiBANjI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgOTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzk5LCA4NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCINCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RCb3VuZGVkRmFjZXQiIEA2MjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCA5MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODMsIDg3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0Ig0KLQkJCQl3aWR0aCAgICAgIAkzODgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEA2MjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDMyLCAxMTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA3LCAxMDQ4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAk0NjgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIgQDYyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDExMDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTksIDEwNDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETnVtZXJpY0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQkJd2lkdGggICAgICAJMzg4DQotCQkJCWhlaWdodCAgICAgCTEzNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIgQDYzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgMTM3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDkxLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQkJd2lkdGggICAgICAJMzQ4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDYzMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDYwOCwgMTU1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA1LCAxNDk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkxlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQkJd2lkdGggICAgICAJNDI0DQotCQkJCWhlaWdodCAgICAgCTEzNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MzINCi0JCQkJbG9jYXRpb24gICAJKDE0NCwgMTI2MikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE0NCwgMTI2MikNCi0JCQkJICAgICgxNDQsIDk2NCkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEA2MzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCAxNTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA3LCAxNDk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQkJd2lkdGggICAgICAJNDM2DQotCQkJCWhlaWdodCAgICAgCTEzNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiIEA2MzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMzc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDEzMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQkJd2lkdGggICAgICAJNDk4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCIgQDYzNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE3MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTAsIDE2NzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCQl3aWR0aCAgICAgIAk0NjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBANjM2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgMTkwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMTg1MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhFeGNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiIEA2MzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDE3MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MiwgMTY3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5JbmNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJCXdpZHRoICAgICAgCTQ0Ng0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiIEA2MzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDE5MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNCwgMTg1MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiDQotCQkJCXdpZHRoICAgICAgCTQ3NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDYzOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMjExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIsIDIwNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVG90YWxEaWdpdHNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJCXdpZHRoICAgICAgCTQyNg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIgQDY0MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTgsIDIwNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM5RDAzQzciDQotCQkJCWNsaWVudCAgICAgCUA2MjMNCi0JCQkJc3VwcGxpZXIgICAJQDYyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzk0LCAxMTAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzk0LCAxMDQ5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODYyMDA0NSINCi0JCQkJY2xpZW50ICAgICAJQDYzNA0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMzA4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBANjQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAxNjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAxMTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2Q0E1MDM4RCINCi0JCQkJY2xpZW50ICAgICAJQDYyNA0KLQkJCQlzdXBwbGllciAgIAlANjIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMTAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA0NCwgMTA0OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjI1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4MDAyREYiDQotCQkJCWNsaWVudCAgICAgCUA2MzANCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYzLCAxMzA4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYzLCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkIiBANjQ2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTQwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTMyNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTI3NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNTIwMkU0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDQNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5IiBANjQ3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTY2OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2MTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCQzc3MTVEMDA5QiINCi0JCQkJd2lkdGggICAgICAJNDQ0DQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlIiBANjQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMjAzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2MSwgMTk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2MSwgMTkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JFRUQwRjYwMzQyIg0KLQkJCQl3aWR0aCAgICAgIAk0MjQNCi0JCQkJaGVpZ2h0ICAgICAJMjg3DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlZhbHVlIiBANjQ5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAyMDk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDIwNjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVmFsdWUiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDIwMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQzA0MEI1QjAzMUYiDQotCQkJCXdpZHRoICAgICAgCTYzNg0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I2MTAzMzciDQotCQkJCWNsaWVudCAgICAgCUA2MzkNCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDIwNDQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEA2NTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAxMzc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTM4MCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1NA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkNCi0JCQkJd2lkdGggICAgICAJMzA0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIgQDY1Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxMzc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDEzMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzgwKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzMDYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjUzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMjQwMDk4Ig0KLQkJCQljbGllbnQgICAgIAlANjUxDQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNSwgMTMwOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQzMTAzQUQiDQotCQkJCWNsaWVudCAgICAgCUA2NTINCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgMTMwOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODEsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTIwMzUzIg0KLQkJCQljbGllbnQgICAgIAlANjM3DQotCQkJCXN1cHBsaWVyICAgCUA2NTENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NSwgMTY2NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NSwgMTQ0NCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjgzMDNCOCINCi0JCQkJY2xpZW50ICAgICAJQDYzNQ0KLQkJCQlzdXBwbGllciAgIAlANjUyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAwLCAxNjY0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMCwgMTQ0NCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjhFMDMwOSINCi0JCQkJY2xpZW50ICAgICAJQDYzNg0KLQkJCQlzdXBwbGllciAgIAlANjUyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjIyLCAxODQwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyMiwgMTQ0NCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M0MDBDMCINCi0JCQkJY2xpZW50ICAgICAJQDYzMQ0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDcsIDE0ODUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDcsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCN0QwMEZDIg0KLQkJCQljbGllbnQgICAgIAlANjMzDQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzOTcsIDE0ODUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzk3LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3Qjk5MDAxNiINCi0JCQkJY2xpZW50ICAgICAJQDY0MA0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc1LCAyMDQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA2NjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAzNjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAzMTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAk0MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTI1DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMzY2LCA1MjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgzNjYsIDUyMikNCi0JCQkJICAgICgzNjYsIDQzMCkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEA2NjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDYyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNCwgNTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyINCi0JCQkJd2lkdGggICAgICAJNDYyDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NjQNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgNzgxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2NjMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjcyLCA3ODEpDQotCQkJCSAgICAoMjcyLCA2ODcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjY1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIg0KLQkJCQljbGllbnQgICAgIAlANjIyDQotCQkJCXN1cHBsaWVyICAgCUA2NjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5NCwgODMzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTk0LCA3ODEpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiIEA2NjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDYyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjYsIDU3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGdW5kYW1lbnRhbEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiINCi0JCQkJd2lkdGggICAgICAJNDcwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NjcNCi0JCQkJbG9jYXRpb24gICAJKDc2OCwgNzg5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2NjYNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNzY4LCA3ODkpDQotCQkJCSAgICAoNzY4LCA2ODcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjY4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NTkwMTJDIg0KLQkJCQljbGllbnQgICAgIAlANjI2DQotCQkJCXN1cHBsaWVyICAgCUA2NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNTAsIDg2MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTAsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzYzQzAyMjQiDQotCQkJCWNsaWVudCAgICAgCUA2MjcNCi0JCQkJc3VwcGxpZXIgICAJQDY2Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUyNSwgODYwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyNSwgNzg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY3MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjRGMDEzMSINCi0JCQkJY2xpZW50ICAgICAJQDYyOA0KLQkJCQlzdXBwbGllciAgIAlANjY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjM3LCAxMDM2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzNywgNzg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY3MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjQyMDA3NCINCi0JCQkJY2xpZW50ICAgICAJQDYyOQ0KLQkJCQlzdXBwbGllciAgIAlANjY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAxMDM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgNzg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjcpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDY3Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDU2LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgMTA3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTk4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiDQotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpDQotCQkJCXdpZHRoICAgICAgCTY1Ng0KLQkJCQloZWlnaHQgICAgIAkyNTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI3IiBANjczDQotCQkJCWxvY2F0aW9uICAgCSg3NzUsIDE3OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3MTAyRUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI4IiBANjc0DQotCQkJCQlQYXJlbnRfVmlldyAJQDY3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjA5LCAtNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NzUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDksIDIzNSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDExOSINCi0JCQkJCWNsaWVudCAgICAgCUA2NzMNCi0JCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NzUsIDE3OCkNCi0JCQkJCSAgICAoNTUwLCAxNzgpDQotCQkJCQkgICAgKDU1MCwgMzA2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTUwLCAzMDYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2ltcGxlVHlwZURlZmluaXRpb24iIEA2NzYNCi0JCQkJCVBhcmVudF9WaWV3IAlANjczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjc2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjgzMTMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMDUiDQotCQkJCQljbGllbnQgICAgIAlANjczDQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDE3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjc2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNjEsIDIxNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjUwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODkiIEA2NzkNCi0JCQkJbG9jYXRpb24gICAJKDM2OSwgNzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDIwM0E4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0cyIgQDY4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2NzkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTYxNSwgLTE1MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NywgNDk2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZhY2V0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg2Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDYwMDY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY3OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDY2Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM2OSwgNzIpDQotCQkJCQkgICAgKDEwMCwgNzIpDQotCQkJCQkgICAgKDEwMCwgNTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDAsIDU2MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYwLCA0OTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc5MDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5MCIgQDY4Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2NzkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTYxNSwgLTE1MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjgzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NiwgMzEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNTEiDQotCQkJCQljbGllbnQgICAgIAlANjc5DQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2OSwgNzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgNzIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzEiIEA2ODUNCi0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDUwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjg2DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzgsIDQ0OSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQkJICAgIGhlaWdodCAgICAgCTYwDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwREUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMyIiBANjg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDY4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC00NDYsIDI4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDYsIDM0MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERiINCi0JCQkJCWNsaWVudCAgICAgCUA2ODUNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM4LCA1MDgpDQotCQkJCQkgICAgKDE0ODcsIDUwOCkNCi0JCQkJCSAgICAoMTQ4NywgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgNTA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDI4NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpdGVtVHlwZURlZmluaXRpb24iIEA2ODkNCi0JCQkJCVBhcmVudF9WaWV3IAlANjg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2l0ZW1UeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4yMTE1MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBFMCINCi0JCQkJCWNsaWVudCAgICAgCUA2ODUNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM4LCA1MDgpDQotCQkJCQkgICAgKDE1OTAsIDUwOCkNCi0JCQkJCSAgICAoMTU5MCwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgNTA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY5MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjg5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDQ2OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMzk4NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTEiIEA2OTINCi0JCQkJbG9jYXRpb24gICAJKDE3MjksIDU3NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCNzAyMDgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkyIiBANjkzDQotCQkJCQlQYXJlbnRfVmlldyAJQDY5Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjkzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDM1MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNEJFMDI1OCINCi0JCQkJCWNsaWVudCAgICAgCUA2OTINCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzI5LCA1NzQpDQotCQkJCQkgICAgKDE2NzgsIDU3NCkNCi0JCQkJCSAgICAoMTY3OCwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzgsIDI4NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiIEA2OTUNCi0JCQkJCVBhcmVudF9WaWV3IAlANjkyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgMzUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjk2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNjU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21lbWJlclR5cGVEZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy4yNjkyMzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNEJFMDI1OSINCi0JCQkJCWNsaWVudCAgICAgCUA2OTINCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzI5LCA1NzQpDQotCQkJCQkgICAgKDE3ODEsIDU3NCkNCi0JCQkJCSAgICAoMTc4MSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3ODEsIDI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzAsIDUyMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMxMjEyMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTMiIEA2OTgNCi0JCQkJbG9jYXRpb24gICAJKDc0OCwgMjY5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNjMyMDFEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmdW5kYW1lbnRhbEZhY2V0cyIgQDY5OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2OTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIzNiwgNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDMxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmdW5kYW1lbnRhbEZhY2V0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS40MDkwOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNjM1MDA2MyINCi0JCQkJCWNsaWVudCAgICAgCUA2OTgNCi0JCQkJCXN1cHBsaWVyICAgCUA2NjYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NDgsIDI2OSkNCi0JCQkJCSAgICAoNjU5LCAyNjkpDQotCQkJCQkgICAgKDY1OSwgNTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU5LCA1NjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjgsIDM4NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzODAyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk0IiBANzAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDY5OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTIsIDIyOCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNjM1MDA1OSINCi0JCQkJCWNsaWVudCAgICAgCUA2OTgNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgMjY5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk1IiBANzA0DQotCQkJCWxvY2F0aW9uICAgCSgxMTc1LCAzOTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NiIgQDcwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAzMTYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyOTEiDQotCQkJCQljbGllbnQgICAgIAlANzA0DQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3NSwgMzk2KQ0KLQkJCQkJICAgICgxMTM1LCAzOTYpDQotCQkJCQkgICAgKDExMzUsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzUsIDM5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTM1LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANzA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDcwNA0KLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzQsIDQ0MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuNTMzMzMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyQTUiDQotCQkJCQljbGllbnQgICAgIAlANzA0DQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3NSwgMzk2KQ0KLQkJCQkJICAgICgxMjE1LCAzOTYpDQotCQkJCQkgICAgKDEyMTUsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzUsIDM5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjE1LCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTcyLCAzNTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDk2MTU0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NyIgQDcxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNDQ2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ1NTcyMDE2QyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTgiIEA3MTENCi0JCQkJCVBhcmVudF9WaWV3IAlANzEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTYyNCwgMjIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2OCwgMzI3KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjJGIg0KLQkJCQkJY2xpZW50ICAgICAJQDcxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNjAsIDQ0NikNCi0JCQkJCSAgICAoMTMwOSwgNDQ2KQ0KLQkJCQkJICAgICgxMzA5LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYwLCA0NDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwOSwgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIiBANzEzDQotCQkJCQlQYXJlbnRfVmlldyAJQDcxMA0KLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDQsIDUwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy4wMDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDI0MyINCi0JCQkJCWNsaWVudCAgICAgCUA3MTANCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzYwLCA0NDYpDQotCQkJCQkgICAgKDE0MTIsIDQ0NikNCi0JCQkJCSAgICAoMTQxMiwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTIsIDI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzMsIDQwOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MjE0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDcxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCA1MTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDQyOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDM3OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0ODgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBsaXN0Ig0KLQkJCQkJIisgcmVzdHJpY3Rpb24iDQotCQkJCQkiKyB1bmlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFZhcmlldHkiIEA3MTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCAxNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDkyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFZhcmlldHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE4LCA0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY3NzMwMjQ5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzE4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDN0IwMzk2Ig0KLQkJCQljbGllbnQgICAgIAlANjY2DQotCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MSwgNTYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTkxLCA1MjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzE5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0Ig0KLQkJCQljbGllbnQgICAgIAlANjYzDQotCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3MiwgNTYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjcyLCA1MjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzIwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDI1NjgwMjU5Ig0KLQkJCQljbGllbnQgICAgIAlANjYxDQotCQkJCXN1cHBsaWVyICAgCUA2NDMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2NiwgMzA2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY2LCAyMTUpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MjENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4ODAxQjQiDQotCQkJCWNsaWVudCAgICAgCUA2MjENCi0JCQkJc3VwcGxpZXIgICAJQDY2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3LCA4MjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDc4MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MjINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I1OTAyODEiDQotCQkJCWNsaWVudCAgICAgCUA2MzgNCi0JCQkJc3VwcGxpZXIgICAJQDY1MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwLCAxODQwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwLCAxNDQ0KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNCNjlENjhEMDBEMiINCi0JCQl0aXRsZSAgICAgIAkiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA3MjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJd2lkdGggICAgICAJMzU0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDcyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODIsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgMTUwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyNiwgMTQ2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEA3MjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAzMDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2MywgMjYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyINCi0JCQkJd2lkdGggICAgICAJNDY4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANzI3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTMxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJNjA2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDcyOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNzA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgNjYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDcyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDExNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA3MzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDU0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDUwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA3MzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzMxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2OCwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjgyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA3MzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTAsIDExNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDczMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTk5NCwgMTQxMikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANzMyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE5OTQsIDE0MTIpDQotCQkJCSAgICAoMTk5NCwgMTI3MSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MzQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUA3MjUNCi0JCQkJc3VwcGxpZXIgICAJQDczMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA4NCwgMTQ0OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwODQsIDE0MTIpDQotCQkJCWRyYXdTdXBwbGllciAJQDczMykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDczNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MCwgODIxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTQwMg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA3MzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCA4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODkyLCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTIzNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANzM3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAzODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg0LCAzNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA3MzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDE4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDczOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3OTIsIDE3MTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjcsIDE2NzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjUxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNjY5DQotCQkJCWhlaWdodCAgICAgCTEwMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NDANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUA3MzkNCi0JCQkJc3VwcGxpZXIgICAJQDczMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU3MiwgMTY2MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NzIsIDE0MTIpDQotCQkJCWRyYXdTdXBwbGllciAJQDczMykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA3NDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDEwMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc4LCA5ODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIgQDc0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDU2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjg4LCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSINCi0JCQkJd2lkdGggICAgICAJNDUwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDc0Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTUzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEsIDE0OTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBANzQ0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzIsIDY4NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJNzM4DQotCQkJCWhlaWdodCAgICAgCTU0Mw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMzIiBANzQ1DQotCQkJCWxvY2F0aW9uICAgCSg4NjUsIDEzNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMTgzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNCIgQDc0Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCA1NTkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMzNDIg0KLQkJCQkJY2xpZW50ICAgICAJQDc0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDcyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjcxLCAxMzU5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NDcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk4LCAxMzIxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuMTE2NjY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzNDYiDQotCQkJCQljbGllbnQgICAgIAlANzQ1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODY1LCAxMzU5KQ0KLQkJCQkJICAgICg5MjUsIDEzNTkpDQotCQkJCQkgICAgKDkyNSwgMTIxNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg2NSwgMTM1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDEyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEyNzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDY0MjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU3IiBANzUwDQotCQkJCWxvY2F0aW9uICAgCSg3MTMsIDcwOSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRjAyMTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU4IiBANzUxDQotCQkJCQlQYXJlbnRfVmlldyAJQDc1MA0KLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwQzkiDQotCQkJCQljbGllbnQgICAgIAlANzUwDQotCQkJCQlzdXBwbGllciAgIAlANzI4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxMywgNzA5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNzA5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NTINCi0JCQkJCVBhcmVudF9WaWV3IAlANzUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNywgLTkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI3LCA2NjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTIzOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTAwMEQzIg0KLQkJCQkJY2xpZW50ICAgICAJQDc1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDcwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5NiwgNzUzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTUzNTcxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MSIgQDc1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzE5LCAxMTkzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE1MDA4QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTIiIEA3NTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANzU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwMSwgMzkzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE2MDA5NiINCi0JCQkJCWNsaWVudCAgICAgCUA3NTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3MjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTE5MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDc1NQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMCwgMTE0NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDA2OTkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwQTAiDQotCQkJCQljbGllbnQgICAgIAlANzU1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDExOTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDYsIDEyNDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDQxNjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTExIiBANzYwDQotCQkJCWxvY2F0aW9uICAgCSg3ODUsIDU1MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQTAwNjYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEyIiBANzYxDQotCQkJCQlQYXJlbnRfVmlldyAJQDc2MA0KLQkJCQkJbG9jYXRpb24gICAJKC0zMzUsIC0yNTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEIwMjNGIg0KLQkJCQkJY2xpZW50ICAgICAJQDc2MA0KLQkJCQkJc3VwcGxpZXIgICAJQDczMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDU1MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzYyDQotCQkJCQlQYXJlbnRfVmlldyAJQDc2MA0KLQkJCQkJbG9jYXRpb24gICAJKC0zMzUsIC0yNTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzksIDUxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA3MDcwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEIwMjQ5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc2MA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc4NSwgNTUwKQ0KLQkJCQkJICAgICg4ODQsIDU1MCkNCi0JCQkJCSAgICAoODg0LCA2NzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODQsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzNSwgNjEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzI5NzMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4MyIgQDc2NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgNDA0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFNDU2MDI5MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODQiIEA3NjYNCi0JCQkJCVBhcmVudF9WaWV3IAlANzY1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyLCAtNDEyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFNDU3MDE2NSINCi0JCQkJCWNsaWVudCAgICAgCUA3NjUNCi0JCQkJCXN1cHBsaWVyICAgCUA3MzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE4NCwgNDA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDEzNSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDc2Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI0LCAyMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQ5DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNjY1NDI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTZGIg0KLQkJCQkJY2xpZW50ICAgICAJQDc2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTg0LCA0MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4NCwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MSwgNjE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg0Mzg3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5OSIgQDc3MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTc1MiwgMTAzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MTAxNTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAwIiBANzcxDQotCQkJCQlQYXJlbnRfVmlldyAJQDc3MA0KLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDE5RiINCi0JCQkJCWNsaWVudCAgICAgCUA3NzANCi0JCQkJCXN1cHBsaWVyICAgCUA3MzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzUyLCAxMDM0KQ0KLQkJCQkJICAgICgxODEyLCAxMDM0KQ0KLQkJCQkJICAgICgxODEyLCAxMTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MiwgMTAzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCAxMTYxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NzINCi0JCQkJCVBhcmVudF9WaWV3IAlANzcwDQotCQkJCQlsb2NhdGlvbiAgIAkoNTM2LCAyMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzQzLCA5OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1OTYwMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTIwMUE5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDEwMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg0LCAxMDY2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDUwMzMxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMSIgQDc3NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg5NiwgODgxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOTAwNkNGMDA4OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDIiIEA3NzYNCi0JCQkJCVBhcmVudF9WaWV3IAlANzc1DQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCA0MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZEMTAxNUQiDQotCQkJCQljbGllbnQgICAgIAlANzc1DQotCQkJCQlzdXBwbGllciAgIAlANzMyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTg5NiwgODgxKQ0KLQkJCQkJICAgICgxOTU2LCA4ODEpDQotCQkJCQkgICAgKDE5NTYsIDExNjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1NiwgMTE2MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJkZXJpdmF0aW9uQW5ub3RhdGlvbiIgQDc3Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzUNCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgODQyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Rlcml2YXRpb25Bbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjU0MjM3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZEMTAxNjciDQotCQkJCQljbGllbnQgICAgIAlANzc1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4OTYsIDg4MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA4ODEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg5LCA5MTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDUwODUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAzIiBANzgwDQotCQkJCWxvY2F0aW9uICAgCSgyMDQwLCA3MTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzMwMjY0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNCIgQDc4MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODANCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyODQiDQotCQkJCQljbGllbnQgICAgIAlANzgwDQotCQkJCQlzdXBwbGllciAgIAlANzMyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjA0MCwgNzE1KQ0KLQkJCQkJICAgICgyMTAwLCA3MTUpDQotCQkJCQkgICAgKDIxMDAsIDExNjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDQwLCA3MTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMCwgMTE2MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDc4Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODANCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzgyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDY4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzE5Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDc4MA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDQwLCA3MTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzg0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NSwgNzQ2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA5MzEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMSIgQDc4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjY4LCA4NjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzQwMDRGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMiIgQDc4Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNjAwQ0EiDQotCQkJCQljbGllbnQgICAgIAlANzg1DQotCQkJCQlzdXBwbGllciAgIAlANzM1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgODY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3MywgODY1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3ODcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTQsIDgyNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjM0MTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNjAwRDQiDQotCQkJCQljbGllbnQgICAgIAlANzg1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgODY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgODY1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAxLCA5MDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODIwNTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI1IiBANzkwDQotCQkJCWxvY2F0aW9uICAgCSgxNDcyLCAxNjcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQjkwMUNEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNiIgQDc5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTANCi0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUM0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDczNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NzIsIDE2NykNCi0JCQkJCSAgICAoMTQ3MiwgNzIpDQotCQkJCQkgICAgKDE4ODMsIDcyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgMTY3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODMsIDcyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3OTINCi0JCQkJCVBhcmVudF9WaWV3IAlANzkwDQotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNCwgMTI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDc2MzA1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUNFIg0KLQkJCQkJY2xpZW50ICAgICAJQDc5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCAxNjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3MiwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxOSwgNjE4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkzNTc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc1IiBANzk1DQotCQkJCWxvY2F0aW9uICAgCSg5MjcsIDM1MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNjAyOTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzYiIEA3OTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANzk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5MywgLTQ1MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNzAxNzEiDQotCQkJCQljbGllbnQgICAgIAlANzk1DQotCQkJCQlzdXBwbGllciAgIAlANzM3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYyOSwgMzUwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3OTcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5MywgLTQ1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMzEwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuODE2NjY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNzAxNzIiDQotCQkJCQljbGllbnQgICAgIAlANzk1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTI3LCAzNTApDQotCQkJCQkgICAgKDk4NywgMzUwKQ0KLQkJCQkJICAgICg5ODcsIDY3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4NywgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNywgNjEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQzMzQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY3IiBAODAwDQotCQkJCWxvY2F0aW9uICAgCSgxMDI3LCAyMjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREMwMkY1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY4IiBAODAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDgwMA0KLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REFERDAyMzgiDQotCQkJCQljbGllbnQgICAgIAlAODAwDQotCQkJCQlzdXBwbGllciAgIAlANzM4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjcsIDIyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDIyMikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDgwMA0KLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDE4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQwNjI1MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjQyIg0KLQkJCQkJY2xpZW50ICAgICAJQDgwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwMjcsIDIyMikNCi0JCQkJCSAgICAoMTA4NywgMjIyKQ0KLQkJCQkJICAgICgxMDg3LCA2NzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNjEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4MjU4Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MSIgQDgwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ5NCwgMTQzOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4ODAxQzIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTIiIEA4MDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAODA1DQotCQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA1OTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2OEEwMTExIg0KLQkJCQkJY2xpZW50ICAgICAJQDgwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDczOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTQsIDE2NjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudEFubm90YXRpb24iIEA4MDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAODA1DQotCQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA1OTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk2LCAxMzU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRBbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3NzEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2OEEwMTFCIg0KLQkJCQkJY2xpZW50ICAgICAJQDgwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTQsIDEyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQzLCAxMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzMDA0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NSIgQDgxMA0KLQkJCQlsb2NhdGlvbiAgIAkoNjM3LCAxMDIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE3MDJDOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDYiIEA4MTENCi0JCQkJCVBhcmVudF9WaWV3IAlAODEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4MywgMjIyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE4MDNFMiINCi0JCQkJCWNsaWVudCAgICAgCUA4MTANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM3LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxMSwgMTAyMikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODEyDQotCQkJCQlQYXJlbnRfVmlldyAJQDgxMA0KLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODEyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxMCwgOTc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMjg4ODkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE5MDAwNCINCi0JCQkJCWNsaWVudCAgICAgCUA4MTANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM3LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgMTAyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODEyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMiwgMTA2MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMDA4OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NSIgQDgxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4MSwgNjA3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDNjI2RUE3MDEwMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NiIgQDgxNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTUNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTkwMTkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDgxNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1ODEsIDYwNykNCi0JCQkJCSAgICAoMTU4MSwgNTQ3KQ0KLQkJCQkJICAgICgxNjc5LCA1NDcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCA2MDcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OSwgNTQ3KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODE3DQotCQkJCQlQYXJlbnRfVmlldyAJQDgxNQ0KLQkJCQkJbG9jYXRpb24gICAJKDMwMSwgLTIyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjksIDQ2MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4xOTY5NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MiINCi0JCQkJCWNsaWVudCAgICAgCUA4MTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODEsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDYyMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE5Njk3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDUiIEA4MjANCi0JCQkJbG9jYXRpb24gICAJKDg0OSwgMTQ5NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMTAyNkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA2IiBAODIxDQotCQkJCQlQYXJlbnRfVmlldyAJQDgyMA0KLQkJCQkJbG9jYXRpb24gICAJKC0yNzEsIDY5NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMjAxRjkiDQotCQkJCQljbGllbnQgICAgIAlAODIwDQotCQkJCQlzdXBwbGllciAgIAlANzQzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg0OSwgMTQ5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTQsIDE0OTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgyMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjANCi0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDIsIDE0NjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4ODI1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMjAzIg0KLQkJCQkJY2xpZW50ICAgICAJQDgyMA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDg0OSwgMTQ5NikNCi0JCQkJCSAgICAoMTA2MiwgMTQ5NikNCi0JCQkJCSAgICAoMTA2MiwgMTIxNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg0OSwgMTQ5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDYyLCAxMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNSwgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjY5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDciIEA4MjUNCi0JCQkJbG9jYXRpb24gICAJKDk1MiwgMTU2NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCMzAwMDUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA4IiBAODI2DQotCQkJCQlQYXJlbnRfVmlldyAJQDgyNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMjciDQotCQkJCQljbGllbnQgICAgIAlAODI1DQotCQkJCQlzdXBwbGllciAgIAlANzQzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTU2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTQsIDE1NjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4MjcNCi0JCQkJCVBhcmVudF9WaWV3IAlAODI1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyOCwgNzMzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgMTUzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwNDk1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjQwMzMyIg0KLQkJCQkJY2xpZW50ICAgICAJQDgyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDk1MiwgMTU2NSkNCi0JCQkJCSAgICAoMTIwMCwgMTU2NSkNCi0JCQkJCSAgICAoMTIwMCwgMTIxNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTU2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjAwLCAxMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NCwgMTI3NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgzMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCINCi0JCQkJY2xpZW50ICAgICAJQDcyNg0KLQkJCQlzdXBwbGllciAgIAlANzM2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTg0LCAyNDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTg0LCAxMzUpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4MzENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiDQotCQkJCWNsaWVudCAgICAgCUA3NDINCi0JCQkJc3VwcGxpZXIgICAJQDcyNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk5NywgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5NywgMzU5KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI2LiBDb25jcmV0ZSBDb21wb25lbnRzIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBRDc0RDAzQzQiDQotCQkJdGl0bGUgICAgICAJIjYuIENvbmNyZXRlIENvbXBvbmVudHMiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDgzMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDgzMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU2OCwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCXdpZHRoICAgICAgCTU0Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IiBAODM0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwMCwgNjcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk5MSwgNjI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDgzNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTU2LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJCXdpZHRoICAgICAgCTQyNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODM2DQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA1NjEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDgzNQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMzYwLCA1NjEpDQotCQkJCSAgICAoMTM2MCwgNDcxKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbmNsdWRlIiBAODM3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODM3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMiwgMTE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbmNsdWRlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzdEMDI1MCINCi0JCQkJd2lkdGggICAgICAJMjU4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAODM4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5NCwgOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREltcG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJCXdpZHRoICAgICAgCTI0Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAODM5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNSwgMTE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiDQotCQkJCXdpZHRoICAgICAgCTI4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA4NDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzUsIDExNTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODUxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCXdpZHRoICAgICAgCTg2OQ0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MyIgQDg0MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2OCwgMTIwNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNTAwN0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ0IiBAODQyDQotCQkJCQlQYXJlbnRfVmlldyAJQDg0MQ0KLQkJCQkJbG9jYXRpb24gICAJKDExNjAsIDQwNikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkIiDQotCQkJCQljbGllbnQgICAgIAlAODQxDQotCQkJCQlzdXBwbGllciAgIAlAODM3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjgsIDEyMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMywgMTIwNikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODQzDQotCQkJCQlQYXJlbnRfVmlldyAJQDg0MQ0KLQkJCQkJbG9jYXRpb24gICAJKDExNjAsIDQwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNDcsIDExNTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NDQxMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzYwMDZDIg0KLQkJCQkJY2xpZW50ICAgICAJQDg0MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg0MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzQsIDEyMDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzAwLCAxMjUzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwNw0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxNDcwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDEiIEA4NDYNCi0JCQkJbG9jYXRpb24gICAJKDExNjgsIDEwMjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDgwMkZDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MiIgQDg0Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDYNCi0JCQkJCWxvY2F0aW9uICAgCSg5NjAsIDIyMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEIiDQotCQkJCQljbGllbnQgICAgIAlAODQ2DQotCQkJCQlzdXBwbGllciAgIAlAODM4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE2OCwgMTAyMikNCi0JCQkJCSAgICAoMTE2OCwgOTYyKQ0KLQkJCQkJICAgICgxMjg1LCA5NjIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODUsIDk2MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODQ4DQotCQkJCQlQYXJlbnRfVmlldyAJQDg0Ng0KLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5MCwgMTA3NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ1Mzc4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDkwMThDIg0KLQkJCQkJY2xpZW50ICAgICAJQDg0Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDg0MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNjgsIDExNDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTI3LCAxMDc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM2OTc1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2MyIgQDg1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2MywgMTM1MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MjAwOUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY0IiBAODUyDQotCQkJCQlQYXJlbnRfVmlldyAJQDg1MQ0KLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAyRkUiDQotCQkJCQljbGllbnQgICAgIAlAODUxDQotCQkJCQlzdXBwbGllciAgIAlAODM5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU2MywgMTM1MykNCi0JCQkJCSAgICAoMTk0MCwgMTM1MykNCi0JCQkJCSAgICAoMTk0MCwgMTI1NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjMsIDEzNTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0MCwgMTI1NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDg1Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTENCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCAxMzIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE2ODA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAzMDgiDQotCQkJCQljbGllbnQgICAgIAlAODUxDQotCQkJCQlzdXBwbGllciAgIAlAODQwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU2MywgMTM1MykNCi0JCQkJCSAgICAoMTE4MSwgMTM1MykNCi0JCQkJCSAgICAoMTE4MSwgMTI1OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjMsIDEzNTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4MSwgMTI1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzAsIDEzMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjEzNDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODU2DQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDU2MSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODMyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI4OCwgNTYxKQ0KLQkJCQkgICAgKDI4OCwgNDcxKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDg1Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgNjcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2MCwgNjI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJd2lkdGggICAgICAJNDc0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiIEA4NTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODU4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1OCwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJCXdpZHRoICAgICAgCTQxNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA4NTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3MjAsIDk2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NTAsIDkxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA4NjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTAsIDYyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCXdpZHRoICAgICAgCTI0Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NjENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCWNsaWVudCAgICAgCUA4NjANCi0JCQkJc3VwcGxpZXIgICAJQDgzMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxLCA2MTcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjEsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODU2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NjINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCWNsaWVudCAgICAgCUA4NTcNCi0JCQkJc3VwcGxpZXIgICAJQDgzMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTg5LCA2MTcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODksIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODU2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NjMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiDQotCQkJCWNsaWVudCAgICAgCUA4MzQNCi0JCQkJc3VwcGxpZXIgICAJQDgzNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAxNiwgNjE3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxNiwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4MzYpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAODY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgOTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTAsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4NjUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDEwODkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg2NA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxODI0LCAxMDg5KQ0KLQkJCQkgICAgKDE4MjQsIDk5OSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NjYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEQzAzODEiDQotCQkJCWNsaWVudCAgICAgCUA4MzcNCi0JCQkJc3VwcGxpZXIgICAJQDg2NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2NiwgMTE0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjYsIDEwODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg2NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODY3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNjQwMjQwIg0KLQkJCQljbGllbnQgICAgIAlAODM5DQotCQkJCXN1cHBsaWVyICAgCUA4NjQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MzQsIDExNDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTM0LCAxMDg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA4NjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgNjcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzAsIDYyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4NjkNCi0JCQkJbG9jYXRpb24gICAJKDE3NjIsIDgxOSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODY4DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE3NjIsIDgxOSkNCi0JCQkJICAgICgxNzYyLCA3MjcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODcwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIg0KLQkJCQljbGllbnQgICAgIAlAODM4DQotCQkJCXN1cHBsaWVyICAgCUA4NjgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTYsIDg4OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTYsIDgxOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODY5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NzENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCWNsaWVudCAgICAgCUA4NjgNCi0JCQkJc3VwcGxpZXIgICAJQDgzNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NiwgNjE3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1NiwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4MzYpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDg3Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJd2lkdGggICAgICAJNTA4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODczDQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAyODkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMTIwLCAyODkpDQotCQkJCSAgICAoMTEyMCwgMTk5KSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDUiIEA4NzQNCi0JCQkJbG9jYXRpb24gICAJKDE0ODUsIDIxNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwODAzQzciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGFpbmVyIiBAODc1DQotCQkJCQlQYXJlbnRfVmlldyAJQDg3NA0KLQkJCQkJbG9jYXRpb24gICAJKDk4OSwgMTAzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNCwgMjEwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRhaW5lciINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMzExMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjBDMDFDRSINCi0JCQkJCWNsaWVudCAgICAgCUA4NzQNCi0JCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDg1LCAyMTUpDQotCQkJCQkgICAgKDE0ODUsIDE3NikNCi0JCQkJCSAgICAoMTM3NCwgMTc2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzQsIDE3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzUsIDIyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2OQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMjY0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA2IiBAODc4DQotCQkJCQlQYXJlbnRfVmlldyAJQDg3NA0KLQkJCQkJbG9jYXRpb24gICAJKDk4OSwgMTAzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjBDMDFDRiINCi0JCQkJCWNsaWVudCAgICAgCUA4NzQNCi0JCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDg1LCAyMTUpDQotCQkJCQkgICAgKDE0ODUsIDI1NCkNCi0JCQkJCSAgICAoMTM0NSwgMjU0KQ0KLQkJCQkJICAgICgxMzQ1LCAxOTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM0NSwgMTk5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA3IiBAODc5DQotCQkJCWxvY2F0aW9uICAgCSg3NzMsIDIxNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0ODAyNjEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdENvbnRhaW5lciIgQDg4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzkNCi0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAyMTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdENvbnRhaW5lciINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjUwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODUiDQotCQkJCQljbGllbnQgICAgIAlAODc5DQotCQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzczLCAyMTYpDQotCQkJCQkgICAgKDc3MywgMTc2KQ0KLQkJCQkJICAgICg4NjYsIDE3NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMjE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDgiIEA4ODMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODc5DQotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODYiDQotCQkJCQljbGllbnQgICAgIAlAODc5DQotCQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzczLCAyMTYpDQotCQkJCQkgICAgKDc3MywgMjU3KQ0KLQkJCQkJICAgICg4OTUsIDI1NykNCi0JCQkJCSAgICAoODk1LCAxOTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTUsIDE5OSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODg0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RTYwMzcyIg0KLQkJCQljbGllbnQgICAgIAlAODM1DQotCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjcsIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjcsIDI4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODczKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDhFMjAwRUEiDQotCQkJCWNsaWVudCAgICAgCUA4MzMNCi0JCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUyLCAzNjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTIsIDI4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODczKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBOTAzRDIiDQotCQkJCWNsaWVudCAgICAgCUA4MzINCi0JCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjk5LCAzNjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTksIDI4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODczKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAODg3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJY2xpZW50ICAgICAJQDg4Nw0KLQkJCQlzdXBwbGllciAgIAlAODYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTYsIDExNDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTYsIDcyNykpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTkiIEA4ODkNCi0JCQkJbG9jYXRpb24gICAJKDEzODIsIDE0MjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMEMwM0RCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMCIgQDg5MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4ODkNCi0JCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAyMjUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg4OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg2NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzODIsIDE0MjUpDQotCQkJCQkgICAgKDIxNDcsIDE0MjUpDQotCQkJCQkgICAgKDIxNDcsIDk0MykNCi0JCQkJCSAgICAoMjA2NywgOTQzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY3LCA5NDMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAODkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDg4OQ0KLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NSwgMTM4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDY1NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNSINCi0JCQkJCWNsaWVudCAgICAgCUA4ODkNCi0JCQkJCXN1cHBsaWVyICAgCUA4ODcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzgyLCAxNDI1KQ0KLQkJCQkJICAgICgyMjUsIDE0MjUpDQotCQkJCQkgICAgKDIyNSwgMTI1NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI1LCAxMjU1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk2OTE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNyIgQDg5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwNSwgMTUwMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDNzAwRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE4IiBAODk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDg5NA0KLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiDQotCQkJCQljbGllbnQgICAgIAlAODk0DQotCQkJCQlzdXBwbGllciAgIAlAODY4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUwNSwgMTUwMykNCi0JCQkJCSAgICAoMjE4OCwgMTUwMykNCi0JCQkJCSAgICAoMjE4OCwgNjc1KQ0KLQkJCQkJICAgICgyMDU5LCA2NzUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTksIDY3NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZFNjaGVtYSIgQDg5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTQNCi0JCQkJCWxvY2F0aW9uICAgCSgxMzEzLCAzMDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDMsIDE0NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzMzMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyINCi0JCQkJCWNsaWVudCAgICAgCUA4OTQNCi0JCQkJCXN1cHBsaWVyICAgCUA4ODcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTA1LCAxNTAzKQ0KLQkJCQkJICAgICgxMTMsIDE1MDMpDQotCQkJCQkgICAgKDExMywgMTI1NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzLCAxMjU1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDE0NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Njc2ODMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA5IiBAODk5DQotCQkJCWxvY2F0aW9uICAgCSg2NiwgMjQ0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzUxQzMxMDM1NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTAiIEA5MDANCi0JCQkJCVBhcmVudF9WaWV3IAlAODk5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQzMzMDMzMSINCi0JCQkJCWNsaWVudCAgICAgCUA4OTkNCi0JCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2NiwgMjQ0KQ0KLQkJCQkJICAgICg2NiwgMTQ0KQ0KLQkJCQkJICAgICg4NjYsIDE0NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxNDQpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hIiBAOTAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDg5OQ0KLQkJCQkJbG9jYXRpb24gICAJKC05NCwgLTQ0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NSwgOTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE2ODExMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTk5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzNCIg0KLQkJCQkJY2xpZW50ICAgICAJQDg5OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg4Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NiwgMjQ0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2LCAxMTQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2LCAxODQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTEzDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2NjU5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzgwQkQ5MDA1OSINCi0JCQkJY2xpZW50ICAgICAJQDg1OA0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU5LCAzNjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU5LCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg3MykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTA1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2Ig0KLQkJCQljbGllbnQgICAgIAlAODQwDQotCQkJCXN1cHBsaWVyICAgCUA4MzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQwMCwgMTE0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NTYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MDYNCi0JCQkJbG9jYXRpb24gICAJKDEwMTIsIDgzNykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODM0DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEwMTIsIDgzNykNCi0JCQkJICAgICgxMDEyLCA3MjcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTA3DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDkwOA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDcxLCA4NzEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjQzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODgxNTgNCi0JCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0RTIwMzY2Ig0KLQkJCQljbGllbnQgICAgIAlAODQwDQotCQkJCXN1cHBsaWVyICAgCUA4MzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzcsIDExNDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDM3LCA4MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkwNikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTA5DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDkxMA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OTAsIDg2NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4MTYzMw0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGRDRCQTAyM0MiDQotCQkJCWNsaWVudCAgICAgCUA4NTkNCi0JCQkJc3VwcGxpZXIgICAJQDgzNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI1LCA5MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDgzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiDQotCQkJCWNsaWVudCAgICAgCUA4NjQNCi0JCQkJc3VwcGxpZXIgICAJQDg2OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyOCwgODg5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyOCwgODE5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNy4gQ29uY3JldGUgQXR0cmlidXRlcyINCi0JCQlxdWlkICAgICAgIAkiM0I5RjhGNzYwMkM3Ig0KLQkJCXRpdGxlICAgICAgCSI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAOTEyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDE0NDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzOCwgMTM1OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzOCwgMTQxOSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTM4Mg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGZvcm0gOiBYU0RGb3JtIg0KLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTQzMA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERm9ybSIgQDkxMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NjAsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTgsIDEzNjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERm9ybSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTgsIDEzMTUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOUY5MTNCMDFFQiINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDkxNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQwLCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQwLCA5NykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0Ng0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGVsZW1lbnQgOiBET01FbGVtZW50IikpDQotCQkJCXdpZHRoICAgICAgCTY3NQ0KLQkJCQloZWlnaHQgICAgIAkxNDMNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDkxNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg0OCwgMzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NywgMzMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJCXdpZHRoICAgICAgCTM0MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAOTE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgOTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzgsIDg5MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCXdpZHRoICAgICAgCTQ3MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA5MTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgMTQwOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzI4LCAxMzU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTYyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDkxOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg2NCwgNjI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NSwgNTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjU2DQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MTkNCi0JCQkJbG9jYXRpb24gICAJKDg1MCwgNTM3KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5MTUNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoODUwLCA1MzcpDQotCQkJCSAgICAoODUwLCA0NDcpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTUVsZW1lbnQiIEA5MjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjQ4LCAxMjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgOTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzUxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRWxlbWVudCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQjgxODk3OTAyMDAiDQotCQkJCXdpZHRoICAgICAgCTc2OQ0KLQkJCQloZWlnaHQgICAgIAkyMDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTIxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA2NDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDU4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQl3aWR0aCAgICAgIAk1MTINCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAOTIyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAzODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDMzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MjMNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMjYzKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5MTQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMzY4LCAyNjMpDQotCQkJCSAgICAoMzY4LCAxNjcpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIiBAOTI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk5MiwgMTQ1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxMzQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxMjk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVBNDAzREYiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTQwNykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHN1YnN0aXR1dGlvbiINCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIg0KLQkJCQkJIisgYWxsIikpDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkzNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiIEA5MjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAxNzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3MDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE2NTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNzY4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTk4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iDQotCQkJCQkiKyBhbGwiKSkNCi0JCQkJd2lkdGggICAgICAJNTUwDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDkyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDIwOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjA0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjEwMCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpDQotCQkJCXdpZHRoICAgICAgCTc3OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA5MjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODc1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4MjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQkJd2lkdGggICAgICAJMzQ0DQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4RmluYWwiIEA5MjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTQ0LCAyMDE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxOTMyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE4ODIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiINCi0JCQkJd2lkdGggICAgICAJMzgyDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA5MjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTI3OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTMzOSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTU4OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHVzZSA6IFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Ig0KLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTY0MA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiIEA5MzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2MzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTQ4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE0OTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCQTdCMEU4MDFBOCINCi0JCQkJd2lkdGggICAgICAJNTEyDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAOTMxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjYwOCwgOTI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0OTgsIDg4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJd2lkdGggICAgICAJMjM4DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAOTMyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNDAsIDE3MTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NywgMTY5MSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTkzNA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQkJIjw8MC4uKj4+ICsgYmxvY2sgOiBYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk5ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAOTMzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDExNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEwOTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMTU2KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODUyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJOTA2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA5MzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MjIsIDc3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk5OTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkxMDE0DQotCQkJCWhlaWdodCAgICAgCTQ4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiIEA5MzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDk2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzcsIDkwNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbXBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIg0KLQkJCQl3aWR0aCAgICAgIAk0MjQNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDkzNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzQ0LCA2NTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOCwgNjAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOCwgNjYwKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzc4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTQzMA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAOTM3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDE5NDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxMCwgMjAwMikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTgyMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRENvbXBsZXhGaW5hbCINCi0JCQkJCSI8PDAuLio+PiArIGJsb2NrIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCQkiKyBtaXhlZCA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJODc4DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDkzOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0ODgsIDE2OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwNCwgMTY0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM4Ng0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MzkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCWNsaWVudCAgICAgCUA5MzgNCi0JCQkJc3VwcGxpZXIgICAJQDkxNw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNiwgMTYzMikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDYsIDE0NzIpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDk0MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyMDgsIDcwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1OCwgNTk4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTkwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQl3aWR0aCAgICAgIAk5MTgNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QUEwMUQzIg0KLQkJCQljbGllbnQgICAgIAlAOTMxDQotCQkJCXN1cHBsaWVyICAgCUA5MTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2OTYsIDg2OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2OTYsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUA5MzINCi0JCQkJc3VwcGxpZXIgICAJQDkxMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5NCwgMTYxOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTQsIDE1MzMpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTQzDQotCQkJCWxvY2F0aW9uICAgCSgxNDg3LCAxODU2KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5MzgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTQ4NywgMTg1NikNCi0JCQkJICAgICgxNDg3LCAxNzYwKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01BdHRyIiBAOTQ0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwMCwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCAzNTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NQXR0ciIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDMwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNCQkY4Qzg5MDFCNiINCi0JCQkJd2lkdGggICAgICAJNjU4DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDkzNw0KLQkJCQlzdXBwbGllciAgIAlAOTM4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzM0LCAxOTMwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTczNCwgMTg1NikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiDQotCQkJCWNsaWVudCAgICAgCUA5MzYNCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgNTg4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJY2xpZW50ICAgICAJQDk0MA0KLQkJCQlzdXBwbGllciAgIAlAOTE1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTkwLCA1ODYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTkwLCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQljbGllbnQgICAgIAlAOTIxDQotCQkJCXN1cHBsaWVyICAgCUA5MjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMiwgNTcyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyLCA0NDcpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhFNjAzNzIiDQotCQkJCWNsaWVudCAgICAgCUA5MjINCi0JCQkJc3VwcGxpZXIgICAJQDkxNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwLCAzMjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAsIDI2MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTIzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiDQotCQkJCWNsaWVudCAgICAgCUA5MzUNCi0JCQkJc3VwcGxpZXIgICAJQDkyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzLCA4OTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjMsIDcwOCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSINCi0JCQkJY2xpZW50ICAgICAJQDkzMw0KLQkJCQlzdXBwbGllciAgIAlAOTMxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjAwLCAxMDg0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwMCwgOTg3KSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTURvY3VtZW50IiBAOTUyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA5NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Eb2N1bWVudCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg1MEUwMzgxIg0KLQkJCQl3aWR0aCAgICAgIAk3NzYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTUzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTkwM0QyIg0KLQkJCQljbGllbnQgICAgIAlAOTE1DQotCQkJCXN1cHBsaWVyICAgCUA5MTQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgMzIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU2LCAyNjMpDQotCQkJCWRyYXdTdXBwbGllciAJQDkyMykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEA5NTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDM1MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Ob2RlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNCwgMzAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3Ig0KLQkJCQl3aWR0aCAgICAgIAk2ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTU1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIg0KLQkJCQljbGllbnQgICAgIAlAOTE4DQotCQkJCXN1cHBsaWVyICAgCUA5MTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1MCwgNTYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODUwLCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTU2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3QkIwMzQ5Ig0KLQkJCQljbGllbnQgICAgIAlAOTI5DQotCQkJCXN1cHBsaWVyICAgCUA5MTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3NSwgMTI2NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyINCi0JCQkJY2xpZW50ICAgICAJQDkxNg0KLQkJCQlzdXBwbGllciAgIAlAOTE1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjk0LCA4ODApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjk0LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTU4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIg0KLQkJCQljbGllbnQgICAgIAlAOTM0DQotCQkJCXN1cHBsaWVyICAgCUA5MTgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgNzY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU2LCA2ODcpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTU5DQotCQkJCWxvY2F0aW9uICAgCSgxNzAzLCAxMjkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5MTYNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTcwMywgMTI5MCkNCi0JCQkJICAgICgxNzAzLCAxMDA4KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk2MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDkxNw0KLQkJCQlzdXBwbGllciAgIAlAOTE2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAzLCAxMzQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMywgMTI5MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCWNsaWVudCAgICAgCUA5MTINCi0JCQkJc3VwcGxpZXIgICAJQDkxNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5MywgMTM0NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDEyOTApDQotCQkJCWRyYXdTdXBwbGllciAJQDk1OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTYyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlAOTI2DQotCQkJCXN1cHBsaWVyICAgCUA5MzgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTMsIDIwMjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjUzLCAxODU2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDMpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNkE4MDk3MDI3QSINCi0JCQl0aXRsZSAgICAgIAkiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA5NjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjcyLCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzksIDk0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY0MCwgNTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzEsIDUzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAOTY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDEzLCA3NDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA5NjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCA1NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiDQotCQkJCXdpZHRoICAgICAgCTQzOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTY3DQotCQkJCWxvY2F0aW9uICAgCSgxOTQzLCA4NjgpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDk2Ng0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxOTQzLCA4NjgpDQotCQkJCSAgICAoMTk0MywgNjMxKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjUiIEA5NjgNCi0JCQkJbG9jYXRpb24gICAJKDIxMjUsIDY4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNDAwNTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY2IiBAOTY5DQotCQkJCQlQYXJlbnRfVmlldyAJQDk2OA0KLQkJCQkJbG9jYXRpb24gICAJKDE1NywgMzQ0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFFODI2MDJBRCINCi0JCQkJCWNsaWVudCAgICAgCUA5NjgNCi0JCQkJCXN1cHBsaWVyICAgCUA5NjUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjUsIDcyOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDk3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5NjgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNTUsIDY3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFFODI2MDJCNyINCi0JCQkJCWNsaWVudCAgICAgCUA5NjgNCi0JCQkJCXN1cHBsaWVyICAgCUA5NjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjUsIDYzMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNjcsIDY3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAOTczDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAzMjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCXdpZHRoICAgICAgCTIzNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDk3Mw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyNzIsIDQ2NSkNCi0JCQkJICAgICgyNzIsIDM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA5NzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzcyLCAxMTIxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU2OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTg3DQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDk3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgNTc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OSwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTMiIEA5NzcNCi0JCQkJbG9jYXRpb24gICAJKDExNzAsIDEzNTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUMwMjVBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEA5NzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTc3DQotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNjksIDEzODkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzNDA0NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDk3Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDk3Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzAsIDEzNTYpDQotCQkJCQkgICAgKDIwNiwgMTM1NikNCi0JCQkJCSAgICAoMjA2LCA2MzEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTcwLCAxMzU2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNiwgNjMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTgwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2LCAxMzIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTU5MTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTQiIEA5ODENCi0JCQkJCVBhcmVudF9WaWV3IAlAOTc3DQotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5ODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNTIxLCAxMzk4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDk3Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDk3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzAsIDEzNTYpDQotCQkJCQkgICAgKDI3MzEsIDEzNTYpDQotCQkJCQkgICAgKDI3MzEsIDEyMjcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTcwLCAxMzU2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MzEsIDEyMjcpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDk4Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MCwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTgzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNjgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDciIEA5ODQNCi0JCQkJbG9jYXRpb24gICAJKDEyMiwgMTEzNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCMTAyRjgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ4IiBAOTg1DQotCQkJCQlQYXJlbnRfVmlldyAJQDk4NA0KLQkJCQkJbG9jYXRpb24gICAJKC02MzAsIC0yNTYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjYwMDFCIg0KLQkJCQkJY2xpZW50ICAgICAJQDk4NA0KLQkJCQkJc3VwcGxpZXIgICAJQDk3Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyLCA2MzEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEA5ODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTg0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMywgMTUxNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MDQ5NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkJDRUI2MDAyNSINCi0JCQkJCWNsaWVudCAgICAgCUA5ODQNCi0JCQkJCXN1cHBsaWVyICAgCUA5ODMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIyLCAxMTM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgMTY0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MCwgMTU4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4MTE4OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiIEA5ODkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCA0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTMNCi0JCQkJaGVpZ2h0ICAgICAJMTAwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTkiIEA5OTANCi0JCQkJbG9jYXRpb24gICAJKDQ3LCA4ODUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MTUwMTE5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MCIgQDk5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMjg5LCA4MjEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MUEwM0FCIg0KLQkJCQkJY2xpZW50ICAgICAJQDk5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDk4Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3LCAxNjQxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEA5OTINCi0JCQkJCVBhcmVudF9WaWV3IAlAOTkwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyLCAxODkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyMTg1NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTk1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MUEwM0I1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDk5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDk4OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3LCAxMzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOCwgMTkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3ODgxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDk5NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDg5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTk1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MiwgODQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM2Mw0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA5OTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTc1LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODkiIEA5OTcNCi0JCQkJbG9jYXRpb24gICAJKDEzMTksIDEwMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERTkwMThBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkwIiBAOTk4DQotCQkJCQlQYXJlbnRfVmlldyAJQDk5Nw0KLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFQTAzNkMiDQotCQkJCQljbGllbnQgICAgIAlAOTk3DQotCQkJCQlzdXBwbGllciAgIAlAOTk1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxOSwgOTU1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEA5OTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTk3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3LCAtMTAyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEwMzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3MzE3MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM4MCINCi0JCQkJCWNsaWVudCAgICAgCUA5OTcNCi0JCQkJCXN1cHBsaWVyICAgCUA5OTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCAxMTEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzksIDEwMzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDQwODE2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBAMTAwMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDE2OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTUsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQl3aWR0aCAgICAgIAk0NjgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTAwMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDM1LCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTA4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg1IiBAMTAwNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1MSwgMTg0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNTAxMTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg2IiBAMTAwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI5NywgMjI0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E3MDNCNCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDA0DQotCQkJCQlzdXBwbGllciAgIAlAMTAwMw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTEsIDE4NDApDQotCQkJCQkgICAgKDEyOTQsIDE4NDApDQotCQkJCQkgICAgKDEyOTQsIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTQsIDE3NTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDA2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjk3LCAyMjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTcsIDE4MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI2NTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNzAzQzgiDQotCQkJCQljbGllbnQgICAgIAlAMTAwNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzUxLCAxODQwKQ0KLQkJCQkJICAgICgxNDA5LCAxODQwKQ0KLQkJCQkJICAgICgxNDA5LCAxNzUxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MSwgMTg0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA5LCAxNzUxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYxLCAxODAxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcyODQ4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY5IiBAMTAwOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMTQzMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAwNkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDEwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDkNCi0JCQkJCWxvY2F0aW9uICAgCSg3NzQsIC0xODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYyLCAxNTI1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ0OTc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkwRDYwMzE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMDkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDAzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTY0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMTUyNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1NDU0NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzAiIEAxMDEzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDkNCi0JCQkJCWxvY2F0aW9uICAgCSg3NzQsIC0xODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQ5LCAxMjY2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkwRDYwMzBFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMDkNCi0JCQkJCXN1cHBsaWVyICAgCUA5OTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MCwgMTQzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxMjIzKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg3IiBAMTAxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY5MCwgMTY4NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRDAzNzQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmFjZXRDb250ZW50cyIgQDEwMTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAxNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgMTczMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldENvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDMyMDUxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMTAiDQotCQkJCQljbGllbnQgICAgIAlAMTAxNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMDINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODQ2LCAxNjg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNjQ0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTk0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNzMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODgiIEAxMDE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI2LCAtMTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjYsIDE2NDMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMDYiDQotCQkJCQljbGllbnQgICAgIAlAMTAxNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTM0LCAxNjg0KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDEwMjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjI0LCA3ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzODgsIDc0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJd2lkdGggICAgICAJNDkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAMTAyMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOCwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQl3aWR0aCAgICAgIAk0MjYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMDIzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NTcsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjciIEAxMDI0DQotCQkJCWxvY2F0aW9uICAgCSg5NjMsIDMxOSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QjAwM0QiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDI1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQNCi0JCQkJCWxvY2F0aW9uICAgCSg1OTUsIC0xNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc0LCAzNjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODEwODENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4RTZDMDExMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDI0DQotCQkJCQlzdXBwbGllciAgIAlAMTAyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk5LCAzMTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDI3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTYsIDI5MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5NjM5Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY4IiBAMTAyOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDI0DQotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NSwgMzYxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTA3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMjQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDIzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MywgMzE5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgyOCwgMzE5KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxMDMwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE2MCwgOTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTc0LCA5NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDMxDQotCQkJCWxvY2F0aW9uICAgCSgyMzIyLCAxNTkzKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDMwDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIzMjIsIDE1OTMpDQotCQkJCSAgICAoMjMyMiwgMTA0NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDMyDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDEwMzMNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDYsIDkwNSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2MDAwMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNQ0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkY1MDEzQSINCi0JCQkJY2xpZW50ICAgICAJQDEwMzANCi0JCQkJc3VwcGxpZXIgICAJQDk2Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE1MCwgOTM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE1MCwgODY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NjcpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMDM0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA1NzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIDUzMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk2NjINCi0JCQkJaGVpZ2h0ICAgICAJMTEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTMiIEAxMDM1DQotCQkJCWxvY2F0aW9uICAgCSgxNDk4LCAxNDMxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg5MTE0MDFBRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIgQDEwMzYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDI3LCAxNDcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0Mzg5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTciDQotCQkJCQljbGllbnQgICAgIAlAMTAzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMzANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDk4LCAxNDMxKQ0KLQkJCQkJICAgICgyMjgxLCAxNDMxKQ0KLQkJCQkJICAgICgyMjgxLCAxMDQ3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjgxLCAxMDQ3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjA0LCAxMzk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA1NDE5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTQiIEAxMDM5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzUNCi0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgODY2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTUwMDE2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMzUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDM0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ5OCwgMTQzMSkNCi0JCQkJCSAgICAoMTEzMSwgMTQzMSkNCi0JCQkJCSAgICAoMTEzMSwgNjMyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMxLCA2MzIpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEAxMDQxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU1LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTQwNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDEwNDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDg5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNSwgODUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTciIEAxMDQzDQotCQkJCWxvY2F0aW9uICAgCSg1MzQsIDczNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEAxMDQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDMNCi0JCQkJCWxvY2F0aW9uICAgCSg4NiwgLTIxNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMCwgNzQ4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTU1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTExMTExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUzNCwgNzM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgODQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1OTUsIDgwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NTkyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE4IiBAMTA0Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQzDQotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDY1MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDQzDQotCQkJCQlzdXBwbGllciAgIAlAMTAzNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDYzMikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNyIgQDEwNDkNCi0JCQkJbG9jYXRpb24gICAJKDkwMCwgMTAzMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRDAwM0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2VsZWN0b3IiIEAxMDUwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDkNCi0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEzLCAxMDQyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMjg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNDkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkwMCwgMTAzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDExMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgMTA0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTg5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM4IiBAMTA1Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQ5DQotCQkJCQlsb2NhdGlvbiAgIAkoODQsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCA5NjgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiDQotCQkJCQljbGllbnQgICAgIAlAMTA0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgOTUxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM5IiBAMTA1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzAwLCAxMDMyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDAyNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEAxMDU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE2LCAxMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNiwgMTAzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmaWVsZHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTQ3OTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM3OSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDU1DQotCQkJCQlzdXBwbGllciAgIAlAMTA0MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCAxMTEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzEsIDEwNDIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMwNzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MCIgQDEwNTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA1NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTYsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU5LCA5NjgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNjUiDQotCQkJCQljbGllbnQgICAgIAlAMTA1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwMCwgOTUxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBAMTA2MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDc1MiwgMTQ0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAwLCAxMzk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCXdpZHRoICAgICAgCTUyMg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwNjINCi0JCQkJbG9jYXRpb24gICAJKDU1MCwgMTU5MCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTA2MQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg1NTAsIDE1OTApDQotCQkJCSAgICAoNTUwLCAxNDk1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiIEAxMDYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwNCwgNTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQwLCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJd2lkdGggICAgICAJNTQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTA2NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwNiwgNzY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDYzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE0MDYsIDc2NSkNCi0JCQkJICAgICgxNDA2LCA2MzEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEwNjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxNjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5MywgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5NSIgQDEwNjYNCi0JCQkJbG9jYXRpb24gICAJKDE2MTQsIDE4NjgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RkRERDcwMTEzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk2IiBAMTA2Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDY2DQotCQkJCQlsb2NhdGlvbiAgIAkoNTI2LCA0NzYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RkREREEwMjZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwNjYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDY1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkNCi0JCQkJCSAgICAoMjUwMCwgMTg2OCkNCi0JCQkJCSAgICAoMjUwMCwgMTc1MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjUwMCwgMTc1MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTA2OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDY2DQotCQkJCQlsb2NhdGlvbiAgIAkoNTI2LCA0NzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NiwgMTc4NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5ODcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNzUiDQotCQkJCQljbGllbnQgICAgIAlAMTA2Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjE0LCAxODY4KQ0KLQkJCQkJICAgICg5ODQsIDE4NjgpDQotCQkJCQkgICAgKDk4NCwgMTQ5NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg0LCAxNDk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAxODI0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTcxMjg2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMSIgQDEwNzENCi0JCQkJbG9jYXRpb24gICAJKDI5MjcsIDM4NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzNjAzODYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlQ29udGVudHMiIEAxMDcyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzENCi0JCQkJCWxvY2F0aW9uICAgCSgyNDYzLCAtMzc1NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNSwgMzU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZUNvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzczMDYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwN0MiDQotCQkJCQljbGllbnQgICAgIAlAMTA3MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyOTI3LCAzODcpDQotCQkJCQkgICAgKDE3NTAsIDM4NykNCi0JCQkJCSAgICAoMTc1MCwgNTIxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjkyNywgMzg3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDUyMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNCwgNDI1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU3MjQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDIiIEAxMDc1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzENCi0JCQkJCWxvY2F0aW9uICAgCSgyNDYzLCAtMzc1NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjk0NiwgMTQ0OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3MiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDcxDQotCQkJCQlzdXBwbGllciAgIAlAMTA2NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDI5MjcsIDM4NykNCi0JCQkJCSAgICAoMjk4NywgMzg3KQ0KLQkJCQkJICAgICgyOTg3LCAxNjcxKQ0KLQkJCQkJICAgICgyOTI4LCAxNjcxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjkyNywgMzg3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5MjgsIDE2NzEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMDc3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTksIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzciIEAxMDc4DQotCQkJCWxvY2F0aW9uICAgCSgxNzUwLCA4NzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNEUwMDY3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTA3OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDc4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDAsIDY5MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MTAzNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDJBNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDc4DQotCQkJCQlzdXBwbGllciAgIAlAMTA2Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA4NzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNjMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE0LCA2OTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzQ0NDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc4IiBAMTA4Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDc4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MDksIDEwNjUpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA1MDAyOUIiDQotCQkJCQljbGllbnQgICAgIAlAMTA3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNzcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDExMTMpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDEwODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNzksIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDkiIEAxMDg1DQotCQkJCWxvY2F0aW9uICAgCSgxMjUyLCAxODk2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRUJEQzg3MDI0NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTAiIEAxMDg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwODUNCi0JCQkJCWxvY2F0aW9uICAgCSg3MDgsIDEyODgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMkY5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDY1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI1MiwgMTg5NikNCi0JCQkJCSAgICAoMjYwMywgMTg5NikNCi0JCQkJCSAgICAoMjYwMywgMTc1MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwMywgMTc1MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiIEAxMDg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwODUNCi0JCQkJCWxvY2F0aW9uICAgCSg3MDgsIDEyODgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY4MiwgMTg1OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zODExNDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRUJEQzhDMDMwMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDg1DQotCQkJCQlzdXBwbGllciAgIAlAMTA4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNTIsIDE4OTYpDQotCQkJCQkgICAgKDQyOCwgMTg5NikNCi0JCQkJCSAgICAoNDI4LCAxMjIzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MjgsIDEyMjMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM4MiwgMTg2MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3NTAzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MSIgQDEwOTANCi0JCQkJbG9jYXRpb24gICAJKDExOTksIDEzMjEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEMzIwMjIwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgyIiBAMTA5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjU1LCA3MTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEM0MwMTBDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwOTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMDc3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE5OSwgMTMyMSkNCi0JCQkJCSAgICAoMTg5NywgMTMyMSkNCi0JCQkJCSAgICAoMTg5NywgMTIyMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5NywgMTIyMykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiIEAxMDkyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTANCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU3LCAxMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyOTU2OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEM0MwMTBEIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwOTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMDg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE5OSwgMTMyMSkNCi0JCQkJCSAgICAoNTAwLCAxMzIxKQ0KLQkJCQkJICAgICg1MDAsIDEyMjMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUwMCwgMTIyMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgyMzA1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA5NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDEwNjUNCi0JCQkJc3VwcGxpZXIgICAJQDEwMzANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDYsIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjA2LCAxNTkzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDMxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDk2DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDEwOTcNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgNDk1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI0Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDQ2NDI5DQotCQkJCSAgICBoZWlnaHQgICAgIAk2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIg0KLQkJCQljbGllbnQgICAgIAlAMTAzNA0KLQkJCQlzdXBwbGllciAgIAlAOTczDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTMsIDUyMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1MywgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwOTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUAxMDAzDQotCQkJCXN1cHBsaWVyICAgCUAxMDMwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA5LCAxNjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTU5MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAzMSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA5OQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAwDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDE1OTEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45ODAzOTINCi0JCQkJICAgIGhlaWdodCAgICAgCTM4NQ0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjU1MDMyQiINCi0JCQkJY2xpZW50ICAgICAJQDEwMDMNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDQsIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ0LCAxNTkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTAxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5Ig0KLQkJCQljbGllbnQgICAgIAlAOTc2DQotCQkJCXN1cHBsaWVyICAgCUA5NzMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NiwgNTIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDk3NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExMDINCi0JCQkJbG9jYXRpb24gICAJKDQzMSwgMjIyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5ODkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDMxLCAyMjIpDQotCQkJCSAgICAoNDMxLCAxMzApKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEwMw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTA0DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNjEsIDIyNCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk3Njc0NA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJODYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI0NDAwNjkiDQotCQkJCWNsaWVudCAgICAgCUA5NzMNCi0JCQkJc3VwcGxpZXIgICAJQDk4OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc1LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzUsIDIyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExMDUNCi0JCQkJbG9jYXRpb24gICAJKDEzMDksIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTAyMg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMzA5LCA0NjUpDQotCQkJCSAgICAoMTMwOSwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDYNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEwNw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQxLCA0OTUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjQyODYNCi0JCQkJICAgIGhlaWdodCAgICAgCTEwDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjYwMzM5Ig0KLQkJCQljbGllbnQgICAgIAlAMTAzNA0KLQkJCQlzdXBwbGllciAgIAlAMTAyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTMxLCA1MjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzEsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEwOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEZDMDFFNyINCi0JCQkJY2xpZW50ICAgICAJQDk4Mw0KLQkJCQlzdXBwbGllciAgIAlAMTA2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjUwLCAxNjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjUwLCAxNTkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTA5DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMTANCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDUsIDQ5MykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk1ODMzMw0KLQkJCQkgICAgaGVpZ2h0ICAgICAJOA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTYxMDNCRSINCi0JCQkJY2xpZW50ICAgICAJQDk5Ng0KLQkJCQlzdXBwbGllciAgIAlAMTAyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExMQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTEyDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTUxLCA5MDUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDg5ODANCi0JCQkJICAgIGhlaWdodCAgICAgCTczDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRUIwMkE4Ig0KLQkJCQljbGllbnQgICAgIAlAMTA3Nw0KLQkJCQlzdXBwbGllciAgIAlAOTY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODc4LCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3OCwgODY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NjcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTMNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTExNA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MiwgODA3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE4Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODc5MzEwDQotCQkJCSAgICBoZWlnaHQgICAgIAk2MQ0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDNBMDIyMSINCi0JCQkJY2xpZW50ICAgICAJQDEwNzcNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDMsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAzLCA3NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTUNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTExNg0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NCwgODAxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJENzM3MDM4RiINCi0JCQkJY2xpZW50ICAgICAJQDk5NQ0KLQkJCQlzdXBwbGllciAgIAlAMTA2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI4NCwgODM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NCwgNzY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDY0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTE3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNjQwMjQwIg0KLQkJCQljbGllbnQgICAgIAlAOTY1DQotCQkJCXN1cHBsaWVyICAgCUAxMDIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjg0LCA3NjIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzc5LCA3NjIpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTE4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQljbGllbnQgICAgIAlAOTY0DQotCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM3LCA1MjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjM3LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMDUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiDQotCQkJCWNsaWVudCAgICAgCUAxMDIxDQotCQkJCXN1cHBsaWVyICAgCUA5NjQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDcyOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDYzMSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiDQotCQkJCWNsaWVudCAgICAgCUA5NjYNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5NTAsIDUyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyMQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTIyDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyODIxLCA4OTcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTgxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODc3MTkNCi0JCQkJICAgIGhlaWdodCAgICAgCTc2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNEYwMjNDIg0KLQkJCQljbGllbnQgICAgIAlAOTYzDQotCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODk2LCA5MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODk2LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMDUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjMNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEyNA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMxMywgOTA0KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODUwNjIyDQotCQkJCSAgICBoZWlnaHQgICAgIAk2OA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkUyMDM4MSINCi0JCQkJY2xpZW50ICAgICAJQDk3NQ0KLQkJCQlzdXBwbGllciAgIAlAOTY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzgxLCAxMTA5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM4MSwgODY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NjcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjUNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEyNg0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjg3OCwgMjY5KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTQ2NjY3DQotCQkJCSAgICBoZWlnaHQgICAgIAk2Ng0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjU1MDM4NSINCi0JCQkJY2xpZW50ICAgICAJQDk3NQ0KLQkJCQlzdXBwbGllciAgIAlAOTg5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQzLCAxMTA5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk0MywgMjIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTI3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQljbGllbnQgICAgIAlAMTA4NA0KLQkJCQlzdXBwbGllciAgIAlAOTczDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NjIsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjIsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTc0KSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjkuIENvbmNyZXRlIFNjaGVtYSBDb21wb3NpdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0MyNUVCN0EwMzhDIg0KLQkJCXRpdGxlICAgICAgCSI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDExMjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDE1MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ5MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExOSIgQDExMjkNCi0JCQkJbG9jYXRpb24gICAJKDIyOCwgMTY5NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFNjAyNTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIwIiBAMTEzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTI5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ3NiwgLTM4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3LCAxNjIzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMkY3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExMjkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTI4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjI4LCAxNjk1KQ0KLQkJCQkJICAgICgxNzUsIDE2OTUpDQotCQkJCQkgICAgKDE3NSwgMTU5MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOCwgMTY5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUsIDE1OTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iIEAxMTMyDQotCQkJCQlQYXJlbnRfVmlldyAJQDExMjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMjksIDE3NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS45MjQ1MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MUVBMDMwQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTI5DQotCQkJCQlzdXBwbGllciAgIAlAMTEyOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIyOCwgMTY5NSkNCi0JCQkJCSAgICAoMjgxLCAxNjk1KQ0KLQkJCQkJICAgICgyODEsIDE1OTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxLCAxNTkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjksIDE2NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDU3MTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAxMTM1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgMTUzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc5MCwgMTQ5MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUxOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU1IiBAMTEzNg0KLQkJCQlsb2NhdGlvbiAgIAkoOTUyLCAxNjk4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ1MDM5OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTYiIEAxMTM3DQotCQkJCQlQYXJlbnRfVmlldyAJQDExMzYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTI4OCwgLTMxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODYwLCAxNjIzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzhBIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMzYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTM1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTUyLCAxNjk4KQ0KLQkJCQkJICAgICg5MDEsIDE2OTgpDQotCQkJCQkgICAgKDkwMSwgMTU5MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTY5OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDE1OTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExMzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEzNg0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDIwLCAxNzM5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTU2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4zMjY5MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ5MDM5RSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTM2DQotCQkJCQlzdXBwbGllciAgIAlAMTEzNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDk1MiwgMTY5OCkNCi0JCQkJCSAgICAoMTAwNCwgMTY5OCkNCi0JCQkJCSAgICAoMTAwNCwgMTU5MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTY5OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA0LCAxNTkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NTIsIDE2NDkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDExNDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NTYsIDk5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDIwLCA5NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJCXdpZHRoICAgICAgCTQ5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAMTE0Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MTIsIDczNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQl3aWR0aCAgICAgIAk0NzUNCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDExNDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDQxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NiwgMjg1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTQwNg0KLQkJCQloZWlnaHQgICAgIAkyODcNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE5IiBAMTE0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMwMywgNjc5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEAxMTQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDEsIC04NTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTksIDM4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDAzODQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTQ1DQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMDMsIDY3OSkNCi0JCQkJCSAgICAoMTMwMywgNDE5KQ0KLQkJCQkJICAgICg4NDMsIDQxOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDQxOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTIyLCA0NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTA3NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMCIgQDExNDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0NSwgOTU2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExNDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTMwMywgNjc5KQ0KLQkJCQkJICAgICgxMzAzLCA5OTcpDQotCQkJCQkgICAgKDkwMSwgOTk3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwMywgNjc5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMSwgOTk3KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE3IiBAMTE1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgNjQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQ0M3MDBFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZFNjaGVtYSIgQDExNTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE1MQ0KLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzgsIDUwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMTkyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNTENCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQ0KLQkJCQkJICAgICgxMjE2LCA1MzQpDQotCQkJCQkgICAgKDg0MywgNTM0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxNiwgNjQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNTM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjYsIDU3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzMTY0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE4IiBAMTE1NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTUxDQotCQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAtMTM5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc0LCA3NTYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiDQotCQkJCQljbGllbnQgICAgIAlAMTE1MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjE2LCA2NDkpDQotCQkJCQkgICAgKDEyMTYsIDc5NykNCi0JCQkJCSAgICAoODc3LCA3OTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc3LCA3OTcpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjMiIEAxMTU3DQotCQkJCWxvY2F0aW9uICAgCSg2NjIsIDY0MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBNjAxMzEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNpbmdEaXJlY3RpdmVzIiBAMTE1OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTU3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDY3NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2luZ0RpcmVjdGl2ZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MDg3NTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzEiDQotCQkJCQljbGllbnQgICAgIAlAMTE1Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYyLCA3MjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNSwgNjc4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDMwNjU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjQiIEAxMTYxDQotCQkJCQlQYXJlbnRfVmlldyAJQDExNTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjM0LCAxMTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYyMSwgNTc2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTkwMzcwIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNTcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MiwgNjQyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNTU5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI1IiBAMTE2Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNzUsIDE4OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGMDAwNUUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI2IiBAMTE2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMUUiDQotCQkJCQljbGllbnQgICAgIAlAMTE2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NSwgMTg4KQ0KLQkJCQkJICAgICg3NSwgMTI4KQ0KLQkJCQkJICAgICg1MTAsIDEyOCkNCi0JCQkJCSAgICAoNTEwLCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgMjczKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RWZXJzaW9uIiBAMTE2NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCA3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VmVyc2lvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC41OTM3NTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMjgiDQotCQkJCQljbGllbnQgICAgIAlAMTE2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NSwgMTg4KQ0KLQkJCQkJICAgICg3NSwgMzgwKQ0KLQkJCQkJICAgICg0MzcsIDM4MCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAxODgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAzODApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMzI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc0NzU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyNyIgQDExNjgNCi0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDEzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwQjAxMUIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI4IiBAMTE2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTY4DQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRDBGMDEyMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTY4DQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNjIsIDEzNCkNCi0JCQkJCSAgICAoNzY2LCAxMzQpDQotCQkJCQkgICAgKDc2NiwgMjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMTM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2NiwgMjczKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm9yaWdpbmFsVmVyc2lvbiIgQDExNzANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE2OA0KLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgLTM2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2NCwgOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JpZ2luYWxWZXJzaW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjY1MDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTJCIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2MiwgMTM0KQ0KLQkJCQkJICAgICgxMzIyLCAxMzQpDQotCQkJCQkgICAgKDEzMjIsIDMzNCkNCi0JCQkJCSAgICAoODQzLCAzMzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCAzMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxOSwgMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4MTA4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyOSIgQDExNzMNCi0JCQkJbG9jYXRpb24gICAJKDEyNiwgNjU2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVFRUFCMDAxRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzAiIEAxMTc0DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUYwMTBCIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2LCA2NTYpDQotCQkJCQkgICAgKDUxMywgNjU2KQ0KLQkJCQkJICAgICg1MTMsIDU1OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMywgNTU5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFZlcnNpb25zIiBAMTE3NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzNCwgMTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcsIDQzMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRWZXJzaW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzkwMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUYwMTE1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExNzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2LCA2NTYpDQotCQkJCQkgICAgKDY2LCA2NTYpDQotCQkJCQkgICAgKDY2LCA0NzIpDQotCQkJCQkgICAgKDQzNywgNDcyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2LCA2NTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCA0NzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM1NiwgNTI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY4NDY4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMyIgQDExNzgNCi0JCQkJbG9jYXRpb24gICAJKDY0MiwgMTI2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc4NDczMDE5NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzQiIEAxMTc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzgNCi0JCQkJCWxvY2F0aW9uICAgCSg4MiwgLTQxOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3NTAxRjEiDQotCQkJCQljbGllbnQgICAgIAlAMTE3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2NDIsIDEyNikNCi0JCQkJCSAgICAoNTg4LCAxMjYpDQotCQkJCQkgICAgKDU4OCwgMjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg4LCAyNzMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hRm9yU2NoZW1hIiBAMTE4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTc4DQotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYzOSwgNzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hRm9yU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA1NTU1Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjQyLCAxMjYpDQotCQkJCQkgICAgKDY5NywgMTI2KQ0KLQkJCQkJICAgICg2OTcsIDI3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY0MiwgMTI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY5NywgMjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDIxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMTg2Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExODMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiDQotCQkJCWNsaWVudCAgICAgCUAxMTQyDQotCQkJCXN1cHBsaWVyICAgCUAxMTQzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzgsIDkzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYzOCwgODQzKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTE4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY3LCAxMTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDkyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MyIgQDExODUNCi0JCQkJbG9jYXRpb24gICAJKDIzNCwgMTM0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2QjAxOTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzQiIEAxMTg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDExODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzEwLCAtNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwLCAxMjcxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkQwMzA5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0LCAxMzQwKQ0KLQkJCQkJICAgICgxODEsIDEzNDApDQotCQkJCQkgICAgKDE4MSwgMTIzOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgMTM0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEsIDEyMzkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDExODgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzMsIDEzODkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjg2NzkyNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkQwMzEzIg0KLQkJCQkJY2xpZW50ICAgICAJQDExODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0LCAxMzQwKQ0KLQkJCQkJICAgICgyODcsIDEzNDApDQotCQkJCQkgICAgKDI4NywgMTIzOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgMTM0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODcsIDEyMzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgMTI5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0Mjk0NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDExOTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYwLCAxNDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxMDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTE5Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5OSwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJd2lkdGggICAgICAJMjQ0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDciIEAxMTkzDQotCQkJCWxvY2F0aW9uICAgCSgxNjY4LCAyODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUUwMUNDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwOCIgQDExOTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5Mw0KLQkJCQkJbG9jYXRpb24gICAJKDgsIC0xNTIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTBGIg0KLQkJCQkJY2xpZW50ICAgICAJQDExOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTkxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY4LCAxOTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljRmFjZXRzIiBAMTE5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkzDQotCQkJCQlsb2NhdGlvbiAgIAkoOCwgLTE1MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1MiwgMzAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY0ZhY2V0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI0NjE1NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEFGMDExQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTkzDQotCQkJCQlzdXBwbGllciAgIAlAMTE5Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY4LCAyODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMzYxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjI1LCAzMDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzY5MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMTk4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNiwgOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMTk5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgNjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNSwgNTk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTU0MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA5IiBAMTIwMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwOCwgNzkyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQzMDI4RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTAiIEAxMjAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIsIC0yODApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDQwMkYzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMTk5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDgsIDc5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA2OTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljUGFydGljbGUiIEAxMjAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIsIC0yODApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDc2NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNQYXJ0aWNsZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yNTkyNTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRkQiDQotCQkJCQljbGllbnQgICAgIAlAMTIwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDExOTgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwOCwgNzkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDgsIDg4OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ1NCwgODI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk1MDYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyMDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODUiIEAxMjA2DQotCQkJCWxvY2F0aW9uICAgCSg5MTksIDEzNDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNUUwMUY5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDg2IiBAMTIwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjA2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTIzMywgLTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjUsIDEyNzMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2MjAwNDYiDQotCQkJCQljbGllbnQgICAgIAlAMTIwNg0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMDUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MTksIDEzNDkpDQotCQkJCQkgICAgKDg2NiwgMTM0OSkNCi0JCQkJCSAgICAoODY2LCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTE5LCAxMzQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTIzOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyMDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwNg0KLQkJCQkJbG9jYXRpb24gICAJKC0yMzMsIC01OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTkzLCAxMzkzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzc3MzU4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2MjAwNTAiDQotCQkJCQljbGllbnQgICAgIAlAMTIwNg0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMDUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MTksIDEzNDkpDQotCQkJCQkgICAgKDk3MywgMTM0OSkNCi0JCQkJCSAgICAoOTczLCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTE5LCAxMzQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk3MywgMTIzOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAxMjk2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAxNDkyNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDEyMTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTUyLCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODE2LCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMSIgQDEyMTMNCi0JCQkJbG9jYXRpb24gICAJKDIwMjUsIDc5MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREOTAxRjYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEyIiBAMTIxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEzDQotCQkJCQlsb2NhdGlvbiAgIAkoMTUzLCAtMjgwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNERBMDI4NCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjEzDQotCQkJCQlzdXBwbGllciAgIAlAMTE5OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgNjk1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1dpbGRjYXJkIiBAMTIxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEzDQotCQkJCQlsb2NhdGlvbiAgIAkoMTUzLCAtMjgwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODI2LCA4MzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40ODgwOTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyOEUiDQotCQkJCQljbGllbnQgICAgIAlAMTIxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMTINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAyNSwgNzkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjUsIDg4OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5OCwgODQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA2MTczDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMyIgQDEyMTgNCi0JCQkJbG9jYXRpb24gICAJKDE3NTQsIDExNzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY4RkYwMUJGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxNCIgQDEyMTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xOTgsIDIzNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRDNjkwMjAzMTciDQotCQkJCQljbGllbnQgICAgIAlAMTIxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMDUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NCwgMTE3OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzAxLCAxMTc4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1dpbGRjYXJkIiBAMTIyMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjE4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5OCwgMjM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMjYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTYzMzU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRDNjkwMjAzMTgiDQotCQkJCQljbGllbnQgICAgIAlAMTIxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzU0LCAxMTc4KQ0KLQkJCQkJICAgICgyMDI4LCAxMTc4KQ0KLQkJCQkJICAgICgyMDI4LCA5OTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjgsIDk5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MiwgMTA5OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MzY2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMTAuIERpYWdub3N0aWNzIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNUYwODAzRTIiDQotCQkJdGl0bGUgICAgICAJIjEwLiBEaWFnbm9zdGljcyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NTm9kZSIgQDEyMjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDEwMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgOTkwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2NEE1MDExNyINCi0JCQkJd2lkdGggICAgICAJNjg2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljU2V2ZXJpdHkiIEAxMjI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgNjU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA1NDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpY1NldmVyaXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOCwgNDk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjhBNzAzMkYiDQotCQkJCXdpZHRoICAgICAgCTQ2Mg0KLQkJCQloZWlnaHQgICAgIAkzNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTIyNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU5LCA2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTIyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4OTYsIDExMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTQwLCA2MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MTMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCXdpZHRoICAgICAgCTczMQ0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyMjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDYwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY0LCA0MDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpYyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJCXdpZHRoICAgICAgCTY1OA0KLQkJCQloZWlnaHQgICAgIAk0MzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE1IiBAMTIyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAyODMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzEwMzVGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNiIgQDEyMjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIyOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjI4DQotCQkJCQlzdXBwbGllciAgIAlAMTIyNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQsIDI4MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQsIDE3NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbGxEaWFnbm9zdGljcyIgQDEyMzANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIyOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDksIDMzMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbGxEaWFnbm9zdGljcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0ODU5OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE2NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjI4DQotCQkJCQlzdXBwbGllciAgIAlAMTIyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQsIDI4MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQsIDM5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTYsIDMyNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDU2MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTEiIEAxMjMzDQotCQkJCWxvY2F0aW9uICAgCSgxMDI4LCA0NDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMjcwM0NEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMiIgQDEyMzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIzMw0KLQkJCQkJbG9jYXRpb24gICAJKC0zOTYsIC03MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyQjAwNjEiDQotCQkJCQljbGllbnQgICAgIAlAMTIzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyOCwgNDQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcxMywgNDQwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbXBvbmVudHMiIEAxMjM1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzOCwgMjMwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBvbmVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjkxODENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyQjAwNkMiDQotCQkJCQljbGllbnQgICAgIAlAMTIzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDI4LCA0NDApDQotCQkJCQkgICAgKDEwODgsIDQ0MCkNCi0JCQkJCSAgICAoMTA4OCwgMTc0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyOCwgNDQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODgsIDE3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMjMyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODIzODQ4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxMyIgQDEyMzgNCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMjgyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2MjY5MDE2NSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTQiIEAxMjM5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgMjgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMTc0KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRpYWdub3N0aWNzIiBAMTI0MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjM4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAtMjc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDMzMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitkaWFnbm9zdGljcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MjYzMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjZBMDAyNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjM4DQotCQkJCQlzdXBwbGllciAgIAlAMTIyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODgsIDM5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ1LCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTQ3MzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjQzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QzBGNEMwMUExIg0KLQkJCQljbGllbnQgICAgIAlAMTIyNw0KLQkJCQlzdXBwbGllciAgIAlAMTIyNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAzOTApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDE3NCkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMTEuIFN1cHBsZW1lbnRhbCINCi0JCQlxdWlkICAgICAgIAkiM0MyODdFNDkwMTlCIg0KLQkJCXRpdGxlICAgICAgCSIxMS4gU3VwcGxlbWVudGFsIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMjQ0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDY0LCA4MTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNzYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTgzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTg1Mg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjQ1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjExMiwgODgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMSwgODI0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNzgwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDEyNDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxMTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCA2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCXdpZHRoICAgICAgCTQ5OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyNDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM4NCwgMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIzNiwgNjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpYyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM3IiBAMTI0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgODQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzUwMTM3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1hcnlDb21wb25lbnQiIEAxMjQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTYsIDExNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltYXJ5Q29tcG9uZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQwODI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNzAxMTMiDQotCQkJCQljbGllbnQgICAgIAlAMTI0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNDYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM3LCA4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjI0LCA1NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NzI2MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM4IiBAMTI1Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1MCwgLTUwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1OCwgMTI2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEyIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyNDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjQ3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjcsIDg0KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTI1NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA2ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzc4LCA2MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDY2NykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGVsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSA6IGJvb2xlYW4iDQotCQkJCQkiKyBjaXJjdWxhciA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJNzgyDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDEyNTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMTA3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgOTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDAsIDEwNTEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjMNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBmYWNldE5hbWUgOiBTdHJpbmciDQotCQkJCQkiKyBlZmZlY3RpdmVWYWx1ZSA6IFZhbHVlIikpDQotCQkJCXdpZHRoICAgICAgCTQ1OA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAxMjU2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgNjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDU2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNjI4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzY5DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTgyMA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEAxMjU3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDI4OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNSwgMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDIxNykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTM1Ng0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGFsaWFzTmFtZSA6IFN0cmluZyINCi0JCQkJCSIrIHVSSSA6IFN0cmluZyINCi0JCQkJCSIrIGFsaWFzVVJJIDogU3RyaW5nIg0KLQkJCQkJIisgcU5hbWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNDcyDQotCQkJCWhlaWdodCAgICAgCTI4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDEyNTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDM1MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDI5NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU2Mg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTI1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA1MTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEyNTgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMzIwLCA1MTApDQotCQkJCSAgICAoMzIwLCA0MjApKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI2MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCINCi0JCQkJY2xpZW50ICAgICAJQDEyNTYNCi0JCQkJc3VwcGxpZXIgICAJQDEyNTgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxLCA1NTYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MSwgNTEwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjYxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzgwMEQyIg0KLQkJCQljbGllbnQgICAgIAlAMTI0NA0KLQkJCQlzdXBwbGllciAgIAlAMTI1OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODc3LCA3NDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDUxMCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI1OSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IiBAMTI2Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxODA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMSwgMTc2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhJbmNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiDQotCQkJCXdpZHRoICAgICAgCTQ1Ng0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiIEAxMjYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTc3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxNzI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSINCi0JCQkJd2lkdGggICAgICAJNDkzDQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCIgQDEyNjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxOTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE4ODkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRXhjbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIg0KLQkJCQl3aWR0aCAgICAgIAk0OTMNCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBAMTI2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzA0LCAxOTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3MywgMTkxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhFeGNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIgQDEyNjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzQsIDEzNzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTQyMg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBAMTI2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2MywgMTIxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIgQDEyNjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCAxMzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDEzNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCINCi0JCQkJd2lkdGggICAgICAJMzgwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROdW1lcmljRmFjZXQiIEAxMjY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTIzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5LCAxMTc4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJCXdpZHRoICAgICAgCTQwMA0KLQkJCQloZWlnaHQgICAgIAkxMzINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEAxMjcwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE2MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE1MzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNSwgMTU5NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iDQotCQkJCQkiKyBleGNsdXNpdmUgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTQyMA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IiBAMTI3MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyMjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjIzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCQl3aWR0aCAgICAgIAk0NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxMjcyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDI2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc0LCAyNTcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQl3aWR0aCAgICAgIAk0NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDEyNzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMjEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOTYsIDIwNzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGF0dGVybkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQkJd2lkdGggICAgICAJMzYyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IiBAMTI3NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIwOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgMjA0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbnVtZXJhdGlvbkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQkJd2lkdGggICAgICAJNDU4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIgQDEyNzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAyMjcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDIyMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCQl3aWR0aCAgICAgIAkzNTgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IiBAMTI3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE1ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAxNTAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAxNTYzKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgaW5jbHVzaXZlIDogYm9vbGVhbiINCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIgQDEyNzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMjQ2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMTEsIDI0MTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IiBAMTI3OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOSwgMjM5NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5MZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCXdpZHRoICAgICAgCTQyMA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDEyNzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAyNjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDI1NTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVG90YWxEaWdpdHNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJCXdpZHRoICAgICAgCTQyMg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTI4MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDExNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NjcsIDExMDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEyODENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMDcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAsIDEwMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTI4Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzA0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMTM2NCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIHZhbGlkRmFjZXRzIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTU5NA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ5IiBAMTI4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0NiwgMTIxOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NDAzMEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVEZWZpbml0aW9uIiBAMTI4NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjgzDQotCQkJCQlsb2NhdGlvbiAgIAkoNTgyLCAtNzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjg1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODAsIDExNzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTMuMjY4MjkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NzAwREQiDQotCQkJCQljbGllbnQgICAgIAlAMTI4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDQ2LCAxMjE4KQ0KLQkJCQkJICAgICgxNDg3LCAxMjE4KQ0KLQkJCQkJICAgICgxNDg3LCAxMjkyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxMjkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM5LCAxMjU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE4NDIxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUwIiBAMTI4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjgzDQotCQkJCQlsb2NhdGlvbiAgIAkoNTgyLCAtNzgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEU3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyODMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ0NiwgMTIxOCkNCi0JCQkJCSAgICAoMTQwNSwgMTIxOCkNCi0JCQkJCSAgICAoMTQwNSwgMTI5MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NDYsIDEyMTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNSwgMTI5MikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1MyIgQDEyODgNCi0JCQkJbG9jYXRpb24gICAJKDE3MzMsIDE1NzUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEQwMjUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1NCIgQDEyODkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI4OA0KLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RTAwOTEiDQotCQkJCQljbGllbnQgICAgIAlAMTI4OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzMzLCAxNTc1KQ0KLQkJCQkJICAgICgxNDg3LCAxNTc1KQ0KLQkJCQkJICAgICgxNDg3LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczMywgMTU3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEZhY2V0IiBAMTI5MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjg4DQotCQkJCQlsb2NhdGlvbiAgIAkoOTE3LCA3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzUxLCAxNTQxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ2MjQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RTAwOUIiDQotCQkJCQljbGllbnQgICAgIAlAMTI4OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczMywgMTU3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI2LCAxNTc1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDQyLCAxNTM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5MTU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1NSIgQDEyOTMNCi0JCQkJbG9jYXRpb24gICAJKDE1ODcsIDE3OTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUIwMzk2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1NiIgQDEyOTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI5Mw0KLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEFDMDNDOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjkzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1ODcsIDE3OTMpDQotCQkJCQkgICAgKDE0NDcsIDE3OTMpDQotCQkJCQkgICAgKDE0NDcsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NDcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4SW5jbHVzaXZlRmFjZXQiIEAxMjk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyOTMNCi0JCQkJCWxvY2F0aW9uICAgCSg3MDcsIC0zMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNywgMTc1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhJbmNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODQ0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0Q0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjYyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODcsIDE3OTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MiwgMTc5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyMCwgMTc1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1OTE1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTciIEAxMjk4DQotCQkJCWxvY2F0aW9uICAgCSg5MzcsIDE3ODcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUYwMzM4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1OCIgQDEyOTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI5OA0KLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMUY5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTM3LCAxNzg3KQ0KLQkJCQkJICAgICg5OTcsIDE3ODcpDQotCQkJCQkgICAgKDk5NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluSW5jbHVzaXZlRmFjZXQiIEAxMzAwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyOTgNCi0JCQkJCWxvY2F0aW9uICAgCSg2MTcsIC01KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTIsIDE3NDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNDYwNjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEIwMDIwMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjk4DQotCQkJCQlzdXBwbGllciAgIAlAMTI2Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDE3ODcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTE4LCAxNzg3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzUsIDE3NDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM5NjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU5IiBAMTMwMw0KLQkJCQlsb2NhdGlvbiAgIAkoOTgxLCAxOTM3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEIzMDIwNyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjAiIEAxMzA0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMDMNCi0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOTAiDQotCQkJCQljbGllbnQgICAgIAlAMTMwMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5ODEsIDE5MzcpDQotCQkJCQkgICAgKDEwNDEsIDE5MzcpDQotCQkJCQkgICAgKDEwNDEsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODEsIDE5MzcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA0MSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5FeGNsdXNpdmVGYWNldCIgQDEzMDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMwMw0KLQkJCQkJbG9jYXRpb24gICAJKDY3NywgLTc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjMsIDE5MDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRXhjbHVzaXZlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNDEyNTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI0MDE5QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzAzDQotCQkJCQlzdXBwbGllciAgIAlAMTI2NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODEsIDE5MzcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTE4LCAxOTM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODksIDE4OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDY2NTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYxIiBAMTMwOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OSwgMTk1MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNjAyOEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYyIiBAMTMwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzA4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjcwMjE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ2OSwgMTk1MykNCi0JCQkJCSAgICAoMTQwMCwgMTk1MykNCi0JCQkJCSAgICAoMTQwMCwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwMCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhFeGNsdXNpdmVGYWNldCIgQDEzMTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMwOA0KLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgLTk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ2LCAxOTEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM4NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjk4MDk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMjEiDQotCQkJCQljbGllbnQgICAgIAlAMTMwOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OSwgMTk1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY0LCAxOTUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTYxLCAxOTEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODI3MjM2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2MyIgQDEzMTMNCi0JCQkJbG9jYXRpb24gICAJKDExMjIsIDIxODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMDUxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2NCIgQDEzMTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMxMw0KLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNDYiDQotCQkJCQljbGllbnQgICAgIAlAMTMxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTIyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImxlbmd0aEZhY2V0IiBAMTMxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzEzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxOCwgNjI4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDQsIDIyMDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzU0NzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDI1MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzEzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExMjIsIDIxODApDQotCQkJCQkgICAgKDExMjIsIDIyNDApDQotCQkJCQkgICAgKDM4NywgMjI0MCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIxODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzg3LCAyMjQwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NzEsIDIyMDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU1OTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY3IiBAMTMxOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4NCwgMTk4OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMjAyMUQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY4IiBAMTMxOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzE4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzODAsIDQzNykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMzAwQUIiDQotCQkJCQljbGllbnQgICAgIAlAMTMxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMTk4OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg0LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVudW1lcmF0aW9uRmFjZXRzIiBAMTMyMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzE4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzODAsIDQzNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM3LCAyMDE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VudW1lcmF0aW9uRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDY1ODU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMzAwQUMiDQotCQkJCQljbGllbnQgICAgIAlAMTMxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDg0LCAxOTg5KQ0KLQkJCQkJICAgICgxMDg0LCAyMDQ5KQ0KLQkJCQkJICAgICg0ODUsIDIwNDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ4NSwgMjA0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTgzLCAyMDIxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODUxMjkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2OSIgQDEzMjMNCi0JCQkJbG9jYXRpb24gICAJKDE0NTEsIDIwNzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzUwMTU5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3MCIgQDEzMjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMyMw0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTI1LCA1MzgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzYwMEIwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ1MSwgMjA3NCkNCi0JCQkJCSAgICAoMTM2MiwgMjA3NCkNCi0JCQkJCSAgICAoMTM2MiwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXR0ZXJuRmFjZXRzIiBAMTMyNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyMCwgMjAzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXR0ZXJuRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3MjIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQkEiDQotCQkJCQljbGllbnQgICAgIAlAMTMyMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MSwgMjA3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMDc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTcyLCAyMDM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA4NjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3MSIgQDEzMjgNCi0JCQkJbG9jYXRpb24gICAJKDE4MjcsIDE0MDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzgwMkE3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3MiIgQDEzMjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMyOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFFQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzI4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI3LCAxNDAwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjksIDE0MDApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY2FyZGluYWxpdHlGYWNldCIgQDEzMzANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMyOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODQ3LCAxMzU4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NhcmRpbmFsaXR5RmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzE3MzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFGNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzI4DQotCQkJCQlzdXBwbGllciAgIAlAMTI2Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI3LCAxNDAwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjUsIDE0MDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODMsIDEzNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM0MjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgxIiBAMTMzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMjQxMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQjAzNzciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgyIiBAMTMzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTc4NiwgMzAxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERDMDM1QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzMzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnJhY3Rpb25EaWdpdHNGYWNldCIgQDEzMzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzMw0KLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwOCwgMjU1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM3MzkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNjQiDQotCQkJCQljbGllbnQgICAgIAlAMTMzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAyNDEzKQ0KLQkJCQkJICAgICgxMjYyLCAyNTk2KQ0KLQkJCQkJICAgICgyMDY1LCAyNTk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNTk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTc5LCAyNTU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzODg2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4NSIgQDEzMzgNCi0JCQkJbG9jYXRpb24gICAJKDE4NDEsIDEzMDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTMwMEQ5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4NiIgQDEzMzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM4RSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzM4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODQxLCAxMzA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjksIDEzMDYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYm91bmRlZEZhY2V0IiBAMTM0MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMzUsIC03OTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzIsIDEyNzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYm91bmRlZEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAzMTc0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTQwMzk4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE1NCwgMTMwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NywgMTI3NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1NDcxNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjUiIEAxMzQzDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMTg2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJGMDE4QyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjYiIEAxMzQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjQwLCA2MzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzAwMDZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ3aGl0ZVNwYWNlRmFjZXQiIEAxMzQ1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjQwLCA2MzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzMsIDIyMDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrd2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkwOTA5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNzUiDQotCQkJCQljbGllbnQgICAgIAlAMTM0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzI4LCAyMTg2KQ0KLQkJCQkJICAgICgxMzI4LCAyMjQ2KQ0KLQkJCQkJICAgICgyMDkzLCAyMjQ2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjE4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMjQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDMzLCAyMjAzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI2NzYzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4MyIgQDEzNDgNCi0JCQkJbG9jYXRpb24gICAJKDY3NCwgMTM5MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAwNDgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg0IiBAMTM0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0I5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY3NCwgMTM5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzUsIDEzOTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JkZXJlZEZhY2V0IiBAMTM1MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY1OCwgMTM1MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitvcmRlcmVkRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjE1MzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDNDMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ4DQotCQkJCQlzdXBwbGllciAgIAlAMTI2OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE0LCAxMzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIDEzNTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzQ2MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjczIiBAMTM1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAxMjk2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENCMDM5QyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzQiIEAxMzU0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgwOSwgLTU3NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQzAzRDAiDQotCQkJCQljbGllbnQgICAgIAlAMTM1Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTI5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJudW1lcmljRmFjZXQiIEAxMzU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgwOSwgLTU3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY4LCAxMjU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK251bWVyaWNGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4MDk3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4NywgMTI5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDAsIDEyOTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwNiwgMTI2MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjg0Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODciIEAxMzU4DQotCQkJCWxvY2F0aW9uICAgCSgxNjg5LCAxNjYyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ0MDFFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODgiIEAxMzU5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgzLCAtMzU0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ1MDM2MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzU4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2ODksIDE2NjIpDQotCQkJCQkgICAgKDE0ODcsIDE2NjIpDQotCQkJCQkgICAgKDE0ODcsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjg5LCAxNjYyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWF4RmFjZXQiIEAxMzYwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgzLCAtMzU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzY5LCAxNjIzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyMDUxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNkEiDQotCQkJCQljbGllbnQgICAgIAlAMTM1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI2LCAxNjYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDQ0LCAxNjI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE1Mzg1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4OSIgQDEzNjMNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NEYwMTQ1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5MCIgQDEzNjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtNDYyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNTUwMDM4QyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzYzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMjU4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IiBAMTM2NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDIyODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA4NTQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOTYiDQotCQkJCQljbGllbnQgICAgIAlAMTM2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzI4LCAyMjU4KQ0KLQkJCQkJICAgICgxMzI4LCAyMzI0KQ0KLQkJCQkJICAgICgyMDkzLCAyMzI0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMzI0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA5LCAyMjkzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4ODE3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5MSIgQDEzNjgNCi0JCQkJbG9jYXRpb24gICAJKDEyOTcsIDIzNjYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzQwMTFDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5MiIgQDEzNjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2OA0KLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjBEIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIgQDEzNzANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2OA0KLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTcsIDI0NjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjY5MDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNUM1MDIxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzY4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyOTcsIDIzNjYpDQotCQkJCQkgICAgKDEyOTcsIDI0OTkpDQotCQkJCQkgICAgKDIxMDIsIDI0OTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzY2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDIsIDI0OTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDcsIDI0NzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkzIiBAMTM3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMjQ0OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQTAwQUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk0IiBAMTM3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNzAsIC04MTUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkIwMTM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTM3NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNzAsIC04MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDAsIDI2MzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4NTMxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkIwMTQyIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2MiwgMjQ0OSkNCi0JCQkJCSAgICAoMTI2MiwgMjY2OCkNCi0JCQkJCSAgICAoMjA2NSwgMjY2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NSwgMjY2OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4OSwgMjYyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNjQ4NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTUiIEAxMzc4DQotCQkJCWxvY2F0aW9uICAgCSgxNDIyLCAyMTU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNkIwMDNBNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTYiIEAxMzc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzcwLCAtMTMxMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTEiDQotCQkJCQljbGllbnQgICAgIAlAMTM3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDIyLCAyMTU5KQ0KLQkJCQkJICAgICgxMzYyLCAyMTU5KQ0KLQkJCQkJICAgICgxMzYyLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIgQDEzODANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3OA0KLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzI3LCAyMTI1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVBhdHRlcm5GYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5OTA5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjEwMzEyIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjczDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjIsIDIxNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE4NywgMjE1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjExOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4OTIyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTciIEAxMzgzDQotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAyMDgzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCN0NBMDI2QiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTgiIEAxMzg0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODMNCi0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE4NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzgzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAyMDgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIgQDEzODUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4Mw0KLQkJCQkJbG9jYXRpb24gICAJKDgyOCwgLTEzNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMiwgMjEwMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4NjE5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQjAxOTAiDQotCQkJCQljbGllbnQgICAgIAlAMTM4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDg0LCAyMDgzKQ0KLQkJCQkJICAgICgxMDg0LCAyMTQzKQ0KLQkJCQkJICAgICg0ODUsIDIxNDMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAyMDgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ4NSwgMjE0MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMxLCAyMTAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTMxNzE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMyIgQDEzODgNCi0JCQkJbG9jYXRpb24gICAJKDExMjIsIDIyNDEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwMDUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNCIgQDEzODkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4OA0KLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTQ3OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAzQjkiDQotCQkJCQljbGllbnQgICAgIAlAMTM4OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTIyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUxlbmd0aEZhY2V0IiBAMTM5MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg4DQotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtNDc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDIyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTE3MzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDNDMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzg4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExMjIsIDIyNDEpDQotCQkJCQkgICAgKDExMjIsIDIzMTgpDQotCQkJCQkgICAgKDM4NywgMjMxOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIyNDEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzg3LCAyMzE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NzAsIDIyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg1NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUxIiBAMTM5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAxNTY1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDg1MDI1QiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTIiIEAxMzk0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTMNCi0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzkzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3MywgMTU2NSkNCi0JCQkJCSAgICAoOTU5LCAxNTY1KQ0KLQkJCQkJICAgICg5NTksIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkZhY2V0IiBAMTM5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkzDQotCQkJCQlsb2NhdGlvbiAgIAkoNDY5LCAxMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzUzLCAxNTMyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYzMDkxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4NjAyN0EiDQotCQkJCQljbGllbnQgICAgIAlAMTM5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAxNTY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTU2NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM0LCAxNTIzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ2NjY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNSIgQDEzOTgNCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgMTY1MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjk3MDAxREIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA2IiBAMTM5OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzk4DQotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBDRiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzk4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDgxNiwgMTY1MCkNCi0JCQkJCSAgICAoOTU5LCAxNjUwKQ0KLQkJCQkJICAgICg5NTksIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTYsIDE2NTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1pbkZhY2V0IiBAMTQwMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzk4DQotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjQsIDE2MTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNDE2MTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBEOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzk4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTYsIDE2NTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAxNjUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjMsIDE2MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDI3NDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc1IiBAMTQwMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5NywgMjMyMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDRjAxOTkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc2IiBAMTQwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDAzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTcxOSwgNDk3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQyMDA4NSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDAzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4TGVuZ3RoRmFjZXQiIEAxNDA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzE5LCA0OTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzAsIDIzODApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4TGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzIyNTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQyMDA4RiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDAzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyOTcsIDIzMjEpDQotCQkJCQkgICAgKDEyOTcsIDI0MDkpDQotCQkJCQkgICAgKDIxMDIsIDI0MDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDIsIDI0MDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTQsIDIzNjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkyMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc3IiBAMTQwOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE1OSwgMjI3MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENTAwQzUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc4IiBAMTQwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4MSwgNDQ5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ2MDAxRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDA4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTU5LCAyMjczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNTksIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluTGVuZ3RoRmFjZXQiIEAxNDEwDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMjM3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5MZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxOTUyNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE1OSwgMjI3MykNCi0JCQkJCSAgICAoMTE1OSwgMjQwOSkNCi0JCQkJCSAgICAoNDUwLCAyNDA5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0MDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMjM2OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzYxMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDEiIEAxNDEzDQotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCAyMzM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCODk4MDE2RCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDIiIEAxNDE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTMNCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDU2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIgQDE0MTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxMw0KLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgLTYxMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU2LCAyNDU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTUyNjA0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5OTAwNjAiDQotCQkJCQljbGllbnQgICAgIAlAMTQxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTk3LCAyMzM0KQ0KLQkJCQkJICAgICgxMTk3LCAyNDkzKQ0KLQkJCQkJICAgICg0NTAsIDI0OTMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAyMzM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgMjQ5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI3LCAyNDUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE2MDQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5OSIgQDE0MTgNCi0JCQkJbG9jYXRpb24gICAJKDEyMzEsIDI0MzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDAwMDYyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMCIgQDE0MTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxOA0KLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MTAwMUQiDQotCQkJCQljbGllbnQgICAgIAlAMTQxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiIEAxNDIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTgNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjMsIC03NDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgMjYzMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk3MDMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MTAwMjciDQotCQkJCQljbGllbnQgICAgIAlAMTQxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjMxLCAyNDM4KQ0KLQkJCQkJICAgICgxMjMxLCAyNjY4KQ0KLQkJCQkJICAgICg0NTEsIDI2NjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMjY2OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM0LCAyNjMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE4ODEyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3OSIgQDE0MjMNCi0JCQkJbG9jYXRpb24gICAJKDEyMzEsIDIzOTcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwMERFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MCIgQDE0MjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMw0KLQkJCQkJbG9jYXRpb24gICAJKC0yMDksIDI1MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAzQ0QiDQotCQkJCQljbGllbnQgICAgIAlAMTQyMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInRvdGFsRGlnaXRzRmFjZXQiIEAxNDI1DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MywgMjU1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0b3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTg1NTY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAzRDciDQotCQkJCQljbGllbnQgICAgIAlAMTQyMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjMxLCAyMzk3KQ0KLQkJCQkJICAgICgxMjMxLCAyNTg3KQ0KLQkJCQkJICAgICg0NTEsIDI1ODcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyMzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMjU4NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM1LCAyNTYwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE0NjQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMTQyOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDc2OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxOSwgNTc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJNDQ0DQotCQkJCWhlaWdodCAgICAgCTQxMw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNDI5DQotCQkJCWxvY2F0aW9uICAgCSgxMjA5LCAxMDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEyMDksIDEwNjUpDQotCQkJCSAgICAoMTIwOSwgOTc0KSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzUiIEAxNDMwDQotCQkJCWxvY2F0aW9uICAgCSgxMDkwLCAxMDMxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjg4MEY1MDNEOSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxNDMxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzANCi0JCQkJCWxvY2F0aW9uICAgCSgzMjIsIC0yNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk3LCAxMDM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTg3NjUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGOTAwM0MiDQotCQkJCQljbGllbnQgICAgIAlAMTQzMA0KLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDkwLCA5NzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMjEsIDEwMzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYxNzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzYiIEAxNDM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzANCi0JCQkJCWxvY2F0aW9uICAgCSgzMjIsIC0yNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGOTAwNDYiDQotCQkJCQljbGllbnQgICAgIAlAMTQzMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDg4KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQxIiBAMTQzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgODczKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBNkRCMDFFNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZSIgQDE0MzYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzNQ0KLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU4LCA3OTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNzYwODcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREQiDQotCQkJCQljbGllbnQgICAgIAlAMTQzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM4LCA4NzMpDQotCQkJCQkgICAgKDE1MzgsIDkxOSkNCi0JCQkJCSAgICAoMTQ1NCwgOTE5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgODczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDkxOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwOSwgODc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDE2NjY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDIiIEAxNDM5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNzgsIDEwNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREUiDQotCQkJCQljbGllbnQgICAgIAlAMTQzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM4LCA4NzMpDQotCQkJCQkgICAgKDE1MzgsIDgyOCkNCi0JCQkJCSAgICAoMTQ1NCwgODI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgODczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDgyOCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0MyIgQDE0NDANCi0JCQkJbG9jYXRpb24gICAJKDE1MzUsIDY4NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxMjAxMDgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGUiIEAxNDQxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDANCi0JCQkJCWxvY2F0aW9uICAgCSgxNzUsIC04NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNTk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjk3NzI3Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzNSwgNjg0KQ0KLQkJCQkJICAgICgxNTM1LCA3MjgpDQotCQkJCQkgICAgKDE0NTQsIDcyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzUsIDY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA3MjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDYsIDY4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjc3NzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NCIgQDE0NDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0MA0KLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzE0MDE1QiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQwDQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzUsIDY4NCkNCi0JCQkJCSAgICAoMTUzNSwgNjQxKQ0KLQkJCQkJICAgICgxNDU0LCA2NDEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgNjQxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ3IiBAMTQ0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjEzLCA5NDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RUQwM0MwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbXBsZXhUeXBlIiBAMTQ0Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTc0NywgMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjUsIDk4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb21wbGV4VHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3MzA1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjEzLCA5NDApDQotCQkJCQkgICAgKDI4NCwgOTQwKQ0KLQkJCQkJICAgICgyODQsIDEwMDgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MTMsIDk0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDEwMDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgOTcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTA5MzIwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDgiIEAxNDQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTIxIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYxMywgOTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTAsIDk0MCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ1MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJY2xpZW50ICAgICAJQDE0MjgNCi0JCQkJc3VwcGxpZXIgICAJQDEyNTgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTIsIDU2MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTIsIDUxMCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI1OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ1MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDEyODANCi0JCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDYsIDEwODgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDI5KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ1IiBAMTQ1Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MiwgMTEzMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0QjAxNzgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2ltcGxlVHlwZSIgQDE0NTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTgsIC0xNjMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTksIDEwOTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2ltcGxlVHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yNDY3NTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0RDAxN0IiDQotCQkJCQljbGllbnQgICAgIAlAMTQ1Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MiwgMTEzMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxMjkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIxLCAxMDk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIyNzI3Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ2IiBAMTQ1Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0RDAxODUiDQotCQkJCQljbGllbnQgICAgIAlAMTQ1Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MiwgMTEzMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCA5NzQpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAMTQ1Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCAzODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDMwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDM2MykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTUwOA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGdsb2JhbCA6IGJvb2xlYW4iDQotCQkJCQkiKyBmZWF0dXJlUmVmZXJlbmNlIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0NTgNCi0JCQkJbG9jYXRpb24gICAJKDIyNjIsIDU2OCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTQ1Nw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyMjYyLCA1NjgpDQotCQkJCSAgICAoMjI2MiwgNDc3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUAxMjU0DQotCQkJCXN1cHBsaWVyICAgCUAxNDU3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1OTUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzQ2LCA1NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0NTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzkiIEAxNDYwDQotCQkJCWxvY2F0aW9uICAgCSgxNTUzLCA0NTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjIwMUE0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGUiIEAxNDYxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjANCi0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMzMSwgNDk5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYyNjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBMEYzMDJFNSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDYwDQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1NTMsIDQ1MykNCi0JCQkJCSAgICAoMTIyMiwgNDUzKQ0KLQkJCQkJICAgICgxMjIyLCA1NjIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTUzLCA0NTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyMiwgNTYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTg1LCA0NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTIwMzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0MCIgQDE0NjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2MA0KLQkJCQkJbG9jYXRpb24gICAJKDgwMSwgMjkzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBMEYzMDJGMCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDYwDQotCQkJCQlzdXBwbGllciAgIAlAMTQ1Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTUzLCA0NTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MywgNDUzKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMxIiBAMTQ2NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwOCwgMzUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwMTA2MDJENyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEZlYXR1cmUiIEAxNDY2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjY4LCAtMTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzI5LCAzNTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRGZWF0dXJlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyOTQxMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjkwMTBCMDAwRSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDY1DQotCQkJCQlzdXBwbGllciAgIAlAMTQ1Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE5MDgsIDM1MykNCi0JCQkJCSAgICAoMTkwOCwgMzg3KQ0KLQkJCQkJICAgICgxOTkzLCAzODcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA4LCAzNTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MywgMzg3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTQ1LCAzNTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTY2MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMiIgQDE0NjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTkwOCwgMzUzKQ0KLQkJCQkJICAgICgxOTA4LCAzMTkpDQotCQkJCQkgICAgKDE5OTMsIDMxOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzMTkpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiDQotCQkJCWNsaWVudCAgICAgCUAxMjU4DQotCQkJCXN1cHBsaWVyICAgCUAxMjU3DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQ5NCwgMjg0KQ0KLQkJCQkgICAgKDQ5NCwgMjQ0KQ0KLQkJCQkgICAgKDk5NiwgMjQ0KSkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMjg0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTk2LCAyNDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIg0KLQkJCQljbGllbnQgICAgIAlAMTI0NQ0KLQkJCQlzdXBwbGllciAgIAlAMTQ1Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcxOCwgODEyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcxOCwgNTY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDU4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlAMTI4Mg0KLQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NSwgMTI5MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjUsIDEwNjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0MjkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCWNsaWVudCAgICAgCUAxNDU3DQotCQkJCXN1cHBsaWVyICAgCUAxMjU3DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIxNDcsIDI5MSkNCi0JCQkJICAgICgyMTQ3LCAyNDQpDQotCQkJCSAgICAoMTQ2OCwgMjQ0KSkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNDcsIDI5MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDI0NCkpKSkpKSkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNzYiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OndzZGwiIEAxNDc0DQotCQkJbG9jYXRpb24gICAJKDI3MiwgMjU2KQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4LCAxNzIpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJIndzZGwiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzQURGQjhFNTAyMUUiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OnhzZCIgQDE0NzUNCi0JCQlsb2NhdGlvbiAgIAkoMjcyLCA1NzYpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDQ5MikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkieHNkIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzlBQkRDNkYwMUFBIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpDQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciDQotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjUiDQotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNzciDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzDQotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjYiDQotCVByb2NzTkRldnMgCShsaXN0DQotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3Ig0KLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2OCINCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcw0KLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlIg0KLQkJCXZhbHVlICAgICAgCSgiRGF0YUJhc2VTZXQiIDgwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJBTlNJIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJPcmFjbGUiDQotCQkJCXZhbHVlICAgICAgCTgwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIlNRTFNlcnZlciINCi0JCQkJdmFsdWUgICAgICAJODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiU3liYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJXYXRjb20iDQotCQkJCXZhbHVlICAgICAgCTgwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIklkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWUiDQotCQkJdmFsdWUgICAgICAJIlZfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVF8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdFN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiX1YiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkJhc2VWaWV3cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIlZBUkNIQVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNPSyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMRWxlbWVudCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMU3BlY2lmaWNhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJJRExTcGVjU2V0IiAyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExTcGVjU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJUeXBlZGVmIg0KLQkJCQl2YWx1ZSAgICAgIAk1NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiRXhjZXB0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk2MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlN0cnVjdCINCi0JCQkJdmFsdWUgICAgICAJNTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJVbmlvbiINCi0JCQkJdmFsdWUgICAgICAJODEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuc2VydmljZXMvc3JjL3Jvc2Uvd3NkbE1kbC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJRExNb2R1bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLnNlcnZpY2VzL3NyYy9yb3NlL3dzZGxNZGwubWRsLCBjdGMsIGlibWN0YyIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkibV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJInNfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJInZvaWQiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSZXBvc2l0b3J5Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSINCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSINCi0JCQkJdmFsdWUgICAgICAJMjA2KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5zZXJ2aWNlcy9zcmMvcm9zZS93c2RsTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQotfC8vICRwYWNrYWdlDQotfCNpbmNsdWRlICIkZmlsZSINCi18DQotCQkJKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLnNlcnZpY2VzL3NyYy9yb3NlL3dzZGxNZGwubWRsLCBjdGMsIGlibWN0YyIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJhaXNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kZW50Ig0KLQkJCXZhbHVlICAgICAgCTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAk2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIg0KLQkJCQl2YWx1ZSAgICAgIAk3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlNDQyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlR5cGVMaWJJbXBvcnRlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0YWJsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiDQotCQkJCXZhbHVlICAgICAgCTIxMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiMCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGUiDQotCQkJdmFsdWUgICAgICAJKCJDcmVhdGFibGVTZXQiIDIyMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluaXRpYWxpemF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUZXJtaW5hdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25DbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiQ29sbGVjdGlvbiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiVGV4dCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRvcGVyYXRpb24iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY3IikpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy5XU0RMLmNhdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvY29tLmlibS5ldG9vbHMuV1NETC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZmI0NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy5XU0RMLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDY5OTcgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0Mg0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA0LjUuODA1NGEiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIHF1aWQgICAgICAgCSIzQURGQjhFNTAyMUUiDQotICAgIGRvY3VtZW50YXRpb24gCQ0KLXxUaGUgV1NETCBtb2RlbCBjb250YWlucyBjbGFzc2VzIGZvciB0aGUgV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIChXU0RMKS4NCi18DQotfFdTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4NCi18DQotfFdTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuDQotfA0KLXxUaGUgbW9kZWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkaWFncmFtcywgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcHRlcnMgaW4gdGhlIFdTREwgMS4xIHNwZWNpZmljYXRpb24gKGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvTk9URS13c2RsLTIwMDEwMzE1KQ0KLXwtIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZQ0KLXwtIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbQ0KLXwtIDIuMS4zIEV4dGVuc2liaWxpdHksIHNob3dzIHRoZSBXU0RMIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtDQotfC0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETA0KLXwtIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4NCi18DQotfFRoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLg0KLSAgICANCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiV1NETEVsZW1lbnQiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUM2QTMwMkREIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbGFuZ3VhZ2UgZWxlbWVudC4iDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0NEMTUyOTYwMEM4Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJEZWZpbml0aW9uIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0QxNTJCODAzNDciDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJkZWZpbml0aW9uIg0KLQkJCSAgICB0eXBlICAgICAgIAkiRGVmaW5pdGlvbiIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZG9jdW1lbnRhdGlvbkVsZW1lbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQ0U0NDM2MDJBMyINCi0JCSAgICB0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRjk3REJEMzAyMDciDQotCQkgICAgdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiUG9ydFR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydFR5cGUgZWxlbWVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4xIGFuZCBhbiBJbnRlcmZhY2UgY29tcG9uZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIuIEEgcG9ydCB0eXBlIG9yIEludGVyZmFjZSBpcyBhIG5hbWVkIHNldCBvZiBhYnN0cmFjdCBvcGVyYXRpb25zIGFuZCB0aGUgYWJzdHJhY3QgbWVzc2FnZXMgaW52b2x2ZWQuIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUM5QjcwMTUwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2RjFGRDgwMTlGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUI0ODhFMDAyMyINCi0JCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQkRERjFFMzAxRTUiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkgICAgcXVpZCAgICAgICAJIjNEMThDREVCMDMxNiINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOEQ0RkQwMUJBIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVDODBEMDNDRSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50LiBBIFdTREwgb3BlcmF0aW9uIGlzIGFuIGFic3RyYWN0IGRlc2NyaXB0aW9uIG9mIGFuIGFjdGlvbiBzdXBwb3J0ZWQgYnkgYSBzZXJ2aWNlLiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTlERTk4MDAzQyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNkYxRkUyMDE3MSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHlsZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQjQ3MjYwMUFDIg0KLQkJICAgIHR5cGUgICAgICAgCSJPcGVyYXRpb25UeXBlIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNCREQ5NjQzMDA0QyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCSAgICBxdWlkICAgICAgIAkiM0JEREYyMzUwMDNFIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRDE4Q0UyMjAxQUQiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNEMThENTIwMDExQiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIk1lc3NhZ2UiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbWVzc2FnZSBlbGVtZW50LiBBIFdTREwgbWVzc2FnZSBpcyBhbiBhYnN0cmFjdCwgdHlwZWQgZGVmaW5pdGlvbiBvZiB0aGUgZGF0YSBiZWluZyBjb21tdW5pY2F0ZWQuIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQwNTUwMUM0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE4RDEwMkJBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQjQ4N0MwMUZFIg0KLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCRERGMUQyMDIyNiINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOENFNEIwMkIwIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRDE4RDU0MjAwRjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJQYXJ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE5NkQwMkYxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTdFMjMwMjM3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQkNFNzBCNzAzQzgiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50TmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEIwODcwM0RCIg0KLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0JDRTcwQzMwM0M1Ig0KLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJCaW5kaW5nIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGJpbmRpbmcgZWxlbWVudC4gQSBiaW5kaW5nIGRlZmluZXMgbWVzc2FnZSBmb3JtYXQgYW5kIHByb3RvY29sIGRldGFpbHMgZm9yIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGRlZmluZWQgYnkgYSBwYXJ0aWN1bGFyIHBvcnRUeXBlLiBUaGVyZSBtYXkgYmUgYW55IG51bWJlciBvZiBiaW5kaW5ncyBmb3IgYSBnaXZlbiBwb3J0VHlwZS4iDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RkEwRjAyRjAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg1OTU0MTAxMjkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVCNDg5OTAxNEIiDQotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCSAgICBxdWlkICAgICAgIAkiM0JEREYxRjQwMUEzIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRDE4Q0U2RDAxNTEiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNEMThENERGMDM1QyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkJpbmRpbmdPcGVyYXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZy4gQW4gb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aGluIHRoZSBiaW5kaW5nJ3MgcG9ydFR5cGUuICINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYwMDkyMDJGNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBREU0MDFEQyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OUM0Q0IwMTk5Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU2VydmljZSINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBzZXJ2aWNlIGVsZW1lbnQuIEEgc2VydmljZSBncm91cHMgYSBzZXQgb2YgcmVsYXRlZCBwb3J0cyB0b2dldGhlci4iDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RkEyMDAyNUUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg1OTU0RTAxQjQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVCNDhBNDAxNTEiDQotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCSAgICBxdWlkICAgICAgIAkiM0JEREYyMEQwMjAzIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRDE4RDQ4MTAyMjAiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNEMThENEM1MDFFMiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlBvcnQiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydCBlbGVtZW50LiBBIHBvcnQgZGVmaW5lcyBhbiBpbmRpdmlkdWFsIGVuZHBvaW50IGJ5IHNwZWNpZnlpbmcgYSBzaW5nbGUgYWRkcmVzcyBmb3IgYSBiaW5kaW5nIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjAwQ0IwMEFBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NTk1NDUwMkM5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUI4MDAzMjYiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDlBMDAzOTEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuIFdTREwgYWxsb3dzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4iDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QjE0OTAzRDAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjEyNDAyQUIiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0JEREY1MzUwMkMzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FGOTU0M0MwMDczIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRUeXBlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjNCODVCMjFBMDI3MSINCi0JCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRGVmaW5pdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVGREI4MDNENCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRCMUY4MDM4MiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIikpDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDRDE0RkMyMDEyQiINCi0JCSAgICByZXN1bHQgICAgIAkiRE9NRG9jdW1lbnQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0QxNTBERTAxRTciDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudCINCi0JCQkgICAgdHlwZSAgICAgICAJIkRPTURvY3VtZW50IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNDc0MDA0RSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MDM1MkI3QzAzOTYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQjQ4NTcwMkY1Ig0KLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0NBREQwMEQwMDBEIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiSW1wb3J0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVFNEY5MDNERSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFRTU4MDM3QSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNkYyMDBEMDM0MCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiKSkNCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWEiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY3MkMxMDM3OSINCi0JCSAgICByZXN1bHQgICAgIAkiWFNEU2NoZW1hIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRTY2hlbWEiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY3MkMxMDM5NyINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInNjaGVtYSINCi0JCQkgICAgdHlwZSAgICAgICAJIlhTRFNjaGVtYSIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTUwQTAwMzYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU1MTQwMjExIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJsZUVsZW1lbnQiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUZFM0MwM0Q0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODVDMTJDMDNDRCINCi0JCSAgICByZXN1bHQgICAgIAkiSUxpc3QiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QzE0NzAyOTUiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJleHRFbGVtZW50Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiSW5wdXQiDQotCSAgICBxdWlkICAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudC4gQW4gaW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4iDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QzUwNDAyNUYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjY3NzIyODAyRTciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNkYxRkVFMDMxRCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJPdXRwdXQiDQotCSAgICBxdWlkICAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4iDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QzUwQzAzNUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjY3NzIzNTAwREQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNkYxRkY4MDFDRCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiRmF1bHQiDQotCSAgICBxdWlkICAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudC4gRmF1bHQgZWxlbWVudHMgc3BlY2lmeSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIGFueSBlcnJvciBtZXNzYWdlcyB0aGF0IG1heSBiZSBvdXRwdXQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTFDODIwMDJGMiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNjc3MjNEMDMxOSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2RjIwMDIwMDJEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkJpbmRpbmdJbnB1dCINCi0JICAgIHF1aWQgICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uICINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRTFCMDExMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUI1OUIwMDcyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkNCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUzQTQwMjAzIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJSW5wdXQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTNCNTAzQTIiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbnB1dCINCi0JCQkgICAgdHlwZSAgICAgICAJIklJbnB1dCIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUMxRUEwMjBFIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiQmluZGluZ091dHB1dCINCi0JICAgIHF1aWQgICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRTQzMDJBQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODVCNUE0MDI3RSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTNEOTAwRjEiDQotCQkgICAgcmVzdWx0ICAgICAJIklPdXRwdXQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldE91dHB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUzRjEwMzI2Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiSU91dHB1dCIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUMyMDIwMEJFIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiQmluZGluZ0ZhdWx0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEEgZmF1bHQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBmYXVsdCB3aXRoIHRoZSBzYW1lIG5hbWUuICINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5Mzg2MDJDOSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRTcxMDMzMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiKSkNCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjU0MTMwMzdGIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJRmF1bHQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEZhdWx0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTQyMTAxMDkiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJmYXVsdCINCi0JCQkgICAgdHlwZSAgICAgICAJIklGYXVsdCIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUJGOUUwMTRBIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiUU5hbWUiDQotCSAgICBxdWlkICAgICAgIAkiM0FFOEVEMjIwMTQwIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5RTmFtZSBjbGFzcy4gQSBRTmFtZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0OURBOTAwM0QiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJOYW1lc3BhY2UiDQotCSAgICBxdWlkICAgICAgIAkiM0FFQTNDRDMwMDMwIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5hbWVzcGFjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGluIGEgV1NETCBkb2N1bWVudC4iDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVBM0QyOTAxQjEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmaXgiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRDMyMDIzNiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIk9wZXJhdGlvblR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiM0FFQjQ3ODIwMjRGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfE9ORV9XQVk9MQ0KLXxSRVFVRVNUX1JFU1BPTlNFPTINCi18U09MSUNJVF9SRVNQT05TRT0zDQotfE5PVElGSUNBVElPTj00DQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk9wZXJhdGlvblR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODVDMzUzMDNFMyINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIklQb3J0VHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QTVCRTAzMzEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnRUeXBlIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkT3BlcmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkFDMTAxQ0EiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iDQotCQkJICAgIHR5cGUgICAgICAgCSJJT3BlcmF0aW9uIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTZCQUYwMUE0Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0TmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dE5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCSAgICByZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTZCRjcwMzFBIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydFR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBNjMyMDAwRCINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJT3BlcmF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBNzc2MDBEMSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkRmF1bHQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QzQyMDA2NSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiSUZhdWx0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkM1OTAyOEYiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklGYXVsdCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkM3MTAyQjEiDQotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBhcmFtZXRlck9yZGVyaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkM4MTAxQjAiDQotCQkgICAgcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRQYXJhbWV0ZXJPcmRlcmluZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTZDOTkwMzFEIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyT3JkZXIiDQotCQkJICAgIHR5cGUgICAgICAgCSJJTGlzdCIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjU0RTUwMThEIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJSW5wdXQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjJDNDAxMDciDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbnB1dCINCi0JCQkgICAgdHlwZSAgICAgICAJIklJbnB1dCIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY2MkU0MDA5NCINCi0JCSAgICByZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjJGMDAxRDIiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiDQotCQkJICAgIHR5cGUgICAgICAgCSJJT3V0cHV0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk9wZXJhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE3OTkwMTJCIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklJbnB1dCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QTdFRTAwMTUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLklucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjYzMzEwMEVGIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjYzNDcwMjc3Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkgICAgdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLklucHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QTgwMDAwMzkiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSU91dHB1dCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QTgyOTAyN0QiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY2NDNBMDM1RCINCi0JCSAgICByZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY2NDQ1MDFDOCINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJICAgIHR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PdXRwdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBODM5MDFENSINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJRmF1bHQiDQotCSAgICBxdWlkICAgICAgIAkiM0I4NEE4NjEwMzFEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5GYXVsdCBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY2NDZBMDBCRCINCi0JCSAgICByZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY2NDc1MDEzMSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJICAgIHR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5GYXVsdCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE4NzEwMjA4Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklNZXNzYWdlIg0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBOEFGMDA0RiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuTWVzc2FnZSBub24tTU9GIGludGVyZmFjZSINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkUGFydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTcyMjQwMjczIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFydCINCi0JCQkgICAgdHlwZSAgICAgICAJIklQYXJ0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk3MjNEMDIzMyINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCSAgICByZXN1bHQgICAgIAkiSVBhcnQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NzI1NDAyNUUiDQotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE9yZGVyZWRQYXJ0cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTcyNjEwMjBEIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFydE9yZGVyIg0KLQkJCSAgICB0eXBlICAgICAgIAkiSUxpc3QiKSkNCi0JCSAgICByZXN1bHQgICAgIAkiSUxpc3QiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk1lc3NhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBOEJDMDI2MCINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJUGFydCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QTkzRjAxQkUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBhcnQgbm9uLU1PRiBpbnRlcmZhY2UiDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvbkF0dHJpYnV0ZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M0Njg4NDUwMDUyIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAidmFsdWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJICAgIGV4Y2VwdGlvbnMgCSJXU0RMRXhjZXB0aW9uIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M0NjhBMDEwMUMzIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJSXRlcmF0b3IiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M0NjhBMkQwMkQ1Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkgICAgcmVzdWx0ICAgICAJIlFOYW1lIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5QYXJ0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QTk1MDAyMzEiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSVNlcnZpY2UiDQotCSAgICBxdWlkICAgICAgIAkiM0I4NEFCNDkwMjg3Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5TZXJ2aWNlIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTVENTYwMUQxIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicG9ydCINCi0JCQkgICAgdHlwZSAgICAgICAJIklQb3J0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NURBMjAwMzYiDQotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk1REIwMDFCQyINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCSAgICByZXN1bHQgICAgIAkiSVBvcnQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlNlcnZpY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBQjVCMDAzRSINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJUG9ydCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUI4MDAzMjYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTFGMzAyQjUiDQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTI2MzAyRjIiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIg0KLQkJCSAgICB0eXBlICAgICAgIAkiSUJpbmRpbmciKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFCOEMwMDE2Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklCaW5kaW5nIg0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBQkM2MDIxOSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdPcGVyYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk1RjE2MDE1MyINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdPcGVyYXRpb24iDQotCQkJICAgIHR5cGUgICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3BlcmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NUY1MDAwNjYiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk1RkE0MDFDNSINCi0JCSAgICByZXN1bHQgICAgIAkiSUxpc3QiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTJBOTAyODQiDQotCQkgICAgcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0UG9ydFR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MkJFMDFBOCINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIg0KLQkJCSAgICB0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBQkNGMDMwMiINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJQmluZGluZ09wZXJhdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QURDMDAwNzIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nRmF1bHQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk2MEJDMDA0MSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdGYXVsdCINCi0JCQkgICAgdHlwZSAgICAgICAJIklCaW5kaW5nRmF1bHQiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NjBEOTAwOUQiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk2MEZDMDA2MSINCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTMyRDAwMTciDQotCQkgICAgcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldE9wZXJhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUzM0YwMzdCIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIg0KLQkJCSAgICB0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nSW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NTA5MDBEQSINCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmdJbnB1dCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ0lucHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTUxRDAwN0YiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nSW5wdXQiDQotCQkJICAgIHR5cGUgICAgICAgCSJJQmluZGluZ0lucHV0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPdXRwdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NTM0MDM0OSINCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdPdXRwdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NTQ3MDJBNiINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdPdXRwdXQiDQotCQkJICAgIHR5cGUgICAgICAgCSJJQmluZGluZ091dHB1dCIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QURDQjAyMUMiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdJbnB1dCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QURFQjAxMDAiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0lucHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QURGRTAwMEQiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPdXRwdXQiDQotCSAgICBxdWlkICAgICAgIAkiM0I4NEFFMjEwMTExIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUUyRDAwNTAiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdGYXVsdCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUU0RjAwQkQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0ZhdWx0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUU1RjAwMkEiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUYzMjAzREIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5FbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUY1NjAyOTIiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkgICAgcXVpZCAgICAgICAJIjNCODRCMTI0MDJBQiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRCMTM1MDNEMSINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJRGVmaW5pdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QjFEOTAxNDIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkRlZmluaXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5ODhGMTAzOUQiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIg0KLQkJCSAgICB0eXBlICAgICAgIAkiSUJpbmRpbmciKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkSW1wb3J0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5ODk0OTAyNTkiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbXBvcnREZWYiDQotCQkJICAgIHR5cGUgICAgICAgCSJJSW1wb3J0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZE1lc3NhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4OTZFMDA1RSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJICAgIHR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGROYW1lc3BhY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4OTg0MDA0QiINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0VHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTg5QzUwMDQ1Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiDQotCQkJICAgIHR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkU2VydmljZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTg5RTQwMUVFIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAic2VydmljZSINCi0JCQkgICAgdHlwZSAgICAgICAJIklTZXJ2aWNlIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdGYXVsdCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBMTcwMzhDIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nSW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QTMyMDI4NiINCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmdJbnB1dCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ091dHB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBNDYwMTNCIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ09wZXJhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBNUMwMEIwIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTg5RkUwMzdDIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZyINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlRmF1bHQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QTc1MDJFNyINCi0JCSAgICByZXN1bHQgICAgIAkiSUZhdWx0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbXBvcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QTgzMDE0QyINCi0JCSAgICByZXN1bHQgICAgIAkiSUltcG9ydCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QTlEMDMzRSINCi0JCSAgICByZXN1bHQgICAgIAkiSUlucHV0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVNZXNzYWdlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEFBRjAyNTQiDQotCQkgICAgcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPcGVyYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QUMyMDNDNCINCi0JCSAgICByZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3V0cHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEFFODAwRUQiDQotCQkgICAgcmVzdWx0ICAgICAJIklPdXRwdXQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBhcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QUY4MDI2RCINCi0JCSAgICByZXN1bHQgICAgIAkiSVBhcnQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QjA4MDFEQSINCi0JCSAgICByZXN1bHQgICAgIAkiSVBvcnQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnRUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEIxNTAzOUIiDQotCQkgICAgcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlU2VydmljZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThCMzIwMTNBIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThCNDIwMDc1Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5ncyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThCOTIwMzQxIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEJDRDAwNjAiDQotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QkU3MDE0NCINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDMTcwMTA3Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDM0UwMDFEIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QzYyMDE0QiINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4Qzc0MDExNSINCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4Q0JFMDA3MSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDREEwMUM2Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQcmVmaXgiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4Q0ZEMDAxNyINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4RDIzMDBBOCINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4RDNCMDNDRSINCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODlENUI4MDEyQiINCi0JCSAgICByZXN1bHQgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25SZWdpc3RyeSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OUQ1RDcwM0JCIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJICAgIHR5cGUgICAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnRCYXNlVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5RDVGRTAyMDgiDQotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnRCYXNlVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5RDYxODAzMjgiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudEJhc2UiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlVHlwZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQUREMDU2MDA4MCINCi0JCSAgICByZXN1bHQgICAgIAkiSVR5cGVzIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVTZXJ2aWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0FERDA3RTAwNEMiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCSAgICByZXN1bHQgICAgIAkiSVNlcnZpY2UiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZUJpbmRpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNDQUREMEJBMDM1NSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZyINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlUG9ydFR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQUREMEQ4MDI5QSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZU1lc3NhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQUREMEZBMDMwNyINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0VHlwZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY3MDZGMDMxQiINCi0JCSAgICByZXN1bHQgICAgIAkiSVR5cGVzIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRUeXBlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjcwOTUwMEVFIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAidHlwZXMiDQotCQkJICAgIHR5cGUgICAgICAgCSJJVHlwZXMiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuRGVmaW5pdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEIxRTcwMkExIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklJbXBvcnQiDQotCSAgICBxdWlkICAgICAgIAkiM0I4NEIyMDIwMTE5Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbXBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkltcG9ydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEIyMEMwMkVBIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklMaXN0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNCODVDMEEyMDNDNSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODVDMEFGMDI5NyINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJTWFwIg0KLQkgICAgcXVpZCAgICAgICAJIjNCODk2QjAzMDBENCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLk1hcCBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTWFwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkIxMTAyQjUiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSVVSTCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg5RDU2MzAyNzQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEubmV0LlVSTCBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLm5ldC5VUkwiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODlENTZFMDNFMiINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJRXh0ZW5zaW9uUmVnaXN0cnkiDQotCSAgICBxdWlkICAgICAgIAkiM0I4OUQ1OTMwMkE1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5RDU5RjAyRTgiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiVHlwZXMiDQotCSAgICBxdWlkICAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgdHlwZXMgZWxlbWVudC4gVGhlIHR5cGVzIGVsZW1lbnQgZW5jbG9zZXMgZGF0YSB0eXBlIGRlZmluaXRpb25zIHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUgZXhjaGFuZ2VkIG1lc3NhZ2VzLiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCOEJFQjAxMDMxMSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNDQURDRDNCMDM4MCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiDQotCQkgICAgcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIpKQ0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQURDRjM4MDNFNiINCi0JCSAgICByZXN1bHQgICAgIAkiSUxpc3QiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQURDRjdFMDMwMSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKSkNCi0JKG9iamVjdCBDbGFzcyAiSUl0ZXJhdG9yIg0KLQkgICAgcXVpZCAgICAgICAJIjNDNDY4N0RBMDE2NyINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5JdGVyYXRvciINCi0JCSAgICBxdWlkICAgICAgIAkiM0M0Njg4MDgwMEI5Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIldTRExFeGNlcHRpb24iDQotCSAgICBxdWlkICAgICAgIAkiM0M0Njg5NjUwMzEzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeGNlcHRpb24gY2xhc3MuIg0KLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M0Njg5NzQwMzE1Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklUeXBlcyINCi0JICAgIHF1aWQgICAgICAgCSIzQ0FEQ0JCMjAwNTAiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlR5cGVzIG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlR5cGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0FEQ0JGMTAxNzMiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkgICAgcXVpZCAgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNDQjI0QUVDMDFDQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQ0KLQkob2JqZWN0IENsYXNzICJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JICAgIHF1aWQgICAgICAgCSIzQ0MzNjBENzAzOUMiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0MzNjI3RjAwQjciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiDQotCSAgICBxdWlkICAgICAgIAkiM0NEMTUwMkMwMjNCIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRG9jdW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0QxNTA2MDAxODIiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTWVzc2FnZVJlZmVyZW5jZSINCi0JICAgIHF1aWQgICAgICAgCSIzRjY3NzFEQjAyREMiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjc2MkE2QTAzMDgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNjc4MEEwMDFBQiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQcm90ZWN0ZWQiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1QzgyNDAxOEMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicG9ydFR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVDODI3MDFDMyINCi0JCSAgICBsYWJlbCAgICAgIAkicG9ydFR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVPcGVyYXRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQ0QiDQotCQkgICAgbGFiZWwgICAgICAJImVPcGVyYXRpb25zIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1Q0VCRTAwRTIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMiINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUNFQkYwMDU3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlUGFydHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVDRUJGMDA2MSINCi0JCSAgICBsYWJlbCAgICAgIAkiZVBhcnRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUQzNTIwMTBGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVQb3J0VHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQzNTQwMTc2Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlUG9ydFR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDM1NDAxODAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVEM0UxMDE3OSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMjUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVCaW5kaW5nT3BlcmF0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQzRTIwMjM5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlQmluZGluZ09wZXJhdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNyINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDQyNTAzOEEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZU9wZXJhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQ0MjYwMkY1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlT3BlcmF0aW9uIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVENDI2MDJGRiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUQ5NDAwMzkzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVQb3J0cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQ5NDEwMzFDIg0KLQkJICAgIGxhYmVsICAgICAgCSJlUG9ydHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUQ5QjgwMTFGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVCaW5kaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDlCOTAyNEQiDQotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5nIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMiINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQ5QjkwMjYxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUU2MDMwMUUyIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQjciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVNZXNzYWdlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU2MDQwMEMxIg0KLQkJICAgIGxhYmVsICAgICAgCSJlTWVzc2FnZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUU2NzEwMTA0Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNEEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVQb3J0VHlwZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNjcyMDM1NCINCi0JCSAgICBsYWJlbCAgICAgIAkiZVBvcnRUeXBlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTciDQotCSAgICBxdWlkICAgICAgIAkiM0FENUU2NzcwMDk1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3ODAzNzEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVCaW5kaW5ncyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU2NzgwMzdCIg0KLQkJICAgIGxhYmVsICAgICAgCSJlQmluZGluZ3MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUU2N0IwMzExIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3RDAwN0YiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVTZXJ2aWNlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU2N0QwMDg5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlU2VydmljZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCSAgICBsYWJlbCAgICAgIAkiZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzIg0KLQkgICAgcXVpZCAgICAgICAJIjNBREYyRTY0MDFGNSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlQmluZGluZ0lucHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkU2NTAyNTEiDQotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5nSW5wdXQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJFNjUwMjUyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBREYyRUIzMDE2MyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlQmluZGluZ091dHB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJFQjQwMTNDIg0KLQkJICAgIGxhYmVsICAgICAgCSJlQmluZGluZ091dHB1dCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNiINCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJFQjQwMTNEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBREYyRjk0MDI0RCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlSW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNBREYyRjk1MDE5MCINCi0JCSAgICBsYWJlbCAgICAgIAkiZUlucHV0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJGOTUwMTlBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkiDQotCSAgICBxdWlkICAgICAgIAkiM0FERjJGQjgwMkY5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVPdXRwdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQSINCi0JCSAgICBsYWJlbCAgICAgIAkiZU91dHB1dCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkZCOTAyMEIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMSINCi0JICAgIHF1aWQgICAgICAgCSIzQURGMzMxNjAxQTQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZUZhdWx0cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjMzMTgwMzg3Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlRmF1bHRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzIiDQotCQkgICAgcXVpZCAgICAgICAJIjNBREYzMzE4MDM4OCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMzIg0KLQkgICAgcXVpZCAgICAgICAJIjNBREYzNDAwMDNFNSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlQmluZGluZ0ZhdWx0cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjM0MDEwM0FBIg0KLQkJICAgIGxhYmVsICAgICAgCSJlQmluZGluZ0ZhdWx0cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjM0MDEwM0FCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM1Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRTA5MUY0MDJGMyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlRmF1bHQiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRSINCi0JCSAgICBsYWJlbCAgICAgIAkiZUZhdWx0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzYiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzciDQotCSAgICBxdWlkICAgICAgIAkiM0FFQTNENTUwMDJEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMjgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVOYW1lc3BhY2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMzIiDQotCQkgICAgbGFiZWwgICAgICAJImVOYW1lc3BhY2VzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzkiDQotCSAgICBxdWlkICAgICAgIAkiM0FFQTNFM0EwMDJEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVEZWZpbml0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVBM0UzQzAxRTgiDQotCQkgICAgbGFiZWwgICAgICAJImVEZWZpbml0aW9uIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQTNFM0MwMUYyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MSINCi0JICAgIHF1aWQgICAgICAgCSIzQUVBNDEyRjAwMzUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVBNDEzMTAyNTUiDQotCQkgICAgbGFiZWwgICAgICAJImVQYXJhbWV0ZXJPcmRlcmluZyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVBNDEzMTAyNUYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQzIg0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBRDI0MDBCRCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlSW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRDI1MDA4MyINCi0JCSAgICBsYWJlbCAgICAgIAkiZUlucHV0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRDI1MDA4NCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDUiDQotCSAgICBxdWlkICAgICAgIAkiM0I4NEFENzkwMEYyIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVPdXRwdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RCINCi0JCSAgICBsYWJlbCAgICAgIAkiZU91dHB1dCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NiINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFEN0EwMTRFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDciDQotCSAgICBxdWlkICAgICAgIAkiM0I4QjFCRTkwMEM0Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjhCMUJFOTAzMjciDQotCQkgICAgbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0OCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QjFCRTkwMzMxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDkiDQotCSAgICBxdWlkICAgICAgIAkiM0I4QjFDMTIwM0IyIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QjFDMTQwMDFDIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QjFDMTQwMDI2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTEiDQotCSAgICBxdWlkICAgICAgIAkiM0I4QjFEQ0MwMkU1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVTY2hlbWEiDQotCQkgICAgcXVpZCAgICAgICAJIjNCOEIxRENFMDI3MCINCi0JCSAgICBsYWJlbCAgICAgIAkiZVNjaGVtYSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjhCMURDRTAyN0EiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUzIg0KLQkgICAgcXVpZCAgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QkVBMjkwMzU2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlVHlwZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCSAgICBsYWJlbCAgICAgIAkiZVR5cGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU1Ig0KLQkgICAgcXVpZCAgICAgICAJIjNDNDY4MjkzMDNFNSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlTWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M0NjgyOTYwMTBFIg0KLQkJICAgIGxhYmVsICAgICAgCSJlTWVzc2FnZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTYiDQotCQkgICAgcXVpZCAgICAgICAJIjNDNDY4Mjk2MDExOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU3Ig0KLQkgICAgcXVpZCAgICAgICAJIjNDODY0REZGMDJFQyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlSW1wb3J0cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJICAgIGxhYmVsICAgICAgCSJlSW1wb3J0cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1OCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjRERkYwMkVFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU5Ig0KLQkgICAgcXVpZCAgICAgICAJIjNDQzM2MTQ1MDBGMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MCINCi0JCSAgICBxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAic2NoZW1hIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0UiDQotCQkgICAgbGFiZWwgICAgICAJInNjaGVtYSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MSINCi0JICAgIHF1aWQgICAgICAgCSIzRjc0RTc4NDAxQjEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZU1lc3NhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNzRFNzg2MDAwRiINCi0JCSAgICBsYWJlbCAgICAgIAkiZU1lc3NhZ2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjc0RTc4NjAwMjMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MyINCi0JICAgIHF1aWQgICAgICAgCSIzRjc4OTZBMjAyNkUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicGFyZW50Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkIiDQotCQkgICAgbGFiZWwgICAgICAJInBhcmVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJjaGlsZHJlbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJDIg0KLQkJICAgIGxhYmVsICAgICAgCSJjaGlsZHJlbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNyBTZXJ2aWNlcyINCi0JICAgIHF1aWQgICAgICAgCSIzOUFEM0VGNjAxMjciDQotCSAgICB0aXRsZSAgICAgIAkiMi43IFNlcnZpY2VzIg0KLQkgICAgem9vbSAgICAgICAJOTANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgODAwKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDExNzMsIDY2MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSgxMTczLCA2MTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiDQotCQkgICAgd2lkdGggICAgICAJNTIwDQotCQkgICAgaGVpZ2h0ICAgICAJNDA0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0IiBAMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDgxNiwgNTI4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDY4NiwgNDgxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSVBvcnQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDY4NiwgNDMxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2Ig0KLQkJICAgIHdpZHRoICAgICAgCTI3OA0KLQkJICAgIGhlaWdodCAgICAgCTIxOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJU2VydmljZSIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCAxNjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoMTI2LCA5MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklTZXJ2aWNlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgxMjYsIDQwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFCNDkwMjg3Ig0KLQkJICAgIHdpZHRoICAgICAgCTI0Ng0KLQkJICAgIGhlaWdodCAgICAgCTI2NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBANA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCA1MjgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoNDQsIDM4OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzOTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZpY2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkgICAgd2lkdGggICAgICAJNDEwDQotCQkgICAgaGVpZ2h0ICAgICAJMzAyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NTk1NEUwMUI0Ig0KLQkJICAgIGNsaWVudCAgICAgCUA0DQotCQkgICAgc3VwcGxpZXIgICAJQDMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDAsIDM3NykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQwLCAyOTIpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTI2NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANg0KLQkJCWxvY2F0aW9uICAgCSgxMjQ0LCAxMTI1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCSAgICB3aWR0aCAgICAgIAk0MTANCi0JCSAgICBoZWlnaHQgICAgIAkzMDINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiDQotCQkgICAgY2xpZW50ICAgICAJQDYNCi0JCSAgICBzdXBwbGllciAgIAlAMQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MzAsIDExMTMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzAsIDEwMDIpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODE2LCA5MTIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDgNCi0JCQlsb2NhdGlvbiAgIAkoNjc1LCA4NDApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjgyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQb3J0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJICAgIHdpZHRoICAgICAgCTMwMA0KLQkJICAgIGhlaWdodCAgICAgCTE2OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODU5NTQ1MDJDOSINCi0JCSAgICBjbGllbnQgICAgIAlAOA0KLQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODA5LCA4MjgpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgwOSwgNjM3KSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBAMTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMzQzLCA5MTYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5NDAwMzkzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVQb3J0cyIgQDExDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTANCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMjEsIDY0NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDEzLCA5NDUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZVBvcnRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjIxODk3OA0KLQkJCQloZWlnaHQgICAgIAkyOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMA0KLQkJCSAgICBzdXBwbGllciAgIAlAOA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDkxNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTM5LCA4ODApDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYwODAwMA0KLQkJCQloZWlnaHQgICAgIAkzNw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA5OTApDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuMzI4NDY3DQotCQkJCWhlaWdodCAgICAgCTc0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMCIgQDE1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTANCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMjEsIDY0NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE2LCA3NDQpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUQiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMA0KLQkJCSAgICBzdXBwbGllciAgIAlANA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM0MywgOTE2KQ0KLQkJCQkoMjU3LCA5MTYpDQotCQkJCSgyNTcsIDY3OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI1NywgNjc5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNw0KLQkJCQlQYXJlbnRfVmlldyAJQDE1DQotCQkJCWxvY2F0aW9uICAgCSgzMDEsIDc5NikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42MzcwOTcNCi0JCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEAxOA0KLQkJICAgIGxvY2F0aW9uICAgCSg4ODYsIDEyNzApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5QjgwMTFGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nIiBAMTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDQyMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjANCi0JCQkJUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTExMiwgMTIzNSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTgwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlQmluZGluZyINCi0JCQkJcGN0RGlzdCAgICAJMC42NDg1NzENCi0JCQkJaGVpZ2h0ICAgICAJMzYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjREIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzUsIDEyNzApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxDQotCQkJCVBhcmVudF9WaWV3IAlAMTkNCi0JCQkJbG9jYXRpb24gICAJKDExNzAsIDEzMTMpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODE0Mjg2DQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMiIgQDIyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDM4LCA0MjIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzDQotCQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQkJbG9jYXRpb24gICAJKDg1MiwgMTEwNikNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY4Nzk0Mw0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDlCOTAyNjEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOA0KLQkJCSAgICBzdXBwbGllciAgIAlAOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDg4NiwgMTI3MCkNCi0JCQkJKDgxMiwgMTI3MCkNCi0JCQkJKDgxMiwgOTk2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxMiwgOTk2KSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICIyLjUgQmluZGluZ3MiDQotCSAgICBxdWlkICAgICAgIAkiMzlBRDUxMjcwMjUyIg0KLQkgICAgdGl0bGUgICAgICAJIjIuNSBCaW5kaW5ncyINCi0JICAgIHpvb20gICAgICAgCTg1DQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIiBAMjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA0LCAyNDApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI0DQotCQkJbG9jYXRpb24gICAJKDczLCAxMTQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJQmluZGluZyIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI0DQotCQkJbG9jYXRpb24gICAJKDczLCA2NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSINCi0JCSAgICB3aWR0aCAgICAgIAk0ODANCi0JCSAgICBoZWlnaHQgICAgIAkzNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPcGVyYXRpb24iIEAyNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5NzYsIDM1MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjUNCi0JCQlsb2NhdGlvbiAgIAkoNzgwLCAxMzApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzkyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI1DQotCQkJbG9jYXRpb24gICAJKDc4MCwgODApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzOTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiDQotCQkgICAgd2lkdGggICAgICAJNDEwDQotCQkgICAgaGVpZ2h0ICAgICAJNTY4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nSW5wdXQiIEAyNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MiwgMTM2MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjYNCi0JCQlsb2NhdGlvbiAgIAkoNjIsIDEzMzQpDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJQmluZGluZ0lucHV0IikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjYNCi0JCQlsb2NhdGlvbiAgIAkoNjIsIDEyODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiDQotCQkgICAgd2lkdGggICAgICAJMjc4DQotCQkgICAgaGVpZ2h0ICAgICAJMTc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IiBAMjcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDgsIDE2NjQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJbG9jYXRpb24gICAJKDYxLCAxNjM4KQ0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNw0KLQkJCWxvY2F0aW9uICAgCSg2MSwgMTU4OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSINCi0JCSAgICB3aWR0aCAgICAgIAkzMTINCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIgQDI4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIwOCwgMTk4NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjgNCi0JCQlsb2NhdGlvbiAgIAkoNzIsIDE5NTgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJQmluZGluZ0ZhdWx0IikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjgNCi0JCQlsb2NhdGlvbiAgIAkoNzIsIDE5MDgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiDQotCQkgICAgd2lkdGggICAgICAJMjkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMjkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDYyNCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjkNCi0JCQlsb2NhdGlvbiAgIAkoMTU2OCwgNDg2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY3Mw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkgICAgd2lkdGggICAgICAJNjkxDQotCQkgICAgaGVpZ2h0ICAgICAJMzAxDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBAMzANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDEzNjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMwDQotCQkJbG9jYXRpb24gICAJKDE3NTYsIDEyODMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJbnB1dCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCSAgICB3aWR0aCAgICAgIAkzMTQNCi0JCSAgICBoZWlnaHQgICAgIAkxNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMzENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDE2NjQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxDQotCQkJbG9jYXRpb24gICAJKDE3NTYsIDE1ODcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJPdXRwdXQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkgICAgd2lkdGggICAgICAJMzE0DQotCQkgICAgaGVpZ2h0ICAgICAJMTc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAzMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA0LCA2ODgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMyDQotCQkJbG9jYXRpb24gICAJKDk3LCA1MzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDE0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJICAgIHdpZHRoICAgICAgCTQzMg0KLQkJICAgIGhlaWdodCAgICAgCTMyMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiDQotCQkgICAgY2xpZW50ICAgICAJQDMyDQotCQkgICAgc3VwcGxpZXIgICAJQDI0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjc5LCA1MjcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3OSwgNDI4KSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAMzQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAzOSwgNzQyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMzUyMDEwRiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGUiIEAzNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM0DQotCQkJICAgIGxvY2F0aW9uICAgCSg1NzUsIDU5OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0OSwgNzgxKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VQb3J0VHlwZSINCi0JCQkJcGN0RGlzdCAgICAJMC43ODkyOTINCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQzNTQwMTc2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU5LCA3NDIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3DQotCQkJCVBhcmVudF9WaWV3IAlAMzUNCi0JCQkJbG9jYXRpb24gICAJKDE0OTIsIDcxNikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44NzIxOTMNCi0JCQkJaGVpZ2h0ICAgICAJMjcNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQiIEAzOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM0DQotCQkJICAgIGxvY2F0aW9uICAgCSg1NzUsIDU5OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzkNCi0JCQkJUGFyZW50X1ZpZXcgCUAzOA0KLQkJCQlsb2NhdGlvbiAgIAkoNzc2LCA2OTcpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTA4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC41MDk0NDkNCi0JCQkJaGVpZ2h0ICAgICAJNDYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQzNTQwMTgwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MjAsIDc0MikpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBANDANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4ODgsIDEwMjQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQwDQotCQkJbG9jYXRpb24gICAJKDE2NzIsIDg1MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCSAgICB3aWR0aCAgICAgIAk0NTANCi0JCSAgICBoZWlnaHQgICAgIAkzNzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBANDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDYyNCwgMTQwOCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDENCi0JCQlsb2NhdGlvbiAgIAkoNDc2LCAxMjgzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI5Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJICAgIHdpZHRoICAgICAgCTMxNA0KLQkJICAgIGhlaWdodCAgICAgCTI3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQzIiBANDINCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgMTM1OSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUQyNDAwQkQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBANDMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTYsIDI4NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzNywgMTMxNikNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTMyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlSW5wdXQiDQotCQkJCXBjdERpc3QgICAgCTAuNzc1MTQ4DQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCODRBRDI1MDA4MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDQyDQotCQkJICAgIHN1cHBsaWVyICAgCUAzMA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI2NCwgMTM1OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDcsIDEzNTkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1DQotCQkJCVBhcmVudF9WaWV3IAlANDMNCi0JCQkJbG9jYXRpb24gICAJKDE2OTQsIDEzOTgpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODg5NTQ2DQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NCIgQDQ2DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDINCi0JCQkgICAgbG9jYXRpb24gICAJKDk2LCAyODcpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDg0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANDINCi0JCQkgICAgc3VwcGxpZXIgICAJQDQxDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzgxLCAxMzU5KSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBANDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk2MCwgMTY2NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDcNCi0JCQlsb2NhdGlvbiAgIAkoODEyLCAxNTM5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI5Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCSAgICB3aWR0aCAgICAgIAkzMTQNCi0JCSAgICBoZWlnaHQgICAgIAkyNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NSIgQDQ4DQotCQkgICAgbG9jYXRpb24gICAJKDE0MzIsIDE2NTQpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFENzkwMEYyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEA0OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTIwLCAzNzQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwDQotCQkJCVBhcmVudF9WaWV3IAlANDkNCi0JCQkJbG9jYXRpb24gICAJKDE2NDUsIDE2MTIpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZU91dHB1dCINCi0JCQkJcGN0RGlzdCAgICAJMC42NzQ3NzINCi0JCQkJaGVpZ2h0ICAgICAJNDMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTREIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTY1NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTENCi0JCQkJUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY4MSwgMTY5NykNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43OTAyNzQNCi0JCQkJaGVpZ2h0ICAgICAJNDMNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ2IiBANTINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ4DQotCQkJICAgIHN1cHBsaWVyICAgCUA0Nw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDE2NTQpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iIEA1Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTkyLCAxMDA4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCWxvY2F0aW9uICAgCSg4MTksIDkzMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkgICAgd2lkdGggICAgICAJMzY0DQotCQkgICAgaGVpZ2h0ICAgICAJMTc4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBREU0MDFEQyINCi0JCSAgICBjbGllbnQgICAgIAlANTMNCi0JCSAgICBzdXBwbGllciAgIAlAMjUNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjYsIDkxOSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTY2LCA2MzYpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEA1NQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0NTcsIDEwMjIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzRTEwMTc5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYiIEA1Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU1DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDU2DQotCQkJCWxvY2F0aW9uICAgCSgyMzUsIDkyMCkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0UyMDIyNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDU1DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDQ1NywgMTAyMikNCi0JCQkJKDI3NiwgMTAyMikNCi0JCQkJKDI3NiwgODQ5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3NiwgODQ5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OA0KLQkJCQlQYXJlbnRfVmlldyAJQDU2DQotCQkJCWxvY2F0aW9uICAgCSgzMzAsIDg4NCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3BlcmF0aW9ucyIgQDU5DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTUNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMzE5LCA0OTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwDQotCQkJCVBhcmVudF9WaWV3IAlANTkNCi0JCQkJbG9jYXRpb24gICAJKDUzMSwgOTc3KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzODQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJcGN0RGlzdCAgICAJMC4yMTE2OTkNCi0JCQkJaGVpZ2h0ICAgICAJNDYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQzRTIwMjM5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDUzDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTAsIDEwMjIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxDQotCQkJCVBhcmVudF9WaWV3IAlANTkNCi0JCQkJbG9jYXRpb24gICAJKDc2OSwgOTgwKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg4NDk1Ng0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjINCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzE0LCAxMDY3KQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjcyNzU2NA0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBANjMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQxOCwgMTA0MCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDQyNTAzOEEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbiIgQDY0DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjUNCi0JCQkJUGFyZW50X1ZpZXcgCUA2NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgMTA3OSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjI4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlT3BlcmF0aW9uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQyMDYwMQ0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRjUiDQotCQkJICAgIGNsaWVudCAgICAgCUA2Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANDANCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjYzLCAxMDQwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJCWxvY2F0aW9uICAgCSgxNTg5LCAxMDA1KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5NjcyMQ0KLQkJCQloZWlnaHQgICAgIAkzNg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOCIgQDY3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANjMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgNCi0JCQkJUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI3MywgMTA3MCkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxOTINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU5NTQyMA0KLQkJCQloZWlnaHQgICAgIAkzMA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRkYiDQotCQkJICAgIGNsaWVudCAgICAgCUA2Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANTMNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTc0LCAxMDQwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBANjkNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzg3LCAxMTkwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBREYyRTY0MDFGNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0lucHV0IiBANzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDcwDQotCQkJCWxvY2F0aW9uICAgCSg2NjksIDExNTIpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZUJpbmRpbmdJbnB1dCINCi0JCQkJcGN0RGlzdCAgICAJMC41MTE5MDUNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUxIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQxDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzg3LCAxMTkwKQ0KLQkJCQkoNjM2LCAxMTkwKQ0KLQkJCQkoNjM2LCAxMjcxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYzNiwgMTI3MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzINCi0JCQkJUGFyZW50X1ZpZXcgCUA3MA0KLQkJCQlsb2NhdGlvbiAgIAkoNjg1LCAxMjIyKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjQ0MDQ3Ng0KLQkJCQloZWlnaHQgICAgIAkzMg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQiIEA3Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDY5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzgxLCA0NTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0DQotCQkJCVBhcmVudF9WaWV3IAlANzMNCi0JCQkJbG9jYXRpb24gICAJKDg4NSwgMTE0NCkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDY5DQotCQkJICAgIHN1cHBsaWVyICAgCUA1Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDc4NywgMTE5MCkNCi0JCQkJKDkyNiwgMTE5MCkNCi0JCQkJKDkyNiwgMTA5NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjYsIDEwOTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1DQotCQkJCVBhcmVudF9WaWV3IAlANzMNCi0JCQkJbG9jYXRpb24gICAJKDg3MSwgMTEzNikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44Mzc3NTgNCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUiIEA3Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDI0LCAxMzEyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBREYyRUIzMDE2MyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ091dHB1dCIgQDc3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANzYNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNTAsIDU3OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgNCi0JCQkJUGFyZW50X1ZpZXcgCUA3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTAxMiwgMTQyOSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzA2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlQmluZGluZ091dHB1dCINCi0JCQkJcGN0RGlzdCAgICAJMC41NDUwODINCi0JCQkJaGVpZ2h0ICAgICAJMTMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNDIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTUyNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkNCi0JCQkJUGFyZW50X1ZpZXcgCUA3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoOTY3LCAxNDc5KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3NDU5MA0KLQkJCQloZWlnaHQgICAgIAk1OA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYiIEA4MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDc2DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTUwLCA1NzgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxDQotCQkJCVBhcmVudF9WaWV3IAlAODANCi0JCQkJbG9jYXRpb24gICAJKDk4MywgMTE0MCkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRUI0MDEzRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDc2DQotCQkJICAgIHN1cHBsaWVyICAgCUA1Mw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDEwOTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyDQotCQkJCVBhcmVudF9WaWV3IAlAODANCi0JCQkJbG9jYXRpb24gICAJKDEwMzEsIDExODYpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNTkwMTY0DQotCQkJCWhlaWdodCAgICAgCTcNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAODMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MjAsIDE5ODQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDgzDQotCQkJbG9jYXRpb24gICAJKDE3NzIsIDE5MDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJGYXVsdCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCSAgICB3aWR0aCAgICAgIAkzMTQNCi0JCSAgICBoZWlnaHQgICAgIAkxNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAODQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEzNjAsIDE5ODQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDg0DQotCQkJbG9jYXRpb24gICAJKDEyMTIsIDE4NTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiDQotCQkgICAgd2lkdGggICAgICAJMzE0DQotCQkgICAgaGVpZ2h0ICAgICAJMjc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyINCi0JCSAgICBjbGllbnQgICAgIAlAODQNCi0JCSAgICBzdXBwbGllciAgIAlAMjgNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjAzLCAyMDA3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDIwMDcpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMzIiBAODYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM1NiwgMTM1MikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzQwMDAzRTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdGYXVsdHMiIEA4Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxODgsIDYxNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgMTc1MCkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzAwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlQmluZGluZ0ZhdWx0cyINCi0JCQkJcGN0RGlzdCAgICAJMC44MDMxNTANCi0JCQkJaGVpZ2h0ICAgICAJMjYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg0DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NiwgMTg0NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkNCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwOSwgMTc5NykNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC44OTkxOTQNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwDQotCQkJCVBhcmVudF9WaWV3IAlAODcNCi0JCQkJbG9jYXRpb24gICAJKDEyNTYsIDE4MDYpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuOTE5MjkxDQotCQkJCWhlaWdodCAgICAgCTEwMQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzQiIEA5MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxODgsIDYxNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTINCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3NiwgMTE5NykNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDg2DQotCQkJICAgIHN1cHBsaWVyICAgCUA1Mw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEzNTYsIDEzNTIpDQotCQkJCSgxMzU2LCAxMjE3KQ0KLQkJCQkoMTExNywgMTIxNykNCi0JCQkJKDExMTcsIDEwOTcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDEwOTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzDQotCQkJCVBhcmVudF9WaWV3IAlAOTENCi0JCQkJbG9jYXRpb24gICAJKDExNTIsIDExNjQpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjg3MDA4DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM1IiBAOTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgMTk3MCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOTFGNDAyRjMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0IiBAOTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDk1DQotCQkJCWxvY2F0aW9uICAgCSgxNjc0LCAxOTE1KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VGYXVsdCINCi0JCQkJcGN0RGlzdCAgICAJMC4yNzY0MjMNCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDgzDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MywgMTk3MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcNCi0JCQkJUGFyZW50X1ZpZXcgCUA5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcxOCwgMjAxMikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42NDIyNzYNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM2IiBAOTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDk0DQotCQkJICAgIHN1cHBsaWVyICAgCUA4NA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MTcsIDE5NzApKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTQzMDJBQiINCi0JCSAgICBjbGllbnQgICAgIAlANDcNCi0JCSAgICBzdXBwbGllciAgIAlAMjcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MDMsIDE2NTYpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2NCwgMTY1NikpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUUxQjAxMTMiDQotCQkgICAgY2xpZW50ICAgICAJQDQxDQotCQkgICAgc3VwcGxpZXIgICAJQDI2DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMzEsIDEzODUpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICIyLjQgUG9ydFR5cGVzIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVEMUM0MDM2NiINCi0JICAgIHRpdGxlICAgICAgCSIyLjQgUG9ydFR5cGVzIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiINCi0JICAgIHpvb20gICAgICAgCTgwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSIgQDEwMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIDIwOCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTAxDQotCQkJbG9jYXRpb24gICAJKDE0NiwgMTcyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTcwMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSVBvcnRUeXBlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTAxDQotCQkJbG9jYXRpb24gICAJKDE0NiwgMTIyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNzAwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIg0KLQkJICAgIHdpZHRoICAgICAgCTcxOA0KLQkJICAgIGhlaWdodCAgICAgCTE5Ng0KLQkJICAgIGFubm90YXRpb24gCTgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iIEAxMDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU1MiwgMjA4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDINCi0JCQlsb2NhdGlvbiAgIAkoMTExNiwgMTc2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTg3Mw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSU9wZXJhdGlvbiIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwMg0KLQkJCWxvY2F0aW9uICAgCSgxMTE2LCAxMjYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk4NzMNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiDQotCQkgICAgd2lkdGggICAgICAJODkxDQotCQkgICAgaGVpZ2h0ICAgICAJMTg4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIgQDEwMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNjgsIDE0NzIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwMw0KLQkJCWxvY2F0aW9uICAgCSg1NSwgMTQzNykNCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklJbnB1dCIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwMw0KLQkJCWxvY2F0aW9uICAgCSg1NSwgMTM4NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSINCi0JCSAgICB3aWR0aCAgICAgIAk2NDQNCi0JCSAgICBoZWlnaHQgICAgIAkxOTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCIgQDEwNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzODQsIDE3OTIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNA0KLQkJCWxvY2F0aW9uICAgCSg1NiwgMTc1NykNCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2NTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklPdXRwdXQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQlsb2NhdGlvbiAgIAkoNTYsIDE3MDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2NTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiDQotCQkgICAgd2lkdGggICAgICAJNjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMTk0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCIgQDEwNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNjgsIDIxMTIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCWxvY2F0aW9uICAgCSg1NSwgMjA3NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2MjYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklGYXVsdCIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCWxvY2F0aW9uICAgCSg1NSwgMjAyNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCINCi0JCSAgICB3aWR0aCAgICAgIAk2NDQNCi0JCSAgICBoZWlnaHQgICAgIAkxOTYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxMDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDk2LCA4MDApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNg0KLQkJCWxvY2F0aW9uICAgCSgxNTgsIDY3MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2NzcNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJICAgIHdpZHRoICAgICAgCTY5NQ0KLQkJICAgIGhlaWdodCAgICAgCTI4MQ0KLQkJICAgIGFubm90YXRpb24gCTgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAxMDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU3NiwgODAwKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDcNCi0JCQlsb2NhdGlvbiAgIAkoMjMyNSwgNjkyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUGFydCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCSAgICB3aWR0aCAgICAgIAk1MjANCi0JCSAgICBoZWlnaHQgICAgIAkyNDANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxMDgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcyOCwgMjExMikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA4DQotCQkJbG9jYXRpb24gICAJKDE2NDcsIDIwNjApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJGYXVsdCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCSAgICBoZWlnaHQgICAgIAkxMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEAxMDkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA1NiwgMTQ3MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA5DQotCQkJbG9jYXRpb24gICAJKDg3MCwgMTQyMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklucHV0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJICAgIHdpZHRoICAgICAgCTM5MA0KLQkJICAgIGhlaWdodCAgICAgCTEyNQ0KLQkJICAgIGFubm90YXRpb24gCTgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDExMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzYwLCAxNzkyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMTANCi0JCQlsb2NhdGlvbiAgIAkoMTIzMiwgMTc0MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk91dHB1dCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkxMjUNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBAMTExDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1NTIsIDc4NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTExDQotCQkJbG9jYXRpb24gICAJKDEyMTQsIDYyMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2NzcNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCSAgICB3aWR0aCAgICAgIAk2OTUNCi0JCSAgICBoZWlnaHQgICAgIAkzNTINCi0JCSAgICBhbm5vdGF0aW9uIAk4KQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMTINCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAyNCwgNzk3KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODI0MDE4QyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9ucyIgQDExMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTkyLCAyNjkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNA0KLQkJCQlQYXJlbnRfVmlldyAJQDExMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4OCwgNzQ4KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNDkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VPcGVyYXRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjM1OTY0OQ0KLQkJCQloZWlnaHQgICAgIAk1MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQ0QiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwNSwgNzk3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkJbG9jYXRpb24gICAJKDExNzYsIDg2MSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC44NDAzOTENCi0JCQkJaGVpZ2h0ICAgICAJNjQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNg0KLQkJCQlQYXJlbnRfVmlldyAJQDExMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3NCwgOTIzKQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjI3NjI0Mw0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInBvcnRUeXBlIiBAMTE3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyDQotCQkJICAgIGxvY2F0aW9uICAgCSg1OTIsIDI2OSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQzMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwNg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA3OTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOA0KLQkJCQlQYXJlbnRfVmlldyAJQDExNw0KLQkJCQlsb2NhdGlvbiAgIAkoODg4LCA3NTcpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzUzNDg4DQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQxIiBAMTE5DQotCQkgICAgbG9jYXRpb24gICAJKDIxMDcsIDc3MykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUVBNDEyRjAwMzUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZVBhcmFtZXRlck9yZGVyaW5nIiBAMTIwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5DQotCQkJICAgIGxvY2F0aW9uICAgCSgxODE5LCAxMDEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMA0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NSwgNjQ3KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzOTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJcGN0RGlzdCAgICAJMC4xODMzMzMNCi0JCQkJaGVpZ2h0ICAgICAJMTI3DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1NSINCi0JCQkgICAgY2xpZW50ICAgICAJQDExOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzE2LCA3NzMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMA0KLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgODIyKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5NjYxMA0KLQkJCQloZWlnaHQgICAgIAk0OQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzDQotCQkJCVBhcmVudF9WaWV3IAlAMTIwDQotCQkJCWxvY2F0aW9uICAgCSgyMTcxLCA4ODgpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuMzA2MjIwDQotCQkJCWhlaWdodCAgICAgCTExNQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDIiIEAxMjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQkgICAgbG9jYXRpb24gICAJKDE4MTksIDEwMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNUYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5OSwgNzczKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxIiBAMTI1DQotCQkgICAgbG9jYXRpb24gICAJKDE3MDIsIDE1MDQpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FERjMzMTYwMUE0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVGYXVsdHMiIEAxMjYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUNCi0JCQkgICAgbG9jYXRpb24gICAJKDE0MTQsIDgzMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3DQotCQkJCVBhcmVudF9WaWV3IAlAMTI2DQotCQkJCWxvY2F0aW9uICAgCSgxODE1LCAxOTgyKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VGYXVsdHMiDQotCQkJCXBjdERpc3QgICAgCTAuODc4OTkyDQotCQkJCWhlaWdodCAgICAgCTExMw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzMxODAzODciDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwOA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDIwNDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOA0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTY0NCwgMjAyMCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45NDk1ODANCi0JCQkJaGVpZ2h0ICAgICAJNTkNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTU5MywgMTk2MykNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC44NDUzNzgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMiIgQDEzMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzANCi0JCQkJbG9jYXRpb24gICAJKDE2NjEsIDEwNjkpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzMxODAzODgiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDk2MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyDQotCQkJCVBhcmVudF9WaWV3IAlAMTMwDQotCQkJCWxvY2F0aW9uICAgCSgxODIxLCAxMDM5KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1NzM2Mg0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjciIEAxMzMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTE3OCwgMTIzNCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkY5NDAyNEQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBAMTM0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzDQotCQkJICAgIGxvY2F0aW9uICAgCSg4OTAsIDU2MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1DQotCQkJCVBhcmVudF9WaWV3IAlAMTM0DQotCQkJCWxvY2F0aW9uICAgCSg4NzgsIDEzNDMpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTEzMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZUlucHV0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjgxOTgyMA0KLQkJCQloZWlnaHQgICAgIAkxMDMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjJGOTUwMTkwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTc4LCAxMjM0KQ0KLQkJCQkoOTgwLCAxMjM0KQ0KLQkJCQkoOTgwLCAxNDEwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODAsIDE0MTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNg0KLQkJCQlQYXJlbnRfVmlldyAJQDEzNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA0NiwgMTM2NCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44Nzc2NjANCi0JCQkJaGVpZ2h0ICAgICAJNjYNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4IiBAMTM3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzDQotCQkJICAgIGxvY2F0aW9uICAgCSg4OTAsIDU2MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4DQotCQkJCVBhcmVudF9WaWV3IAlAMTM3DQotCQkJCWxvY2F0aW9uICAgCSgxMjM2LCAxMDM2KQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjJGOTUwMTlBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTc4LCAxMjM0KQ0KLQkJCQkoMTI3NywgMTIzNCkNCi0JCQkJKDEyNzcsIDk2MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc4LCAxMjM0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3NywgOTYwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzcNCi0JCQkJbG9jYXRpb24gICAJKDExOTcsIDEwNTgpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzM2NDEzDQotCQkJCWhlaWdodCAgICAgCTgxDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5IiBAMTQwDQotCQkgICAgbG9jYXRpb24gICAJKDE0NjgsIDEzNDUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FERjJGQjgwMkY5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEAxNDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkgICAgbG9jYXRpb24gICAJKDExODAsIDY3MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyDQotCQkJCVBhcmVudF9WaWV3IAlAMTQxDQotCQkJCWxvY2F0aW9uICAgCSgxMzYyLCAxNjY5KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VPdXRwdXQiDQotCQkJCXBjdERpc3QgICAgCTAuODQwOTA5DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNDANCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDE3MzApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU0NiwgMTY3NikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44NjM2MzYNCi0JCQkJaGVpZ2h0ICAgICAJNzgNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwIiBAMTQ0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMTgwLCA2NzMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE0NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyNywgMTAzNykNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE0MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTExDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgOTYwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDQNCi0JCQkJbG9jYXRpb24gICAJKDE1MjMsIDEwODApDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjkwMzQxDQotCQkJCWhlaWdodCAgICAgCTU1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2RjFGRDgwMTlGIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMDYNCi0JCSAgICBzdXBwbGllciAgIAlAMTAxDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNkYxRkUyMDE3MSINCi0JCSAgICBjbGllbnQgICAgIAlAMTExDQotCQkgICAgc3VwcGxpZXIgICAJQDEwMg0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjZGMUZFRTAzMUQiDQotCQkgICAgY2xpZW50ICAgICAJQDEwOQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxMDMNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2RjFGRjgwMUNEIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMTANCi0JCSAgICBzdXBwbGllciAgIAlAMTA0DQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNkYyMDAyMDAyRCINCi0JCSAgICBjbGllbnQgICAgIAlAMTA4DQotCQkgICAgc3VwcGxpZXIgICAJQDEwNQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAxNTINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIyNCwgMTQ1NikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTUyDQotCQkJbG9jYXRpb24gICAJKDE5MzcsIDEzMTIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTc1DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJICAgIHdpZHRoICAgICAgCTU5Mw0KLQkJICAgIGhlaWdodCAgICAgCTMxMg0KLQkJICAgIGFubm90YXRpb24gCTgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiIEAxNTMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMjU0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNTMNCi0JCQlsb2NhdGlvbiAgIAkoMTE5MywgMjQ2NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2NTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2VSZWZlcmVuY2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiDQotCQkgICAgd2lkdGggICAgICAJNjcyDQotCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkgICAgYW5ub3RhdGlvbiAJOCkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyNCwgMjI3NSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMTUzDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE1MjQsIDIyNzUpDQotCQkJKDE1MjQsIDI0NTQpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNjc3MjNEMDMxOSINCi0JCSAgICBjbGllbnQgICAgIAlAMTA4DQotCQkgICAgc3VwcGxpZXIgICAJQDE1Mw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NzYsIDIxNzYpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzYsIDIyNzUpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTU0KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcyMzUwMEREIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMTANCi0JCSAgICBzdXBwbGllciAgIAlAMTUzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM3MSwgMTg1NCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3MSwgMjI3NSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNTQpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzIyODAyRTciDQotCQkgICAgY2xpZW50ICAgICAJQDEwOQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNTMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODAsIDE1MzQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMjI3NSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNTQpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjEiIEAxNTgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIwNiwgMjI1OSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjc0RTc4NDAxQjEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAxNTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTgNCi0JCQkgICAgbG9jYXRpb24gICAJKDczNCwgLTI4NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYwDQotCQkJCVBhcmVudF9WaWV3IAlAMTU5DQotCQkJCWxvY2F0aW9uICAgCSgyMDY4LCAxNjcwKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VNZXNzYWdlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxMjIzMA0KLQkJCQloZWlnaHQgICAgIAkxMzkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDBGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTU4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNTINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjA2LCAxNjEyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjENCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTkNCi0JCQkJbG9jYXRpb24gICAJKDIyNjAsIDE2NzgpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MiIgQDE2Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNzRFNzg2MDAyMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE1OA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTUzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjIwNiwgMjI1OSkNCi0JCQkJKDIyMDYsIDI1NTYpDQotCQkJCSgxODU2LCAyNTU2KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODU2LCAyNTU2KSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEgRGVmaW5pdGlvbnMiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUU0OEEwMjYyIg0KLQkgICAgdGl0bGUgICAgICAJIjIuMSBEZWZpbml0aW9ucyINCi0JICAgIHpvb20gICAgICAgCTgzDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIiBAMTYzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQzMiwgMTkyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjMNCi0JCQlsb2NhdGlvbiAgIAkoODgsIDE2MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2ODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklEZWZpbml0aW9uIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTYzDQotCQkJbG9jYXRpb24gICAJKDg4LCAxMTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2ODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiDQotCQkgICAgd2lkdGggICAgICAJNzA2DQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMTY0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDk0NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTY0DQotCQkJbG9jYXRpb24gICAJKDE2ODYsIDg5NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJICAgIHdpZHRoICAgICAgCTI5NA0KLQkJICAgIGhlaWdodCAgICAgCTEyMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAxNjUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE0NCwgNjI0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjUNCi0JCQlsb2NhdGlvbiAgIAkoMTkxMCwgNTQ1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ2OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSW1wb3J0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJICAgIHdpZHRoICAgICAgCTQ4Ng0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTY2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjExMiwgMTE4NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTY2DQotCQkJbG9jYXRpb24gICAJKDE5MDAsIDEwNTYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDI0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJICAgIHdpZHRoICAgICAgCTQ0Mg0KLQkJICAgIGhlaWdodCAgICAgCTI4MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDE2Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDE0ODgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2Nw0KLQkJCWxvY2F0aW9uICAgCSgxNTk2LCAxMzYwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkgICAgd2lkdGggICAgICAJNDQyDQotCQkgICAgaGVpZ2h0ICAgICAJMjgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAxNjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMzM2LCAxNzI4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjgNCi0JCQlsb2NhdGlvbiAgIAkoMjEyNCwgMTYwMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkgICAgd2lkdGggICAgICAJNDQyDQotCQkgICAgaGVpZ2h0ICAgICAJMjgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAxNjkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDI0MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTY5DQotCQkJbG9jYXRpb24gICAJKDEwNzMsIDM5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUxMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCSAgICB3aWR0aCAgICAgIAk1MjgNCi0JCSAgICBoZWlnaHQgICAgIAk0MjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDE3MA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzU4LCA4NjApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMTcxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgLTM2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzINCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJbG9jYXRpb24gICAJKDEzMTcsIDUzNSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTY5DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU4LCA0NTMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDE3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwMywgNTExKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1NjY0OQ0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMTc0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgLTM2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzQNCi0JCQkJbG9jYXRpb24gICAJKDE1ODYsIDkwOSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlVHlwZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNzc5MDk3DQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE3MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTY0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTM1OCwgODYwKQ0KLQkJCQkoMTM1OCwgOTQ4KQ0KLQkJCQkoMTY3NywgOTQ4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDk0OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc2DQotCQkJCVBhcmVudF9WaWV3IAlAMTc0DQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCA5ODcpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODkyNjU1DQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMTc3DQotCQkgICAgbG9jYXRpb24gICAJKDE2MTIsIDU5NSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAxNzgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzcNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyLCAyMjcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyMywgNTEyKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTc3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNjEyLCA1OTUpDQotCQkJCSgxNDY0LCA1OTUpDQotCQkJCSgxNDY0LCA0NTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2NCwgNDUzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODANCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzgNCi0JCQkJbG9jYXRpb24gICAJKDE1MjQsIDQ5NSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44NTg2NjcNCi0JCQkJaGVpZ2h0ICAgICAJNjANCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMTgxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTc3DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMiwgMjI3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODINCi0JCQkJUGFyZW50X1ZpZXcgCUAxODENCi0JCQkJbG9jYXRpb24gICAJKDE2OTIsIDU1NykNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjA0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlSW1wb3J0cyINCi0JCQkJcGN0RGlzdCAgICAJMC4yODAzMzUNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTc3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjUNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDEsIDU5NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgzDQotCQkJCVBhcmVudF9WaWV3IAlAMTgxDQotCQkJCWxvY2F0aW9uICAgCSgxODU0LCA2NTIpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuODQxMDA0DQotCQkJCWhlaWdodCAgICAgCTU3DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODQNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODENCi0JCQkJbG9jYXRpb24gICAJKDE2NzYsIDY0NikNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC4yMjU5NDENCi0JCQkJaGVpZ2h0ICAgICAJNTENCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMiIEAxODUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI3OSwgMTEzNykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTYwMzAxRTIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxODYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxODUNCi0JCQkgICAgbG9jYXRpb24gICAJKDI3MSwgMjczKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODYNCi0JCQkJbG9jYXRpb24gICAJKDEyMzgsIDU5MSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjA0MDBCNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTY5DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3OSwgNDUzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODYNCi0JCQkJbG9jYXRpb24gICAJKDEzMjAsIDU4NikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44MDQ5NzQNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlcyIgQDE4OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjcxLCAyNzMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MA0KLQkJCQlQYXJlbnRfVmlldyAJQDE4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY0NywgMTE3MSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjQwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlTWVzc2FnZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNjQzMTM3DQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjA0MDBDMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4NQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTY2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTI3OSwgMTEzNykNCi0JCQkJKDEyNzksIDEyMDgpDQotCQkJCSgxODkxLCAxMjA4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODkxLCAxMjA4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTENCi0JCQkJUGFyZW50X1ZpZXcgCUAxODkNCi0JCQkJbG9jYXRpb24gICAJKDE4MjEsIDExNzEpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuODk5MzQ2DQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxODkNCi0JCQkJbG9jYXRpb24gICAJKDE3OTcsIDEyNDQpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuODY0NDA3DQotCQkJCWhlaWdodCAgICAgCTM2DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBAMTkzDQotCQkgICAgbG9jYXRpb24gICAJKDEyMTIsIDExNTkpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU2NzEwMTA0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2IiBAMTk0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTkzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzI0LCAyMTUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3MSwgNTk0KQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2NzIwMzRBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTkzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjEyLCA0NTMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDE5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI1MSwgNjI0KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc1Nzk2Mg0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlcyIgQDE5Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxOTcNCi0JCQkJbG9jYXRpb24gICAJKDEzOTEsIDE0NTEpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI0MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZVBvcnRUeXBlcyINCi0JCQkJcGN0RGlzdCAgICAJMC43MjM2OTgNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2NzIwMzU0Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTkzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjcNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjEyLCAxMTU5KQ0KLQkJCQkoMTIxMiwgMTQ5MCkNCi0JCQkJKDE1ODcsIDE0OTApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODcsIDE0OTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzMywgMTQ1MSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45MjU2MTENCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMA0KLQkJCQlQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTUxMiwgMTU0MCkNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTU4NTUNCi0JCQkJaGVpZ2h0ICAgICAJNTANCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTciIEAyMDENCi0JCSAgICBsb2NhdGlvbiAgIAkoMTExNCwgMTU4NSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3NzAwOTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgiIEAyMDINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDENCi0JCQkgICAgbG9jYXRpb24gICAJKC00MDYsIDI0MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAzDQotCQkJCVBhcmVudF9WaWV3IAlAMjAyDQotCQkJCWxvY2F0aW9uICAgCSgxMDczLCA2ODApDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzNzEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMDENCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2OQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMTQsIDQ1MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA0DQotCQkJCVBhcmVudF9WaWV3IAlAMjAyDQotCQkJCWxvY2F0aW9uICAgCSgxMTU1LCA3NTIpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzM2NzA0DQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ3MiIEAyMDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMDENCi0JCQkgICAgbG9jYXRpb24gICAJKC00MDYsIDI0MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA2DQotCQkJCVBhcmVudF9WaWV3IAlAMjA1DQotCQkJCWxvY2F0aW9uICAgCSgxODUxLCAxNjc0KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VCaW5kaW5ncyINCi0JCQkJcGN0RGlzdCAgICAJMC43NjYzNDcNCi0JCQkJaGVpZ2h0ICAgICAJNDMNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2NzgwMzdCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjAxDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMTE0LCAxNTg1KQ0KLQkJCQkoMTExNCwgMTcxNikNCi0JCQkJKDIxMTUsIDE3MTYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDE3MTYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNw0KLQkJCQlQYXJlbnRfVmlldyAJQDIwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA1MywgMTY3NykNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45NDUwNzQNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwOA0KLQkJCQlQYXJlbnRfVmlldyAJQDIwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAxNCwgMTc1NCkNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC45MTEwNzINCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyMDkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMDkNCi0JCQlsb2NhdGlvbiAgIAkoMTYyOCwgMTkyMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZpY2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkgICAgd2lkdGggICAgICAJNDQyDQotCQkgICAgaGVpZ2h0ICAgICAJMjgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkiIEAyMTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA2NiwgMTUzMykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3QjAzMTEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAiIEAyMTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTANCi0JCQkgICAgbG9jYXRpb24gICAJKC01MjEsIC0xMTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMg0KLQkJCQlQYXJlbnRfVmlldyAJQDIxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNSwgNjY5KQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2N0QwMDdGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjEwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA0NTMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMw0KLQkJCQlQYXJlbnRfVmlldyAJQDIxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEwOSwgNzU2KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcxOTY5Nw0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZVNlcnZpY2VzIiBAMjE0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjEwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTIxLCAtMTExKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTQNCi0JCQkJbG9jYXRpb24gICAJKDEzOTMsIDIwMjgpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIwNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZVNlcnZpY2VzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5MTgyNA0KLQkJCQloZWlnaHQgICAgIAkzMg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwODkiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwNjYsIDE1MzMpDQotCQkJCSgxMDY2LCAyMDU5KQ0KLQkJCQkoMTYxOSwgMjA1OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxOSwgMjA1OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE2DQotCQkJCVBhcmVudF9WaWV3IAlAMjE0DQotCQkJCWxvY2F0aW9uICAgCSgxNTU0LCAyMDMxKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0MDE5Nw0KLQkJCQloZWlnaHQgICAgIAkyOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE3DQotCQkJCVBhcmVudF9WaWV3IAlAMjE0DQotCQkJCWxvY2F0aW9uICAgCSgxNTMyLCAyMTEzKQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjkyMDUxNQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIxOA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMUY4MDM4MiINCi0JCSAgICBjbGllbnQgICAgIAlAMTY5DQotCQkgICAgc3VwcGxpZXIgICAJQDE2Mw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjQsIDI2MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg1LCAyNjMpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEuMyBFeHRlbnNpYmlsaXR5Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRDYwQzUxMDE5MiINCi0JICAgIHRpdGxlICAgICAgCSIyLjEuMyBFeHRlbnNpYmlsaXR5Ig0KLQkgICAgem9vbSAgICAgICAJODANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDIxOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTU4NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjE5DQotCQkJbG9jYXRpb24gICAJKDQ5NCwgMTUzMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxNjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkgICAgd2lkdGggICAgICAJMTgyDQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEAyMjANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCAxODg4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjANCi0JCQlsb2NhdGlvbiAgIAkoMTQ4NywgMTgzNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlBvcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkgICAgaGVpZ2h0ICAgICAJMTI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyMjENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCAxNzI4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjENCi0JCQlsb2NhdGlvbiAgIAkoMTM0MiwgMTY3NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxNjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNlcnZpY2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkgICAgd2lkdGggICAgICAJMTgyDQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDIyMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyMTYsIDIzMzYpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyMg0KLQkJCWxvY2F0aW9uICAgCSgxMDg4LCAyMjgzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAMjIzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzM2LCAxNzYwKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjMNCi0JCQlsb2NhdGlvbiAgIAkoNTYzLCAxNzA3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM0Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCSAgICB3aWR0aCAgICAgIAkzNjQNCi0JCSAgICBoZWlnaHQgICAgIAkxMzANCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyMjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg4OCwgMTYwKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQlsb2NhdGlvbiAgIAkoMTQ5NSwgMTM2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTc4Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjI0DQotCQkJbG9jYXRpb24gICAJKDE0OTUsIDg2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNzg2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIg0KLQkJICAgIHdpZHRoICAgICAgCTgwNA0KLQkJICAgIGhlaWdodCAgICAgCTE3Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEAyMjUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDE5NTIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyNQ0KLQkJCWxvY2F0aW9uICAgCSg4MDAsIDE4OTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEAyMjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDA4LCAyMTQ0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjYNCi0JCQlsb2NhdGlvbiAgIAkoODYzLCAyMDkxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI5MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCSAgICB3aWR0aCAgICAgIAkzMDgNCi0JCSAgICBoZWlnaHQgICAgIAkxMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDIyNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMTI5NikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjI3DQotCQkJbG9jYXRpb24gICAJKDc0LCAxMjM1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIwNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCSAgICB3aWR0aCAgICAgIAkyMjINCi0JCSAgICBoZWlnaHQgICAgIAkxNDYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAyMjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDE2LCAxNDA4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjgNCi0JCQlsb2NhdGlvbiAgIAkoMzM1LCAxMzU2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkgICAgaGVpZ2h0ICAgICAJMTI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMjI5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDY4OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjkNCi0JCQlsb2NhdGlvbiAgIAkoMjA5LCA1ODApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTQyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSINCi0JCSAgICB3aWR0aCAgICAgIAk1NjANCi0JCSAgICBoZWlnaHQgICAgIAkyNDANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyMzANCi0JCSAgICBsb2NhdGlvbiAgIAkoNDgwLCAxMDM5KQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyMjkNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNDgwLCAxMDM5KQ0KLQkJCSg0ODAsIDgwOCkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjAwQ0IwMEFBIg0KLQkJICAgIGNsaWVudCAgICAgCUAyMjANCi0JCSAgICBzdXBwbGllciAgIAlAMjI5DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU2NiwgMTgyNCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2NiwgMTAzOSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg1QjVBNDAyN0UiDQotCQkgICAgY2xpZW50ICAgICAJQDIyNg0KLQkJICAgIHN1cHBsaWVyICAgCUAyMjkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk3LCAyMDc5KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk3LCAxMDM5KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDIzMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzMw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA5Mzg2MDJDOSINCi0JCSAgICBjbGllbnQgICAgIAlAMjIyDQotCQkgICAgc3VwcGxpZXIgICAJQDIyOQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMTksIDIyNzEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTksIDEwMzkpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM0DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NUI1OUIwMDcyIg0KLQkJICAgIGNsaWVudCAgICAgCUAyMjUNCi0JCSAgICBzdXBwbGllciAgIAlAMjI5DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTg4LCAxODg3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODgsIDEwMzkpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjAwOTIwMkY3Ig0KLQkJICAgIGNsaWVudCAgICAgCUAyMjMNCi0JCSAgICBzdXBwbGllciAgIAlAMjI5DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzk3LCAxNjk1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTcsIDEwMzkpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZBMEYwMkYwIg0KLQkJICAgIGNsaWVudCAgICAgCUAyMTkNCi0JCSAgICBzdXBwbGllciAgIAlAMjI5DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjAxLCAxNTE5KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDEsIDEwMzkpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZEQjgwM0Q0Ig0KLQkJICAgIGNsaWVudCAgICAgCUAyMjcNCi0JCSAgICBzdXBwbGllciAgIAlAMjI5DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjExLCAxMjIzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTEsIDEwMzkpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJICAgIGNsaWVudCAgICAgCUAyMjgNCi0JCSAgICBzdXBwbGllciAgIAlAMjI5DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDE0LCAxMzQ0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEwMzkpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZBMjAwMjVFIg0KLQkJICAgIGNsaWVudCAgICAgCUAyMjENCi0JCSAgICBzdXBwbGllciAgIAlAMjI5DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTY2MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQyOSwgMTAzOSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjQwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTA0LCA2ODgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI0MA0KLQkJCWxvY2F0aW9uICAgCSgxNjMyLCA1ODMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTQ1DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCSAgICB3aWR0aCAgICAgIAk1NjMNCi0JCSAgICBoZWlnaHQgICAgIAkyMzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDI0MQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTkxLCA2NzIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMjQyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQxDQotCQkJICAgIGxvY2F0aW9uICAgCSgyMywgNTYwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNDINCi0JCQkJbG9jYXRpb24gICAJKDg0NywgNjMxKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjQxDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMjkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc2MCwgNjcyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDQNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNDINCi0JCQkJbG9jYXRpb24gICAJKDgzMCwgNjI4KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzOTY5NQ0KLQkJCQloZWlnaHQgICAgIAk0NQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDI0NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjMsIDU2MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ2DQotCQkJCVBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1MjIpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJcGN0RGlzdCAgICAJMC4zNzkwNzANCi0JCQkJaGVpZ2h0ICAgICAJMTUxDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkgICAgY2xpZW50ICAgICAJQDI0MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjQwDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkxLCA2NzIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjIzLCA2NzIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDI0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ5NiwgNjI3KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcwOTQwMg0KLQkJCQloZWlnaHQgICAgIAk0Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ4DQotCQkJCVBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCWxvY2F0aW9uICAgCSgxNDYzLCA3NjQpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuNjMyNDc5DQotCQkJCWhlaWdodCAgICAgCTkyDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIgQDI0OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDA4LCAxOTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjQ5DQotCQkJbG9jYXRpb24gICAJKDYzMCwgODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNzU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJXU0RMRWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCINCi0JCSAgICB3aWR0aCAgICAgIAk3NzQNCi0JCSAgICBoZWlnaHQgICAgIAkyNDANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAwOCwgNDAyKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyNDkNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTAwOCwgNDAyKQ0KLQkJCSgxMDA4LCAzMTIpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1MQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRTNDMDNENCINCi0JCSAgICBjbGllbnQgICAgIAlAMjI5DQotCQkgICAgc3VwcGxpZXIgICAJQDI0OQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ5MiwgNTY4KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0OTIsIDQwMikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNTApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjE0OTAzRDAiDQotCQkgICAgY2xpZW50ICAgICAJQDI0MA0KLQkJICAgIHN1cHBsaWVyICAgCUAyMjQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDE1LCA1NzEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTUsIDI0NikpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQkRERjUzNTAyQzMiDQotCQkgICAgY2xpZW50ICAgICAJQDI0MA0KLQkJICAgIHN1cHBsaWVyICAgCUAyNDkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzYyLCA1NzEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjIsIDQwMikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI1NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAxNiwgMTM2MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjU0DQotCQkJbG9jYXRpb24gICAJKDE3MzEsIDEzMDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTcwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkgICAgd2lkdGggICAgICAJNTg4DQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQ0IyNEFFQzAxQ0IiDQotCQkgICAgY2xpZW50ICAgICAJQDI1NA0KLQkJICAgIHN1cHBsaWVyICAgCUAyNDANCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzk2LCAxMjk1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzk2LCA4MDUpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYzIiBAMjU2DQotCQkgICAgbG9jYXRpb24gICAJKDIzMTEsIDE2ODYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y3ODk2QTIwMjZFIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcmVudCIgQDI1Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc5LCAyOTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1OA0KLQkJCQlQYXJlbnRfVmlldyAJQDI1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMjQyMiwgMTMzMykNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwYXJlbnQiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI1Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAMjU0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjMxMSwgMTY4NikNCi0JCQkJKDI0MzIsIDE2ODYpDQotCQkJCSgyNDMyLCAxMzc0KQ0KLQkJCQkoMjMxMCwgMTM3NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjMxMCwgMTM3NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU5DQotCQkJCVBhcmVudF9WaWV3IAlAMjU3DQotCQkJCWxvY2F0aW9uICAgCSgyMzY2LCAxNDI4KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY2hpbGRyZW4iIEAyNjANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNTYNCi0JCQkgICAgbG9jYXRpb24gICAJKDI3OSwgMjk0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjENCi0JCQkJUGFyZW50X1ZpZXcgCUAyNjANCi0JCQkJbG9jYXRpb24gICAJKDE4OTksIDE1MzcpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY2hpbGRyZW4iDQotCQkJCXBjdERpc3QgICAgCTAuNzk4NTYxDQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNTYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI1NA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIzMTEsIDE2ODYpDQotCQkJCSgyMDE2LCAxNjg2KQ0KLQkJCQkoMjAxNiwgMTQyNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNiwgMTQyNSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYyDQotCQkJCVBhcmVudF9WaWV3IAlAMjYwDQotCQkJCWxvY2F0aW9uICAgCSgyMDcwLCAxNDgxKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRThFRDcyMDFCRCINCi0JICAgIHRpdGxlICAgICAgCSIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciDQotCSAgICB6b29tICAgICAgIAk5MA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0IiBAMjYzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzEyLCAyMjQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI2Mw0KLQkJCWxvY2F0aW9uICAgCSgxNDIyLCAxNzcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTgwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJSW1wb3J0IikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjYzDQotCQkJbG9jYXRpb24gICAJKDE0MjIsIDEyNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU4MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSINCi0JCSAgICB3aWR0aCAgICAgIAk1OTgNCi0JCSAgICBoZWlnaHQgICAgIAkyMTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIiBAMjY0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0MzIsIDExMzYpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI2NA0KLQkJCWxvY2F0aW9uICAgCSgyMDIsIDEwNDEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDYxDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJOYW1lc3BhY2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkgICAgd2lkdGggICAgICAJNDc5DQotCQkgICAgaGVpZ2h0ICAgICAJMjE1DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMjY1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDEyMTYpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI2NQ0KLQkJCWxvY2F0aW9uICAgCSgxMjk0LCAxMTQyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY3Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJICAgIHdpZHRoICAgICAgCTY5NA0KLQkJICAgIGhlaWdodCAgICAgCTE3Mw0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjY2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQwMCwgMzg0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNjYNCi0JCQlsb2NhdGlvbiAgIAkoMTY0LCAyMzYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIHdpZHRoICAgICAgCTQ5MA0KLQkJICAgIGhlaWdodCAgICAgCTMyMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM3IiBAMjY3DQotCQkgICAgbG9jYXRpb24gICAJKDMwOSwgNzg2KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRDU1MDAyRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlTmFtZXNwYWNlcyIgQDI2OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTkxLCAyNTgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI2OA0KLQkJCQlsb2NhdGlvbiAgIAkoNDYxLCA5NTYpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI4OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZU5hbWVzcGFjZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNjk4ODQyDQotCQkJCWhlaWdodCAgICAgCTE1Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMzIiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNjcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI2NA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDEwMjkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MA0KLQkJCQlQYXJlbnRfVmlldyAJQDI2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjQ4LCA5NzMpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNzY4NzA3DQotCQkJCWhlaWdodCAgICAgCTYyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzENCi0JCQkJUGFyZW50X1ZpZXcgCUAyNjgNCi0JCQkJbG9jYXRpb24gICAJKDIyOCwgOTEzKQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjUyNTA5Nw0KLQkJCQloZWlnaHQgICAgIAk4Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzgiIEAyNzINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNjcNCi0JCQkgICAgbG9jYXRpb24gICAJKC05MSwgMjU4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNzINCi0JCQkJbG9jYXRpb24gICAJKDI2OCwgNTkyKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRDU2MDMyOCINCi0JCQkgICAgY2xpZW50ICAgICAJQDI2Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjY2DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgNTQ0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzQNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNzINCi0JCQkJbG9jYXRpb24gICAJKDIzOSwgNTgzKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg0NDk2MQ0KLQkJCQloZWlnaHQgICAgIAk3MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMjc1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDcyLCA3MjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI3NQ0KLQkJCWxvY2F0aW9uICAgCSgxMjU1LCA1ODApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDM0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJbXBvcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiDQotCQkgICAgd2lkdGggICAgICAJNDUyDQotCQkgICAgaGVpZ2h0ICAgICAJMzA0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTEiIEAyNzYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4NiwgMTAwMSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMURDQzAyRTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZVNjaGVtYSIgQDI3Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzgNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNzcNCi0JCQkJbG9jYXRpb24gICAJKDE3MzcsIDEwMTgpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIwNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZVNjaGVtYSINCi0JCQkJcGN0RGlzdCAgICAJMC41OTI1OTMNCi0JCQkJaGVpZ2h0ICAgICAJMTA1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCOEIxRENFMDI3MCINCi0JCQkgICAgY2xpZW50ICAgICAJQDI3Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAMjY1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTQ4NiwgMTAwMSkNCi0JCQkJKDE2MzIsIDEwMDEpDQotCQkJCSgxNjMyLCAxMTMwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMyLCAxMTMwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzkNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNzcNCi0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEwMTgpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNTkyNTkzDQotCQkJCWhlaWdodCAgICAgCTcwDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MiIgQDI4MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCOEIxRENFMDI3QSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI3Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAMjc1DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCA4NzIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg2LCA4NzIpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzkiIEAyODENCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA4NywgNDAzKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRTNBMDAyRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MCIgQDI4Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyODINCi0JCQkJbG9jYXRpb24gICAJKDE0MDYsIDQ4MCkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRjIiDQotCQkJICAgIGNsaWVudCAgICAgCUAyODENCi0JCQkgICAgc3VwcGxpZXIgICAJQDI3NQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEwODcsIDQwMykNCi0JCQkJKDEzNjQsIDQwMykNCi0JCQkJKDEzNjQsIDU2OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY0LCA1NjgpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVEZWZpbml0aW9uIiBAMjg0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgxDQotCQkJICAgIGxvY2F0aW9uICAgCSg2ODcsIC0xMjUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI4NA0KLQkJCQlsb2NhdGlvbiAgIAkoODA1LCAzNjMpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIxNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZURlZmluaXRpb24iDQotCQkJCXBjdERpc3QgICAgCTAuNjM3NTMyDQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRTNDMDFFOCINCi0JCQkgICAgY2xpZW50ICAgICAJQDI4MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjY2DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDUsIDQwMykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg2DQotCQkJCVBhcmVudF9WaWV3IAlAMjg0DQotCQkJCWxvY2F0aW9uICAgCSg3MjcsIDQ1NikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44MTQ5MTANCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAyODcNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzM3LCA4MjYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMjg4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjg3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNjcxLCAxMDYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI4OA0KLQkJCQlsb2NhdGlvbiAgIAkoNTUyLCA2NDcpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjg3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNjYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3MzcsIDgyNikNCi0JCQkJKDUxMCwgODI2KQ0KLQkJCQkoNTEwLCA1NDQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDU0NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkwDQotCQkJCVBhcmVudF9WaWV3IAlAMjg4DQotCQkJCWxvY2F0aW9uICAgCSg0NTcsIDU5NSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMjkxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjg3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNjcxLCAxMDYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDI5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE0NCwgNzczKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VJbXBvcnRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5OTE4OQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkJICAgIGNsaWVudCAgICAgCUAyODcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI3NQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ2LCA4MjYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDI5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4MCwgODc5KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3MjIxMQ0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjk0DQotCQkJCVBhcmVudF9WaWV3IAlAMjkxDQotCQkJCWxvY2F0aW9uICAgCSgxMTYyLCA5MzMpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuODM3NzI4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5NQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNkYyMDBEMDM0MCINCi0JCSAgICBjbGllbnQgICAgIAlAMjc1DQotCQkgICAgc3VwcGxpZXIgICAJQDI2Mw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NTUsIDU2OCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1NSwgMzMzKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4yIFR5cGVzIg0KLQkgICAgcXVpZCAgICAgICAJIjNCODVBRTU5MDM3RSINCi0JICAgIHRpdGxlICAgICAgCSIyLjIgVHlwZXMiDQotCSAgICB6b29tICAgICAgIAk5MA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAk4MQ0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDI5Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgMTIzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOTYNCi0JCQlsb2NhdGlvbiAgIAkoODk1LCAxMTU3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ4Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkgICAgd2lkdGggICAgICAJNTAwDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMjk3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDExMzYsIDE2MDApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5Nw0KLQkJCWxvY2F0aW9uICAgCSg5MDYsIDE1MzEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkgICAgd2lkdGggICAgICAJNDc4DQotCQkgICAgaGVpZ2h0ICAgICAJMTYyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAyOTgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyODAsIDE5NjgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5OA0KLQkJCWxvY2F0aW9uICAgCSgxMDIyLCAxODI4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUxNw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCSAgICB3aWR0aCAgICAgIAk1MzUNCi0JCSAgICBoZWlnaHQgICAgIAkzMDUNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDI5OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzUyLCAxMTg0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOTkNCi0JCQlsb2NhdGlvbiAgIAkoMTI4LCAxMDY3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ0OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUGFydCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCSAgICB3aWR0aCAgICAgIAk0NjYNCi0JCSAgICBoZWlnaHQgICAgIAkyNTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NyIgQDMwMA0KLQkJICAgIGxvY2F0aW9uICAgCSg3MzUsIDExNzIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4QjFCRTkwMEM0Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBAMzAxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzAwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNDMsIDY3NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAyDQotCQkJCVBhcmVudF9WaWV3IAlAMzAxDQotCQkJCWxvY2F0aW9uICAgCSg3NzUsIDExMzMpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI3Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iDQotCQkJCXBjdERpc3QgICAgCTAuMjY5MDA2DQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCOEIxQkU5MDMyNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDMwMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjk2DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODYsIDExNzIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMw0KLQkJCQlQYXJlbnRfVmlldyAJQDMwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoODM5LCAxMjA3KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY4ODcwNQ0KLQkJCQloZWlnaHQgICAgIAkzNQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDgiIEAzMDQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMDANCi0JCQkgICAgbG9jYXRpb24gICAJKDE0MywgNjc2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCOEIxQkU5MDMzMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDMwMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjk5DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODUsIDExNzIpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDkiIEAzMDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTI3LCAxNTkyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCOEIxQzEyMDNCMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb24iIEAzMDYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMDUNCi0JCQkgICAgbG9jYXRpb24gICAJKC02NSwgMTA5NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA3DQotCQkJCVBhcmVudF9WaWV3IAlAMzA2DQotCQkJCWxvY2F0aW9uICAgCSg2NjYsIDE1NTQpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjM3NTM5NA0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMUMiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMDUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5Nw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk3LCAxNTkyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDgNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMDYNCi0JCQkJbG9jYXRpb24gICAJKDgwNywgMTY0NSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NTU4NzcNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUwIiBAMzA5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzA1DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNjUsIDEwOTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDI2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzA1DQotCQkJICAgIHN1cHBsaWVyICAgCUAyOTkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg1MjcsIDE1OTIpDQotCQkJCSg0MzcsIDE1OTIpDQotCQkJCSg0MzcsIDEzMTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAxMzEzKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU1IiBAMzEwDQotCQkgICAgbG9jYXRpb24gICAJKDMyMiwgMTkxMSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzQ2ODI5MzAzRTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAzMTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTANCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNCwgMTE5MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEyDQotCQkJCVBhcmVudF9WaWV3IAlAMzExDQotCQkJCWxvY2F0aW9uICAgCSg4MzgsIDE4NzIpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIxNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZU1lc3NhZ2UiDQotCQkJCXBjdERpc3QgICAgCTAuNzQ4NTYwDQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDNDY4Mjk2MDEwRSINCi0JCQkgICAgY2xpZW50ICAgICAJQDMxMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjk4DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxOTExKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMTENCi0JCQkJbG9jYXRpb24gICAJKDk0MywgMTk2NSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU2IiBAMzE0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzEwDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTQsIDExOTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTE4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzEwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyOTkNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzMjIsIDE5MTEpDQotCQkJCSgyMjksIDE5MTEpDQotCQkJCSgyMjksIDEzMTMpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5LCAxMzEzKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDMxNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODAwLCA2MDgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxNQ0KLQkJCWxvY2F0aW9uICAgCSg2MTUsIDUxMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzENCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJICAgIHdpZHRoICAgICAgCTM4OQ0KLQkJICAgIGhlaWdodCAgICAgCTIxNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzE2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAxNjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxNg0KLQkJCWxvY2F0aW9uICAgCSg3NCwgMTA3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIwNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCSAgICB3aWR0aCAgICAgIAkyMjINCi0JCSAgICBoZWlnaHQgICAgIAkxMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDMxNw0KLQkJICAgIGxvY2F0aW9uICAgCSgyMzQsIDYwNCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMzE4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzE3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTUwLCAzOTYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMxOA0KLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCA2NDApDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIwNw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZVR5cGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY2MTAxNw0KLQkJCQloZWlnaHQgICAgIAkzNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxNQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDYsIDYwNCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIwDQotCQkJCVBhcmVudF9WaWV3IAlAMzE4DQotCQkJCWxvY2F0aW9uICAgCSg1MjYsIDU2OSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43ODM4ODMNCi0JCQkJaGVpZ2h0ICAgICAJMzYNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMzIxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzE3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTUwLCAzOTYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMg0KLQkJCQlQYXJlbnRfVmlldyAJQDMyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMzLCAzMTMpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMxNg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDIzNCwgNjA0KQ0KLQkJCQkoMTc0LCA2MDQpDQotCQkJCSgxNzQsIDIyNSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMjI1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMjENCi0JCQkJbG9jYXRpb24gICAJKDIyOCwgMjcxKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5NzcyOQ0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIiBAMzI0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDY0MCwgMjI0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMjQNCi0JCQlsb2NhdGlvbiAgIAkoNTI1LCAyMDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjMwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJVHlwZXMiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMjQNCi0JCQlsb2NhdGlvbiAgIAkoNTI1LCAxNTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQ0FEQ0JCMjAwNTAiDQotCQkgICAgd2lkdGggICAgICAJMjQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMTY2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzI1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzI4LCA4MDApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMyNQ0KLQkJCWxvY2F0aW9uICAgCSgxMzU5LCA3NTMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNzM5DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JCSAgICB3aWR0aCAgICAgIAk3NTcNCi0JCSAgICBoZWlnaHQgICAgIAkxMTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzMjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg1NiwgMTIxNikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzI2DQotCQkJbG9jYXRpb24gICAJKDE1MjksIDExMDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjU1DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkgICAgd2lkdGggICAgICAJNjczDQotCQkgICAgaGVpZ2h0ICAgICAJMjUwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTkiIEAzMjcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNiwgOTc1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDQzM2MTQ1MDBGMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MCIgQDMyOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA2LCA0NDcpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzI3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMjUNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDg1OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI5DQotCQkJCVBhcmVudF9WaWV3IAlAMzI4DQotCQkJCWxvY2F0aW9uICAgCSgxNzc0LCA5MDApDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjU2NDg5DQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWEiIEAzMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMjcNCi0JCQkgICAgbG9jYXRpb24gICAJKDMwNiwgNDQ3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAzMzANCi0JCQkJbG9jYXRpb24gICAJKDIwMDYsIDEwMzMpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrc2NoZW1hIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUwNzU3Ng0KLQkJCQloZWlnaHQgICAgIAkxODANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzI3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMjYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDEwOTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMg0KLQkJCQlQYXJlbnRfVmlldyAJQDMzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTc4OCwgMTA1MCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42NTE1MTUNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMzMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQ0FEQ0QzQjAzODAiDQotCQkgICAgY2xpZW50ICAgICAJQDMxNQ0KLQkJICAgIHN1cHBsaWVyICAgCUAzMjQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDUsIDUwMCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzA1LCAzMDcpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDMzNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA1NiwgMjI0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzNA0KLQkJCWxvY2F0aW9uICAgCSg4MTUsIDEzMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJICAgIHdpZHRoICAgICAgCTUwMA0KLQkJICAgIGhlaWdodCAgICAgCTIxMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzM1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJICAgIGNsaWVudCAgICAgCUAzMTUNCi0JCSAgICBzdXBwbGllciAgIAlAMzM0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODU0LCA1MDApDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg1NCwgMzMwKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMzYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgNDY0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMzYNCi0JCQlsb2NhdGlvbiAgIAkoMTQ5MCwgMzY4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY2OQ0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkgICAgd2lkdGggICAgICAJNjg3DQotCQkgICAgaGVpZ2h0ICAgICAJMjE2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAzMzcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIwNiwgNDkzKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDMzOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzkNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMzgNCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDM4NikNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMzcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzNA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMDYsIDQ5MykNCi0JCQkJKDEwOTQsIDQ5MykNCi0JCQkJKDEwOTQsIDMzMCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAzMzApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0MA0KLQkJCQlQYXJlbnRfVmlldyAJQDMzOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA0MiwgMzc3KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyODMyNg0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDM0MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDINCi0JCQkJUGFyZW50X1ZpZXcgCUAzNDENCi0JCQkJbG9jYXRpb24gICAJKDExOTYsIDQ1NCkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlwY3REaXN0ICAgIAktMC4wMzk3MTENCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzM3DQotCQkJICAgIHN1cHBsaWVyICAgCUAzMzYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODEsIDQ5MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQzDQotCQkJCVBhcmVudF9WaWV3IAlAMzQxDQotCQkJCWxvY2F0aW9uICAgCSgxNDE1LCA1NDYpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNzY0OTU3DQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNDENCi0JCQkJbG9jYXRpb24gICAJKDEzOTYsIDM5MikNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC42OTQ5MTUNCi0JCQkJaGVpZ2h0ICAgICAJMTAyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzQ1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0NDMzYyN0YwMEI3Ig0KLQkJICAgIGNsaWVudCAgICAgCUAzMjUNCi0JCSAgICBzdXBwbGllciAgIAlAMzM2DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTgxMiwgNzQxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCA1NzIpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICIyLjMgTWVzc2FnZXMiDQotCSAgICBxdWlkICAgICAgIAkiM0JDRTg1M0QwMkM4Ig0KLQkgICAgdGl0bGUgICAgICAJIjIuMyBNZXNzYWdlcyINCi0JICAgIHpvb20gICAgICAgCTg1DQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIiBAMzQ2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCAyMjQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM0Ng0KLQkJCWxvY2F0aW9uICAgCSgyNjcsIDEyMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklNZXNzYWdlIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzQ2DQotCQkJbG9jYXRpb24gICAJKDI2NywgNzIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiDQotCQkgICAgd2lkdGggICAgICAJMzgwDQotCQkgICAgaGVpZ2h0ICAgICAJMzI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IiBAMzQ3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDIyNCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzQ3DQotCQkJbG9jYXRpb24gICAJKDEwMjksIDEyNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1OTkNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklQYXJ0IikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzQ3DQotCQkJbG9jYXRpb24gICAJKDEwMjksIDc0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTk5DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE5M0YwMUJFIg0KLQkJICAgIHdpZHRoICAgICAgCTYxNw0KLQkJICAgIGhlaWdodCAgICAgCTMyNA0KLQkJICAgIGFubm90YXRpb24gCTgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAzNDgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEzMTIsIDgxNikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzQ4DQotCQkJbG9jYXRpb24gICAJKDEwNzUsIDY5MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlBhcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkgICAgd2lkdGggICAgICAJNDkyDQotCQkgICAgaGVpZ2h0ICAgICAJMjc2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNDkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTk2RDAyRjEiDQotCQkgICAgY2xpZW50ICAgICAJQDM0OA0KLQkJICAgIHN1cHBsaWVyICAgCUAzNDcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzA0LCA2NzgpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDQsIDM4NikpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzNTANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgNjU2KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNTANCi0JCQlsb2NhdGlvbiAgIAkoMjQxLCA1MDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDE0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJICAgIHdpZHRoICAgICAgCTQzMg0KLQkJICAgIGhlaWdodCAgICAgCTMyMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzUxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE4RDEwMkJBIg0KLQkJICAgIGNsaWVudCAgICAgCUAzNTANCi0JCSAgICBzdXBwbGllciAgIAlAMzQ2DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDQ1LCA0OTUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgMzg4KSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxIiBAMzUyDQotCQkgICAgbG9jYXRpb24gICAJKDY4OCwgOTUyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRUJFMDBFMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlUGFydHMiIEAzNTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNTINCi0JCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMzI4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNTMNCi0JCQkJbG9jYXRpb24gICAJKDk1MiwgODk3KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VQYXJ0cyINCi0JCQkJcGN0RGlzdCAgICAJMC42OTc0NTINCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUNFQkYwMDYxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzUyDQotCQkJICAgIHN1cHBsaWVyICAgCUAzNDgNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgOTUyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNTMNCi0JCQkJbG9jYXRpb24gICAJKDk4NywgMTAwNSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43ODk4MDkNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoOTY3LCAxMDYxKQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjc0MjAzOA0KLQkJCQloZWlnaHQgICAgIAkxMDkNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIiIEAzNTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNTINCi0JCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMzI4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNTcNCi0JCQkJbG9jYXRpb24gICAJKDQwNCwgODkzKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUNFQkYwMDU3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzUyDQotCQkJICAgIHN1cHBsaWVyICAgCUAzNTANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg2ODgsIDk1MikNCi0JCQkJKDQ0NSwgOTUyKQ0KLQkJCQkoNDQ1LCA4MTcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDgxNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU5DQotCQkJCVBhcmVudF9WaWV3IAlAMzU3DQotCQkJCWxvY2F0aW9uICAgCSgzOTMsIDkxMikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NDc2MDQNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkpKQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5ncy5IVFRQLmNhdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5ncy5IVFRQLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwMjg4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuSFRUUC5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0Mg0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA0LjUuODA1NGEiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiaHR0cCINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIHF1aWQgICAgICAgCSIzQUJGRDlBRDAxRjgiDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIkhUVFBCaW5kaW5nIg0KLQkgICAgcXVpZCAgICAgICAJIjNBQkZFNTdDMDEzNiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTVGRjFEMDAxOSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyYiINCi0JCSAgICBxdWlkICAgICAgIAkiM0FCRkU2MEQwMERCIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiSFRUUE9wZXJhdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzQUJGRTZBRTAwNTAiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUU1RkY0QjAzN0MiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUJGRTcwRDAxNDciDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJIVFRQVXJsUmVwbGFjZW1lbnQiDQotCSAgICBxdWlkICAgICAgIAkiM0FCRkVBMUEwMTdDIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNzI4QjgwMkMzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiSFRUUFVybEVuY29kZWQiDQotCSAgICBxdWlkICAgICAgIAkiM0FCRkVBNkQwMjk0Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNzI4RDUwMDk0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiSFRUUEFkZHJlc3MiDQotCSAgICBxdWlkICAgICAgIAkiM0FDM0JGMjUwMEY1Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNUZFQTkwMUI3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FDM0JGQTcwMTJFIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiUG9ydCINCi0JICAgIHF1aWQgICAgICAgCSIzQUMxMUU1MjAxRkIiDQotCSAgICB0aXRsZSAgICAgIAkiUG9ydCINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQWRkcmVzcyIgQDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgNDMyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDEzNSwgMzUxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSFRUUEFkZHJlc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUMzQkYyNTAwRjUiDQotCQkgICAgd2lkdGggICAgICAJNDIwDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkV4dGVuc2liaWxpdHkiDQotCSAgICBxdWlkICAgICAgIAkiM0FFNUZFM0IwMzdCIg0KLQkgICAgdGl0bGUgICAgICAJIkV4dGVuc2liaWxpdHkiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDEyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDcwLCA1MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJICAgIHdpZHRoICAgICAgCTQyMg0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQWRkcmVzcyIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcyLCA0ODApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoMTI4LCA0MjgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQQWRkcmVzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBQzNCRjI1MDBGNSINCi0JCSAgICB3aWR0aCAgICAgIAkzMDYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEJpbmRpbmciIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgNjQwKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0DQotCQkJbG9jYXRpb24gICAJKDM0NCwgNTg4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSFRUUEJpbmRpbmciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRTU3QzAxMzYiDQotCQkgICAgd2lkdGggICAgICAJMjkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDMwNSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgyNzIsIDMwNSkNCi0JCQkoMjcyLCAyMTUpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUU1RkVBOTAxQjciDQotCQkgICAgY2xpZW50ICAgICAJQDMNCi0JCSAgICBzdXBwbGllciAgIAlAMg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3MiwgNDE2KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzIsIDMwNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTVGRjFEMDAxOSINCi0JCSAgICBjbGllbnQgICAgIAlANA0KLQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDc1LCA1NzYpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ3NSwgMzA1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBPcGVyYXRpb24iIEA4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDY3MiwgODE2KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4DQotCQkJbG9jYXRpb24gICAJKDUxOCwgNzY0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMwOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSFRUUE9wZXJhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBQkZFNkFFMDA1MCINCi0JCSAgICB3aWR0aCAgICAgIAkzMjYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUU1RkY0QjAzN0MiDQotCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCSAgICBzdXBwbGllciAgIAlAMg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY1NiwgNzUyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTYsIDMwNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsUmVwbGFjZW1lbnQiIEAxMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4MTYsIDk5MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQlsb2NhdGlvbiAgIAkoNjA1LCA5NDEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDIyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQVXJsUmVwbGFjZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRUExQTAxN0MiDQotCQkgICAgd2lkdGggICAgICAJNDQwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTcyOEI4MDJDMyINCi0JCSAgICBjbGllbnQgICAgIAlAMTANCi0JCSAgICBzdXBwbGllciAgIAlAMg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg2OSwgOTI5KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjksIDMwNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsRW5jb2RlZCIgQDEyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwNzIsIDExNjgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyDQotCQkJbG9jYXRpb24gICAJKDkwMCwgMTExNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNDQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkhUVFBVcmxFbmNvZGVkIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FCRkVBNkQwMjk0Ig0KLQkJICAgIHdpZHRoICAgICAgCTM2Mg0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTMNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUU3MjhENTAwOTQiDQotCQkgICAgY2xpZW50ICAgICAJQDEyDQotCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTAzLCAxMTA1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTAzLCAzMDUpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQmluZGluZyINCi0JICAgIHF1aWQgICAgICAgCSIzQUU3MkE3MDAwQTkiDQotCSAgICB0aXRsZSAgICAgIAkiQmluZGluZyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQmluZGluZyIgQDE0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMzYsIDI3MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQlsb2NhdGlvbiAgIAkoMjAwLCAyMjApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQQmluZGluZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBQkZFNTdDMDEzNiINCi0JCSAgICB3aWR0aCAgICAgIAkyOTANCi0JCSAgICBoZWlnaHQgICAgIAkxMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUE9wZXJhdGlvbiIgQDE1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3MjAsIDI3MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTUNCi0JCQlsb2NhdGlvbiAgIAkoNTE5LCAxOTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDAyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQT3BlcmF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FCRkU2QUUwMDUwIg0KLQkJICAgIHdpZHRoICAgICAgCTQyMA0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsUmVwbGFjZW1lbnQiIEAxNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODQ4LCA1OTIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2DQotCQkJbG9jYXRpb24gICAJKDYzNywgNTQxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQyMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSFRUUFVybFJlcGxhY2VtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FCRkVBMUEwMTdDIg0KLQkJICAgIHdpZHRoICAgICAgCTQ0MA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsRW5jb2RlZCIgQDE3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzODQsIDU5MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTcNCi0JCQlsb2NhdGlvbiAgIAkoMjEyLCA1NDEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzQ0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQVXJsRW5jb2RlZCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBQkZFQTZEMDI5NCINCi0JCSAgICB3aWR0aCAgICAgIAkzNjINCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKSkpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLk1JTUUuY2F0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLk1JTUUuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODQ1YTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5ncy5NSU1FLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDYzMCArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQyDQotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJtaW1lIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgcXVpZCAgICAgICAJIjNBQzkxMjdDMDI2NiINCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiTUlNRUNvbnRlbnQiDQotCSAgICBxdWlkICAgICAgIAkiM0FDOTEzNUIwM0E3Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFRjExQ0EwMzhFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUM5MTk3MTAzNkIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJNSU1FUGFydCINCi0JICAgIHF1aWQgICAgICAgCSIzQUM5MTNFRTAwRUIiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVGMTE0MDAyNTkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRThCMUFCMDE1RCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIk1JTUVNdWx0aXBhcnRSZWxhdGVkIg0KLQkgICAgcXVpZCAgICAgICAJIjNBQzkxM0ZBMDI1QiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUYxMUQ1MDMzMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIk1JTUVNaW1lWG1sIg0KLQkgICAgcXVpZCAgICAgICAJIjNBQzkxNDVBMDFGRiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUYxMUREMDM4QiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBxdWlkICAgICAgIAkiM0FFNzNCM0MwMzU2Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTczQjNEMDA5MCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzNUIwM0E3IikNCi0JCShvYmplY3QgUm9sZSAicGFydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNzNCM0QwMDlBIg0KLQkJICAgIGxhYmVsICAgICAgCSJwYXJ0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBxdWlkICAgICAgIAkiM0FFNzNCQjkwMEQ1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInBhcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTczQkI5MDNDRSINCi0JCSAgICBsYWJlbCAgICAgIAkicGFydCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNzNCQjkwM0UyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNaW1lWG1sIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTQ1QTAxRkYiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiDQotCSAgICBxdWlkICAgICAgIAkiM0FFRjEyRkUwMzg3Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUYxMzAwMDBENyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTXVsdGlwYXJ0UmVsYXRlZCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzRkEwMjVCIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWxlbWVudHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUYxMzAwMDBFMSINCi0JCSAgICBsYWJlbCAgICAgIAkiZWxlbWVudHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRVBhcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxM0VFMDBFQiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkJpbmRpbmdzIg0KLQkgICAgcXVpZCAgICAgICAJIjNBQzkxMjhCMDFGOSINCi0JICAgIHRpdGxlICAgICAgCSJCaW5kaW5ncyINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAk1Ng0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRUNvbnRlbnQiIEAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODU2LCAzMzYpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMTcxNCwgMjU1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTUlNRUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTM1QjAzQTciDQotCQkgICAgd2lkdGggICAgICAJMzAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1MDQsIDc4NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMg0KLQkJCWxvY2F0aW9uICAgCSgxMzU0LCA1NTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzAwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQYXJ0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJICAgIHdpZHRoICAgICAgCTMxOA0KLQkJICAgIGhlaWdodCAgICAgCTQ4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAzDQotCQkgICAgbG9jYXRpb24gICAJKDE3MjIsIDUwNSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUU3M0IzQzAzNTYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzI2LCAtNzI3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRTczQjNEMDA5MCINCi0JCQkgICAgY2xpZW50ICAgICAJQDMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDENCi0JCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJ0IiBANQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMjYsIC03MjcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYNCi0JCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJCWxvY2F0aW9uICAgCSgxNzQwLCA1MDgpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTk2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwYXJ0Ig0KLQkJCQlwY3REaXN0ICAgIAktMC4wOTc5MzQNCi0JCQkJaGVpZ2h0ICAgICAJMTYNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFNzNCM0QwMDlBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMg0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcNCi0JCQkJUGFyZW50X1ZpZXcgCUA1DQotCQkJCWxvY2F0aW9uICAgCSgxNzM0LCA1NjkpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNDQ5MTAzDQotCQkJCWhlaWdodCAgICAgCTQ5DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTWltZVhtbCIgQDgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyMTYsIDMyMCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOA0KLQkJCWxvY2F0aW9uICAgCSgxMDYxLCAyNjgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzEwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNSU1FTWltZVhtbCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxNDVBMDFGRiINCi0JCSAgICB3aWR0aCAgICAgIAkzMjgNCi0JCSAgICBoZWlnaHQgICAgIAkxMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAOQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzA0LCA0NjMpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFNzNCQjkwMEQ1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcnQiIEAxMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xODQsIC0xMTg1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJCWxvY2F0aW9uICAgCSgxMzExLCA0NzkpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTk2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwYXJ0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjE3Nzk0MQ0KLQkJCQloZWlnaHQgICAgIAk0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRTczQkI5MDNDRSINCi0JCQkgICAgY2xpZW50ICAgICAJQDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJCWxvY2F0aW9uICAgCSgxMjcyLCA1NTQpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjUyMjcwDQotCQkJCWhlaWdodCAgICAgCTc2DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTg0LCAtMTE4NSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUU3M0JCOTAzRTIiDQotCQkJICAgIGNsaWVudCAgICAgCUA5DQotCQkJICAgIHN1cHBsaWVyICAgCUA4DQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU11bHRpcGFydFJlbGF0ZWQiIEAxNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTI4LCAzMjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJbG9jYXRpb24gICAJKDMxMiwgMjY5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTUlNRU11bHRpcGFydFJlbGF0ZWQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiDQotCQkgICAgd2lkdGggICAgICAJNDUwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVQYXJ0IiBAMTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDUyOCwgODQ4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCWxvY2F0aW9uICAgCSgzODAsIDc2NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyOTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1JTUVQYXJ0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCWxvY2F0aW9uICAgCSgzODAsIDgyNykNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMzAzKQ0KLQkJICAgIHdpZHRoICAgICAgCTMxNA0KLQkJICAgIGhlaWdodCAgICAgCTE4Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAxNg0KLQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDU2OCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTJGRTAzODciDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDE3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTYNCi0JCQkgICAgbG9jYXRpb24gICAJKDAsIC0xMzYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFRjEzMDAwMEQ3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE0DQotCQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudHMiIEAxOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2DQotCQkJICAgIGxvY2F0aW9uICAgCSgwLCAtMTM2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE4DQotCQkJCWxvY2F0aW9uICAgCSg1MzUsIDYyNykNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbGVtZW50cyINCi0JCQkJcGN0RGlzdCAgICAJMC4zMjAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTMwMDAwRTEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTUNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMA0KLQkJCQlQYXJlbnRfVmlldyAJQDE4DQotCQkJCWxvY2F0aW9uICAgCSg0NzEsIDcxNikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43OTQxMTgNCi0JCQkJaGVpZ2h0ICAgICAJNTgNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxDQotCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJbG9jYXRpb24gICAJKDYzNiwgNzM0KQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAkxMDgNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkV4dGVuc2liaWxpdHkiDQotCSAgICBxdWlkICAgICAgIAkiM0FFNzNBQTMwMzJFIg0KLQkgICAgdGl0bGUgICAgICAJIkV4dGVuc2liaWxpdHkiDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAyMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDAwLCAxNzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQlsb2NhdGlvbiAgIAkoMTM4LCA0MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJICAgIHdpZHRoICAgICAgCTU0Mg0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDIzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ0LCAxOTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjMNCi0JCQlsb2NhdGlvbiAgIAkoMTExNSwgOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NTgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJICAgIHdpZHRoICAgICAgCTQ3Ng0KLQkJICAgIGhlaWdodCAgICAgCTM5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiIgQDI0DQotCQkgICAgbG9jYXRpb24gICAJKDg4OCwgMTgzKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAyNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJICAgIGxvY2F0aW9uICAgCSg1MzYsIDIzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNg0KLQkJCQlQYXJlbnRfVmlldyAJQDI1DQotCQkJCWxvY2F0aW9uICAgCSg3MTQsIDIyMikNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjINCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNw0KLQkJCQlQYXJlbnRfVmlldyAJQDI1DQotCQkJCWxvY2F0aW9uICAgCSg2OTQsIDIzMykNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAyOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJICAgIGxvY2F0aW9uICAgCSg1MzYsIDIzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI4DQotCQkJCWxvY2F0aW9uICAgCSg5OTYsIDIyNSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDU3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUwMTUzOA0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMA0KLQkJCQlQYXJlbnRfVmlldyAJQDI4DQotCQkJCWxvY2F0aW9uICAgCSgxMDY5LCAxMzIpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODI5NjMwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTWltZVhtbCIgQDMxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTA0LCA3ODQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxDQotCQkJbG9jYXRpb24gICAJKDEzNDksIDczMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1JTUVNaW1lWG1sIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTE0NUEwMUZGIg0KLQkJICAgIHdpZHRoICAgICAgCTMyOA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTXVsdGlwYXJ0UmVsYXRlZCIgQDMyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjQ4LCA2MDgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMyDQotCQkJbG9jYXRpb24gICAJKDEwMzIsIDU1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1JTUVNdWx0aXBhcnRSZWxhdGVkIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzRkEwMjVCIg0KLQkJICAgIHdpZHRoICAgICAgCTQ1MA0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FUGFydCIgQDMzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQwMCwgNzUyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMw0KLQkJCWxvY2F0aW9uICAgCSgyOTUsIDcwMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1JTUVQYXJ0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIg0KLQkJICAgIHdpZHRoICAgICAgCTIyOA0KLQkJICAgIGhlaWdodCAgICAgCTEyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTE0MDAyNTkiDQotCQkgICAgY2xpZW50ICAgICAJQDMzDQotCQkgICAgc3VwcGxpZXIgICAJQDIyDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRUNvbnRlbnQiIEAzNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzI4LCA5NzYpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM1DQotCQkJbG9jYXRpb24gICAJKDE1ODcsIDkyNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyODINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1JTUVDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzNUIwM0E3Ig0KLQkJICAgIHdpZHRoICAgICAgCTMwMA0KLQkJICAgIGhlaWdodCAgICAgCTEyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM2DQotCQkgICAgbG9jYXRpb24gICAJKDEzNDQsIDU0OSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTM0NCwgNTQ5KQ0KLQkJCSgxMzQ0LCAzODgpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFRjExREQwMzhCIg0KLQkJICAgIGNsaWVudCAgICAgCUAzMQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NDEsIDcyMSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU0MSwgNTQ5KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM2KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTFENTAzMzAiDQotCQkgICAgY2xpZW50ICAgICAJQDMyDQotCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM0NywgNTQ1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzQ3LCA1NDkpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzYpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRUYxMUNBMDM4RSINCi0JCSAgICBjbGllbnQgICAgIAlAMzUNCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzIyLCA5MTIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MjIsIDU0OSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzNikpKSkpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLlNPQVAuY2F0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLlNPQVAuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTZlYmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5ncy5TT0FQLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDk0NSArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQyDQotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJzb2FwIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgcXVpZCAgICAgICAJIjNBMDFDRjBDMDFBMiINCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiU09BUEJpbmRpbmciDQotCSAgICBxdWlkICAgICAgIAkiM0EwMUQzQjkwMUFEIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDlBMzgwMUFCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cmFuc3BvcnRVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNBMDFEM0RGMDFFNCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTAxRDNGMTAyOUUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTT0FQQm9keSINCi0JICAgIHF1aWQgICAgICAgCSIzQTAxREVENTAzMUYiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUUwOUE0NTAwNDEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0EwMUUyRDUwMUE1Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTkzNDc3QzAxQjIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZ1N0eWxlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0VFNEE0REIwMDcyIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJICAgIHR5cGUgICAgICAgCSJJU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNPQVBIZWFkZXJCYXNlIg0KLQkgICAgcXVpZCAgICAgICAJIjNBMDFERUU3MDM0RCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5QTNFMDMyNiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MkU5QzAwNTYiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyRUEyMDI1RCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nU3R5bGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUU0QTU4RjAxQUUiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQotCQkgICAgdHlwZSAgICAgICAJIklTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU09BUEZhdWx0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBMDZEOUZBMDBGNyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5QTRBMDAyMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTA5ODIxQTAxMkIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyMDQ4MDNBRSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nU3R5bGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUU0QTU2MzAzQUYiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQotCQkgICAgdHlwZSAgICAgICAJIklTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU09BUE9wZXJhdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzQTBBRDQ1NTAwRTgiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUUwOUE0RTAzMUYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNvYXBBY3Rpb25VUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNBMEFENDY0MDA0QSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTBBRDQ2QzAxOEMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTT0FQQWRkcmVzcyINCi0JICAgIHF1aWQgICAgICAgCSIzQUQxRkY3NTAyODciDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUUwOTUzNTAwOTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQyMTFDOTAyNUMiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTT0FQSGVhZGVyRmF1bHQiDQotCSAgICBxdWlkICAgICAgIAkiM0FENjMyQjgwM0REIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjMzMzQwMDM4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU09BUEhlYWRlciINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ2MzMwOTAxNkQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MzMzMDAxN0QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEhlYWRlckJhc2UiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMDFERUU3MDM0RCIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJJU3RyaW5nIg0KLQkgICAgcXVpZCAgICAgICAJIjNCOEREOTBDMDIyMCINCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLmxhbmcuU3RyaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjhERDkzMjAzODMiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JICAgIHF1aWQgICAgICAgCSIzQTA2RTBCNTAwMzYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0EwNkUwQjYwMEM0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCb2R5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiKQ0KLQkJKG9iamVjdCBSb2xlICJwYXJ0cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0EwNkUwQjYwMEM1Ig0KLQkJICAgIGxhYmVsICAgICAgCSJwYXJ0cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRDYyREU2MDEzMCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtZXNzYWdlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MkRFNzAwNEIiDQotCQkgICAgbGFiZWwgICAgICAJIm1lc3NhZ2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyREU3MDA1NSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRDYyREY4MDJEMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJwYXJ0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MkRGQTAwMDIiDQotCQkgICAgbGFiZWwgICAgICAJInBhcnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyREZBMDAwMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzM3MDFDRCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MzMzNzAzNzIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEhlYWRlciINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMDkwMTZEIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiaGVhZGVyRmF1bHRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MzMzNzAzNzMiDQotCQkgICAgbGFiZWwgICAgICAJImhlYWRlckZhdWx0cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyRmF1bHQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDYzMkI4MDNERCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkJpbmRpbmciDQotCSAgICBxdWlkICAgICAgIAkiM0EwMUNGMjMwMjlGIg0KLQkgICAgdGl0bGUgICAgICAJIkJpbmRpbmciDQotCSAgICB6b29tICAgICAgIAk4Nw0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkzMjQNCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCaW5kaW5nIiBAMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcyLCAyMDgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoNTUsIDEwMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNPQVBCaW5kaW5nIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwMUQzQjkwMUFEIg0KLQkJICAgIHdpZHRoICAgICAgCTQ1Mg0KLQkJICAgIGhlaWdodCAgICAgCTI0MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQT3BlcmF0aW9uIiBAMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MCwgMjA4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDgwMywgMTAwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUE9wZXJhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMEFENDU1MDBFOCINCi0JCSAgICB3aWR0aCAgICAgIAk0OTINCi0JCSAgICBoZWlnaHQgICAgIAkyNDANCi0JCSAgICBhbm5vdGF0aW9uIAk4KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyIiBAMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTYwLCA5NjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoMzk1LCA5MDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzMwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQSGVhZGVyIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMDkwMTZEIg0KLQkJICAgIHdpZHRoICAgICAgCTM0OA0KLQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyRmF1bHQiIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzYwLCA5NjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMTE0MiwgOTA3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUEhlYWRlckZhdWx0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMyQjgwM0REIg0KLQkJICAgIHdpZHRoICAgICAgCTQ1NA0KLQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEA1DQotCQkgICAgbG9jYXRpb24gICAJKDkzMywgOTYxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDYzMzM3MDFDRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3IiBANg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDUNCi0JCQkgICAgbG9jYXRpb24gICAJKDI3NywgLTU0MykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMzNzAzNzIiDQotCQkJICAgIGNsaWVudCAgICAgCUA1DQotCQkJICAgIHN1cHBsaWVyICAgCUAzDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzMsIDk2MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDczNCwgOTYxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJoZWFkZXJGYXVsdHMiIEA3DQotCQkJICAgIFBhcmVudF9WaWV3IAlANQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc3LCAtNTQzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4DQotCQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCA5MjEpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM0Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIraGVhZGVyRmF1bHRzIg0KLQkJCQlwY3REaXN0ICAgIAktMC4wMzA3MDINCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMzcwMzczIg0KLQkJCSAgICBjbGllbnQgICAgIAlANQ0KLQkJCSAgICBzdXBwbGllciAgIAlANA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTMzLCA5NjEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMzLCA5NjEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkNCi0JCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJCWxvY2F0aW9uICAgCSgxMDgwLCA5MjQpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNzM2ODQyDQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMA0KLQkJCQlQYXJlbnRfVmlldyAJQDcNCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDk5OSkNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUxDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC42MTQwMzUNCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAxMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDQ5NikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTENCi0JCQlsb2NhdGlvbiAgIAkoMTcwMSwgNDE5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI0Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCSAgICB3aWR0aCAgICAgIAkyNjQNCi0JCSAgICBoZWlnaHQgICAgIAkxNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEhlYWRlckJhc2UiIEAxMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MCwgNTI4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMg0KLQkJCWxvY2F0aW9uICAgCSg3OTQsIDQyMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0OTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNPQVBIZWFkZXJCYXNlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIg0KLQkJICAgIHdpZHRoICAgICAgCTUxMA0KLQkJICAgIGhlaWdodCAgICAgCTI0MA0KLQkJICAgIGFubm90YXRpb24gCTgpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDEzDQotCQkgICAgbG9jYXRpb24gICAJKDE0OTMsIDQ4NSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MkRFNjAxMzAiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibWVzc2FnZSIgQDE0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDM0MSwgLTY4MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU3NCwgNTE1KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21lc3NhZ2UiDQotCQkJCXBjdERpc3QgICAgCTAuNDEyMzIyDQotCQkJCWhlaWdodCAgICAgCTMwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDYyREU3MDA0QiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ5MywgNDg1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MiwgNDg1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNg0KLQkJCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJCWxvY2F0aW9uICAgCSgxNjMwLCA0NDgpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjg3MjA0DQotCQkJCWhlaWdodCAgICAgCTM4DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzQxLCAtNjgzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOA0KLQkJCQlQYXJlbnRfVmlldyAJQDE3DQotCQkJCWxvY2F0aW9uICAgCSgxNDIwLCA1MjUpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC4zNzIyNTQNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENjJERTcwMDU1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkzLCA0ODUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk1LCA0ODUpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCb2R5IiBAMTkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwNDAsIDEzNDQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE5DQotCQkJbG9jYXRpb24gICAJKDc5NCwgMTIzNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0OTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNPQVBCb2R5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRDUwMzFGIg0KLQkJICAgIHdpZHRoICAgICAgCTUxMA0KLQkJICAgIGhlaWdodCAgICAgCTI0MA0KLQkJICAgIGFubm90YXRpb24gCTgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAyMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODI0LCAxMjAwKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMA0KLQkJCWxvY2F0aW9uICAgCSgxNjI4LCA5NTYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzkyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQYXJ0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJICAgIHdpZHRoICAgICAgCTQxMA0KLQkJICAgIGhlaWdodCAgICAgCTUxMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAyMQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTkwLCA3MDQpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjJERjgwMkQxIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcnQiIEAyMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxDQotCQkJICAgIGxvY2F0aW9uICAgCSg0MzgsIC00NjQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzDQotCQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQkJbG9jYXRpb24gICAJKDE5MTcsIDg4NikNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTIwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwYXJ0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjg4MTQ2NQ0KLQkJCQloZWlnaHQgICAgIAk5MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MkRGQTAwMDIiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjANCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTkwLCA3MDQpDQotCQkJCSgxODI3LCA3MDQpDQotCQkJCSgxODI3LCA5NDQpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU5MCwgNzA0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNywgOTQ0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNA0KLQkJCQlQYXJlbnRfVmlldyAJQDIyDQotCQkJCWxvY2F0aW9uICAgCSgxNzc0LCA4ODYpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODgxNDY1DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAMjUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDM4LCAtNDY0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNg0KLQkJCQlQYXJlbnRfVmlldyAJQDI1DQotCQkJCWxvY2F0aW9uICAgCSgxMjA5LCA3NDYpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTIwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENjJERkEwMDAzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjENCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTU5MCwgNzA0KQ0KLQkJCQkoMTE3MCwgNzA0KQ0KLQkJCQkoMTE3MCwgNjQ4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1OTAsIDcwNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNzAsIDY0OCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMjcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ1NywgMTM5MCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTA2RTBCNTAwMzYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDI4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjcNCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNSwgLTkxNCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQTA2RTBCNjAwQzQiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NTcsIDEzOTApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk1LCAxMzkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJ0cyIgQDI5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjcNCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNSwgLTkxNCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzANCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU5MSwgMTQ5NCkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU5DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwYXJ0cyINCi0JCQkJcGN0RGlzdCAgICAJMC44MzM4NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTA0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBMDZFMEI2MDBDNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NywgMTM5MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTksIDEzOTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxDQotCQkJCVBhcmVudF9WaWV3IAlAMjkNCi0JCQkJbG9jYXRpb24gICAJKDE1OTEsIDEzNDQpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuODMzODU2DQotCQkJCWhlaWdodCAgICAgCTQ3DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQRmF1bHQiIEAzMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MCwgMTY0OCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQlsb2NhdGlvbiAgIAkoNzk0LCAxNTQwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUEZhdWx0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwNkQ5RkEwMEY3Ig0KLQkJICAgIHdpZHRoICAgICAgCTUxMA0KLQkJICAgIGhlaWdodCAgICAgCTI0MA0KLQkJICAgIGFubm90YXRpb24gCTgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OklTdHJpbmciIEAzMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDAsIDEzNjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJbG9jYXRpb24gICAJKDY2LCAxMzMyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM0OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSVN0cmluZyIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJbG9jYXRpb24gICAJKDY2LCAxMjgyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzQ4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhERDkwQzAyMjAiDQotCQkgICAgd2lkdGggICAgICAJMzY2DQotCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MCwgNzUwKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxMg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMDQwLCA3NTApDQotCQkJKDEwNDAsIDY0OCkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMzMDAxN0QiDQotCQkgICAgY2xpZW50ICAgICAJQDMNCi0JCSAgICBzdXBwbGllciAgIAlAMTINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDUsIDg5NSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ1LCA3NTApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzQpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDYzMzM0MDAzOCINCi0JCSAgICBjbGllbnQgICAgIAlANA0KLQkJICAgIHN1cHBsaWVyICAgCUAxMg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzMTYsIDg5NSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxNiwgNzUwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM0KSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJQb3J0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBMDg1RTMwMDM1QyINCi0JICAgIHRpdGxlICAgICAgCSJQb3J0Ig0KLQkgICAgem9vbSAgICAgICAJOTANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEFkZHJlc3MiIEAzNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzUyLCAzMjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM3DQotCQkJbG9jYXRpb24gICAJKDE1MSwgMjM5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUEFkZHJlc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQxRkY3NTAyODciDQotCQkgICAgd2lkdGggICAgICAJNDIwDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkV4dGVuc2liaWxpdHkiDQotCSAgICBxdWlkICAgICAgIAkiM0FFMDk5QjEwMTYxIg0KLQkgICAgdGl0bGUgICAgICAJIkV4dGVuc2liaWxpdHkiDQotCSAgICB6b29tICAgICAgIAk5MA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQQWRkcmVzcyIgQDM4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDU3NikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzgNCi0JCQlsb2NhdGlvbiAgIAkoMTM3MSwgNTI3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI5OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUEFkZHJlc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQxRkY3NTAyODciDQotCQkgICAgd2lkdGggICAgICAJMzE2DQotCQkgICAgaGVpZ2h0ICAgICAJMTIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCaW5kaW5nIiBAMzkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA0LCA1OTIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM5DQotCQkJbG9jYXRpb24gICAJKDE2MiwgNTQzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI4NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUEJpbmRpbmciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxRDNCOTAxQUQiDQotCQkgICAgd2lkdGggICAgICAJMzAyDQotCQkgICAgaGVpZ2h0ICAgICAJMTIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCb2R5IiBANDANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MiwgMTEwNCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDANCi0JCQlsb2NhdGlvbiAgIAkoOTUwLCAxMDU1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI0NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUEJvZHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiDQotCQkgICAgd2lkdGggICAgICAJMjYyDQotCQkgICAgaGVpZ2h0ICAgICAJMTIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBGYXVsdCIgQDQxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyMzIsIDEyNjQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQxDQotCQkJbG9jYXRpb24gICAJKDExMTIsIDEyMTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjQwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQRmF1bHQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTA2RDlGQTAwRjciDQotCQkgICAgd2lkdGggICAgICAJMjU4DQotCQkgICAgaGVpZ2h0ICAgICAJMTIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBPcGVyYXRpb24iIEA0Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MTIsIDc1MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQlsb2NhdGlvbiAgIAkoMzQ0LCA3MDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzM2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQT3BlcmF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwQUQ0NTUwMEU4Ig0KLQkJICAgIHdpZHRoICAgICAgCTM1NA0KLQkJICAgIGhlaWdodCAgICAgCTEyMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSIgQDQzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDgxNiwgOTI4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCWxvY2F0aW9uICAgCSg2MjcsIDg3OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNPQVBIZWFkZXJCYXNlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIg0KLQkJICAgIHdpZHRoICAgICAgCTM5Ng0KLQkJICAgIGhlaWdodCAgICAgCTEyMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDQ0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjA4LCAxMjgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDQNCi0JCQlsb2NhdGlvbiAgIAkoNDA4LCA1MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJICAgIHdpZHRoICAgICAgCTQxOA0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQ1DQotCQkgICAgbG9jYXRpb24gICAJKDYwOCwgMzA1KQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUA0NA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg2MDgsIDMwNSkNCi0JCQkoNjA4LCAyMTUpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDlBMzgwMUFCIg0KLQkJICAgIGNsaWVudCAgICAgCUAzOQ0KLQkJICAgIHN1cHBsaWVyICAgCUA0NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM0NCwgNTMxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNDQsIDMwNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0NSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDlBM0UwMzI2Ig0KLQkJICAgIGNsaWVudCAgICAgCUA0Mw0KLQkJICAgIHN1cHBsaWVyICAgCUA0NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgxNSwgODY3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTUsIDMwNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0NSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDlBNDUwMDQxIg0KLQkJICAgIGNsaWVudCAgICAgCUA0MA0KLQkJICAgIHN1cHBsaWVyICAgCUA0NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjgsIDEwNDMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjgsIDMwNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0NSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDlBNEUwMzFGIg0KLQkJICAgIGNsaWVudCAgICAgCUA0Mg0KLQkJICAgIHN1cHBsaWVyICAgCUA0NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDUwNiwgNjkxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDYsIDMwNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0NSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUwDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDlBNEEwMDIwIg0KLQkJICAgIGNsaWVudCAgICAgCUA0MQ0KLQkJICAgIHN1cHBsaWVyICAgCUA0NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDEyMDMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDMwNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0NSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDk1MzUwMDk4Ig0KLQkJICAgIGNsaWVudCAgICAgCUAzOA0KLQkJICAgIHN1cHBsaWVyICAgCUA0NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1MjAsIDUxNSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyMCwgMzA1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KSkpKSkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL2h0dHAubWRsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9odHRwLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjZTc5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL2h0dHAubWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIzODMgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0Mg0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA0LjUuODA1NGEiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMNCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwDQotCWxlZnRNYXJnaW4gCTAuMjUwMDAwDQotCXRvcE1hcmdpbiAgCTAuMjUwMDAwDQotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDANCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwDQotCWNsaXBJY29uTGFiZWxzIAlUUlVFDQotCWF1dG9SZXNpemUgCVRSVUUNCi0Jc25hcFRvR3JpZCAJVFJVRQ0KLQlncmlkWCAgICAgIAkxNg0KLQlncmlkWSAgICAgIAkxNg0KLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250DQotCSAgICBzaXplICAgICAgIAkxMA0KLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JICAgIGNvbG9yICAgICAgCTANCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCXNob3dNZXNzYWdlTnVtIAkxDQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFDQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikNCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciDQotCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxNTEiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxOEMiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTUwIg0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyINCi0JcXVpZHUgICAgICAJIjNBQkZEOUE3MDE1MiINCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImh0dHAiDQotCQlxdWlkICAgICAgIAkiM0FCRkQ5QUQwMUY4Ig0KLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzcyAiSFRUUEJpbmRpbmciDQotCQkJcXVpZCAgICAgICAJIjNBQkZFNTdDMDEzNiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUU1RkYxRDAwMTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0M0YxMDNDMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBCaW5kaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQzQTcwMkVCIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyYiINCi0JCQkJcXVpZCAgICAgICAJIjNBQkZFNjBEMDBEQiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJIVFRQT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQUJGRTZBRTAwNTAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFNUZGNEIwMzdDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSI0MDk4NDQ0NjAyQ0MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQzRkYwMkJCIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQUJGRTcwRDAxNDciDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSFRUUFVybFJlcGxhY2VtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQUJGRUExQTAxN0MiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFNzI4QjgwMkMzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSI0MDk4NDREMjAyQzUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQVXJsUmVwbGFjZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDQ5NjAwRDgiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSFRUUFVybEVuY29kZWQiDQotCQkJcXVpZCAgICAgICAJIjNBQkZFQTZEMDI5NCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUU3MjhENTAwOTQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0NDkxMDAwOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBVcmxFbmNvZGVkIg0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQ0NTcwMDYzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkhUVFBBZGRyZXNzIg0KLQkJCXF1aWQgICAgICAgCSIzQUMzQkYyNTAwRjUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFNUZFQTkwMUI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSI0MDk4NDBEODAwQzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQQWRkcmVzcyINCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0MDg5MDFBMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0FDM0JGQTcwMTJFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklIVFRQQWRkcmVzcyINCi0JCQlxdWlkICAgICAgIAkiNDA5ODQwODkwMUExIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MiDQotCQkJCXF1aWQgICAgICAgCSI0MDk4NDBBNDAxM0EiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUhUVFBCaW5kaW5nIg0KLQkJCXF1aWQgICAgICAgCSI0MDk4NDNBNzAyRUIiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0M0NBMDE3NyINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJJSFRUUE9wZXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiNDA5ODQzRkYwMkJCIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0NDEzMDIwNCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJJSFRUUFVybEVuY29kZWQiDQotCQkJcXVpZCAgICAgICAJIjQwOTg0NDU3MDA2MyINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIg0KLQkJCQlxdWlkICAgICAgIAkiNDA5ODQ0NkQwMjFDIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklIVFRQVXJsUmVwbGFjZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjQwOTg0NDk2MDBEOCINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0NEFDMDFBQiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikpDQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiUG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0FDMTFFNTIwMUZCIg0KLQkJCXRpdGxlICAgICAgCSJQb3J0Ig0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEFkZHJlc3MiIEAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjcyLCA3ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzEsIDcwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQQWRkcmVzcyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUMzQkYyNTAwRjUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzEsIDc2MykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOSkNCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBBZGRyZXNzIiBAMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY3MiwgMjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4LCAyMjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklIVFRQQWRkcmVzcyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzgsIDE3OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0MDg5MDFBMSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOCwgMjg5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA2NSkNCi0JCQkJd2lkdGggICAgICAJMTA4Ng0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQwRDgwMEM0Ig0KLQkJCQljbGllbnQgICAgIAlAMQ0KLQkJCQlzdXBwbGllciAgIAlAMg0KLQkJCQlsaW5lX3N0eWxlIAkwKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIkV4dGVuc2liaWxpdHkiDQotCQkJcXVpZCAgICAgICAJIjNBRTVGRTNCMDM3QiINCi0JCQl0aXRsZSAgICAgIAkiRXh0ZW5zaWJpbGl0eSINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBANA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MCwgNTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQWRkcmVzcyIgQDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA0ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDQyOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQQWRkcmVzcyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUMzQkYyNTAwRjUiDQotCQkJCXdpZHRoICAgICAgCTMwNg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBCaW5kaW5nIiBANg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDY0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM0NCwgNTg4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQkZFNTdDMDEzNiINCi0JCQkJd2lkdGggICAgICAJMjkwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3DQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDMwNSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyNzIsIDMwNSkNCi0JCQkJICAgICgyNzIsIDIxNSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFNUZFQTkwMUI3Ig0KLQkJCQljbGllbnQgICAgIAlANQ0KLQkJCQlzdXBwbGllciAgIAlANA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA0MTYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzIsIDMwNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTVGRjFEMDAxOSINCi0JCQkJY2xpZW50ICAgICAJQDYNCi0JCQkJc3VwcGxpZXIgICAJQDQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3NSwgNTc2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDc1LCAzMDUpDQotCQkJCWRyYXdTdXBwbGllciAJQDcpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUE9wZXJhdGlvbiIgQDEwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY3MiwgODE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUxOCwgNzY0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FCRkU2QUUwMDUwIg0KLQkJCQl3aWR0aCAgICAgIAkzMjYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUU1RkY0QjAzN0MiDQotCQkJCWNsaWVudCAgICAgCUAxMA0KLQkJCQlzdXBwbGllciAgIAlANA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjU2LCA3NTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTYsIDMwNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsUmVwbGFjZW1lbnQiIEAxMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MDUsIDk0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQVXJsUmVwbGFjZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FCRkVBMUEwMTdDIg0KLQkJCQl3aWR0aCAgICAgIAk0NDANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUU3MjhCODAyQzMiDQotCQkJCWNsaWVudCAgICAgCUAxMg0KLQkJCQlzdXBwbGllciAgIAlANA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY5LCA5MjkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjksIDMwNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsRW5jb2RlZCIgQDE0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTAwLCAxMTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBVcmxFbmNvZGVkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQkZFQTZEMDI5NCINCi0JCQkJd2lkdGggICAgICAJMzYyDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFNzI4RDUwMDk0Ig0KLQkJCQljbGllbnQgICAgIAlAMTQNCi0JCQkJc3VwcGxpZXIgICAJQDQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMDMsIDExMDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTAzLCAzMDUpDQotCQkJCWRyYXdTdXBwbGllciAJQDcpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiQmluZGluZyINCi0JCQlxdWlkICAgICAgIAkiM0FFNzJBNzAwMEE5Ig0KLQkJCXRpdGxlICAgICAgCSJCaW5kaW5nIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEJpbmRpbmciIEAxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgNTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0MCwgNTQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQkZFNTdDMDEzNiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NDAsIDYwMCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NSkNCi0JCQkJd2lkdGggICAgICAJMjkwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUE9wZXJhdGlvbiIgQDE3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY5NiwgNjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDUyNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQT3BlcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQkZFNkFFMDA1MCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCA1ODcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDkpDQotCQkJCXdpZHRoICAgICAgCTQyMA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxSZXBsYWNlbWVudCIgQDE4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYxNiwgMTgwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDA1LCAxNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBVcmxSZXBsYWNlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUJGRUExQTAxN0MiDQotCQkJCXdpZHRoICAgICAgCTQ0MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxFbmNvZGVkIiBAMTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDE1MjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDM2LCAxNDY5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBVcmxFbmNvZGVkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQkZFQTZEMDI5NCINCi0JCQkJd2lkdGggICAgICAJMzYyDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBCaW5kaW5nIiBAMjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgMTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEwNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSFRUUEJpbmRpbmciKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwLCA1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0M0E3MDJFQiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgMTYxKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA1MCkNCi0JCQkJd2lkdGggICAgICAJMTA3MA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0M0YxMDNDMCINCi0JCQkJY2xpZW50ICAgICAJQDE2DQotCQkJCXN1cHBsaWVyICAgCUAyMA0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQT3BlcmF0aW9uIiBAMjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjk2LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1MCwgMTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEwOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSFRUUE9wZXJhdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1MCwgNTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEwOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDNGRjAyQkIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1MCwgMTYxKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA5MCkNCi0JCQkJd2lkdGggICAgICAJMTExMA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0NDQ2MDJDQyINCi0JCQkJY2xpZW50ICAgICAJQDE3DQotCQkJCXN1cHBsaWVyICAgCUAyMg0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQVXJsRW5jb2RlZCIgQDI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjA4LCAxMTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCAxMDQ1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSFRUUFVybEVuY29kZWQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCA5OTUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDQ1NzAwNjMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDExMDUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTI1KQ0KLQkJCQl3aWR0aCAgICAgIAkxMTQ2DQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQ0OTEwMDA5Ig0KLQkJCQljbGllbnQgICAgIAlAMTkNCi0JCQkJc3VwcGxpZXIgICAJQDI0DQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBVcmxSZXBsYWNlbWVudCIgQDI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTM3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5ODEsIDEzMTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTIwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklIVFRQVXJsUmVwbGFjZW1lbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk4MSwgMTI2NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTIwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0NDk2MDBEOCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5ODEsIDEzNzcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjAzKQ0KLQkJCQl3aWR0aCAgICAgIAkxMjI0DQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQ0RDIwMkM1Ig0KLQkJCQljbGllbnQgICAgIAlAMTgNCi0JCQkJc3VwcGxpZXIgICAJQDI2DQotCQkJCWxpbmVfc3R5bGUgCTApKSkpKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCINCi0JCXF1aWQgICAgICAgCSIzQURGQjhFNTAyMUUiDQotCQlkb2N1bWVudGF0aW9uIAkNCi18VGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuDQotfA0KLXxXU0RMIGRlc2NyaWJlcyBuZXR3b3JrIHNlcnZpY2VzIGFzIHNldHMgb2YgZW5kcG9pbnRzIG9wZXJhdGluZyBvbiBtZXNzYWdlcy4gVGhlIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGFyZSBkZXNjcmliZWQgYWJzdHJhY3RseSwgYW5kIHRoZW4gYm91bmQgdG8gYSBjb25jcmV0ZSBuZXR3b3JrIHByb3RvY29sIGFuZCBtZXNzYWdlIGZvcm1hdCB0byBkZWZpbmUgYW4gZW5kcG9pbnQuDQotfA0KLXxXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLg0KLXwNCi18VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkNCi18LSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUNCi18LSAyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmcsIHNob3dzIHRoZSBuYW1lc3BhY2UgYW5kIGltcG9ydCBtZWNoYW5pc20NCi18LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQ0KLXwtIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwNCi18LSAyLjMgTWVzc2FnZXMsIDIuNCBQb3J0VHlwZXMsIDIuNSBCaW5kaW5ncyBhbmQgMi43IFNlcnZpY2VzLCBzaG93IHRoZSBtYWpvciBXU0RMIGVsZW1lbnRzIGFuZCB0aGVpciByZWxhdGlvbnMuDQotfA0KLXxUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4NCi0JCQ0KLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzcyAiV1NETEVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDNkEzMDJERCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBsYW5ndWFnZSBlbGVtZW50LiINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyOTYwMEM4Ig0KLQkJCQlyZXN1bHQgICAgIAkiRGVmaW5pdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyQjgwMzQ3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZGVmaW5pdGlvbiINCi0JCQkJCXR5cGUgICAgICAgCSJEZWZpbml0aW9uIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDQ0U0NDM2MDJBMyINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Y5N0RCRDMwMjA3Ig0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIg0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydFR5cGUiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0VHlwZSBlbGVtZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjEgYW5kIGFuIEludGVyZmFjZSBjb21wb25lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMi4gQSBwb3J0IHR5cGUgb3IgSW50ZXJmYWNlIGlzIGEgbmFtZWQgc2V0IG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgYW5kIHRoZSBhYnN0cmFjdCBtZXNzYWdlcyBpbnZvbHZlZC4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM5QjcwMTUwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZEODAxOUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4OEUwMDIzIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFFMzAxRTUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0RFQjAzMTYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRGRDAxQkEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRTlERTk4MDAzQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRTIwMTcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3R5bGUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiDQotCQkJCXR5cGUgICAgICAgCSJPcGVyYXRpb25UeXBlIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCREQ5NjQzMDA0QyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMjM1MDAzRSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTIyMDFBRCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTIwMDExQiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbWVzc2FnZSBlbGVtZW50LiBBIFdTREwgbWVzc2FnZSBpcyBhbiBhYnN0cmFjdCwgdHlwZWQgZGVmaW5pdGlvbiBvZiB0aGUgZGF0YSBiZWluZyBjb21tdW5pY2F0ZWQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMDU1MDFDNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4RDEwMkJBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4N0MwMUZFIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFEMjAyMjYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0U0QjAyQjAiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDU0MjAwRjEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUGFydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTZEMDJGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTdFMjMwMjM3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBCNzAzQzgiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50TmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMDg3MDNEQiINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBDMzAzQzUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEwRjAyRjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRjQwMUEzIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNkQwMTUxIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0REYwMzVDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDYwMDkyMDJGNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5QzRDQjAxOTkiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiU2VydmljZSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEyMDAyNUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTRFMDFCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0OEE0MDE1MSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYyMEQwMjAzIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0ODEwMjIwIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0QzUwMUUyIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENjAwQ0IwMEFBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0NTAyQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUEwMDM5MSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjE0OTAzRDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjUzNTAyQzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQUY5NTQzQzAwNzMiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCODVCMjFBMDI3MSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkRCODAzRDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMUY4MDM4MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDRDE0RkMyMDEyQiINCi0JCQkJcmVzdWx0ICAgICAJIkRPTURvY3VtZW50Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwREUwMUU3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnQiDQotCQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNDc0MDA0RSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiNDAzNTJCN0MwMzk2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg1NzAyRjUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwMEQwMDBEIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkltcG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RUU1ODAzN0EiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDBEMDM0MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM3OSINCi0JCQkJcmVzdWx0ICAgICAJIlhTRFNjaGVtYSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRTY2hlbWEiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NzJDMTAzOTciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzY2hlbWEiDQotCQkJCQl0eXBlICAgICAgIAkiWFNEU2NoZW1hIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTUwQTAwMzYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTE0MDIxMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmxlRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCWRvY3VtZW50YXRpb24gCSIgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkUzQzAzRDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxMkMwM0NEIg0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzE0NzAyOTUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRFbGVtZW50Ig0KLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQuIEFuIGlucHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTA0MDI1RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMjgwMkU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkVFMDMxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUlucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk91dHB1dCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTBDMDM1QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMzUwMEREIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkY4MDFDRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQuIEZhdWx0IGVsZW1lbnRzIHNwZWNpZnkgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgYmUgb3V0cHV0IGFzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFMUM4MjAwMkYyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzRDAzMTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjIwMDIwMDJEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ0lucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gaW5wdXQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMUIwMTEzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNTlCMDA3MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0E0MDIwMyINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0I1MDNBMiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklJbnB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMUVBMDIwRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNDMwMkFCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QjVBNDAyN0UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzRDkwMEYxIg0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNGMTAzMjYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMjAyMDBCRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nRmF1bHQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkzODYwMkM5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU3MTAzMzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDEzMDM3RiINCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDIxMDEwOSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVCRjlFMDE0QSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJRTmFtZSINCi0JCQlxdWlkICAgICAgIAkiM0FFOEVEMjIwMTQwIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUU5hbWUgY2xhc3MuIEEgUU5hbWUgaXMgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0OURBOTAwM0QiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiTmFtZXNwYWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5hbWVzcGFjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGluIGEgV1NETCBkb2N1bWVudC4iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNEMjkwMUIxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlZml4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNEMzIwMjM2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk9wZXJhdGlvblR5cGUiDQotCQkJcXVpZCAgICAgICAJIjNBRUI0NzgyMDI0RiINCi0JCQlkb2N1bWVudGF0aW9uIAkNCi18T05FX1dBWT0xDQotfFJFUVVFU1RfUkVTUE9OU0U9Mg0KLXxTT0xJQ0lUX1JFU1BPTlNFPTMNCi18Tk9USUZJQ0FUSU9OPTQNCi0JCQkNCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMzNTMwM0UzIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0VHlwZSINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE1QkUwMzMxIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZBQzEwMUNBIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkJBRjAxQTQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkY3MDMxQSINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBNjMyMDAwRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTc3NjAwRDEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM0MjAwNjUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCINCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzU5MDI4RiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNzEwMkIxIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzgxMDFCMCINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDOTkwMzFEIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyT3JkZXIiDQotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NEU1MDE4RCINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkM0MDEwNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklJbnB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkU0MDA5NCINCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRjAwMUQyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklPdXRwdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE3OTkwMTJCIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3RUUwMDE1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzMxMDBFRiINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjM0NzAyNzciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLklucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MDAwMDM5Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBODI5MDI3RCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0M0EwMzVEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDQ1MDFDOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MzkwMUQ1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4NjEwMzFEIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDZBMDBCRCINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ3NTAxMzEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4NzEwMjA4Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklNZXNzYWdlIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QThBRjAwNEYiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5NZXNzYWdlIG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjI0MDI3MyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnQiDQotCQkJCQl0eXBlICAgICAgIAkiSVBhcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyM0QwMjMzIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQYXJ0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyNTQwMjVFIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcmRlcmVkUGFydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI2MTAyMEQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0T3JkZXIiDQotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5NZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4QkMwMjYwIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQYXJ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTkzRjAxQkUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5QYXJ0IG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4NDUwMDUyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidmFsdWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJZXhjZXB0aW9ucyAJIldTRExFeGNlcHRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEwMTAxQzMiDQotCQkJCXJlc3VsdCAgICAgCSJJSXRlcmF0b3IiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjhBMkQwMkQ1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiUU5hbWUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTk1MDAyMzEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVNlcnZpY2UiDQotCQkJcXVpZCAgICAgICAJIjNCODRBQjQ5MDI4NyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RDU2MDFEMSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnQiDQotCQkJCQl0eXBlICAgICAgIAkiSVBvcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REEyMDAzNiINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REIwMDFCQyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjVCMDAzRSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJUG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCODAwMzI2Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUxRjMwMkI1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MjYzMDJGMiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjhDMDAxNiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZyINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGMTYwMTUzIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ09wZXJhdGlvbiINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUY1MDAwNjYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGQTQwMUM1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTJBOTAyODQiDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTJCRTAxQTgiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSINCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQkNGMDMwMiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ09wZXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEQzAwMDcyIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBCQzAwNDEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nRmF1bHQiDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEQ5MDA5RCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBGQzAwNjEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzJEMDAxNyINCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzM0YwMzdCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUwOTAwREEiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTFEMDA3RiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdJbnB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0lucHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTM0MDM0OSINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTU0NzAyQTYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3V0cHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3V0cHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QURDQjAyMUMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFERUIwMTAwIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0lucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERkUwMDBEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUUyMTAxMTEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTJEMDA1MCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0ZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUU0RjAwQkQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU1RjAwMkEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFGMzIwM0RCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFGNTYwMjkyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxMjQwMkFCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxMzUwM0QxIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QjFEOTAxNDIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODhGMTAzOUQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIg0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkSW1wb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NDkwMjU5Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW1wb3J0RGVmIg0KLQkJCQkJdHlwZSAgICAgICAJIklJbXBvcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NkUwMDVFIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTg0MDA0QiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUM1MDA0NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIg0KLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlFNDAxRUUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzZXJ2aWNlIg0KLQkJCQkJdHlwZSAgICAgICAJIklTZXJ2aWNlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMTcwMzhDIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEEzMjAyODYiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE0NjAxM0IiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNUMwMEIwIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUZFMDM3QyINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNzUwMkU3Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUltcG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTgzMDE0QyINCi0JCQkJcmVzdWx0ICAgICAJIklJbXBvcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE5RDAzM0UiDQotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUFGMDI1NCINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUMyMDNDNCINCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRTgwMEVEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRjgwMjZEIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjA4MDFEQSINCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMTUwMzlCIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIzMjAxM0EiDQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCNDIwMDc1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ3MiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI5MjAzNDEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJDRDAwNjAiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJFNzAxNDQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDMTcwMTA3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMzRTAwMUQiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzYyMDE0QiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2VzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNzQwMTE1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0JFMDA3MSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OENEQTAxQzYiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFByZWZpeCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0ZEMDAxNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThEMjMwMEE4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQzQjAzQ0UiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1QjgwMTJCIg0KLQkJCQlyZXN1bHQgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RDcwM0JCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnRCYXNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RkUwMjA4Ig0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50QmFzZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENjE4MDMyOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50QmFzZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDU2MDA4MCINCi0JCQkJcmVzdWx0ICAgICAJIklUeXBlcyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVTZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwN0UwMDRDIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEJBMDM1NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwRDgwMjlBIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZU1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBGQTAzMDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDZGMDMxQiINCi0JCQkJcmVzdWx0ICAgICAJIklUeXBlcyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDk1MDBFRSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInR5cGVzIg0KLQkJCQkJdHlwZSAgICAgICAJIklUeXBlcyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5EZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRTcwMkExIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbXBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNCODRCMjAyMDExOSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkltcG9ydCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkltcG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMjBDMDJFQSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJTGlzdCINCi0JCQlxdWlkICAgICAgIAkiM0I4NUMwQTIwM0M1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMwQUYwMjk3Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklNYXAiDQotCQkJcXVpZCAgICAgICAJIjNCODk2QjAzMDBENCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5NYXAiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkIxMTAyQjUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVVSTCINCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1NjMwMjc0Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS5uZXQuVVJMIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLm5ldC5VUkwiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU2RTAzRTIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg5RDU5MzAyQTUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENTlGMDJFOCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0QzQjAzODAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyINCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0YzODAzRTYiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWFzIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBRENGN0UwMzAxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUl0ZXJhdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQzQ2ODdEQTAxNjciDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5JdGVyYXRvciINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4ODA4MDBCOSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRXhjZXB0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQzQ2ODk2NTAzMTMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeGNlcHRpb24gY2xhc3MuIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLldTRExFeGNlcHRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODk3NDAzMTUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JCMjAwNTAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5UeXBlcyBub24tTU9GIGludGVyZmFjZSINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuVHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JGMTAxNzMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0NCMjRBRUMwMUNCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0NDMzYwRDcwMzlDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MjdGMDBCNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDRDE1MDJDMDIzQiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwNjAwMTgyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJcXVpZCAgICAgICAJIjNGNjc3MURCMDJEQyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjc2MkE2QTAzMDgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNGNjc4MEEwMDFBQiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlByb3RlY3RlZCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIg0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MjQwMThDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUMzIg0KLQkJCQlsYWJlbCAgICAgIAkicG9ydFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDODI3MDFDRCINCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRTAwRTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDRUJGMDA1NyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDYxIg0KLQkJCQlsYWJlbCAgICAgIAkiZVBhcnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyINCi0JCQlxdWlkICAgICAgIAkiM0FENUQzNTIwMTBGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMzU0MDE3NiINCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxODAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQzRTEwMTc5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMjUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIzOSINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciDQotCQkJcXVpZCAgICAgICAJIjNBRDVENDI1MDM4QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkY1Ig0KLQkJCQlsYWJlbCAgICAgIAkiZU9wZXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkZGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOTQwMDM5MyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUMiDQotCQkJCWxhYmVsICAgICAgCSJlUG9ydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOUI4MDExRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI0RCINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI2MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMyINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2MDMwMUUyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2MDQwMEI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQzEiDQotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2NzEwMTA0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzIwMzRBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzIwMzU0Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNyINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2NzcwMDk1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzgwMzcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ3MiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzN0IiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOSINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2N0IwMzExIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2N0QwMDdGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlU2VydmljZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwODkiDQotCQkJCWxhYmVsICAgICAgCSJlU2VydmljZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMSINCi0JCQlxdWlkICAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJCWxhYmVsICAgICAgCSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMiDQotCQkJcXVpZCAgICAgICAJIjNBREYyRTY0MDFGNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUxIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdJbnB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSINCi0JCQlxdWlkICAgICAgIAkiM0FERjJFQjMwMTYzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNDIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3Ig0KLQkJCXF1aWQgICAgICAgCSIzQURGMkY5NDAyNEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUlucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTkwIg0KLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkY5NTAxOUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOSINCi0JCQlxdWlkICAgICAgIAkiM0FERjJGQjgwMkY5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEEiDQotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEiDQotCQkJcXVpZCAgICAgICAJIjNBREYzMzE2MDFBNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjMzMTgwMzg3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzIiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMyINCi0JCQlxdWlkICAgICAgIAkiM0FERjM0MDAwM0U1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nRmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FBIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdGYXVsdHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNSINCi0JCQlxdWlkICAgICAgIAkiM0FFMDkxRjQwMkYzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRSINCi0JCQkJbGFiZWwgICAgICAJImVGYXVsdCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzciDQotCQkJcXVpZCAgICAgICAJIjNBRUEzRDU1MDAyRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzOCINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMyOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZU5hbWVzcGFjZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMzIiDQotCQkJCWxhYmVsICAgICAgCSJlTmFtZXNwYWNlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzkiDQotCQkJcXVpZCAgICAgICAJIjNBRUEzRTNBMDAyRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFFOCINCi0JCQkJbGFiZWwgICAgICAJImVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MCINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFGMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQxIg0KLQkJCXF1aWQgICAgICAgCSIzQUVBNDEyRjAwMzUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjU1Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjVGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDMiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRDI0MDBCRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNTAwODMiDQotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3OTAwRjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RCINCi0JCQkJbGFiZWwgICAgICAJImVPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDYiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3QTAxNEUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDciDQotCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDBDNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMyNyINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0OCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0OSINCi0JCQlxdWlkICAgICAgIAkiM0I4QjFDMTIwM0IyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQzE0MDAxQyINCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDI2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUxIg0KLQkJCXF1aWQgICAgICAgCSIzQjhCMURDQzAyRTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3MCINCi0JCQkJbGFiZWwgICAgICAJImVTY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUzIg0KLQkJCXF1aWQgICAgICAgCSIzQjhCRUEyNzAyOUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTQiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkJbGFiZWwgICAgICAJImVUeXBlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiDQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTUiDQotCQkJcXVpZCAgICAgICAJIjNDNDY4MjkzMDNFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDEwRSINCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NiINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDExOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NyINCi0JCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbXBvcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQlsYWJlbCAgICAgIAkiZUltcG9ydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1OCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY0REZGMDJFRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1OSINCi0JCQlxdWlkICAgICAgIAkiM0NDMzYxNDUwMEYyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYwIg0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNFIg0KLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MSINCi0JCQlxdWlkICAgICAgIAkiM0Y3NEU3ODQwMUIxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDBGIg0KLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYyIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDIzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYzIg0KLQkJCXF1aWQgICAgICAgCSIzRjc4OTZBMjAyNkUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicGFyZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJCIg0KLQkJCQlsYWJlbCAgICAgIAkicGFyZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNoaWxkcmVuIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJDIg0KLQkJCQlsYWJlbCAgICAgIAkiY2hpbGRyZW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi43IFNlcnZpY2VzIg0KLQkJCXF1aWQgICAgICAgCSIzOUFEM0VGNjAxMjciDQotCQkJdGl0bGUgICAgICAJIjIuNyBTZXJ2aWNlcyINCi0JCQl6b29tICAgICAgIAk5MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAyOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MywgNjYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2MTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSINCi0JCQkJd2lkdGggICAgICAJNTIwDQotCQkJCWhlaWdodCAgICAgCTQwNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiIEAyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQ4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUG9ydCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiINCi0JCQkJd2lkdGggICAgICAJMjc4DQotCQkJCWhlaWdodCAgICAgCTIxOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiIEAzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgOTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVNlcnZpY2UiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTI2NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDMxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDM4OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTMwMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NEUwMUI0Ig0KLQkJCQljbGllbnQgICAgIAlAMzENCi0JCQkJc3VwcGxpZXIgICAJQDMwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDAsIDM3NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MCwgMjkyKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDQsIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCXdpZHRoICAgICAgCTQxMA0KLQkJCQloZWlnaHQgICAgIAkzMDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJY2xpZW50ICAgICAJQDMzDQotCQkJCXN1cHBsaWVyICAgCUAyOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMCwgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzAsIDEwMDIpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEAzNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgOTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY3NSwgODQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJCQl3aWR0aCAgICAgIAkzMDANCi0JCQkJaGVpZ2h0ICAgICAJMTY4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0NTAyQzkiDQotCQkJCWNsaWVudCAgICAgCUAzNQ0KLQkJCQlzdXBwbGllciAgIAlAMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwOSwgODI4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODA5LCA2MzcpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDM3DQotCQkJCWxvY2F0aW9uICAgCSgzNDMsIDkxNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRzIiBAMzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEzLCA5NDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjE4OTc4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUMiDQotCQkJCQljbGllbnQgICAgIAlAMzcNCi0JCQkJCXN1cHBsaWVyICAgCUAzNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDkxNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzksIDg4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDgwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgOTkwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzI4NDY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMCIgQDQyDQotCQkJCQlQYXJlbnRfVmlldyAJQDM3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMSwgNjQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNiwgNzQ0KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUQiDQotCQkJCQljbGllbnQgICAgIAlAMzcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM0MywgOTE2KQ0KLQkJCQkJICAgICgyNTcsIDkxNikNCi0JCQkJCSAgICAoMjU3LCA2NzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTcsIDY3OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDEsIDc5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNzA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMSIgQDQ1DQotCQkJCWxvY2F0aW9uICAgCSg4ODYsIDEyNzApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjgwMTFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nIiBANDYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTIsIDEyMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmciDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDg1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI0RCINCi0JCQkJCWNsaWVudCAgICAgCUA0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDMzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM1LCAxMjcwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzAsIDEzMTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQyODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyIiBANDkNCi0JCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MiwgMTEwNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODc5NDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI2MSINCi0JCQkJCWNsaWVudCAgICAgCUA0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDM1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODg2LCAxMjcwKQ0KLQkJCQkJICAgICg4MTIsIDEyNzApDQotCQkJCQkgICAgKDgxMiwgOTk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMiwgOTk2KSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNSBCaW5kaW5ncyINCi0JCQlxdWlkICAgICAgIAkiMzlBRDUxMjcwMjUyIg0KLQkJCXRpdGxlICAgICAgCSIyLjUgQmluZGluZ3MiDQotCQkJem9vbSAgICAgICAJODUNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIiBANTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDI0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTE0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgNjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTM3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPcGVyYXRpb24iIEA1Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMzUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgMTMwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDgwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiDQotCQkJCXdpZHRoICAgICAgCTQxMA0KLQkJCQloZWlnaHQgICAgIAk1NjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nSW5wdXQiIEA1Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIsIDEzMzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdJbnB1dCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIsIDEyODQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREVCMDEwMCINCi0JCQkJd2lkdGggICAgICAJMjc4DQotCQkJCWhlaWdodCAgICAgCTE3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPdXRwdXQiIEA1NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE2NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE2MzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxNTg4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUyMTAxMTEiDQotCQkJCXdpZHRoICAgICAgCTMxMg0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiIEA1NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTk4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MiwgMTk1OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0ZhdWx0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MiwgMTkwOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNEYwMEJEIg0KLQkJCQl3aWR0aCAgICAgIAkyOTANCi0JCQkJaGVpZ2h0ICAgICAJMTc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDU2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjgsIDQ4NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCXdpZHRoICAgICAgCTY5MQ0KLQkJCQloZWlnaHQgICAgIAkzMDENCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBANTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDEyODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMTc4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEA1OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDE2NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTU4NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMTc4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDY4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NywgNTM5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQl3aWR0aCAgICAgIAk0MzINCi0JCQkJaGVpZ2h0ICAgICAJMzIyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiDQotCQkJCWNsaWVudCAgICAgCUA1OQ0KLQkJCQlzdXBwbGllciAgIAlANTENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3OSwgNTI3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc5LCA0MjgpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDYxDQotCQkJCWxvY2F0aW9uICAgCSgxMDM5LCA3NDIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzNTIwMTBGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0VHlwZSIgQDYyDQotCQkJCQlQYXJlbnRfVmlldyAJQDYxDQotCQkJCQlsb2NhdGlvbiAgIAkoNTc1LCA1OTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0OSwgNzgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0VHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTI5Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzNTQwMTc2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDYxDQotCQkJCQlzdXBwbGllciAgIAlANTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzOSwgNzQyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTksIDc0MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDkyLCA3MTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzIxOTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQiIEA2NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2MQ0KLQkJCQkJbG9jYXRpb24gICAJKDU3NSwgNTk4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NiwgNjk3KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwOTQ0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzNTQwMTgwIg0KLQkJCQkJY2xpZW50ICAgICAJQDYxDQotCQkJCQlzdXBwbGllciAgIAlANTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzOSwgNzQyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUyMCwgNzQyKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDY3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTAyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcyLCA4NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiT3BlcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJd2lkdGggICAgICAJNDUwDQotCQkJCWhlaWdodCAgICAgCTM3MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBANjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDE0MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDc2LCAxMjgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkyNzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDMiIEA2OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2NCwgMTM1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNDAwQkQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBANzANCi0JCQkJCVBhcmVudF9WaWV3IAlANjkNCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDEzMTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUlucHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc1MTQ4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODMiDQotCQkJCQljbGllbnQgICAgIAlANjkNCi0JCQkJCXN1cHBsaWVyICAgCUA1Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDcsIDEzNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NCwgMTM5OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4OTU0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDQiIEA3Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCQkJbG9jYXRpb24gICAJKDk2LCAyODcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDg0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY5DQotCQkJCQlzdXBwbGllciAgIAlANjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NCwgMTM1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODEsIDEzNTkpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIgQDc0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAxNjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxMiwgMTUzOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3V0cHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTI3NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NSIgQDc1DQotCQkJCWxvY2F0aW9uICAgCSgxNDMyLCAxNjU0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRDc5MDBGMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBANzYNCi0JCQkJCVBhcmVudF9WaWV3IAlANzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwLCAzNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NSwgMTYxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3V0cHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc0NzcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEQiDQotCQkJCQljbGllbnQgICAgIAlANzUNCi0JCQkJCXN1cHBsaWVyICAgCUA1OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDcsIDE2NTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4MSwgMTY5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5MDI3NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDYiIEA3OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEUiDQotCQkJCQljbGllbnQgICAgIAlANzUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDE2NTQpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTkyLCAxMDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOSwgOTMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjQNCi0JCQkJaGVpZ2h0ICAgICAJMTc4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFNDAxREMiDQotCQkJCWNsaWVudCAgICAgCUA4MA0KLQkJCQlzdXBwbGllciAgIAlANTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2NiwgOTE5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTY2LCA2MzYpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDgyDQotCQkJCWxvY2F0aW9uICAgCSg0NTcsIDEwMjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTEwMTc5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYiIEA4Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzE5LCA0OTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM1LCA5MjApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEM0UyMDIyNSINCi0JCQkJCWNsaWVudCAgICAgCUA4Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDU5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDU3LCAxMDIyKQ0KLQkJCQkJICAgICgyNzYsIDEwMjIpDQotCQkJCQkgICAgKDI3NiwgODQ5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDU3LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3NiwgODQ5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzMCwgODg0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ09wZXJhdGlvbnMiIEA4Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzE5LCA0OTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMxLCA5NzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjExNjk5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMzkiDQotCQkJCQljbGllbnQgICAgIAlAODINCi0JCQkJCXN1cHBsaWVyICAgCUA4MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEwLCAxMDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc2OSwgOTgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg0OTU2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTQsIDEwNjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mjc1NjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDkwDQotCQkJCWxvY2F0aW9uICAgCSgxNDE4LCAxMDQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVENDI1MDM4QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9uIiBAOTENCi0JCQkJCVBhcmVudF9WaWV3IAlAOTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTA3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3BlcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNjAxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRjUiDQotCQkJCQljbGllbnQgICAgIAlAOTANCi0JCQkJCXN1cHBsaWVyICAgCUA2Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjMsIDEwNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4OSwgMTAwNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NjcyMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOCIgQDk0DQotCQkJCQlQYXJlbnRfVmlldyAJQDkwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzMsIDEwNzApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk1NDIwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRkYiDQotCQkJCQljbGllbnQgICAgIAlAOTANCi0JCQkJCXN1cHBsaWVyICAgCUA4MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNzQsIDEwNDApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMyIgQDk2DQotCQkJCWxvY2F0aW9uICAgCSg3ODcsIDExOTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjQwMUY1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nSW5wdXQiIEA5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjksIDExNTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdJbnB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxMTkwNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDk2DQotCQkJCQlzdXBwbGllciAgIAlANjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3ODcsIDExOTApDQotCQkJCQkgICAgKDYzNiwgMTE5MCkNCi0JCQkJCSAgICAoNjM2LCAxMjcxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYzNiwgMTI3MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2ODUsIDEyMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDA0NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0IiBAMTAwDQotCQkJCQlQYXJlbnRfVmlldyAJQDk2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODg1LCAxMTQ0KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTIiDQotCQkJCQljbGllbnQgICAgIAlAOTYNCi0JCQkJCXN1cHBsaWVyICAgCUA4MA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc4NywgMTE5MCkNCi0JCQkJCSAgICAoOTI2LCAxMTkwKQ0KLQkJCQkJICAgICg5MjYsIDEwOTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI2LCAxMDk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODcxLCAxMTM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzU4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1IiBAMTAzDQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMzEyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYyRUIzMDE2MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ091dHB1dCIgQDEwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEyLCAxNDI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMwNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3V0cHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQ1MDgyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0MiDQotCQkJCQljbGllbnQgICAgIAlAMTAzDQotCQkJCQlzdXBwbGllciAgIAlANzQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxNDc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc0NTkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNiIgQDEwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODMsIDExNDApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRUI0MDEzRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDMNCi0JCQkJCXN1cHBsaWVyICAgCUA4MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDEwOTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDMxLCAxMTg2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkwMTY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAMTEwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyMCwgMTk4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3MiwgMTkwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDExMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTIsIDE4NTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTI3NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyINCi0JCQkJY2xpZW50ICAgICAJQDExMQ0KLQkJCQlzdXBwbGllciAgIAlANTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDMsIDIwMDcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDIwMDcpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzMiIEAxMTMNCi0JCQkJbG9jYXRpb24gICAJKDEzNTYsIDEzNTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDAwM0U1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nRmF1bHRzIiBAMTE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDExMw0KLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MiwgMTc1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0ZhdWx0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMzE1MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FBIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMw0KLQkJCQkJc3VwcGxpZXIgICAJQDExMQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTYsIDE4NDcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA5LCAxNzk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MTk0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTYsIDE4MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTkyOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNCIgQDExOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkJCWxvY2F0aW9uICAgCSgxODgsIDYxNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTMNCi0JCQkJCXN1cHBsaWVyICAgCUA4MA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTYsIDEzNTIpDQotCQkJCQkgICAgKDEzNTYsIDEyMTcpDQotCQkJCQkgICAgKDExMTcsIDEyMTcpDQotCQkJCQkgICAgKDExMTcsIDEwOTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDEwOTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTUyLCAxMTY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg3MDA4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM1IiBAMTIxDQotCQkJCWxvY2F0aW9uICAgCSgxNjQwLCAxOTcwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA5MUY0MDJGMyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHQiIEAxMjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NCwgMTkxNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzY0MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjENCi0JCQkJCXN1cHBsaWVyICAgCUAxMTANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYzLCAxOTcwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcxOCwgMjAxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MjI3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzYiIEAxMjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjENCi0JCQkJCXN1cHBsaWVyICAgCUAxMTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTE3LCAxOTcwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0MzAyQUIiDQotCQkJCWNsaWVudCAgICAgCUA3NA0KLQkJCQlzdXBwbGllciAgIAlANTQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwMywgMTY1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM2NCwgMTY1NikpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTFCMDExMyINCi0JCQkJY2xpZW50ICAgICAJQDY4DQotCQkJCXN1cHBsaWVyICAgCUA1Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzMxLCAxMzg1KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjQgUG9ydFR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDFDNDAzNjYiDQotCQkJdGl0bGUgICAgICAJIjIuNCBQb3J0VHlwZXMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiINCi0JCQl6b29tICAgICAgIAk4MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIiBAMTI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAyMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklQb3J0VHlwZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTIyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiDQotCQkJCXdpZHRoICAgICAgCTcxOA0KLQkJCQloZWlnaHQgICAgIAkxOTYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIiBAMTI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxNzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSU9wZXJhdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDEyNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIg0KLQkJCQl3aWR0aCAgICAgIAk4OTENCi0JCQkJaGVpZ2h0ICAgICAJMTg4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiIEAxMzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxNDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklJbnB1dCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxMzg3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiDQotCQkJCXdpZHRoICAgICAgCTY0NA0KLQkJCQloZWlnaHQgICAgIAkxOTQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPdXRwdXQiIEAxMzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDE3OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklPdXRwdXQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTcwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIg0KLQkJCQl3aWR0aCAgICAgIAk2NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTk0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiIEAxMzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDIxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklGYXVsdCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDI2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiDQotCQkJCXdpZHRoICAgICAgCTY0NA0KLQkJCQloZWlnaHQgICAgIAkxOTYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTMzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OCwgNjcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJd2lkdGggICAgICAJNjk1DQotCQkJCWhlaWdodCAgICAgCTI4MQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAxMzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTc2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMjUsIDY5MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJd2lkdGggICAgICAJNTIwDQotCQkJCWhlaWdodCAgICAgCTI0MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxMzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAyMDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDEzNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDE0NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMTQyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEAxMzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxNzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxNzQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCXdpZHRoICAgICAgCTI3NA0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDEzOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxNCwgNjIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCXdpZHRoICAgICAgCTY5NQ0KLQkJCQloZWlnaHQgICAgIAkzNTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMzkNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDc5NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNDAxOEMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbnMiIEAxNDANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5DQotCQkJCQlsb2NhdGlvbiAgIAkoNTkyLCAyNjkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA3NDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQ5DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNTk2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDODI3MDFDRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDUsIDc5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzYsIDg2MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDM5MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA5MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzYyNDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwb3J0VHlwZSIgQDE0NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkNCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQzMiDQotCQkJCQljbGllbnQgICAgIAlAMTM5DQotCQkJCQlzdXBwbGllciAgIAlAMTMzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDc5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4OCwgNzU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUzNDg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQxIiBAMTQ2DQotCQkJCWxvY2F0aW9uICAgCSgyMTA3LCA3NzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMkYwMDM1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJhbWV0ZXJPcmRlcmluZyIgQDE0Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYNCi0JCQkJCWxvY2F0aW9uICAgCSgxODE5LCAxMDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ1LCA2NDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgzMzMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjU1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDEzNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjMxNiwgNzczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3MiwgODIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk2NjEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNzEsIDg4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMwNjIyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQyIiBAMTUxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0Ng0KLQkJCQkJbG9jYXRpb24gICAJKDE4MTksIDEwMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNUYiDQotCQkJCQljbGllbnQgICAgIAlAMTQ2DQotCQkJCQlzdXBwbGllciAgIAlAMTM4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk5LCA3NzMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMSIgQDE1Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTcwMiwgMTUwNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxNjAxQTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0cyIgQDE1Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTINCi0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE1LCAxOTgyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Nzg5OTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODciDQotCQkJCQljbGllbnQgICAgIAlAMTUyDQotCQkJCQlzdXBwbGllciAgIAlAMTM1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDIsIDE1MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgMjA0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDQsIDIwMjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDk1ODANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MywgMTk2MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NTM3OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyIiBAMTU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDE1Mg0KLQkJCQkJbG9jYXRpb24gICAJKDE0MTQsIDgzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjEsIDEwNjkpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4OCINCi0JCQkJCWNsaWVudCAgICAgCUAxNTINCi0JCQkJCXN1cHBsaWVyICAgCUAxMzgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCA5NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMDM5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU3MzYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDE2MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3OCwgMTIzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NDAyNEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBAMTYxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE2MA0KLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAxMzQzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxOTgyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRjk1MDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxNjANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc4LCAxMjM0KQ0KLQkJCQkJICAgICg5ODAsIDEyMzQpDQotCQkJCQkgICAgKDk4MCwgMTQxMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAxNDEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0NiwgMTM2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NzY2MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgiIEAxNjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTYwDQotCQkJCQlsb2NhdGlvbiAgIAkoODkwLCA1NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjM2LCAxMDM2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOUEiDQotCQkJCQljbGllbnQgICAgIAlAMTYwDQotCQkJCQlzdXBwbGllciAgIAlAMTM4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3OCwgMTIzNCkNCi0JCQkJCSAgICAoMTI3NywgMTIzNCkNCi0JCQkJCSAgICAoMTI3NywgOTYwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc3LCA5NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk3LCAxMDU4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2NDEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5IiBAMTY3DQotCQkJCWxvY2F0aW9uICAgCSgxNDY4LCAxMzQ1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYyRkI4MDJGOSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBAMTY4DQotCQkJCQlQYXJlbnRfVmlldyAJQDE2Nw0KLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjIsIDE2NjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDkwOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQSINCi0JCQkJCWNsaWVudCAgICAgCUAxNjcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAxNzMwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU0NiwgMTY3NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzYzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTc4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAiIEAxNzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTY3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNywgMTAzNykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBCIg0KLQkJCQkJY2xpZW50ICAgICAJQDE2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDk2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTcxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjMsIDEwODApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTAzNDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNzQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZEODAxOUYiDQotCQkJCWNsaWVudCAgICAgCUAxMzMNCi0JCQkJc3VwcGxpZXIgICAJQDEyOA0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNzUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZFMjAxNzEiDQotCQkJCWNsaWVudCAgICAgCUAxMzgNCi0JCQkJc3VwcGxpZXIgICAJQDEyOQ0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNzYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZFRTAzMUQiDQotCQkJCWNsaWVudCAgICAgCUAxMzYNCi0JCQkJc3VwcGxpZXIgICAJQDEzMA0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNzcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZGODAxQ0QiDQotCQkJCWNsaWVudCAgICAgCUAxMzcNCi0JCQkJc3VwcGxpZXIgICAJQDEzMQ0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMjAwMjAwMkQiDQotCQkJCWNsaWVudCAgICAgCUAxMzUNCi0JCQkJc3VwcGxpZXIgICAJQDEzMg0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAxNzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjI0LCAxNDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM3LCAxMzEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQl3aWR0aCAgICAgIAk1OTMNCi0JCQkJaGVpZ2h0ICAgICAJMzEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIgQDE4MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1MjAsIDI1NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMjQ2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlUmVmZXJlbmNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyINCi0JCQkJd2lkdGggICAgICAJNjcyDQotCQkJCWhlaWdodCAgICAgCTE4MA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTgxDQotCQkJCWxvY2F0aW9uICAgCSgxNTI0LCAyMjc1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxODANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTUyNCwgMjI3NSkNCi0JCQkJICAgICgxNTI0LCAyNDU0KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjNEMDMxOSINCi0JCQkJY2xpZW50ICAgICAJQDEzNQ0KLQkJCQlzdXBwbGllciAgIAlAMTgwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc2LCAyMTc2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NiwgMjI3NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTgxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxODMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIzNTAwREQiDQotCQkJCWNsaWVudCAgICAgCUAxMzcNCi0JCQkJc3VwcGxpZXIgICAJQDE4MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM3MSwgMTg1NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzEsIDIyNzUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE4MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTg0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyMjgwMkU3Ig0KLQkJCQljbGllbnQgICAgIAlAMTM2DQotCQkJCXN1cHBsaWVyICAgCUAxODANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MCwgMTUzNCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMjI3NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTgxKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjEiIEAxODUNCi0JCQkJbG9jYXRpb24gICAJKDIyMDYsIDIyNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODQwMUIxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMTg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE4NQ0KLQkJCQkJbG9jYXRpb24gICAJKDczNCwgLTI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNjgsIDE2NzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTIyMzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMEYiDQotCQkJCQljbGllbnQgICAgIAlAMTg1DQotCQkJCQlzdXBwbGllciAgIAlAMTc5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwNiwgMTYxMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNjAsIDE2NzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYyIiBAMTg5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE4NQ0KLQkJCQkJbG9jYXRpb24gICAJKDczNCwgLTI4NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMjMiDQotCQkJCQljbGllbnQgICAgIAlAMTg1DQotCQkJCQlzdXBwbGllciAgIAlAMTgwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjIwNiwgMjI1OSkNCi0JCQkJCSAgICAoMjIwNiwgMjU1NikNCi0JCQkJCSAgICAoMTg1NiwgMjU1NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg1NiwgMjU1NikpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEgRGVmaW5pdGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNDhBMDI2MiINCi0JCQl0aXRsZSAgICAgIAkiMi4xIERlZmluaXRpb25zIg0KLQkJCXpvb20gICAgICAgCTgzDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiIgQDE5MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMTYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklEZWZpbml0aW9uIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDExMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIg0KLQkJCQl3aWR0aCAgICAgIAk3MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDE5MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NiwgODk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJd2lkdGggICAgICAJMjk0DQotCQkJCWhlaWdodCAgICAgCTEyMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMTkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTEwLCA1NDUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTE4Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE5Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTEyLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTAwLCAxMDU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDE5NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODA4LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk2LCAxMzYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDE5NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTI0LCAxNjAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMTk2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCAzOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJNTI4DQotCQkJCWhlaWdodCAgICAgCTQyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDE5Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1OCwgODYwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDE5OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxOTcNCi0JCQkJCWxvY2F0aW9uICAgCSg2MiwgLTM2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxNywgNTM1KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCQljbGllbnQgICAgIAlAMTk3DQotCQkJCQlzdXBwbGllciAgIAlAMTk2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU4LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAzLCA1MTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTY2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDIwMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxOTcNCi0JCQkJCWxvY2F0aW9uICAgCSg2MiwgLTM2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4NiwgOTA5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VUeXBlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3OTA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDE5Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDE5MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTgsIDg2MCkNCi0JCQkJCSAgICAoMTM1OCwgOTQ4KQ0KLQkJCQkJICAgICgxNjc3LCA5NDgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NywgOTQ4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgOTg3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkyNjU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMjA0DQotCQkJCWxvY2F0aW9uICAgCSgxNjEyLCA1OTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMjA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDIwNA0KLQkJCQkJbG9jYXRpb24gICAJKDEyLCAyMjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIzLCA1MTIpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSINCi0JCQkJCWNsaWVudCAgICAgCUAyMDQNCi0JCQkJCXN1cHBsaWVyICAgCUAxOTYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjEyLCA1OTUpDQotCQkJCQkgICAgKDE0NjQsIDU5NSkNCi0JCQkJCSAgICAoMTQ2NCwgNDUzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjQsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjQsIDQ5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1ODY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAyMDgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjA0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTIsIDU1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4MDMzNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDIwNA0KLQkJCQkJc3VwcGxpZXIgICAJQDE5Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMSwgNTk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNjUyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQxMDA0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzYsIDY0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIyNTk0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDIxMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTI3OSwgMTEzNykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwMzAxRTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAyMTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjEyDQotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjM4LCA1OTEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBCNyINCi0JCQkJCWNsaWVudCAgICAgCUAyMTINCi0JCQkJCXN1cHBsaWVyICAgCUAxOTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc5LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIwLCA1ODYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDQ5NzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlcyIgQDIxNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTINCi0JCQkJCWxvY2F0aW9uICAgCSgyNzEsIDI3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDcsIDExNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTM3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQzEiDQotCQkJCQljbGllbnQgICAgIAlAMjEyDQotCQkJCQlzdXBwbGllciAgIAlAMTkzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI3OSwgMTEzNykNCi0JCQkJCSAgICAoMTI3OSwgMTIwOCkNCi0JCQkJCSAgICAoMTg5MSwgMTIwOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5MSwgMTIwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDExNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzNDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc5NywgMTI0NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDQwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDIyMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIxMiwgMTE1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MTAxMDQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEAyMjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMjIwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgNTk0KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNEEiDQotCQkJCQljbGllbnQgICAgIAlAMjIwDQotCQkJCQlzdXBwbGllciAgIAlAMTk2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxMiwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MSwgNjI0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU3OTYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGVzIiBAMjI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDIyMA0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTEsIDE0NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyMzY5OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzIwMzU0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDIyMA0KLQkJCQkJc3VwcGxpZXIgICAJQDE5NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMTIsIDExNTkpDQotCQkJCQkgICAgKDEyMTIsIDE0OTApDQotCQkJCQkgICAgKDE1ODcsIDE0OTApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODcsIDE0OTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTMzLCAxNDUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI1NjExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDE1NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU4NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTciIEAyMjgNCi0JCQkJbG9jYXRpb24gICAJKDExMTQsIDE1ODUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzcwMDk1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4IiBAMjI5DQotCQkJCQlQYXJlbnRfVmlldyAJQDIyOA0KLQkJCQkJbG9jYXRpb24gICAJKC00MDYsIDI0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDY4MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzcxIg0KLQkJCQkJY2xpZW50ICAgICAJQDIyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDE5Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTQsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTUsIDc1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjcwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdzIiBAMjMyDQotCQkJCQlQYXJlbnRfVmlldyAJQDIyOA0KLQkJCQkJbG9jYXRpb24gICAJKC00MDYsIDI0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTEsIDE2NzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY2MzQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzN0IiDQotCQkJCQljbGllbnQgICAgIAlAMjI4DQotCQkJCQlzdXBwbGllciAgIAlAMTk1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTExNCwgMTU4NSkNCi0JCQkJCSAgICAoMTExNCwgMTcxNikNCi0JCQkJCSAgICAoMjExNSwgMTcxNikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgMTcxNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTMsIDE2NzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDUwNzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAxNCwgMTc1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMTA3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIzNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI4LCAxOTIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMjM3DQotCQkJCWxvY2F0aW9uICAgCSgxMDY2LCAxNTMzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjdCMDMxMSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDIzOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTIxLCAtMTExKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgNjY5KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwN0YiDQotCQkJCQljbGllbnQgICAgIAlAMjM3DQotCQkJCQlzdXBwbGllciAgIAlAMTk2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOSwgNzU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzE5Njk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2VydmljZXMiIEAyNDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMjM3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTMsIDIwMjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNlcnZpY2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkxODI0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwODkiDQotCQkJCQljbGllbnQgICAgIAlAMjM3DQotCQkJCQlzdXBwbGllciAgIAlAMjM2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTA2NiwgMTUzMykNCi0JCQkJCSAgICAoMTA2NiwgMjA1OSkNCi0JCQkJCSAgICAoMTYxOSwgMjA1OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxOSwgMjA1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTQsIDIwMzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDAxOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMiwgMjExMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyMDUxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI0NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMUY4MDM4MiINCi0JCQkJY2xpZW50ICAgICAJQDE5Ng0KLQkJCQlzdXBwbGllciAgIAlAMTkwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY0LCAyNjMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODUsIDI2MykpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjMgRXh0ZW5zaWJpbGl0eSINCi0JCQlxdWlkICAgICAgIAkiM0FENjBDNTEwMTkyIg0KLQkJCXRpdGxlICAgICAgCSIyLjEuMyBFeHRlbnNpYmlsaXR5Ig0KLQkJCXpvb20gICAgICAgCTgwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMjQ2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDE1ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5NCwgMTUzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJd2lkdGggICAgICAJMTgyDQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDI0Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMTg4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4NywgMTgzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMjQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzQyLCAxNjc1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCQl3aWR0aCAgICAgIAkxODINCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEAyNDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDIzMzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDIyODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQkJd2lkdGggICAgICAJMjc0DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDI1MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzM2LCAxNzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjMsIDE3MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCXdpZHRoICAgICAgCTM2NA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDEzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3ODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCA4NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIg0KLQkJCQl3aWR0aCAgICAgIAk4MDQNCi0JCQkJaGVpZ2h0ICAgICAJMTcyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEAyNTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMTk1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAxODk5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJCXdpZHRoICAgICAgCTI3NA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEAyNTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDIxNDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2MywgMjA5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3V0cHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCQkJd2lkdGggICAgICAJMzA4DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDI1NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTIzNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJMjIyDQotCQkJCWhlaWdodCAgICAgCTE0Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAyNTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxNDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMzUsIDEzNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMjU2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCA2ODgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5LCA1ODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCQl3aWR0aCAgICAgIAk1NjANCi0JCQkJaGVpZ2h0ICAgICAJMjQwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCAxMDM5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAyNTYNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDgwLCAxMDM5KQ0KLQkJCQkgICAgKDQ4MCwgODA4KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDYwMENCMDBBQSINCi0JCQkJY2xpZW50ICAgICAJQDI0Nw0KLQkJCQlzdXBwbGllciAgIAlAMjU2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY2LCAxODI0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2NiwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjVBNDAyN0UiDQotCQkJCWNsaWVudCAgICAgCUAyNTMNCi0JCQkJc3VwcGxpZXIgICAJQDI1Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NywgMjA3OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTcsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjYwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkzODYwMkM5Ig0KLQkJCQljbGllbnQgICAgIAlAMjQ5DQotCQkJCXN1cHBsaWVyICAgCUAyNTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTksIDIyNzEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjE5LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODVCNTlCMDA3MiINCi0JCQkJY2xpZW50ICAgICAJQDI1Mg0KLQkJCQlzdXBwbGllciAgIAlAMjU2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODgsIDE4ODcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODgsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjYyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwOTIwMkY3Ig0KLQkJCQljbGllbnQgICAgIAlAMjUwDQotCQkJCXN1cHBsaWVyICAgCUAyNTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc5NywgMTY5NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc5NywgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNjMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEwRjAyRjAiDQotCQkJCWNsaWVudCAgICAgCUAyNDYNCi0JCQkJc3VwcGxpZXIgICAJQDI1Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjAxLCAxNTE5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjAxLCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGREI4MDNENCINCi0JCQkJY2xpZW50ICAgICAJQDI1NA0KLQkJCQlzdXBwbGllciAgIAlAMjU2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTEsIDEyMjMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTEsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjY1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQljbGllbnQgICAgIAlAMjU1DQotCQkJCXN1cHBsaWVyICAgCUAyNTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQxNCwgMTM0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxNCwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNjYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEyMDAyNUUiDQotCQkJCWNsaWVudCAgICAgCUAyNDgNCi0JCQkJc3VwcGxpZXIgICAJQDI1Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTY2MykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MjksIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDY4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgNTgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJd2lkdGggICAgICAJNTYzDQotCQkJCWhlaWdodCAgICAgCTIzNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDI2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5MSwgNjcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDI2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNjgNCi0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODQ3LCA2MzEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkJCWNsaWVudCAgICAgCUAyNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAyNTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2MCwgNjcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODMwLCA2MjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzk2OTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAyNzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjY4DQotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTUsIDUyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzc5MDcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIg0KLQkJCQkJY2xpZW50ICAgICAJQDI2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDI2Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkxLCA2NzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyMywgNjcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NiwgNjI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5NDAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjMsIDc2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjQ3OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTkyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiIEAyNzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYzMCwgODQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiV1NETEVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIg0KLQkJCQl3aWR0aCAgICAgIAk3NzQNCi0JCQkJaGVpZ2h0ICAgICAJMjQwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgNDAyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAyNzYNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTAwOCwgNDAyKQ0KLQkJCQkgICAgKDEwMDgsIDMxMikpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkUzQzAzRDQiDQotCQkJCWNsaWVudCAgICAgCUAyNTYNCi0JCQkJc3VwcGxpZXIgICAJQDI3Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDkyLCA1NjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0OTIsIDQwMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjc3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjE0OTAzRDAiDQotCQkJCWNsaWVudCAgICAgCUAyNjcNCi0JCQkJc3VwcGxpZXIgICAJQDI1MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxNSwgNTcxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNSwgMjQ2KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjgwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JEREY1MzUwMkMzIg0KLQkJCQljbGllbnQgICAgIAlAMjY3DQotCQkJCXN1cHBsaWVyICAgCUAyNzYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NjIsIDU3MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjIsIDQwMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjc3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI4MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMTYsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDEzMDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTcwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJd2lkdGggICAgICAJNTg4DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI4Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUVDMDFDQiINCi0JCQkJY2xpZW50ICAgICAJQDI4MQ0KLQkJCQlzdXBwbGllciAgIAlAMjY3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzk2LCAxMjk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc5NiwgODA1KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYzIiBAMjgzDQotCQkJCWxvY2F0aW9uICAgCSgyMzExLCAxNjg2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNzg5NkEyMDI2RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJlbnQiIEAyODQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjgzDQotCQkJCQlsb2NhdGlvbiAgIAkoMjc5LCAyOTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDIyLCAxMzMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhcmVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJCIg0KLQkJCQkJY2xpZW50ICAgICAJQDI4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDI4MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzMTEsIDE2ODYpDQotCQkJCQkgICAgKDI0MzIsIDE2ODYpDQotCQkJCQkgICAgKDI0MzIsIDEzNzQpDQotCQkJCQkgICAgKDIzMTAsIDEzNzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTAsIDEzNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzY2LCAxNDI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjaGlsZHJlbiIgQDI4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyODMNCi0JCQkJCWxvY2F0aW9uICAgCSgyNzksIDI5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTksIDE1MzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2hpbGRyZW4iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTg1NjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkMiDQotCQkJCQljbGllbnQgICAgIAlAMjgzDQotCQkJCQlzdXBwbGllciAgIAlAMjgxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjMxMSwgMTY4NikNCi0JCQkJCSAgICAoMjAxNiwgMTY4NikNCi0JCQkJCSAgICAoMjAxNiwgMTQyNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNiwgMTQyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzAsIDE0ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyINCi0JCQlxdWlkICAgICAgIAkiM0FFOEVENzIwMUJEIg0KLQkJCXRpdGxlICAgICAgCSIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciDQotCQkJem9vbSAgICAgICAJOTANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiIEAyOTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjIsIDE3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW1wb3J0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTI3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiDQotCQkJCXdpZHRoICAgICAgCTU5OA0KLQkJCQloZWlnaHQgICAgIAkyMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSIgQDI5MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTEzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCAxMDQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk5hbWVzcGFjZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJCXdpZHRoICAgICAgCTQ3OQ0KLQkJCQloZWlnaHQgICAgIAkyMTUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMjkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDExNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNjk0DQotCQkJCWhlaWdodCAgICAgCTE3Mw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDI5Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0LCAyMzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTQ5MA0KLQkJCQloZWlnaHQgICAgIAkzMjANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzciIEAyOTQNCi0JCQkJbG9jYXRpb24gICAJKDMwOSwgNzg2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzRDU1MDAyRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTmFtZXNwYWNlcyIgQDI5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyOTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2MSwgOTU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VOYW1lc3BhY2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk4ODQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzMyIg0KLQkJCQkJY2xpZW50ICAgICAJQDI5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDI5MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDEwMjkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDgsIDk3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2ODcwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDkxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNTA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzgiIEAyOTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjk0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNjgsIDU5MikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRDU2MDMyOCINCi0JCQkJCWNsaWVudCAgICAgCUAyOTQNCi0JCQkJCXN1cHBsaWVyICAgCUAyOTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCA1NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzksIDU4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NDk2MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMzAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgNzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjU1LCA1ODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJd2lkdGggICAgICAJNDUyDQotCQkJCWhlaWdodCAgICAgCTMwNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MSIgQDMwMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NiwgMTAwMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDQzAyRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVNjaGVtYSIgQDMwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDMNCi0JCQkJCWxvY2F0aW9uICAgCSg1MTAsIC0xMDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxMDE4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyNzAiDQotCQkJCQljbGllbnQgICAgIAlAMzAzDQotCQkJCQlzdXBwbGllciAgIAlAMjkyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ4NiwgMTAwMSkNCi0JCQkJCSAgICAoMTYzMiwgMTAwMSkNCi0JCQkJCSAgICAoMTYzMiwgMTEzMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMiwgMTEzMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjMsIDEwMTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUyIiBAMzA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDMwMw0KLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyN0EiDQotCQkJCQljbGllbnQgICAgIAlAMzAzDQotCQkJCQlzdXBwbGllciAgIAlAMzAyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NiwgODcyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzkiIEAzMDgNCi0JCQkJbG9jYXRpb24gICAJKDEwODcsIDQwMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQTAwMkQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDAiIEAzMDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzA4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNiwgNDgwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUYyIg0KLQkJCQkJY2xpZW50ICAgICAJQDMwOA0KLQkJCQkJc3VwcGxpZXIgICAJQDMwMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODcsIDQwMykNCi0JCQkJCSAgICAoMTM2NCwgNDAzKQ0KLQkJCQkJICAgICgxMzY0LCA1NjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NCwgNTY4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVEZWZpbml0aW9uIiBAMzExDQotCQkJCQlQYXJlbnRfVmlldyAJQDMwOA0KLQkJCQkJbG9jYXRpb24gICAJKDY4NywgLTEyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNSwgMzYzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3NTMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRTgiDQotCQkJCQljbGllbnQgICAgIAlAMzA4DQotCQkJCQlzdXBwbGllciAgIAlAMjkzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDUsIDQwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNDU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE0OTEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMzE0DQotCQkJCWxvY2F0aW9uICAgCSg3MzcsIDgyNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAzMTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzE0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUyLCA2NDcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkJCQljbGllbnQgICAgIAlAMzE0DQotCQkJCQlzdXBwbGllciAgIAlAMjkzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzM3LCA4MjYpDQotCQkJCQkgICAgKDUxMCwgODI2KQ0KLQkJCQkJICAgICg1MTAsIDU0NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNTQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDU3LCA1OTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMzE4DQotCQkJCQlQYXJlbnRfVmlldyAJQDMxNA0KLQkJCQkJbG9jYXRpb24gICAJKC02NzEsIDEwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDQsIDc3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5OTE4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDMxNA0KLQkJCQkJc3VwcGxpZXIgICAJQDMwMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ2LCA4MjYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTgwLCA4NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzIyMTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2MiwgOTMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMyMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDBEMDM0MCINCi0JCQkJY2xpZW50ICAgICAJQDMwMg0KLQkJCQlzdXBwbGllciAgIAlAMjkwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTU1LCA1NjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCAzMzMpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMiBUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0I4NUFFNTkwMzdFIg0KLQkJCXRpdGxlICAgICAgCSIyLjIgVHlwZXMiDQotCQkJem9vbSAgICAgICAJOTANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTgxDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMzIzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMTIzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OTUsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDANCi0JCQkJaGVpZ2h0ICAgICAJMTc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDMyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxNjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDYsIDE1MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDc4DQotCQkJCWhlaWdodCAgICAgCTE2Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDMyNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE5NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDE4MjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTE3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCXdpZHRoICAgICAgCTUzNQ0KLQkJCQloZWlnaHQgICAgIAkzMDUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAzMjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTA2NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJd2lkdGggICAgICAJNDY2DQotCQkJCWhlaWdodCAgICAgCTI1OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NyIgQDMyNw0KLQkJCQlsb2NhdGlvbiAgIAkoNzM1LCAxMTcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDBDNCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDMyOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjcNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NSwgMTEzMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTAwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMyMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg2LCAxMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM5LCAxMjA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg4NzA1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0OCIgQDMzMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjcNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMzEiDQotCQkJCQljbGllbnQgICAgIAlAMzI3DQotCQkJCQlzdXBwbGllciAgIAlAMzI2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODUsIDExNzIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OSIgQDMzMg0KLQkJCQlsb2NhdGlvbiAgIAkoNTI3LCAxNTkyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEIxQzEyMDNCMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb24iIEAzMzMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzMyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTY1LCAxMDk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY2LCAxNTU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3NTM5NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDFDIg0KLQkJCQkJY2xpZW50ICAgICAJQDMzMg0KLQkJCQkJc3VwcGxpZXIgICAJQDMyNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk3LCAxNTkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA3LCAxNjQ1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU1ODc3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MCIgQDMzNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzINCi0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDI2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMzMg0KLQkJCQkJc3VwcGxpZXIgICAJQDMyNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDUyNywgMTU5MikNCi0JCQkJCSAgICAoNDM3LCAxNTkyKQ0KLQkJCQkJICAgICg0MzcsIDEzMTMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAxMzEzKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTUiIEAzMzcNCi0JCQkJbG9jYXRpb24gICAJKDMyMiwgMTkxMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5MzAzRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAzMzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzM3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM4LCAxODcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ4NTYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMEUiDQotCQkJCQljbGllbnQgICAgIAlAMzM3DQotCQkJCQlzdXBwbGllciAgIAlAMzI1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxOTExKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQzLCAxOTY1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NiIgQDM0MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMzNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMyNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDMyMiwgMTkxMSkNCi0JCQkJCSAgICAoMjI5LCAxOTExKQ0KLQkJCQkJICAgICgyMjksIDEzMTMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5LCAxMzEzKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMzQyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA2MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNSwgNTEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJd2lkdGggICAgICAJMzg5DQotCQkJCWhlaWdodCAgICAgCTIxNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDM0Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTIyMg0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTMiIEAzNDQNCi0JCQkJbG9jYXRpb24gICAJKDIzNCwgNjA0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAzNDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzQ0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCA2NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA3DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVR5cGVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjYxMDE3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiDQotCQkJCQljbGllbnQgICAgIAlAMzQ0DQotCQkJCQlzdXBwbGllciAgIAlAMzQyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwNiwgNjA0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM4ODMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMzQ4DQotCQkJCQlQYXJlbnRfVmlldyAJQDM0NA0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMywgMzEzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCQljbGllbnQgICAgIAlAMzQ0DQotCQkJCQlzdXBwbGllciAgIAlAMzQzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0LCA2MDQpDQotCQkJCQkgICAgKDE3NCwgNjA0KQ0KLQkJCQkJICAgICgxNzQsIDIyNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMjI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4LCAyNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTc3MjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyIgQDM1MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAyMDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVR5cGVzIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAxNTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCINCi0JCQkJd2lkdGggICAgICAJMjQ4DQotCQkJCWhlaWdodCAgICAgCTE2Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzNTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTksIDc1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MzkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiDQotCQkJCXdpZHRoICAgICAgCTc1Nw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMzUzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDEyMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjksIDExMDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNjczDQotCQkJCWhlaWdodCAgICAgCTI1MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1OSIgQDM1NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNiwgOTc1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ1MDBGMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MCIgQDM1NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTQNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0QiDQotCQkJCQljbGllbnQgICAgIAlAMzU0DQotCQkJCQlzdXBwbGllciAgIAlAMzUyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCA4NTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzc0LCA5MDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTY0ODkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDM1Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTQNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDYsIDEwMzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA3NTc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNFIg0KLQkJCQkJY2xpZW50ICAgICAJQDM1NA0KLQkJCQkJc3VwcGxpZXIgICAJQDM1Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgMTA5MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODgsIDEwNTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTE1MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0QzQjAzODAiDQotCQkJCWNsaWVudCAgICAgCUAzNDINCi0JCQkJc3VwcGxpZXIgICAJQDM1MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzA1LCA1MDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDUsIDMwNykpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAzNjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAyMjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE1LCAxMzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCQl3aWR0aCAgICAgIAk1MDANCi0JCQkJaGVpZ2h0ICAgICAJMjEyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzYyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQljbGllbnQgICAgIAlAMzQyDQotCQkJCXN1cHBsaWVyICAgCUAzNjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NCwgNTAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU0LCAzMzApKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDQ2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MCwgMzY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJd2lkdGggICAgICAJNjg3DQotCQkJCWhlaWdodCAgICAgCTIxNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDM2NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwNiwgNDkzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDM2NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNjQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTM2LCAzODYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJCQljbGllbnQgICAgIAlAMzY0DQotCQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIwNiwgNDkzKQ0KLQkJCQkJICAgICgxMDk0LCA0OTMpDQotCQkJCQkgICAgKDEwOTQsIDMzMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAzMzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAzNzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjgzMjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAzNjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzY0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NiwgNDU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDM5NzExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJCQljbGllbnQgICAgIAlAMzY0DQotCQkJCQlzdXBwbGllciAgIAlAMzYzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDgxLCA0OTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE1LCA1NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjQ5NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5NiwgMzkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk0OTE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM3Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MjdGMDBCNyINCi0JCQkJY2xpZW50ICAgICAJQDM1Mg0KLQkJCQlzdXBwbGllciAgIAlAMzYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODEyLCA3NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCA1NzIpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMyBNZXNzYWdlcyINCi0JCQlxdWlkICAgICAgIAkiM0JDRTg1M0QwMkM4Ig0KLQkJCXRpdGxlICAgICAgCSIyLjMgTWVzc2FnZXMiDQotCQkJem9vbSAgICAgICAJODUNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIiBAMzczDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDEyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTWVzc2FnZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgNzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiINCi0JCQkJd2lkdGggICAgICAJMzgwDQotCQkJCWhlaWdodCAgICAgCTMyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiIEAzNzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDEyNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUGFydCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiDQotCQkJCXdpZHRoICAgICAgCTYxNw0KLQkJCQloZWlnaHQgICAgIAkzMjQNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMzc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgODE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCA2OTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCXdpZHRoICAgICAgCTQ5Mg0KLQkJCQloZWlnaHQgICAgIAkyNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNzYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTk2RDAyRjEiDQotCQkJCWNsaWVudCAgICAgCUAzNzUNCi0JCQkJc3VwcGxpZXIgICAJQDM3NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwNCwgNjc4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwNCwgMzg2KSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMzc3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgNTA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQl3aWR0aCAgICAgIAk0MzINCi0JCQkJaGVpZ2h0ICAgICAJMzIyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzc4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4RDEwMkJBIg0KLQkJCQljbGllbnQgICAgIAlAMzc3DQotCQkJCXN1cHBsaWVyICAgCUAzNzMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NSwgNDk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCAzODgpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMSIgQDM3OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA5NTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJ0cyIgQDM4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNzkNCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgODk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJ0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NzQ1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkYwMDYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDM3OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDM3NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDk1MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEwMDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODk4MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxMDYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQyMDM4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMiIgQDM4NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNzkNCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwNCwgODkzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNTciDQotCQkJCQljbGllbnQgICAgIAlAMzc5DQotCQkJCQlzdXBwbGllciAgIAlAMzc3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjg4LCA5NTIpDQotCQkJCQkgICAgKDQ0NSwgOTUyKQ0KLQkJCQkJICAgICg0NDUsIDgxNykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgODE3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzkzLCA5MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDc2MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKSkpKSkNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInhzZCINCi0JCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJYU0QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkib3JnLmVjbGlwc2UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkieHNkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHNkLzIwMDIvWFNEIikpDQotCQlxdWlkICAgICAgIAkiMzlBQkRDNkYwMUFBIg0KLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQW5ub3RhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0RTIwMzY2Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXBwbGljYXRpb25JbmZvcm1hdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RUJGMDJDOCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlckluZm9ybWF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFRUEwMTU3Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdGMDUwMUUyIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUF0dHIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2MTAzQkUiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjUyMDJCNCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ4RTIwMEVBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDAzQTAyMjEiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRUIwMkE4Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM4MDBEMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODdGN0IwMzg2Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2UiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjcyRDczNzAzOEYiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ3QkIwMzQ5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNDRjMwMjdEIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNEREIwM0I3Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNERTAwMkQ4Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMDIyMDM4MiINCi0JCQkJdHlwZSAgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzE5RDkwMzQxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREJvdW5kZWRGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1MUQwMzQ0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjNDMDIyNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzUyQTAwQ0MiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5RmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0RjAxMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1NkMwMTUzIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ2FyZGluYWxpdHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4QjgwMjg2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJBQTIwMzEwIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVyaXZhdGlvbk1ldGhvZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNkU0MDIwRSINCi0JCQkJdHlwZSAgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiDQotCQkJCWluaXR2ICAgICAgCSJyZXN0cmljdGlvbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MUQwMjZBIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBsZXhGaW5hbCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MzgwMEM1Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0E0MjAyQjgiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0I4QTAzRTYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjYxODAxNEQiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRkI5NzAwNkUiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMzFBRjVFMDNBNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTkwM0QyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRERCNTAxQTUiDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzgwMDM5NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpYyINCi0JCQlxdWlkICAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNENEMwRjRDMDFBMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldmVyaXR5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY5MUMwMDVEIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlhZ25vc3RpY1NldmVyaXR5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU1RkREMDI4MCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NDMwMTZCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGluZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MDdFMDIxMyINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2x1bW4iDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjExRTAyOTYiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWluaXR2ICAgICAgCSIxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm9kZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMDE2QjZCMDIwMCINCi0JCQkJdHlwZSAgICAgICAJIkRPTU5vZGUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbm5vdGF0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NEYwMTg2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjE3MDAyRSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjYwMzM5Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5pbGxhYmxlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGQjQwMjlGIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0NjgwMzY4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0QTAwM0I5Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0RTAwMDBFIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMTRDMDBCMiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNjgwMUMxIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUY2MjAzQ0YiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMzREQ0IwMDAxOCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERW51bWVyYXRpb25GYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzlEMDNDNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QzY0MDA1NCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyNTY4MDI1OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzM3NDAyNTMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWNldE5hbWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RkI0MDFFQyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVmZmVjdGl2ZVZhbHVlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUFFMzAzQjYiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERmVhdHVyZSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODEwMjBGIg0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODgwMEM1Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZvcm0iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTAyQjAzM0UiDQotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzFBMUIwMTZGIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZ2xvYmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTAwNzAzNzIiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmVhdHVyZVJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwNDQwMTg1Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERml4ZWRGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5OUUwMEMxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Qzg4MDFCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZBNjAwMjAxIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qjk5MDAxNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlEMjAwOEEiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnVuZGFtZW50YWxGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5RTgwMUQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzdCMDM5NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QUEzMDI0MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkZW50aXR5Q29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQxQzcwMTQzIg0KLQkJCQl0eXBlICAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESW1wb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RDkwMDNFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQjE1MDM2QyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbmNsdWRlIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEM3RDAyNTAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4REMwMzgxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiDQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETGVuZ3RoRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc4MDAyREYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3NkMwMDRCIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg5NjAwQzIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOEUwMzA5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFEMzEwM0FEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUUyMDFGNyINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE3NDAyN0QiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhjbHVzaXZlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE5MzAzNTQiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhJbmNsdXNpdmVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjgzMDNCOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhMZW5ndGhGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjdEMDBGQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdEQTAwRjMiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRXhjbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1OTAyODEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQyNDAwOTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRDEwMzk4Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUEyMDA4RSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUJFMDNFMiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTIwMzUzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkxlbmd0aEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3QzQwMEMwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Nzk5MDE1RSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBNjQwMjc5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21wb3NpdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGMUQwMUNGIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcG9zaXRvciINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkUyMDM4MSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI1NTAzODUiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUY2MDJFOCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZWRDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzAwMDE0MiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzA0MDMxRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzTmFtZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1N0YwMTI3Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidVJJIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU4NzAwRTIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGlhc1VSSSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1QUEwMkFGIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwOTYzMDI1RSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETm90YXRpb25EZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OTQzMDJGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU0RjAyM0MiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSWRlbnRpZmllciINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzJFMDBGMCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lkZW50aWZpZXIiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDMzNDAzOTciDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETnVtZXJpY0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NDIwMDc0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NUEzMDAxMiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNET3JkZXJlZEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NTkwMTJDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NEY2MDJEQSINCi0JCQkJdHlwZSAgICAgICAJIlhTRE9yZGVyZWQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhGQzAxRTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWluT2NjdXJzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOEUwM0IyIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1heE9jY3VycyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjk5MDNBRSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3ODBCRDkwMDU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXR0ZXJuRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkNBNTAzOEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0M3OTAzMTEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0QkEwMjNDIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTY4MDAyMTYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJCMzAxRDUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmUiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2QUE2MDMxQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4RjAwMkUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYSINCi0JCQlxdWlkICAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0RTUwM0REIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg2OEVDMDIyNiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5QkZGMDE4MCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUZvcm1EZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNEIwMTAyIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSINCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudEZvcm1EZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNzgwMEFDIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSINCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWxEZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEM0QTcwMDM4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2tEZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY1OUQwMkQ4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNEMjJENkQ4MDM1NiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb21wb3NpdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEU2MDM3MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOUIzMDMzMCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NvcGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NUY1NTAzMkIiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YXJpZXR5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzMxNTgwMEE5Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEVmFyaWV0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU0NEYwMTQ2Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2NUUwMzVBIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsaWRGYWNldHMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUIwRjAwQjYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRlcm0iDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhBQTAxRDMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjQ0MDA2OSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVG90YWxEaWdpdHNGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjYxMDMzNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlBQjAyMzIiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVHlwZURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJGNTAxM0EiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg2MjAwNDUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc4NTAwMjAxIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEV2hpdGVTcGFjZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaWxkY2FyZCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTNBMDA0MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQwRTkwMTlFIg0KLQkJCQl0eXBlICAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDRjg2MDIyMyINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9jZXNzQ29udGVudHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDEyRTAxRTQiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCREI3MDFGOSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDg0RjcwMDkyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOTAxNTAzREUiDQotCQkJCXR5cGUgICAgICAgCSJYU0RYUGF0aFZhcmlldHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCN0JCQkUxMDFCMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01BdHRyIg0KLQkJCXF1aWQgICAgICAgCSIzQkJGOEM4OTAxQjYiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkF0dHIiDQotCQkJCXF1aWQgICAgICAgCSIzQkJGOENCMDAwRDUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDMjc4NTBFMDM4MSINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODUxQjAzQzYiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4MTg5NzkwMjAwIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4MTg5REIwMzc0Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTU5vZGUiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2NEE1MDExNyINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uTm9kZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NUJGMDAyRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJWYWx1ZSINCi0JCQlxdWlkICAgICAgIAkiM0MwNDBCNUIwMzFGIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLmxhbmcuT2JqZWN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MwNDBCOEQwM0Q1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkE3QjBFODAxQTgiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wdGlvbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMTUwMkI3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTIyMDJEMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjkwMkYwIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1RDAwOUIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbml0ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MURDMDJFRCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvdW50YWJseUluZmluaXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxRUMwMTQxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhGaW5hbCINCi0JCQlxdWlkICAgICAgIAkiM0I5N0MyQ0EwMUNCIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFNzAwREEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkVBMDE2QSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNkQyMDExMiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb3NpdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQjg2OUI2MjAwMzciDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5QkQwMDAwMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNob2ljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5Q0I4MDExRSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcXVlbmNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDRTUwMDU3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbnQiDQotCQkJcXVpZCAgICAgICAJIjNCODY5RTI2MDFBRSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5RThFMDI1OCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOTkwMjcxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCODZBNzlGMDNBMiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW1wdHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdDRDAyRjAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaW1wbGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMTAwQ0UiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QzMDFCNyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRPbmx5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDcwMkU5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERlcml2YXRpb25NZXRob2QiDQotCQkJcXVpZCAgICAgICAJIjNCODZBMEIwMDBDRSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkEwQzgwMzI5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDQzAxNjIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpY1NldmVyaXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjhBNzAzMkYiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhdGFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4QzMwM0QwIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXJyb3IiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFNzAwRTMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3YXJuaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4RUEwMUZGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5mb3JtYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQkZFN0ZDMjAxOUEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNUE0MDNERiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NzkwMDQ1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2N0YwMUFDIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4MzAyMEIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI0NTAwNjkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERm9ybSINCi0JCQlxdWlkICAgICAgIAkiM0I5RjkxM0IwMUVCIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxdWFsaWZpZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTE2RjAwMjMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bnF1YWxpZmllZCINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MThDMDA3RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQlxdWlkICAgICAgIAkiM0I4NkExRTAwMjcyIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMjAwODUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXlyZWYiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMzAxNEYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlxdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxNjAzNjUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzVFQTAwMjMiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFueSINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYwMDAzNCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYyMDA1RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDY1MDExNyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkIg0KLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1MjAyRTQiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhbHNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQTkwMjcxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFydGlhbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUJCMDFGRiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRvdGFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQzQwMUIyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2Nlc3NDb250ZW50cyINCi0JCQlxdWlkICAgICAgIAkiM0I4RkY4QzcwMjg0Ig0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHJpY3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGODAwNDUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXgiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGNjAzOEIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJza2lwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RTgwMkJBIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzVCRTAyNzIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjhCMDBCOCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OTQwMjkxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNTAwMjk1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZUZpbmFsIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4MTAyMzAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgzMDEzOCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODgwMjRFIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RTAwMzc0Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1OTEwMEFFIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY2NDAyMzEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjZEMDIxNiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RWYXJpZXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhGRjc3MzAyNDkiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0b21pYyINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0E3MDJERiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRDAxMzkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FGMDM5RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQkVFRDBGNjAzNDIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByZXNlcnZlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMEYwMTE3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVwbGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTI3MDM0RCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbGxhcHNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjkwMzk2Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoVmFyaWV0eSINCi0JCQlxdWlkICAgICAgIAkiM0I4RkZCODkwMzNBIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZWxlY3RvciINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGQkFDMDE5MiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpZWxkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQjMwMjc4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzYyNkVBNzAxMDIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjUiDQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVBOTAxOTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjYiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQURDMDJGNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDIzOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REFERDAyNDIiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjgiDQotCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDA2RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDMwRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzE4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzAiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTZCMDJDQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTciDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzIiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MjZCMDE5NCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMwOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMxMyINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzQiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjA2MDI5MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjA3MDE3MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcyIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5NDA0RTAwNjciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzciDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyOUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyQTUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzgiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTlGMDA4NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzVBMDAwNkEiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MCINCi0JCQlxdWlkICAgICAgIAkiM0MyNzVEMzIwMjIwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc1RDNDMDEwRCINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODg3QkYwMTUwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTgiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODQiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MjVFMDFGOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA0NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDUwIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NTAxMEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODciDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NjAwRkEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQiINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4OCINCi0JCQlxdWlkICAgICAgIAkiM0I2RjFERTkwMThBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzZDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzODAiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkwIg0KLQkJCXF1aWQgICAgICAgCSIzQjkwMDY4ODAxQzIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTEiDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudEFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMUIiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50QW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNTAzNDAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZGRERENzAxMTMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGREREQTAyNkIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI3NSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzdERjAyNEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTciDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0UxMDBGRSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5OCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMDZFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzQ5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVVzZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzOTU5MDM0QSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDAiDQotCQkJcXVpZCAgICAgICAJIjNCNjk4RTM2MDM4NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwNzIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlQ29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwN0MiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVDb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQTAxMjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTEiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjc1MUIwODAzQzciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGFpbmVyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNFIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGFpbmVyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjc1MUI0ODAyNjEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdENvbnRhaW5lciINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NSINCi0JCQkJbGFiZWwgICAgICAJInJvb3RDb250YWluZXIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDgiDQotCQkJcXVpZCAgICAgICAJIjNCNzUxQzMxMDM1NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzQiINCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwQTAwNjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTExIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEIwMjNGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyNDkiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4OTExNDAxQUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE3Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAwNTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0JGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAzQzAiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzNFRjAxNjAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk5Ig0KLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTgiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MUU2MDI1MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAyRjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDMwQiINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjAiDQotCQkJcXVpZCAgICAgICAJIjNCNjlDMDU5MDE5OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRUQiDQotCQkJCWxhYmVsICAgICAgCSJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjIiDQotCQkJcXVpZCAgICAgICAJIjNDNDJEQkREMDI5NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjMiDQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3Vic3RpdHV0aW9uR3JvdXAiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDEyOCINCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjQiDQotCQkJcXVpZCAgICAgICAJIjNCNkQyM0I5MDFDRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDIzQkEwMUNFIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNiINCi0JCQlxdWlkICAgICAgIAkiM0I2RDU5NzEwMkVBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDEwNSINCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjciDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5QjY1MzAxN0EiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAic2NvcGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjY1NDAwNkQiDQotCQkJCWxhYmVsICAgICAgCSJzY29wZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI5MDEwNjAyRDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRGZWF0dXJlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDBFIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRGZWF0dXJlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwMTBCMDAxOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzMiINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMTgzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDMzQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDM0NiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzQiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEMjlFMDE0RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkS2V5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNjUiDQotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2VkS2V5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNiINCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEM0QwMDNFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIyQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2VsZWN0b3IiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRTAyMzQiDQotCQkJCWxhYmVsICAgICAgCSJzZWxlY3RvciINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAwMjUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMzY1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmaWVsZHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNzkiDQotCQkJCWxhYmVsICAgICAgCSJmaWVsZHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MCINCi0JCQlxdWlkICAgICAgIAkiM0I2QURDRDgwMkZDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURDRDkwMThDIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MiINCi0JCQlxdWlkICAgICAgIAkiM0I2QURDQzUwMDdFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbmNsdWRlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QyINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDQiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjE3MDJDOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxODAzRTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxOTAwMDQiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCMTAyRjgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDFCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAyNSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0OCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM2MDYwMjZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicGFydGljbGVzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNzAyMjIiDQotCQkJCWxhYmVsICAgICAgCSJwYXJ0aWNsZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNTAwOEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMDk2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDBBMCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTIiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzN0FDMDI1QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3QUQwMzM5Ig0KLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNDUwMzk4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM4QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM5RSINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRjAyMTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEM5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEQzIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1OCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQ3MTUwMTE5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0NzFBMDNBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQjUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjAiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQzg5MDEyMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0ZXJtIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTEiDQotCQkJCWxhYmVsICAgICAgCSJ0ZXJtIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBREU0MjAwOUEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURFNDMwMkZFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDMwOCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNDAwNTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQjciDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QjAwM0QiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTA3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTExIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjgiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRThEMDFCRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3MCINCi0JCQlxdWlkICAgICAgIAkiM0I2NkZERkEwMEMzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZURlY2xhcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MjAyMTYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTczIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QyINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzQiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDA0OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzNzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzN0UiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFRkYwMjRGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI1QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI2NCINCi0JCQkJbGFiZWwgICAgICAJIm1vZGVsR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc4Ig0KLQkJCXF1aWQgICAgICAgCSIzQkZDMkExNzAxRUQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JGQzJBMUEwMjczIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyN0QiDQotCQkJCWxhYmVsICAgICAgCSJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MCINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFQTcwMjNFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJub3RhdGlvbkRlY2xhcmF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhCIg0KLQkJCQlsYWJlbCAgICAgIAkibm90YXRpb25EZWNsYXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NjAyOTAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTY1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNkYiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4NCINCi0JCQlxdWlkICAgICAgIAkiM0I2RDVDQTUwMTEyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0M4Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRDAzNzQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM1QUYwMDA2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRDb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAxMCINCi0JCQkJbGFiZWwgICAgICAJImZhY2V0Q29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg4Ig0KLQkJCXF1aWQgICAgICAgCSIzQkM4QUUwMjAzQTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JDOEFFMDYwMDUxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNjUiDQotCQkJCWxhYmVsICAgICAgCSJmYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkwIg0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzRCNzAyMDgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWVtYmVyVHlwZURlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTkiDQotCQkJCWxhYmVsICAgICAgCSJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzYzMjAxREIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZnVuZGFtZW50YWxGYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNjM1MDA2MyINCi0JCQkJbGFiZWwgICAgICAJImZ1bmRhbWVudGFsRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZEMzVBQjAyNzMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMzVCMjAyQTUiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZENTU3MjAxNkMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjJGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDI0MyINCi0JCQkJbGFiZWwgICAgICAJInByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5OCINCi0JCQlxdWlkICAgICAgIAkiM0I2OUUyOTEwMTU4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMjkyMDE5RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxQTkiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAwIg0KLQkJCXF1aWQgICAgICAgCSIzQjkwMDZDRjAwODgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTVEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZGVyaXZhdGlvbkFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDZEMTAxNjciDQotCQkJCWxhYmVsICAgICAgCSJkZXJpdmF0aW9uQW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMiINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMzMwMjY0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIzNDAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTEwMjZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDFGOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAyMDMiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzYyNkVCMzAwMDUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUI0MDMzMiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA4Ig0KLQkJCXF1aWQgICAgICAgCSIzQkVCREM4NzAyNDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMkY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDMwMyINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTAiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2MjI3MDNDRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcG9uZW50cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyMkIwMDZDIg0KLQkJCQlsYWJlbCAgICAgIAkiY29tcG9uZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTIiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2MjY5MDE2NSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTMiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJkaWFnbm9zdGljcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjciDQotCQkJCWxhYmVsICAgICAgCSJkaWFnbm9zdGljcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNCINCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0MzEwMzVGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbGxEaWFnbm9zdGljcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY0MzIwMUM3Ig0KLQkJCQlsYWJlbCAgICAgIAkiYWxsRGlhZ25vc3RpY3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTYiDQotCQkJcXVpZCAgICAgICAJIjNDMjFEQ0M3MDBFQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTciDQotCQkJCXF1aWQgICAgICAgCSIzQzIxRENDRTAwNDIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRTY2hlbWEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MyINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTgiDQotCQkJcXVpZCAgICAgICAJIjNDMjFERDBDMDNEQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTkiDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjAiDQotCQkJcXVpZCAgICAgICAJIjNDMjM5MTM0MDA0RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjEiDQotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwQ0EiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBENCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjIiDQotCQkJcXVpZCAgICAgICAJIjNDMjVEM0E2MDEzMSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RDNBOTAzNzAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MSINCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jaW5nRGlyZWN0aXZlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUNGMDAwNUUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDFFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFZlcnNpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUNGNDAwMjgiDQotCQkJCWxhYmVsICAgICAgCSJyb290VmVyc2lvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUQwQjAxMUIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTIxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAib3JpZ2luYWxWZXJzaW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTJCIg0KLQkJCQlsYWJlbCAgICAgIAkib3JpZ2luYWxWZXJzaW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjgiDQotCQkJcXVpZCAgICAgICAJIjNDMjVFRUFCMDAxRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUVBRjAxMEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTE1Ig0KLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzMCINCi0JCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMERFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzMSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIml0ZW1UeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMEUwIg0KLQkJCQlsYWJlbCAgICAgIAkiaXRlbVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzMiINCi0JCQlxdWlkICAgICAgIAkiM0MyNzg0NzMwMTk0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzMyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NDc1MDFGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYUZvclNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NDc1MDFGQiINCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYUZvclNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4ODBGNTAzRDkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODgwRjkwMDNDIg0KLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwNDYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNiINCi0JCQlxdWlkICAgICAgIAkiM0MyODgyQzUwMTM3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltYXJ5Q29tcG9uZW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTMiDQotCQkJCWxhYmVsICAgICAgCSJwcmltYXJ5Q29tcG9uZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzOCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEEwRjIwMUE0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRTUiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBNkRCMDFFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERCINCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTZERDAzREUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTcxMjAxMDgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNTEiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTVCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3NEIwMTc4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxN0IiDQotCQkJCWxhYmVsICAgICAgCSJzaW1wbGVUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxODUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTdFRDAzQzAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcGxleFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMTciDQotCQkJCWxhYmVsICAgICAgCSJjb21wbGV4VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ3Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3RjQwMTIxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE5OTQwMzBBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBERCINCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE5OTcwMEU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwODUwMjVCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDg2MDI3MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjdBIg0KLQkJCQlsYWJlbCAgICAgIAkibWluRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RDAyNTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDkxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOUIiDQotCQkJCWxhYmVsICAgICAgCSJtYXhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFCMDM5NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhJbmNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEFDMDNENCINCi0JCQkJbGFiZWwgICAgICAJIm1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUYwMzM4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEIwMDFGOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMjAzIg0KLQkJCQlsYWJlbCAgICAgIAkibWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMzAyMDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTkwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRXhjbHVzaXZlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOUEiDQotCQkJCWxhYmVsICAgICAgCSJtaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEI2MDI4RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhFeGNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI3MDIyMSINCi0JCQkJbGFiZWwgICAgICAJIm1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMDUxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDI0NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjUwIg0KLQkJCQlsYWJlbCAgICAgIAkibGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCRjAxOEMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDZCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAid2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDc1Ig0KLQkJCQlsYWJlbCAgICAgIAkid2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEMyMDIxRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjciDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlbnVtZXJhdGlvbkZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMzMDBBQyINCi0JCQkJbGFiZWwgICAgICAJImVudW1lcmF0aW9uRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNTAxNTkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEIwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicGF0dGVybkZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCQSINCi0JCQkJbGFiZWwgICAgICAJInBhdHRlcm5GYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzgwMkE3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3MSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM5MDFFQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNhcmRpbmFsaXR5RmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRjUiDQotCQkJCWxhYmVsICAgICAgCSJjYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQjAzOUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjczIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibnVtZXJpY0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QxIg0KLQkJCQlsYWJlbCAgICAgIAkibnVtZXJpY0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMENGMDE5OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEMjAwODUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhMZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4RiINCi0JCQkJbGFiZWwgICAgICAJIm1heExlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwRDUwMEM1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDI3Ig0KLQkJCQlsYWJlbCAgICAgIAkibWluTGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAwREUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0NEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidG90YWxEaWdpdHNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDNENyINCi0JCQkJbGFiZWwgICAgICAJInRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMERCMDM3NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzY0Ig0KLQkJCQlsYWJlbCAgICAgIAkiZnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwREYwMDQ4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNCOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm9yZGVyZWRGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNDMyINCi0JCQkJbGFiZWwgICAgICAJIm9yZGVyZWRGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBFMzAwRDkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzhFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYm91bmRlZEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzk4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYm91bmRlZEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ0MDFFQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODciDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NTAzNjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2QSINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1heEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI1NEYwMTQ1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4OSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM4QyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM5NiINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNDAxMUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjBEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNTAyMTciDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNjJBMDBBQSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxMzgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTQyIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI2QjAwM0E2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMiINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVBhdHRlcm5GYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQTAyNkIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTg2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCN0NCMDE5MCINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCODQwMDA2MiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDI3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI4OTgwMTZEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA1NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDYwIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAwNTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0I5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAzQzMiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVMZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCOTcwMDFEQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MTAwQ0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBEOSINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1pbkZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNiINCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0QUUwMUNDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNyINCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDEwRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY0ZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTFBIg0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwOCINCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0RDMwMjhFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwOSINCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNQYXJ0aWNsZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkZEIg0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljUGFydGljbGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEwIg0KLQkJCXF1aWQgICAgICAgCSIzRDRCQjREOTAxRjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzExIg0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjg0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTIiDQotCQkJcXVpZCAgICAgICAJIjNENEM2OEZGMDFCRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTMiDQotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljV2lsZGNhcmQiDQotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTgiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ3NjgwMTM4Ig0KLQkJCXRpdGxlICAgICAgCSIxLiBDb21wb25lbnQgSGllcmFyY2h5IChQYXJ0IDE6IFN0cnVjdHVyZXMpIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEAzODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEAzODgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCA1NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQwLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzODkNCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMjI1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzODcNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoOTI4LCAyMjUpDQotCQkJCSAgICAoOTI4LCAxMzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEAzOTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzMjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MCwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzOTENCi0JCQkJbG9jYXRpb24gICAJKDEyMDMsIDcwNikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzg4DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEyMDMsIDcwNikNCi0JCQkJICAgICgxMjAzLCA2MTUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDM5Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDU2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzIsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzOTMNCi0JCQkJbG9jYXRpb24gICAJKDQ0NCwgNzA5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzOTINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDQ0LCA3MDkpDQotCQkJCSAgICAoNDQ0LCA2MTUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU3MiwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTU3MiwgNDY1KQ0KLQkJCQkgICAgKDE1NzIsIDM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAzOTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI5MCwgNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAzOTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAxMDU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2MiwgMTAxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDM5Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTA0LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkzNiwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM5OA0KLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCAxMjAzKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzOTYNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDUzLCAxMjAzKQ0KLQkJCQkgICAgKDQ1MywgMTExMSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEAzOTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDQwMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDgwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ2LCA3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgOTUwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA0MDANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTg3MiwgOTUwKQ0KLQkJCQkgICAgKDE4NzIsIDg1NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDAyDQotCQkJCWxvY2F0aW9uICAgCSgxODEsIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzk5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE4MSwgNDY1KQ0KLQkJCQkgICAgKDE4MSwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDQwMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcwLCAxMjMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNTUwDQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANDA0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDEwNTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzQsIDEwMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDQwNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTY5LCAxNDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANDA2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExODQsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkwMywgMTQ0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNTgxDQotCQkJCWhlaWdodCAgICAgCTExMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0MDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgNTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYyLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDQwOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzgsIDEwMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDA5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDU2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNiwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQxMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDEyOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNiwgMTI1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDQxMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDU2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDExDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjAsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA0MTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTI4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAyLCAxMjM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQxMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDMwLCAxNDQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTY5NA0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDQxNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjYsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJMzE4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANDE1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA4LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNDAyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSINCi0JCQkJY2xpZW50ICAgICAJQDM5Nw0KLQkJCQlzdXBwbGllciAgIAlAMzg3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk0LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM4OSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBANDE3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTYwLCA4MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQxOA0KLQkJCQlsb2NhdGlvbiAgIAkoOTYyLCA5NDcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDQxNw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg5NjIsIDk0NykNCi0JCQkJICAgICg5NjIsIDg1NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTkNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDIwDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOCwgMTE1NCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzUzNA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjkNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiDQotCQkJCWNsaWVudCAgICAgCUA0MTANCi0JCQkJc3VwcGxpZXIgICAJQDM5Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5LCAxMjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5LCA3MDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5MykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDIxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlANDEwDQotCQkJCXN1cHBsaWVyICAgCUAzOTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI1NiwgMTI0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NiwgMTIwMykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCWNsaWVudCAgICAgCUA0MTENCi0JCQkJc3VwcGxpZXIgICAJQDM5OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg0LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiDQotCQkJCWNsaWVudCAgICAgCUA0MDkNCi0JCQkJc3VwcGxpZXIgICAJQDM5MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAwMiwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAwMiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyINCi0JCQkJY2xpZW50ICAgICAJQDM5MA0KLQkJCQlzdXBwbGllciAgIAlAMzg3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY5LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY5LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM4OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDI1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQljbGllbnQgICAgIAlANDA3DQotCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTAsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzk0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciDQotCQkJCWNsaWVudCAgICAgCUAzOTUNCi0JCQkJc3VwcGxpZXIgICAJQDM5Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTEwLCA3NDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDcwOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUA0MTINCi0JCQkJc3VwcGxpZXIgICAJQDQxNw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyMSwgMTIyNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjEsIDk0NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjgNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDI5DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzcsIDg4NikNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxNTgxMg0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjQNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiDQotCQkJCWNsaWVudCAgICAgCUA0MDQNCi0JCQkJc3VwcGxpZXIgICAJQDM5MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwMCwgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzk0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUA0MDQNCi0JCQkJc3VwcGxpZXIgICAJQDQwMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5MywgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDk1MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCWNsaWVudCAgICAgCUAzOTYNCi0JCQkJc3VwcGxpZXIgICAJQDQxNw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDUwLCAxMDAxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCA5NDcpDQotCQkJCWRyYXdTdXBwbGllciAJQDQxOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDMyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIg0KLQkJCQljbGllbnQgICAgIAlAMzk5DQotCQkJCXN1cHBsaWVyICAgCUAzODcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM4OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDMzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDg0RjcwMDkyIg0KLQkJCQljbGllbnQgICAgIAlANDE1DQotCQkJCXN1cHBsaWVyICAgCUAzODcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMTIsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTIsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzg5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhCODAyODYiDQotCQkJCWNsaWVudCAgICAgCUAzOTINCi0JCQkJc3VwcGxpZXIgICAJQDM4Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM0LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MzQsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzg5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCWNsaWVudCAgICAgCUAzODgNCi0JCQkJc3VwcGxpZXIgICAJQDM4Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MCwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1MCwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzODkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJY2xpZW50ICAgICAJQDQxNA0KLQkJCQlzdXBwbGllciAgIAlAMzg3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzIsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3MiwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzODkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJY2xpZW50ICAgICAJQDQwMw0KLQkJCQlzdXBwbGllciAgIAlANDAwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkzLCAxMjIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MywgOTUwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiINCi0JCQkJY2xpZW50ICAgICAJQDQwNQ0KLQkJCQlzdXBwbGllciAgIAlAMzg4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCAxNDMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU5MCwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSINCi0JCQkJY2xpZW50ICAgICAJQDQwNg0KLQkJCQlzdXBwbGllciAgIAlAMzg4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMxLCAxNDMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMSwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDQxNw0KLQkJCQlzdXBwbGllciAgIAlAMzg4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTksIDc0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDQwMA0KLQkJCQlzdXBwbGllciAgIAlAMzg4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODcyLCA3NDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODcyLCA3MDYpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlANDA4DQotCQkJCXN1cHBsaWVyICAgCUA0MTcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MiwgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2MiwgOTQ3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0Mw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUsIDEzODgpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDI1MzENCi0JCQkJICAgIGhlaWdodCAgICAgCTY3DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUJBQTIwMzEwIg0KLQkJCQljbGllbnQgICAgIAlANDEzDQotCQkJCXN1cHBsaWVyICAgCUAzOTkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4LCAxNDI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUA0MTMNCi0JCQkJc3VwcGxpZXIgICAJQDM5Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjU2LCAxNDI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU2LCAxMjAzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTgpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJcXVpZCAgICAgICAJIjM3NEIxODE5MDAyOCINCi0JCQl0aXRsZSAgICAgIAkiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJem9vbSAgICAgICAJOTYNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA0NDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3ODQsIDE2MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcwLCAxNTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDQ0Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTYzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgMTU5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI4IiBANDQ4DQotCQkJCWxvY2F0aW9uICAgCSg0OTQsIDE2MjcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTMwMTdBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjb3BlIiBANDQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ0OA0KLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1NSwgMTU4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY29wZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3MTI1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZEIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDE2MjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYxLCAxNjI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxNjY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxMDE4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjkiIEA0NTINCi0JCQkJCVBhcmVudF9WaWV3IAlANDQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlCNjU0MDA2RSINCi0JCQkJCWNsaWVudCAgICAgCUA0NDgNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMyNywgMTYyNykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA0NTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE5MiwgMTIzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDg0LCAxMTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDQ1NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTc2LCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTEsIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI2OA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2MCIgQDQ1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjIyOSwgMTExMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4OTAxMjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYxIiBANDU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ1NQ0KLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTAiDQotCQkJCQljbGllbnQgICAgIAlANDU1DQotCQkJCQlzdXBwbGllciAgIAlANDU0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMjksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0ZXJtIiBANDU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ1NQ0KLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNTcsIDExMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdGVybSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzNDMyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDOEEwMTExIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ1Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDExNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjc0LCAxMTE5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTE5NDAzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQ2MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAxMjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJd2lkdGggICAgICAJNTIyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDQ2MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzcsIDcyNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJMzUyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ4IiBANDYyDQotCQkJCWxvY2F0aW9uICAgCSgyMjE5LCA4ODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDYwMjZGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0OSIgQDQ2Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjINCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMSINCi0JCQkJCWNsaWVudCAgICAgCUA0NjINCi0JCQkJCXN1cHBsaWVyICAgCUA0NjENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxOSwgODgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDgyMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0aWNsZXMiIEA0NjQNCi0JCQkJCVBhcmVudF9WaWV3IAlANDYyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1NywgLTI0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDY0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDUsIDg4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0aWNsZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNzAyMjIiDQotCQkJCQljbGllbnQgICAgIAlANDYyDQotCQkJCQlzdXBwbGllciAgIAlANDU0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA5MzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgxLCA4ODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0NjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjM5LCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTINCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA0NjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTA1LCAxMzgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1Mg0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANDY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NCIgQDQ3MA0KLQkJCQlsb2NhdGlvbiAgIAkoNTkwLCAxMTQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTUiIEA0NzENCi0JCQkJCVBhcmVudF9WaWV3IAlANDcwDQotCQkJCQlsb2NhdGlvbiAgIAkoMzAyLCAxNDgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDU5MCwgMTE0MCkNCi0JCQkJCSAgICAoNTQwLCAxMTQwKQ0KLQkJCQkJICAgICg1NDAsIDEwNDUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQwLCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDQ3Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzANCi0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0MywgMTE3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4wNTM1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDJBNSINCi0JCQkJCWNsaWVudCAgICAgCUA0NzANCi0JCQkJCXN1cHBsaWVyICAgCUA0NjkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg1OTAsIDExNDApDQotCQkJCQkgICAgKDY0MSwgMTE0MCkNCi0JCQkJCSAgICAoNjQxLCAxMDQ1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY0MSwgMTA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4NCwgMTA5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xMjI0NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANDc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQ0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTYiIEA0NzYNCi0JCQkJbG9jYXRpb24gICAJKDExMTksIDExMTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3REYwMjRGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk3IiBANDc3DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkQiDQotCQkJCQljbGllbnQgICAgIAlANDc2DQotCQkJCQlzdXBwbGllciAgIAlANDc1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50VHlwZSIgQDQ3OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU5LCAxMTI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA4OTU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZFIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ3Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDExNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYzLCAxMTI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA4OTU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMiIgQDQ4MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NSwgOTgyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1MUJBMDEyNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDMiIEA0ODINCi0JCQkJCVBhcmVudF9WaWV3IAlANDgxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MCINCi0JCQkJCWNsaWVudCAgICAgCUA0ODENCi0JCQkJCXN1cHBsaWVyICAgCUA0NzUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NSwgOTgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODAsIDk4MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDQ4Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODENCi0JCQkJCWxvY2F0aW9uICAgCSgxNTksIC01NzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ1LCA5MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYyODU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQjAxNTEiDQotCQkJCQljbGllbnQgICAgIAlANDgxDQotCQkJCQlzdXBwbGllciAgIAlANDY3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMwLCA5ODIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTUwLCAxMDIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQyODU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk4IiBANDg2DQotCQkJCWxvY2F0aW9uICAgCSg5MjEsIDEyMDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMDZFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk5IiBANDg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4Ng0KLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMzQ5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ4Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVVzZXMiIEA0ODgNCi0JCQkJCVBhcmVudF9WaWV3IAlANDg2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg3MSwgLTM3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDg4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTI1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVVc2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5OTM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMzRBIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMzcxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc5LCAxMjU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjg4MzQ0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDQ5MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDc2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDkxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMiwgNzI3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTM5OA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDQ5Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxNjMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjIzLCAxNTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDQ5Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCA0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDMsIDQwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MiIgQDQ5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMjIxNiwgNjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTMiIEA0OTUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDk0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiDQotCQkJCQljbGllbnQgICAgIAlANDk0DQotCQkJCQlzdXBwbGllciAgIAlANDkzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA1MDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDQ5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTUyLCAtODE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgNjI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODI2MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiDQotCQkJCQljbGllbnQgICAgIAlANDk0DQotCQkJCQlzdXBwbGllciAgIAlANDYxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA3MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU2LCA2MzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMzM2NDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANDk5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTksIDEzODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODIiIEA1MDANCi0JCQkJbG9jYXRpb24gICAJKDE2NzYsIDEyMDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QkYwMTUwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgzIiBANTAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDUwMA0KLQkJCQkJbG9jYXRpb24gICAJKDQxMiwgLTM0NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdDMDAwQTciDQotCQkJCQljbGllbnQgICAgIAlANTAwDQotCQkJCQlzdXBwbGllciAgIAlANDk5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NzYsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTM3MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDUwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDANCi0JCQkJCWxvY2F0aW9uICAgCSg0MTIsIC0zNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODU3LCAxMTA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjI1NzY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QzAwMEE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEwNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjE4LCAxMTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjE5NjMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc4IiBANTA1DQotCQkJCWxvY2F0aW9uICAgCSgxNDI5LCAxNDM4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTlGMDA4NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3OSIgQDUwNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzYzLCAtMTQ2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNUEwMDA2OSINCi0JCQkJCWNsaWVudCAgICAgCUA1MDUNCi0JCQkJCXN1cHBsaWVyICAgCUA0OTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjEwLCAxNDM4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVVzZXMiIEA1MDcNCi0JCQkJCVBhcmVudF9WaWV3IAlANTA1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDUsIDE1MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMjU5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDUwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDgsIDE0MzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI3LCAxMzkxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTYzNTM2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANTEwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTEwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODYiIEA1MTENCi0JCQkJbG9jYXRpb24gICAJKDc3NywgMTQyNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NTAxMEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODciIEA1MTINCi0JCQkJCVBhcmVudF9WaWV3IAlANTExDQotCQkJCQlsb2NhdGlvbiAgIAkoLTUxOSwgLTM2NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkEiDQotCQkJCQljbGllbnQgICAgIAlANTExDQotCQkJCQlzdXBwbGllciAgIAlANDY4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTYsIDE0MjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb24iIEA1MTMNCi0JCQkJCVBhcmVudF9WaWV3IAlANTExDQotCQkJCQlsb2NhdGlvbiAgIAkoLTUxOSwgLTM2NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc4NCwgMTUwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNTkyNTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTg2MDBGQiINCi0JCQkJCWNsaWVudCAgICAgCUA1MTENCi0JCQkJCXN1cHBsaWVyICAgCUA1MTANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OCwgMTQyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMSwgMTM4NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3MjQ0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MCIgQDUxNg0KLQkJCQlsb2NhdGlvbiAgIAkoMjM3LCAxMjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTZCMDJDQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MSIgQDUxNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUxNg0KLQkJCQkJc3VwcGxpZXIgICAJQDUxMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzcsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMzcxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTE4DQotCQkJCQlQYXJlbnRfVmlldyAJQDUxNg0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM4OCwgMTI0NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMzkyNjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTciDQotCQkJCQljbGllbnQgICAgIAlANTE2DQotCQkJCQlzdXBwbGllciAgIAlANDY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzcsIDEwNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTUsIDEyNDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjM5MjY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANTIxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgNzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OCwgNzQzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTIiIEA1MjINCi0JCQkJbG9jYXRpb24gICAJKDcyOCwgNzc1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzM1MDM0MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MyIgQDUyMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjINCi0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzYwMjhEIg0KLQkJCQkJY2xpZW50ICAgICAJQDUyMg0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDcyOCwgNzc1KQ0KLQkJCQkJICAgICg3ODgsIDc3NSkNCi0JCQkJCSAgICAoNzg4LCA5MzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODgsIDkzOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA1MjQNCi0JCQkJCVBhcmVudF9WaWV3IAlANTIyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1NiwgLTU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU4LCA4ODMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMTQwOTQwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzYwMjhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDUyMg0KLQkJCQkJc3VwcGxpZXIgICAJQDUyMQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzksIDc3NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MCwgODEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE1MjQzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANTI3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNywgNDA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzQiIEA1MjgNCi0JCQkJbG9jYXRpb24gICAJKDE2MjksIDU3NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RDI5RTAxNEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNlZEtleSIgQDUyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjgNCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MSwgNjA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jZWRLZXkiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNzk3Mjk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNjUiDQotCQkJCQljbGllbnQgICAgIAlANTI4DQotCQkJCQlzdXBwbGllciAgIAlANTI3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYyOSwgNTc0KQ0KLQkJCQkJICAgICgxNTU1LCA1NzQpDQotCQkJCQkgICAgKDE1NTUsIDUwMSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCA1MDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjIyLCA1MzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDc2MTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNSIgQDUzMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjgNCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2RiINCi0JCQkJCWNsaWVudCAgICAgCUA1MjgNCi0JCQkJCXN1cHBsaWVyICAgCUA1MjcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjI5LCA1NzQpDQotCQkJCQkgICAgKDE2ODksIDU3NCkNCi0JCQkJCSAgICAoMTY4OSwgNDQ0KQ0KLQkJCQkJICAgICgxNjE2LCA0NDQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxNiwgNDQ0KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM4IiBANTMzDQotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCA2MDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzOSIgQDUzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE1LCAzMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNjUiDQotCQkJCQljbGllbnQgICAgIAlANTMzDQotCQkJCQlzdXBwbGllciAgIAlANTI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA1MDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBANTM1DQotCQkJCQlQYXJlbnRfVmlldyAJQDUzMw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExOSwgNjU1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzOTI1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTc4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ5MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MywgNjU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5OTA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNiIgQDUzOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQxNSwgNjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNEMDAzRSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzciIEA1MzkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTM4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzLCAzMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiDQotCQkJCQljbGllbnQgICAgIAlANTM4DQotCQkJCQlzdXBwbGllciAgIAlANTI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE1LCA1MDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2VsZWN0b3IiIEA1NDANCi0JCQkJCVBhcmVudF9WaWV3IAlANTM4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzLCAzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTMsIDY1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzZWxlY3RvciINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQxMTIxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTk4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUzOA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ5MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE1LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MSwgNjUwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzkyNTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDU0Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDIyLCA2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk1OTkNCi0JCQkJaGVpZ2h0ICAgICAJMjA5DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODAiIEA1NDQNCi0JCQkJbG9jYXRpb24gICAJKDIzOTUsIDYwNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBNzAyM0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgxIiBANTQ1DQotCQkJCQlQYXJlbnRfVmlldyAJQDU0NA0KLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEEiDQotCQkJCQljbGllbnQgICAgIAlANTQ0DQotCQkJCQlzdXBwbGllciAgIAlANTQzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM5NSwgNjA2KQ0KLQkJCQkJICAgICgyMzk1LCA2NSkNCi0JCQkJCSAgICAoMTYxMSwgNjUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzk1LCA2MDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgNjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibm90YXRpb25EZWNsYXJhdGlvbnMiIEA1NDYNCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgMTc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4OSwgMTA0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK25vdGF0aW9uRGVjbGFyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4OTc3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRUE4MDM4QiINCi0JCQkJCWNsaWVudCAgICAgCUA1NDQNCi0JCQkJCXN1cHBsaWVyICAgCUA0OTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzk1LCA2MDYpDQotCQkJCQkgICAgKDIzOTUsIDE2MzMpDQotCQkJCQkgICAgKDIwOTgsIDE2MzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzk1LCA2MDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5OCwgMTYzMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNDQsIDEwNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODc4MjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc2IiBANTQ5DQotCQkJCWxvY2F0aW9uICAgCSgxNzcyLCAyNDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFRkYwMjRGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3NyIgQDU1MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI1QSINCi0JCQkJCWNsaWVudCAgICAgCUA1NDkNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDI0OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiIEA1NTENCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzYsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTM1OTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNjQiDQotCQkJCQljbGllbnQgICAgIAlANTQ5DQotCQkJCQlzdXBwbGllciAgIAlANDkzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTc3MiwgMjQ5KQ0KLQkJCQkJICAgICgxODMyLCAyNDkpDQotCQkJCQkgICAgKDE4MzIsIDM5NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODMyLCAzOTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAzNDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mzc4NjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcyIiBANTU0DQotCQkJCWxvY2F0aW9uICAgCSgyMzQ2LCA1MTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTIwMjE2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MyIgQDU1NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTQNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTQsIDg2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3MiwgMTg1NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy42MzAwNzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MzAxOEIiDQotCQkJCQljbGllbnQgICAgIAlANTU0DQotCQkJCQlzdXBwbGllciAgIAlANTQzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0NiwgNTE4KQ0KLQkJCQkJICAgICgyMzQ2LCAxNDkpDQotCQkJCQkgICAgKDE2MTEsIDE0OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDUxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCAxNDkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIgQDU1Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTQNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTQsIDg2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwOCwgMTk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ5OTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThDIg0KLQkJCQkJY2xpZW50ICAgICAJQDU1NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNDYsIDUxOCkNCi0JCQkJCSAgICAoMjM0NiwgMTQ0MSkNCi0JCQkJCSAgICAoMjE2NiwgMTQ0MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDUxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTY2LCAxNDQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI5OSwgMTk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0ODg2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzQiIEA1NjANCi0JCQkJbG9jYXRpb24gICAJKDIwMywgMTU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDA0OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzUiIEA1NjENCi0JCQkJCVBhcmVudF9WaWV3IAlANTYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4NSwgLTI3MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAzNzQiDQotCQkJCQljbGllbnQgICAgIAlANTYwDQotCQkJCQlzdXBwbGllciAgIAlANTQzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE1OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbnMiIEA1NjINCi0JCQkJCVBhcmVudF9WaWV3IAlANTYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4NSwgLTI3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM0OSwgMTk2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS40NzU3MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDM3RSINCi0JCQkJCWNsaWVudCAgICAgCUA1NjANCi0JCQkJCXN1cHBsaWVyICAgCUA1MjENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMDMsIDE1OSkNCi0JCQkJCSAgICAoMTA0LCAxNTkpDQotCQkJCQkgICAgKDEwNCwgNzg0KQ0KLQkJCQkJICAgICgxODksIDc4NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OSwgNzg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1LCAyMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk3MDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc4IiBANTY1DQotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCAzMjkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMTcwMUVEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3OSIgQDU2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTc3LCAtMjMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjczIg0KLQkJCQkJY2xpZW50ICAgICAJQDU2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU0Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgMjY0KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANTY3DQotCQkJCQlQYXJlbnRfVmlldyAJQDU2NQ0KLQkJCQkJbG9jYXRpb24gICAJKC01NzcsIC0yMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzUsIDMzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMDk1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3RCINCi0JCQkJCWNsaWVudCAgICAgCUA1NjUNCi0JCQkJCXN1cHBsaWVyICAgCUA1MjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgMzI5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDM5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTgsIDMzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEwNzE0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzAiIEA1NzANCi0JCQkJbG9jYXRpb24gICAJKDQ4LCAzMjApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkEwMEMzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MSIgQDU3MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0QiDQotCQkJCQljbGllbnQgICAgIAlANTcwDQotCQkJCQlzdXBwbGllciAgIAlANTQzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDksIDMyMikNCi0JCQkJCSAgICAoNDksIDY4KQ0KLQkJCQkJICAgICgxMDEzLCA2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgNjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb25zIiBANTcyDQotCQkJCQlQYXJlbnRfVmlldyAJQDU3MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM4LCAxMDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE5ODUzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RSINCi0JCQkJCWNsaWVudCAgICAgCUA1NzANCi0JCQkJCXN1cHBsaWVyICAgCUA1MTANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OSwgMzIyKQ0KLQkJCQkJICAgICg0OSwgMTQxNSkNCi0JCQkJCSAgICAoMTc0LCAxNDE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDksIDMyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDE0MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MSwgMTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE5NjcwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA1NzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NSwgNDEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTUwMQ0KLQkJCQloZWlnaHQgICAgIAk5Nw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIwIiBANTc2DQotCQkJCWxvY2F0aW9uICAgCSg0OTksIDU4OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1OTAxOTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIxIiBANTc3DQotCQkJCQlQYXJlbnRfVmlldyAJQDU3Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFMyINCi0JCQkJCWNsaWVudCAgICAgCUA1NzYNCi0JCQkJCXN1cHBsaWVyICAgCUA1NzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OTksIDU4OSkNCi0JCQkJCSAgICAoNDUyLCA1ODkpDQotCQkJCQkgICAgKDQ1MiwgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUyLCA0OTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiIgQDU3OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgxMSwgNTg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJNi41MjA4MzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDU3Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDU3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ5OSwgNTg5KQ0KLQkJCQkJICAgICg1NDcsIDU4OSkNCi0JCQkJCSAgICAoNTQ3LCA0OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTksIDU4OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDcsIDQ5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ5OSwgNTU5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNCIgQDU4MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQxLCA2MTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwMDU4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNSIgQDU4Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODENCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQkYiDQotCQkJCQljbGllbnQgICAgIAlANTgxDQotCQkJCQlzdXBwbGllciAgIAlANTc1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MSwgNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTgzDQotCQkJCQlQYXJlbnRfVmlldyAJQDU4MQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzQzLCAtMjE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA4LCA2OTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODY0NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQzAiDQotCQkJCQljbGllbnQgICAgIAlANTgxDQotCQkJCQlzdXBwbGllciAgIAlANTIxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MSwgNzMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCA2ODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MTAxNjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE2IiBANTg2DQotCQkJCWxvY2F0aW9uICAgCSg4MzcsIDQ2MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE3IiBANTg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDU4Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xODE5LCAtNjgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU4Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDU3NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDQ2MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU4OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCA1MjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNTE0NjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSINCi0JCQkJCWNsaWVudCAgICAgCUA1ODYNCi0JCQkJCXN1cHBsaWVyICAgCUA1MjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwOCwgNDYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCA0MDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA0MzUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY4IiBANTkxDQotCQkJCWxvY2F0aW9uICAgCSg1NDEsIDI0NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RDAxQkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY5IiBANTkyDQotCQkJCQlQYXJlbnRfVmlldyAJQDU5MQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTIzLCAtMTg2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OCINCi0JCQkJCWNsaWVudCAgICAgCUA1OTENCi0JCQkJCXN1cHBsaWVyICAgCUA1NDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMjQ2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVsZW1lbnREZWNsYXJhdGlvbnMiIEA1OTMNCi0JCQkJCVBhcmVudF9WaWV3IAlANTkxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMjMsIC0xODYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDMsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA5MzAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTkiDQotCQkJCQljbGllbnQgICAgIAlANTkxDQotCQkJCQlzdXBwbGllciAgIAlANTc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNTQxLCAyNDYpDQotCQkJCQkgICAgKDIyNCwgMjQ2KQ0KLQkJCQkJICAgICgyMjQsIDQwMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyNCwgNDAwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTk1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2LCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjQ2OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIyIiBANTk2DQotCQkJCWxvY2F0aW9uICAgCSgzNTMsIDYyMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzQyREJERDAyOTciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIzIiBANTk3DQotCQkJCQlQYXJlbnRfVmlldyAJQDU5Ng0KLQkJCQkJbG9jYXRpb24gICAJKC02MywgMTczKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDJEQkUwMDExRSINCi0JCQkJCWNsaWVudCAgICAgCUA1OTYNCi0JCQkJCXN1cHBsaWVyICAgCUA1NzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNTMsIDYyMSkNCi0JCQkJCSAgICAoMzA2LCA2MjEpDQotCQkJCQkgICAgKDMwNiwgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA2LCA0OTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3Vic3RpdHV0aW9uR3JvdXAiIEA1OTgNCi0JCQkJCVBhcmVudF9WaWV3IAlANTk2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzksIDYzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzdWJzdGl0dXRpb25Hcm91cCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAk0LjgwODUxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTI4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU5Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDU3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM1MywgNjIxKQ0KLQkJCQkJICAgICg0MDAsIDYyMSkNCi0JCQkJCSAgICAoNDAwLCA0OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MDAsIDQ5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTk4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM1MCwgNTgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2OTc2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMy4gQ29tcG9uZW50IEF0dHJpYnV0ZXMgIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUU3ODYwMkM1Ig0KLQkJCXRpdGxlICAgICAgCSIzLiBDb21wb25lbnQgQXR0cmlidXRlcyAgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDYwMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDEyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NiwgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NiwgMTA3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbmFtZSA6IFN0cmluZyINCi0JCQkJCSIrIHRhcmdldE5hbWVzcGFjZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1MzQNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANjAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxNjQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTU2NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTUxMg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANjAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNjgsIDE2ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDE1MjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTE3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDE1ODQpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk1DQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTM5DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZGVyaXZhdGlvbk1ldGhvZCA6IFhTRERlcml2YXRpb25NZXRob2QgPSByZXN0cmljdGlvbiINCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEQ29tcGxleEZpbmFsIg0KLQkJCQkJIisgYWJzdHJhY3QgOiBib29sZWFuIg0KLQkJCQkJIisgY29udGVudFR5cGVDYXRlZ29yeSA6IFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJCQkiPDwwLi4qPj4gKyBwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikpDQotCQkJCXdpZHRoICAgICAgCTExOTINCi0JCQkJaGVpZ2h0ICAgICAJMzM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYwNA0KLQkJCQlsb2NhdGlvbiAgIAkoNDYzLCAzNjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDYwMQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0NjMsIDM2MikNCi0JCQkJICAgICg0NjMsIDIyMSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA2MDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgMTYwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMTUxOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1NzkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSINCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkNCi0JCQkJd2lkdGggICAgICAJNjQ2DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA2MDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTEyLCAxNDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY0NywgMzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCA5OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHJlcXVpcmVkIDogYm9vbGVhbiINCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiDQotCQkJCQkiKyBjb25zdHJhaW50IDogWFNEQ29uc3RyYWludCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NDgNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANjA3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMTkzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4MzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTI4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4OTApDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjYwDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IDogWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgbmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyINCi0JCQkJCSIrIHByb2Nlc3NDb250ZW50cyA6IFhTRFByb2Nlc3NDb250ZW50cyIpKQ0KLQkJCQl3aWR0aCAgICAgIAkxMzA0DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANjA4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAxNDQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgMTM4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJNTk2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANjA5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCA0MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCA0OTEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDYNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIg0KLQkJCQkJIisgY29uc3RyYWludCA6IFhTRENvbnN0cmFpbnQiKSkNCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MTANCi0JCQkJbG9jYXRpb24gICAJKDI5NCwgNjk3KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2MDkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjk0LCA2OTcpDQotCQkJCSAgICAoMjk0LCA2MDUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDYxMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNTYsIDEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjExDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NSwgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNTQwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDYxMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjg4LCA1MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjEyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxOCwgNDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MTMNCi0JCQkJbG9jYXRpb24gICAJKDI2ODQsIDk2MikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjEyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI2ODQsIDk2MikNCi0JCQkJICAgICgyNjg0LCA1NzYpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvc2l0b3IiIEA2MTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxMTE2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvc2l0b3IiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTA2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlCNjIwMDM3Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbnQiIEA2MTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0NjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWludCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDE5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUUyNjAxQUUiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGVyaXZhdGlvbk1ldGhvZCIgQDYxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDIyNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIyMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGVyaXZhdGlvbk1ldGhvZCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIxNjMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODZBMEIwMDBDRSINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIgQDYxNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1ODQsIDE3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4MSwgODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjA3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCAzOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjA3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NkExRTAwMjcyIg0KLQkJCQl3aWR0aCAgICAgIAk2MjUNCi0JCQkJaGVpZ2h0ICAgICAJMzAwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiIEA2MTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzA0LCAyMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDU2LCAyMTE1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDU2LCAyMDY1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTc5RjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTUxNA0KLQkJCQloZWlnaHQgICAgIAkzNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDYxOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTYwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNTE2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFZhcmlldHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MDgsIDE0NjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSINCi0JCQkJd2lkdGggICAgICAJMzYyDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9jZXNzQ29udGVudHMiIEA2MjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDIyNDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMjE1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxMDYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGOEM3MDI4NCINCi0JCQkJd2lkdGggICAgICAJNDM4DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aFZhcmlldHkiIEA2MjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzY4LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI1ODcsIDk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoVmFyaWV0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI1ODcsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRkI4OTAzM0EiDQotCQkJCXdpZHRoICAgICAgCTM4MQ0KLQkJCQloZWlnaHQgICAgIAkyNTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA2MjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMTg3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTc4OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3MzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTg0OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTE5OQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGxpc3QiDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIHVuaW9uIikpDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBANjIzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDIwMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDE5NDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleEZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMTg5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyQ0EwMUNCIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAyMDAxKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjAyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkNCi0JCQkJd2lkdGggICAgICAJMzgyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiIEA2MjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDEwNzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNTkxMDBBRSINCi0JCQkJd2lkdGggICAgICAJNjQ4DQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDYyNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMTE2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTA2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMTc2KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM2DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgc3Vic3RpdHV0aW9uIg0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkNCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIgQDYyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjY0LCAyMjcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMjEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjE2MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QkUwMjcyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMjczKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjAyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkNCi0JCQkJd2lkdGggICAgICAJNTUwDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiIEA2MjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDIyNDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAyMTU0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAyMTA0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVFQTAwMjMiDQotCQkJCXdpZHRoICAgICAgCTY5Ng0KLQkJCQloZWlnaHQgICAgIAkyOTYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANjI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDg4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCA3NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTM4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgODA5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTM1Nw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG5pbGxhYmxlIDogYm9vbGVhbiINCi0JCQkJCSI8PDAuLio+PiArIGRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCQkiPDwwLi4qPj4gKyBzdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMgOiBYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiDQotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJMTQwNA0KLQkJCQloZWlnaHQgICAgIAkyODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MjkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUA2MjgNCi0JCQkJc3VwcGxpZXIgICAJQDYwOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjgxLCA3MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODEsIDY5NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjEwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA2MzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA4NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCA4MTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0OTINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDYzMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjg4LCAxMTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDIwLCAxMTAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MzINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUA2MzENCi0JCQkJc3VwcGxpZXIgICAJQDYxMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg2MiwgMTA4OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NjIsIDk2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjEzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA2MzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM1MiwgMTMxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTY4LCAxMjYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzg2DQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MzQNCi0JCQkJbG9jYXRpb24gICAJKDIzNzUsIDE0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDYzMw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyMzc1LCAxNDY1KQ0KLQkJCQkgICAgKDIzNzUsIDEzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjM1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlANjMzDQotCQkJCXN1cHBsaWVyICAgCUA2MTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNjgsIDEyNDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzY4LCA5NjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYxMykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjM2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlANjAzDQotCQkJCXN1cHBsaWVyICAgCUA2MzMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4MTgsIDE1MTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODE4LCAxNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYzNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDYwNQ0KLQkJCQlzdXBwbGllciAgIAlANjMzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA2LCAxNTA3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNiwgMTQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjM0KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA2MzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOCwgMTEwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MzkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiDQotCQkJCWNsaWVudCAgICAgCUA2MzgNCi0JCQkJc3VwcGxpZXIgICAJQDYxMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExNSwgMTA4OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDk2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjEzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDY0MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNCwgNDY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExMzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJMTE1MA0KLQkJCQloZWlnaHQgICAgIAkxNDQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiDQotCQkJCWNsaWVudCAgICAgCUA2NDANCi0JCQkJc3VwcGxpZXIgICAJQDYwMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2OCwgNDU2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OCwgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MDQpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANjQyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgNzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc4LCA3MDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTUwMg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANjQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMjY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDk0MzAyRjEiDQotCQkJCWNsaWVudCAgICAgCUA2NDINCi0JCQkJc3VwcGxpZXIgICAJQDYwMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI5MCwgNjkxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5MCwgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MDQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJY2xpZW50ICAgICAJQDYzMA0KLQkJCQlzdXBwbGllciAgIAlANjA5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDEsIDgwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MSwgNjk3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDYwOQ0KLQkJCQlzdXBwbGllciAgIAlANjAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNzIsIDQxOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM3MiwgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MDQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDYxMg0KLQkJCQlzdXBwbGllciAgIAlANjAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjg3LCA0NDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjg3LCAzNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYwNCkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSINCi0JCQlxdWlkICAgICAgIAkiM0I2QzMyNjUwMDVGIg0KLQkJCXRpdGxlICAgICAgCSI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIgQDY0OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgODk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDMyLCA4NDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERml4ZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiDQotCQkJCXdpZHRoICAgICAgCTMzOA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IiBANjQ5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA4OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA0LCA4NDUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSINCi0JCQkJd2lkdGggICAgICAJNDUwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IiBANjUwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjYsIDExMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCXdpZHRoICAgICAgCTQ3OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IiBANjUxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc3LCAxMTEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjUyDQotCQkJCWxvY2F0aW9uICAgCSg3MTgsIDEwNDkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY0OQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg3MTgsIDEwNDkpDQotCQkJCSAgICAoNzE4LCA5NTkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIgQDY1Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDkyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc5OSwgODcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJCXdpZHRoICAgICAgCTQyMA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBANjU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgOTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzgzLCA4NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCINCi0JCQkJd2lkdGggICAgICAJMzg4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IiBANjU1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzMiwgMTEwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjU1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNywgMTA0OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQkJd2lkdGggICAgICAJNDY4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROdW1lcmljRmFjZXQiIEA2NTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCAxMTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzE5LCAxMDQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJCXdpZHRoICAgICAgCTM4OA0KLQkJCQloZWlnaHQgICAgIAkxMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEA2NTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NTYsIDEzNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5MSwgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCXdpZHRoICAgICAgCTM0OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiIEA2NTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDE1NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQwNSwgMTQ5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5MZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCXdpZHRoICAgICAgCTQyNA0KLQkJCQloZWlnaHQgICAgIAkxMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjU5DQotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDEyNjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY0OA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNDQsIDEyNjIpDQotCQkJCSAgICAoMTQ0LCA5NjQpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IiBANjYwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMTU1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNywgMTQ5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IiBANjYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTM3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCXdpZHRoICAgICAgCTQ5OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEA2NjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDkwLCAxNjc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSINCi0JCQkJd2lkdGggICAgICAJNDYyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDY2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE5MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDE4NTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBANjY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyODIsIDE2NzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBANjY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxOTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQsIDE4NTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRXhjbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIg0KLQkJCQl3aWR0aCAgICAgIAk0NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEA2NjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUyLCAyMDU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQl3aWR0aCAgICAgIAk0MjYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiIEA2NjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzE4LCAyMDU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjY4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOUQwM0M3Ig0KLQkJCQljbGllbnQgICAgIAlANjUwDQotCQkJCXN1cHBsaWVyICAgCUA2NDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM5NCwgMTEwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM5NCwgMTA0OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjUyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg2MjAwNDUiDQotCQkJCWNsaWVudCAgICAgCUA2NjENCi0JCQkJc3VwcGxpZXIgICAJQDY0OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTMwOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDY3MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NCwgMTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkNBNTAzOEQiDQotCQkJCWNsaWVudCAgICAgCUA2NTENCi0JCQkJc3VwcGxpZXIgICAJQDY0OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA0NCwgMTEwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDQsIDEwNDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY1MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjcyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3ODAwMkRGIg0KLQkJCQljbGllbnQgICAgIAlANjU3DQotCQkJCXN1cHBsaWVyICAgCUA2NDgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MywgMTMwOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MywgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZCIgQDY3Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDE0MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEzMjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEyNzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCQzc3MTUyMDJFNCINCi0JCQkJd2lkdGggICAgICAJNDQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eSIgQDY3NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDE3MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2NjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjE5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkM3NzE1RDAwOUIiDQotCQkJCXdpZHRoICAgICAgCTQ0NA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZSIgQDY3NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDIwMzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCRUVEMEY2MDM0MiINCi0JCQkJd2lkdGggICAgICAJNDI0DQotCQkJCWhlaWdodCAgICAgCTI4Nw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpWYWx1ZSIgQDY3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMjA5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDYyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlZhbHVlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MwNDBCNUIwMzFGIg0KLQkJCQl3aWR0aCAgICAgIAk2MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjc3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNjEwMzM3Ig0KLQkJCQljbGllbnQgICAgIAlANjY2DQotCQkJCXN1cHBsaWVyICAgCUA2NDgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAyMDQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IiBANjc4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMTM3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTMsIDEzMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTMsIDEzODApDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTQNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIikpDQotCQkJCXdpZHRoICAgICAgCTMwNA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEA2NzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTM3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTM4MCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkNCi0JCQkJd2lkdGggICAgICAJMzA2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExRDI0MDA5OCINCi0JCQkJY2xpZW50ICAgICAJQDY3OA0KLQkJCQlzdXBwbGllciAgIAlANjQ4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzUsIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzUsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMzEwM0FEIg0KLQkJCQljbGllbnQgICAgIAlANjc5DQotCQkJCXN1cHBsaWVyICAgCUA2NDgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTgxLCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjUyMDM1MyINCi0JCQkJY2xpZW50ICAgICAJQDY2NA0KLQkJCQlzdXBwbGllciAgIAlANjc4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODUsIDE2NjQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODUsIDE0NDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I4MzAzQjgiDQotCQkJCWNsaWVudCAgICAgCUA2NjINCi0JCQkJc3VwcGxpZXIgICAJQDY3OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwMCwgMTY2NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDAsIDE0NDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I4RTAzMDkiDQotCQkJCWNsaWVudCAgICAgCUA2NjMNCi0JCQkJc3VwcGxpZXIgICAJQDY3OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyMiwgMTg0MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjIsIDE0NDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNDAwQzAiDQotCQkJCWNsaWVudCAgICAgCUA2NTgNCi0JCQkJc3VwcGxpZXIgICAJQDY0OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDQ3LCAxNDg1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ3LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjdEMDBGQyINCi0JCQkJY2xpZW50ICAgICAJQDY2MA0KLQkJCQlzdXBwbGllciAgIAlANjQ4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzk3LCAxNDg1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM5NywgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I5OTAwMTYiDQotCQkJCWNsaWVudCAgICAgCUA2NjcNCi0JCQkJc3VwcGxpZXIgICAJQDY0OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3NSwgMjA0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzUsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANjg4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMzY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NCwgMzE4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJd2lkdGggICAgICAJNDA2DQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2ODkNCi0JCQkJbG9jYXRpb24gICAJKDM2NiwgNTIyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2ODgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMzY2LCA1MjIpDQotCQkJCSAgICAoMzY2LCA0MzApKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANjkwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA2MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQsIDU3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCXdpZHRoICAgICAgCTQ2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjkxDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDc4MSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjkwDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI3MiwgNzgxKQ0KLQkJCQkgICAgKDI3MiwgNjg3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzhGMDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDY0OQ0KLQkJCQlzdXBwbGllciAgIAlANjkwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTQsIDgzMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5NCwgNzgxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2OTEpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IiBANjkzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCA2MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnVuZGFtZW50YWxGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiDQotCQkJCXdpZHRoICAgICAgCTQ3MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjk0DQotCQkJCWxvY2F0aW9uICAgCSg3NjgsIDc4OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjkzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDc2OCwgNzg5KQ0KLQkJCQkgICAgKDc2OCwgNjg3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjU5MDEyQyINCi0JCQkJY2xpZW50ICAgICAJQDY1Mw0KLQkJCQlzdXBwbGllciAgIAlANjkzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDUwLCA4NjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDUwLCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY5NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2M0MwMjI0Ig0KLQkJCQljbGllbnQgICAgIAlANjU0DQotCQkJCXN1cHBsaWVyICAgCUA2OTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjUsIDg2MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjUsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjk0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0RjAxMzEiDQotCQkJCWNsaWVudCAgICAgCUA2NTUNCi0JCQkJc3VwcGxpZXIgICAJQDY5Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzNywgMTAzNikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMzcsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjk0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0MjAwNzQiDQotCQkJCWNsaWVudCAgICAgCUA2NTYNCi0JCQkJc3VwcGxpZXIgICAJQDY5Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMTAzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjk0KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA2OTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NiwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDEwNykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhcmlldHkgOiBYU0RWYXJpZXR5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NTYNCi0JCQkJaGVpZ2h0ICAgICAJMjUwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNiIgQDcwMA0KLQkJCQlsb2NhdGlvbiAgIAkoNzc1LCAxNzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzEwMkVBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNyIgQDcwMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA5LCAyMzUpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMTkiDQotCQkJCQljbGllbnQgICAgIAlANzAwDQotCQkJCQlzdXBwbGllciAgIAlANjg4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzc1LCAxNzgpDQotCQkJCQkgICAgKDU1MCwgMTc4KQ0KLQkJCQkJICAgICg1NTAsIDMwNikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU1MCwgMzA2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzAzDQotCQkJCQlQYXJlbnRfVmlldyAJQDcwMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjA5LCAtNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDEzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4MzEzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzUwMTA1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDcwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDY5OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzUsIDE3OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAxNzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYxLCAyMTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTI1MDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg4IiBANzA2DQotCQkJCWxvY2F0aW9uICAgCSgzNjksIDcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQzhBRTAyMDNBOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldHMiIEA3MDcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzA2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDQ5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4NjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA2NSINCi0JCQkJCWNsaWVudCAgICAgCUA3MDYNCi0JCQkJCXN1cHBsaWVyICAgCUA2OTANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNjksIDcyKQ0KLQkJCQkJICAgICgxMDAsIDcyKQ0KLQkJCQkJICAgICgxMDAsIDU2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2OSwgNzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwLCA1NjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNDk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3OTAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODkiIEA3MTANCi0JCQkJCVBhcmVudF9WaWV3IAlANzA2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzYsIDMxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDYwMDUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDcwNg0KLQkJCQkJc3VwcGxpZXIgICAJQDY5OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDcyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMwIiBANzEyDQotCQkJCWxvY2F0aW9uICAgCSgxNTM4LCA1MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxMw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTM4LCA0NDkpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJCSAgICBoZWlnaHQgICAgIAk2MA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMERFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzMSIgQDcxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTINCi0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ2LCAzNDApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwREYiDQotCQkJCQljbGllbnQgICAgIAlANzEyDQotCQkJCQlzdXBwbGllciAgIAlANjk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzOCwgNTA4KQ0KLQkJCQkJICAgICgxNDg3LCA1MDgpDQotCQkJCQkgICAgKDE0ODcsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaXRlbVR5cGVEZWZpbml0aW9uIiBANzE2DQotCQkJCQlQYXJlbnRfVmlldyAJQDcxMg0KLQkJCQkJbG9jYXRpb24gICAJKC00NDYsIDI4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzE2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjMsIDU3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpdGVtVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuMjExNTM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwRTAiDQotCQkJCQljbGllbnQgICAgIAlANzEyDQotCQkJCQlzdXBwbGllciAgIAlANjk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzOCwgNTA4KQ0KLQkJCQkJICAgICgxNTkwLCA1MDgpDQotCQkJCQkgICAgKDE1OTAsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTM5LCA0NjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDM5ODQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkwIiBANzE5DQotCQkJCWxvY2F0aW9uICAgCSgxNzI5LCA1NzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QjcwMjA4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5MSIgQDcyMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAzNTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCRTAyNTgiDQotCQkJCQljbGllbnQgICAgIAlANzE5DQotCQkJCQlzdXBwbGllciAgIAlANjk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTcyOSwgNTc0KQ0KLQkJCQkJICAgICgxNjc4LCA1NzQpDQotCQkJCQkgICAgKDE2NzgsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc4LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWVtYmVyVHlwZURlZmluaXRpb25zIiBANzIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDcxOQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTksIDY1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittZW1iZXJUeXBlRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMjY5MjMxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCRTAyNTkiDQotCQkJCQljbGllbnQgICAgIAlANzE5DQotCQkJCQlzdXBwbGllciAgIAlANjk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTcyOSwgNTc0KQ0KLQkJCQkJICAgICgxNzgxLCA1NzQpDQotCQkJCQkgICAgKDE3ODEsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzgxLCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzMwLCA1MjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMTIxMjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkyIiBANzI1DQotCQkJCWxvY2F0aW9uICAgCSg3NDgsIDI2OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzMjAxREIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnVuZGFtZW50YWxGYWNldHMiIEA3MjYNCi0JCQkJCVBhcmVudF9WaWV3IAlANzI1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzI3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCAzMTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZnVuZGFtZW50YWxGYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDA5MDkxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNjMiDQotCQkJCQljbGllbnQgICAgIAlANzI1DQotCQkJCQlzdXBwbGllciAgIAlANjkzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzQ4LCAyNjkpDQotCQkJCQkgICAgKDY1OSwgMjY5KQ0KLQkJCQkJICAgICg2NTksIDU2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc0OCwgMjY5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OSwgNTYxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzI4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI4LCAzODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzgwMjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5MyIgQDcyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIzNiwgNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDUyLCAyMjgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNTkiDQotCQkJCQljbGllbnQgICAgIAlANzI1DQotCQkJCQlzdXBwbGllciAgIAlANjk5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc0OCwgMjY5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDI2OSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NCIgQDczMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3NSwgMzk2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTUiIEA3MzINCi0JCQkJCVBhcmVudF9WaWV3IAlANzMxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgwOSwgMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzMzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMzE2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDczMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDY5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzUsIDM5NikNCi0JCQkJCSAgICAoMTEzNSwgMzk2KQ0KLQkJCQkJICAgICgxMTM1LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc1LCAzOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzNSwgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDczNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzENCi0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA0NDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjUzMzMzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDczMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDY5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzUsIDM5NikNCi0JCQkJCSAgICAoMTIxNSwgMzk2KQ0KLQkJCQkJICAgICgxMjE1LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc1LCAzOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxNSwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MiwgMzU5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5NjE1NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTYiIEA3MzcNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDQ0NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3MjAxNkMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk3IiBANzM4DQotCQkJCQlQYXJlbnRfVmlldyAJQDczNw0KLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzM4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNjgsIDMyNykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDIyRiINCi0JCQkJCWNsaWVudCAgICAgCUA3MzcNCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzYwLCA0NDYpDQotCQkJCQkgICAgKDEzMDksIDQ0NikNCi0JCQkJCSAgICAoMTMwOSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDksIDI4NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIgQDc0MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjI0LCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjA0LCA1MDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWl0aXZlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMDAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3NTAyNDMiDQotCQkJCQljbGllbnQgICAgIAlANzM3DQotCQkJCQlzdXBwbGllciAgIAlANjk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQ0KLQkJCQkJICAgICgxNDEyLCA0NDYpDQotCQkJCQkgICAgKDE0MTIsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEyLCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzczLCA0MDkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjIxNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA3NDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgNTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0MjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCAzNzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDg4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjAyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbGlzdCINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIg0KLQkJCQkJIisgdW5pb24iKSkNCi0JCQkJd2lkdGggICAgICAJMzQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANzQ0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE4LCA5MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc0NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzdCMDM5NiINCi0JCQkJY2xpZW50ICAgICAJQDY5Mw0KLQkJCQlzdXBwbGllciAgIAlANjg4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTEsIDU2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5MSwgNTIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2ODkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc0Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCINCi0JCQkJY2xpZW50ICAgICAJQDY5MA0KLQkJCQlzdXBwbGllciAgIAlANjg4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzIsIDU2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgNTIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2ODkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc0Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSINCi0JCQkJY2xpZW50ICAgICAJQDY4OA0KLQkJCQlzdXBwbGllciAgIAlANjcwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjYsIDMwNikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM2NiwgMjE1KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQ4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODgwMUI0Ig0KLQkJCQljbGllbnQgICAgIAlANjQ4DQotCQkJCXN1cHBsaWVyICAgCUA2OTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgODI4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3LCA3ODEpDQotCQkJCWRyYXdTdXBwbGllciAJQDY5MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQ5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTkwMjgxIg0KLQkJCQljbGllbnQgICAgIAlANjY1DQotCQkJCXN1cHBsaWVyICAgCUA2NzgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MCwgMTg0MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MCwgMTQ0NCkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5RDY4RDAwRDIiDQotCQkJdGl0bGUgICAgICAJIjUuIENvbXBvbmVudCBBbm5vdGF0aW9ucyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANzUwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzUwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA3NTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgyLCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDc1Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDE1MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjYsIDE0NjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANzUzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMzA0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjMsIDI2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCXdpZHRoICAgICAgCTQ2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDc1NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEzMTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTYwNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA3NTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDcwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDY2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA3NTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANzU3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA1NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA1MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANzU4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwMCwgODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNjgsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANzU5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzUwLCAxMTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3NjANCi0JCQkJbG9jYXRpb24gICAJKDE5OTQsIDE0MTIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDc1OQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxOTk0LCAxNDEyKQ0KLQkJCQkgICAgKDE5OTQsIDEyNzEpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzYxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlANzUyDQotCQkJCXN1cHBsaWVyICAgCUA3NTkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwODQsIDE0NDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDg0LCAxNDEyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3NjApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA3NjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzYyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAsIDgyMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANzYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgODApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg5MiwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDc2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NCwgMzQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANzY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCAxODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA3NjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzkyLCAxNzEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDY3LCAxNjc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTY2OQ0KLQkJCQloZWlnaHQgICAgIAkxMDANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzY3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlANzY2DQotCQkJCXN1cHBsaWVyICAgCUA3NTkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NzIsIDE2NjIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTcyLCAxNDEyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3NjApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANzY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxMDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3OCwgOTgxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA3NjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA1NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4OCwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlcGVhdGFibGVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTQ1MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA3NzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE1MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcxLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjkyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDc3MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzcxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODcyLCA2ODUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCXdpZHRoICAgICAgCTczOA0KLQkJCQloZWlnaHQgICAgIAk1NDMNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMiIgQDc3Mg0KLQkJCQlsb2NhdGlvbiAgIAkoODY1LCAxMzU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDE4MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzMiIEA3NzMNCi0JCQkJCVBhcmVudF9WaWV3IAlANzcyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDMzQyINCi0JCQkJCWNsaWVudCAgICAgCUA3NzINCi0JCQkJCXN1cHBsaWVyICAgCUA3NTQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY3MSwgMTM1OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzc0DQotCQkJCQlQYXJlbnRfVmlldyAJQDc3Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5OCwgMTMyMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjExNjY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMzQ2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc3Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDg2NSwgMTM1OSkNCi0JCQkJCSAgICAoOTI1LCAxMzU5KQ0KLQkJCQkJICAgICg5MjUsIDEyMTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI1LCAxMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTg3LCAxMjc2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA2NDIyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1NiIgQDc3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNzEzLCA3MDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEYwMjEyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NyIgQDc3OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA3LCAtOTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTAwMEM5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc3Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDc1NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDcwOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDc3Nw0KLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNjY3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wOTUyMzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBEMyINCi0JCQkJCWNsaWVudCAgICAgCUA3NzcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCA3MDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTYsIDc1MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MzU3MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTAiIEA3ODINCi0JCQkJbG9jYXRpb24gICAJKDcxOSwgMTE5MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNTAwOEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUxIiBANzgzDQotCQkJCQlQYXJlbnRfVmlldyAJQDc4Mg0KLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwOTYiDQotCQkJCQljbGllbnQgICAgIAlANzgyDQotCQkJCQlzdXBwbGllciAgIAlANzU2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDExOTMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc4NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODINCi0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjAsIDExNDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNjk5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMEEwIg0KLQkJCQkJY2xpZW50ICAgICAJQDc4Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExOTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMTkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA2LCAxMjQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA0MTY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExMCIgQDc4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNzg1LCA1NTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEEwMDY2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMSIgQDc4OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDIzRiINCi0JCQkJCWNsaWVudCAgICAgCUA3ODcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NTcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg1LCA1NTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCA1NTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc5LCA1MTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzA3MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDI0OSINCi0JCQkJCWNsaWVudCAgICAgCUA3ODcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3ODUsIDU1MCkNCi0JCQkJCSAgICAoODg0LCA1NTApDQotCQkJCQkgICAgKDg4NCwgNjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg1LCA1NTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg0LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MzUsIDYxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyOTczMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODIiIEA3OTINCi0JCQkJbG9jYXRpb24gICAJKDExODQsIDQwNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NjAyOTAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgzIiBANzkzDQotCQkJCQlQYXJlbnRfVmlldyAJQDc5Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0zMiwgLTQxMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NzAxNjUiDQotCQkJCQljbGllbnQgICAgIAlANzkyDQotCQkJCQlzdXBwbGllciAgIAlANzU4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg0LCAxMzUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA3OTQNCi0JCQkJCVBhcmVudF9WaWV3IAlANzkyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyLCAtNDEyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNCwgMjI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjY2NTQyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFNDU3MDE2RiINCi0JCQkJCWNsaWVudCAgICAgCUA3OTINCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE4NCwgNDA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYxNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4NDM4Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTgiIEA3OTcNCi0JCQkJbG9jYXRpb24gICAJKDE3NTIsIDEwMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTEwMTU4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5OSIgQDc5OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTcNCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxOUYiDQotCQkJCQljbGllbnQgICAgIAlANzk3DQotCQkJCQlzdXBwbGllciAgIAlANzU5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTc1MiwgMTAzNCkNCi0JCQkJCSAgICAoMTgxMiwgMTAzNCkNCi0JCQkJCSAgICAoMTgxMiwgMTE2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTIsIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgMTE2MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzk5DQotCQkJCQlQYXJlbnRfVmlldyAJQDc5Nw0KLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODAwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0MywgOTk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk2MDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDFBOSINCi0JCQkJCWNsaWVudCAgICAgCUA3OTcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MiwgMTAzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCAxMDM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NCwgMTA2NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MDMzMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDAiIEA4MDINCi0JCQkJbG9jYXRpb24gICAJKDE4OTYsIDg4MSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZDRjAwODgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAxIiBAODAzDQotCQkJCQlQYXJlbnRfVmlldyAJQDgwMg0KLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2RDEwMTVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDgwMg0KLQkJCQkJc3VwcGxpZXIgICAJQDc1OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE4OTYsIDg4MSkNCi0JCQkJCSAgICAoMTk1NiwgODgxKQ0KLQkJCQkJICAgICgxOTU2LCAxMTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg5NiwgODgxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTYsIDExNjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGVyaXZhdGlvbkFubm90YXRpb24iIEA4MDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAODAyDQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCA0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDg0MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitkZXJpdmF0aW9uQW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1NDIzNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2RDEwMTY3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgwMg0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgODgxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4OSwgOTE0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA1MDg1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMiIgQDgwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjA0MCwgNzE1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjMzMDI2NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDMiIEA4MDgNCi0JCQkJCVBhcmVudF9WaWV3IAlAODA3DQotCQkJCQlsb2NhdGlvbiAgIAkoOTIwLCAtODUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjg0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgwNw0KLQkJCQkJc3VwcGxpZXIgICAJQDc1OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIwNDAsIDcxNSkNCi0JCQkJCSAgICAoMjEwMCwgNzE1KQ0KLQkJCQkJICAgICgyMTAwLCAxMTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDAsIDExNjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4MDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAODA3DQotCQkJCQlsb2NhdGlvbiAgIAkoOTIwLCAtODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA2ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDMxOTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjM0MDI4RSINCi0JCQkJCWNsaWVudCAgICAgCUA4MDcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDc0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwOTMxMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjAiIEA4MTINCi0JCQkJbG9jYXRpb24gICAJKDY2OCwgODY1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjM5MTM0MDA0RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjEiIEA4MTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODEyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMENBIg0KLQkJCQkJY2xpZW50ICAgICAJQDgxMg0KLQkJCQkJc3VwcGxpZXIgICAJQDc2Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzMsIDg2NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDgxMg0KLQkJCQkJbG9jYXRpb24gICAJKC02MTIsIDMzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzE0LCA4MjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzNDE0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMEQ0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgxMg0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDg2NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMSwgOTAzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjgyMDUxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNCIgQDgxNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgMTY3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQyM0I5MDFDRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjUiIEA4MTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAODE3DQotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQyM0JBMDFDNCINCi0JCQkJCWNsaWVudCAgICAgCUA4MTcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NjMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDcyLCAxNjcpDQotCQkJCQkgICAgKDE0NzIsIDcyKQ0KLQkJCQkJICAgICgxODgzLCA3MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODgzLCA3MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDgxNw0KLQkJCQkJbG9jYXRpb24gICAJKDI1NiwgLTY0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDEyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA3NjMwNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQyM0JBMDFDRSINCi0JCQkJCWNsaWVudCAgICAgCUA4MTcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgMTY3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTksIDYxOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MzU3NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3NCIgQDgyMg0KLQkJCQlsb2NhdGlvbiAgIAkoOTI3LCAzNTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDYwMjkxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc1IiBAODIzDQotCQkJCQlQYXJlbnRfVmlldyAJQDgyMg0KLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcxIg0KLQkJCQkJY2xpZW50ICAgICAJQDgyMg0KLQkJCQkJc3VwcGxpZXIgICAJQDc2NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjcsIDM1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MjksIDM1MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDgyMg0KLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDMxMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjgxNjY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcyIg0KLQkJCQkJY2xpZW50ICAgICAJQDgyMg0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkyNywgMzUwKQ0KLQkJCQkJICAgICg5ODcsIDM1MCkNCi0JCQkJCSAgICAoOTg3LCA2NzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjcsIDM1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODcsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzcsIDYxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MzM0Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NiIgQDgyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNywgMjIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQURDMDJGNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NyIgQDgyOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjcNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTMsIC01NzgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDc2NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCAyMjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjcNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTMsIC01NzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDAzLCAxODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40MDYyNTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDI0MiINCi0JCQkJCWNsaWVudCAgICAgCUA4MjcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDI3LCAyMjIpDQotCQkJCQkgICAgKDEwODcsIDIyMikNCi0JCQkJCSAgICAoMTA4NywgNjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDYxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODI1ODMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTAiIEA4MzINCi0JCQkJbG9jYXRpb24gICAJKDE0OTQsIDE0MzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2ODgwMUMyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkxIiBAODMzDQotCQkJCQlQYXJlbnRfVmlldyAJQDgzMg0KLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExMSINCi0JCQkJCWNsaWVudCAgICAgCUA4MzINCi0JCQkJCXN1cHBsaWVyICAgCUA3NjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NCwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxNjYyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRBbm5vdGF0aW9uIiBAODM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDgzMg0KLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NiwgMTM1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50QW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzcxMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIwMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExQiINCi0JCQkJCWNsaWVudCAgICAgCUA4MzINCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NCwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MywgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzAwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDQiIEA4MzcNCi0JCQkJbG9jYXRpb24gICAJKDYzNywgMTAyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNzAyQzgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ1IiBAODM4DQotCQkJCQlQYXJlbnRfVmlldyAJQDgzNw0KLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxODAzRTIiDQotCQkJCQljbGllbnQgICAgIAlAODM3DQotCQkJCQlzdXBwbGllciAgIAlANzY4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTEsIDEwMjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTAsIDk3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzI4ODg5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxOTAwMDQiDQotCQkJCQljbGllbnQgICAgIAlAODM3DQotCQkJCQlzdXBwbGllciAgIAlANzcxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDEwMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEwNjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzAwODgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjQiIEA4NDINCi0JCQkJbG9jYXRpb24gICAJKDE1ODEsIDYwNykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBNzAxMDIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjUiIEA4NDMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODQyDQotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MSINCi0JCQkJCWNsaWVudCAgICAgCUA4NDINCi0JCQkJCXN1cHBsaWVyICAgCUA3NjkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTgxLCA2MDcpDQotCQkJCQkgICAgKDE1ODEsIDU0NykNCi0JCQkJCSAgICAoMTY3OSwgNTQ3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzksIDU0NykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDg0NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDINCi0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjY5LCA0NjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuMTk2OTcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTIiDQotCQkJCQljbGllbnQgICAgIAlAODQyDQotCQkJCQlzdXBwbGllciAgIAlANzcxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTgxLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTM5LCA2MjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xOTY5NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA0IiBAODQ3DQotCQkJCWxvY2F0aW9uICAgCSg4NDksIDE0OTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTEwMjZGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNSIgQDg0OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMUY5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg0Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAODQ3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQyLCAxNDY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODgyNTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDIwMyINCi0JCQkJCWNsaWVudCAgICAgCUA4NDcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4NDksIDE0OTYpDQotCQkJCQkgICAgKDEwNjIsIDE0OTYpDQotCQkJCQkgICAgKDEwNjIsIDEyMTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2MiwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTUsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzI2OTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA2IiBAODUyDQotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE1NjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjMwMDA1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNyIgQDg1Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI4LCA3MzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjQwMzI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg1Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNTY1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODU0DQotCQkJCQlQYXJlbnRfVmlldyAJQDg1Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODU0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDE1MzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDQ5NTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMzMiINCi0JCQkJCWNsaWVudCAgICAgCUA4NTINCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5NTIsIDE1NjUpDQotCQkJCQkgICAgKDEyMDAsIDE1NjUpDQotCQkJCQkgICAgKDEyMDAsIDEyMTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwMCwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODU0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTQsIDEyNzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4MDAzOTQiDQotCQkJCWNsaWVudCAgICAgCUA3NTMNCi0JCQkJc3VwcGxpZXIgICAJQDc2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk4NCwgMjQ5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk4NCwgMTM1KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODU4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIg0KLQkJCQljbGllbnQgICAgIAlANzY5DQotCQkJCXN1cHBsaWVyICAgCUA3NTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5OTcsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTcsIDM1OSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNi4gQ29uY3JldGUgQ29tcG9uZW50cyINCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3NEQwM0M0Ig0KLQkJCXRpdGxlICAgICAgCSI2LiBDb25jcmV0ZSBDb21wb25lbnRzIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA4NTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiIEA4NjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjgsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5Ig0KLQkJCQl3aWR0aCAgICAgIAk1NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDg2MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5OTEsIDYyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA4NjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODYyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1NiwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQl3aWR0aCAgICAgIAk0MjYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg2Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNTYxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4NjINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTM2MCwgNTYxKQ0KLQkJCQkgICAgKDEzNjAsIDQ3MSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIgQDg2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW5jbHVkZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM3RDAyNTAiDQotCQkJCXdpZHRoICAgICAgCTI1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIgQDg2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbXBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIg0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDg2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDUsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAODY3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzc1LCAxMTUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQl3aWR0aCAgICAgIAk4NjkNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDIiIEA4NjgNCi0JCQkJbG9jYXRpb24gICAJKDEzNjgsIDEyMDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzUwMDdFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MyIgQDg2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjgNCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzYwMDZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDg2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDg2NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyMDYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjgNCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzQ3LCAxMTU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTQ0MTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QyINCi0JCQkJCWNsaWVudCAgICAgCUA4NjgNCi0JCQkJCXN1cHBsaWVyICAgCUA4NjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM0LCAxMjA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwMCwgMTI1MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDcNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTQ3MDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQwIiBAODczDQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCAxMDIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q4MDJGQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDEiIEA4NzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAODczDQotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDkwMThCIg0KLQkJCQkJY2xpZW50ICAgICAJQDg3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDg2NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNjgsIDEwMjIpDQotCQkJCQkgICAgKDExNjgsIDk2MikNCi0JCQkJCSAgICAoMTI4NSwgOTYyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg1LCA5NjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg3NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzMNCi0JCQkJCWxvY2F0aW9uICAgCSg5NjAsIDIyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTAsIDEwNzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NTM3OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QyINCi0JCQkJCWNsaWVudCAgICAgCUA4NzMNCi0JCQkJCXN1cHBsaWVyICAgCUA4NjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTY4LCAxMTQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyNywgMTA3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzNjk3NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjIiIEA4NzgNCi0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEzNTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDIwMDlBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MyIgQDg3OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDMwMkZFIg0KLQkJCQkJY2xpZW50ICAgICAJQDg3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDg2Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1NjMsIDEzNTMpDQotCQkJCQkgICAgKDE5NDAsIDEzNTMpDQotCQkJCQkgICAgKDE5NDAsIDEyNTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NDAsIDEyNTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4ODANCi0JCQkJCVBhcmVudF9WaWV3IAlAODc4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTM1NSwgNTUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxNywgMTMyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxNjgwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDMwMzA4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDg2Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1NjMsIDEzNTMpDQotCQkJCQkgICAgKDExODEsIDEzNTMpDQotCQkJCQkgICAgKDExODEsIDEyNTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODEsIDEyNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTMwLCAxMzI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYxMzQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA1NjEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg1OQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyODgsIDU2MSkNCi0JCQkJICAgICgyODgsIDQ3MSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA4ODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDYyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCXdpZHRoICAgICAgCTQ3NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IiBAODg1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTgsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2Ig0KLQkJCQl3aWR0aCAgICAgIAk0MTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAODg2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA5NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODg2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUwLCA5MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAODg3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODg4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIg0KLQkJCQljbGllbnQgICAgIAlAODg3DQotCQkJCXN1cHBsaWVyICAgCUA4NTkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMSwgNjE3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxLCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg4MykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODg5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3Ig0KLQkJCQljbGllbnQgICAgIAlAODg0DQotCQkJCXN1cHBsaWVyICAgCUA4NTkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU4OSwgNjE3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg5LCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg4MykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODkwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1Ig0KLQkJCQljbGllbnQgICAgIAlAODYxDQotCQkJCXN1cHBsaWVyICAgCUA4NjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMTYsIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTYsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODYzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDg5MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTkwLCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODkyDQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCAxMDg5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4OTENCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTgyNCwgMTA4OSkNCi0JCQkJICAgICgxODI0LCA5OTkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODkzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4REMwMzgxIg0KLQkJCQljbGllbnQgICAgIAlAODY0DQotCQkJCXN1cHBsaWVyICAgCUA4OTENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjYsIDExNDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY2LCAxMDg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg5NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjY0MDI0MCINCi0JCQkJY2xpZW50ICAgICAJQDg2Ng0KLQkJCQlzdXBwbGllciAgIAlAODkxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTM0LCAxMTQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkzNCwgMTA4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODkyKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAODk1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMwLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJd2lkdGggICAgICAJNDM4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODk2DQotCQkJCWxvY2F0aW9uICAgCSgxNzYyLCA4MTkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg5NQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNzYyLCA4MTkpDQotCQkJCSAgICAoMTc2MiwgNzI3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg5Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEQ5MDAzRSINCi0JCQkJY2xpZW50ICAgICAJQDg2NQ0KLQkJCQlzdXBwbGllciAgIAlAODk1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE2LCA4ODkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE2LCA4MTkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg5NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODk4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQljbGllbnQgICAgIAlAODk1DQotCQkJCXN1cHBsaWVyICAgCUA4NjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTYsIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTYsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODYzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA4OTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDE0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDEwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkwMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMjg5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4OTkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTEyMCwgMjg5KQ0KLQkJCQkgICAgKDExMjAsIDE5OSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA0IiBAOTAxDQotCQkJCWxvY2F0aW9uICAgCSgxNDg1LCAyMTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMDgwM0M3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRhaW5lciIgQDkwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MDENCi0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDIxMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250YWluZXIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzMxMTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0UiDQotCQkJCQljbGllbnQgICAgIAlAOTAxDQotCQkJCQlzdXBwbGllciAgIAlAODk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ4NSwgMjE1KQ0KLQkJCQkJICAgICgxNDg1LCAxNzYpDQotCQkJCQkgICAgKDEzNzQsIDE3NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODUsIDIxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzc0LCAxNzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM1LCAyMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjkNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDI2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwNSIgQDkwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MDENCi0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0YiDQotCQkJCQljbGllbnQgICAgIAlAOTAxDQotCQkJCQlzdXBwbGllciAgIAlAODk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ4NSwgMjE1KQ0KLQkJCQkJICAgICgxNDg1LCAyNTQpDQotCQkJCQkgICAgKDEzNDUsIDI1NCkNCi0JCQkJCSAgICAoMTM0NSwgMTk5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNDUsIDE5OSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwNiIgQDkwNg0KLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAyMTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNDgwMjYxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RDb250YWluZXIiIEA5MDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTA2DQotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMjE3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RDb250YWluZXIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI1MDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTYwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNEMwMjg1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDkwNg0KLQkJCQkJc3VwcGxpZXIgICAJQDg5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3MywgMjE2KQ0KLQkJCQkJICAgICg3NzMsIDE3NikNCi0JCQkJCSAgICAoODY2LCAxNzYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjMwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA3IiBAOTEwDQotCQkJCQlQYXJlbnRfVmlldyAJQDkwNg0KLQkJCQkJbG9jYXRpb24gICAJKDUzLCAxMDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNEMwMjg2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDkwNg0KLQkJCQkJc3VwcGxpZXIgICAJQDg5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3MywgMjE2KQ0KLQkJCQkJICAgICg3NzMsIDI1NykNCi0JCQkJCSAgICAoODk1LCAyNTcpDQotCQkJCQkgICAgKDg5NSwgMTk5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAyMTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk1LCAxOTkpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiINCi0JCQkJY2xpZW50ICAgICAJQDg2Mg0KLQkJCQlzdXBwbGllciAgIAlAODk5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY3LCAzNjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY3LCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDkwMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTEyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ4RTIwMEVBIg0KLQkJCQljbGllbnQgICAgIAlAODYwDQotCQkJCXN1cHBsaWVyICAgCUA4OTkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MiwgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUyLCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDkwMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTEzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTkwM0QyIg0KLQkJCQljbGllbnQgICAgIAlAODU5DQotCQkJCXN1cHBsaWVyICAgCUA4OTkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5OSwgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk5LCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDkwMCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDkxNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCWNsaWVudCAgICAgCUA5MTQNCi0JCQkJc3VwcGxpZXIgICAJQDg4Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE2LCAxMTQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2LCA3MjcpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE4IiBAOTE2DQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCAxNDI1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTkiIEA5MTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTE2DQotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCINCi0JCQkJCWNsaWVudCAgICAgCUA5MTYNCi0JCQkJCXN1cHBsaWVyICAgCUA4OTENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzgyLCAxNDI1KQ0KLQkJCQkJICAgICgyMTQ3LCAxNDI1KQ0KLQkJCQkJICAgICgyMTQ3LCA5NDMpDQotCQkJCQkgICAgKDIwNjcsIDk0MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NywgOTQzKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFNjaGVtYSIgQDkxOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MTYNCi0JCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAyMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDUsIDEzODkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA2NTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDUiDQotCQkJCQljbGllbnQgICAgIAlAOTE2DQotCQkJCQlzdXBwbGllciAgIAlAOTE0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM4MiwgMTQyNSkNCi0JCQkJCSAgICAoMjI1LCAxNDI1KQ0KLQkJCQkJICAgICgyMjUsIDEyNTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyNSwgMTI1NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM5MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NjkxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTYiIEA5MjENCi0JCQkJbG9jYXRpb24gICAJKDE1MDUsIDE1MDMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNyIgQDkyMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MjENCi0JCQkJCWxvY2F0aW9uICAgCSgxMzEzLCAzMDMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQyIg0KLQkJCQkJY2xpZW50ICAgICAJQDkyMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg5NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MDUsIDE1MDMpDQotCQkJCQkgICAgKDIxODgsIDE1MDMpDQotCQkJCQkgICAgKDIxODgsIDY3NSkNCi0JCQkJCSAgICAoMjA1OSwgNjc1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNSwgMTUwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDU5LCA2NzUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEA5MjMNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTIxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTMxMywgMzAzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTI0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAzLCAxNDcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMzMzMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDMiDQotCQkJCQljbGllbnQgICAgIAlAOTIxDQotCQkJCQlzdXBwbGllciAgIAlAOTE0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUwNSwgMTUwMykNCi0JCQkJCSAgICAoMTEzLCAxNTAzKQ0KLQkJCQkJICAgICgxMTMsIDEyNTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMywgMTI1NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTIzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY3NjgzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwOCIgQDkyNg0KLQkJCQlsb2NhdGlvbiAgIAkoNjYsIDI0NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMTAzNTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA5IiBAOTI3DQotCQkJCQlQYXJlbnRfVmlldyAJQDkyNg0KLQkJCQkJbG9jYXRpb24gICAJKC05NCwgLTQ0NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzMzEiDQotCQkJCQljbGllbnQgICAgIAlAOTI2DQotCQkJCQlzdXBwbGllciAgIAlAODk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjYsIDI0NCkNCi0JCQkJCSAgICAoNjYsIDE0NCkNCi0JCQkJCSAgICAoODY2LCAxNDQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NiwgMjQ0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTQ0KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDkyOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MjYNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjUsIDkzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNjgxMTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQzMzMDMzQiINCi0JCQkJCWNsaWVudCAgICAgCUA5MjYNCi0JCQkJCXN1cHBsaWVyICAgCUA5MTQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NiwgMTE0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTI4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNiwgMTg0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTExMw0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjY1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MzENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjc4MEJEOTAwNTkiDQotCQkJCWNsaWVudCAgICAgCUA4ODUNCi0JCQkJc3VwcGxpZXIgICAJQDg5OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1OSwgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1OSwgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJY2xpZW50ICAgICAJQDg2Nw0KLQkJCQlzdXBwbGllciAgIAlAODU5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0MDAsIDExNDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MDAsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODgzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTMzDQotCQkJCWxvY2F0aW9uICAgCSgxMDEyLCA4MzcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg2MQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMDEyLCA4MzcpDQotCQkJCSAgICAoMTAxMiwgNzI3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzNA0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzUNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MSwgODcxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI0Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODg4MTU4DQotCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZENEUyMDM2NiINCi0JCQkJY2xpZW50ICAgICAJQDg2Nw0KLQkJCQlzdXBwbGllciAgIAlAODYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM3LCAxMTQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAzNywgODM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MzMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzNg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzcNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODkwLCA4NjUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODE2MzMNCi0JCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0QkEwMjNDIg0KLQkJCQljbGllbnQgICAgIAlAODg2DQotCQkJCXN1cHBsaWVyICAgCUA4NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNSwgOTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI1LCA4MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkzMykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTM4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQljbGllbnQgICAgIAlAODkxDQotCQkJCXN1cHBsaWVyICAgCUA4OTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjgsIDg4OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjgsIDgxOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODk2KSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjcuIENvbmNyZXRlIEF0dHJpYnV0ZXMiDQotCQkJcXVpZCAgICAgICAJIjNCOUY4Rjc2MDJDNyINCi0JCQl0aXRsZSAgICAgIAkiNy4gQ29uY3JldGUgQXR0cmlidXRlcyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDkzOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCAxNDQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzgsIDEzNTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzgsIDE0MTkpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBmb3JtIDogWFNERm9ybSINCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MzANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZvcm0iIEA5NDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYwLCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzY1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZvcm0iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzE1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjlGOTEzQjAxRUIiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA5NDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCA5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgOTcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDYNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBlbGVtZW50IDogRE9NRWxlbWVudCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NzUNCi0JCQkJaGVpZ2h0ICAgICAJMTQzDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA5NDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDM4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODcsIDMzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDk0Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDk0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjc4LCA4OTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAOTQ0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDE0MDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMTM1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA5NDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4NjQsIDYyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDU3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCXdpZHRoICAgICAgCTI1Ng0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTQ2DQotCQkJCWxvY2F0aW9uICAgCSg4NTAsIDUzNykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTQyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDg1MCwgNTM3KQ0KLQkJCQkgICAgKDg1MCwgNDQ3KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01FbGVtZW50IiBAOTQ3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI0OCwgMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDkwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTUVsZW1lbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4MTg5NzkwMjAwIg0KLQkJCQl3aWR0aCAgICAgIAk3NjkNCi0JCQkJaGVpZ2h0ICAgICAJMjAwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDk0OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNjQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCA1ODQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJd2lkdGggICAgICAJNTEyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDk0OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAzMzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJCXdpZHRoICAgICAgCTQyMg0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTUwDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDI2MykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTQxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDM2OCwgMjYzKQ0KLQkJCQkgICAgKDM2OCwgMTY3KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDk1MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDE0NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTM0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTI5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDE0MDcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBzdWJzdGl0dXRpb24iDQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIGFsbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTYNCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBAOTUyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTc5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNzA4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNjU4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVCRTAyNzIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTc2OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTE5OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIg0KLQkJCQkJIisgYWxsIikpDQotCQkJCXdpZHRoICAgICAgCTU1MA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA5NTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTEyLCAyMDk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MzIsIDIwNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MzIsIDIxMDApDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MjMNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk3NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBAOTU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg3NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkzNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBAOTU1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU0NCwgMjAxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2MiwgMTkzMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxODgyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzJDQTAxQ0IiDQotCQkJCXdpZHRoICAgICAgCTM4Mg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAOTU2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDEyNzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDEzMzkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB1c2UgOiBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSINCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NDANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IiBAOTU3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxNjMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTU0OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNDk4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkE3QjBFODAxQTgiDQotCQkJCXdpZHRoICAgICAgCTUxMg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDk1OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2MDgsIDkyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDk4LCA4ODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCXdpZHRoICAgICAgCTIzOA0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDk1OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjQwLCAxNzEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTk2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2OTEpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk5MzQNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJCSI8PDAuLio+PiArIGJsb2NrIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKSkNCi0JCQkJd2lkdGggICAgICAJOTg0DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDk2MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCAxMTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMDk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTE1NikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg1Mg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIGxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50IDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTkwNg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAOTYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTAwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIyLCA3NzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMTAxNA0KLQkJCQloZWlnaHQgICAgIAk0ODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAOTYyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA5NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM3LCA5MDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQkJd2lkdGggICAgICAJNDI0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA5NjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM0NCwgNjU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDYwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDY2MCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MzANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDk2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAxOTQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDIwMDIpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk4MjINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RDb21wbGV4RmluYWwiDQotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQkJIisgbWl4ZWQgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTg3OA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA5NjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDg4LCAxNjk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDQsIDE2NDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzODYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTY2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlAOTY1DQotCQkJCXN1cHBsaWVyICAgCUA5NDQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDYsIDE2MzIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA2LCAxNDcyKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA5NjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjA4LCA3MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDU5OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk5MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJOTE4DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk2OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyINCi0JCQkJY2xpZW50ICAgICAJQDk1OA0KLQkJCQlzdXBwbGllciAgIAlAOTQyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjk2LCA4NjkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjk2LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDk0NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTY5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQljbGllbnQgICAgIAlAOTU5DQotCQkJCXN1cHBsaWVyICAgCUA5MzkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTQsIDE2MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk0LCAxNTMzKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk3MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NywgMTg1NikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTY1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE0ODcsIDE4NTYpDQotCQkJCSAgICAoMTQ4NywgMTc2MCkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NQXR0ciIgQDk3MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MDAsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTcxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzUwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTUF0dHIiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCAzMDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQkJGOEM4OTAxQjYiDQotCQkJCXdpZHRoICAgICAgCTY1OA0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUA5NjQNCi0JCQkJc3VwcGxpZXIgICAJQDk2NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczNCwgMTkzMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MzQsIDE4NTYpDQotCQkJCWRyYXdTdXBwbGllciAJQDk3MCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTczDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDI1NjgwMjU5Ig0KLQkJCQljbGllbnQgICAgIAlAOTYzDQotCQkJCXN1cHBsaWVyICAgCUA5NDINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDU4OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQ2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiDQotCQkJCWNsaWVudCAgICAgCUA5NjcNCi0JCQkJc3VwcGxpZXIgICAJQDk0Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE5MCwgNTg2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE5MCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk3NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiINCi0JCQkJY2xpZW50ICAgICAJQDk0OA0KLQkJCQlzdXBwbGllciAgIAlAOTQ5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjIsIDU3MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMiwgNDQ3KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTc2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RTYwMzcyIg0KLQkJCQljbGllbnQgICAgIAlAOTQ5DQotCQkJCXN1cHBsaWVyICAgCUA5NDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MCwgMzIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwLCAyNjMpDQotCQkJCWRyYXdTdXBwbGllciAJQDk1MCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTc3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIg0KLQkJCQljbGllbnQgICAgIAlAOTYyDQotCQkJCXN1cHBsaWVyICAgCUA5NDgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMywgODkyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzLCA3MDgpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiDQotCQkJCWNsaWVudCAgICAgCUA5NjANCi0JCQkJc3VwcGxpZXIgICAJQDk1OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwMCwgMTA4NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDAsIDk4NykpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Eb2N1bWVudCIgQDk3OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1NywgOTQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzU4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRG9jdW1lbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzU4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc4NTBFMDM4MSINCi0JCQkJd2lkdGggICAgICAJNzc2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiINCi0JCQkJY2xpZW50ICAgICAJQDk0Mg0KLQkJCQlzdXBwbGllciAgIAlAOTQxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDMyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NiwgMjYzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAOTgxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzNTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDMwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2NEE1MDExNyINCi0JCQkJd2lkdGggICAgICAJNjg2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJY2xpZW50ICAgICAJQDk0NQ0KLQkJCQlzdXBwbGllciAgIAlAOTQyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTAsIDU2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1MCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSINCi0JCQkJY2xpZW50ICAgICAJQDk1Ng0KLQkJCQlzdXBwbGllciAgIAlAOTQyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzUsIDEyNjcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQ2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCWNsaWVudCAgICAgCUA5NDMNCi0JCQkJc3VwcGxpZXIgICAJQDk0Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5NCwgODgwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5NCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJY2xpZW50ICAgICAJQDk2MQ0KLQkJCQlzdXBwbGllciAgIAlAOTQ1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDc2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NiwgNjg3KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk4Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTcwMywgMTI5MCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTQzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE3MDMsIDEyOTApDQotCQkJCSAgICAoMTcwMywgMTAwOCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiDQotCQkJCWNsaWVudCAgICAgCUA5NDQNCi0JCQkJc3VwcGxpZXIgICAJQDk0Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwMywgMTM0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyOTApDQotCQkJCWRyYXdTdXBwbGllciAJQDk4NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQljbGllbnQgICAgIAlAOTM5DQotCQkJCXN1cHBsaWVyICAgCUA5NDMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEzNDcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAxMjkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5ODYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDk1Mw0KLQkJCQlzdXBwbGllciAgIAlAOTY1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUzLCAyMDI4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1MywgMTg1NikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTcwKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjguIENvbmNyZXRlIENvbnRhaW5tZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBODA5NzAyN0EiDQotCQkJdGl0bGUgICAgICAJIjguIENvbmNyZXRlIENvbnRhaW5tZW50Ig0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBAOTkwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY3MiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDM5LCA5NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDk5MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NDAsIDU3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDMxLCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJd2lkdGggICAgICAJNDM2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDk5Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAxMywgNzQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IiBAOTkzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgNTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDUzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTk0MywgODY4KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5OTMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTk0MywgODY4KQ0KLQkJCQkgICAgKDE5NDMsIDYzMSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY0IiBAOTk1DQotCQkJCWxvY2F0aW9uICAgCSgyMTI1LCA2ODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjQwMDUxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2NSIgQDk5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNjAyQUQiDQotCQkJCQljbGllbnQgICAgIAlAOTk1DQotCQkJCQlzdXBwbGllciAgIAlAOTkyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMjUsIDY4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA3MjkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEA5OTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTk1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU1LCA2NzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNjAyQjciDQotCQkJCQljbGllbnQgICAgIAlAOTk1DQotCQkJCQlzdXBwbGllciAgIAlAOTkzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMjUsIDY4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA2MzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY3LCA2NzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDEwMDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCXdpZHRoICAgICAgCTIzNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwMDENCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDAwDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI3MiwgNDY1KQ0KLQkJCQkgICAgKDI3MiwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEwMDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM3MiwgMTEyMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTU4Nw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEAxMDAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA1NzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OSwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTIiIEAxMDA0DQotCQkJCWxvY2F0aW9uICAgCSgxMTcwLCAxMzU2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwIiBAMTAwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA0DQotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDA2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OSwgMTM4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM0MDQ0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiDQotCQkJCQljbGllbnQgICAgIAlAMTAwNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTcwLCAxMzU2KQ0KLQkJCQkJICAgICgyMDYsIDEzNTYpDQotCQkJCQkgICAgKDIwNiwgNjMxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3MCwgMTM1NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDYsIDYzMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2LCAxMzIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTU5MTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTMiIEAxMDA4DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDQNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjUyMSwgMTM5OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDA0DQotCQkJCQlzdXBwbGllciAgIAlAMTAwMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzAsIDEzNTYpDQotCQkJCQkgICAgKDI3MzEsIDEzNTYpDQotCQkJCQkgICAgKDI3MzEsIDEyMjcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTcwLCAxMzU2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MzEsIDEyMjcpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEwMTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NiIgQDEwMTENCi0JCQkJbG9jYXRpb24gICAJKDEyMiwgMTEzNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCMTAyRjgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ3IiBAMTAxMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDExDQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMUIiDQotCQkJCQljbGllbnQgICAgIAlAMTAxMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIyLCAxMTM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgNjMxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTAxMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDExDQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIzLCAxNTE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUwNDk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjYwMDI1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMTENCi0JCQkJCXN1cHBsaWVyICAgCUAxMDEwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMiwgMTEzNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDE2NDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MCwgMTU4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4MTE4OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiIEAxMDE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJCXdpZHRoICAgICAgCTUxMw0KLQkJCQloZWlnaHQgICAgIAkxMDANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1OCIgQDEwMTcNCi0JCQkJbG9jYXRpb24gICAJKDQ3LCA4ODUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MTUwMTE5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1OSIgQDEwMTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAxNw0KLQkJCQkJbG9jYXRpb24gICAJKC0yODksIDgyMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQUIiDQotCQkJCQljbGllbnQgICAgIAlAMTAxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMTANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDcsIDg4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTY0MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTAxOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIsIDE4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIxODU0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQjUiDQotCQkJCQljbGllbnQgICAgIAlAMTAxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDcsIDg4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTMwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOCwgMTkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3ODgxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDEwMjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjUyLCA4NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJd2lkdGggICAgICAJMzYzDQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEwMjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg4IiBAMTAyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxOSwgMTAzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFOTAxOEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODkiIEAxMDI1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzZDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMjQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxOSwgOTU1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDI2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDI3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEwMzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3MzE3MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM4MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDI0DQotCQkJCQlzdXBwbGllciAgIAlAMTAyMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE5LCAxMDM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDExMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDI4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzksIDEwMzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDQwODE2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBAMTAyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDE2OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTUsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQl3aWR0aCAgICAgIAk0NjgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTAzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDM1LCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTA4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg0IiBAMTAzMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1MSwgMTg0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNTAxMTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg1IiBAMTAzMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI5NywgMjI0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E3MDNCNCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDMxDQotCQkJCQlzdXBwbGllciAgIAlAMTAzMA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTEsIDE4NDApDQotCQkJCQkgICAgKDEyOTQsIDE4NDApDQotCQkJCQkgICAgKDEyOTQsIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTQsIDE3NTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDMzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzENCi0JCQkJCWxvY2F0aW9uICAgCSgtMjk3LCAyMjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTcsIDE4MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI2NTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNzAzQzgiDQotCQkJCQljbGllbnQgICAgIAlAMTAzMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMzANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzUxLCAxODQwKQ0KLQkJCQkJICAgICgxNDA5LCAxODQwKQ0KLQkJCQkJICAgICgxNDA5LCAxNzUxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MSwgMTg0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA5LCAxNzUxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYxLCAxODAxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcyODQ4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY4IiBAMTAzNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMTQzMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAwNkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDM3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzYNCi0JCQkJCWxvY2F0aW9uICAgCSg3NzQsIC0xODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYyLCAxNTI1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ0OTc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkwRDYwMzE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMzYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDMwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTY0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMTUyNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1NDU0NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjkiIEAxMDQwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzYNCi0JCQkJCWxvY2F0aW9uICAgCSg3NzQsIC0xODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQ5LCAxMjY2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkwRDYwMzBFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMzYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDIzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTIyMykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4NiIgQDEwNDINCi0JCQkJbG9jYXRpb24gICAJKDE2OTAsIDE2ODQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUQwMzc0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0Q29udGVudHMiIEAxMDQzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDINCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI2LCAtMTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDE3MzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRDb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMjA1MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDEwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwNDINCi0JCQkJCXN1cHBsaWVyICAgCUAxMDI5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTAsIDE2ODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0NiwgMTY4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTY0NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk5NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDczMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg3IiBAMTA0Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNiwgLTEyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTY2LCAxNjQzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDA2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNDINCi0JCQkJCXN1cHBsaWVyICAgCUAxMDMwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTAsIDE2ODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzNCwgMTY4NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEAxMDQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjYyNCwgNzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzg4LCA3NDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJCXdpZHRoICAgICAgCTQ5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDEwNDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAzMjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMDgsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJd2lkdGggICAgICAJNDI2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTA1MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU3LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY2IiBAMTA1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTYzLCAzMTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkIwMDNEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTA1Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDUxDQotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgMzYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgxMDgxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QzAxMTEiDQotCQkJCQljbGllbnQgICAgIAlAMTA1MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5OSwgMzE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE2LCAyOTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTYzOTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2NyIgQDEwNTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA1MQ0KLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTUsIDM2MSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4RTZDMDEwNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDUxDQotCQkJCQlzdXBwbGllciAgIAlAMTA1MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MjgsIDMxOSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMTA1Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNjAsIDk5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NCwgOTQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTA1OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMiwgMTU5MykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTA1Nw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyMzIyLCAxNTkzKQ0KLQkJCQkgICAgKDIzMjIsIDEwNDcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA1OQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYwDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ2LCA5MDUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjAwMDANCi0JCQkJICAgIGhlaWdodCAgICAgCTUNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJGNTAxM0EiDQotCQkJCWNsaWVudCAgICAgCUAxMDU3DQotCQkJCXN1cHBsaWVyICAgCUA5OTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNTAsIDkzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTAsIDg2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTk0KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTA2MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNTc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCA1MzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNjYyDQotCQkJCWhlaWdodCAgICAgCTExMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEyIiBAMTA2Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ5OCwgMTQzMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNDAxQUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDYzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjINCi0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyNywgMTQ3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1NDM4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTUwMDE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNjINCi0JCQkJCXN1cHBsaWVyICAgCUAxMDU3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ5OCwgMTQzMSkNCi0JCQkJCSAgICAoMjI4MSwgMTQzMSkNCi0JCQkJCSAgICAoMjI4MSwgMTA0NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDE0MzEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI4MSwgMTA0NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIwNCwgMTM5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwNTQxOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEzIiBAMTA2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDYyDQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzOCwgLTE4MTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTAsIDg2NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MTE1MDAxNiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDYyDQotCQkJCQlzdXBwbGllciAgIAlAMTA2MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0OTgsIDE0MzEpDQotCQkJCQkgICAgKDExMzEsIDE0MzEpDQotCQkJCQkgICAgKDExMzEsIDYzMikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDE0MzEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzMSwgNjMyKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBAMTA2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg0OCwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY1NSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEAxMDY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA4OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDUsIDg1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJNjA4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE2IiBAMTA3MA0KLQkJCQlsb2NhdGlvbiAgIAkoNTM0LCA3MzYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRUYwMTYwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBAMTA3MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDcwDQotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjAsIDc0OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExMTExMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDcwDQotCQkJCQlzdXBwbGllciAgIAlAMTA2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDg0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTk1LCA4MDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NzU5MjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNyIgQDEwNzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3MA0KLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCA2NTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiDQotCQkJCQljbGllbnQgICAgIAlAMTA3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM0LCA2MzIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzYiIEAxMDc2DQotCQkJCWxvY2F0aW9uICAgCSg5MDAsIDEwMzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBAMTA3Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDc2DQotCQkJCQlsb2NhdGlvbiAgIAkoODQsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxMywgMTA0MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzZWxlY3RvciINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEyMzI4OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIzNCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDc2DQotCQkJCQlzdXBwbGllciAgIAlAMTA2OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCAxMTEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDEwNDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wOTU4OTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNyIgQDEwODANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3Ng0KLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgOTY4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwNzYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkwMCwgMTAzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDk1MSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOCIgQDEwODINCi0JCQkJbG9jYXRpb24gICAJKDcwMCwgMTAzMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAwMjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBAMTA4Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDgyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTYsIDEwMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmllbGRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU0Nzk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNzkiDQotCQkJCQljbGllbnQgICAgIAlAMTA4Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwMCwgMTExMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzcxLCAxMDQyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMDc3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzkiIEAxMDg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwODINCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE2LCAxMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY1OSwgOTY4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwODINCi0JCQkJCXN1cHBsaWVyICAgCUAxMDY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwMCwgMTAzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDk1MSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDEwODgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDE0NDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwMCwgMTM5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDg5DQotCQkJCWxvY2F0aW9uICAgCSg1NTAsIDE1OTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwODgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNTUwLCAxNTkwKQ0KLQkJCQkgICAgKDU1MCwgMTQ5NSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IiBAMTA5MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDU3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0MCwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCXdpZHRoICAgICAgCTU0Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwOTENCi0JCQkJbG9jYXRpb24gICAJKDE0MDYsIDc2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTA5MA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNDA2LCA3NjUpDQotCQkJCSAgICAoMTQwNiwgNjMxKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMDkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY1NiwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTMsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQ0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTQiIEAxMDkzDQotCQkJCWxvY2F0aW9uICAgCSgxNjE0LCAxODY4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkZEREQ3MDExMyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5NSIgQDEwOTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5Mw0KLQkJCQkJbG9jYXRpb24gICAJKDUyNiwgNDc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI2QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDkzDQotCQkJCQlzdXBwbGllciAgIAlAMTA5Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MTQsIDE4NjgpDQotCQkJCQkgICAgKDI1MDAsIDE4NjgpDQotCQkJCQkgICAgKDI1MDAsIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjE0LCAxODY4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1MDAsIDE3NTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwOTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5Mw0KLQkJCQkJbG9jYXRpb24gICAJKDUyNiwgNDc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4OTYsIDE3ODcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTg3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RkREREEwMjc1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDg4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkNCi0JCQkJCSAgICAoOTg0LCAxODY4KQ0KLQkJCQkJICAgICg5ODQsIDE0OTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjE0LCAxODY4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4NCwgMTQ5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0MiwgMTgyNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3MTI4Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDAiIEAxMDk4DQotCQkJCWxvY2F0aW9uICAgCSgyOTI3LCAzODcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzYwMzg2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUNvbnRlbnRzIiBAMTA5OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDk4DQotCQkJCQlsb2NhdGlvbiAgIAkoMjQ2MywgLTM3NTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTUsIDM1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVDb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3MzA2MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzgwMDdDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDkwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjkyNywgMzg3KQ0KLQkJCQkJICAgICgxNzUwLCAzODcpDQotCQkJCQkgICAgKDE3NTAsIDUyMSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCA1MjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDQsIDQyNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzI0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAxIiBAMTEwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDk4DQotCQkJCQlsb2NhdGlvbiAgIAkoMjQ2MywgLTM3NTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI5NDYsIDE0NDgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwNzIiDQotCQkJCQljbGllbnQgICAgIAlAMTA5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwOTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyOTI3LCAzODcpDQotCQkJCQkgICAgKDI5ODcsIDM4NykNCi0JCQkJCSAgICAoMjk4NywgMTY3MSkNCi0JCQkJCSAgICAoMjkyOCwgMTY3MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTI4LCAxNjcxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTEwNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjk5LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc2IiBAMTEwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc1MCwgODcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDRFMDA2NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDExMDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNQ0KLQkJCQkJbG9jYXRpb24gICAJKDE0NjIsIC0yMzkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQwLCA2OTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTEwMzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA1MDAyQTUiDQotCQkJCQljbGllbnQgICAgIAlAMTEwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwOTANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDYzMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNCwgNjk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM0NDQwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NyIgQDExMDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNQ0KLQkJCQkJbG9jYXRpb24gICAJKDE0NjIsIC0yMzkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzA5LCAxMDY1KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMjlCIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTA0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCAxMTEzKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEAxMTExDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTExDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjc5LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjkyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA4IiBAMTExMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTI1MiwgMTg5NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4NzAyNDciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA5IiBAMTExMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTEyDQotCQkJCQlsb2NhdGlvbiAgIAkoNzA4LCAxMjg4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRUJEQzhDMDJGOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTEyDQotCQkJCQlzdXBwbGllciAgIAlAMTA5Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNTIsIDE4OTYpDQotCQkJCQkgICAgKDI2MDMsIDE4OTYpDQotCQkJCQkgICAgKDI2MDMsIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUyLCAxODk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDMsIDE3NTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTExNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTEyDQotCQkJCQlsb2NhdGlvbiAgIAkoNzA4LCAxMjg4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2ODIsIDE4NTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzgxMTQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAzMDMiDQotCQkJCQljbGllbnQgICAgIAlAMTExMg0KLQkJCQkJc3VwcGxpZXIgICAJQDExMTENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjUyLCAxODk2KQ0KLQkJCQkJICAgICg0MjgsIDE4OTYpDQotCQkJCQkgICAgKDQyOCwgMTIyMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDI4LCAxMjIzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODIsIDE4NjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzUwMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODAiIEAxMTE3DQotCQkJCWxvY2F0aW9uICAgCSgxMTk5LCAxMzIxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc1RDMyMDIyMCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4MSIgQDExMTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTExNw0KLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc1RDNDMDEwQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMTE3DQotCQkJCQlzdXBwbGllciAgIAlAMTEwNA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExOTksIDEzMjEpDQotCQkJCQkgICAgKDE4OTcsIDEzMjEpDQotCQkJCQkgICAgKDE4OTcsIDEyMjMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTcsIDEyMjMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTExOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTE3DQotCQkJCQlsb2NhdGlvbiAgIAkoNjU1LCA3MTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk1NjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc1RDNDMDEwRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTE3DQotCQkJCQlzdXBwbGllciAgIAlAMTExMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExOTksIDEzMjEpDQotCQkJCQkgICAgKDUwMCwgMTMyMSkNCi0JCQkJCSAgICAoNTAwLCAxMjIzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5OSwgMTMyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDAsIDEyMjMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MjMwNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUAxMDkyDQotCQkJCXN1cHBsaWVyICAgCUAxMDU3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjA2LCAxNjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwNiwgMTU5MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA1OCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyMw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI0DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDQ5NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NjQyOQ0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNg0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjE3MDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDEwNjENCi0JCQkJc3VwcGxpZXIgICAJQDEwMDANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MywgNTIwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUzLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwMDEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUAxMDMwDQotCQkJCXN1cHBsaWVyICAgCUAxMDU3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA5LCAxNjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTU5MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA1OCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyNg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI3DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDE1OTEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45ODAzOTINCi0JCQkJICAgIGhlaWdodCAgICAgCTM4NQ0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjU1MDMyQiINCi0JCQkJY2xpZW50ICAgICAJQDEwMzANCi0JCQkJc3VwcGxpZXIgICAJQDEwODgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDQsIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ0LCAxNTkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDg5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTI4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5Ig0KLQkJCQljbGllbnQgICAgIAlAMTAwMw0KLQkJCQlzdXBwbGllciAgIAlAMTAwMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2LCA1MjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjYsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAwMSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExMjkNCi0JCQkJbG9jYXRpb24gICAJKDQzMSwgMjIyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDE2DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQzMSwgMjIyKQ0KLQkJCQkgICAgKDQzMSwgMTMwKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzANCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEzMQ0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYxLCAyMjQpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NzY3NDQNCi0JCQkJICAgIGhlaWdodCAgICAgCTg2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyNDQwMDY5Ig0KLQkJCQljbGllbnQgICAgIAlAMTAwMA0KLQkJCQlzdXBwbGllciAgIAlAMTAxNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc1LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzUsIDIyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEyOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExMzINCi0JCQkJbG9jYXRpb24gICAJKDEzMDksIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTA0OQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMzA5LCA0NjUpDQotCQkJCSAgICAoMTMwOSwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzMNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEzNA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQxLCA0OTUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjQyODYNCi0JCQkJICAgIGhlaWdodCAgICAgCTEwDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjYwMzM5Ig0KLQkJCQljbGllbnQgICAgIAlAMTA2MQ0KLQkJCQlzdXBwbGllciAgIAlAMTA0OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTMxLCA1MjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzEsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEzMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEZDMDFFNyINCi0JCQkJY2xpZW50ICAgICAJQDEwMTANCi0JCQkJc3VwcGxpZXIgICAJQDEwODgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI1MCwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1MCwgMTU5MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA4OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzNg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM3DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjA1LCA0OTMpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NTgzMzMNCi0JCQkJICAgIGhlaWdodCAgICAgCTgNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2MTAzQkUiDQotCQkJCWNsaWVudCAgICAgCUAxMDIzDQotCQkJCXN1cHBsaWVyICAgCUAxMDQ5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTMyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM4DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMzkNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTEsIDkwNSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0ODk4MA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNzMNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJFQjAyQTgiDQotCQkJCWNsaWVudCAgICAgCUAxMTA0DQotCQkJCXN1cHBsaWVyICAgCUA5OTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzgsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODc4LCA4NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDk5NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0MA0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQxDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQyLCA4MDcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkzMTANCi0JCQkJICAgIGhlaWdodCAgICAgCTYxDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwM0EwMjIxIg0KLQkJCQljbGllbnQgICAgIAlAMTEwNA0KLQkJCQlzdXBwbGllciAgIAlAMTA5MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMywgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDMsIDc2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA5MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0Mg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQzDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzU0LCA4MDEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3MzcwMzhGIg0KLQkJCQljbGllbnQgICAgIAlAMTAyMg0KLQkJCQlzdXBwbGllciAgIAlAMTA5MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI4NCwgODM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NCwgNzY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDkxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNjQwMjQwIg0KLQkJCQljbGllbnQgICAgIAlAOTkyDQotCQkJCXN1cHBsaWVyICAgCUAxMDQ4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjg0LCA3NjIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzc5LCA3NjIpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQljbGllbnQgICAgIAlAOTkxDQotCQkJCXN1cHBsaWVyICAgCUAxMDQ5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM3LCA1MjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjM3LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiDQotCQkJCWNsaWVudCAgICAgCUAxMDQ4DQotCQkJCXN1cHBsaWVyICAgCUA5OTENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDcyOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDYzMSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiDQotCQkJCWNsaWVudCAgICAgCUA5OTMNCi0JCQkJc3VwcGxpZXIgICAJQDEwNDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5NTAsIDUyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEzMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0OA0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ5DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyODIxLCA4OTcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTgxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODc3MTkNCi0JCQkJICAgIGhlaWdodCAgICAgCTc2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNEYwMjNDIg0KLQkJCQljbGllbnQgICAgIAlAOTkwDQotCQkJCXN1cHBsaWVyICAgCUAxMDQ5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODk2LCA5MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODk2LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTANCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE1MQ0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMxMywgOTA0KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODUwNjIyDQotCQkJCSAgICBoZWlnaHQgICAgIAk2OA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkUyMDM4MSINCi0JCQkJY2xpZW50ICAgICAJQDEwMDINCi0JCQkJc3VwcGxpZXIgICAJQDk5Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM4MSwgMTEwOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzODEsIDg2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTk0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTUyDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNTMNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI4NzgsIDI2OSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NjY2Nw0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI1NTAzODUiDQotCQkJCWNsaWVudCAgICAgCUAxMDAyDQotCQkJCXN1cHBsaWVyICAgCUAxMDE2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQzLCAxMTA5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk0MywgMjIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTI5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTU0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQljbGllbnQgICAgIAlAMTExMQ0KLQkJCQlzdXBwbGllciAgIAlAMTAwMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDYyLCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDYyLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwMDEpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUI3QTAzOEMiDQotCQkJdGl0bGUgICAgICAJIjkuIENvbmNyZXRlIFNjaGVtYSBDb21wb3NpdGlvbiINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTE1NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTUzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE4IiBAMTE1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCAxNjk1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MUU2MDI1MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTkiIEAxMTU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNTYNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcsIDE2MjMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFQTAyRjciDQotCQkJCQljbGllbnQgICAgIAlAMTE1Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDExNTUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMjgsIDE2OTUpDQotCQkJCQkgICAgKDE3NSwgMTY5NSkNCi0JCQkJCSAgICAoMTc1LCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NSwgMTU5MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIgQDExNTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE1Ng0KLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMyOSwgMTc0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjkyNDUyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMzBCIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNTYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTU1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjI4LCAxNjk1KQ0KLQkJCQkJICAgICgyODEsIDE2OTUpDQotCQkJCQkgICAgKDI4MSwgMTU5MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOCwgMTY5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODEsIDE1OTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOSwgMTY0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNTcxNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExNjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTYyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkwLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTE4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTQiIEAxMTYzDQotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE2OTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDUwMzk4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NSIgQDExNjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NjAsIDE2MjMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0OTAzOEEiDQotCQkJCQljbGllbnQgICAgIAlAMTE2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNjINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5NTIsIDE2OTgpDQotCQkJCQkgICAgKDkwMSwgMTY5OCkNCi0JCQkJCSAgICAoOTAxLCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNjk4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMSwgMTU5MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTE2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjAsIDE3MzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjMyNjkyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzlFIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTYyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTUyLCAxNjk4KQ0KLQkJCQkJICAgICgxMDA0LCAxNjk4KQ0KLQkJCQkJICAgICgxMDA0LCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNjk4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDQsIDE1OTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgMTY0OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTE2OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgOTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjAsIDk0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJd2lkdGggICAgICAJNDkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEAxMTcwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA3ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxMiwgNzM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTQ3NQ0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTE3MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNDE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ2LCAyODUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNDA2DQotCQkJCWhlaWdodCAgICAgCTI4Nw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTgiIEAxMTcyDQotCQkJCWxvY2F0aW9uICAgCSgxMzAzLCA2NzkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMEMwM0RCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFNjaGVtYSIgQDExNzMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3Mg0KLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1OSwgMzgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMDM4NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExNzINCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTMwMywgNjc5KQ0KLQkJCQkJICAgICgxMzAzLCA0MTkpDQotCQkJCQkgICAgKDg0MywgNDE5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwMywgNjc5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNDE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjIsIDQ1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MDc0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE5IiBAMTE3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTcyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ1LCA5NTYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCQljbGllbnQgICAgIAlAMTE3Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDExNjkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzAzLCA2NzkpDQotCQkJCQkgICAgKDEzMDMsIDk5NykNCi0JCQkJCSAgICAoOTAxLCA5OTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAxLCA5OTcpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTYiIEAxMTc4DQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCA2NDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAMTE3OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTc4DQotCQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAtMTM5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzOCwgNTAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjAxOTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDMiDQotCQkJCQljbGllbnQgICAgIAlAMTE3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDExNzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjE2LCA2NDkpDQotCQkJCQkgICAgKDEyMTYsIDUzNCkNCi0JCQkJCSAgICAoODQzLCA1MzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA1MzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkyNiwgNTc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODMxNjQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTciIEAxMTgyDQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDc1NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTc4DQotCQkJCQlzdXBwbGllciAgIAlAMTE3MA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMTYsIDY0OSkNCi0JCQkJCSAgICAoMTIxNiwgNzk3KQ0KLQkJCQkJICAgICg4NzcsIDc5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDY0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDc5NykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMiIgQDExODQNCi0JCQkJbG9jYXRpb24gICAJKDY2MiwgNjQyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVEM0E2MDEzMSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiIEAxMTg1DQotCQkJCQlQYXJlbnRfVmlldyAJQDExODQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjM0LCAxMTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgNjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jaW5nRGlyZWN0aXZlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQwODc1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIxNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVEM0E5MDM3MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTg0DQotCQkJCQlzdXBwbGllciAgIAlAMTE3MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDcyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA2NzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzA2NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMyIgQDExODgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NA0KLQkJCQkJbG9jYXRpb24gICAJKC0yMzQsIDExNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIxLCA1NzYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzAiDQotCQkJCQljbGllbnQgICAgIAlAMTE4NA0KLQkJCQkJc3VwcGxpZXIgICAJQDExNzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYyLCA1NTkpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjQiIEAxMTkwDQotCQkJCWxvY2F0aW9uICAgCSg3NSwgMTg4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVFQ0YwMDA1RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjUiIEAxMTkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTANCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAxRSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTkwDQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc1LCAxODgpDQotCQkJCQkgICAgKDc1LCAxMjgpDQotCQkJCQkgICAgKDUxMCwgMTI4KQ0KLQkJCQkJICAgICg1MTAsIDI3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAxODgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCAyNzMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFZlcnNpb24iIEAxMTkyDQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTANCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RWZXJzaW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjU5Mzc1MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAyOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTkwDQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc1LCAxODgpDQotCQkJCQkgICAgKDc1LCAzODApDQotCQkJCQkgICAgKDQzNywgMzgwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDM4MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzY4LCAzMjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzQ3NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI2IiBAMTE5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMTM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVFRDBCMDExQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjciIEAxMTk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTUNCi0JCQkJCWxvY2F0aW9uICAgCSgzMzQsIC0zNjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTIxIg0KLQkJCQkJY2xpZW50ICAgICAJQDExOTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2MiwgMTM0KQ0KLQkJCQkJICAgICg3NjYsIDEzNCkNCi0JCQkJCSAgICAoNzY2LCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzY2LCAyNzMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JpZ2luYWxWZXJzaW9uIiBAMTE5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTk1DQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTY0LCA5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitvcmlnaW5hbFZlcnNpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNjUwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwRjAxMkIiDQotCQkJCQljbGllbnQgICAgIAlAMTE5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExNzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAxMzQpDQotCQkJCQkgICAgKDEzMjIsIDEzNCkNCi0JCQkJCSAgICAoMTMyMiwgMzM0KQ0KLQkJCQkJICAgICg4NDMsIDMzNCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDMzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTgxMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI4IiBAMTIwMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2LCA2NTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUIwMDFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyOSIgQDEyMDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwMA0KLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMEIiDQotCQkJCQljbGllbnQgICAgIAlAMTIwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDExNzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYsIDY1NikNCi0JCQkJCSAgICAoNTEzLCA2NTYpDQotCQkJCQkgICAgKDUxMywgNTU5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2LCA2NTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEzLCA1NTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiIEAxMjAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDANCi0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgNDMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFZlcnNpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzOTAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMTUiDQotCQkJCQljbGllbnQgICAgIAlAMTIwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDExNzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYsIDY1NikNCi0JCQkJCSAgICAoNjYsIDY1NikNCi0JCQkJCSAgICAoNjYsIDQ3MikNCi0JCQkJCSAgICAoNDM3LCA0NzIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDQ3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzU2LCA1MjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Njg0NjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMyIiBAMTIwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCAxMjYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzMwMTk0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzMyIgQDEyMDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwNQ0KLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjA1DQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDY0MiwgMTI2KQ0KLQkJCQkJICAgICg1ODgsIDEyNikNCi0JCQkJCSAgICAoNTg4LCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODgsIDI3MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWFGb3JTY2hlbWEiIEAxMjA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDUNCi0JCQkJCWxvY2F0aW9uICAgCSg4MiwgLTQxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM5LCA3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWFGb3JTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU1NTU2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3NTAxRkIiDQotCQkJCQljbGllbnQgICAgIAlAMTIwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExNzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2NDIsIDEyNikNCi0JCQkJCSAgICAoNjk3LCAxMjYpDQotCQkJCQkgICAgKDY5NywgMjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjk3LCAyNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0MywgMjEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAxODYzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTIxMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDExNjkNCi0JCQkJc3VwcGxpZXIgICAJQDExNzANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzOCwgOTM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM4LCA4NDMpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjExDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjExDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcsIDExNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0OTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDcyIiBAMTIxMg0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCAxMzQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjZCMDE5NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MyIgQDEyMTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxMg0KLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAsIDEyNzEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2RDAzMDkiDQotCQkJCQljbGllbnQgICAgIAlAMTIxMg0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMTENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDEzNDApDQotCQkJCQkgICAgKDE4MSwgMTM0MCkNCi0JCQkJCSAgICAoMTgxLCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MSwgMTIzOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTIxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxMCwgLTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzMywgMTM4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuODY3OTI1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2RDAzMTMiDQotCQkJCQljbGllbnQgICAgIAlAMTIxMg0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMTENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDEzNDApDQotCQkJCQkgICAgKDI4NywgMTM0MCkNCi0JCQkJCSAgICAoMjg3LCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NywgMTIzOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCAxMjk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQyOTQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTIxOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NjAsIDE0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTcsIDEwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUwNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEAxMjE5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcxMiwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNiIgQDEyMjANCi0JCQkJbG9jYXRpb24gICAJKDE2NjgsIDI4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRTAxQ0MiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA3IiBAMTIyMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjIwDQotCQkJCQlsb2NhdGlvbiAgIAkoOCwgLTE1MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRjAxMEYiDQotCQkJCQljbGllbnQgICAgIAlAMTIyMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMTgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDE5OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNGYWNldHMiIEAxMjIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjANCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUyLCAzMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjQ2MTU0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTFBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMjANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjE5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY4LCAzNjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjI0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjUsIDMwMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjkyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEyMjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDI2LCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEyMjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA2NDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCA1OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDgiIEAxMjI3DQotCQkJCWxvY2F0aW9uICAgCSgxNTA4LCA3OTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDMwMjhFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwOSIgQDEyMjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIyNw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRjMiDQotCQkJCQljbGllbnQgICAgIAlAMTIyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwOCwgNzkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDgsIDY5NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNQYXJ0aWNsZSIgQDEyMjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIyNw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgNzY3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1BhcnRpY2xlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI1OTI1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEQ0MDJGRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjI3DQotCQkJCQlzdXBwbGllciAgIAlAMTIyNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwOCwgODg5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDU0LCA4MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTUwNjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTIzMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTYsIDExNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NCIgQDEyMzMNCi0JCQkJbG9jYXRpb24gICAJKDkxOSwgMTM0OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI1RTAxRjkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODUiIEAxMjM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyNSwgMTI3MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjYyMDA0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzDQotCQkJCQlzdXBwbGllciAgIAlAMTIzMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkxOSwgMTM0OSkNCi0JCQkJCSAgICAoODY2LCAxMzQ5KQ0KLQkJCQkJICAgICg4NjYsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxMjM5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTIzNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTIzMywgLTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5OTMsIDEzOTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4zNzczNTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjYyMDA1MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzDQotCQkJCQlzdXBwbGllciAgIAlAMTIzMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkxOSwgMTM0OSkNCi0JCQkJCSAgICAoOTczLCAxMzQ5KQ0KLQkJCQkJICAgICg5NzMsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTczLCAxMjM5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MTksIDEyOTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDE0OTI1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTIzOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NTIsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTYsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEwIiBAMTI0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMjAyNSwgNzkyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQ5MDFGNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTEiIEAxMjQxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDANCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjg0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMjUsIDc5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA2OTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjQyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDANCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjYsIDgzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODA5NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIwMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNERBMDI4RSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjQwDQotCQkJCQlzdXBwbGllciAgIAlAMTIzOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgODg5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDk4LCA4NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYxNzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEyIiBAMTI0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTE3OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRDNjhGRjAxQkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEzIiBAMTI0Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5OCwgMjM0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjQ1DQotCQkJCQlzdXBwbGllciAgIAlAMTIzMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDEsIDExNzgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjQ3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNjMzNTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjQ1DQotCQkJCQlzdXBwbGllciAgIAlAMTIzOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3NTQsIDExNzgpDQotCQkJCQkgICAgKDIwMjgsIDExNzgpDQotCQkJCQkgICAgKDIwMjgsIDk5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTQsIDExNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyOCwgOTk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgyLCAxMDk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgzNjY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxMC4gRGlhZ25vc3RpY3MiDQotCQkJcXVpZCAgICAgICAJIjNCRkU1RjA4MDNFMiINCi0JCQl0aXRsZSAgICAgIAkiMTAuIERpYWdub3N0aWNzIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAMTI1MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMTAyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5OTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgOTQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3Ig0KLQkJCQl3aWR0aCAgICAgIAk2ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWNTZXZlcml0eSIgQDEyNTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCA2NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTgsIDU0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA0OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2OEE3MDMyRiINCi0JCQkJd2lkdGggICAgICAJNDYyDQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMjUyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTksIDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjUzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg5NiwgMTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NDAsIDYyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcxMw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJd2lkdGggICAgICAJNzMxDQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTI1NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgNjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQsIDQwMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJd2lkdGggICAgICAJNjU4DQotCQkJCWhlaWdodCAgICAgCTQzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTQiIEAxMjU1DQotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDI4MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMTAzNUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE1IiBAMTI1Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjUyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMTc2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFsbERpYWdub3N0aWNzIiBAMTI1Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwOSwgMzMwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2FsbERpYWdub3N0aWNzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ4NTk4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjU0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMzI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNTYxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxMCIgQDEyNjANCi0JCQkJbG9jYXRpb24gICAJKDEwMjgsIDQ0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyNzAzQ0QiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjExIiBAMTI2MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjYwDQotCQkJCQlzdXBwbGllciAgIAlAMTI1NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI4LCA0NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzEzLCA0NDApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50cyIgQDEyNjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI2MA0KLQkJCQkJbG9jYXRpb24gICAJKC0zOTYsIC03MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM4LCAyMzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29tcG9uZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyOTE4MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2QyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjYwDQotCQkJCQlzdXBwbGllciAgIAlAMTI1Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwMjgsIDQ0MCkNCi0JCQkJCSAgICAoMTA4OCwgNDQwKQ0KLQkJCQkJICAgICgxMDg4LCAxNzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI4LCA0NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4OCwgMTc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAyMzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjM4NDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEyIiBAMTI2NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAyODIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNjkwMTY1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMyIgQDEyNjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI2NQ0KLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjYiDQotCQkJCQljbGllbnQgICAgIAlAMTI2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjg4LCAxNzQpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGlhZ25vc3RpY3MiIEAxMjY3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNjUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjY4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMiwgMzMwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2RpYWdub3N0aWNzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDUyNjMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjU0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgMjgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDUsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5NDczNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNzANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRDMEY0QzAxQTEiDQotCQkJCWNsaWVudCAgICAgCUAxMjU0DQotCQkJCXN1cHBsaWVyICAgCUAxMjUzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzUsIDM5MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTc0KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxMS4gU3VwcGxlbWVudGFsIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4N0U0OTAxOUIiDQotCQkJdGl0bGUgICAgICAJIjExLiBTdXBwbGVtZW50YWwiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NjQsIDgxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA3NjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJODUyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyNzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTEyLCA4ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzMxLCA4MjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk3ODANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI3Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDExMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJd2lkdGggICAgICAJNDk4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTI3NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzg0LCAxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMjM2LCA2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzYiIEAxMjc1DQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCA4NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNTAxMzciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWFyeUNvbXBvbmVudCIgQDEyNzYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI3NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTAsIC01MDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1NiwgMTE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3ByaW1hcnlDb21wb25lbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDA4MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjc1DQotCQkJCQlzdXBwbGllciAgIAlAMTI3Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCA4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzcsIDg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjQsIDU1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3MjYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzciIEAxMjc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDU4LCAxMjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNzAxMTIiDQotCQkJCQljbGllbnQgICAgIAlAMTI3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyNywgODQpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMjgxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNjAsIDY4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDYwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3OCwgNjY3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzIyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiINCi0JCQkJCSIrIGNpcmN1bGFyIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk3ODINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTI4Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxMDcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCA5OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgMTA1MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGZhY2V0TmFtZSA6IFN0cmluZyINCi0JCQkJCSIrIGVmZmVjdGl2ZVZhbHVlIDogVmFsdWUiKSkNCi0JCQkJd2lkdGggICAgICAJNDU4DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEyODMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNTY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTgwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA2MjgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjkNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJODIwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDEyODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMjg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAxNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNSwgMjE3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzU2DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgYWxpYXNOYW1lIDogU3RyaW5nIg0KLQkJCQkJIisgdVJJIDogU3RyaW5nIg0KLQkJCQkJIisgYWxpYXNVUkkgOiBTdHJpbmciDQotCQkJCQkiKyBxTmFtZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0NzINCi0JCQkJaGVpZ2h0ICAgICAJMjg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMTI4NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMzUyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgMjk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTYyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMjg2DQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDUxMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTI4NQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgzMjAsIDUxMCkNCi0JCQkJICAgICgzMjAsIDQyMCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjg3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlAMTI4Mw0KLQkJCQlzdXBwbGllciAgIAlAMTI4NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODEsIDU1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxLCA1MTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEyODYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyODgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUAxMjcxDQotCQkJCXN1cHBsaWVyICAgCUAxMjg1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NzcsIDc0OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg3NywgNTEwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjg2KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEAxMjg5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDE4MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAxLCAxNzYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSINCi0JCQkJd2lkdGggICAgICAJNDU2DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDEyOTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxNzc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE3MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5Ig0KLQkJCQl3aWR0aCAgICAgIAk0OTMNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTI5MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDE5MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTg4OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiDQotCQkJCXdpZHRoICAgICAgCTQ5Mw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiIEAxMjkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDE5NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDczLCAxOTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IiBAMTI5Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNCwgMTM3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RCb3VuZGVkRmFjZXQiIEAxMjk0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEyNjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTYzLCAxMjEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREJvdW5kZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJCXdpZHRoICAgICAgCTM5Ng0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IiBAMTI5NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDEzOTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMTM0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4Ig0KLQkJCQl3aWR0aCAgICAgIAkzODANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIgQDEyOTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxMjMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDksIDExNzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETnVtZXJpY0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQkJd2lkdGggICAgICAJNDAwDQotCQkJCWhlaWdodCAgICAgCTEzMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIgQDEyOTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTYxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNSwgMTUzNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTk1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgaW5jbHVzaXZlIDogYm9vbGVhbiINCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiIEAxMjk4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDIyODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMjM2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCXdpZHRoICAgICAgCTQ1NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIgQDEyOTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMwNCwgMjYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzQsIDI1NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJCXdpZHRoICAgICAgCTQ3OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IiBAMTMwMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAyMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE5NiwgMjA3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXR0ZXJuRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAkzNjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEAxMzAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMjA5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCAyMDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQl3aWR0aCAgICAgIAk0NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IiBAMTMwMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDIyNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjIyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCXdpZHRoICAgICAgCTM1OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEAxMzAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTU4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDE1MDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDE1NjMpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIg0KLQkJCQkJIisgZXhjbHVzaXZlIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IiBAMTMwNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyNDY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjExMSwgMjQxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiIEAxMzA1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMjQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM5LCAyMzk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkxlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IiBAMTMwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI2MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjU1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMzA3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2NywgMTEwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTMwOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEwNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgMTAyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMzA5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDEzMDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzY0KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgdmFsaWRGYWNldHMgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNTk0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDgiIEAxMzEwDQotCQkJCWxvY2F0aW9uICAgCSgxNDQ2LCAxMjE4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBOTk0MDMwQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxMzExDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTANCi0JCQkJCWxvY2F0aW9uICAgCSg1ODIsIC03OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4MCwgMTE3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMy4yNjgyOTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBERCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzEwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NDYsIDEyMTgpDQotCQkJCQkgICAgKDE0ODcsIDEyMTgpDQotCQkJCQkgICAgKDE0ODcsIDEyOTIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDEyOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEyNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTg0MjExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDkiIEAxMzE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTANCi0JCQkJCWxvY2F0aW9uICAgCSg1ODIsIC03OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NzAwRTciDQotCQkJCQljbGllbnQgICAgIAlAMTMxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDQ2LCAxMjE4KQ0KLQkJCQkJICAgICgxNDA1LCAxMjE4KQ0KLQkJCQkJICAgICgxNDA1LCAxMjkyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA1LCAxMjkyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUyIiBAMTMxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTczMywgMTU3NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RDAyNTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUzIiBAMTMxNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzE1DQotCQkJCQlsb2NhdGlvbiAgIAkoOTE3LCA3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDhFMDA5MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzE1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3MzMsIDE1NzUpDQotCQkJCQkgICAgKDE0ODcsIDE1NzUpDQotCQkJCQkgICAgKDE0ODcsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RmFjZXQiIEAxMzE3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTUNCi0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzE4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTEsIDE1NDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDYyNDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDhFMDA5QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzE1DQotCQkJCQlzdXBwbGllciAgIAlAMTI5Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE1NzUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDIsIDE1MzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkxNTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU0IiBAMTMyMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NywgMTc5MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQjAzOTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU1IiBAMTMyMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIwDQotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0M5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMjANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU4NywgMTc5MykNCi0JCQkJCSAgICAoMTQ0NywgMTc5MykNCi0JCQkJCSAgICAoMTQ0NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODcsIDE3OTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhJbmNsdXNpdmVGYWNldCIgQDEzMjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMyMA0KLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxNzUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjk4NDQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzRDQiDQotCQkJCQljbGllbnQgICAgIAlAMTMyMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4NywgMTc5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkyLCAxNzkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIwLCAxNzU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU5MTU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1NiIgQDEzMjUNCi0JCQkJbG9jYXRpb24gICAJKDkzNywgMTc4NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBRjAzMzgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU3IiBAMTMyNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI1DQotCQkJCQlsb2NhdGlvbiAgIAkoNjE3LCAtNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMDAxRjkiDQotCQkJCQljbGllbnQgICAgIAlAMTMyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MzcsIDE3ODcpDQotCQkJCQkgICAgKDk5NywgMTc4NykNCi0JCQkJCSAgICAoOTk3LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTM3LCAxNzg3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5JbmNsdXNpdmVGYWNldCIgQDEzMjcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMyNQ0KLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5MiwgMTc0NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5JbmNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0NjA2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMjAzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjkwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE3ODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NSwgMTc0MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2Mzk2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTgiIEAxMzMwDQotCQkJCWxvY2F0aW9uICAgCSg5ODEsIDE5MzcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjMwMjA3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1OSIgQDEzMzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzMA0KLQkJCQkJbG9jYXRpb24gICAJKDY3NywgLTc5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI0MDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzMwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDk4MSwgMTkzNykNCi0JCQkJCSAgICAoMTA0MSwgMTkzNykNCi0JCQkJCSAgICAoMTA0MSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQxLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTMzMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMywgMTkwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0MTI1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTlBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjkxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE5MzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4OSwgMTg5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NjY1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjAiIEAxMzM1DQotCQkJCWxvY2F0aW9uICAgCSgxNDY5LCAxOTUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEI2MDI4RCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjEiIEAxMzM2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzUNCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMTciDQotCQkJCQljbGllbnQgICAgIAlAMTMzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDY5LCAxOTUzKQ0KLQkJCQkJICAgICgxNDAwLCAxOTUzKQ0KLQkJCQkJICAgICgxNDAwLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OSwgMTk1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDAwLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEV4Y2x1c2l2ZUZhY2V0IiBAMTMzNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM1DQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDYsIDE5MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTgwOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIyMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzM1DQotCQkJCQlzdXBwbGllciAgIAlAMTI5Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY5LCAxOTUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjQsIDE5NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NjEsIDE5MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjcyMzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYyIiBAMTM0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjE4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAwNTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYzIiBAMTM0MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxOCwgNjI4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDI0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibGVuZ3RoRmFjZXQiIEAxMzQyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMzE4LCA2MjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNCwgMjIwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitsZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3NTQ3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMjUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTEyMiwgMjE4MCkNCi0JCQkJCSAgICAoMTEyMiwgMjI0MCkNCi0JCQkJCSAgICAoMzg3LCAyMjQwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIyNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MSwgMjIwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NTU5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjYiIEAxMzQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAxOTg5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEMyMDIxRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjciIEAxMzQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZW51bWVyYXRpb25GYWNldHMiIEAxMzQ3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzcsIDIwMTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZW51bWVyYXRpb25GYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjU4NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODQsIDE5ODkpDQotCQkJCQkgICAgKDEwODQsIDIwNDkpDQotCQkJCQkgICAgKDQ4NSwgMjA0OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDE5ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMDQ5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODMsIDIwMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTEyOTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY4IiBAMTM1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1MSwgMjA3NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNTAxNTkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY5IiBAMTM1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQjAiDQotCQkJCQljbGllbnQgICAgIAlAMTM1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDUxLCAyMDc0KQ0KLQkJCQkJICAgICgxMzYyLCAyMDc0KQ0KLQkJCQkJICAgICgxMzYyLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MSwgMjA3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhdHRlcm5GYWNldHMiIEAxMzUyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzIwLCAyMDM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhdHRlcm5GYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNjcyMjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzUwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDUxLCAyMDc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxODcsIDIwNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzIsIDIwMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDg2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcwIiBAMTM1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNywgMTQwMCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDODAyQTciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjcxIiBAMTM1Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUVBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyOSwgMTQwMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjYXJkaW5hbGl0eUZhY2V0IiBAMTM1Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NDcsIDEzNTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2FyZGluYWxpdHlGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3MTczMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjkzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgMTQwMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MywgMTM1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzQyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODAiIEAxMzYwDQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDEzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERCMDM3NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODEiIEAxMzYxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjANCi0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzVBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTM2Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTc4NiwgMzAxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA4LCAyNTU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzczOTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERDMDM2NCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzYwDQotCQkJCQlzdXBwbGllciAgIAlAMTI5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNjIsIDI0MTMpDQotCQkJCQkgICAgKDEyNjIsIDI1OTYpDQotCQkJCQkgICAgKDIwNjUsIDI1OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjUsIDI1OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzksIDI1NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4ODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg0IiBAMTM2NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MSwgMTMwNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFMzAwRDkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg1IiBAMTM2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMzUsIC03OTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTQwMzhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyOSwgMTMwNikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJib3VuZGVkRmFjZXQiIEAxMzY3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEzNSwgLTc5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzMiwgMTI3MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitib3VuZGVkRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDMxNzQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFNDAzOTgiDQotCQkJCQljbGllbnQgICAgIAlAMTM2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyOTQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgMTMwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTU0LCAxMzA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc3LCAxMjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU0NzE3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2NCIgQDEzNzANCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIxODYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkYwMThDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2NSIgQDEzNzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3MA0KLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNkIiDQotCQkJCQljbGllbnQgICAgIAlAMTM3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjE4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIndoaXRlU3BhY2VGYWNldCIgQDEzNzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3MA0KLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MywgMjIwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit3aGl0ZVNwYWNlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTA5MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMwMDA3NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzcwDQotCQkJCQlzdXBwbGllciAgIAlAMTI5OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMjgsIDIxODYpDQotCQkJCQkgICAgKDEzMjgsIDIyNDYpDQotCQkJCQkgICAgKDIwOTMsIDIyNDYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIyNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMzMsIDIyMDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY3NjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgyIiBAMTM3NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjc0LCAxMzkwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDA0OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODMiIEAxMzc2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQjkiDQotCQkJCQljbGllbnQgICAgIAlAMTM3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTM5MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJvcmRlcmVkRmFjZXQiIEAxMzc3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU4LCAxMzUzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK29yZGVyZWRGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MTUzOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0MzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNzUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY3NCwgMTM5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEzOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgMTM1NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNDYxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzIiIEAxMzgwDQotCQkJCWxvY2F0aW9uICAgCSg2ODcsIDEyOTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0IwMzlDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3MyIgQDEzODENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzgwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODcsIDEyOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMjk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm51bWVyaWNGYWNldCIgQDEzODINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjgsIDEyNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbnVtZXJpY0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgwOTcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQzAzRDEiDQotCQkJCQljbGllbnQgICAgIAlAMTM4MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyOTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0MCwgMTI5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA2LCAxMjYwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2ODQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4NiIgQDEzODUNCi0JCQkJbG9jYXRpb24gICAJKDE2ODksIDE2NjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDQwMUVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4NyIgQDEzODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xODMsIC0zNTQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzYwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTY4OSwgMTY2MikNCi0JCQkJCSAgICAoMTQ4NywgMTY2MikNCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhGYWNldCIgQDEzODcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xODMsIC0zNTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NjksIDE2MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWF4RmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODIwNTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ1MDM2QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzg1DQotCQkJCQlzdXBwbGllciAgIAlAMTI5Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjg5LCAxNjYyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE2NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDQsIDE2MjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTUzODUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg4IiBAMTM5MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI1OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU0RjAxNDUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg5IiBAMTM5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzhDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiIEAxMzkyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTQ2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NSwgMjI4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDg1NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNTUwMDM5NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzkwDQotCQkJCQlzdXBwbGllciAgIAlAMTI5OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMjgsIDIyNTgpDQotCQkJCQkgICAgKDEzMjgsIDIzMjQpDQotCQkJCQkgICAgKDIwOTMsIDIzMjQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMjU4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIzMjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDksIDIyOTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg4MTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkwIiBAMTM5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5NywgMjM2NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNDAxMUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkxIiBAMTM5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMEQiDQotCQkJCQljbGllbnQgICAgIAlAMTM5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0IiBAMTM5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1NywgMjQ2MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNjkwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI5NywgMjM2NikNCi0JCQkJCSAgICAoMTI5NywgMjQ5OSkNCi0JCQkJCSAgICAoMjEwMiwgMjQ5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQ5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwNywgMjQ3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTMwOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTIiIEAxNDAwDQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNjJBMDBBQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTMiIEAxNDAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxMzgiDQotCQkJCQljbGllbnQgICAgIAlAMTQwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxNDAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgMjYzNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTg1MzE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxNDIiDQotCQkJCQljbGllbnQgICAgIAlAMTQwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyOTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAyNDQ5KQ0KLQkJCQkJICAgICgxMjYyLCAyNjY4KQ0KLQkJCQkJICAgICgyMDY1LCAyNjY4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNjY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTg5LCAyNjI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI2NDg1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NCIgQDE0MDUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjIsIDIxNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjAwM0E2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5NSIgQDE0MDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwNQ0KLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDA1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0MjIsIDIxNTkpDQotCQkJCQkgICAgKDEzNjIsIDIxNTkpDQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlUGF0dGVybkZhY2V0IiBAMTQwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjcsIDIxMjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlUGF0dGVybkZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk5MDkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTIiDQotCQkJCQljbGllbnQgICAgIAlAMTQwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMTE5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5MjI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NiIgQDE0MTANCi0JCQkJbG9jYXRpb24gICAJKDEwODQsIDIwODMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0EwMjZCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5NyIgQDE0MTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxMA0KLQkJCQkJbG9jYXRpb24gICAJKDgyOCwgLTEzNzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTg2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IiBAMTQxMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEwDQotCQkJCQlsb2NhdGlvbiAgIAkoODI4LCAtMTM3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAyMTAxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40ODg2MTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDEwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODQsIDIwODMpDQotCQkJCQkgICAgKDEwODQsIDIxNDMpDQotCQkJCQkgICAgKDQ4NSwgMjE0MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMTQzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIDIxMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MzE3MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAyIiBAMTQxNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjI0MSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAwNTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAzIiBAMTQxNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE1DQotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtNDc5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDNCOSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDE1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMjQxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiIEAxNDE3DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTUNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDE4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MTczMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0MzIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTEyMiwgMjI0MSkNCi0JCQkJCSAgICAoMTEyMiwgMjMxOCkNCi0JCQkJCSAgICAoMzg3LCAyMzE4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIzMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MCwgMjI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODU2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTAiIEAxNDIwDQotCQkJCWxvY2F0aW9uICAgCSg3NzMsIDE1NjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODUwMjVCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1MSIgQDE0MjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMA0KLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjcwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MjANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzczLCAxNTY1KQ0KLQkJCQkJICAgICg5NTksIDE1NjUpDQotCQkJCQkgICAgKDk1OSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluRmFjZXQiIEAxNDIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjANCi0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTMsIDE1MzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjMwOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3QSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDIwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAxNTY1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDE1MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA0IiBAMTQyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoODE2LCAxNjUwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCOTcwMDFEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDUiIEAxNDI2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjUNCi0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMENGIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODE2LCAxNjUwKQ0KLQkJCQkJICAgICg5NTksIDE2NTApDQotCQkJCQkgICAgKDk1OSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluRmFjZXQiIEAxNDI3DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjUNCi0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc2NCwgMTYxNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5GYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE0MTYxOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMEQ5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDE2NTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMTYwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMjc0MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzQiIEAxNDMwDQotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzIxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENGMDE5OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzUiIEAxNDMxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzANCi0JCQkJCWxvY2F0aW9uICAgCSgtNzE5LCA0OTcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDg1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MzANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhMZW5ndGhGYWNldCIgQDE0MzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMA0KLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgMjM4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3MjI1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDhGIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MzANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI5NywgMjMyMSkNCi0JCQkJCSAgICAoMTI5NywgMjQwOSkNCi0JCQkJCSAgICAoMjEwMiwgMjQwOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NCwgMjM2NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3OTIwOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzYiIEAxNDM1DQotCQkJCWxvY2F0aW9uICAgCSgxMTU5LCAyMjczKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ1MDBDNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzciIEAxNDM2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MzUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE1OSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5MZW5ndGhGYWNldCIgQDE0MzcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yODEsIDQ0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU3LCAyMzcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkxlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE5NTI3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENjAwMjciDQotCQkJCQljbGllbnQgICAgIAlAMTQzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTU5LCAyMjczKQ0KLQkJCQkJICAgICgxMTU5LCAyNDA5KQ0KLQkJCQkJICAgICg0NTAsIDI0MDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTU5LCAyMjczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgMjQwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAyMzY5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzNjEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMCIgQDE0NDANCi0JCQkJbG9jYXRpb24gICAJKDExOTcsIDIzMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTgwMTZEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMSIgQDE0NDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0MA0KLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgLTYxMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5OTAwNTYiDQotCQkJCQljbGllbnQgICAgIAlAMTQ0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IiBAMTQ0Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQwDQotCQkJCQlsb2NhdGlvbiAgIAkoOTQxLCAtNjEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTYsIDI0NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTI2MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODk5MDA2MCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExOTcsIDIzMzQpDQotCQkJCQkgICAgKDExOTcsIDI0OTMpDQotCQkJCQkgICAgKDQ1MCwgMjQ5MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCAyNDkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjcsIDI0NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTYwNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk4IiBAMTQ0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjQzOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MDAwNjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk5IiBAMTQ0Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoODYzLCAtNzQ2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAxRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQ1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCIgQDE0NDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0NQ0KLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAyNjMyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTcwMzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAyNyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQ1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMzEsIDI0MzgpDQotCQkJCQkgICAgKDEyMzEsIDI2NjgpDQotCQkJCQkgICAgKDQ1MSwgMjY2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDI0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNjY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDI2MzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTg4MTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc4IiBAMTQ1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjM5NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAwREUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc5IiBAMTQ1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNDRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDUwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyMzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidG90YWxEaWdpdHNGYWNldCIgQDE0NTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1MA0KLQkJCQkJbG9jYXRpb24gICAJKC0yMDksIDI1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUzLCAyNTUwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3RvdGFsRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODU1NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNENyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDUwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMzEsIDIzOTcpDQotCQkJCQkgICAgKDEyMzEsIDI1ODcpDQotCQkJCQkgICAgKDQ1MSwgMjU4NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNTg3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzUsIDI1NjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTQ2NDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxNDU1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgNzY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDE5LCA1NzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDQNCi0JCQkJaGVpZ2h0ICAgICAJNDEzDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0NTYNCi0JCQkJbG9jYXRpb24gICAJKDEyMDksIDEwNjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDE0NTUNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTIwOSwgMTA2NSkNCi0JCQkJICAgICgxMjA5LCA5NzQpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzNCIgQDE0NTcNCi0JCQkJbG9jYXRpb24gICAJKDEwOTAsIDEwMzEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjUwM0Q5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlRGVmaW5pdGlvbiIgQDE0NTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1Nw0KLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4OTcsIDEwMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5ODc2NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE5NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDAzQyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDU3DQotCQkJCQlzdXBwbGllciAgIAlAMTQ1NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDk3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMSwgMTAzNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjE3MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNSIgQDE0NjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1Nw0KLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDA0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDU3DQotCQkJCQlzdXBwbGllciAgIAlAMTMwNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDEwODgpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDAiIEAxNDYyDQotCQkJCWxvY2F0aW9uICAgCSgxNTM4LCA4NzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REIwMUU1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlIiBAMTQ2Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYyDQotCQkJCQlsb2NhdGlvbiAgIAkoMTc4LCAxMDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTgsIDc5MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43NjA4NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDYyDQotCQkJCQlzdXBwbGllciAgIAlAMTQ1NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDg3MykNCi0JCQkJCSAgICAoMTUzOCwgOTE5KQ0KLQkJCQkJICAgICgxNDU0LCA5MTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA4NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgOTE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA5LCA4NzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMTY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0MSIgQDE0NjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2Mg0KLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDYyDQotCQkJCQlzdXBwbGllciAgIAlAMTQ1NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDg3MykNCi0JCQkJCSAgICAoMTUzOCwgODI4KQ0KLQkJCQkJICAgICgxNDU0LCA4MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA4NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgODI4KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQyIiBAMTQ2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzNSwgNjg0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzEyMDEwOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZSIgQDE0NjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2Nw0KLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA1OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuOTc3MjczDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxNDAxNTEiDQotCQkJCQljbGllbnQgICAgIAlAMTQ2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NTUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM1LCA2ODQpDQotCQkJCQkgICAgKDE1MzUsIDcyOCkNCi0JCQkJCSAgICAoMTQ1NCwgNzI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDcyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwNiwgNjgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNzc3OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQzIiBAMTQ3MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTc1LCAtODQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTVCIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NjcNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzNSwgNjg0KQ0KLQkJCQkJICAgICgxNTM1LCA2NDEpDQotCQkJCQkgICAgKDE0NTQsIDY0MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzUsIDY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA2NDEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDYiIEAxNDcyDQotCQkJCWxvY2F0aW9uICAgCSg2MTMsIDk0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdFRDAzQzAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcGxleFR5cGUiIEAxNDczDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NzINCi0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDc0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDczDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2NSwgOTgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBsZXhUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzczMDU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMTciDQotCQkJCQljbGllbnQgICAgIAlAMTQ3Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2MTMsIDk0MCkNCi0JCQkJCSAgICAoMjg0LCA5NDApDQotCQkJCQkgICAgKDI4NCwgMTAwOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYxMywgOTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgMTAwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCA5NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDkzMjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NyIgQDE0NzYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3Mg0KLQkJCQkJbG9jYXRpb24gICAJKC03NDcsIDE3MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMjEiDQotCQkJCQljbGllbnQgICAgIAlAMTQ3Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NTUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMCwgOTQwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDc3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlAMTQ1NQ0KLQkJCQlzdXBwbGllciAgIAlAMTI4NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExMiwgNTYyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExMiwgNTEwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjg2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDc4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAMTMwNw0KLQkJCQlzdXBwbGllciAgIAlAMTQ1NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE0NiwgMTA4OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDYsIDEwNjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0NTYpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDQiIEAxNDc5DQotCQkJCWxvY2F0aW9uICAgCSgxMzYyLCAxMTMzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzRCMDE3OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlIiBAMTQ4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDc5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5OSwgMTA5NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI0Njc1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE3QiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDc5DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDEyOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjEsIDEwOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjI3MjczDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDUiIEAxNDgzDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NzkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU4LCAtMTYzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE4NSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDc5DQotCQkJCQlzdXBwbGllciAgIAlAMTQ1NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDk3NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEAxNDg0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDM4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzYzKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZ2xvYmFsIDogYm9vbGVhbiINCi0JCQkJCSIrIGZlYXR1cmVSZWZlcmVuY2UgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQ4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI2MiwgNTY4KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxNDg0DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIyNjIsIDU2OCkNCi0JCQkJICAgICgyMjYyLCA0NzcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ4Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDEyODENCi0JCQkJc3VwcGxpZXIgICAJQDE0ODQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDU5NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDYsIDU2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ4NSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzOCIgQDE0ODcNCi0JCQkJbG9jYXRpb24gICAJKDE1NTMsIDQ1MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMjAxQTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZSIgQDE0ODgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ4Nw0KLQkJCQkJbG9jYXRpb24gICAJKDgwMSwgMjkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzMxLCA0OTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNjI2Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjMwMkU1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0ODcNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU1MywgNDUzKQ0KLQkJCQkJICAgICgxMjIyLCA0NTMpDQotCQkJCQkgICAgKDEyMjIsIDU2MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIyLCA1NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExODUsIDQ3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjAzMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM5IiBAMTQ5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDg3DQotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjMwMkYwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0ODcNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCA0NTMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzAiIEAxNDkyDQotCQkJCWxvY2F0aW9uICAgCSgxOTA4LCAzNTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMDYwMkQ3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkRmVhdHVyZSIgQDE0OTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ5Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjksIDM1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEZlYXR1cmUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI5NDEyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDBFIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0OTINCi0JCQkJCXN1cHBsaWVyICAgCUAxNDg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTkwOCwgMzUzKQ0KLQkJCQkJICAgICgxOTA4LCAzODcpDQotCQkJCQkgICAgKDE5OTMsIDM4NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDk1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NDUsIDM1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NjYzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMxIiBAMTQ5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDkyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMTgiDQotCQkJCQljbGllbnQgICAgIAlAMTQ5Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDE0ODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxOTA4LCAzNTMpDQotCQkJCQkgICAgKDE5MDgsIDMxOSkNCi0JCQkJCSAgICAoMTk5MywgMzE5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkwOCwgMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDMxOSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDEyODUNCi0JCQkJc3VwcGxpZXIgICAJQDEyODQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDk0LCAyODQpDQotCQkJCSAgICAoNDk0LCAyNDQpDQotCQkJCSAgICAoOTk2LCAyNDQpKQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAyODQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTYsIDI0NCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCWNsaWVudCAgICAgCUAxMjcyDQotCQkJCXN1cHBsaWVyICAgCUAxNDg0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzE4LCA4MTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzE4LCA1NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0ODUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUAxMzA5DQotCQkJCXN1cHBsaWVyICAgCUAxNDU1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY1LCAxMjkyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2NSwgMTA2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ1NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUwMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDE0ODQNCi0JCQkJc3VwcGxpZXIgICAJQDEyODQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjE0NywgMjkxKQ0KLQkJCQkgICAgKDIxNDcsIDI0NCkNCi0JCQkJICAgICgxNDY4LCAyNDQpKQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE0NywgMjkxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMjQ0KSkpKSkpKQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBQkZEOUE3MDE2MyINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6aHR0cCIgQDE1MDENCi0JCQlsb2NhdGlvbiAgIAkoMzM2LCAyMjQpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTAxDQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTIsIDE0MCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiaHR0cCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNBQkZEOUFEMDFGOCINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NkbCIgQDE1MDINCi0JCQlsb2NhdGlvbiAgIAkoNzg0LCAyMjQpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTAyDQotCQkJICAgIGxvY2F0aW9uICAgCSg2NDAsIDE0MCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkid3NkbCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNBREZCOEU1MDIxRSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6eHNkIiBAMTUwMw0KLQkJCWxvY2F0aW9uICAgCSgxMjMyLCAyMjQpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTAzDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAxNDApDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJInhzZCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM5QUJEQzZGMDFBQSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQ0KLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTUyIg0KLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMThCIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3Nlcw0KLQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTUzIg0KLQlQcm9jc05EZXZzIAkobGlzdA0KLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyINCi0JCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxNTUiDQotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3Ig0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMNCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFCYXNlU2V0IiA4MDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiQU5TSSINCi0JCQkJdmFsdWUgICAgICAJODAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiT3JhY2xlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJTUUxTZXJ2ZXIiDQotCQkJCXZhbHVlICAgICAgCTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIlN5YmFzZSINCi0JCQkJdmFsdWUgICAgICAJODAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiV2F0Y29tIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJJZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJWXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIl9WIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJCYXNlVmlld3MiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJWQVJDSEFSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIk51bGxzT0siDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcmVzZXJ2ZVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETEVsZW1lbnQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETFNwZWNpZmljYXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSURMU3BlY1NldCIgMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMU3BlY1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiVHlwZWRlZiINCi0JCQkJdmFsdWUgICAgICAJNTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkV4Y2VwdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTdHJ1Y3QiDQotCQkJCXZhbHVlICAgICAgCTUxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiVW5pb24iDQotCQkJCXZhbHVlICAgICAgCTgxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuaHR0cC9zcmMvcm9zZS9odHRwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJRExNb2R1bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuaHR0cC9zcmMvcm9zZS9odHRwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlJhaXNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJtXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkic18iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9vdERpciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTSINCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdW4iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJNaWNyb3NvZnQiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJJQk0iDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiDQotCQkJdmFsdWUgICAgICAJMykNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5Ig0KLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuaHR0cC9zcmMvcm9zZS9odHRwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLmh0dHAvc3JjL3Jvc2UvaHR0cGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJhaXNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kZW50Ig0KLQkJCXZhbHVlICAgICAgCTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAk2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIg0KLQkJCQl2YWx1ZSAgICAgIAk3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlNDQyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlR5cGVMaWJJbXBvcnRlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0YWJsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiDQotCQkJCXZhbHVlICAgICAgCTIxMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiMCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGUiDQotCQkJdmFsdWUgICAgICAJKCJDcmVhdGFibGVTZXQiIDIyMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluaXRpYWxpemF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUZXJtaW5hdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25DbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiQ29sbGVjdGlvbiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiVGV4dCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRvcGVyYXRpb24iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSMkVkaXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTU0IikpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9taW1lLm1kbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvbWltZS5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0M2MyMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9taW1lLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOTk4ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNDINCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzDQotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMA0KLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMA0KLQl0b3BNYXJnaW4gIAkwLjI1MDAwMA0KLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwDQotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMA0KLQljbGlwSWNvbkxhYmVscyAJVFJVRQ0KLQlhdXRvUmVzaXplIAlUUlVFDQotCXNuYXBUb0dyaWQgCVRSVUUNCi0JZ3JpZFggICAgICAJMTYNCi0JZ3JpZFkgICAgICAJMTYNCi0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udA0KLQkgICAgc2l6ZSAgICAgICAJMTANCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JICAgIGJvbGQgICAgICAgCUZBTFNFDQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCSAgICBjb2xvciAgICAgIAkwDQotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQlzaG93TWVzc2FnZU51bSAJMQ0KLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQ0KLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpDQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0FDOTEwNTEwMzFFIg0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0FDOTEwNTIwMDFCIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyINCi0JcXVpZCAgICAgICAJIjNBQzkxMDUxMDMxRCINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciDQotCXF1aWR1ICAgICAgCSIzQUM5MTA1MTAzMUYiDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJtaW1lIg0KLQkJcXVpZCAgICAgICAJIjNBQzkxMjdDMDI2NiINCi0JCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk1JTUVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQUM5MTM1QjAzQTciDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFRjExQ0EwMzhFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSI0MEExMDZBMzAxNjgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjQwQTEwNUUwMDFDQyIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFBhcnQiDQotCQkJCXF1aWQgICAgICAgCSI0MEExMDY2RjAwMjMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0Ig0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkidm9pZCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTA2N0QwMkNDIg0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNBQzkxOTcxMDM2QiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJNSU1FUGFydCINCi0JCQlxdWlkICAgICAgIAkiM0FDOTEzRUUwMEVCIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjQwQTBGREVGMDMyMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTAyQ0QwMTc1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRVBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDI1RDAxQTYiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNDY0MDFBMiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQ0KLQkJCQlyZXN1bHQgICAgIAkidm9pZCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXF1aWQgICAgICAgCSI0MEExMDQ4NDAyN0IiDQotCQkJCXJlc3VsdCAgICAgCSJMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk1JTUVNdWx0aXBhcnRSZWxhdGVkIg0KLQkJCXF1aWQgICAgICAgCSIzQUM5MTNGQTAyNUIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFRjExRDUwMzMwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSI0MEExMDNBRDAzMUMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FTXVsdGlwYXJ0UmVsYXRlZCINCi0JCQkJcXVpZHUgICAgICAJIjQwQTEwMzNCMDBERCIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE1JTUVQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTAzRjYwMTcyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWltZVBhcnQiDQotCQkJCQl0eXBlICAgICAgIAkiSU1JTUVQYXJ0IikpDQotCQkJCXJlc3VsdCAgICAgCSJ2b2lkIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1JTUVQYXJ0cyINCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNDAzMDM4RCINCi0JCQkJcmVzdWx0ICAgICAJIkxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiTUlNRU1pbWVYbWwiDQotCQkJcXVpZCAgICAgICAJIjNBQzkxNDVBMDFGRiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUVGMTFERDAzOEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNzQ3MDM0RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6SU1JTUVNaW1lWG1sIg0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA2RUYwMDhCIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UGFydCINCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNkQ0MDFFQiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnQiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJ2b2lkIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiDQotCQkJCXF1aWQgICAgICAgCSI0MEExMDZFMTAwOTUiDQotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1JTUVQYXJ0Ig0KLQkJCXF1aWQgICAgICAgCSI0MEExMDI1RDAxQTYiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwMjlEMDNEOSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJJTUlNRU11bHRpcGFydFJlbGF0ZWQiDQotCQkJcXVpZCAgICAgICAJIjQwQTEwMzNCMDBERCINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIg0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTAzNzgwMThGIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklNSU1FQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiNDBBMTA1RTAwMUNDIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSI0MEExMDVGNTAyMjYiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1JTUVNaW1lWG1sIg0KLQkJCXF1aWQgICAgICAgCSI0MEExMDZFRjAwOEIiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCINCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNzFFMDNCNCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJMaXN0Ig0KLQkJCXF1aWQgICAgICAgCSI0MEExMEJGQTAxMDkiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0Ig0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTBDMDkwMkE2Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCQkJcXVpZCAgICAgICAJIjNBRTczQjNDMDM1NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFNzNCM0QwMDkwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxMzVCMDNBNyIpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQUU3M0IzRDAwOUEiDQotCQkJCWxhYmVsICAgICAgCSJlUGFydCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIg0KLQkJCXF1aWQgICAgICAgCSIzQUU3M0JCOTAwRDUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQUU3M0JCOTAzQ0UiDQotCQkJCWxhYmVsICAgICAgCSJlUGFydCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyINCi0JCQkJcXVpZCAgICAgICAJIjNBRTczQkI5MDNFMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU1pbWVYbWwiDQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTQ1QTAxRkYiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCINCi0JCQlxdWlkICAgICAgIAkiM0FFRjEyRkUwMzg3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVGMTMwMDAwRDciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNdWx0aXBhcnRSZWxhdGVkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzRkEwMjVCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZU1JTUVQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFRjEzMDAwMEUxIg0KLQkJCQlsYWJlbCAgICAgIAkiZU1JTUVQYXJ0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FUGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxM0VFMDBFQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkNCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJCaW5kaW5ncyINCi0JCQlxdWlkICAgICAgIAkiM0FDOTEyOEIwMUY5Ig0KLQkJCXRpdGxlICAgICAgCSJCaW5kaW5ncyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVDb250ZW50IiBAMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDg0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTAsIDcxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyODQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTM1QjAzQTciDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDkwLCA3NzcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzIpDQotCQkJCXdpZHRoICAgICAgCTMwMg0KLQkJCQloZWlnaHQgICAgIAkyODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTUxLCAxMTUwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQloZWlnaHQgICAgIAkxMjQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDMNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEwNjQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFNzNCM0MwMzU2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEA0DQotCQkJCQlQYXJlbnRfVmlldyAJQDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDE2LCAtMTY4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTczQjNEMDA5MCINCi0JCQkJCWNsaWVudCAgICAgCUAzDQotCQkJCQlzdXBwbGllciAgIAlAMQ0KLQkJCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJ0IiBANQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQxNiwgLTE2OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNSwgMTEwMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUGFydCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzOTMyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTczQjNEMDA5QSINCi0JCQkJCWNsaWVudCAgICAgCUAzDQotCQkJCQlzdXBwbGllciAgIAlAMg0KLQkJCQkJbGluZV9zdHlsZSAJMA0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjgxLCAxMDk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ5MTAzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTWltZVhtbCIgQDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxNTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ3OCwgMTM5OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FTWltZVhtbCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTQ1QTAxRkYiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDc4LCAxNDU4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA2KQ0KLQkJCQl3aWR0aCAgICAgIAkzMjYNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEA5DQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMzIzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTczQkI5MDBENSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFydCIgQDEwDQotCQkJCQlQYXJlbnRfVmlldyAJQDkNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDQsIC0zMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwNiwgMTI5MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUGFydCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4OTU4Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTczQkI5MDNDRSINCi0JCQkJCWNsaWVudCAgICAgCUA5DQotCQkJCQlzdXBwbGllciAgIAlAMg0KLQkJCQkJbGluZV9zdHlsZSAJMA0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MDgsIDEyODQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTIyNzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAxMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5DQotCQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAtMzI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTczQkI5MDNFMiINCi0JCQkJCWNsaWVudCAgICAgCUA5DQotCQkJCQlzdXBwbGllciAgIAlAOA0KLQkJCQkJbGluZV9zdHlsZSAJMCkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNdWx0aXBhcnRSZWxhdGVkIiBAMTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg1NjAsIDU5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNDEsIDQ4NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FTXVsdGlwYXJ0UmVsYXRlZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQxLCA1NDYpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQpDQotCQkJCXdpZHRoICAgICAgCTQ1Ng0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVQYXJ0IiBAMTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg1NjAsIDEwNDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjk2LCA5MzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTUlNRVBhcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI5NiwgOTk0KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI1KQ0KLQkJCQl3aWR0aCAgICAgIAk1NDYNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAxNg0KLQkJCQlsb2NhdGlvbiAgIAkoNTYwLCA4MTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFRjEyRkUwMzg3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAxNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNg0KLQkJCQkJbG9jYXRpb24gICAJKDMyLCAxMTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFRjEzMDAwMEQ3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE2DQotCQkJCQlzdXBwbGllciAgIAlAMTQNCi0JCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTUlNRVBhcnQiIEAxOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNg0KLQkJCQkJbG9jYXRpb24gICAJKDMyLCAxMTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ0LCA4OTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1JTUVQYXJ0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5NDAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFRjEzMDAwMEUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDE2DQotCQkJCQlzdXBwbGllciAgIAlAMTUNCi0JCQkJCWxpbmVfc3R5bGUgCTANCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDMsIDg5OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5NDExOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzY0LCA4OTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU5DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk0MDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOTcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRVBhcnQiIEAyMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgMTQ1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDUsIDE0MjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTAzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklNSU1FUGFydCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1LCAxMzcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMTAyNUQwMUE2Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNSwgMTQ4MikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEwMjgpDQotCQkJCXdpZHRoICAgICAgCTEwNDgNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDJDRDAxNzUiDQotCQkJCWNsaWVudCAgICAgCUAxNQ0KLQkJCQlzdXBwbGllciAgIAlAMjINCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRU11bHRpcGFydFJlbGF0ZWQiIEAyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDc2OCwgMTc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MywgMTQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEyNTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTUlNRU11bHRpcGFydFJlbGF0ZWQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MywgOTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEyNTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDMzQjAwREQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzLCAyMDIpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjQ3KQ0KLQkJCQl3aWR0aCAgICAgIAkxMjY4DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMTAzQUQwMzFDIg0KLQkJCQljbGllbnQgICAgIAlAMTQNCi0JCQkJc3VwcGxpZXIgICAJQDI0DQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6SU1JTUVDb250ZW50IiBAMjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCA0MzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4NCwgMzk4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEwOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTUlNRUNvbnRlbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwODQsIDM0OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjQwQTEwNUUwMDFDQyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDg0LCA0NTgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDk0KQ0KLQkJCQl3aWR0aCAgICAgIAkxMTE0DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA2QTMwMTY4Ig0KLQkJCQljbGllbnQgICAgIAlAMQ0KLQkJCQlzdXBwbGllciAgIAlAMjYNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRU1pbWVYbWwiIEAyOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MTYsIDE5MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1NSwgMTg3MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSU1JTUVNaW1lWG1sIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDU1LCAxODIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA2RUYwMDhCIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTUsIDE5MzApDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTE5KQ0KLQkJCQl3aWR0aCAgICAgIAkxMTQwDQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA3NDcwMzRFIg0KLQkJCQljbGllbnQgICAgIAlAOA0KLQkJCQlzdXBwbGllciAgIAlAMjgNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpMaXN0IiBAMzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDE3NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAxNzAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkxpc3QiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMTY1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjQwQTEwQkZBMDEwOSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDE3NjEpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDEpDQotCQkJCXdpZHRoICAgICAgCTU2Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIkV4dGVuc2liaWxpdHkiDQotCQkJcXVpZCAgICAgICAJIjNBRTczQUEzMDMyRSINCi0JCQl0aXRsZSAgICAgIAkiRXh0ZW5zaWJpbGl0eSINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDE5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NywgODcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NywgMTk1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2KQ0KLQkJCQl3aWR0aCAgICAgIAk0NzYNCi0JCQkJaGVpZ2h0ICAgICAJMjM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTWltZVhtbCIgQDMyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgNzUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzQsIDY0NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FTWltZVhtbCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTQ1QTAxRkYiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NCwgNzA2KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA2KQ0KLQkJCQl3aWR0aCAgICAgIAkzMjYNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTXVsdGlwYXJ0UmVsYXRlZCIgQDMzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCAxMTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMywgMTAzMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FTXVsdGlwYXJ0UmVsYXRlZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMzLCAxMDkwKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0KQ0KLQkJCQl3aWR0aCAgICAgIAk0NTYNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FUGFydCIgQDM0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNzY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQwLCA2NjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTUlNRVBhcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQwLCA3MjIpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjUpDQotCQkJCXdpZHRoICAgICAgCTU0Ng0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVDb250ZW50IiBAMzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc5MiwgNzUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTAsIDY0NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyODQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTM1QjAzQTciDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1MCwgNzA2KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA2KQ0KLQkJCQl3aWR0aCAgICAgIAkzMDINCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM2DQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDUyNikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzENCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoOTc2LCA1MjYpDQotCQkJCSAgICAoOTc2LCAzMDkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVGMTFERDAzOEIiDQotCQkJCWNsaWVudCAgICAgCUAzMg0KLQkJCQlzdXBwbGllciAgIAlAMzENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDYzNCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTYsIDUyNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFRjExRDUwMzMwIg0KLQkJCQljbGllbnQgICAgIAlAMzMNCi0JCQkJc3VwcGxpZXIgICAJQDMxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDQsIDEwMTgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDQsIDUyNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFRjExQ0EwMzhFIg0KLQkJCQljbGllbnQgICAgIAlAMzUNCi0JCQkJc3VwcGxpZXIgICAJQDMxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc4LCA2MzQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc4LCA1MjYpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjQwQTBGREVGMDMyMiINCi0JCQkJY2xpZW50ICAgICAJQDM0DQotCQkJCXN1cHBsaWVyICAgCUAzMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjU2LCA2NTApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTYsIDUyNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYpKSkpKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCINCi0JCXF1aWQgICAgICAgCSIzQURGQjhFNTAyMUUiDQotCQlkb2N1bWVudGF0aW9uIAkNCi18VGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuDQotfA0KLXxXU0RMIGRlc2NyaWJlcyBuZXR3b3JrIHNlcnZpY2VzIGFzIHNldHMgb2YgZW5kcG9pbnRzIG9wZXJhdGluZyBvbiBtZXNzYWdlcy4gVGhlIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGFyZSBkZXNjcmliZWQgYWJzdHJhY3RseSwgYW5kIHRoZW4gYm91bmQgdG8gYSBjb25jcmV0ZSBuZXR3b3JrIHByb3RvY29sIGFuZCBtZXNzYWdlIGZvcm1hdCB0byBkZWZpbmUgYW4gZW5kcG9pbnQuDQotfA0KLXxXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLg0KLXwNCi18VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkNCi18LSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUNCi18LSAyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmcsIHNob3dzIHRoZSBuYW1lc3BhY2UgYW5kIGltcG9ydCBtZWNoYW5pc20NCi18LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQ0KLXwtIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwNCi18LSAyLjMgTWVzc2FnZXMsIDIuNCBQb3J0VHlwZXMsIDIuNSBCaW5kaW5ncyBhbmQgMi43IFNlcnZpY2VzLCBzaG93IHRoZSBtYWpvciBXU0RMIGVsZW1lbnRzIGFuZCB0aGVpciByZWxhdGlvbnMuDQotfA0KLXxUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4NCi0JCQ0KLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzcyAiV1NETEVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDNkEzMDJERCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBsYW5ndWFnZSBlbGVtZW50LiINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyOTYwMEM4Ig0KLQkJCQlyZXN1bHQgICAgIAkiRGVmaW5pdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyQjgwMzQ3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZGVmaW5pdGlvbiINCi0JCQkJCXR5cGUgICAgICAgCSJEZWZpbml0aW9uIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDQ0U0NDM2MDJBMyINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Y5N0RCRDMwMjA3Ig0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIg0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydFR5cGUiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0VHlwZSBlbGVtZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjEgYW5kIGFuIEludGVyZmFjZSBjb21wb25lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMi4gQSBwb3J0IHR5cGUgb3IgSW50ZXJmYWNlIGlzIGEgbmFtZWQgc2V0IG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgYW5kIHRoZSBhYnN0cmFjdCBtZXNzYWdlcyBpbnZvbHZlZC4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM5QjcwMTUwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZEODAxOUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4OEUwMDIzIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFFMzAxRTUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0RFQjAzMTYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRGRDAxQkEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRTlERTk4MDAzQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRTIwMTcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3R5bGUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiDQotCQkJCXR5cGUgICAgICAgCSJPcGVyYXRpb25UeXBlIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCREQ5NjQzMDA0QyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMjM1MDAzRSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTIyMDFBRCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTIwMDExQiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbWVzc2FnZSBlbGVtZW50LiBBIFdTREwgbWVzc2FnZSBpcyBhbiBhYnN0cmFjdCwgdHlwZWQgZGVmaW5pdGlvbiBvZiB0aGUgZGF0YSBiZWluZyBjb21tdW5pY2F0ZWQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMDU1MDFDNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4RDEwMkJBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4N0MwMUZFIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFEMjAyMjYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0U0QjAyQjAiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDU0MjAwRjEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUGFydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTZEMDJGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTdFMjMwMjM3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBCNzAzQzgiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50TmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMDg3MDNEQiINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBDMzAzQzUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEwRjAyRjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRjQwMUEzIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNkQwMTUxIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0REYwMzVDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDYwMDkyMDJGNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5QzRDQjAxOTkiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiU2VydmljZSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEyMDAyNUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTRFMDFCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0OEE0MDE1MSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYyMEQwMjAzIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0ODEwMjIwIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0QzUwMUUyIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENjAwQ0IwMEFBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0NTAyQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUEwMDM5MSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjE0OTAzRDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjUzNTAyQzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQUY5NTQzQzAwNzMiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCODVCMjFBMDI3MSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkRCODAzRDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMUY4MDM4MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDRDE0RkMyMDEyQiINCi0JCQkJcmVzdWx0ICAgICAJIkRPTURvY3VtZW50Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwREUwMUU3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnQiDQotCQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNDc0MDA0RSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiNDAzNTJCN0MwMzk2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg1NzAyRjUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwMEQwMDBEIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkltcG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RUU1ODAzN0EiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDBEMDM0MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM3OSINCi0JCQkJcmVzdWx0ICAgICAJIlhTRFNjaGVtYSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRTY2hlbWEiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NzJDMTAzOTciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzY2hlbWEiDQotCQkJCQl0eXBlICAgICAgIAkiWFNEU2NoZW1hIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTUwQTAwMzYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTE0MDIxMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmxlRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCWRvY3VtZW50YXRpb24gCSIgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkUzQzAzRDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxMkMwM0NEIg0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzE0NzAyOTUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRFbGVtZW50Ig0KLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQuIEFuIGlucHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTA0MDI1RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMjgwMkU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkVFMDMxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUlucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk91dHB1dCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTBDMDM1QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMzUwMEREIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkY4MDFDRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQuIEZhdWx0IGVsZW1lbnRzIHNwZWNpZnkgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgYmUgb3V0cHV0IGFzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFMUM4MjAwMkYyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzRDAzMTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjIwMDIwMDJEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ0lucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gaW5wdXQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMUIwMTEzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNTlCMDA3MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0E0MDIwMyINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0I1MDNBMiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklJbnB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMUVBMDIwRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNDMwMkFCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QjVBNDAyN0UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzRDkwMEYxIg0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNGMTAzMjYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMjAyMDBCRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nRmF1bHQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkzODYwMkM5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU3MTAzMzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDEzMDM3RiINCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDIxMDEwOSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVCRjlFMDE0QSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJRTmFtZSINCi0JCQlxdWlkICAgICAgIAkiM0FFOEVEMjIwMTQwIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUU5hbWUgY2xhc3MuIEEgUU5hbWUgaXMgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0OURBOTAwM0QiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiTmFtZXNwYWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5hbWVzcGFjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGluIGEgV1NETCBkb2N1bWVudC4iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNEMjkwMUIxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlZml4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNEMzIwMjM2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk9wZXJhdGlvblR5cGUiDQotCQkJcXVpZCAgICAgICAJIjNBRUI0NzgyMDI0RiINCi0JCQlkb2N1bWVudGF0aW9uIAkNCi18T05FX1dBWT0xDQotfFJFUVVFU1RfUkVTUE9OU0U9Mg0KLXxTT0xJQ0lUX1JFU1BPTlNFPTMNCi18Tk9USUZJQ0FUSU9OPTQNCi0JCQkNCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMzNTMwM0UzIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0VHlwZSINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE1QkUwMzMxIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZBQzEwMUNBIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkJBRjAxQTQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkY3MDMxQSINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBNjMyMDAwRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTc3NjAwRDEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM0MjAwNjUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCINCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzU5MDI4RiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNzEwMkIxIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzgxMDFCMCINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDOTkwMzFEIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyT3JkZXIiDQotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NEU1MDE4RCINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkM0MDEwNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklJbnB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkU0MDA5NCINCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRjAwMUQyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklPdXRwdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE3OTkwMTJCIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3RUUwMDE1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzMxMDBFRiINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjM0NzAyNzciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLklucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MDAwMDM5Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBODI5MDI3RCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0M0EwMzVEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDQ1MDFDOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MzkwMUQ1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4NjEwMzFEIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDZBMDBCRCINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ3NTAxMzEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4NzEwMjA4Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklNZXNzYWdlIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QThBRjAwNEYiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5NZXNzYWdlIG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjI0MDI3MyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnQiDQotCQkJCQl0eXBlICAgICAgIAkiSVBhcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyM0QwMjMzIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQYXJ0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyNTQwMjVFIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcmRlcmVkUGFydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI2MTAyMEQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0T3JkZXIiDQotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5NZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4QkMwMjYwIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQYXJ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTkzRjAxQkUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5QYXJ0IG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4NDUwMDUyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidmFsdWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJZXhjZXB0aW9ucyAJIldTRExFeGNlcHRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEwMTAxQzMiDQotCQkJCXJlc3VsdCAgICAgCSJJSXRlcmF0b3IiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjhBMkQwMkQ1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiUU5hbWUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTk1MDAyMzEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVNlcnZpY2UiDQotCQkJcXVpZCAgICAgICAJIjNCODRBQjQ5MDI4NyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RDU2MDFEMSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnQiDQotCQkJCQl0eXBlICAgICAgIAkiSVBvcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REEyMDAzNiINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REIwMDFCQyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjVCMDAzRSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJUG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCODAwMzI2Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUxRjMwMkI1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MjYzMDJGMiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjhDMDAxNiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZyINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGMTYwMTUzIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ09wZXJhdGlvbiINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUY1MDAwNjYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGQTQwMUM1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTJBOTAyODQiDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTJCRTAxQTgiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSINCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQkNGMDMwMiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ09wZXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEQzAwMDcyIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBCQzAwNDEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nRmF1bHQiDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEQ5MDA5RCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBGQzAwNjEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzJEMDAxNyINCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzM0YwMzdCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUwOTAwREEiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTFEMDA3RiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdJbnB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0lucHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTM0MDM0OSINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTU0NzAyQTYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3V0cHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3V0cHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QURDQjAyMUMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFERUIwMTAwIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0lucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERkUwMDBEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUUyMTAxMTEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTJEMDA1MCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0ZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUU0RjAwQkQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU1RjAwMkEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFGMzIwM0RCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFGNTYwMjkyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxMjQwMkFCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxMzUwM0QxIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QjFEOTAxNDIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODhGMTAzOUQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIg0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkSW1wb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NDkwMjU5Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW1wb3J0RGVmIg0KLQkJCQkJdHlwZSAgICAgICAJIklJbXBvcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NkUwMDVFIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTg0MDA0QiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUM1MDA0NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIg0KLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlFNDAxRUUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzZXJ2aWNlIg0KLQkJCQkJdHlwZSAgICAgICAJIklTZXJ2aWNlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMTcwMzhDIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEEzMjAyODYiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE0NjAxM0IiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNUMwMEIwIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUZFMDM3QyINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNzUwMkU3Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUltcG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTgzMDE0QyINCi0JCQkJcmVzdWx0ICAgICAJIklJbXBvcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE5RDAzM0UiDQotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUFGMDI1NCINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUMyMDNDNCINCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRTgwMEVEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRjgwMjZEIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjA4MDFEQSINCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMTUwMzlCIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIzMjAxM0EiDQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCNDIwMDc1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ3MiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI5MjAzNDEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJDRDAwNjAiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJFNzAxNDQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDMTcwMTA3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMzRTAwMUQiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzYyMDE0QiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2VzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNzQwMTE1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0JFMDA3MSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OENEQTAxQzYiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFByZWZpeCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0ZEMDAxNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThEMjMwMEE4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQzQjAzQ0UiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1QjgwMTJCIg0KLQkJCQlyZXN1bHQgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RDcwM0JCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnRCYXNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RkUwMjA4Ig0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50QmFzZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENjE4MDMyOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50QmFzZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDU2MDA4MCINCi0JCQkJcmVzdWx0ICAgICAJIklUeXBlcyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVTZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwN0UwMDRDIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEJBMDM1NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwRDgwMjlBIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZU1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBGQTAzMDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDZGMDMxQiINCi0JCQkJcmVzdWx0ICAgICAJIklUeXBlcyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDk1MDBFRSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInR5cGVzIg0KLQkJCQkJdHlwZSAgICAgICAJIklUeXBlcyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5EZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRTcwMkExIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbXBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNCODRCMjAyMDExOSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkltcG9ydCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkltcG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMjBDMDJFQSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJTGlzdCINCi0JCQlxdWlkICAgICAgIAkiM0I4NUMwQTIwM0M1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMwQUYwMjk3Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklNYXAiDQotCQkJcXVpZCAgICAgICAJIjNCODk2QjAzMDBENCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5NYXAiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkIxMTAyQjUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVVSTCINCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1NjMwMjc0Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS5uZXQuVVJMIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLm5ldC5VUkwiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU2RTAzRTIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg5RDU5MzAyQTUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENTlGMDJFOCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0QzQjAzODAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyINCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0YzODAzRTYiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWFzIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBRENGN0UwMzAxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUl0ZXJhdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQzQ2ODdEQTAxNjciDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5JdGVyYXRvciINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4ODA4MDBCOSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRXhjZXB0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQzQ2ODk2NTAzMTMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeGNlcHRpb24gY2xhc3MuIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLldTRExFeGNlcHRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODk3NDAzMTUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JCMjAwNTAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5UeXBlcyBub24tTU9GIGludGVyZmFjZSINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuVHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JGMTAxNzMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0NCMjRBRUMwMUNCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0NDMzYwRDcwMzlDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MjdGMDBCNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDRDE1MDJDMDIzQiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwNjAwMTgyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJcXVpZCAgICAgICAJIjNGNjc3MURCMDJEQyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjc2MkE2QTAzMDgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNGNjc4MEEwMDFBQiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlByb3RlY3RlZCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIg0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiINCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MjQwMThDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUMzIg0KLQkJCQlsYWJlbCAgICAgIAkicG9ydFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDODI3MDFDRCINCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRTAwRTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDRUJGMDA1NyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDYxIg0KLQkJCQlsYWJlbCAgICAgIAkiZVBhcnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQzNTIwMTBGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMzU0MDE3NiINCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTgwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMTAxNzkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMjUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIzOSINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNTAzOEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVENDI2MDJGNSINCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOTQwMDM5MyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUMiDQotCQkJCWxhYmVsICAgICAgCSJlUG9ydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTciDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOUI4MDExRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI0RCINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI2MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOSINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2MDMwMUUyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2MDQwMEI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQzEiDQotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMSINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2NzEwMTA0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzIwMzRBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzIwMzU0Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMyINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2NzcwMDk1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzgwMzcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ3MiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzN0IiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2N0IwMzExIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2N0QwMDdGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlU2VydmljZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwODkiDQotCQkJCWxhYmVsICAgICAgCSJlU2VydmljZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNyINCi0JCQlxdWlkICAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJCWxhYmVsICAgICAgCSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkiDQotCQkJcXVpZCAgICAgICAJIjNBREYyRTY0MDFGNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUxIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdJbnB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMSINCi0JCQlxdWlkICAgICAgIAkiM0FERjJFQjMwMTYzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNDIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMzIg0KLQkJCXF1aWQgICAgICAgCSIzQURGMkY5NDAyNEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUlucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTkwIg0KLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkY5NTAxOUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNSINCi0JCQlxdWlkICAgICAgIAkiM0FERjJGQjgwMkY5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEEiDQotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzciDQotCQkJcXVpZCAgICAgICAJIjNBREYzMzE2MDFBNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjMzMTgwMzg3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzgiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOSINCi0JCQlxdWlkICAgICAgIAkiM0FERjM0MDAwM0U1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nRmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FBIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdGYXVsdHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MSINCi0JCQlxdWlkICAgICAgIAkiM0FFMDkxRjQwMkYzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRSINCi0JCQkJbGFiZWwgICAgICAJImVGYXVsdCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDMiDQotCQkJcXVpZCAgICAgICAJIjNBRUEzRDU1MDAyRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NCINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMyOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZU5hbWVzcGFjZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMzIiDQotCQkJCWxhYmVsICAgICAgCSJlTmFtZXNwYWNlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDUiDQotCQkJcXVpZCAgICAgICAJIjNBRUEzRTNBMDAyRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFFOCINCi0JCQkJbGFiZWwgICAgICAJImVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NiINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFGMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ3Ig0KLQkJCXF1aWQgICAgICAgCSIzQUVBNDEyRjAwMzUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjU1Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjVGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDkiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRDI0MDBCRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNTAwODMiDQotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUxIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3OTAwRjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RCINCi0JCQkJbGFiZWwgICAgICAJImVPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTIiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3QTAxNEUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTMiDQotCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDBDNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMyNyINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NSINCi0JCQlxdWlkICAgICAgIAkiM0I4QjFDMTIwM0IyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQzE0MDAxQyINCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDI2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhCMURDQzAyRTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3MCINCi0JCQkJbGFiZWwgICAgICAJImVTY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1OCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhCRUEyNzAyOUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjAiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkJbGFiZWwgICAgICAJImVUeXBlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiDQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjEiDQotCQkJcXVpZCAgICAgICAJIjNDNDY4MjkzMDNFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDEwRSINCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MiINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDExOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MyINCi0JCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbXBvcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQlsYWJlbCAgICAgIAkiZUltcG9ydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY0REZGMDJFRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NSINCi0JCQlxdWlkICAgICAgIAkiM0NDMzYxNDUwMEYyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNFIg0KLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NyINCi0JCQlxdWlkICAgICAgIAkiM0Y3NEU3ODQwMUIxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDBGIg0KLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDIzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY5Ig0KLQkJCXF1aWQgICAgICAgCSIzRjc4OTZBMjAyNkUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicGFyZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJCIg0KLQkJCQlsYWJlbCAgICAgIAkicGFyZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNoaWxkcmVuIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJDIg0KLQkJCQlsYWJlbCAgICAgIAkiY2hpbGRyZW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi43IFNlcnZpY2VzIg0KLQkJCXF1aWQgICAgICAgCSIzOUFEM0VGNjAxMjciDQotCQkJdGl0bGUgICAgICAJIjIuNyBTZXJ2aWNlcyINCi0JCQl6b29tICAgICAgIAk5MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEA0MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MywgNjYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2MTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA3MTUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk1DQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzEpDQotCQkJCXdpZHRoICAgICAgCTUyMA0KLQkJCQloZWlnaHQgICAgIAk0MDQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0IiBANDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODE2LCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0ODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNDMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI4MDAzMjYiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA1MzYpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzUpDQotCQkJCXdpZHRoICAgICAgCTI3OA0KLQkJCQloZWlnaHQgICAgIAkyMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIiBANDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDkwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklTZXJ2aWNlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCAxNDUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzcpDQotCQkJCXdpZHRoICAgICAgCTI0Ng0KLQkJCQloZWlnaHQgICAgIAkyNjQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEA0NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgNTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCAzODkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDQ0NCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTUNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTMwMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NEUwMUI0Ig0KLQkJCQljbGllbnQgICAgIAlANDQNCi0JCQkJc3VwcGxpZXIgICAJQDQzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDAsIDM3NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MCwgMjkyKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDQsIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0NCwgMTE4MCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTUNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTMwMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5Ig0KLQkJCQljbGllbnQgICAgIAlANDYNCi0JCQkJc3VwcGxpZXIgICAJQDQxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMwLCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMCwgMTAwMikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODE2LCA5MTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjc1LCA4NDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjc1LCA4OTUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpDQotCQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCQloZWlnaHQgICAgIAkxNjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQ1MDJDOSINCi0JCQkJY2xpZW50ICAgICAJQDQ4DQotCQkJCXN1cHBsaWVyICAgCUA0Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODA5LCA4MjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDYzNykpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDUwDQotCQkJCWxvY2F0aW9uICAgCSgzNDMsIDkxNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRzIiBANTENCi0JCQkJCVBhcmVudF9WaWV3IAlANTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEzLCA5NDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjE4OTc4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUMiDQotCQkJCQljbGllbnQgICAgIAlANTANCi0JCQkJCXN1cHBsaWVyICAgCUA0OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDkxNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzksIDg4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDgwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgOTkwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzI4NDY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNiIgQDU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMSwgNjQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNiwgNzQ0KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUQiDQotCQkJCQljbGllbnQgICAgIAlANTANCi0JCQkJCXN1cHBsaWVyICAgCUA0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM0MywgOTE2KQ0KLQkJCQkJICAgICgyNTcsIDkxNikNCi0JCQkJCSAgICAoMjU3LCA2NzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTcsIDY3OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDEsIDc5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNzA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNyIgQDU4DQotCQkJCWxvY2F0aW9uICAgCSg4ODYsIDEyNzApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjgwMTFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nIiBANTkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTgNCi0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTIsIDEyMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmciDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDg1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI0RCINCi0JCQkJCWNsaWVudCAgICAgCUA1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM1LCAxMjcwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzAsIDEzMTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQyODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4IiBANjINCi0JCQkJCVBhcmVudF9WaWV3IAlANTgNCi0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MiwgMTEwNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODc5NDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI2MSINCi0JCQkJCWNsaWVudCAgICAgCUA1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODg2LCAxMjcwKQ0KLQkJCQkJICAgICg4MTIsIDEyNzApDQotCQkJCQkgICAgKDgxMiwgOTk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMiwgOTk2KSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNSBCaW5kaW5ncyINCi0JCQlxdWlkICAgICAgIAkiMzlBRDUxMjcwMjUyIg0KLQkJCXRpdGxlICAgICAgCSIyLjUgQmluZGluZ3MiDQotCQkJem9vbSAgICAgICAJODUNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIiBANjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDI0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTE0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgNjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTcyKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDcxKQ0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMzc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIgQDY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAzNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCAxMzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDE4OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTkNCi0JCQkJICAgIG1heF93aWR0aCAgCTM5NikNCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTU2OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIgQDY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTMzNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0lucHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTI4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIg0KLQkJCQl3aWR0aCAgICAgIAkyNzgNCi0JCQkJaGVpZ2h0ICAgICAJMTc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCIgQDY3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTYzOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ091dHB1dCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE1ODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSINCi0JCQkJd2lkdGggICAgICAJMzEyDQotCQkJCWhlaWdodCAgICAgCTE3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIgQDY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTU4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nRmF1bHQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTA4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiDQotCQkJCXdpZHRoICAgICAgCTI5MA0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBANjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgNDg2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCA1NDQpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk1DQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpDQotCQkJCXdpZHRoICAgICAgCTY5MQ0KLQkJCQloZWlnaHQgICAgIAkzMDENCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBANzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDEyODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMTc4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEA3MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDE2NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTU4NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMTc4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDY4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NywgNTM5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk3LCA1OTcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk1DQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpDQotCQkJCXdpZHRoICAgICAgCTQzMg0KLQkJCQloZWlnaHQgICAgIAkzMjINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJY2xpZW50ICAgICAJQDcyDQotCQkJCXN1cHBsaWVyICAgCUA2NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc5LCA1MjcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzksIDQyOCkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBANzQNCi0JCQkJbG9jYXRpb24gICAJKDEwMzksIDc0MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1MjAxMEYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlIiBANzUNCi0JCQkJCVBhcmVudF9WaWV3IAlANzQNCi0JCQkJCWxvY2F0aW9uICAgCSg1NzUsIDU5OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ5LCA3ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5MjkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxNzYiDQotCQkJCQljbGllbnQgICAgIAlANzQNCi0JCQkJCXN1cHBsaWVyICAgCUA2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1OSwgNzQyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTIsIDcxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjE5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAiIEA3OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NA0KLQkJCQkJbG9jYXRpb24gICAJKDU3NSwgNTk4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NiwgNjk3KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwOTQ0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzNTQwMTgwIg0KLQkJCQkJY2xpZW50ICAgICAJQDc0DQotCQkJCQlzdXBwbGllciAgIAlANzINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzOSwgNzQyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUyMCwgNzQyKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTAyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcyLCA4NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiT3BlcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcyLCA5MDkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk2DQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDYpDQotCQkJCXdpZHRoICAgICAgCTQ1MA0KLQkJCQloZWlnaHQgICAgIAkzNzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDgxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCAxNDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3NiwgMTI4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3NiwgMTM0MSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTMwMykNCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTI3NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OSIgQDgyDQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCAxMzU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRDI0MDBCRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEA4Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4Mg0KLQkJCQkJbG9jYXRpb24gICAJKDk2LCAyODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzNywgMTMxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzUxNDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4MyINCi0JCQkJCWNsaWVudCAgICAgCUA4Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDcwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTM1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk0LCAxMzk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5NTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MCIgQDg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDgyDQotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODQiDQotCQkJCQljbGllbnQgICAgIAlAODINCi0JCQkJCXN1cHBsaWVyICAgCUA4MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4MSwgMTM1OSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBAODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDE2NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODEyLCAxNTM5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxMiwgMTU5NykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTMwMykNCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTI3NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MSIgQDg4DQotCQkJCWxvY2F0aW9uICAgCSgxNDMyLCAxNjU0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRDc5MDBGMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBAODkNCi0JCQkJCVBhcmVudF9WaWV3IAlAODgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwLCAzNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NSwgMTYxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3V0cHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc0NzcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEQiDQotCQkJCQljbGllbnQgICAgIAlAODgNCi0JCQkJCXN1cHBsaWVyICAgCUA3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDcsIDE2NTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4MSwgMTY5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5MDI3NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTIiIEA5Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEUiDQotCQkJCQljbGllbnQgICAgIAlAODgNCi0JCQkJCXN1cHBsaWVyICAgCUA4Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDE2NTQpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDkzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTkyLCAxMDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOSwgOTMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOSwgOTg5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQ0KLQkJCQl3aWR0aCAgICAgIAkzNjQNCi0JCQkJaGVpZ2h0ICAgICAJMTc4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFNDAxREMiDQotCQkJCWNsaWVudCAgICAgCUA5Mw0KLQkJCQlzdXBwbGllciAgIAlANjUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2NiwgOTE5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTY2LCA2MzYpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEA5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDU3LCAxMDIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0UxMDE3OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMiIgQDk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzUsIDkyMCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjI1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDk1DQotCQkJCQlzdXBwbGllciAgIAlANzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0NTcsIDEwMjIpDQotCQkJCQkgICAgKDI3NiwgMTAyMikNCi0JCQkJCSAgICAoMjc2LCA4NDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc2LCA4NDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMwLCA4ODQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3BlcmF0aW9ucyIgQDk5DQotCQkJCQlQYXJlbnRfVmlldyAJQDk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMxLCA5NzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjExNjk5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMzkiDQotCQkJCQljbGllbnQgICAgIAlAOTUNCi0JCQkJCXN1cHBsaWVyICAgCUA5Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEwLCAxMDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjksIDk4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4NDk1Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgMTA2NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyNzU2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDEwMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQxOCwgMTA0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNTAzOEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbiIgQDEwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxMDc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA2MDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDMNCi0JCQkJCXN1cHBsaWVyICAgCUA4MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjMsIDEwNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg5LCAxMDA1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk2NzIxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNCIgQDEwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjczLCAxMDcwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NTQyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkZGIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMw0KLQkJCQkJc3VwcGxpZXIgICAJQDkzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3NCwgMTA0MCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5IiBAMTA5DQotCQkJCWxvY2F0aW9uICAgCSg3ODcsIDExOTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjQwMUY1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nSW5wdXQiIEAxMTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY5LCAxMTUyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nSW5wdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTE5MDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDkNCi0JCQkJCXN1cHBsaWVyICAgCUA4MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc4NywgMTE5MCkNCi0JCQkJCSAgICAoNjM2LCAxMTkwKQ0KLQkJCQkJICAgICg2MzYsIDEyNzEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCAxMjcxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg1LCAxMjIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQwNDc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMCIgQDExMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzgxLCA0NTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODUsIDExNDQpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDkNCi0JCQkJCXN1cHBsaWVyICAgCUA5Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc4NywgMTE5MCkNCi0JCQkJCSAgICAoOTI2LCAxMTkwKQ0KLQkJCQkJICAgICg5MjYsIDEwOTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI2LCAxMDk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODcxLCAxMTM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzU4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxIiBAMTE2DQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMzEyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYyRUIzMDE2MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ091dHB1dCIgQDExNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEyLCAxNDI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMwNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3V0cHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQ1MDgyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0MiDQotCQkJCQljbGllbnQgICAgIAlAMTE2DQotCQkJCQlzdXBwbGllciAgIAlAODcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxNDc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc0NTkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMiIgQDEyMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODMsIDExNDApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRUI0MDEzRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTYNCi0JCQkJCXN1cHBsaWVyICAgCUA5Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDEwOTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDMxLCAxMTg2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkwMTY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAMTIzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyMCwgMTk4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3MiwgMTkwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDEyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTIsIDE4NTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxMiwgMTkxNykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTMwMykNCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTI3NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyINCi0JCQkJY2xpZW50ICAgICAJQDEyNA0KLQkJCQlzdXBwbGllciAgIAlANjgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDMsIDIwMDcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDIwMDcpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzkiIEAxMjYNCi0JCQkJbG9jYXRpb24gICAJKDEzNTYsIDEzNTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDAwM0U1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nRmF1bHRzIiBAMTI3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNg0KLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MiwgMTc1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0ZhdWx0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMzE1MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyNg0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTYsIDE4NDcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA5LCAxNzk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MTk0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTYsIDE4MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTkyOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MCIgQDEzMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjYNCi0JCQkJCWxvY2F0aW9uICAgCSgxODgsIDYxNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjYNCi0JCQkJCXN1cHBsaWVyICAgCUA5Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTYsIDEzNTIpDQotCQkJCQkgICAgKDEzNTYsIDEyMTcpDQotCQkJCQkgICAgKDExMTcsIDEyMTcpDQotCQkJCQkgICAgKDExMTcsIDEwOTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDEwOTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTUyLCAxMTY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg3MDA4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQxIiBAMTM0DQotCQkJCWxvY2F0aW9uICAgCSgxNjQwLCAxOTcwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA5MUY0MDJGMyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHQiIEAxMzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NCwgMTkxNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzY0MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYzLCAxOTcwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcxOCwgMjAxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MjI3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDIiIEAxMzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTE3LCAxOTcwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMzkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0MzAyQUIiDQotCQkJCWNsaWVudCAgICAgCUA4Nw0KLQkJCQlzdXBwbGllciAgIAlANjcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwMywgMTY1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM2NCwgMTY1NikpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTFCMDExMyINCi0JCQkJY2xpZW50ICAgICAJQDgxDQotCQkJCXN1cHBsaWVyICAgCUA2Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzMxLCAxMzg1KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjQgUG9ydFR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDFDNDAzNjYiDQotCQkJdGl0bGUgICAgICAJIjIuNCBQb3J0VHlwZXMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiINCi0JCQl6b29tICAgICAgIAk4MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIiBAMTQxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAyMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklQb3J0VHlwZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTIyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMjMzKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjk2KQ0KLQkJCQl3aWR0aCAgICAgIAk3MTgNCi0JCQkJaGVpZ2h0ICAgICAJMTk2DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIgQDE0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNiwgMTc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg3Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklPcGVyYXRpb24iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxMjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg3Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNiwgMjM3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzA5KQ0KLQkJCQl3aWR0aCAgICAgIAk4OTENCi0JCQkJaGVpZ2h0ICAgICAJMTg4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiIEAxNDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxNDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklJbnB1dCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxMzg3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxNDk4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjIxKQ0KLQkJCQl3aWR0aCAgICAgIAk2NDQNCi0JCQkJaGVpZ2h0ICAgICAJMTk0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IiBAMTQ0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAxNzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTc1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJT3V0cHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE3MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE4MTgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYpDQotCQkJCXdpZHRoICAgICAgCTY3NA0KLQkJCQloZWlnaHQgICAgIAkxOTQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCIgQDE0NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMjExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDIwNzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUZhdWx0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDIwMjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDIxMzcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjUpDQotCQkJCXdpZHRoICAgICAgCTY0NA0KLQkJCQloZWlnaHQgICAgIAkxOTYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTQ2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OCwgNjcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4LCA3MzMpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpDQotCQkJCXdpZHRoICAgICAgCTY5NQ0KLQkJCQloZWlnaHQgICAgIAkyODENCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMTQ3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU3NiwgODAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzI1LCA2OTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMjUsIDc1MykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4NCkNCi0JCQkJd2lkdGggICAgICAJNTIwDQotCQkJCWhlaWdodCAgICAgCTI0MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxNDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAyMDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDE0OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDE0NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMTQyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEAxNTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxNzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxNzQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCXdpZHRoICAgICAgCTI3NA0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDE1MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxNCwgNjIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTQsIDY4MSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTUNCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NikNCi0JCQkJd2lkdGggICAgICAJNjk1DQotCQkJCWhlaWdodCAgICAgCTM1Mg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDE1Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgNzk3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODI0MDE4QyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9ucyIgQDE1Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTINCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDc0OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3BlcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM1OTY0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUNEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE1Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDE1MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwNSwgNzk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NiwgODYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwMzkxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzQsIDkyMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjI0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBvcnRUeXBlIiBAMTU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDE1Mg0KLQkJCQkJbG9jYXRpb24gICAJKDU5MiwgMjY5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDODI3MDFDMyINCi0JCQkJCWNsaWVudCAgICAgCUAxNTINCi0JCQkJCXN1cHBsaWVyICAgCUAxNDYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNzk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODg4LCA3NTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTM0ODgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDciIEAxNTkNCi0JCQkJbG9jYXRpb24gICAJKDIxMDcsIDc3MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEyRjAwMzUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcmFtZXRlck9yZGVyaW5nIiBAMTYwDQotCQkJCQlQYXJlbnRfVmlldyAJQDE1OQ0KLQkJCQkJbG9jYXRpb24gICAJKDE4MTksIDEwMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDUsIDY0NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODMzMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNTUiDQotCQkJCQljbGllbnQgICAgIAlAMTU5DQotCQkJCQlzdXBwbGllciAgIAlAMTQ3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzE2LCA3NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjcyLCA4MjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTY2MTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3MSwgODg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzA2MjIwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDgiIEAxNjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTU5DQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1RiINCi0JCQkJCWNsaWVudCAgICAgCUAxNTkNCi0JCQkJCXN1cHBsaWVyICAgCUAxNTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTksIDc3MykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM3IiBAMTY1DQotCQkJCWxvY2F0aW9uICAgCSgxNzAyLCAxNTA0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYzMzE2MDFBNCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHRzIiBAMTY2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE2NQ0KLQkJCQkJbG9jYXRpb24gICAJKDE0MTQsIDgzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTUsIDE5ODIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUZhdWx0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3ODk5Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4NyINCi0JCQkJCWNsaWVudCAgICAgCUAxNjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCAyMDQ4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NCwgMjAyMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0OTU4MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTkzLCAxOTYzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ1Mzc4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzgiIEAxNzANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTY1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2MSwgMTA2OSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE1MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDk2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDEwMzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTczNjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMzIiBAMTczDQotCQkJCWxvY2F0aW9uICAgCSgxMTc4LCAxMjM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYyRjk0MDI0RCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEAxNzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTczDQotCQkJCQlsb2NhdGlvbiAgIAkoODkwLCA1NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDEzNDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUlucHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE5ODIwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTUwMTkwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDE0OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzgsIDEyMzQpDQotCQkJCQkgICAgKDk4MCwgMTIzNCkNCi0JCQkJCSAgICAoOTgwLCAxNDEwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODAsIDE0MTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ2LCAxMzY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc3NjYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNCIgQDE3Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzMNCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzYsIDEwMzYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRjk1MDE5QSINCi0JCQkJCWNsaWVudCAgICAgCUAxNzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxNTENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc4LCAxMjM0KQ0KLQkJCQkJICAgICgxMjc3LCAxMjM0KQ0KLQkJCQkJICAgICgxMjc3LCA5NjApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc4LCAxMjM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzcsIDk2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExOTcsIDEwNTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY0MTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzUiIEAxODANCi0JCQkJbG9jYXRpb24gICAJKDE0NjgsIDEzNDUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjgwMkY5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEAxODENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTgwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MiwgMTY2OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3V0cHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwOTA5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBBIg0KLQkJCQkJY2xpZW50ICAgICAJQDE4MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE1MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDE3MzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTQ2LCAxNjc2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNjM2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNiIgQDE4NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxODANCi0JCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDI3LCAxMDM3KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEIiDQotCQkJCQljbGllbnQgICAgIAlAMTgwDQotCQkJCQlzdXBwbGllciAgIAlAMTUxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgOTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyMywgMTA4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5MDM0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkQ4MDE5RiINCi0JCQkJY2xpZW50ICAgICAJQDE0Ng0KLQkJCQlzdXBwbGllciAgIAlAMTQxDQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkUyMDE3MSINCi0JCQkJY2xpZW50ICAgICAJQDE1MQ0KLQkJCQlzdXBwbGllciAgIAlAMTQyDQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkVFMDMxRCINCi0JCQkJY2xpZW50ICAgICAJQDE0OQ0KLQkJCQlzdXBwbGllciAgIAlAMTQzDQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkY4MDFDRCINCi0JCQkJY2xpZW50ICAgICAJQDE1MA0KLQkJCQlzdXBwbGllciAgIAlAMTQ0DQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDAyMDAyRCINCi0JCQkJY2xpZW50ICAgICAJQDE0OA0KLQkJCQlzdXBwbGllciAgIAlAMTQ1DQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE5Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyMjQsIDE0NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzcsIDEzMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTc1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzcsIDEzNzMpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpDQotCQkJCXdpZHRoICAgICAgCTU5Mw0KLQkJCQloZWlnaHQgICAgIAkzMTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIiBAMTkzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgMjU0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAyNDY2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2VSZWZlcmVuY2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAyNTI3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQ0KLQkJCQl3aWR0aCAgICAgIAk2NzINCi0JCQkJaGVpZ2h0ICAgICAJMTgwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxOTQNCi0JCQkJbG9jYXRpb24gICAJKDE1MjQsIDIyNzUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDE5Mw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNTI0LCAyMjc1KQ0KLQkJCQkgICAgKDE1MjQsIDI0NTQpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTk1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyM0QwMzE5Ig0KLQkJCQljbGllbnQgICAgIAlAMTQ4DQotCQkJCXN1cHBsaWVyICAgCUAxOTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzYsIDIxNzYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc2LCAyMjc1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxOTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjM1MDBERCINCi0JCQkJY2xpZW50ICAgICAJQDE1MA0KLQkJCQlzdXBwbGllciAgIAlAMTkzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzcxLCAxODU0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3MSwgMjI3NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTk0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIyODAyRTciDQotCQkJCWNsaWVudCAgICAgCUAxNDkNCi0JCQkJc3VwcGxpZXIgICAJQDE5Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgwLCAxNTM0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAyMjc1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxOTQpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NyIgQDE5OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjIwNiwgMjI1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NDAxQjEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAxOTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTk4DQotCQkJCQlsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA2OCwgMTY3MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMjIzMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNGNzRFNzg2MDAwRiINCi0JCQkJCWNsaWVudCAgICAgCUAxOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxOTINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMjI1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjA2LCAxNjEyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2MCwgMTY3OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjgiIEAyMDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTk4DQotCQkJCQlsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNGNzRFNzg2MDAyMyINCi0JCQkJCWNsaWVudCAgICAgCUAxOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxOTMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMjA2LCAyMjU5KQ0KLQkJCQkJICAgICgyMjA2LCAyNTU2KQ0KLQkJCQkJICAgICgxODU2LCAyNTU2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMjI1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODU2LCAyNTU2KSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMSBEZWZpbml0aW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0FENUU0OEEwMjYyIg0KLQkJCXRpdGxlICAgICAgCSIyLjEgRGVmaW5pdGlvbnMiDQotCQkJem9vbSAgICAgICAJODMNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIiBAMjAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxOTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxNjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSURlZmluaXRpb24iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMTExKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAyMjApDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDApDQotCQkJCXdpZHRoICAgICAgCTcwNg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMjA0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjg2LCA4OTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCQl3aWR0aCAgICAgIAkyOTQNCi0JCQkJaGVpZ2h0ICAgICAJMTIwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAyMDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTAsIDU0NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTEwLCA2MDQpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzgpDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxODINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAyMDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjExMiwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwMCwgMTA1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwMCwgMTExNSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAyMDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgwOCwgMTQ4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5NiwgMTM2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTYsIDE0MTkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyODANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAyMDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEyNCwgMTYwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEyNCwgMTY1OSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDIwOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDI0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgMzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTEwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDk4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNw0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTIxKQ0KLQkJCQl3aWR0aCAgICAgIAk1MjgNCi0JCQkJaGVpZ2h0ICAgICAJNDI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU5IiBAMjEwDQotCQkJCWxvY2F0aW9uICAgCSgxMzU4LCA4NjApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYwIiBAMjExDQotCQkJCQlQYXJlbnRfVmlldyAJQDIxMA0KLQkJCQkJbG9jYXRpb24gICAJKDYyLCAtMzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCA1MzUpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiINCi0JCQkJCWNsaWVudCAgICAgCUAyMTANCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTgsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDMsIDUxMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NjY0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMjE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDIxMA0KLQkJCQkJbG9jYXRpb24gICAJKDYyLCAtMzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg2LCA5MDkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVR5cGVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc5MDk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiDQotCQkJCQljbGllbnQgICAgIAlAMjEwDQotCQkJCQlzdXBwbGllciAgIAlAMjA0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1OCwgODYwKQ0KLQkJCQkJICAgICgxMzU4LCA5NDgpDQotCQkJCQkgICAgKDE2NzcsIDk0OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc3LCA5NDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA5ODcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTI2NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjMiIEAyMTcNCi0JCQkJbG9jYXRpb24gICAJKDE2MTIsIDU5NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjQiIEAyMTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjE3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjMsIDUxMikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIg0KLQkJCQkJY2xpZW50ICAgICAJQDIxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDIwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MTIsIDU5NSkNCi0JCQkJCSAgICAoMTQ2NCwgNTk1KQ0KLQkJCQkJICAgICgxNDY0LCA0NTMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2NCwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyNCwgNDk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU4NjY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDIyMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTcNCi0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5MiwgNTU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjgwMzM1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkJCQljbGllbnQgICAgIAlAMjE3DQotCQkJCQlzdXBwbGllciAgIAlAMjA1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTAxLCA1OTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODU0LCA2NTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDEwMDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NiwgNjQ2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjI1OTQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMjI1DQotCQkJCWxvY2F0aW9uICAgCSgxMjc5LCAxMTM3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjAzMDFFMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDIyNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMjUNCi0JCQkJCWxvY2F0aW9uICAgCSgyNzEsIDI3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzgsIDU5MSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDIyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDIwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzksIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjAsIDU4NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwNDk3NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2VzIiBAMjI5DQotCQkJCQlQYXJlbnRfVmlldyAJQDIyNQ0KLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NywgMTE3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDMxMzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBDMSINCi0JCQkJCWNsaWVudCAgICAgCUAyMjUNCi0JCQkJCXN1cHBsaWVyICAgCUAyMDYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjc5LCAxMTM3KQ0KLQkJCQkJICAgICgxMjc5LCAxMjA4KQ0KLQkJCQkJICAgICgxODkxLCAxMjA4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODkxLCAxMjA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTE3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTM0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzk3LCAxMjQ0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NDA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMjMzDQotCQkJCWxvY2F0aW9uICAgCSgxMjEyLCAxMTU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjcxMDEwNCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDIzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCA1OTQpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM0QSINCi0JCQkJCWNsaWVudCAgICAgCUAyMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjEyLCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUxLCA2MjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTc5NjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0VHlwZXMiIEAyMzcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5MSwgMTQ1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydFR5cGVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzIzNjk4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNTQiDQotCQkJCQljbGllbnQgICAgIAlAMjMzDQotCQkJCQlzdXBwbGllciAgIAlAMjA3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIxMiwgMTE1OSkNCi0JCQkJCSAgICAoMTIxMiwgMTQ5MCkNCi0JCQkJCSAgICAoMTU4NywgMTQ5MCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4NywgMTQ5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjM3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzMsIDE0NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjU2MTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMiwgMTU0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NTg1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMyIgQDI0MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTExNCwgMTU4NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3NzAwOTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQiIEAyNDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjQxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgNjgwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzNzEiDQotCQkJCQljbGllbnQgICAgIAlAMjQxDQotCQkJCQlzdXBwbGllciAgIAlAMjA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNCwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1NSwgNzUyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2NzA0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ3MiIEAyNDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjQxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1MSwgMTY3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ3MiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjYzNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3QiINCi0JCQkJCWNsaWVudCAgICAgCUAyNDENCi0JCQkJCXN1cHBsaWVyICAgCUAyMDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTE0LCAxNTg1KQ0KLQkJCQkJICAgICgxMTE0LCAxNzE2KQ0KLQkJCQkJICAgICgyMTE1LCAxNzE2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTE1LCAxNzE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1MywgMTY3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NTA3NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDE0LCAxNzU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTExMDcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMjQ5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjgsIDE5MjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjgsIDE5NzkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyODANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUiIEAyNTANCi0JCQkJbG9jYXRpb24gICAJKDEwNjYsIDE1MzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0IwMzExIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2IiBAMjUxDQotCQkJCQlQYXJlbnRfVmlldyAJQDI1MA0KLQkJCQkJbG9jYXRpb24gICAJKC01MjEsIC0xMTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDI1LCA2NjkpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjdEMDA3RiINCi0JCQkJCWNsaWVudCAgICAgCUAyNTANCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTA5LCA3NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTk2OTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVTZXJ2aWNlcyIgQDI1NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNTIxLCAtMTExKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5MywgMjAyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlU2VydmljZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTE4MjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjdEMDA4OSINCi0JCQkJCWNsaWVudCAgICAgCUAyNTANCi0JCQkJCXN1cHBsaWVyICAgCUAyNDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDY2LCAxNTMzKQ0KLQkJCQkJICAgICgxMDY2LCAyMDU5KQ0KLQkJCQkJICAgICgxNjE5LCAyMDU5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE5LCAyMDU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1NCwgMjAzMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0MDE5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTMyLCAyMTEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIwNTE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjU4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRjgwMzgyIg0KLQkJCQljbGllbnQgICAgIAlAMjA5DQotCQkJCXN1cHBsaWVyICAgCUAyMDMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjQsIDI2MykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4NSwgMjYzKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEuMyBFeHRlbnNpYmlsaXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ2MEM1MTAxOTIiDQotCQkJdGl0bGUgICAgICAJIjIuMS4zIEV4dGVuc2liaWxpdHkiDQotCQkJem9vbSAgICAgICAJODANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAyNTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMTU4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjU5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDk0LCAxNTMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQl3aWR0aCAgICAgIAkxODINCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAMjYwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAxODg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDg3LCAxODM2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyNjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE3MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNDIsIDE2NzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCXdpZHRoICAgICAgCTE4Mg0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDI2Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMjMzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgMjI4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzQNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAMjYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3MzYsIDE3NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU2MywgMTcwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJd2lkdGggICAgICAJMzY0DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgMTM2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDg2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3ODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjEyNDAyQUIiDQotCQkJCXdpZHRoICAgICAgCTgwNA0KLQkJCQloZWlnaHQgICAgIAkxNzINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDI2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAxOTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDE4OTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCQkJd2lkdGggICAgICAJMjc0DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIgQDI2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMjE0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYzLCAyMDkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIg0KLQkJCQl3aWR0aCAgICAgIAkzMDgNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjY3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEyOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMjM1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQl3aWR0aCAgICAgIAkyMjINCi0JCQkJaGVpZ2h0ICAgICAJMTQ2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDI2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDE0MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDMzNSwgMTM1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAyNjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDY4OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDksIDU4MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwOSwgNjQxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMxKQ0KLQkJCQl3aWR0aCAgICAgIAk1NjANCi0JCQkJaGVpZ2h0ICAgICAJMjQwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI3MA0KLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCAxMDM5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAyNjkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDgwLCAxMDM5KQ0KLQkJCQkgICAgKDQ4MCwgODA4KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDYwMENCMDBBQSINCi0JCQkJY2xpZW50ICAgICAJQDI2MA0KLQkJCQlzdXBwbGllciAgIAlAMjY5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY2LCAxODI0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2NiwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjVBNDAyN0UiDQotCQkJCWNsaWVudCAgICAgCUAyNjYNCi0JCQkJc3VwcGxpZXIgICAJQDI2OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NywgMjA3OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTcsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjczDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkzODYwMkM5Ig0KLQkJCQljbGllbnQgICAgIAlAMjYyDQotCQkJCXN1cHBsaWVyICAgCUAyNjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTksIDIyNzEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjE5LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODVCNTlCMDA3MiINCi0JCQkJY2xpZW50ICAgICAJQDI2NQ0KLQkJCQlzdXBwbGllciAgIAlAMjY5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODgsIDE4ODcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODgsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjc1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwOTIwMkY3Ig0KLQkJCQljbGllbnQgICAgIAlAMjYzDQotCQkJCXN1cHBsaWVyICAgCUAyNjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc5NywgMTY5NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc5NywgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEwRjAyRjAiDQotCQkJCWNsaWVudCAgICAgCUAyNTkNCi0JCQkJc3VwcGxpZXIgICAJQDI2OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjAxLCAxNTE5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjAxLCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGREI4MDNENCINCi0JCQkJY2xpZW50ICAgICAJQDI2Nw0KLQkJCQlzdXBwbGllciAgIAlAMjY5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTEsIDEyMjMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTEsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjc4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQljbGllbnQgICAgIAlAMjY4DQotCQkJCXN1cHBsaWVyICAgCUAyNjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQxNCwgMTM0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxNCwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEyMDAyNUUiDQotCQkJCWNsaWVudCAgICAgCUAyNjENCi0JCQkJc3VwcGxpZXIgICAJQDI2OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTY2MykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MjksIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI4MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDY4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgNTgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgNjQ0KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY1KQ0KLQkJCQl3aWR0aCAgICAgIAk1NjMNCi0JCQkJaGVpZ2h0ICAgICAJMjM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3IiBAMjgxDQotCQkJCWxvY2F0aW9uICAgCSgxMTkxLCA2NzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4IiBAMjgyDQotCQkJCQlQYXJlbnRfVmlldyAJQDI4MQ0KLQkJCQkJbG9jYXRpb24gICAJKDIzLCA1NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NDcsIDYzMSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIg0KLQkJCQkJY2xpZW50ICAgICAJQDI4MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDI2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkxLCA2NzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzYwLCA2NzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzAsIDYyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzOTY5NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDI4NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyODENCi0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NSwgNTIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzkwNzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJCQljbGllbnQgICAgIAlAMjgxDQotCQkJCQlzdXBwbGllciAgIAlAMjgwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjIzLCA2NzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDk2LCA2MjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk0MDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MywgNzY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjMyNDc5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIgQDI4OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxOTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjg5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjMwLCA4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJXU0RMRWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYzMCwgMTQ1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzUzKQ0KLQkJCQl3aWR0aCAgICAgIAk3NzQNCi0JCQkJaGVpZ2h0ICAgICAJMjQwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI5MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgNDAyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAyODkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTAwOCwgNDAyKQ0KLQkJCQkgICAgKDEwMDgsIDMxMikpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyOTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkUzQzAzRDQiDQotCQkJCWNsaWVudCAgICAgCUAyNjkNCi0JCQkJc3VwcGxpZXIgICAJQDI4OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDkyLCA1NjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0OTIsIDQwMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyOTINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjE0OTAzRDAiDQotCQkJCWNsaWVudCAgICAgCUAyODANCi0JCQkJc3VwcGxpZXIgICAJQDI2NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxNSwgNTcxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNSwgMjQ2KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjkzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JEREY1MzUwMkMzIg0KLQkJCQljbGllbnQgICAgIAlAMjgwDQotCQkJCXN1cHBsaWVyICAgCUAyODkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NjIsIDU3MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjIsIDQwMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjkwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI5NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMTYsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDEzMDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTcwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJd2lkdGggICAgICAJNTg4DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUVDMDFDQiINCi0JCQkJY2xpZW50ICAgICAJQDI5NA0KLQkJCQlzdXBwbGllciAgIAlAMjgwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzk2LCAxMjk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc5NiwgODA1KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY5IiBAMjk2DQotCQkJCWxvY2F0aW9uICAgCSgyMzExLCAxNjg2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNzg5NkEyMDI2RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJlbnQiIEAyOTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjk2DQotCQkJCQlsb2NhdGlvbiAgIAkoMjc5LCAyOTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDIyLCAxMzMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhcmVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJCIg0KLQkJCQkJY2xpZW50ICAgICAJQDI5Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDI5NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzMTEsIDE2ODYpDQotCQkJCQkgICAgKDI0MzIsIDE2ODYpDQotCQkJCQkgICAgKDI0MzIsIDEzNzQpDQotCQkJCQkgICAgKDIzMTAsIDEzNzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTAsIDEzNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzY2LCAxNDI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjaGlsZHJlbiIgQDMwMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyOTYNCi0JCQkJCWxvY2F0aW9uICAgCSgyNzksIDI5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTksIDE1MzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2hpbGRyZW4iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTg1NjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkMiDQotCQkJCQljbGllbnQgICAgIAlAMjk2DQotCQkJCQlzdXBwbGllciAgIAlAMjk0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjMxMSwgMTY4NikNCi0JCQkJCSAgICAoMjAxNiwgMTY4NikNCi0JCQkJCSAgICAoMjAxNiwgMTQyNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNiwgMTQyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzAsIDE0ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyINCi0JCQlxdWlkICAgICAgIAkiM0FFOEVENzIwMUJEIg0KLQkJCXRpdGxlICAgICAgCSIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciDQotCQkJem9vbSAgICAgICAJOTANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiIEAzMDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjIsIDE3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW1wb3J0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTI3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiDQotCQkJCXdpZHRoICAgICAgCTU5OA0KLQkJCQloZWlnaHQgICAgIAkyMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSIgQDMwNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTEzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCAxMDQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk5hbWVzcGFjZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJCXdpZHRoICAgICAgCTQ3OQ0KLQkJCQloZWlnaHQgICAgIAkyMTUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMzA1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDExNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNjk0DQotCQkJCWhlaWdodCAgICAgCTE3Mw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDMwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0LCAyMzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTQ5MA0KLQkJCQloZWlnaHQgICAgIAkzMjANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDMiIEAzMDcNCi0JCQkJbG9jYXRpb24gICAJKDMwOSwgNzg2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzRDU1MDAyRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTmFtZXNwYWNlcyIgQDMwOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDcNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2MSwgOTU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VOYW1lc3BhY2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk4ODQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzMyIg0KLQkJCQkJY2xpZW50ICAgICAJQDMwNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMwNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDEwMjkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDgsIDk3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2ODcwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDkxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNTA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDQiIEAzMTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMzA3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNjgsIDU5MikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRDU2MDMyOCINCi0JCQkJCWNsaWVudCAgICAgCUAzMDcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMDYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCA1NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzksIDU4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NDk2MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMzE1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgNzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjU1LCA1ODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJd2lkdGggICAgICAJNDUyDQotCQkJCWhlaWdodCAgICAgCTMwNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NyIgQDMxNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NiwgMTAwMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDQzAyRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVNjaGVtYSIgQDMxNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MTAsIC0xMDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxMDE4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyNzAiDQotCQkJCQljbGllbnQgICAgIAlAMzE2DQotCQkJCQlzdXBwbGllciAgIAlAMzA1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ4NiwgMTAwMSkNCi0JCQkJCSAgICAoMTYzMiwgMTAwMSkNCi0JCQkJCSAgICAoMTYzMiwgMTEzMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMiwgMTEzMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjMsIDEwMTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMzIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDMxNg0KLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyN0EiDQotCQkJCQljbGllbnQgICAgIAlAMzE2DQotCQkJCQlzdXBwbGllciAgIAlAMzE1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NiwgODcyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDUiIEAzMjENCi0JCQkJbG9jYXRpb24gICAJKDEwODcsIDQwMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQTAwMkQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDYiIEAzMjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMzIxDQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNiwgNDgwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUYyIg0KLQkJCQkJY2xpZW50ICAgICAJQDMyMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDMxNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODcsIDQwMykNCi0JCQkJCSAgICAoMTM2NCwgNDAzKQ0KLQkJCQkJICAgICgxMzY0LCA1NjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NCwgNTY4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVEZWZpbml0aW9uIiBAMzI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDMyMQ0KLQkJCQkJbG9jYXRpb24gICAJKDY4NywgLTEyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNSwgMzYzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3NTMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRTgiDQotCQkJCQljbGllbnQgICAgIAlAMzIxDQotCQkJCQlzdXBwbGllciAgIAlAMzA2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDUsIDQwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNDU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE0OTEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYzIiBAMzI3DQotCQkJCWxvY2F0aW9uICAgCSg3MzcsIDgyNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjQiIEAzMjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzI3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUyLCA2NDcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkJCQljbGllbnQgICAgIAlAMzI3DQotCQkJCQlzdXBwbGllciAgIAlAMzA2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzM3LCA4MjYpDQotCQkJCQkgICAgKDUxMCwgODI2KQ0KLQkJCQkJICAgICg1MTAsIDU0NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNTQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDU3LCA1OTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMzMxDQotCQkJCQlQYXJlbnRfVmlldyAJQDMyNw0KLQkJCQkJbG9jYXRpb24gICAJKC02NzEsIDEwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDQsIDc3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5OTE4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDMyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMxNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ2LCA4MjYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTgwLCA4NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzIyMTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2MiwgOTMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDBEMDM0MCINCi0JCQkJY2xpZW50ICAgICAJQDMxNQ0KLQkJCQlzdXBwbGllciAgIAlAMzAzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTU1LCA1NjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCAzMzMpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMiBUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0I4NUFFNTkwMzdFIg0KLQkJCXRpdGxlICAgICAgCSIyLjIgVHlwZXMiDQotCQkJem9vbSAgICAgICAJOTANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTgxDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMzM2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMTIzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OTUsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDANCi0JCQkJaGVpZ2h0ICAgICAJMTc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDMzNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxNjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDYsIDE1MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDc4DQotCQkJCWhlaWdodCAgICAgCTE2Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDMzOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE5NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDE4MjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTE3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDE4ODMpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk1DQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpDQotCQkJCXdpZHRoICAgICAgCTUzNQ0KLQkJCQloZWlnaHQgICAgIAkzMDUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAzMzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTA2NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4LCAxMTIyKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0KQ0KLQkJCQl3aWR0aCAgICAgIAk0NjYNCi0JCQkJaGVpZ2h0ICAgICAJMjU4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMzQwDQotCQkJCWxvY2F0aW9uICAgCSg3MzUsIDExNzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMEM0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBAMzQxDQotCQkJCQlQYXJlbnRfVmlldyAJQDM0MA0KLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc1LCAxMTMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5MDA2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMjciDQotCQkJCQljbGllbnQgICAgIAlAMzQwDQotCQkJCQlzdXBwbGllciAgIAlAMzM2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODYsIDExNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzksIDEyMDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODg3MDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMzQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDM0MA0KLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDMzMSINCi0JCQkJCWNsaWVudCAgICAgCUAzNDANCi0JCQkJCXN1cHBsaWVyICAgCUAzMzkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4NSwgMTE3MikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU1IiBAMzQ1DQotCQkJCWxvY2F0aW9uICAgCSg1MjcsIDE1OTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTIwM0IyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVsZW1lbnREZWNsYXJhdGlvbiIgQDM0Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjYsIDE1NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzc1Mzk0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMUMiDQotCQkJCQljbGllbnQgICAgIAlAMzQ1DQotCQkJCQlzdXBwbGllciAgIAlAMzM3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUyNywgMTU5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTcsIDE1OTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDcsIDE2NDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTU4NzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU2IiBAMzQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDM0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMjYiDQotCQkJCQljbGllbnQgICAgIAlAMzQ1DQotCQkJCQlzdXBwbGllciAgIAlAMzM5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNTI3LCAxNTkyKQ0KLQkJCQkJICAgICg0MzcsIDE1OTIpDQotCQkJCQkgICAgKDQzNywgMTMxMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUyNywgMTU5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDEzMTMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MSIgQDM1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAxOTExKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDNDY4MjkzMDNFNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDM1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzgsIDE4NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDg1NjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDEwRSINCi0JCQkJCWNsaWVudCAgICAgCUAzNTANCi0JCQkJCXN1cHBsaWVyICAgCUAzMzgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE5MTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDMsIDE5NjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYyIiBAMzU0DQotCQkJCQlQYXJlbnRfVmlldyAJQDM1MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xNCwgMTE5MSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMTgiDQotCQkJCQljbGllbnQgICAgIAlAMzUwDQotCQkJCQlzdXBwbGllciAgIAlAMzM5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzIyLCAxOTExKQ0KLQkJCQkJICAgICgyMjksIDE5MTEpDQotCQkJCQkgICAgKDIyOSwgMTMxMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjksIDEzMTMpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAzNTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDYwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzU1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA1MTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDU2NykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTMxMikNCi0JCQkJd2lkdGggICAgICAJMzg5DQotCQkJCWhlaWdodCAgICAgCTIxNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDM1Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTIyMg0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTkiIEAzNTcNCi0JCQkJbG9jYXRpb24gICAJKDIzNCwgNjA0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAzNTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzU3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCA2NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA3DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVR5cGVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjYxMDE3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiDQotCQkJCQljbGllbnQgICAgIAlAMzU3DQotCQkJCQlzdXBwbGllciAgIAlAMzU1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwNiwgNjA0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM4ODMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYwIiBAMzYxDQotCQkJCQlQYXJlbnRfVmlldyAJQDM1Nw0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMywgMzEzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCQljbGllbnQgICAgIAlAMzU3DQotCQkJCQlzdXBwbGllciAgIAlAMzU2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0LCA2MDQpDQotCQkJCQkgICAgKDE3NCwgNjA0KQ0KLQkJCQkJICAgICgxNzQsIDIyNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMjI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4LCAyNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTc3MjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyIgQDM2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAyMDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVR5cGVzIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAxNTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCINCi0JCQkJd2lkdGggICAgICAJMjQ4DQotCQkJCWhlaWdodCAgICAgCTE2Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzNjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTksIDc1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MzkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiDQotCQkJCXdpZHRoICAgICAgCTc1Nw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMzY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDEyMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjksIDExMDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNjczDQotCQkJCWhlaWdodCAgICAgCTI1MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NSIgQDM2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNiwgOTc1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ1MDBGMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NiIgQDM2OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNjcNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0QiDQotCQkJCQljbGllbnQgICAgIAlAMzY3DQotCQkJCQlzdXBwbGllciAgIAlAMzY1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCA4NTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzc0LCA5MDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTY0ODkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDM3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNjcNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDYsIDEwMzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA3NTc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNFIg0KLQkJCQkJY2xpZW50ICAgICAJQDM2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDM2Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgMTA5MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODgsIDEwNTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTE1MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNzMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0QzQjAzODAiDQotCQkJCWNsaWVudCAgICAgCUAzNTUNCi0JCQkJc3VwcGxpZXIgICAJQDM2NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzA1LCA1MDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDUsIDMwNykpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAzNzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAyMjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE1LCAxMzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTUsIDE4NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMSkNCi0JCQkJd2lkdGggICAgICAJNTAwDQotCQkJCWhlaWdodCAgICAgCTIxMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM3NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSINCi0JCQkJY2xpZW50ICAgICAJQDM1NQ0KLQkJCQlzdXBwbGllciAgIAlAMzc0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTQsIDUwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NCwgMzMwKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDM3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA0NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTAsIDM2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTAsIDQyMykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NSkNCi0JCQkJd2lkdGggICAgICAJNjg3DQotCQkJCWhlaWdodCAgICAgCTIxNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDM3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwNiwgNDkzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOCIgQDM3OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTM2LCAzODYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJCQljbGllbnQgICAgIAlAMzc3DQotCQkJCQlzdXBwbGllciAgIAlAMzc0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIwNiwgNDkzKQ0KLQkJCQkJICAgICgxMDk0LCA0OTMpDQotCQkJCQkgICAgKDEwOTQsIDMzMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAzMzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAzNzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjgzMjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAzODENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzc3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NiwgNDU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDM5NzExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJCQljbGllbnQgICAgIAlAMzc3DQotCQkJCQlzdXBwbGllciAgIAlAMzc2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDgxLCA0OTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE1LCA1NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjQ5NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzg0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5NiwgMzkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk0OTE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM4NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MjdGMDBCNyINCi0JCQkJY2xpZW50ICAgICAJQDM2NQ0KLQkJCQlzdXBwbGllciAgIAlAMzc2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODEyLCA3NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCA1NzIpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMyBNZXNzYWdlcyINCi0JCQlxdWlkICAgICAgIAkiM0JDRTg1M0QwMkM4Ig0KLQkJCXRpdGxlICAgICAgCSIyLjMgTWVzc2FnZXMiDQotCQkJem9vbSAgICAgICAJODUNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIiBAMzg2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDEyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTWVzc2FnZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgNzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCAxODApDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAkzODEpDQotCQkJCXdpZHRoICAgICAgCTM4MA0KLQkJCQloZWlnaHQgICAgIAkzMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IiBAMzg3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCAxMjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTk5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBhcnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCA3NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTk5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5M0YwMUJFIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCAxODIpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDMpDQotCQkJCXdpZHRoICAgICAgCTYxNw0KLQkJCQloZWlnaHQgICAgIAkzMjQNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMzg4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgODE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCA2OTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDc0OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4NCkNCi0JCQkJd2lkdGggICAgICAJNDkyDQotCQkJCWhlaWdodCAgICAgCTI3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM4OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOTZEMDJGMSINCi0JCQkJY2xpZW50ICAgICAJQDM4OA0KLQkJCQlzdXBwbGllciAgIAlAMzg3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzA0LCA2NzgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA0LCAzODYpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzOTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDY1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCA1MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgNTY1KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQ0KLQkJCQl3aWR0aCAgICAgIAk0MzINCi0JCQkJaGVpZ2h0ICAgICAJMzIyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzkxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4RDEwMkJBIg0KLQkJCQljbGllbnQgICAgIAlAMzkwDQotCQkJCXN1cHBsaWVyICAgCUAzODYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NSwgNDk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCAzODgpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDM5Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA5NTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJ0cyIgQDM5Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzOTINCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzkzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgODk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJ0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NzQ1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkYwMDYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDM5Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDM4OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDk1MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEwMDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODk4MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzk2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxMDYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQyMDM4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOCIgQDM5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzOTINCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwNCwgODkzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNTciDQotCQkJCQljbGllbnQgICAgIAlAMzkyDQotCQkJCQlzdXBwbGllciAgIAlAMzkwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjg4LCA5NTIpDQotCQkJCQkgICAgKDQ0NSwgOTUyKQ0KLQkJCQkJICAgICg0NDUsIDgxNykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgODE3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzk5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzkzLCA5MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDc2MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKSkpKSkNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInhzZCINCi0JCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJYU0QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkib3JnLmVjbGlwc2UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkieHNkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHNkLzIwMDIvWFNEIikpDQotCQlxdWlkICAgICAgIAkiMzlBQkRDNkYwMUFBIg0KLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQW5ub3RhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0RTIwMzY2Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXBwbGljYXRpb25JbmZvcm1hdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RUJGMDJDOCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlckluZm9ybWF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFRUEwMTU3Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdGMDUwMUUyIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUF0dHIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2MTAzQkUiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjUyMDJCNCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ4RTIwMEVBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDAzQTAyMjEiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRUIwMkE4Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM4MDBEMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODdGN0IwMzg2Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2UiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjcyRDczNzAzOEYiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ3QkIwMzQ5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNDRjMwMjdEIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNEREIwM0I3Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNERTAwMkQ4Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMDIyMDM4MiINCi0JCQkJdHlwZSAgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzE5RDkwMzQxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREJvdW5kZWRGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1MUQwMzQ0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjNDMDIyNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzUyQTAwQ0MiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5RmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0RjAxMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1NkMwMTUzIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ2FyZGluYWxpdHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4QjgwMjg2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJBQTIwMzEwIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVyaXZhdGlvbk1ldGhvZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNkU0MDIwRSINCi0JCQkJdHlwZSAgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiDQotCQkJCWluaXR2ICAgICAgCSJyZXN0cmljdGlvbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MUQwMjZBIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBsZXhGaW5hbCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MzgwMEM1Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0E0MjAyQjgiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0I4QTAzRTYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjYxODAxNEQiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRkI5NzAwNkUiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMzFBRjVFMDNBNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTkwM0QyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRERCNTAxQTUiDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzgwMDM5NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpYyINCi0JCQlxdWlkICAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNENEMwRjRDMDFBMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldmVyaXR5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY5MUMwMDVEIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlhZ25vc3RpY1NldmVyaXR5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU1RkREMDI4MCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NDMwMTZCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGluZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MDdFMDIxMyINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2x1bW4iDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjExRTAyOTYiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWluaXR2ICAgICAgCSIxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm9kZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMDE2QjZCMDIwMCINCi0JCQkJdHlwZSAgICAgICAJIkRPTU5vZGUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbm5vdGF0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NEYwMTg2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjE3MDAyRSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjYwMzM5Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5pbGxhYmxlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGQjQwMjlGIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0NjgwMzY4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0QTAwM0I5Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0RTAwMDBFIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMTRDMDBCMiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNjgwMUMxIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUY2MjAzQ0YiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMzREQ0IwMDAxOCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERW51bWVyYXRpb25GYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzlEMDNDNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QzY0MDA1NCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyNTY4MDI1OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzM3NDAyNTMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWNldE5hbWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RkI0MDFFQyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVmZmVjdGl2ZVZhbHVlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUFFMzAzQjYiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERmVhdHVyZSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODEwMjBGIg0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODgwMEM1Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZvcm0iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTAyQjAzM0UiDQotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzFBMUIwMTZGIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZ2xvYmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTAwNzAzNzIiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmVhdHVyZVJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwNDQwMTg1Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERml4ZWRGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5OUUwMEMxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Qzg4MDFCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZBNjAwMjAxIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qjk5MDAxNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlEMjAwOEEiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnVuZGFtZW50YWxGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5RTgwMUQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzdCMDM5NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QUEzMDI0MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkZW50aXR5Q29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQxQzcwMTQzIg0KLQkJCQl0eXBlICAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESW1wb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RDkwMDNFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQjE1MDM2QyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbmNsdWRlIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEM3RDAyNTAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4REMwMzgxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiDQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETGVuZ3RoRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc4MDAyREYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3NkMwMDRCIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg5NjAwQzIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOEUwMzA5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFEMzEwM0FEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUUyMDFGNyINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE3NDAyN0QiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhjbHVzaXZlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE5MzAzNTQiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhJbmNsdXNpdmVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjgzMDNCOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhMZW5ndGhGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjdEMDBGQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdEQTAwRjMiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRXhjbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1OTAyODEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQyNDAwOTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRDEwMzk4Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUEyMDA4RSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUJFMDNFMiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTIwMzUzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkxlbmd0aEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3QzQwMEMwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Nzk5MDE1RSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBNjQwMjc5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21wb3NpdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGMUQwMUNGIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcG9zaXRvciINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkUyMDM4MSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI1NTAzODUiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUY2MDJFOCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZWRDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzAwMDE0MiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzA0MDMxRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzTmFtZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1N0YwMTI3Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidVJJIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU4NzAwRTIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGlhc1VSSSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1QUEwMkFGIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwOTYzMDI1RSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETm90YXRpb25EZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OTQzMDJGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU0RjAyM0MiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSWRlbnRpZmllciINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzJFMDBGMCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lkZW50aWZpZXIiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDMzNDAzOTciDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETnVtZXJpY0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NDIwMDc0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NUEzMDAxMiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNET3JkZXJlZEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NTkwMTJDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NEY2MDJEQSINCi0JCQkJdHlwZSAgICAgICAJIlhTRE9yZGVyZWQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhGQzAxRTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWluT2NjdXJzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOEUwM0IyIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1heE9jY3VycyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjk5MDNBRSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3ODBCRDkwMDU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXR0ZXJuRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkNBNTAzOEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0M3OTAzMTEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0QkEwMjNDIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTY4MDAyMTYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJCMzAxRDUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmUiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2QUE2MDMxQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4RjAwMkUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYSINCi0JCQlxdWlkICAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0RTUwM0REIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg2OEVDMDIyNiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5QkZGMDE4MCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUZvcm1EZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNEIwMTAyIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSINCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudEZvcm1EZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNzgwMEFDIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSINCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWxEZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEM0QTcwMDM4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2tEZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY1OUQwMkQ4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNEMjJENkQ4MDM1NiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb21wb3NpdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEU2MDM3MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOUIzMDMzMCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NvcGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NUY1NTAzMkIiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YXJpZXR5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzMxNTgwMEE5Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEVmFyaWV0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU0NEYwMTQ2Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2NUUwMzVBIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsaWRGYWNldHMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUIwRjAwQjYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRlcm0iDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhBQTAxRDMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjQ0MDA2OSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVG90YWxEaWdpdHNGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjYxMDMzNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlBQjAyMzIiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVHlwZURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJGNTAxM0EiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg2MjAwNDUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc4NTAwMjAxIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEV2hpdGVTcGFjZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaWxkY2FyZCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTNBMDA0MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQwRTkwMTlFIg0KLQkJCQl0eXBlICAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDRjg2MDIyMyINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9jZXNzQ29udGVudHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDEyRTAxRTQiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCREI3MDFGOSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDg0RjcwMDkyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOTAxNTAzREUiDQotCQkJCXR5cGUgICAgICAgCSJYU0RYUGF0aFZhcmlldHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCN0JCQkUxMDFCMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01BdHRyIg0KLQkJCXF1aWQgICAgICAgCSIzQkJGOEM4OTAxQjYiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkF0dHIiDQotCQkJCXF1aWQgICAgICAgCSIzQkJGOENCMDAwRDUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDMjc4NTBFMDM4MSINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODUxQjAzQzYiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4MTg5NzkwMjAwIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4MTg5REIwMzc0Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTU5vZGUiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2NEE1MDExNyINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uTm9kZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NUJGMDAyRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJWYWx1ZSINCi0JCQlxdWlkICAgICAgIAkiM0MwNDBCNUIwMzFGIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLmxhbmcuT2JqZWN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MwNDBCOEQwM0Q1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkE3QjBFODAxQTgiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wdGlvbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMTUwMkI3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTIyMDJEMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjkwMkYwIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1RDAwOUIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbml0ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MURDMDJFRCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvdW50YWJseUluZmluaXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxRUMwMTQxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhGaW5hbCINCi0JCQlxdWlkICAgICAgIAkiM0I5N0MyQ0EwMUNCIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFNzAwREEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkVBMDE2QSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNkQyMDExMiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb3NpdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQjg2OUI2MjAwMzciDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5QkQwMDAwMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNob2ljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5Q0I4MDExRSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcXVlbmNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDRTUwMDU3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbnQiDQotCQkJcXVpZCAgICAgICAJIjNCODY5RTI2MDFBRSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5RThFMDI1OCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOTkwMjcxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCODZBNzlGMDNBMiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW1wdHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdDRDAyRjAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaW1wbGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMTAwQ0UiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QzMDFCNyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRPbmx5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDcwMkU5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERlcml2YXRpb25NZXRob2QiDQotCQkJcXVpZCAgICAgICAJIjNCODZBMEIwMDBDRSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkEwQzgwMzI5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDQzAxNjIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpY1NldmVyaXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjhBNzAzMkYiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhdGFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4QzMwM0QwIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXJyb3IiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFNzAwRTMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3YXJuaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4RUEwMUZGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5mb3JtYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQkZFN0ZDMjAxOUEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNUE0MDNERiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NzkwMDQ1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2N0YwMUFDIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4MzAyMEIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI0NTAwNjkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERm9ybSINCi0JCQlxdWlkICAgICAgIAkiM0I5RjkxM0IwMUVCIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxdWFsaWZpZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTE2RjAwMjMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bnF1YWxpZmllZCINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MThDMDA3RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQlxdWlkICAgICAgIAkiM0I4NkExRTAwMjcyIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMjAwODUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXlyZWYiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMzAxNEYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlxdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxNjAzNjUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzVFQTAwMjMiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFueSINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYwMDAzNCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYyMDA1RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDY1MDExNyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkIg0KLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1MjAyRTQiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhbHNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQTkwMjcxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFydGlhbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUJCMDFGRiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRvdGFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQzQwMUIyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2Nlc3NDb250ZW50cyINCi0JCQlxdWlkICAgICAgIAkiM0I4RkY4QzcwMjg0Ig0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHJpY3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGODAwNDUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXgiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGNjAzOEIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJza2lwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RTgwMkJBIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzVCRTAyNzIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjhCMDBCOCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OTQwMjkxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNTAwMjk1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZUZpbmFsIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4MTAyMzAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgzMDEzOCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODgwMjRFIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RTAwMzc0Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1OTEwMEFFIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY2NDAyMzEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjZEMDIxNiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RWYXJpZXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhGRjc3MzAyNDkiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0b21pYyINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0E3MDJERiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRDAxMzkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FGMDM5RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQkVFRDBGNjAzNDIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByZXNlcnZlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMEYwMTE3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVwbGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTI3MDM0RCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbGxhcHNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjkwMzk2Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoVmFyaWV0eSINCi0JCQlxdWlkICAgICAgIAkiM0I4RkZCODkwMzNBIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZWxlY3RvciINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGQkFDMDE5MiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpZWxkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQjMwMjc4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDcwIg0KLQkJCXF1aWQgICAgICAgCSIzQzYyNkVBNzAxMDIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzEiDQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVBOTAxOTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzIiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQURDMDJGNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDIzOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REFERDAyNDIiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDA2RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDMwRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzE4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzYiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTZCMDJDQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTciDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzgiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MjZCMDE5NCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMwOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMxMyINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODAiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjA2MDI5MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjA3MDE3MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcyIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5NDA0RTAwNjciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyOUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyQTUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODQiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTlGMDA4NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzVBMDAwNkEiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NiINCi0JCQlxdWlkICAgICAgIAkiM0MyNzVEMzIwMjIwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc1RDNDMDEwRCINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4OCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODg3QkYwMTUwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTgiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTAiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MjVFMDFGOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA0NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDUwIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NTAxMEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NjAwRkEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQiINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5NCINCi0JCQlxdWlkICAgICAgIAkiM0I2RjFERTkwMThBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzZDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzODAiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjkwMDY4ODAxQzIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTciDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudEFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMUIiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50QW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNTAzNDAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwMCINCi0JCQlxdWlkICAgICAgIAkiM0I2RkRERDcwMTEzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwMSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI2QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RkREREEwMjc1Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzdERjAyNEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3RTEwMEZEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAwNkUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzQ5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVVzZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzOTU5MDM0QSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDYiDQotCQkJcXVpZCAgICAgICAJIjNCNjk4RTM2MDM4NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDciDQotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwNzIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlQ29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwN0MiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVDb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQTAxMjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTEiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEwIg0KLQkJCXF1aWQgICAgICAgCSIzQjc1MUIwODAzQzciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGFpbmVyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNFIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGFpbmVyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEyIg0KLQkJCXF1aWQgICAgICAgCSIzQjc1MUI0ODAyNjEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdENvbnRhaW5lciINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NSINCi0JCQkJbGFiZWwgICAgICAJInJvb3RDb250YWluZXIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExMyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTQiDQotCQkJcXVpZCAgICAgICAJIjNCNzUxQzMxMDM1NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzQiINCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwQTAwNjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEIwMjNGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyNDkiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OTExNDAxQUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE3Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAwNTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0JGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAzQzAiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzNFRjAxNjAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk5Ig0KLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjQiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MUU2MDI1MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAyRjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDMwQiINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjYiDQotCQkJcXVpZCAgICAgICAJIjNCNjlDMDU5MDE5OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjciDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRUQiDQotCQkJCWxhYmVsICAgICAgCSJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjgiDQotCQkJcXVpZCAgICAgICAJIjNDNDJEQkREMDI5NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjkiDQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3Vic3RpdHV0aW9uR3JvdXAiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDEyOCINCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzAiDQotCQkJcXVpZCAgICAgICAJIjNCNkQyM0I5MDFDRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzEiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDIzQkEwMUNFIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzMiINCi0JCQlxdWlkICAgICAgIAkiM0I2RDU5NzEwMkVBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDEwNSINCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5QjY1MzAxN0EiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAic2NvcGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjY1NDAwNkQiDQotCQkJCWxhYmVsICAgICAgCSJzY29wZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM1Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI5MDEwNjAyRDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRGZWF0dXJlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDBFIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRGZWF0dXJlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwMTBCMDAxOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzOCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMTgzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzOSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDMzQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDM0NiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDAiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEMjlFMDE0RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkS2V5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNjUiDQotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2VkS2V5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MiINCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEM0QwMDNFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIyQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2VsZWN0b3IiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRTAyMzQiDQotCQkJCWxhYmVsICAgICAgCSJzZWxlY3RvciINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAwMjUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMzY1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmaWVsZHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNzkiDQotCQkJCWxhYmVsICAgICAgCSJmaWVsZHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0NiINCi0JCQlxdWlkICAgICAgIAkiM0I2QURDRDgwMkZDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURDRDkwMThDIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0OCINCi0JCQlxdWlkICAgICAgIAkiM0I2QURDQzUwMDdFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbmNsdWRlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QyINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTAiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjE3MDJDOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxODAzRTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxOTAwMDQiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCMTAyRjgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDFCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAyNSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM2MDYwMjZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicGFydGljbGVzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNzAyMjIiDQotCQkJCWxhYmVsICAgICAgCSJwYXJ0aWNsZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNTAwOEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMDk2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDBBMCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTgiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzN0FDMDI1QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3QUQwMzM5Ig0KLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2MCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNDUwMzk4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM4QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM5RSINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRjAyMTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEM5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEQzIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQ3MTUwMTE5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0NzFBMDNBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQjUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjYiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQzg5MDEyMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjciDQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0ZXJtIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTEiDQotCQkJCWxhYmVsICAgICAgCSJ0ZXJtIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBREU0MjAwOUEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURFNDMwMkZFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDMwOCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcwIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNDAwNTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTcxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQjciDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QjAwM0QiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTczIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTA3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTExIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzQiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRThEMDFCRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkZERkEwMEMzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZURlY2xhcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MjAyMTYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QyINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODAiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDA0OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzNzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzN0UiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFRkYwMjRGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI1QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI2NCINCi0JCQkJbGFiZWwgICAgICAJIm1vZGVsR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg0Ig0KLQkJCXF1aWQgICAgICAgCSIzQkZDMkExNzAxRUQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JGQzJBMUEwMjczIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyN0QiDQotCQkJCWxhYmVsICAgICAgCSJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4NiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFQTcwMjNFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJub3RhdGlvbkRlY2xhcmF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhCIg0KLQkJCQlsYWJlbCAgICAgIAkibm90YXRpb25EZWNsYXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NjAyOTAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTY1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNkYiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5MCINCi0JCQlxdWlkICAgICAgIAkiM0I2RDVDQTUwMTEyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0M4Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRDAzNzQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM1QUYwMDA2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRDb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAxMCINCi0JCQkJbGFiZWwgICAgICAJImZhY2V0Q29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk0Ig0KLQkJCXF1aWQgICAgICAgCSIzQkM4QUUwMjAzQTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JDOEFFMDYwMDUxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNjUiDQotCQkJCWxhYmVsICAgICAgCSJmYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzRCNzAyMDgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWVtYmVyVHlwZURlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTkiDQotCQkJCWxhYmVsICAgICAgCSJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzYzMjAxREIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZnVuZGFtZW50YWxGYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNjM1MDA2MyINCi0JCQkJbGFiZWwgICAgICAJImZ1bmRhbWVudGFsRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAwIg0KLQkJCXF1aWQgICAgICAgCSIzQjZEMzVBQjAyNzMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMzVCMjAyQTUiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZENTU3MjAxNkMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjJGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDI0MyINCi0JCQkJbGFiZWwgICAgICAJInByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNCINCi0JCQlxdWlkICAgICAgIAkiM0I2OUUyOTEwMTU4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMjkyMDE5RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxQTkiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjkwMDZDRjAwODgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTVEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZGVyaXZhdGlvbkFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDZEMTAxNjciDQotCQkJCWxhYmVsICAgICAgCSJkZXJpdmF0aW9uQW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwOCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMzMwMjY0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwOSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIzNDAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxMCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTEwMjZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxMSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDFGOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAyMDMiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEyIg0KLQkJCXF1aWQgICAgICAgCSIzQzYyNkVCMzAwMDUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUI0MDMzMiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE0Ig0KLQkJCXF1aWQgICAgICAgCSIzQkVCREM4NzAyNDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMkY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDMwMyINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTYiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2MjI3MDNDRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTciDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcG9uZW50cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyMkIwMDZDIg0KLQkJCQlsYWJlbCAgICAgIAkiY29tcG9uZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTgiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2MjY5MDE2NSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTkiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJkaWFnbm9zdGljcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjciDQotCQkJCWxhYmVsICAgICAgCSJkaWFnbm9zdGljcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyMCINCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0MzEwMzVGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyMSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbGxEaWFnbm9zdGljcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY0MzIwMUM3Ig0KLQkJCQlsYWJlbCAgICAgIAkiYWxsRGlhZ25vc3RpY3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjIiDQotCQkJcXVpZCAgICAgICAJIjNDMjFEQ0M3MDBFQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjMiDQotCQkJCXF1aWQgICAgICAgCSIzQzIxRENDRTAwNDIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRTY2hlbWEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MyINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjQiDQotCQkJcXVpZCAgICAgICAJIjNDMjFERDBDMDNEQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjUiDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjYiDQotCQkJcXVpZCAgICAgICAJIjNDMjM5MTM0MDA0RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjciDQotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwQ0EiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBENCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjgiDQotCQkJcXVpZCAgICAgICAJIjNDMjVEM0E2MDEzMSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RDNBOTAzNzAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MSINCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jaW5nRGlyZWN0aXZlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUNGMDAwNUUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDFFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFZlcnNpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUNGNDAwMjgiDQotCQkJCWxhYmVsICAgICAgCSJyb290VmVyc2lvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUQwQjAxMUIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTIxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAib3JpZ2luYWxWZXJzaW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTJCIg0KLQkJCQlsYWJlbCAgICAgIAkib3JpZ2luYWxWZXJzaW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzQiDQotCQkJcXVpZCAgICAgICAJIjNDMjVFRUFCMDAxRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUVBRjAxMEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTE1Ig0KLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNiINCi0JCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMERFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIml0ZW1UeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMEUwIg0KLQkJCQlsYWJlbCAgICAgIAkiaXRlbVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzOCINCi0JCQlxdWlkICAgICAgIAkiM0MyNzg0NzMwMTk0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzOSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NDc1MDFGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYUZvclNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NDc1MDFGQiINCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYUZvclNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4ODBGNTAzRDkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODgwRjkwMDNDIg0KLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwNDYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MiINCi0JCQlxdWlkICAgICAgIAkiM0MyODgyQzUwMTM3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltYXJ5Q29tcG9uZW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTMiDQotCQkJCWxhYmVsICAgICAgCSJwcmltYXJ5Q29tcG9uZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEEwRjIwMUE0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRTUiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBNkRCMDFFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERCINCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDciDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTZERDAzREUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTcxMjAxMDgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNTEiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTVCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3NEIwMTc4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxN0IiDQotCQkJCWxhYmVsICAgICAgCSJzaW1wbGVUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxODUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTdFRDAzQzAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcGxleFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMTciDQotCQkJCWxhYmVsICAgICAgCSJjb21wbGV4VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3RjQwMTIxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE5OTQwMzBBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBERCINCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU1Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE5OTcwMEU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwODUwMjVCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDg2MDI3MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjdBIg0KLQkJCQlsYWJlbCAgICAgIAkibWluRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RDAyNTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDkxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOUIiDQotCQkJCWxhYmVsICAgICAgCSJtYXhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFCMDM5NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhJbmNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEFDMDNENCINCi0JCQkJbGFiZWwgICAgICAJIm1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUYwMzM4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEIwMDFGOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMjAzIg0KLQkJCQlsYWJlbCAgICAgIAkibWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMzAyMDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTkwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRXhjbHVzaXZlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOUEiDQotCQkJCWxhYmVsICAgICAgCSJtaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEI2MDI4RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjciDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhFeGNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI3MDIyMSINCi0JCQkJbGFiZWwgICAgICAJIm1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMDUxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2OSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDI0NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjUwIg0KLQkJCQlsYWJlbCAgICAgIAkibGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCRjAxOEMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjcxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDZCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAid2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDc1Ig0KLQkJCQlsYWJlbCAgICAgIAkid2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEMyMDIxRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlbnVtZXJhdGlvbkZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMzMDBBQyINCi0JCQkJbGFiZWwgICAgICAJImVudW1lcmF0aW9uRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNTAxNTkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEIwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicGF0dGVybkZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCQSINCi0JCQkJbGFiZWwgICAgICAJInBhdHRlcm5GYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzgwMkE3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM5MDFFQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNhcmRpbmFsaXR5RmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRjUiDQotCQkJCWxhYmVsICAgICAgCSJjYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQjAzOUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibnVtZXJpY0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QxIg0KLQkJCQlsYWJlbCAgICAgIAkibnVtZXJpY0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMENGMDE5OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEMjAwODUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhMZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4RiINCi0JCQkJbGFiZWwgICAgICAJIm1heExlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwRDUwMEM1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDI3Ig0KLQkJCQlsYWJlbCAgICAgIAkibWluTGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAwREUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0NEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidG90YWxEaWdpdHNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDNENyINCi0JCQkJbGFiZWwgICAgICAJInRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMERCMDM3NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODciDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzY0Ig0KLQkJCQlsYWJlbCAgICAgIAkiZnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwREYwMDQ4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4OSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNCOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm9yZGVyZWRGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNDMyINCi0JCQkJbGFiZWwgICAgICAJIm9yZGVyZWRGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBFMzAwRDkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzhFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYm91bmRlZEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzk4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYm91bmRlZEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ0MDFFQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NTAzNjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2QSINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1heEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI1NEYwMTQ1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM4QyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM5NiINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNDAxMUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjBEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNTAyMTciDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNjJBMDBBQSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxMzgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTQyIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI2QjAwM0E2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMiINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVBhdHRlcm5GYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQTAyNkIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTg2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCN0NCMDE5MCINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCODQwMDA2MiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDI3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI4OTgwMTZEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA1NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDYwIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAwNTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0I5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAzQzMiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVMZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCOTcwMDFEQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MTAwQ0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBEOSINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1pbkZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMiINCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0QUUwMUNDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMyINCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDEwRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY0ZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTFBIg0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxNCINCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0RDMwMjhFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxNSINCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNQYXJ0aWNsZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkZEIg0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljUGFydGljbGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzE2Ig0KLQkJCXF1aWQgICAgICAgCSIzRDRCQjREOTAxRjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzE3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjg0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTgiDQotCQkJcXVpZCAgICAgICAJIjNENEM2OEZGMDFCRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTkiDQotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljV2lsZGNhcmQiDQotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTgiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ3NjgwMTM4Ig0KLQkJCXRpdGxlICAgICAgCSIxLiBDb21wb25lbnQgSGllcmFyY2h5IChQYXJ0IDE6IFN0cnVjdHVyZXMpIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA0MDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA0MDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCA1NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDAxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQwLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MDINCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMjI1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA0MDANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoOTI4LCAyMjUpDQotCQkJCSAgICAoOTI4LCAxMzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA0MDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzMjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MCwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MDQNCi0JCQkJbG9jYXRpb24gICAJKDEyMDMsIDcwNikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANDAxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEyMDMsIDcwNikNCi0JCQkJICAgICgxMjAzLCA2MTUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQwNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDU2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzIsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MDYNCi0JCQkJbG9jYXRpb24gICAJKDQ0NCwgNzA5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA0MDUNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDQ0LCA3MDkpDQotCQkJCSAgICAoNDQ0LCA2MTUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTU3MiwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA0MDMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTU3MiwgNDY1KQ0KLQkJCQkgICAgKDE1NzIsIDM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA0MDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI5MCwgNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA0MDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAxMDU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2MiwgMTAxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDQxMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTA0LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkzNiwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCAxMjAzKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA0MDkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDUzLCAxMjAzKQ0KLQkJCQkgICAgKDQ1MywgMTExMSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA0MTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDQxMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDgwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ2LCA3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgOTUwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA0MTMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTg3MiwgOTUwKQ0KLQkJCQkgICAgKDE4NzIsIDg1NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDE1DQotCQkJCWxvY2F0aW9uICAgCSgxODEsIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANDEyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE4MSwgNDY1KQ0KLQkJCQkgICAgKDE4MSwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDQxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcwLCAxMjMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNTUwDQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANDE3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDEwNTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzQsIDEwMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDQxOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTY5LCAxNDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANDE5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExODQsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkwMywgMTQ0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNTgxDQotCQkJCWhlaWdodCAgICAgCTExMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0MjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgNTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYyLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDQyMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzgsIDEwMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDIyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDU2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNiwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDEyOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNiwgMTI1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDQyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDU2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjAsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA0MjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTI4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAyLCAxMjM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDMwLCAxNDQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTY5NA0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDQyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjYsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJMzE4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANDI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA4LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNDAyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSINCi0JCQkJY2xpZW50ICAgICAJQDQxMA0KLQkJCQlzdXBwbGllciAgIAlANDAwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk0LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBANDMwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTYwLCA4MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQzMQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTYyLCA5NDcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDQzMA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg5NjIsIDk0NykNCi0JCQkJICAgICg5NjIsIDg1NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzINCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDMzDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOCwgMTE1NCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzUzNA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjkNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiDQotCQkJCWNsaWVudCAgICAgCUA0MjMNCi0JCQkJc3VwcGxpZXIgICAJQDQwNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5LCAxMjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5LCA3MDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwNikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlANDIzDQotCQkJCXN1cHBsaWVyICAgCUA0MDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI1NiwgMTI0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NiwgMTIwMykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDExKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCWNsaWVudCAgICAgCUA0MjQNCi0JCQkJc3VwcGxpZXIgICAJQDQxMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg0LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiDQotCQkJCWNsaWVudCAgICAgCUA0MjINCi0JCQkJc3VwcGxpZXIgICAJQDQwMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAwMiwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAwMiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyINCi0JCQkJY2xpZW50ICAgICAJQDQwMw0KLQkJCQlzdXBwbGllciAgIAlANDAwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY5LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY5LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQljbGllbnQgICAgIAlANDIwDQotCQkJCXN1cHBsaWVyICAgCUA0MDMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTAsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciDQotCQkJCWNsaWVudCAgICAgCUA0MDgNCi0JCQkJc3VwcGxpZXIgICAJQDQwNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTEwLCA3NDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDcwOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUA0MjUNCi0JCQkJc3VwcGxpZXIgICAJQDQzMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyMSwgMTIyNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjEsIDk0NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDMxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDENCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDQyDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzcsIDg4NikNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxNTgxMg0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjQNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiDQotCQkJCWNsaWVudCAgICAgCUA0MTcNCi0JCQkJc3VwcGxpZXIgICAJQDQwMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwMCwgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUA0MTcNCi0JCQkJc3VwcGxpZXIgICAJQDQxMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5MywgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDk1MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCWNsaWVudCAgICAgCUA0MDkNCi0JCQkJc3VwcGxpZXIgICAJQDQzMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDUwLCAxMDAxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCA5NDcpDQotCQkJCWRyYXdTdXBwbGllciAJQDQzMSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIg0KLQkJCQljbGllbnQgICAgIAlANDEyDQotCQkJCXN1cHBsaWVyICAgCUA0MDANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDg0RjcwMDkyIg0KLQkJCQljbGllbnQgICAgIAlANDI4DQotCQkJCXN1cHBsaWVyICAgCUA0MDANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMTIsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTIsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhCODAyODYiDQotCQkJCWNsaWVudCAgICAgCUA0MDUNCi0JCQkJc3VwcGxpZXIgICAJQDQwMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM0LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MzQsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCWNsaWVudCAgICAgCUA0MDENCi0JCQkJc3VwcGxpZXIgICAJQDQwMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MCwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1MCwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJY2xpZW50ICAgICAJQDQyNw0KLQkJCQlzdXBwbGllciAgIAlANDAwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzIsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3MiwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJY2xpZW50ICAgICAJQDQxNg0KLQkJCQlzdXBwbGllciAgIAlANDEzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkzLCAxMjIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MywgOTUwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiINCi0JCQkJY2xpZW50ICAgICAJQDQxOA0KLQkJCQlzdXBwbGllciAgIAlANDAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCAxNDMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU5MCwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSINCi0JCQkJY2xpZW50ICAgICAJQDQxOQ0KLQkJCQlzdXBwbGllciAgIAlANDAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMxLCAxNDMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMSwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDQzMA0KLQkJCQlzdXBwbGllciAgIAlANDAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTksIDc0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDQxMw0KLQkJCQlzdXBwbGllciAgIAlANDAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODcyLCA3NDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODcyLCA3MDYpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDU1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlANDIxDQotCQkJCXN1cHBsaWVyICAgCUA0MzANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MiwgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2MiwgOTQ3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MzEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1Ng0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTcNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUsIDEzODgpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDI1MzENCi0JCQkJICAgIGhlaWdodCAgICAgCTY3DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUJBQTIwMzEwIg0KLQkJCQljbGllbnQgICAgIAlANDI2DQotCQkJCXN1cHBsaWVyICAgCUA0MTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4LCAxNDI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUA0MjYNCi0JCQkJc3VwcGxpZXIgICAJQDQwOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjU2LCAxNDI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU2LCAxMjAzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTEpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJcXVpZCAgICAgICAJIjM3NEIxODE5MDAyOCINCi0JCQl0aXRsZSAgICAgIAkiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJem9vbSAgICAgICAJOTYNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA0NTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3ODQsIDE2MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDU5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcwLCAxNTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDQ2MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTYzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgMTU5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM0IiBANDYxDQotCQkJCWxvY2F0aW9uICAgCSg0OTQsIDE2MjcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTMwMTdBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjb3BlIiBANDYyDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ2MQ0KLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1NSwgMTU4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY29wZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3MTI1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZEIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ2MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ1OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDE2MjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYxLCAxNjI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDY0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxNjY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxMDE4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzUiIEA0NjUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDYxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlCNjU0MDA2RSINCi0JCQkJCWNsaWVudCAgICAgCUA0NjENCi0JCQkJCXN1cHBsaWVyICAgCUA0NjANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMyNywgMTYyNykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA0NjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE5MiwgMTIzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDg0LCAxMTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDQ2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTc2LCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTEsIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI2OA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2NiIgQDQ2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjIyOSwgMTExMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4OTAxMjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY3IiBANDY5DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ2OA0KLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTAiDQotCQkJCQljbGllbnQgICAgIAlANDY4DQotCQkJCQlzdXBwbGllciAgIAlANDY3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMjksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0ZXJtIiBANDcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ2OA0KLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNTcsIDExMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdGVybSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzNDMyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDOEEwMTExIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDExNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjc0LCAxMTE5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTE5NDAzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQ3Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAxMjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJd2lkdGggICAgICAJNTIyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDQ3NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzcsIDcyNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJMzUyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU0IiBANDc1DQotCQkJCWxvY2F0aW9uICAgCSgyMjE5LCA4ODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDYwMjZGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NSIgQDQ3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMSINCi0JCQkJCWNsaWVudCAgICAgCUA0NzUNCi0JCQkJCXN1cHBsaWVyICAgCUA0NzQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxOSwgODgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDgyMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0aWNsZXMiIEA0NzcNCi0JCQkJCVBhcmVudF9WaWV3IAlANDc1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1NywgLTI0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDUsIDg4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0aWNsZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNzAyMjIiDQotCQkJCQljbGllbnQgICAgIAlANDc1DQotCQkJCQlzdXBwbGllciAgIAlANDY3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA5MzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgxLCA4ODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0ODANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjM5LCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTINCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA0ODENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTA1LCAxMzgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1Mg0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANDgyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMCIgQDQ4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNTkwLCAxMTQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDEiIEA0ODQNCi0JCQkJCVBhcmVudF9WaWV3IAlANDgzDQotCQkJCQlsb2NhdGlvbiAgIAkoMzAyLCAxNDgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDU5MCwgMTE0MCkNCi0JCQkJCSAgICAoNTQwLCAxMTQwKQ0KLQkJCQkJICAgICg1NDAsIDEwNDUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQwLCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDQ4NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODMNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDg1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0MywgMTE3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4wNTM1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDJBNSINCi0JCQkJCWNsaWVudCAgICAgCUA0ODMNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg1OTAsIDExNDApDQotCQkJCQkgICAgKDY0MSwgMTE0MCkNCi0JCQkJCSAgICAoNjQxLCAxMDQ1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY0MSwgMTA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDg1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4NCwgMTA5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xMjI0NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANDg4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDg4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQ0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAyIiBANDg5DQotCQkJCWxvY2F0aW9uICAgCSgxMTE5LCAxMTEyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0RGMDI0RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDMiIEA0OTANCi0JCQkJCVBhcmVudF9WaWV3IAlANDg5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1NjksIC04KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0UxMDBGRCINCi0JCQkJCWNsaWVudCAgICAgCUA0ODkNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRUeXBlIiBANDkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTksIDExMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudFR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkUiDQotCQkJCQljbGllbnQgICAgIAlANDg5DQotCQkJCQlzdXBwbGllciAgIAlANDczDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTE3OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNjMsIDExMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA4IiBANDk0DQotCQkJCWxvY2F0aW9uICAgCSgxNDU1LCA5ODIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkEwMTI2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwOSIgQDQ5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTQNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTksIC01NzApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4MCwgOTgyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkIiBANDk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NA0KLQkJCQkJbG9jYXRpb24gICAJKDE1OSwgLTU3MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDUsIDkyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjI4NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MSINCi0JCQkJCWNsaWVudCAgICAgCUA0OTQNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NSwgOTgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzAsIDk4MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTAsIDEwMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NDI4NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA0IiBANDk5DQotCQkJCWxvY2F0aW9uICAgCSg5MjEsIDEyMDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMDZFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwNSIgQDUwMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0OSINCi0JCQkJCWNsaWVudCAgICAgCUA0OTkNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyMSwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANTAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ5OQ0KLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzgsIDEyNTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTkzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0QSINCi0JCQkJCWNsaWVudCAgICAgCUA0OTkNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyMSwgMTM3MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3OSwgMTI1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4ODM0NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA1MDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA3NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMjIsIDcyNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA1MDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTYzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTA1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMywgMTU5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA1MDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgNDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODAzLCA0MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTgiIEA1MDcNCi0JCQkJbG9jYXRpb24gICAJKDIyMTYsIDYwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU5IiBANTA4DQotCQkJCQlQYXJlbnRfVmlldyAJQDUwNw0KLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUwNw0KLQkJCQkJc3VwcGxpZXIgICAJQDUwNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxNiwgNTAxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEA1MDkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTA3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDYyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyNjA5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUwNw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxNiwgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NiwgNjMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjMzNjQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDUxMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjE5LCAxMzgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg4IiBANTEzDQotCQkJCWxvY2F0aW9uICAgCSgxNjc2LCAxMjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4N0JGMDE1MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4OSIgQDUxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTMNCi0JCQkJCWxvY2F0aW9uICAgCSg0MTIsIC0zNDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QzAwMEE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDUxMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEzNzEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmQiIEA1MTUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTEzDQotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NywgMTEwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYyNTc2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBOCINCi0JCQkJCWNsaWVudCAgICAgCUA1MTMNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY3NiwgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc2LCAxMDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOCwgMTEwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxOTYzMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NCIgQDUxOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyOSwgMTQzOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU5RjAwODYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODUiIEA1MTkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTE4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNjkiDQotCQkJCQljbGllbnQgICAgIAlANTE4DQotCQkJCQlzdXBwbGllciAgIAlANTEyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMCwgMTQzOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANTIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDUxOA0KLQkJCQkJbG9jYXRpb24gICAJKC0zNjMsIC0xNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA1LCAxNTA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVVzZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzI1OTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNUEwMDA2QSINCi0JCQkJCWNsaWVudCAgICAgCUA1MTgNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ4LCAxNDM4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNywgMTM5MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU2MzUzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDUyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkyIiBANTI0DQotCQkJCWxvY2F0aW9uICAgCSg3NzcsIDE0MjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODUwMTBEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkzIiBANTI1DQotCQkJCQlQYXJlbnRfVmlldyAJQDUyNA0KLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDUyNA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzcsIDE0MjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk2LCAxNDI1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANTI2DQotCQkJCQlQYXJlbnRfVmlldyAJQDUyNA0KLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDE1MDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU5MjU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkIiDQotCQkJCQljbGllbnQgICAgIAlANTI0DQotCQkJCQlzdXBwbGllciAgIAlANTIzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTgsIDE0MjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjEsIDEzODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzI0NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzYiIEA1MjkNCi0JCQkJbG9jYXRpb24gICAJKDIzNywgMTIwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2QjAyQ0IiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzciIEA1MzANCi0JCQkJCVBhcmVudF9WaWV3IAlANTI5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNDMsIDcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTZEMDBBNiINCi0JCQkJCWNsaWVudCAgICAgCUA1MjkNCi0JCQkJCXN1cHBsaWVyICAgCUA1MjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTM3MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDUzMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODgsIDEyNDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjM5MjY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUyOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzcsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1LCAxMjQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDUzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDc4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgsIDc0MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk4IiBANTM1DQotCQkJCWxvY2F0aW9uICAgCSg3MjgsIDc3NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNTAzNDAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTkiIEA1MzYNCi0JCQkJCVBhcmVudF9WaWV3IAlANTM1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1NiwgLTU3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzM2MDI4RCINCi0JCQkJCWNsaWVudCAgICAgCUA1MzUNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3MjgsIDc3NSkNCi0JCQkJCSAgICAoNzg4LCA3NzUpDQotCQkJCQkgICAgKDc4OCwgOTM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg4LCA5MzkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANTM3DQotCQkJCQlQYXJlbnRfVmlldyAJQDUzNQ0KLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1OCwgODgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjE0MDk0MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzM2MDI4RSINCi0JCQkJCWNsaWVudCAgICAgCUA1MzUNCi0JCQkJCXN1cHBsaWVyICAgCUA1MzQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc5LCA3NzUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTAsIDgxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNTI0MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDU0MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTcsIDQwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJNjA4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQwIiBANTQxDQotCQkJCWxvY2F0aW9uICAgCSgxNjI5LCA1NzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyOUUwMTREIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jZWRLZXkiIEA1NDINCi0JCQkJCVBhcmVudF9WaWV3IAlANTQxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzLCA5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NjEsIDYwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2VkS2V5Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjc5NzI5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyQTgwMTY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU0MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU0MA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MjksIDU3NCkNCi0JCQkJCSAgICAoMTU1NSwgNTc0KQ0KLQkJCQkJICAgICgxNTU1LCA1MDEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1NSwgNTAxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMiwgNTM5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ3NjE5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDEiIEA1NDUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTQxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzLCA5NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNkYiDQotCQkJCQljbGllbnQgICAgIAlANTQxDQotCQkJCQlzdXBwbGllciAgIAlANTQwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYyOSwgNTc0KQ0KLQkJCQkJICAgICgxNjg5LCA1NzQpDQotCQkJCQkgICAgKDE2ODksIDQ0NCkNCi0JCQkJCSAgICAoMTYxNiwgNDQ0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyOSwgNTc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTYsIDQ0NCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NCIgQDU0Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgNjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDAyNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDUiIEA1NDcNCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNSwgMzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU0Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDU0MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNTAxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDU0OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE1LCAzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQ4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTksIDY1NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmaWVsZHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzkyNTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM3OSINCi0JCQkJCWNsaWVudCAgICAgCUA1NDYNCi0JCQkJCXN1cHBsaWVyICAgCUA1MDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQ4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTMsIDY1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyOTkwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDIiIEA1NTENCi0JCQkJbG9jYXRpb24gICAJKDE0MTUsIDYwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRDAwM0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQzIiBANTUyDQotCQkJCQlQYXJlbnRfVmlldyAJQDU1MQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIg0KLQkJCQkJY2xpZW50ICAgICAJQDU1MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU0MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE1LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNTAxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBANTUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDU1MQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEzLCA2NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2VsZWN0b3IiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MTEyMTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIzNCINCi0JCQkJCWNsaWVudCAgICAgCUA1NTENCi0JCQkJCXN1cHBsaWVyICAgCUA1MDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODEsIDY1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5MjUyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA1NTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgNjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTgxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNTk5DQotCQkJCWhlaWdodCAgICAgCTIwOQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg2IiBANTU3DQotCQkJCWxvY2F0aW9uICAgCSgyMzk1LCA2MDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTcwMjNFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NyIgQDU1OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhBIg0KLQkJCQkJY2xpZW50ICAgICAJQDU1Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDU1Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzOTUsIDYwNikNCi0JCQkJCSAgICAoMjM5NSwgNjUpDQotCQkJCQkgICAgKDE2MTEsIDY1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM5NSwgNjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDY1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm5vdGF0aW9uRGVjbGFyYXRpb25zIiBANTU5DQotCQkJCQlQYXJlbnRfVmlldyAJQDU1Nw0KLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODksIDEwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitub3RhdGlvbkRlY2xhcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODk3NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEIiDQotCQkJCQljbGllbnQgICAgIAlANTU3DQotCQkJCQlzdXBwbGllciAgIAlANTA1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM5NSwgNjA2KQ0KLQkJCQkJICAgICgyMzk1LCAxNjMzKQ0KLQkJCQkJICAgICgyMDk4LCAxNjMzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM5NSwgNjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTgsIDE2MzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzQ0LCAxMDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDg3ODI5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4MiIgQDU2Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTc3MiwgMjQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUZGMDI0RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODMiIEA1NjMNCi0JCQkJCVBhcmVudF9WaWV3IAlANTYyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNUEiDQotCQkJCQljbGllbnQgICAgIAlANTYyDQotCQkJCQlzdXBwbGllciAgIAlANTU2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCAyNDkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cERlZmluaXRpb25zIiBANTY0DQotCQkJCQlQYXJlbnRfVmlldyAJQDU2Mg0KLQkJCQkJbG9jYXRpb24gICAJKC05NDgsIC0zMjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc2LCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzNTkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVGMDAwMjY0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU2Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDUwNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3NzIsIDI0OSkNCi0JCQkJCSAgICAoMTgzMiwgMjQ5KQ0KLQkJCQkJICAgICgxODMyLCAzOTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzcyLCAyNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgzMiwgMzk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMzQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM3ODY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3OCIgQDU2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0NiwgNTE4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRTkyMDIxNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzkiIEA1NjgNCi0JCQkJCVBhcmVudF9WaWV3IAlANTY3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NzIsIDE4NTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuNjMwMDcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDc1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThCIg0KLQkJCQkJY2xpZW50ICAgICAJQDU2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDU1Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNDYsIDUxOCkNCi0JCQkJCSAgICAoMjM0NiwgMTQ5KQ0KLQkJCQkJICAgICgxNjExLCAxNDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1MTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMTQ5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiIEA1NzANCi0JCQkJCVBhcmVudF9WaWV3IAlANTY3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDgsIDE5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0OTk0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QyINCi0JCQkJCWNsaWVudCAgICAgCUA1NjcNCi0JCQkJCXN1cHBsaWVyICAgCUA1MTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQ2LCA1MTgpDQotCQkJCQkgICAgKDIzNDYsIDE0NDEpDQotCQkJCQkgICAgKDIxNjYsIDE0NDEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1MTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2NiwgMTQ0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOTksIDE5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zNDg4NjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgwIiBANTczDQotCQkJCWxvY2F0aW9uICAgCSgyMDMsIDE1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAwNDkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgxIiBANTc0DQotCQkJCQlQYXJlbnRfVmlldyAJQDU3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzc0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDU1Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMsIDE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxNTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb25zIiBANTc1DQotCQkJCQlQYXJlbnRfVmlldyAJQDU3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNDksIDE5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDc1NzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAzN0UiDQotCQkJCQljbGllbnQgICAgIAlANTczDQotCQkJCQlzdXBwbGllciAgIAlANTM0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjAzLCAxNTkpDQotCQkJCQkgICAgKDEwNCwgMTU5KQ0KLQkJCQkJICAgICgxMDQsIDc4NCkNCi0JCQkJCSAgICAoMTg5LCA3ODQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMsIDE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODksIDc4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NSwgMjAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU5NzAxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4NCIgQDU3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgMzI5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkMyQTE3MDFFRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODUiIEA1NzkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTc4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3MyINCi0JCQkJCWNsaWVudCAgICAgCUA1NzgNCi0JCQkJCXN1cHBsaWVyICAgCUA1NTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgMzI5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDI2NCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTc3LCAtMjMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzc1LCAzMzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA5NTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExQTAyN0QiDQotCQkJCQljbGllbnQgICAgIAlANTc4DQotCQkJCQlzdXBwbGllciAgIAlANTQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAzOTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE4LCAzMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMDcxNDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc2IiBANTgzDQotCQkJCWxvY2F0aW9uICAgCSg0OCwgMzIwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZGREZBMDBDMyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzciIEA1ODQNCi0JCQkJCVBhcmVudF9WaWV3IAlANTgzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC0yODgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkIwMjdEIg0KLQkJCQkJY2xpZW50ICAgICAJQDU4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDU1Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ5LCAzMjIpDQotCQkJCQkgICAgKDQ5LCA2OCkNCi0JCQkJCSAgICAoMTAxMywgNjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDY4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9ucyIgQDU4NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTg1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzOCwgMTA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xOTg1MzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0UiDQotCQkJCQljbGllbnQgICAgIAlANTgzDQotCQkJCQlzdXBwbGllciAgIAlANTIzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDksIDMyMikNCi0JCQkJCSAgICAoNDksIDE0MTUpDQotCQkJCQkgICAgKDE3NCwgMTQxNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAxNDE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTEsIDEwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xOTY3MDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANTg4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgNDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzUsIDQxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDENCi0JCQkJaGVpZ2h0ICAgICAJOTcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNiIgQDU4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk5LCA1ODkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNTkwMTk4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNyIgQDU5MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1RDAxRTMiDQotCQkJCQljbGllbnQgICAgIAlANTg5DQotCQkJCQlzdXBwbGllciAgIAlANTg4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDk5LCA1ODkpDQotCQkJCQkgICAgKDQ1MiwgNTg5KQ0KLQkJCQkJICAgICg0NTIsIDQ5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MiwgNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iIEA1OTENCi0JCQkJCVBhcmVudF9WaWV3IAlANTg5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzLCAxMDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MTEsIDU4NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTYuNTIwODMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFRCINCi0JCQkJCWNsaWVudCAgICAgCUA1ODkNCi0JCQkJCXN1cHBsaWVyICAgCUA1ODgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OTksIDU4OSkNCi0JCQkJCSAgICAoNTQ3LCA1ODkpDQotCQkJCQkgICAgKDU0NywgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQ3LCA0OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0OTksIDU1OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjAiIEA1OTQNCi0JCQkJbG9jYXRpb24gICAJKDI0MSwgNjEzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDA1OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjEiIEA1OTUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTk0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzNDMsIC0yMTkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0JGIg0KLQkJCQkJY2xpZW50ICAgICAJQDU5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDU4OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDEsIDYxMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDQ5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDU5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwOCwgNjk0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg2NDQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0MwIg0KLQkJCQkJY2xpZW50ICAgICAJQDU5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDUzNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDEsIDYxMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDczMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMiwgNjg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjEwMTY5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMiIgQDU5OQ0KLQkJCQlsb2NhdGlvbiAgIAkoODM3LCA0NjApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRUYwMTYwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMyIgQDYwMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OCINCi0JCQkJCWNsaWVudCAgICAgCUA1OTkNCi0JCQkJCXN1cHBsaWVyICAgCUA1ODgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA0NjApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEA2MDENCi0JCQkJCVBhcmVudF9WaWV3IAlANTk5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4MCwgNTI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjUxNDYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiDQotCQkJCQljbGllbnQgICAgIAlANTk5DQotCQkJCQlzdXBwbGllciAgIAlANTQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNywgNDYwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDgsIDQ2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgNDA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMwNDM1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3NCIgQDYwNA0KLQkJCQlsb2NhdGlvbiAgIAkoNTQxLCAyNDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEQwMUJGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3NSIgQDYwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2MDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTgiDQotCQkJCQljbGllbnQgICAgIAlANjA0DQotCQkJCQlzdXBwbGllciAgIAlANTU2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDI0NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb25zIiBANjA2DQotCQkJCQlQYXJlbnRfVmlldyAJQDYwNA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTIzLCAtMTg2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQzLCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwOTMwMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEUwMTk5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDYwNA0KLQkJCQkJc3VwcGxpZXIgICAJQDU4OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDU0MSwgMjQ2KQ0KLQkJCQkJICAgICgyMjQsIDI0NikNCi0JCQkJCSAgICAoMjI0LCA0MDApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NDEsIDI0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjQsIDQwMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjA2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NiwgMzM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NjkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyOCIgQDYwOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUzLCA2MjEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCREQwMjk3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyOSIgQDYxMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2MDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMUUiDQotCQkJCQljbGllbnQgICAgIAlANjA5DQotCQkJCQlzdXBwbGllciAgIAlANTg4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzUzLCA2MjEpDQotCQkJCQkgICAgKDMwNiwgNjIxKQ0KLQkJCQkJICAgICgzMDYsIDQ5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM1MywgNjIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwNiwgNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwIiBANjExDQotCQkJCQlQYXJlbnRfVmlldyAJQDYwOQ0KLQkJCQkJbG9jYXRpb24gICAJKC02MywgMTczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc5LCA2MzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3Vic3RpdHV0aW9uR3JvdXAiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJNC44MDg1MTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDJEQkUwMDEyOCINCi0JCQkJCWNsaWVudCAgICAgCUA2MDkNCi0JCQkJCXN1cHBsaWVyICAgCUA1ODgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNTMsIDYyMSkNCi0JCQkJCSAgICAoNDAwLCA2MjEpDQotCQkJCQkgICAgKDQwMCwgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA0OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTAsIDU4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjk3NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJcXVpZCAgICAgICAJIjNCNjlFNzg2MDJDNSINCi0JCQl0aXRsZSAgICAgIAkiMy4gQ29tcG9uZW50IEF0dHJpYnV0ZXMgIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA2MTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDEwNykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG5hbWUgOiBTdHJpbmciDQotCQkJCQkiKyB0YXJnZXROYW1lc3BhY2UgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNTM0DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDYxNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTY0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE1NjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDYxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAxNjgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAxNTI0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAxNTg0KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTE3Nw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGRlcml2YXRpb25NZXRob2QgOiBYU0REZXJpdmF0aW9uTWV0aG9kID0gcmVzdHJpY3Rpb24iDQotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRENvbXBsZXhGaW5hbCINCi0JCQkJCSIrIGFic3RyYWN0IDogYm9vbGVhbiINCi0JCQkJCSIrIGNvbnRlbnRUeXBlQ2F0ZWdvcnkgOiBYU0RDb250ZW50VHlwZUNhdGVnb3J5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgcHJvaGliaXRlZFN1YnN0aXR1dGlvbnMgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpKQ0KLQkJCQl3aWR0aCAgICAgIAkxMTkyDQotCQkJCWhlaWdodCAgICAgCTMzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MTcNCi0JCQkJbG9jYXRpb24gICAJKDQ2MywgMzYyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2MTQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDYzLCAzNjIpDQotCQkJCSAgICAoNDYzLCAyMjEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANjE4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDE2MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1MTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTc5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiDQotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpDQotCQkJCXdpZHRoICAgICAgCTY0Ng0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANjE5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkxMiwgMTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY0NywgOTgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyByZXF1aXJlZCA6IGJvb2xlYW4iDQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIg0KLQkJCQkJIisgY29uc3RyYWludCA6IFhTRENvbnN0cmFpbnQiKSkNCi0JCQkJd2lkdGggICAgICAJNTQ4DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDYyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDE5MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODMwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEyODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODkwKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTI5NA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSA6IFhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQkJCSI8PDAuLio+PiArIG5hbWVzcGFjZUNvbnN0cmFpbnQgOiBTdHJpbmciDQotCQkJCQkiKyBwcm9jZXNzQ29udGVudHMgOiBYU0RQcm9jZXNzQ29udGVudHMiKSkNCi0JCQkJd2lkdGggICAgICAJMTMwNA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDYyMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTQ0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDEzODQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTc4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTU5Ng0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDYyMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDUxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgNDMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgNDkxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSINCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjIzDQotCQkJCWxvY2F0aW9uICAgCSgyOTQsIDY5NykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjIyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI5NCwgNjk3KQ0KLQkJCQkgICAgKDI5NCwgNjA1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA2MjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjU2LCAxMjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTUsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTU0MA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA2MjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgNTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MTgsIDQ2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjI2DQotCQkJCWxvY2F0aW9uICAgCSgyNjg0LCA5NjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDYyNQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyNjg0LCA5NjIpDQotCQkJCSAgICAoMjY4NCwgNTc2KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb3NpdG9yIiBANjI3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTExNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb3NpdG9yIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDEwNjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODY5QjYyMDAzNyINCi0JCQkJd2lkdGggICAgICAJMzQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW50IiBANjI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDY5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzgsIDQxOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlFMjYwMUFFIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERlcml2YXRpb25NZXRob2QiIEA2MjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAyMjcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMjEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMTYzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTBCMDAwQ0UiDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiIEA2MzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyODEsIDg4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYwNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4MSwgMzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYwNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODZBMUUwMDI3MiINCi0JCQkJd2lkdGggICAgICAJNjI1DQotCQkJCWhlaWdodCAgICAgCTMwMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb250ZW50VHlwZUNhdGVnb3J5IiBANjMxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcwNCwgMjIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjExNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjA2NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NkE3OUYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk1MTQNCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFZhcmlldHkiIEA2MzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE2MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcwOCwgMTUxNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNDY2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjc3MzAyNDkiDQotCQkJCXdpZHRoICAgICAgCTM2Mg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvY2Vzc0NvbnRlbnRzIiBANjMzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAyMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvY2Vzc0NvbnRlbnRzIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTA2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjhDNzAyODQiDQotCQkJCXdpZHRoICAgICAgCTQzOA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhWYXJpZXR5IiBANjM0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjc2OCwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aFZhcmlldHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4RkZCODkwMzNBIg0KLQkJCQl3aWR0aCAgICAgIAkzODENCi0JCQkJaGVpZ2h0ICAgICAJMjUwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANjM1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDE4NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3ODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxNzM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE4NDgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDENCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBsaXN0Ig0KLQkJCQkJIisgcmVzdHJpY3Rpb24iDQotCQkJCQkiKyB1bmlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDYzNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyMDAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxOTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDE4OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMjAwMSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpDQotCQkJCXdpZHRoICAgICAgCTM4Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIiBANjM3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDg1LCAxMDc1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzU5MTAwQUUiDQotCQkJCXdpZHRoICAgICAgCTY0OA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA2MzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTExNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDEwNjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTE3NikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHN1YnN0aXR1dGlvbiINCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiIEA2MzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY2NCwgMjI3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjIxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIxNjMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjI3MykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpDQotCQkJCXdpZHRoICAgICAgCTU1MA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IiBANjQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAyMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjE1NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjEwNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1RUEwMDIzIg0KLQkJCQl3aWR0aCAgICAgIAk2OTYNCi0JCQkJaGVpZ2h0ICAgICAJMjk2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDY0MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCA4ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgNzQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEzODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDgwOSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTEzOTYNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBuaWxsYWJsZSA6IGJvb2xlYW4iDQotCQkJCQkiPDwwLi4qPj4gKyBkaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQkJIjw8MC4uKj4+ICsgc3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIDogWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCQkJIisgYWJzdHJhY3QgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTE0MDQNCi0JCQkJaGVpZ2h0ICAgICAJMjg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQljbGllbnQgICAgIAlANjQxDQotCQkJCXN1cHBsaWVyICAgCUA2MjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4MSwgNzM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjgxLCA2OTcpDQotCQkJCWRyYXdTdXBwbGllciAJQDYyMykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANjQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgODEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDkyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA2NDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQyMCwgMTEwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzgwMEQyIg0KLQkJCQljbGllbnQgICAgIAlANjQ0DQotCQkJCXN1cHBsaWVyICAgCUA2MjUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NjIsIDEwODgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODYyLCA5NjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYyNikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANjQ2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEzMTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2OCwgMTI2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM4Ng0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjQ3DQotCQkJCWxvY2F0aW9uICAgCSgyMzc1LCAxNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2NDYNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjM3NSwgMTQ2NSkNCi0JCQkJICAgICgyMzc1LCAxMzc1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJY2xpZW50ICAgICAJQDY0Ng0KLQkJCQlzdXBwbGllciAgIAlANjI1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzY4LCAxMjQ5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM2OCwgOTYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDYxNg0KLQkJCQlzdXBwbGllciAgIAlANjQ2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODE4LCAxNTEyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxOCwgMTQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjQ3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUA2MTgNCi0JCQkJc3VwcGxpZXIgICAJQDY0Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwNiwgMTUwNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDYsIDE0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDY0NykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANjUxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDExNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTgsIDExMDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjUyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlANjUxDQotCQkJCXN1cHBsaWVyICAgCUA2MjUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMTUsIDEwODkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTE1LCA5NjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYyNikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA2NTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzQsIDQ2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTExNTANCi0JCQkJaGVpZ2h0ICAgICAJMTQ0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBQTMwMjQyIg0KLQkJCQljbGllbnQgICAgIAlANjUzDQotCQkJCXN1cHBsaWVyICAgCUA2MTQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjgsIDQ1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjgsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjE3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDY1NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjU1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3OCwgNzAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk1MDINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDY1Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDI2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ5NDMwMkYxIg0KLQkJCQljbGllbnQgICAgIAlANjU1DQotCQkJCXN1cHBsaWVyICAgCUA2MTQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOTAsIDY5MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTAsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjE3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCWNsaWVudCAgICAgCUA2NDMNCi0JCQkJc3VwcGxpZXIgICAJQDYyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxLCA4MDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEsIDY5NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjIzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCWNsaWVudCAgICAgCUA2MjINCi0JCQkJc3VwcGxpZXIgICAJQDYxNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzcyLCA0MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNzIsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjE3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiDQotCQkJCWNsaWVudCAgICAgCUA2MjUNCi0JCQkJc3VwcGxpZXIgICAJQDYxNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjY4NywgNDQ4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY4NywgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTcpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNC4gQ29tcG9uZW50IEhpZXJhcmNoeSwgUmVsYXRpb25zIGFuZCBBdHRyaWJ1dGVzIChQYXJ0IDI6IERhdGF0eXBlcykiDQotCQkJcXVpZCAgICAgICAJIjNCNkMzMjY1MDA1RiINCi0JCQl0aXRsZSAgICAgIAkiNC4gQ29tcG9uZW50IEhpZXJhcmNoeSwgUmVsYXRpb25zIGFuZCBBdHRyaWJ1dGVzIChQYXJ0IDI6IERhdGF0eXBlcykiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiIEA2NjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDg5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMiwgODQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZpeGVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIg0KLQkJCQl3aWR0aCAgICAgIAkzMzgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIgQDY2Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgODk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNCwgODQ1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlcGVhdGFibGVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTQ1MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDY2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY2LCAxMTEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQl3aWR0aCAgICAgIAk0NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDY2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc3NywgMTExMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXR0ZXJuRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzE4LCAxMDQ5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2NjINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNzE4LCAxMDQ5KQ0KLQkJCQkgICAgKDcxOCwgOTU5KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEA2NjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCA5MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTksIDg3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4Ig0KLQkJCQl3aWR0aCAgICAgIAk0MjANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDY2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDkyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MywgODcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREJvdW5kZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJCXdpZHRoICAgICAgCTM4OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIgQDY2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMzIsIDExMDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDcsIDEwNDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTQ2OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBANjY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwNCwgMTEwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxOSwgMTA0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2Ig0KLQkJCQl3aWR0aCAgICAgIAkzODgNCi0JCQkJaGVpZ2h0ICAgICAJMTM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IiBANjcwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCAxMzc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTEsIDEzMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IiBANjcxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjA4LCAxNTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MDUsIDE0OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MjQNCi0JCQkJaGVpZ2h0ICAgICAJMTM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY3Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAxMjYyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTQ0LCAxMjYyKQ0KLQkJCQkgICAgKDE0NCwgOTY0KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIgQDY3Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDE1NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDcsIDE0OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDY3NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDEzNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4MCwgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCQl3aWR0aCAgICAgIAk0OTgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IiBANjc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgMTY3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhJbmNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiDQotCQkJCXdpZHRoICAgICAgCTQ2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiIEA2NzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxOTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAxODUyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDY3Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgyLCAxNjc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSINCi0JCQkJd2lkdGggICAgICAJNDQ2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCIgQDY3OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTkwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0LCAxODUyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQkJd2lkdGggICAgICAJNDc0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IiBANjc5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MiwgMjA1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJd2lkdGggICAgICAJNDI2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBANjgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxOCwgMjA1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzlEMDNDNyINCi0JCQkJY2xpZW50ICAgICAJQDY2Mw0KLQkJCQlzdXBwbGllciAgIAlANjYyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTQsIDExMDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTQsIDEwNDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NjIwMDQ1Ig0KLQkJCQljbGllbnQgICAgIAlANjc0DQotCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA2ODMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQsIDExNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjg0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDQTUwMzhEIg0KLQkJCQljbGllbnQgICAgIAlANjY0DQotCQkJCXN1cHBsaWVyICAgCUA2NjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNDQsIDExMDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMDQ5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzgwMDJERiINCi0JCQkJY2xpZW50ICAgICAJQDY3MA0KLQkJCQlzdXBwbGllciAgIAlANjYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjMsIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjMsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWQiIEA2ODYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxMzI0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxMjc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkM3NzE1MjAyRTQiDQotCQkJCXdpZHRoICAgICAgCTQ0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHkiIEA2ODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjY5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTYxOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNUQwMDlCIg0KLQkJCQl3aWR0aCAgICAgIAk0NDQNCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2UiIEA2ODgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCAyMDMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2UiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkVFRDBGNjAzNDIiDQotCQkJCXdpZHRoICAgICAgCTQyNA0KLQkJCQloZWlnaHQgICAgIAkyODcNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6VmFsdWUiIEA2ODkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDIwOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgMjA2MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJWYWx1ZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgMjAxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNDMDQwQjVCMDMxRiINCi0JCQkJd2lkdGggICAgICAJNjM2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjYxMDMzNyINCi0JCQkJY2xpZW50ICAgICAJQDY3OQ0KLQkJCQlzdXBwbGllciAgIAlANjYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMjA0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDY5MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDEzNzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzLCAxMzgwKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjkwDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzMDQNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBANjkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1ODQsIDEzNzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDEzODApDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIikpDQotCQkJCXdpZHRoICAgICAgCTMwNg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQyNDAwOTgiDQotCQkJCWNsaWVudCAgICAgCUA2OTENCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM1LCAxMzA4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM1LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExRDMxMDNBRCINCi0JCQkJY2xpZW50ICAgICAJQDY5Mg0KLQkJCQlzdXBwbGllciAgIAlANjYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCAxMzA4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjcyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I1MjAzNTMiDQotCQkJCWNsaWVudCAgICAgCUA2NzcNCi0JCQkJc3VwcGxpZXIgICAJQDY5MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg1LCAxNjY0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg1LCAxNDQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCODMwM0I4Ig0KLQkJCQljbGllbnQgICAgIAlANjc1DQotCQkJCXN1cHBsaWVyICAgCUA2OTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDAsIDE2NjQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAwLCAxNDQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCOEUwMzA5Ig0KLQkJCQljbGllbnQgICAgIAlANjc2DQotCQkJCXN1cHBsaWVyICAgCUA2OTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjIsIDE4NDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjIyLCAxNDQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzQwMEMwIg0KLQkJCQljbGllbnQgICAgIAlANjcxDQotCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NywgMTQ4NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NywgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjcyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I3RDAwRkMiDQotCQkJCWNsaWVudCAgICAgCUA2NzMNCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM5NywgMTQ4NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzOTcsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzAwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCOTkwMDE2Ig0KLQkJCQljbGllbnQgICAgIAlANjgwDQotCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzUsIDIwNDQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc1LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDcwMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDM2OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQsIDMxOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTQwNg0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANzAyDQotCQkJCWxvY2F0aW9uICAgCSgzNjYsIDUyMikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANzAxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDM2NiwgNTIyKQ0KLQkJCQkgICAgKDM2NiwgNDMwKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDcwMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgNjI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM0LCA1NzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQl3aWR0aCAgICAgIAk0NjINCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDcwNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA3ODEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDcwMw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyNzIsIDc4MSkNCi0JCQkJICAgICgyNzIsIDY4NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiDQotCQkJCWNsaWVudCAgICAgCUA2NjINCi0JCQkJc3VwcGxpZXIgICAJQDcwMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTk0LCA4MzMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTQsIDc4MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzA0KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIgQDcwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDc1MiwgNjI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNiwgNTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZ1bmRhbWVudGFsRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDcwNw0KLQkJCQlsb2NhdGlvbiAgIAkoNzY4LCA3ODkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDcwNg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg3NjgsIDc4OSkNCi0JCQkJICAgICg3NjgsIDY4NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY1OTAxMkMiDQotCQkJCWNsaWVudCAgICAgCUA2NjYNCi0JCQkJc3VwcGxpZXIgICAJQDcwNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA1MCwgODYwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1MCwgNzg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjNDMDIyNCINCi0JCQkJY2xpZW50ICAgICAJQDY2Nw0KLQkJCQlzdXBwbGllciAgIAlANzA2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTI1LCA4NjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI1LCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDcwNykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzEwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NEYwMTMxIg0KLQkJCQljbGllbnQgICAgIAlANjY4DQotCQkJCXN1cHBsaWVyICAgCUA3MDYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMzcsIDEwMzYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM3LCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDcwNykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzExDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NDIwMDc0Ig0KLQkJCQljbGllbnQgICAgIAlANjY5DQotCQkJCXN1cHBsaWVyICAgCUA3MDYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDEwMzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDcwNykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzEyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0NTYsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzEyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCAxMDcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSINCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkNCi0JCQkJd2lkdGggICAgICAJNjU2DQotCQkJCWhlaWdodCAgICAgCTI1MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzIiIEA3MTMNCi0JCQkJbG9jYXRpb24gICAJKDc3NSwgMTc4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ1OTcxMDJFQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzMiIEA3MTQNCi0JCQkJCVBhcmVudF9WaWV3IAlANzEzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwOSwgMjM1KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzUwMTE5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDcxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDcwMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3NSwgMTc4KQ0KLQkJCQkJICAgICg1NTAsIDE3OCkNCi0JCQkJCSAgICAoNTUwLCAzMDYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzUsIDE3OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NTAsIDMwNikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDcxNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc1LCAxMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODMxMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDEwNSINCi0JCQkJCWNsaWVudCAgICAgCUA3MTMNCi0JCQkJCXN1cHBsaWVyICAgCUA3MTINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgMTc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MSwgMjE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODEyNTAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NCIgQDcxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY5LCA3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwMjAzQTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmFjZXRzIiBANzIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDcxOQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xNjE1LCAtMTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA0OTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzODYzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNjUiDQotCQkJCQljbGllbnQgICAgIAlANzE5DQotCQkJCQlzdXBwbGllciAgIAlANzAzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzY5LCA3MikNCi0JCQkJCSAgICAoMTAwLCA3MikNCi0JCQkJCSAgICAoMTAwLCA1NjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMCwgNTYxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjAsIDQ5OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNzkwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk1IiBANzIzDQotCQkJCQlQYXJlbnRfVmlldyAJQDcxOQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xNjE1LCAtMTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzI0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc2LCAzMSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA1MSINCi0JCQkJCWNsaWVudCAgICAgCUA3MTkNCi0JCQkJCXN1cHBsaWVyICAgCUA3MTINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCA3MikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzNiIgQDcyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgNTA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjYNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOCwgNDQ5KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjANCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzciIEA3MjcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzI1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzI4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NiwgMzQwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMERGIg0KLQkJCQkJY2xpZW50ICAgICAJQDcyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDcxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDUwOCkNCi0JCQkJCSAgICAoMTQ4NywgNTA4KQ0KLQkJCQkJICAgICgxNDg3LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA1MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIml0ZW1UeXBlRGVmaW5pdGlvbiIgQDcyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIzLCA1NzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraXRlbVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjIxMTUzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMEUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDcyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDcxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDUwOCkNCi0JCQkJCSAgICAoMTU5MCwgNTA4KQ0KLQkJCQkJICAgICgxNTkwLCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA1MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU5MCwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNDY4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAzOTg0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NiIgQDczMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTcyOSwgNTc0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNEI3MDIwOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTciIEA3MzMNCi0JCQkJCVBhcmVudF9WaWV3IAlANzMyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgMzUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzM0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzNywgMzUzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDczMg0KLQkJCQkJc3VwcGxpZXIgICAJQDcxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3MjksIDU3NCkNCi0JCQkJCSAgICAoMTY3OCwgNTc0KQ0KLQkJCQkJICAgICgxNjc4LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OCwgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1lbWJlclR5cGVEZWZpbml0aW9ucyIgQDczNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzINCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA2NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWVtYmVyVHlwZURlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjI2OTIzMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDczMg0KLQkJCQkJc3VwcGxpZXIgICAJQDcxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3MjksIDU3NCkNCi0JCQkJCSAgICAoMTc4MSwgNTc0KQ0KLQkJCQkJICAgICgxNzgxLCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4MSwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMCwgNTIwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzEyMTIxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5OCIgQDczOA0KLQkJCQlsb2NhdGlvbiAgIAkoNzQ4LCAyNjkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzIwMURCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZ1bmRhbWVudGFsRmFjZXRzIiBANzM5DQotCQkJCQlQYXJlbnRfVmlldyAJQDczOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgMzEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Z1bmRhbWVudGFsRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjQwOTA5MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDYzIg0KLQkJCQkJY2xpZW50ICAgICAJQDczOA0KLQkJCQkJc3VwcGxpZXIgICAJQDcwNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc0OCwgMjY5KQ0KLQkJCQkJICAgICg2NTksIDI2OSkNCi0JCQkJCSAgICAoNjU5LCA1NjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NDgsIDI2OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTksIDU2MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyOCwgMzg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM4MDI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTkiIEA3NDINCi0JCQkJCVBhcmVudF9WaWV3IAlANzM4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1MiwgMjI4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDU5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDczOA0KLQkJCQkJc3VwcGxpZXIgICAJQDcxMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NDgsIDI2OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAyNjkpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDAiIEA3NDQNCi0JCQkJbG9jYXRpb24gICAJKDExNzUsIDM5NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVBQjAyNzMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAxIiBANzQ1DQotCQkJCQlQYXJlbnRfVmlldyAJQDc0NA0KLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDMxNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDI5MSINCi0JCQkJCWNsaWVudCAgICAgCUA3NDQNCi0JCQkJCXN1cHBsaWVyICAgCUA3MTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc1LCAzOTYpDQotCQkJCQkgICAgKDExMzUsIDM5NikNCi0JCQkJCSAgICAoMTEzNSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzUsIDI4NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA3NDcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzQ0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTgwOSwgMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NCwgNDQzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi41MzMzMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDJBNSINCi0JCQkJCWNsaWVudCAgICAgCUA3NDQNCi0JCQkJCXN1cHBsaWVyICAgCUA3MTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc1LCAzOTYpDQotCQkJCQkgICAgKDEyMTUsIDM5NikNCi0JCQkJCSAgICAoMTIxNSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTUsIDI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzIsIDM1OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTYxNTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAyIiBANzUwDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0NDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzIwMTZDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwMyIgQDc1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNjI0LCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjY4LCAzMjcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3NTAyMkYiDQotCQkJCQljbGllbnQgICAgIAlANzUwDQotCQkJCQlzdXBwbGllciAgIAlANzEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQ0KLQkJCQkJICAgICgxMzA5LCA0NDYpDQotCQkJCQkgICAgKDEzMDksIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA5LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iIEA3NTMNCi0JCQkJCVBhcmVudF9WaWV3IAlANzUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTYyNCwgMjIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIwNCwgNTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3ByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjAwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjQzIg0KLQkJCQkJY2xpZW50ICAgICAJQDc1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDcxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNjAsIDQ0NikNCi0JCQkJCSAgICAoMTQxMiwgNDQ2KQ0KLQkJCQkJICAgICgxNDEyLCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYwLCA0NDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxMiwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3MywgNDA5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYyMTQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANzU2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDUxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDI4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgMzc4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDQ4OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGxpc3QiDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIHVuaW9uIikpDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDc1Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDE3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgOTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVmFyaWV0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjc3MzAyNDkiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM3QjAzOTYiDQotCQkJCWNsaWVudCAgICAgCUA3MDYNCi0JCQkJc3VwcGxpZXIgICAJQDcwMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkxLCA1NjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTEsIDUyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4MDAzOTQiDQotCQkJCWNsaWVudCAgICAgCUA3MDMNCi0JCQkJc3VwcGxpZXIgICAJQDcwMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA1NjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzIsIDUyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiDQotCQkJCWNsaWVudCAgICAgCUA3MDENCi0JCQkJc3VwcGxpZXIgICAJQDY4Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY2LCAzMDYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjYsIDIxNSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc2MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2Qzg4MDFCNCINCi0JCQkJY2xpZW50ICAgICAJQDY2MQ0KLQkJCQlzdXBwbGllciAgIAlANzAzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcsIDgyOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NywgNzgxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc2Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjU5MDI4MSINCi0JCQkJY2xpZW50ICAgICAJQDY3OA0KLQkJCQlzdXBwbGllciAgIAlANjkxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAsIDE4NDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAsIDE0NDQpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjUuIENvbXBvbmVudCBBbm5vdGF0aW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I2OUQ2OEQwMEQyIg0KLQkJCXRpdGxlICAgICAgCSI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDc2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAkzNTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANzY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MiwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA3NjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCAxNTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI2LCAxNDYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDc2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDMwNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjYzLCAyNjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQl3aWR0aCAgICAgIAk0NjgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA3NjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMzE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANzY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA3MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA2NjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANzY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTE0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDc3MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgNTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDc3MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDY4LCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDc3Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyMTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgMTE3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANzczDQotCQkJCWxvY2F0aW9uICAgCSgxOTk0LCAxNDEyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA3NzINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTk5NCwgMTQxMikNCi0JCQkJICAgICgxOTk0LCAxMjcxKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc3NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDc2NQ0KLQkJCQlzdXBwbGllciAgIAlANzcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDg0LCAxNDQ5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA4NCwgMTQxMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzczKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANzc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA4NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgwLCA4MjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNDAyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDc3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTIsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA3NzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODQsIDM0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDc3OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgMTgxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANzc5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc5MiwgMTcxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2NywgMTY3NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk2NjkNCi0JCQkJaGVpZ2h0ICAgICAJMTAwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc4MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDc3OQ0KLQkJCQlzdXBwbGllciAgIAlANzcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTcyLCAxNjYyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU3MiwgMTQxMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzczKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDc4MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTAyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgsIDk4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IiBANzgyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODgsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk0NTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANzgzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MSwgMTQ5MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA3ODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MiwgNjg1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQl3aWR0aCAgICAgIAk3MzgNCi0JCQkJaGVpZ2h0ICAgICAJNTQzDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzgiIEA3ODUNCi0JCQkJbG9jYXRpb24gICAJKDg2NSwgMTM1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAxODMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM5IiBANzg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDc4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzM0MiDQotCQkJCQljbGllbnQgICAgIAlANzg1DQotCQkJCQlzdXBwbGllciAgIAlANzY3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg2NSwgMTM1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NzEsIDEzNTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCA1NTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTgsIDEzMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS4xMTY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDM0NiINCi0JCQkJCWNsaWVudCAgICAgCUA3ODUNCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4NjUsIDEzNTkpDQotCQkJCQkgICAgKDkyNSwgMTM1OSkNCi0JCQkJCSAgICAoOTI1LCAxMjE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4NywgMTI3NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjQyMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjIiIEA3OTANCi0JCQkJbG9jYXRpb24gICAJKDcxMywgNzA5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBGMDIxMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjMiIEA3OTENCi0JCQkJCVBhcmVudF9WaWV3IAlANzkwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNywgLTkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBDOSINCi0JCQkJCWNsaWVudCAgICAgCUA3OTANCi0JCQkJCXN1cHBsaWVyICAgCUA3NjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCA3MDkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA3LCAtOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjcsIDY2NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDk1MjM4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwRDMiDQotCQkJCQljbGllbnQgICAgIAlANzkwDQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxMywgNzA5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgNzA5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk2LCA3NTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTM1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU2IiBANzk1DQotCQkJCWxvY2F0aW9uICAgCSg3MTksIDExOTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTUwMDhBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NyIgQDc5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMDk2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExOTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCAxMTkzKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3OTcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwMSwgMzkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIwLCAxMTQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDY5OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE2MDBBMCINCi0JCQkJCWNsaWVudCAgICAgCUA3OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgMTE5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNiwgMTI0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwNDE2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTYiIEA4MDANCi0JCQkJbG9jYXRpb24gICAJKDc4NSwgNTUwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBBMDA2NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTciIEA4MDENCi0JCQkJCVBhcmVudF9WaWV3IAlAODAwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyM0YiDQotCQkJCQljbGllbnQgICAgIAlAODAwDQotCQkJCQlzdXBwbGllciAgIAlANzcwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NSwgNTUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNTUwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MDINCi0JCQkJCVBhcmVudF9WaWV3IAlAODAwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OSwgNTE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDcwNzA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyNDkiDQotCQkJCQljbGllbnQgICAgIAlAODAwDQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzg1LCA1NTApDQotCQkJCQkgICAgKDg4NCwgNTUwKQ0KLQkJCQkJICAgICg4ODQsIDY3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NSwgNTUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NCwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM1LCA2MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mjk3MzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg4IiBAODA1DQotCQkJCWxvY2F0aW9uICAgCSgxMTg0LCA0MDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTYwMjkwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4OSIgQDgwNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTg0LCA0MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4NCwgMTM1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDgwNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMiwgLTQxMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjQsIDIyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC42NjU0MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NzAxNkYiDQotCQkJCQljbGllbnQgICAgIAlAODA1DQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg0LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUxLCA2MTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODQzODcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA0IiBAODEwDQotCQkJCWxvY2F0aW9uICAgCSgxNzUyLCAxMDM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMjkxMDE1OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDUiIEA4MTENCi0JCQkJCVBhcmVudF9WaWV3IAlAODEwDQotCQkJCQlsb2NhdGlvbiAgIAkoNTM2LCAyMTgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTIwMTlGIg0KLQkJCQkJY2xpZW50ICAgICAJQDgxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDc3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3NTIsIDEwMzQpDQotCQkJCQkgICAgKDE4MTIsIDEwMzQpDQotCQkJCQkgICAgKDE4MTIsIDExNjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDExNjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgxMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTANCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODEyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NDMsIDk5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU5NjAzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxQTkiDQotCQkJCQljbGllbnQgICAgIAlAODEwDQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTIsIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgMTAzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODEyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODQsIDEwNjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTAzMzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA2IiBAODE1DQotCQkJCWxvY2F0aW9uICAgCSgxODk2LCA4ODEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2Q0YwMDg4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNyIgQDgxNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTUNCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE1RCINCi0JCQkJCWNsaWVudCAgICAgCUA4MTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxODk2LCA4ODEpDQotCQkJCQkgICAgKDE5NTYsIDg4MSkNCi0JCQkJCSAgICAoMTk1NiwgMTE2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4OTYsIDg4MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTU2LCAxMTYxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRlcml2YXRpb25Bbm5vdGF0aW9uIiBAODE3DQotCQkJCQlQYXJlbnRfVmlldyAJQDgxNQ0KLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCA4NDIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzkwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGVyaXZhdGlvbkFubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNTQyMzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE2NyINCi0JCQkJCWNsaWVudCAgICAgCUA4MTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg5NiwgODgxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDg4MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODksIDkxNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNTA4NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDgiIEA4MjANCi0JCQkJbG9jYXRpb24gICAJKDIwNDAsIDcxNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzMzAyNjQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA5IiBAODIxDQotCQkJCQlQYXJlbnRfVmlldyAJQDgyMA0KLQkJCQkJbG9jYXRpb24gICAJKDkyMCwgLTg1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjM0MDI4NCINCi0JCQkJCWNsaWVudCAgICAgCUA4MjANCi0JCQkJCXN1cHBsaWVyICAgCUA3NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMDQwLCA3MTUpDQotCQkJCQkgICAgKDIxMDAsIDcxNSkNCi0JCQkJCSAgICAoMjEwMCwgMTE2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAwLCAxMTYxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDgyMA0KLQkJCQkJbG9jYXRpb24gICAJKDkyMCwgLTg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1OCwgNjgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyOEUiDQotCQkJCQljbGllbnQgICAgIAlAODIwDQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA3MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg1LCA3NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDkzMTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI2IiBAODI1DQotCQkJCWxvY2F0aW9uICAgCSg2NjgsIDg2NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNDAwNEYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI3IiBAODI2DQotCQkJCQlQYXJlbnRfVmlldyAJQDgyNQ0KLQkJCQkJbG9jYXRpb24gICAJKC02MTIsIDMzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBDQSINCi0JCQkJCWNsaWVudCAgICAgCUA4MjUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA4NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDczLCA4NjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgyNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgODI1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMzQxNDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBENCINCi0JCQkJCWNsaWVudCAgICAgCUA4MjUNCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA4NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCA4NjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDEsIDkwMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4MjA1MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzAiIEA4MzANCi0JCQkJbG9jYXRpb24gICAJKDE0NzIsIDE2NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCOTAxQ0QiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMxIiBAODMxDQotCQkJCQlQYXJlbnRfVmlldyAJQDgzMA0KLQkJCQkJbG9jYXRpb24gICAJKDI1NiwgLTY0OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCQTAxQzQiDQotCQkJCQljbGllbnQgICAgIAlAODMwDQotCQkJCQlzdXBwbGllciAgIAlANzc2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ3MiwgMTY3KQ0KLQkJCQkJICAgICgxNDcyLCA3MikNCi0JCQkJCSAgICAoMTg4MywgNzIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCAxNjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg4MywgNzIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgzMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MzANCi0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA0LCAxMjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzYzMDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCQTAxQ0UiDQotCQkJCQljbGllbnQgICAgIAlAODMwDQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcyLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE5LCA2MTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTM1NzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODAiIEA4MzUNCi0JCQkJbG9jYXRpb24gICAJKDkyNywgMzUwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjA2MDI5MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4MSIgQDgzNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MSINCi0JCQkJCWNsaWVudCAgICAgCUA4MzUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI3LCAzNTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjI5LCAzNTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgzNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAzMTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC44MTY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MiINCi0JCQkJCWNsaWVudCAgICAgCUA4MzUNCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MjcsIDM1MCkNCi0JCQkJCSAgICAoOTg3LCAzNTApDQotCQkJCQkgICAgKDk4NywgNjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI3LCAzNTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg3LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM3LCA2MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDMzNDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzIiIEA4NDANCi0JCQkJbG9jYXRpb24gICAJKDEwMjcsIDIyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REFEQzAyRjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzMiIEA4NDENCi0JCQkJCVBhcmVudF9WaWV3IAlAODQwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDIzOCINCi0JCQkJCWNsaWVudCAgICAgCUA4NDANCi0JCQkJCXN1cHBsaWVyICAgCUA3NzgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgMjIyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NDINCi0JCQkJCVBhcmVudF9WaWV3IAlAODQwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwMywgMTg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDA2MjUwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REFERDAyNDIiDQotCQkJCQljbGllbnQgICAgIAlAODQwDQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTAyNywgMjIyKQ0KLQkJCQkJICAgICgxMDg3LCAyMjIpDQotCQkJCQkgICAgKDEwODcsIDY3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjcsIDIyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA2MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTAwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgyNTgzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk2IiBAODQ1DQotCQkJCWxvY2F0aW9uICAgCSgxNDk0LCAxNDM4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOTAwNjg4MDFDMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5NyIgQDg0Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDUNCi0JCQkJCWxvY2F0aW9uICAgCSgyMTQsIDU5MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4QTAxMTEiDQotCQkJCQljbGllbnQgICAgIAlAODQ1DQotCQkJCQlzdXBwbGllciAgIAlANzc5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTY2MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50QW5ub3RhdGlvbiIgQDg0Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDUNCi0JCQkJCWxvY2F0aW9uICAgCSgyMTQsIDU5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTYsIDEzNTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudEFubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNjc3MTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4QTAxMUIiDQotCQkJCQljbGllbnQgICAgIAlAODQ1DQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDMsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTMwMDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUwIiBAODUwDQotCQkJCWxvY2F0aW9uICAgCSg2MzcsIDEwMjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTcwMkM4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MSIgQDg1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTgwM0UyIg0KLQkJCQkJY2xpZW50ICAgICAJQDg1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDc4MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDExLCAxMDIyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NTINCi0JCQkJCVBhcmVudF9WaWV3IAlAODUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4MywgMjIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEwLCA5NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODg4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTkwMDA0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDc4NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAyLCAxMDYyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMwMDg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDcwIiBAODU1DQotCQkJCWxvY2F0aW9uICAgCSgxNTgxLCA2MDcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTcwMTAyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDcxIiBAODU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDg1NQ0KLQkJCQkJbG9jYXRpb24gICAJKDMwMSwgLTIyNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTEiDQotCQkJCQljbGllbnQgICAgIAlAODU1DQotCQkJCQlzdXBwbGllciAgIAlANzgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU4MSwgNjA3KQ0KLQkJCQkJICAgICgxNTgxLCA1NDcpDQotCQkJCQkgICAgKDE2NzksIDU0NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc5LCA1NDcpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4NTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAODU1DQotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2OSwgNDYyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjE5Njk3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTkwMTkyIg0KLQkJCQkJY2xpZW50ICAgICAJQDg1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc4NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCA2MDcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNjIwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTk2OTcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxMCIgQDg2MA0KLQkJCQlsb2NhdGlvbiAgIAkoODQ5LCAxNDk2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjExMDI2RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTEiIEA4NjENCi0JCQkJCVBhcmVudF9WaWV3IAlAODYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDFGOSINCi0JCQkJCWNsaWVudCAgICAgCUA4NjANCi0JCQkJCXN1cHBsaWVyICAgCUA3ODMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxNDk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1NCwgMTQ5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODYyDQotCQkJCQlQYXJlbnRfVmlldyAJQDg2MA0KLQkJCQkJbG9jYXRpb24gICAJKC0yNzEsIDY5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk0MiwgMTQ2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTg4MjU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMjAyMDMiDQotCQkJCQljbGllbnQgICAgIAlAODYwDQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODQ5LCAxNDk2KQ0KLQkJCQkJICAgICgxMDYyLCAxNDk2KQ0KLQkJCQkJICAgICgxMDYyLCAxMjE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxNDk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjIsIDEyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTE1LCAxMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyNjkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxMiIgQDg2NQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTUyLCAxNTY1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDNjI2RUIzMDAwNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTMiIEA4NjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAODY1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyOCwgNzMzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMyNyINCi0JCQkJCWNsaWVudCAgICAgCUA4NjUNCi0JCQkJCXN1cHBsaWVyICAgCUA3ODMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1NCwgMTU2NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDg2Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI4LCA3MzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCAxNTM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA0OTU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMzIiDQotCQkJCQljbGllbnQgICAgIAlAODY1DQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTUyLCAxNTY1KQ0KLQkJCQkJICAgICgxMjAwLCAxNTY1KQ0KLQkJCQkJICAgICgxMjAwLCAxMjE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDAsIDEyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU0LCAxMjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODcwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0Ig0KLQkJCQljbGllbnQgICAgIAlANzY2DQotCQkJCXN1cHBsaWVyICAgCUA3NzYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5ODQsIDI0OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5ODQsIDEzNSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg3MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzhGMDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDc4Mg0KLQkJCQlzdXBwbGllciAgIAlANzY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTk3LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTk3LCAzNTkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjYuIENvbmNyZXRlIENvbXBvbmVudHMiDQotCQkJcXVpZCAgICAgICAJIjNCNkFENzREMDNDNCINCi0JCQl0aXRsZSAgICAgIAkiNi4gQ29uY3JldGUgQ29tcG9uZW50cyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAODcyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IiBAODczDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTY4LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJd2lkdGggICAgICAJNTQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA4NzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTkxLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQkJd2lkdGggICAgICAJNDM2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAODc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNTYsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJd2lkdGggICAgICAJNDI2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4NzYNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDU2MSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODc1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEzNjAsIDU2MSkNCi0JCQkJICAgICgxMzYwLCA0NzEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiIEA4NzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREluY2x1ZGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIg0KLQkJCQl3aWR0aCAgICAgIAkyNTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiIEA4NzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjk0LCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiIEA4NzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA1LCAxMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDg4MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM3NSwgMTE1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJODY5DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ4IiBAODgxDQotCQkJCWxvY2F0aW9uICAgCSgxMzY4LCAxMjA2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M1MDA3RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDkiIEA4ODINCi0JCQkJCVBhcmVudF9WaWV3IAlAODgxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTE2MCwgNDA2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QiINCi0JCQkJCWNsaWVudCAgICAgCUA4ODENCi0JCQkJCXN1cHBsaWVyICAgCUA4NzcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjA2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4ODMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODgxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTE2MCwgNDA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODg0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0NywgMTE1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU0NDEyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkMiDQotCQkJCQljbGllbnQgICAgIAlAODgxDQotCQkJCQlzdXBwbGllciAgIAlAODgwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjgsIDEyMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNCwgMTIwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODgzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDAsIDEyNTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA3DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE0NzA2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NiIgQDg4Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgMTAyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEODAyRkMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ3IiBAODg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDg4Ng0KLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QiINCi0JCQkJCWNsaWVudCAgICAgCUA4ODYNCi0JCQkJCXN1cHBsaWVyICAgCUA4NzgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTY4LCAxMDIyKQ0KLQkJCQkJICAgICgxMTY4LCA5NjIpDQotCQkJCQkgICAgKDEyODUsIDk2MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNjgsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NSwgOTYyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4ODgNCi0JCQkJCVBhcmVudF9WaWV3IAlAODg2DQotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjkwLCAxMDc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDUzNzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEMiDQotCQkJCQljbGllbnQgICAgIAlAODg2DQotCQkJCQlzdXBwbGllciAgIAlAODgwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNjgsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE2OCwgMTE0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODg4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMjcsIDEwNzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzY5NzUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY4IiBAODkxDQotCQkJCWxvY2F0aW9uICAgCSgxNTYzLCAxMzUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFERTQyMDA5QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjkiIEA4OTINCi0JCQkJCVBhcmVudF9WaWV3IAlAODkxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTM1NSwgNTUzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFERTQzMDJGRSINCi0JCQkJCWNsaWVudCAgICAgCUA4OTENCi0JCQkJCXN1cHBsaWVyICAgCUA4NzkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTYzLCAxMzUzKQ0KLQkJCQkJICAgICgxOTQwLCAxMzUzKQ0KLQkJCQkJICAgICgxOTQwLCAxMjU1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgMTM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQwLCAxMjU1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODkzDQotCQkJCQlQYXJlbnRfVmlldyAJQDg5MQ0KLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODkzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDEzMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTY4MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFERTQzMDMwOCINCi0JCQkJCWNsaWVudCAgICAgCUA4OTENCi0JCQkJCXN1cHBsaWVyICAgCUA4ODANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTYzLCAxMzUzKQ0KLQkJCQkJICAgICgxMTgxLCAxMzUzKQ0KLQkJCQkJICAgICgxMTgxLCAxMjU5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgMTM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTgxLCAxMjU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODk1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzMCwgMTMyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MTM0NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4OTYNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNTYxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjg4LCA1NjEpDQotCQkJCSAgICAoMjg4LCA0NzEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAODk3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYwLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDg5OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjU4LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQkJd2lkdGggICAgICAJNDE0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDg5OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgOTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1MCwgOTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDkwMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNCwgNjcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMCwgNjI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJY2xpZW50ICAgICAJQDkwMA0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjEsIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMSwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyINCi0JCQkJY2xpZW50ICAgICAJQDg5Nw0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1ODksIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OSwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkIzMDFENSINCi0JCQkJY2xpZW50ICAgICAJQDg3NA0KLQkJCQlzdXBwbGllciAgIAlAODc1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDE2LCA2MTcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDE2LCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg3NikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEA5MDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MCwgOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgMTA4OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTA0DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE4MjQsIDEwODkpDQotCQkJCSAgICAoMTgyNCwgOTk5KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOERDMDM4MSINCi0JCQkJY2xpZW50ICAgICAJQDg3Nw0KLQkJCQlzdXBwbGllciAgIAlAOTA0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY2LCAxMTQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2NiwgMTA4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCWNsaWVudCAgICAgCUA4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDkwNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkzNCwgMTE0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzQsIDEwODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDkwNSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDkwOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTA4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgNjI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTQzOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkwOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2MiwgODE5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5MDgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTc2MiwgODE5KQ0KLQkJCQkgICAgKDE3NjIsIDcyNykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiDQotCQkJCWNsaWVudCAgICAgCUA4NzgNCi0JCQkJc3VwcGxpZXIgICAJQDkwOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNiwgODg5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNiwgODE5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiINCi0JCQkJY2xpZW50ICAgICAJQDkwOA0KLQkJCQlzdXBwbGllciAgIAlAODc1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU2LCA2MTcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU2LCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg3NikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAOTEyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxNDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODc1LCAxMDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MTMNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDI4OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTEyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDExMjAsIDI4OSkNCi0JCQkJICAgICgxMTIwLCAxOTkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExMCIgQDkxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NSwgMjE1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjA4MDNDNyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250YWluZXIiIEA5MTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTE0DQotCQkJCQlsb2NhdGlvbiAgIAkoOTg5LCAxMDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA0LCAyMTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGFpbmVyIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDMzMTEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMEMwMUNFIg0KLQkJCQkJY2xpZW50ICAgICAJQDkxNA0KLQkJCQkJc3VwcGxpZXIgICAJQDkxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0ODUsIDIxNSkNCi0JCQkJCSAgICAoMTQ4NSwgMTc2KQ0KLQkJCQkJICAgICgxMzc0LCAxNzYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3NCwgMTc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzNSwgMjI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTY5DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjAyNjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTEiIEA5MTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTE0DQotCQkJCQlsb2NhdGlvbiAgIAkoOTg5LCAxMDMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMEMwMUNGIg0KLQkJCQkJY2xpZW50ICAgICAJQDkxNA0KLQkJCQkJc3VwcGxpZXIgICAJQDkxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0ODUsIDIxNSkNCi0JCQkJCSAgICAoMTQ4NSwgMjU0KQ0KLQkJCQkJICAgICgxMzQ1LCAyNTQpDQotCQkJCQkgICAgKDEzNDUsIDE5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODUsIDIxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzQ1LCAxOTkpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTIiIEA5MTkNCi0JCQkJbG9jYXRpb24gICAJKDc3MywgMjE2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjQ4MDI2MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290Q29udGFpbmVyIiBAOTIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDkxOQ0KLQkJCQkJbG9jYXRpb24gICAJKDUzLCAxMDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDIxNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290Q29udGFpbmVyIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNTAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE2MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjRDMDI4NSINCi0JCQkJCWNsaWVudCAgICAgCUA5MTkNCi0JCQkJCXN1cHBsaWVyICAgCUA5MTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NzMsIDIxNikNCi0JCQkJCSAgICAoNzczLCAxNzYpDQotCQkJCQkgICAgKDg2NiwgMTc2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAyMTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxNzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDIyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zMDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMyIgQDkyMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MTkNCi0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjRDMDI4NiINCi0JCQkJCWNsaWVudCAgICAgCUA5MTkNCi0JCQkJCXN1cHBsaWVyICAgCUA5MTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NzMsIDIxNikNCi0JCQkJCSAgICAoNzczLCAyNTcpDQotCQkJCQkgICAgKDg5NSwgMjU3KQ0KLQkJCQkJICAgICg4OTUsIDE5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMjE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NSwgMTk5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MjQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhFNjAzNzIiDQotCQkJCWNsaWVudCAgICAgCUA4NzUNCi0JCQkJc3VwcGxpZXIgICAJQDkxMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2NywgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NywgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkyNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJEOEUyMDBFQSINCi0JCQkJY2xpZW50ICAgICAJQDg3Mw0KLQkJCQlzdXBwbGllciAgIAlAOTEyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTIsIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1MiwgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkyNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiINCi0JCQkJY2xpZW50ICAgICAJQDg3Mg0KLQkJCQlzdXBwbGllciAgIAlAOTEyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTksIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5OSwgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA5MjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTI4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIg0KLQkJCQljbGllbnQgICAgIAlAOTI3DQotCQkJCXN1cHBsaWVyICAgCUA5MDANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNiwgMTE0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNiwgNzI3KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyNCIgQDkyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgMTQyNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI1IiBAOTMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDkyOQ0KLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCQljbGllbnQgICAgIAlAOTI5DQotCQkJCQlzdXBwbGllciAgIAlAOTA0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM4MiwgMTQyNSkNCi0JCQkJCSAgICAoMjE0NywgMTQyNSkNCi0JCQkJCSAgICAoMjE0NywgOTQzKQ0KLQkJCQkJICAgICgyMDY3LCA5NDMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjcsIDk0MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEA5MzENCi0JCQkJCVBhcmVudF9WaWV3IAlAOTI5DQotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ1LCAxMzg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjU0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDkyOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDkyNw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzODIsIDE0MjUpDQotCQkJCQkgICAgKDIyNSwgMTQyNSkNCi0JCQkJCSAgICAoMjI1LCAxMjU1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjUsIDEyNTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMsIDEzOTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTY5MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIyIiBAOTM0DQotCQkJCWxvY2F0aW9uICAgCSgxNTA1LCAxNTAzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQ0M3MDBFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjMiIEA5MzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTM0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTMxMywgMzAzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MiINCi0JCQkJCWNsaWVudCAgICAgCUA5MzQNCi0JCQkJCXN1cHBsaWVyICAgCUA5MDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTA1LCAxNTAzKQ0KLQkJCQkJICAgICgyMTg4LCAxNTAzKQ0KLQkJCQkJICAgICgyMTg4LCA2NzUpDQotCQkJCQkgICAgKDIwNTksIDY3NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1OSwgNjc1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAOTM2DQotCQkJCQlQYXJlbnRfVmlldyAJQDkzNA0KLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMywgMTQ3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMzMzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIg0KLQkJCQkJY2xpZW50ICAgICAJQDkzNA0KLQkJCQkJc3VwcGxpZXIgICAJQDkyNw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MDUsIDE1MDMpDQotCQkJCQkgICAgKDExMywgMTUwMykNCi0JCQkJCSAgICAoMTEzLCAxMjU1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNSwgMTUwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMsIDEyNTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NzY4Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTQiIEA5MzkNCi0JCQkJbG9jYXRpb24gICAJKDY2LCAyNDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzEwMzU2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNSIgQDk0MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MzkNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzMxIg0KLQkJCQkJY2xpZW50ICAgICAJQDkzOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDkxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDY2LCAyNDQpDQotCQkJCQkgICAgKDY2LCAxNDQpDQotCQkJCQkgICAgKDg2NiwgMTQ0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE0NCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWEiIEA5NDENCi0JCQkJCVBhcmVudF9WaWV3IAlAOTM5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1LCA5MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTY4MTEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzM0IiDQotCQkJCQljbGllbnQgICAgIAlAOTM5DQotCQkJCQlzdXBwbGllciAgIAlAOTI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYsIDExNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYsIDE4NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMTMNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY2NTkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3ODBCRDkwMDU5Ig0KLQkJCQljbGllbnQgICAgIAlAODk4DQotCQkJCXN1cHBsaWVyICAgCUA5MTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTksIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTksIDI4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTEzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiDQotCQkJCWNsaWVudCAgICAgCUA4ODANCi0JCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDAwLCAxMTQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg5NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk0Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTAxMiwgODM3KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4NzQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTAxMiwgODM3KQ0KLQkJCQkgICAgKDEwMTIsIDcyNykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDcNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAOTQ4DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzEsIDg3MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4ODE1OA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGRDRFMjAzNjYiDQotCQkJCWNsaWVudCAgICAgCUA4ODANCi0JCQkJc3VwcGxpZXIgICAJQDg3NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzNywgMTE0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMzcsIDgzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQ2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDkNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAOTUwDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg5MCwgODY1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTgxNjMzDQotCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZENEJBMDIzQyINCi0JCQkJY2xpZW50ICAgICAJQDg5OQ0KLQkJCQlzdXBwbGllciAgIAlAODc0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjUsIDkwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgODM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDkwNA0KLQkJCQlzdXBwbGllciAgIAlAOTA4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI4LCA4ODkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI4LCA4MTkpDQotCQkJCWRyYXdTdXBwbGllciAJQDkwOSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQjlGOEY3NjAyQzciDQotCQkJdGl0bGUgICAgICAJIjcuIENvbmNyZXRlIEF0dHJpYnV0ZXMiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA5NTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgMTQ0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxMzU5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxNDE5KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZm9ybSA6IFhTREZvcm0iDQotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNDMwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGb3JtIiBAOTUzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2MCwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5OCwgMTM2NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGb3JtIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5OCwgMTMxNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5RjkxM0IwMUVCIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAOTU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgOTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDk3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZWxlbWVudCA6IERPTUVsZW1lbnQiKSkNCi0JCQkJd2lkdGggICAgICAJNjc1DQotCQkJCWhlaWdodCAgICAgCTE0Mw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAOTU1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAzODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg3LCAzMzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA5NTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA5NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3OCwgODkyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJd2lkdGggICAgICAJNDcwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDk1Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCAxNDA4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDEzNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAOTU4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODY0LCA2MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA1NzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQl3aWR0aCAgICAgIAkyNTYNCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoODUwLCA1MzcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDk1NQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg4NTAsIDUzNykNCi0JCQkJICAgICg4NTAsIDQ0NykpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRWxlbWVudCIgQDk2MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyNDgsIDEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA5MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01FbGVtZW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzUxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODE4OTc5MDIwMCINCi0JCQkJd2lkdGggICAgICAJNzY5DQotCQkJCWhlaWdodCAgICAgCTIwMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5NjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDY0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNTg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTUxMg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA5NjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDM4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMzMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk2Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAyNjMpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDk1NA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgzNjgsIDI2MykNCi0JCQkJICAgICgzNjgsIDE2NykpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA5NjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTkyLCAxNDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEzNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEyOTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxNDA3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgc3Vic3RpdHV0aW9uIg0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iDQotCQkJCQkiKyBhbGwiKSkNCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIgQDk2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE3OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTcwOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTY1OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QkUwMjcyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3NjgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzQNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIGFsbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTANCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAOTY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkxMiwgMjA5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMDQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMTAwKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzY0DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkNCi0JCQkJd2lkdGggICAgICAJNzc4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDk2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTk4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4NzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDk2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NDQsIDIwMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE5MzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleEZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2MiwgMTg4MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyQ0EwMUNCIg0KLQkJCQl3aWR0aCAgICAgIAkzODINCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDk2OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMjc5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMzM5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdXNlIDogWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiDQotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNjQwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIgQDk3MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTYzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTcwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE1NDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTQ5OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JBN0IwRTgwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTINCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA5NzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjA4LCA5MjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTcxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ5OCwgODgxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzgNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA5NzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI0MCwgMTcxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NywgMTYzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk5NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjkxKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTczDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikpDQotCQkJCXdpZHRoICAgICAgCTk4NA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA5NzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTA5NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4ODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDExNTYpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4ODgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk5MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDk3NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDEwMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyMiwgNzc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTk5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTEwMTQNCi0JCQkJaGVpZ2h0ICAgICAJNDg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIgQDk3NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgOTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNywgOTA0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREltcG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJCXdpZHRoICAgICAgCTQyNA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAOTc2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNDQsIDY1NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM4LCA2MDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM4LCA2NjApDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNDMwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA5NzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgMjA0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxMCwgMTk0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAyMDAyKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJODcwDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEQ29tcGxleEZpbmFsIg0KLQkJCQkJIjw8MC4uKj4+ICsgYmxvY2sgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJCSIrIG1peGVkIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk4NzgNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAOTc4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4OCwgMTY5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzA0LCAxNjQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzg2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk3OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJY2xpZW50ICAgICAJQDk3OA0KLQkJCQlzdXBwbGllciAgIAlAOTU3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA2LCAxNjMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwNiwgMTQ3MikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAOTgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjIwOCwgNzA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA1OTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCXdpZHRoICAgICAgCTkxOA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhBQTAxRDMiDQotCQkJCWNsaWVudCAgICAgCUA5NzENCi0JCQkJc3VwcGxpZXIgICAJQDk1NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjY5NiwgODY5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY5NiwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDk3Mg0KLQkJCQlzdXBwbGllciAgIAlAOTUyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDk0LCAxNjE5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5NCwgMTUzMykpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5ODMNCi0JCQkJbG9jYXRpb24gICAJKDE0ODcsIDE4NTYpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDk3OA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNDg3LCAxODU2KQ0KLQkJCQkgICAgKDE0ODcsIDE3NjApKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTUF0dHIiIEA5ODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAwLCAzODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDM1MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01BdHRyIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JCRjhDODkwMUI2Ig0KLQkJCQl3aWR0aCAgICAgIAk2NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAOTc3DQotCQkJCXN1cHBsaWVyICAgCUA5NzgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzQsIDE5MzApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzM0LCAxODU2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5ODMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSINCi0JCQkJY2xpZW50ICAgICAJQDk3Ng0KLQkJCQlzdXBwbGllciAgIAlAOTU1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCA1ODgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDk1OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2Ig0KLQkJCQljbGllbnQgICAgIAlAOTgwDQotCQkJCXN1cHBsaWVyICAgCUA5NTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxOTAsIDU4NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxOTAsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCWNsaWVudCAgICAgCUA5NjENCi0JCQkJc3VwcGxpZXIgICAJQDk2Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyLCA1NzIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjIsIDQ0NykpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiINCi0JCQkJY2xpZW50ICAgICAJQDk2Mg0KLQkJCQlzdXBwbGllciAgIAlAOTU0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjAsIDMyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MCwgMjYzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NjMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEQ5MDAzRSINCi0JCQkJY2xpZW50ICAgICAJQDk3NQ0KLQkJCQlzdXBwbGllciAgIAlAOTYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjMsIDg5MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMywgNzA4KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTkxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQljbGllbnQgICAgIAlAOTczDQotCQkJCXN1cHBsaWVyICAgCUA5NzENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDAsIDEwODQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAwLCA5ODcpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRG9jdW1lbnQiIEA5OTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxMjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDk0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTURvY3VtZW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1NywgNDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI3ODUwRTAzODEiDQotCQkJCXdpZHRoICAgICAgCTc3Ng0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBOTAzRDIiDQotCQkJCWNsaWVudCAgICAgCUA5NTUNCi0JCQkJc3VwcGxpZXIgICAJQDk1NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU2LCAzMjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDI2MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTYzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NTm9kZSIgQDk5NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTk0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNCwgMzUwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzMDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjRBNTAxMTciDQotCQkJCXdpZHRoICAgICAgCTY4Ng0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCWNsaWVudCAgICAgCUA5NTgNCi0JCQkJc3VwcGxpZXIgICAJQDk1NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODUwLCA1NjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTAsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDdCQjAzNDkiDQotCQkJCWNsaWVudCAgICAgCUA5NjkNCi0JCQkJc3VwcGxpZXIgICAJQDk1NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAxMjY3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDk1OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTk3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3Ig0KLQkJCQljbGllbnQgICAgIAlAOTU2DQotCQkJCXN1cHBsaWVyICAgCUA5NTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTQsIDg4MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2OTQsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCWNsaWVudCAgICAgCUA5NzQNCi0JCQkJc3VwcGxpZXIgICAJQDk1OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU2LCA3NjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDY4NykpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5OTkNCi0JCQkJbG9jYXRpb24gICAJKDE3MDMsIDEyOTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDk1Ng0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNzAzLCAxMjkwKQ0KLQkJCQkgICAgKDE3MDMsIDEwMDgpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDk1Nw0KLQkJCQlzdXBwbGllciAgIAlAOTU2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAzLCAxMzQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMywgMTI5MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTk5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQljbGllbnQgICAgIAlAOTUyDQotCQkJCXN1cHBsaWVyICAgCUA5NTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEzNDcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAxMjkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5OTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMDINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUA5NjYNCi0JCQkJc3VwcGxpZXIgICAJQDk3OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MywgMjAyOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNTMsIDE4NTYpDQotCQkJCWRyYXdTdXBwbGllciAJQDk4MykpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI4LiBDb25jcmV0ZSBDb250YWlubWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QTgwOTcwMjdBIg0KLQkJCXRpdGxlICAgICAgCSI4LiBDb25jcmV0ZSBDb250YWlubWVudCINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDEwMDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjcyLCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDM5LCA5NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDEwMDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjQwLCA1NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzEsIDUzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAMTAwNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTMsIDc0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiDQotCQkJCXdpZHRoICAgICAgCTI4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDEwMDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCA1NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDUzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwMDcNCi0JCQkJbG9jYXRpb24gICAJKDE5NDMsIDg2OCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTAwNg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxOTQzLCA4NjgpDQotCQkJCSAgICAoMTk0MywgNjMxKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzAiIEAxMDA4DQotCQkJCWxvY2F0aW9uICAgCSgyMTI1LCA2ODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjQwMDUxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MSIgQDEwMDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwOA0KLQkJCQkJbG9jYXRpb24gICAJKDE1NywgMzQ0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFFODI2MDJBRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDA4DQotCQkJCQlzdXBwbGllciAgIAlAMTAwNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNzI5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTAxMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNTUsIDY3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFFODI2MDJCNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDA4DQotCQkJCQlzdXBwbGllciAgIAlAMTAwNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNjMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY3LCA2NzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDEwMTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCXdpZHRoICAgICAgCTIzNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwMTQNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDEzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI3MiwgNDY1KQ0KLQkJCQkgICAgKDI3MiwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEwMTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM3MiwgMTEyMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTU4Nw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEAxMDE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA1NzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OSwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTgiIEAxMDE3DQotCQkJCWxvY2F0aW9uICAgCSgxMTcwLCAxMzU2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwIiBAMTAxOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE3DQotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OSwgMTM4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM0MDQ0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiDQotCQkJCQljbGllbnQgICAgIAlAMTAxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMTYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTcwLCAxMzU2KQ0KLQkJCQkJICAgICgyMDYsIDEzNTYpDQotCQkJCQkgICAgKDIwNiwgNjMxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3MCwgMTM1NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDYsIDYzMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2LCAxMzIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTU5MTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTkiIEAxMDIxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTcNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjUyMSwgMTM5OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDE3DQotCQkJCQlzdXBwbGllciAgIAlAMTAxNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzAsIDEzNTYpDQotCQkJCQkgICAgKDI3MzEsIDEzNTYpDQotCQkJCQkgICAgKDI3MzEsIDEyMjcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTcwLCAxMzU2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MzEsIDEyMjcpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEwMjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MiIgQDEwMjQNCi0JCQkJbG9jYXRpb24gICAJKDEyMiwgMTEzNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCMTAyRjgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUzIiBAMTAyNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDI0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMUIiDQotCQkJCQljbGllbnQgICAgIAlAMTAyNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIyLCAxMTM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgNjMxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTAyNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDI0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIzLCAxNTE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUwNDk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjYwMDI1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMjQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDIzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMiwgMTEzNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDE2NDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDI4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MCwgMTU4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4MTE4OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiIEAxMDI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJCXdpZHRoICAgICAgCTUxMw0KLQkJCQloZWlnaHQgICAgIAkxMDANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2NCIgQDEwMzANCi0JCQkJbG9jYXRpb24gICAJKDQ3LCA4ODUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MTUwMTE5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2NSIgQDEwMzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzMA0KLQkJCQkJbG9jYXRpb24gICAJKC0yODksIDgyMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQUIiDQotCQkJCQljbGllbnQgICAgIAlAMTAzMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDcsIDg4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTY0MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTAzMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIsIDE4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIxODU0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQjUiDQotCQkJCQljbGllbnQgICAgIAlAMTAzMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDcsIDg4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTMwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOCwgMTkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3ODgxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDEwMzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjUyLCA4NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJd2lkdGggICAgICAJMzYzDQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEwMzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk0IiBAMTAzNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxOSwgMTAzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFOTAxOEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTUiIEAxMDM4DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzZDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMzcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDM1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxOSwgOTU1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDM5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEwMzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3MzE3MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM4MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDM3DQotCQkJCQlzdXBwbGllciAgIAlAMTAzNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE5LCAxMDM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDExMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzksIDEwMzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDQwODE2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBAMTA0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDE2OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTUsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQl3aWR0aCAgICAgIAk0NjgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTA0Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDM1LCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTA4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkwIiBAMTA0NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1MSwgMTg0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNTAxMTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkxIiBAMTA0NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQ0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI5NywgMjI0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E3MDNCNCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDQ0DQotCQkJCQlzdXBwbGllciAgIAlAMTA0Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTEsIDE4NDApDQotCQkJCQkgICAgKDEyOTQsIDE4NDApDQotCQkJCQkgICAgKDEyOTQsIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTQsIDE3NTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjk3LCAyMjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTcsIDE4MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI2NTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNzAzQzgiDQotCQkJCQljbGllbnQgICAgIAlAMTA0NA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzUxLCAxODQwKQ0KLQkJCQkJICAgICgxNDA5LCAxODQwKQ0KLQkJCQkJICAgICgxNDA5LCAxNzUxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MSwgMTg0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA5LCAxNzUxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYxLCAxODAxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcyODQ4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc0IiBAMTA0OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMTQzMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAwNkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDUwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDkNCi0JCQkJCWxvY2F0aW9uICAgCSg3NzQsIC0xODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYyLCAxNTI1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ0OTc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkwRDYwMzE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNDkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTY0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMTUyNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1NDU0NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzUiIEAxMDUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDkNCi0JCQkJCWxvY2F0aW9uICAgCSg3NzQsIC0xODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQ5LCAxMjY2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkwRDYwMzBFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwNDkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDM2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTIyMykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5MiIgQDEwNTUNCi0JCQkJbG9jYXRpb24gICAJKDE2OTAsIDE2ODQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUQwMzc0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0Q29udGVudHMiIEAxMDU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI2LCAtMTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDE3MzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRDb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMjA1MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDEwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwNTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTAsIDE2ODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0NiwgMTY4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTY0NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk5NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDczMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkzIiBAMTA1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNiwgLTEyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTY2LCAxNjQzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDA2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTAsIDE2ODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzNCwgMTY4NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEAxMDYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjYyNCwgNzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzg4LCA3NDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJCXdpZHRoICAgICAgCTQ5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDEwNjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAzMjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMDgsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJd2lkdGggICAgICAJNDI2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTA2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU3LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcyIiBAMTA2NA0KLQkJCQlsb2NhdGlvbiAgIAkoOTYzLCAzMTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkIwMDNEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTA2NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDY0DQotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDY2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgMzYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgxMDgxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QzAxMTEiDQotCQkJCQljbGllbnQgICAgIAlAMTA2NA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5OSwgMzE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE2LCAyOTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTYzOTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MyIgQDEwNjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA2NA0KLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTUsIDM2MSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4RTZDMDEwNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDY0DQotCQkJCQlzdXBwbGllciAgIAlAMTA2Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MjgsIDMxOSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMTA3MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNjAsIDk5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NCwgOTQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTA3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMiwgMTU5MykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTA3MA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyMzIyLCAxNTkzKQ0KLQkJCQkgICAgKDIzMjIsIDEwNDcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA3Mg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDczDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ2LCA5MDUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjAwMDANCi0JCQkJICAgIGhlaWdodCAgICAgCTUNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJGNTAxM0EiDQotCQkJCWNsaWVudCAgICAgCUAxMDcwDQotCQkJCXN1cHBsaWVyICAgCUAxMDA2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTUwLCA5MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTUwLCA4NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwMDcpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMDc0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA1NzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIDUzMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk2NjINCi0JCQkJaGVpZ2h0ICAgICAJMTEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTgiIEAxMDc1DQotCQkJCWxvY2F0aW9uICAgCSgxNDk4LCAxNDMxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg5MTE0MDFBRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIgQDEwNzYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3NQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDI3LCAxNDcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0Mzg5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTciDQotCQkJCQljbGllbnQgICAgIAlAMTA3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNzANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDk4LCAxNDMxKQ0KLQkJCQkJICAgICgyMjgxLCAxNDMxKQ0KLQkJCQkJICAgICgyMjgxLCAxMDQ3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjgxLCAxMDQ3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjA0LCAxMzk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA1NDE5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTkiIEAxMDc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzUNCi0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgODY2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTUwMDE2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNzUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDc0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ5OCwgMTQzMSkNCi0JCQkJCSAgICAoMTEzMSwgMTQzMSkNCi0JCQkJCSAgICAoMTEzMSwgNjMyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMxLCA2MzIpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEAxMDgxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU1LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTQwNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDEwODINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDg5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNSwgODUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjIiIEAxMDgzDQotCQkJCWxvY2F0aW9uICAgCSg1MzQsIDczNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEAxMDg0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwODMNCi0JCQkJCWxvY2F0aW9uICAgCSg4NiwgLTIxNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMCwgNzQ4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTU1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTExMTExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwODMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUzNCwgNzM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgODQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1OTUsIDgwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NTkyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIzIiBAMTA4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDgzDQotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDY1MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDgzDQotCQkJCQlzdXBwbGllciAgIAlAMTA3NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDYzMikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MiIgQDEwODkNCi0JCQkJbG9jYXRpb24gICAJKDkwMCwgMTAzMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRDAwM0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2VsZWN0b3IiIEAxMDkwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwODkNCi0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEzLCAxMDQyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMjg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwODkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDgxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkwMCwgMTAzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDExMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgMTA0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTg5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQzIiBAMTA5Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDg5DQotCQkJCQlsb2NhdGlvbiAgIAkoODQsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCA5NjgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiDQotCQkJCQljbGllbnQgICAgIAlAMTA4OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgOTUxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ0IiBAMTA5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzAwLCAxMDMyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDAyNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEAxMDk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE2LCAxMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNiwgMTAzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmaWVsZHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTQ3OTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM3OSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDk1DQotCQkJCQlzdXBwbGllciAgIAlAMTA4MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCAxMTEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzEsIDEwNDIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMwNzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0NSIgQDEwOTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTYsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU5LCA5NjgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNjUiDQotCQkJCQljbGllbnQgICAgIAlAMTA5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwMCwgOTUxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBAMTEwMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDc1MiwgMTQ0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTAxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAwLCAxMzk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCXdpZHRoICAgICAgCTUyMg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExMDINCi0JCQkJbG9jYXRpb24gICAJKDU1MCwgMTU5MCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTEwMQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg1NTAsIDE1OTApDQotCQkJCSAgICAoNTUwLCAxNDk1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiIEAxMTAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwNCwgNTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQwLCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJd2lkdGggICAgICAJNTQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEwNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwNiwgNzY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMTAzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE0MDYsIDc2NSkNCi0JCQkJICAgICgxNDA2LCA2MzEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDExMDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxNjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5MywgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDAiIEAxMTA2DQotCQkJCWxvY2F0aW9uICAgCSgxNjE0LCAxODY4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkZEREQ3MDExMyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDEiIEAxMTA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDExMDYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNkIiDQotCQkJCQljbGllbnQgICAgIAlAMTEwNg0KLQkJCQkJc3VwcGxpZXIgICAJQDExMDUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjE0LCAxODY4KQ0KLQkJCQkJICAgICgyNTAwLCAxODY4KQ0KLQkJCQkJICAgICgyNTAwLCAxNzUxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxNCwgMTg2OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAwLCAxNzUxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMTA4DQotCQkJCQlQYXJlbnRfVmlldyAJQDExMDYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxNzg3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk4NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI3NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTA2DQotCQkJCQlzdXBwbGllciAgIAlAMTEwMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MTQsIDE4NjgpDQotCQkJCQkgICAgKDk4NCwgMTg2OCkNCi0JCQkJCSAgICAoOTg0LCAxNDk1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxNCwgMTg2OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODQsIDE0OTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTEwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDE4MjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzEyODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA2IiBAMTExMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjkyNywgMzg3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk4RTM2MDM4NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVDb250ZW50cyIgQDExMTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTExMQ0KLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTE1LCAzNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlQ29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzMwNjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3QyINCi0JCQkJCWNsaWVudCAgICAgCUAxMTExDQotCQkJCQlzdXBwbGllciAgIAlAMTEwMw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDI5MjcsIDM4NykNCi0JCQkJCSAgICAoMTc1MCwgMzg3KQ0KLQkJCQkJICAgICgxNzUwLCA1MjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTI3LCAzODcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNTIxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODA0LCA0MjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTcyNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwNyIgQDExMTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTExMQ0KLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOTQ2LCAxNDQ4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzgwMDcyIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMTENCi0JCQkJCXN1cHBsaWVyICAgCUAxMTA1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjkyNywgMzg3KQ0KLQkJCQkJICAgICgyOTg3LCAzODcpDQotCQkJCQkgICAgKDI5ODcsIDE2NzEpDQotCQkJCQkgICAgKDI5MjgsIDE2NzEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTI3LCAzODcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjkyOCwgMTY3MSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDExMTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5OSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MiIgQDExMTgNCi0JCQkJbG9jYXRpb24gICAJKDE3NTAsIDg3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA0RTAwNjciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMTE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDExMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgNjkxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUxMDM3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMkE1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExMTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTAzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCA2MzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTQsIDY5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNDQ0MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODMiIEAxMTIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDExMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcwOSwgMTA2NSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDI5QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTE4DQotCQkJCQlzdXBwbGllciAgIAlAMTExNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA4NzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgMTExMykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTEyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI3OSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNCIgQDExMjUNCi0JCQkJbG9jYXRpb24gICAJKDEyNTIsIDE4OTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDODcwMjQ3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNSIgQDExMjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyNQ0KLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAyRjkiDQotCQkJCQljbGllbnQgICAgIAlAMTEyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMDUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjUyLCAxODk2KQ0KLQkJCQkJICAgICgyNjAzLCAxODk2KQ0KLQkJCQkJICAgICgyNjAzLCAxNzUxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAzLCAxNzUxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIgQDExMjcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyNQ0KLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjgyLCAxODU4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM4MTE0Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMzAzIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTI0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI1MiwgMTg5NikNCi0JCQkJCSAgICAoNDI4LCAxODk2KQ0KLQkJCQkJICAgICg0MjgsIDEyMjMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUyLCAxODk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQyOCwgMTIyMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgyLCAxODYwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTc1MDMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg2IiBAMTEzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5OSwgMTMyMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzMjAyMjAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODciIEAxMTMxDQotCQkJCQlQYXJlbnRfVmlldyAJQDExMzANCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEMiDQotCQkJCQljbGllbnQgICAgIAlAMTEzMA0KLQkJCQkJc3VwcGxpZXIgICAJQDExMTcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTk5LCAxMzIxKQ0KLQkJCQkJICAgICgxODk3LCAxMzIxKQ0KLQkJCQkJICAgICgxODk3LCAxMjIzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5OSwgMTMyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk3LCAxMjIzKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIgQDExMzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEzMA0KLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5NTY5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEQiDQotCQkJCQljbGllbnQgICAgIAlAMTEzMA0KLQkJCQkJc3VwcGxpZXIgICAJQDExMjQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTk5LCAxMzIxKQ0KLQkJCQkJICAgICg1MDAsIDEzMjEpDQotCQkJCQkgICAgKDUwMCwgMTIyMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTAwLCAxMjIzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODIzMDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAMTEwNQ0KLQkJCQlzdXBwbGllciAgIAlAMTA3MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwNiwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDYsIDE1OTMpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwNzEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzYNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEzNw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCA0OTUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjQzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDY0MjkNCi0JCQkJICAgIGhlaWdodCAgICAgCTYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiDQotCQkJCWNsaWVudCAgICAgCUAxMDc0DQotCQkJCXN1cHBsaWVyICAgCUAxMDEzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTMsIDUyMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1MywgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDE0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlAMTA0Mw0KLQkJCQlzdXBwbGllciAgIAlAMTA3MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwOSwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE1OTMpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwNzEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzkNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE0MA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCAxNTkxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxOQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTgwMzkyDQotCQkJCSAgICBoZWlnaHQgICAgIAkzODUNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiDQotCQkJCWNsaWVudCAgICAgCUAxMDQzDQotCQkJCXN1cHBsaWVyICAgCUAxMTAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ0LCAxNjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0NCwgMTU5MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTY0MDI3OSINCi0JCQkJY2xpZW50ICAgICAJQDEwMTYNCi0JCQkJc3VwcGxpZXIgICAJQDEwMTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NiwgNTIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwMTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTQyDQotCQkJCWxvY2F0aW9uICAgCSg0MzEsIDIyMikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTAyOQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0MzEsIDIyMikNCi0JCQkJICAgICg0MzEsIDEzMCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQzDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNDQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2MSwgMjI0KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTc2NzQ0DQotCQkJCSAgICBoZWlnaHQgICAgIAk4Ng0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjQ0MDA2OSINCi0JCQkJY2xpZW50ICAgICAJQDEwMTMNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3NSwgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc1LCAyMjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDExNDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMzA5LCA0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTMwOSwgNDY1KQ0KLQkJCQkgICAgKDEzMDksIDM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ2DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNDcNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk0MSwgNDk1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDY0Mjg2DQotCQkJCSAgICBoZWlnaHQgICAgIAkxMA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTY2MDMzOSINCi0JCQkJY2xpZW50ICAgICAJQDEwNzQNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzMSwgNTIwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTMxLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExNDUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciDQotCQkJCWNsaWVudCAgICAgCUAxMDIzDQotCQkJCXN1cHBsaWVyICAgCUAxMTAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTAsIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAsIDE1OTApDQotCQkJCWRyYXdTdXBwbGllciAJQDExMDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDkNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE1MA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIwNSwgNDkzKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTU4MzMzDQotCQkJCSAgICBoZWlnaHQgICAgIAk4DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjEwM0JFIg0KLQkJCQljbGllbnQgICAgIAlAMTAzNg0KLQkJCQlzdXBwbGllciAgIAlAMTA2Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1MQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUyDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTUxLCA5MDUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDg5ODANCi0JCQkJICAgIGhlaWdodCAgICAgCTczDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRUIwMkE4Ig0KLQkJCQljbGllbnQgICAgIAlAMTExNw0KLQkJCQlzdXBwbGllciAgIAlAMTAwNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg3OCwgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzgsIDg2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAwNykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1Mw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU0DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQyLCA4MDcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkzMTANCi0JCQkJICAgIGhlaWdodCAgICAgCTYxDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwM0EwMjIxIg0KLQkJCQljbGllbnQgICAgIAlAMTExNw0KLQkJCQlzdXBwbGllciAgIAlAMTEwMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMywgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDMsIDc2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1NQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU2DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzU0LCA4MDEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3MzcwMzhGIg0KLQkJCQljbGllbnQgICAgIAlAMTAzNQ0KLQkJCQlzdXBwbGllciAgIAlAMTEwMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI4NCwgODM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NCwgNzY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTU3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNjQwMjQwIg0KLQkJCQljbGllbnQgICAgIAlAMTAwNQ0KLQkJCQlzdXBwbGllciAgIAlAMTA2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4NCwgNzYyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3OSwgNzYyKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiINCi0JCQkJY2xpZW50ICAgICAJQDEwMDQNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDUyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDEwNjENCi0JCQkJc3VwcGxpZXIgICAJQDEwMDQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDcyOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDYzMSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiDQotCQkJCWNsaWVudCAgICAgCUAxMDA2DQotCQkJCXN1cHBsaWVyICAgCUAxMDYyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUwLCA1MjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTUwLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExNDUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNjENCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE2Mg0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgyMSwgODk3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE4MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDg3NzE5DQotCQkJCSAgICBoZWlnaHQgICAgIAk3Ng0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTRGMDIzQyINCi0JCQkJY2xpZW50ICAgICAJQDEwMDMNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4OTYsIDkzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4OTYsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2Mw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY0DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzEzLCA5MDQpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTA2MjINCi0JCQkJICAgIGhlaWdodCAgICAgCTY4DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRTIwMzgxIg0KLQkJCQljbGllbnQgICAgIAlAMTAxNQ0KLQkJCQlzdXBwbGllciAgIAlAMTAwNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM4MSwgMTEwOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzODEsIDg2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAwNykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2NQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY2DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyODc4LCAyNjkpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDY2NjcNCi0JCQkJICAgIGhlaWdodCAgICAgCTY2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyNTUwMzg1Ig0KLQkJCQljbGllbnQgICAgIAlAMTAxNQ0KLQkJCQlzdXBwbGllciAgIAlAMTAyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjk0MywgMTEwOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5NDMsIDIyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSINCi0JCQkJY2xpZW50ICAgICAJQDExMjQNCi0JCQkJc3VwcGxpZXIgICAJQDEwMTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ2MiwgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ2MiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDE0KSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjkuIENvbmNyZXRlIFNjaGVtYSBDb21wb3NpdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0MyNUVCN0EwMzhDIg0KLQkJCXRpdGxlICAgICAgCSI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDExNjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDE1MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ5MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNCIgQDExNjkNCi0JCQkJbG9jYXRpb24gICAJKDIyOCwgMTY5NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFNjAyNTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI1IiBAMTE3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTY5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ3NiwgLTM4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3LCAxNjIzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMkY3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExNjkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTY4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjI4LCAxNjk1KQ0KLQkJCQkJICAgICgxNzUsIDE2OTUpDQotCQkJCQkgICAgKDE3NSwgMTU5MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOCwgMTY5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUsIDE1OTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iIEAxMTcyDQotCQkJCQlQYXJlbnRfVmlldyAJQDExNjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMjksIDE3NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS45MjQ1MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MUVBMDMwQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTY5DQotCQkJCQlzdXBwbGllciAgIAlAMTE2OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIyOCwgMTY5NSkNCi0JCQkJCSAgICAoMjgxLCAxNjk1KQ0KLQkJCQkJICAgICgyODEsIDE1OTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxLCAxNTkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjksIDE2NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDU3MTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAxMTc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgMTUzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc5MCwgMTQ5MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUxOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYwIiBAMTE3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoOTUyLCAxNjk4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ1MDM5OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjEiIEAxMTc3DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTI4OCwgLTMxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODYwLCAxNjIzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzhBIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNzYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTUyLCAxNjk4KQ0KLQkJCQkJICAgICg5MDEsIDE2OTgpDQotCQkJCQkgICAgKDkwMSwgMTU5MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTY5OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDE1OTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExNzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDIwLCAxNzM5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTU2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4zMjY5MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ5MDM5RSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTc2DQotCQkJCQlzdXBwbGllciAgIAlAMTE3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDk1MiwgMTY5OCkNCi0JCQkJCSAgICAoMTAwNCwgMTY5OCkNCi0JCQkJCSAgICAoMTAwNCwgMTU5MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTY5OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA0LCAxNTkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NTIsIDE2NDkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDExODINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NTYsIDk5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDIwLCA5NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJCXdpZHRoICAgICAgCTQ5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAMTE4Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MTIsIDczNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQl3aWR0aCAgICAgIAk0NzUNCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDExODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDQxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NiwgMjg1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTQwNg0KLQkJCQloZWlnaHQgICAgIAkyODcNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI0IiBAMTE4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMwMywgNjc5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEAxMTg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDExODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDEsIC04NTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTksIDM4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDAzODQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTg1DQotCQkJCQlzdXBwbGllciAgIAlAMTE4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMDMsIDY3OSkNCi0JCQkJCSAgICAoMTMwMywgNDE5KQ0KLQkJCQkJICAgICg4NDMsIDQxOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDQxOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTIyLCA0NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTA3NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNSIgQDExODkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0NSwgOTU2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTMwMywgNjc5KQ0KLQkJCQkJICAgICgxMzAzLCA5OTcpDQotCQkJCQkgICAgKDkwMSwgOTk3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwMywgNjc5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMSwgOTk3KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIyIiBAMTE5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgNjQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQ0M3MDBFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZFNjaGVtYSIgQDExOTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5MQ0KLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzgsIDUwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMTkyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIg0KLQkJCQkJY2xpZW50ICAgICAJQDExOTENCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQ0KLQkJCQkJICAgICgxMjE2LCA1MzQpDQotCQkJCQkgICAgKDg0MywgNTM0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxNiwgNjQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNTM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjYsIDU3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzMTY0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIzIiBAMTE5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkxDQotCQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAtMTM5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc0LCA3NTYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiDQotCQkJCQljbGllbnQgICAgIAlAMTE5MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExODMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjE2LCA2NDkpDQotCQkJCQkgICAgKDEyMTYsIDc5NykNCi0JCQkJCSAgICAoODc3LCA3OTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc3LCA3OTcpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjgiIEAxMTk3DQotCQkJCWxvY2F0aW9uICAgCSg2NjIsIDY0MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBNjAxMzEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNpbmdEaXJlY3RpdmVzIiBAMTE5OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTk3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDY3NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2luZ0RpcmVjdGl2ZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MDg3NTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzEiDQotCQkJCQljbGllbnQgICAgIAlAMTE5Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDExODMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYyLCA3MjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjAwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNSwgNjc4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDMwNjU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjkiIEAxMjAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjM0LCAxMTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYyMSwgNTc2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTkwMzcwIg0KLQkJCQkJY2xpZW50ICAgICAJQDExOTcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MiwgNjQyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNTU5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMwIiBAMTIwMw0KLQkJCQlsb2NhdGlvbiAgIAkoNzUsIDE4OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGMDAwNUUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMxIiBAMTIwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjAzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMUUiDQotCQkJCQljbGllbnQgICAgIAlAMTIwMw0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NSwgMTg4KQ0KLQkJCQkJICAgICg3NSwgMTI4KQ0KLQkJCQkJICAgICg1MTAsIDEyOCkNCi0JCQkJCSAgICAoNTEwLCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgMjczKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RWZXJzaW9uIiBAMTIwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjAzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCA3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VmVyc2lvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC41OTM3NTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMjgiDQotCQkJCQljbGllbnQgICAgIAlAMTIwMw0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NSwgMTg4KQ0KLQkJCQkJICAgICg3NSwgMzgwKQ0KLQkJCQkJICAgICg0MzcsIDM4MCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAxODgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAzODApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMzI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc0NzU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMiIgQDEyMDgNCi0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDEzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwQjAxMUIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMzIiBAMTIwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjA4DQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRDBGMDEyMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjA4DQotCQkJCQlzdXBwbGllciAgIAlAMTE4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNjIsIDEzNCkNCi0JCQkJCSAgICAoNzY2LCAxMzQpDQotCQkJCQkgICAgKDc2NiwgMjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMTM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2NiwgMjczKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm9yaWdpbmFsVmVyc2lvbiIgQDEyMTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwOA0KLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgLTM2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2NCwgOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JpZ2luYWxWZXJzaW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjY1MDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTJCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2MiwgMTM0KQ0KLQkJCQkJICAgICgxMzIyLCAxMzQpDQotCQkJCQkgICAgKDEzMjIsIDMzNCkNCi0JCQkJCSAgICAoODQzLCAzMzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCAzMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxOSwgMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4MTA4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzNCIgQDEyMTMNCi0JCQkJbG9jYXRpb24gICAJKDEyNiwgNjU2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVFRUFCMDAxRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzUiIEAxMjE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUYwMTBCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2LCA2NTYpDQotCQkJCQkgICAgKDUxMywgNjU2KQ0KLQkJCQkJICAgICg1MTMsIDU1OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMywgNTU5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFZlcnNpb25zIiBAMTIxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzNCwgMTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcsIDQzMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRWZXJzaW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzkwMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUYwMTE1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2LCA2NTYpDQotCQkJCQkgICAgKDY2LCA2NTYpDQotCQkJCQkgICAgKDY2LCA0NzIpDQotCQkJCQkgICAgKDQzNywgNDcyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2LCA2NTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCA0NzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM1NiwgNTI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY4NDY4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzOCIgQDEyMTgNCi0JCQkJbG9jYXRpb24gICAJKDY0MiwgMTI2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc4NDczMDE5NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzkiIEAxMjE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTgNCi0JCQkJCWxvY2F0aW9uICAgCSg4MiwgLTQxOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3NTAxRjEiDQotCQkJCQljbGllbnQgICAgIAlAMTIxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2NDIsIDEyNikNCi0JCQkJCSAgICAoNTg4LCAxMjYpDQotCQkJCQkgICAgKDU4OCwgMjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg4LCAyNzMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hRm9yU2NoZW1hIiBAMTIyMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjE4DQotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYzOSwgNzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hRm9yU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA1NTU1Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjQyLCAxMjYpDQotCQkJCQkgICAgKDY5NywgMTI2KQ0KLQkJCQkJICAgICg2OTcsIDI3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY0MiwgMTI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY5NywgMjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDIxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMTg2Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyMjMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiDQotCQkJCWNsaWVudCAgICAgCUAxMTgyDQotCQkJCXN1cHBsaWVyICAgCUAxMTgzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzgsIDkzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYzOCwgODQzKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTIyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY3LCAxMTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDkyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3OCIgQDEyMjUNCi0JCQkJbG9jYXRpb24gICAJKDIzNCwgMTM0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2QjAxOTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzkiIEAxMjI2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzEwLCAtNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwLCAxMjcxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkQwMzA5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0LCAxMzQwKQ0KLQkJCQkJICAgICgxODEsIDEzNDApDQotCQkJCQkgICAgKDE4MSwgMTIzOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgMTM0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEsIDEyMzkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyMjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIyNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzMsIDEzODkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjg2NzkyNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkQwMzEzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0LCAxMzQwKQ0KLQkJCQkJICAgICgyODcsIDEzNDApDQotCQkJCQkgICAgKDI4NywgMTIzOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgMTM0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODcsIDEyMzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgMTI5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0Mjk0NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEyMzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYwLCAxNDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxMDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTIzMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5OSwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJd2lkdGggICAgICAJMjQ0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTIiIEAxMjMzDQotCQkJCWxvY2F0aW9uICAgCSgxNjY4LCAyODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUUwMUNDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxMyIgQDEyMzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIzMw0KLQkJCQkJbG9jYXRpb24gICAJKDgsIC0xNTIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTBGIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjMxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY4LCAxOTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljRmFjZXRzIiBAMTIzNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzDQotCQkJCQlsb2NhdGlvbiAgIAkoOCwgLTE1MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1MiwgMzAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY0ZhY2V0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI0NjE1NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEFGMDExQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzDQotCQkJCQlzdXBwbGllciAgIAlAMTIzMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY4LCAyODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMzYxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjI1LCAzMDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzY5MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMjM4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNiwgOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMjM5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgNjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNSwgNTk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTU0MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzE0IiBAMTI0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwOCwgNzkyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQzMDI4RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTUiIEAxMjQxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIsIC0yODApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDQwMkYzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyNDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjM5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDgsIDc5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA2OTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljUGFydGljbGUiIEAxMjQyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIsIC0yODApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDc2NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNQYXJ0aWNsZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yNTkyNTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRkQiDQotCQkJCQljbGllbnQgICAgIAlAMTI0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMzgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwOCwgNzkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDgsIDg4OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ1NCwgODI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk1MDYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTAiIEAxMjQ2DQotCQkJCWxvY2F0aW9uICAgCSg5MTksIDEzNDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNUUwMUY5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkxIiBAMTI0Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTIzMywgLTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjUsIDEyNzMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2MjAwNDYiDQotCQkJCQljbGllbnQgICAgIAlAMTI0Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNDUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MTksIDEzNDkpDQotCQkJCQkgICAgKDg2NiwgMTM0OSkNCi0JCQkJCSAgICAoODY2LCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTE5LCAxMzQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTIzOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0yMzMsIC01OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTkzLCAxMzkzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzc3MzU4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2MjAwNTAiDQotCQkJCQljbGllbnQgICAgIAlAMTI0Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNDUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MTksIDEzNDkpDQotCQkJCQkgICAgKDk3MywgMTM0OSkNCi0JCQkJCSAgICAoOTczLCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTE5LCAxMzQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk3MywgMTIzOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAxMjk2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAxNDkyNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDEyNTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTUyLCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODE2LCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxNiIgQDEyNTMNCi0JCQkJbG9jYXRpb24gICAJKDIwMjUsIDc5MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREOTAxRjYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzE3IiBAMTI1NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUzDQotCQkJCQlsb2NhdGlvbiAgIAkoMTUzLCAtMjgwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNERBMDI4NCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjUzDQotCQkJCQlzdXBwbGllciAgIAlAMTIzOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgNjk1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1dpbGRjYXJkIiBAMTI1NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUzDQotCQkJCQlsb2NhdGlvbiAgIAkoMTUzLCAtMjgwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODI2LCA4MzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40ODgwOTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyOEUiDQotCQkJCQljbGllbnQgICAgIAlAMTI1Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNTINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAyNSwgNzkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjUsIDg4OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5OCwgODQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA2MTczDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxOCIgQDEyNTgNCi0JCQkJbG9jYXRpb24gICAJKDE3NTQsIDExNzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY4RkYwMUJGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxOSIgQDEyNTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI1OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xOTgsIDIzNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRDNjkwMjAzMTciDQotCQkJCQljbGllbnQgICAgIAlAMTI1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNDUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NCwgMTE3OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzAxLCAxMTc4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1dpbGRjYXJkIiBAMTI2MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5OCwgMjM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMjYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTYzMzU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRDNjkwMjAzMTgiDQotCQkJCQljbGllbnQgICAgIAlAMTI1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzU0LCAxMTc4KQ0KLQkJCQkJICAgICgyMDI4LCAxMTc4KQ0KLQkJCQkJICAgICgyMDI4LCA5OTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjgsIDk5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MiwgMTA5OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MzY2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMTAuIERpYWdub3N0aWNzIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNUYwODAzRTIiDQotCQkJdGl0bGUgICAgICAJIjEwLiBEaWFnbm9zdGljcyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NTm9kZSIgQDEyNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDEwMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgOTkwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2NEE1MDExNyINCi0JCQkJd2lkdGggICAgICAJNjg2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljU2V2ZXJpdHkiIEAxMjY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgNjU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA1NDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpY1NldmVyaXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOCwgNDk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjhBNzAzMkYiDQotCQkJCXdpZHRoICAgICAgCTQ2Mg0KLQkJCQloZWlnaHQgICAgIAkzNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTI2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU5LCA2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4OTYsIDExMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTQwLCA2MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MTMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCXdpZHRoICAgICAgCTczMQ0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyNjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDYwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY0LCA0MDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpYyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJCXdpZHRoICAgICAgCTY1OA0KLQkJCQloZWlnaHQgICAgIAk0MzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIwIiBAMTI2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAyODMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzEwMzVGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMSIgQDEyNjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI2OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjY4DQotCQkJCQlzdXBwbGllciAgIAlAMTI2NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQsIDI4MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQsIDE3NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbGxEaWFnbm9zdGljcyIgQDEyNzANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI2OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDksIDMzMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbGxEaWFnbm9zdGljcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0ODU5OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE2NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjY4DQotCQkJCQlzdXBwbGllciAgIAlAMTI2Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQsIDI4MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQsIDM5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTYsIDMyNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDU2MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTYiIEAxMjczDQotCQkJCWxvY2F0aW9uICAgCSgxMDI4LCA0NDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMjcwM0NEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNyIgQDEyNzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zOTYsIC03MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyQjAwNjEiDQotCQkJCQljbGllbnQgICAgIAlAMTI3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyOCwgNDQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcxMywgNDQwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbXBvbmVudHMiIEAxMjc1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzOCwgMjMwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBvbmVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjkxODENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyQjAwNkMiDQotCQkJCQljbGllbnQgICAgIAlAMTI3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDI4LCA0NDApDQotCQkJCQkgICAgKDEwODgsIDQ0MCkNCi0JCQkJCSAgICAoMTA4OCwgMTc0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyOCwgNDQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODgsIDE3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMjMyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODIzODQ4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxOCIgQDEyNzgNCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMjgyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2MjY5MDE2NSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTkiIEAxMjc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgMjgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMTc0KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRpYWdub3N0aWNzIiBAMTI4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjc4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAtMjc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDMzMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitkaWFnbm9zdGljcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MjYzMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjZBMDAyNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjc4DQotCQkJCQlzdXBwbGllciAgIAlAMTI2Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODgsIDM5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ1LCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTQ3MzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjgzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QzBGNEMwMUExIg0KLQkJCQljbGllbnQgICAgIAlAMTI2Nw0KLQkJCQlzdXBwbGllciAgIAlAMTI2Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAzOTApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDE3NCkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMTEuIFN1cHBsZW1lbnRhbCINCi0JCQlxdWlkICAgICAgIAkiM0MyODdFNDkwMTlCIg0KLQkJCXRpdGxlICAgICAgCSIxMS4gU3VwcGxlbWVudGFsIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMjg0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDY0LCA4MTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNzYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTgzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTg1Mg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjg1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjExMiwgODgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMSwgODI0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNzgwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDEyODYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxMTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCA2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCXdpZHRoICAgICAgCTQ5OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM4NCwgMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIzNiwgNjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpYyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQyIiBAMTI4OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgODQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzUwMTM3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1hcnlDb21wb25lbnQiIEAxMjg5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTYsIDExNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltYXJ5Q29tcG9uZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQwODI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNzAxMTMiDQotCQkJCQljbGllbnQgICAgIAlAMTI4OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM3LCA4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjI0LCA1NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NzI2MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQzIiBAMTI5Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjg4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1MCwgLTUwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1OCwgMTI2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEyIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyODgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjg3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjcsIDg0KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTI5NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA2ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzc4LCA2MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDY2NykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTc2NA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGVsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSA6IGJvb2xlYW4iDQotCQkJCQkiKyBjaXJjdWxhciA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJNzgyDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDEyOTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMTA3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgOTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDAsIDEwNTEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTkNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBmYWNldE5hbWUgOiBTdHJpbmciDQotCQkJCQkiKyBlZmZlY3RpdmVWYWx1ZSA6IFZhbHVlIikpDQotCQkJCXdpZHRoICAgICAgCTQ1OA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAxMjk2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgNjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDU2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNjI4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODA1DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTgyMA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEAxMjk3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDI4OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNSwgMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDIxNykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Mg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGFsaWFzTmFtZSA6IFN0cmluZyINCi0JCQkJCSIrIHVSSSA6IFN0cmluZyINCi0JCQkJCSIrIGFsaWFzVVJJIDogU3RyaW5nIg0KLQkJCQkJIisgcU5hbWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNDcyDQotCQkJCWhlaWdodCAgICAgCTI4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDEyOTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDM1MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDI5NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU2Mg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTI5OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA1MTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEyOTgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMzIwLCA1MTApDQotCQkJCSAgICAoMzIwLCA0MjApKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTMwMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCINCi0JCQkJY2xpZW50ICAgICAJQDEyOTYNCi0JCQkJc3VwcGxpZXIgICAJQDEyOTgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxLCA1NTYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MSwgNTEwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjk5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMzAxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzgwMEQyIg0KLQkJCQljbGllbnQgICAgIAlAMTI4NA0KLQkJCQlzdXBwbGllciAgIAlAMTI5OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODc3LCA3NDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDUxMCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI5OSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IiBAMTMwMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxODA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMSwgMTc2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhJbmNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiDQotCQkJCXdpZHRoICAgICAgCTQ1Ng0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiIEAxMzAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTc3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxNzI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSINCi0JCQkJd2lkdGggICAgICAJNDkzDQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCIgQDEzMDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxOTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE4ODkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRXhjbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIg0KLQkJCQl3aWR0aCAgICAgIAk0OTMNCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBAMTMwNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzA0LCAxOTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3MywgMTkxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhFeGNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIgQDEzMDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzQsIDEzNzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTQyMg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBAMTMwNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2MywgMTIxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIgQDEzMDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCAxMzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDEzNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCINCi0JCQkJd2lkdGggICAgICAJMzgwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROdW1lcmljRmFjZXQiIEAxMzA5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTIzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5LCAxMTc4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJCXdpZHRoICAgICAgCTQwMA0KLQkJCQloZWlnaHQgICAgIAkxMzINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEAxMzEwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE2MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE1MzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNSwgMTU5NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iDQotCQkJCQkiKyBleGNsdXNpdmUgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTQyMA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IiBAMTMxMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyMjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzExDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjIzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCQl3aWR0aCAgICAgIAk0NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxMzEyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDI2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc0LCAyNTcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQl3aWR0aCAgICAgIAk0NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDEzMTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMjEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOTYsIDIwNzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGF0dGVybkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQkJd2lkdGggICAgICAJMzYyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IiBAMTMxNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIwOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgMjA0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbnVtZXJhdGlvbkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQkJd2lkdGggICAgICAJNDU4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIgQDEzMTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAyMjcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDIyMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCQl3aWR0aCAgICAgIAkzNTgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IiBAMTMxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE1ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAxNTAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAxNTYzKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA1DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgaW5jbHVzaXZlIDogYm9vbGVhbiINCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIgQDEzMTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMjQ2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMTEsIDI0MTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IiBAMTMxOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOSwgMjM5NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5MZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCXdpZHRoICAgICAgCTQyMA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDEzMTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAyNjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDI1NTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVG90YWxEaWdpdHNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJCXdpZHRoICAgICAgCTQyMg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTMyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDExNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NjcsIDExMDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEzMjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMDcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAsIDEwMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTMyMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzA0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMTM2NCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIHZhbGlkRmFjZXRzIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTU5NA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU0IiBAMTMyMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0NiwgMTIxOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NDAzMEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVEZWZpbml0aW9uIiBAMTMyNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIzDQotCQkJCQlsb2NhdGlvbiAgIAkoNTgyLCAtNzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODAsIDExNzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTMuMjY4MjkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NzAwREQiDQotCQkJCQljbGllbnQgICAgIAlAMTMyMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDQ2LCAxMjE4KQ0KLQkJCQkJICAgICgxNDg3LCAxMjE4KQ0KLQkJCQkJICAgICgxNDg3LCAxMjkyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxMjkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM5LCAxMjU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE4NDIxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU1IiBAMTMyNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIzDQotCQkJCQlsb2NhdGlvbiAgIAkoNTgyLCAtNzgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEU3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ0NiwgMTIxOCkNCi0JCQkJCSAgICAoMTQwNSwgMTIxOCkNCi0JCQkJCSAgICAoMTQwNSwgMTI5MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NDYsIDEyMTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNSwgMTI5MikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1OCIgQDEzMjgNCi0JCQkJbG9jYXRpb24gICAJKDE3MzMsIDE1NzUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEQwMjUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1OSIgQDEzMjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMyOA0KLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RTAwOTEiDQotCQkJCQljbGllbnQgICAgIAlAMTMyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzMzLCAxNTc1KQ0KLQkJCQkJICAgICgxNDg3LCAxNTc1KQ0KLQkJCQkJICAgICgxNDg3LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczMywgMTU3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEZhY2V0IiBAMTMzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI4DQotCQkJCQlsb2NhdGlvbiAgIAkoOTE3LCA3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzUxLCAxNTQxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ2MjQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RTAwOUIiDQotCQkJCQljbGllbnQgICAgIAlAMTMyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczMywgMTU3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI2LCAxNTc1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDQyLCAxNTM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5MTU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2MCIgQDEzMzMNCi0JCQkJbG9jYXRpb24gICAJKDE1ODcsIDE3OTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUIwMzk2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MSIgQDEzMzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzMw0KLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEFDMDNDOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzMzDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1ODcsIDE3OTMpDQotCQkJCQkgICAgKDE0NDcsIDE3OTMpDQotCQkJCQkgICAgKDE0NDcsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NDcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4SW5jbHVzaXZlRmFjZXQiIEAxMzM1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzMNCi0JCQkJCWxvY2F0aW9uICAgCSg3MDcsIC0zMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNywgMTc1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhJbmNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODQ0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0Q0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODcsIDE3OTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MiwgMTc5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyMCwgMTc1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1OTE1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjIiIEAxMzM4DQotCQkJCWxvY2F0aW9uICAgCSg5MzcsIDE3ODcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUYwMzM4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MyIgQDEzMzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzOA0KLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMUY5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTM3LCAxNzg3KQ0KLQkJCQkJICAgICg5OTcsIDE3ODcpDQotCQkJCQkgICAgKDk5NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluSW5jbHVzaXZlRmFjZXQiIEAxMzQwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzgNCi0JCQkJCWxvY2F0aW9uICAgCSg2MTcsIC01KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTIsIDE3NDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNDYwNjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEIwMDIwMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzM4DQotCQkJCQlzdXBwbGllciAgIAlAMTMwMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDE3ODcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTE4LCAxNzg3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzUsIDE3NDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM5NjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY0IiBAMTM0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoOTgxLCAxOTM3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEIzMDIwNyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjUiIEAxMzQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDMNCi0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOTAiDQotCQkJCQljbGllbnQgICAgIAlAMTM0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5ODEsIDE5MzcpDQotCQkJCQkgICAgKDEwNDEsIDE5MzcpDQotCQkJCQkgICAgKDEwNDEsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODEsIDE5MzcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA0MSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5FeGNsdXNpdmVGYWNldCIgQDEzNDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0Mw0KLQkJCQkJbG9jYXRpb24gICAJKDY3NywgLTc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjMsIDE5MDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRXhjbHVzaXZlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNDEyNTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI0MDE5QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQzDQotCQkJCQlzdXBwbGllciAgIAlAMTMwNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODEsIDE5MzcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTE4LCAxOTM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODksIDE4OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDY2NTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY2IiBAMTM0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OSwgMTk1MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNjAyOEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY3IiBAMTM0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjcwMjE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ2OSwgMTk1MykNCi0JCQkJCSAgICAoMTQwMCwgMTk1MykNCi0JCQkJCSAgICAoMTQwMCwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwMCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhFeGNsdXNpdmVGYWNldCIgQDEzNTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0OA0KLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgLTk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ2LCAxOTEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM4NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjk4MDk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMjEiDQotCQkJCQljbGllbnQgICAgIAlAMTM0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OSwgMTk1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY0LCAxOTUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTYxLCAxOTEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODI3MjM2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2OCIgQDEzNTMNCi0JCQkJbG9jYXRpb24gICAJKDExMjIsIDIxODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMDUxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2OSIgQDEzNTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNDYiDQotCQkJCQljbGllbnQgICAgIAlAMTM1Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTIyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImxlbmd0aEZhY2V0IiBAMTM1NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzUzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxOCwgNjI4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDQsIDIyMDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzU0NzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDI1MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzUzDQotCQkJCQlzdXBwbGllciAgIAlAMTMxNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExMjIsIDIxODApDQotCQkJCQkgICAgKDExMjIsIDIyNDApDQotCQkJCQkgICAgKDM4NywgMjI0MCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIxODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzg3LCAyMjQwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NzEsIDIyMDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU1OTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcyIiBAMTM1OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4NCwgMTk4OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMjAyMUQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjczIiBAMTM1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzODAsIDQzNykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMzAwQUIiDQotCQkJCQljbGllbnQgICAgIAlAMTM1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMTk4OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg0LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVudW1lcmF0aW9uRmFjZXRzIiBAMTM2MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzODAsIDQzNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM3LCAyMDE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VudW1lcmF0aW9uRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDY1ODU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMzAwQUMiDQotCQkJCQljbGllbnQgICAgIAlAMTM1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDg0LCAxOTg5KQ0KLQkJCQkJICAgICgxMDg0LCAyMDQ5KQ0KLQkJCQkJICAgICg0ODUsIDIwNDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ4NSwgMjA0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTgzLCAyMDIxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODUxMjkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3NCIgQDEzNjMNCi0JCQkJbG9jYXRpb24gICAJKDE0NTEsIDIwNzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzUwMTU5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3NSIgQDEzNjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTI1LCA1MzgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzYwMEIwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ1MSwgMjA3NCkNCi0JCQkJCSAgICAoMTM2MiwgMjA3NCkNCi0JCQkJCSAgICAoMTM2MiwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXR0ZXJuRmFjZXRzIiBAMTM2NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyMCwgMjAzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXR0ZXJuRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3MjIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQkEiDQotCQkJCQljbGllbnQgICAgIAlAMTM2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MSwgMjA3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMDc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTcyLCAyMDM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA4NjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3NiIgQDEzNjgNCi0JCQkJbG9jYXRpb24gICAJKDE4MjcsIDE0MDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzgwMkE3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3NyIgQDEzNjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFFQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzY4DQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI3LCAxNDAwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjksIDE0MDApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY2FyZGluYWxpdHlGYWNldCIgQDEzNzANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODQ3LCAxMzU4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NhcmRpbmFsaXR5RmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzE3MzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFGNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzY4DQotCQkJCQlzdXBwbGllciAgIAlAMTMwNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI3LCAxNDAwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjUsIDE0MDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODMsIDEzNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM0MjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg2IiBAMTM3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMjQxMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQjAzNzciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg3IiBAMTM3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTc4NiwgMzAxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERDMDM1QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzczDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnJhY3Rpb25EaWdpdHNGYWNldCIgQDEzNzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwOCwgMjU1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM3MzkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNjQiDQotCQkJCQljbGllbnQgICAgIAlAMTM3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAyNDEzKQ0KLQkJCQkJICAgICgxMjYyLCAyNTk2KQ0KLQkJCQkJICAgICgyMDY1LCAyNTk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNTk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTc5LCAyNTU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzODg2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5MCIgQDEzNzgNCi0JCQkJbG9jYXRpb24gICAJKDE4NDEsIDEzMDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTMwMEQ5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5MSIgQDEzNzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM4RSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzc4DQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODQxLCAxMzA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjksIDEzMDYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYm91bmRlZEZhY2V0IiBAMTM4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMzUsIC03OTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzIsIDEyNzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYm91bmRlZEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAzMTc0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTQwMzk4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE1NCwgMTMwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NywgMTI3NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1NDcxNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzAiIEAxMzgzDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMTg2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJGMDE4QyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzEiIEAxMzg0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjQwLCA2MzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzAwMDZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzODMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ3aGl0ZVNwYWNlRmFjZXQiIEAxMzg1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjQwLCA2MzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzMsIDIyMDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrd2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkwOTA5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNzUiDQotCQkJCQljbGllbnQgICAgIAlAMTM4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzI4LCAyMTg2KQ0KLQkJCQkJICAgICgxMzI4LCAyMjQ2KQ0KLQkJCQkJICAgICgyMDkzLCAyMjQ2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjE4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMjQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDMzLCAyMjAzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI2NzYzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4OCIgQDEzODgNCi0JCQkJbG9jYXRpb24gICAJKDY3NCwgMTM5MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAwNDgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg5IiBAMTM4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0I5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzODgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY3NCwgMTM5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzUsIDEzOTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JkZXJlZEZhY2V0IiBAMTM5MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY1OCwgMTM1MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitvcmRlcmVkRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjE1MzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDNDMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzg4DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE0LCAxMzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIDEzNTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzQ2MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc4IiBAMTM5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAxMjk2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENCMDM5QyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzkiIEAxMzk0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgwOSwgLTU3NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQzAzRDAiDQotCQkJCQljbGllbnQgICAgIAlAMTM5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTI5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJudW1lcmljRmFjZXQiIEAxMzk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgwOSwgLTU3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY4LCAxMjU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK251bWVyaWNGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4MDk3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4NywgMTI5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDAsIDEyOTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwNiwgMTI2MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjg0Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTIiIEAxMzk4DQotCQkJCWxvY2F0aW9uICAgCSgxNjg5LCAxNjYyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ0MDFFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTMiIEAxMzk5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgzLCAtMzU0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ1MDM2MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzk4DQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2ODksIDE2NjIpDQotCQkJCQkgICAgKDE0ODcsIDE2NjIpDQotCQkJCQkgICAgKDE0ODcsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjg5LCAxNjYyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWF4RmFjZXQiIEAxNDAwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgzLCAtMzU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzY5LCAxNjIzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyMDUxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNkEiDQotCQkJCQljbGllbnQgICAgIAlAMTM5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI2LCAxNjYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDQ0LCAxNjI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE1Mzg1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NCIgQDE0MDMNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NEYwMTQ1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5NSIgQDE0MDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtNDYyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNTUwMDM4QyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDAzDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMjU4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IiBAMTQwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDAzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDIyODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA4NTQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOTYiDQotCQkJCQljbGllbnQgICAgIAlAMTQwMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzI4LCAyMjU4KQ0KLQkJCQkJICAgICgxMzI4LCAyMzI0KQ0KLQkJCQkJICAgICgyMDkzLCAyMzI0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMzI0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA5LCAyMjkzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4ODE3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NiIgQDE0MDgNCi0JCQkJbG9jYXRpb24gICAJKDEyOTcsIDIzNjYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzQwMTFDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5NyIgQDE0MDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwOA0KLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjBEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIgQDE0MTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwOA0KLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTcsIDI0NjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjY5MDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNUM1MDIxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDA4DQotCQkJCQlzdXBwbGllciAgIAlAMTMxNw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyOTcsIDIzNjYpDQotCQkJCQkgICAgKDEyOTcsIDI0OTkpDQotCQkJCQkgICAgKDIxMDIsIDI0OTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzY2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDIsIDI0OTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDcsIDI0NzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk4IiBAMTQxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMjQ0OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQTAwQUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk5IiBAMTQxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNzAsIC04MTUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkIwMTM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTQxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNzAsIC04MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDAsIDI2MzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4NTMxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkIwMTQyIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2MiwgMjQ0OSkNCi0JCQkJCSAgICAoMTI2MiwgMjY2OCkNCi0JCQkJCSAgICAoMjA2NSwgMjY2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NSwgMjY2OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4OSwgMjYyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNjQ4NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDAiIEAxNDE4DQotCQkJCWxvY2F0aW9uICAgCSgxNDIyLCAyMTU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNkIwMDNBNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDEiIEAxNDE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzcwLCAtMTMxMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTEiDQotCQkJCQljbGllbnQgICAgIAlAMTQxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDIyLCAyMTU5KQ0KLQkJCQkJICAgICgxMzYyLCAyMTU5KQ0KLQkJCQkJICAgICgxMzYyLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIgQDE0MjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxOA0KLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzI3LCAyMTI1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVBhdHRlcm5GYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5OTA5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjEwMzEyIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzEzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjIsIDIxNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE4NywgMjE1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjExOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4OTIyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDIiIEAxNDIzDQotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAyMDgzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCN0NBMDI2QiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDMiIEAxNDI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjMNCi0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE4NiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDIzDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAyMDgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIgQDE0MjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMw0KLQkJCQkJbG9jYXRpb24gICAJKDgyOCwgLTEzNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMiwgMjEwMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4NjE5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQjAxOTAiDQotCQkJCQljbGllbnQgICAgIAlAMTQyMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDg0LCAyMDgzKQ0KLQkJCQkJICAgICgxMDg0LCAyMTQzKQ0KLQkJCQkJICAgICg0ODUsIDIxNDMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAyMDgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ4NSwgMjE0MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMxLCAyMTAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTMxNzE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwOCIgQDE0MjgNCi0JCQkJbG9jYXRpb24gICAJKDExMjIsIDIyNDEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwMDUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwOSIgQDE0MjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyOA0KLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTQ3OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAzQjkiDQotCQkJCQljbGllbnQgICAgIAlAMTQyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTIyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUxlbmd0aEZhY2V0IiBAMTQzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDI4DQotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtNDc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDIyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTE3MzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDNDMyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDI4DQotCQkJCQlzdXBwbGllciAgIAlAMTMxNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExMjIsIDIyNDEpDQotCQkJCQkgICAgKDExMjIsIDIzMTgpDQotCQkJCQkgICAgKDM4NywgMjMxOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIyNDEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzg3LCAyMzE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NzAsIDIyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg1NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU2IiBAMTQzMw0KLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAxNTY1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDg1MDI1QiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTciIEAxNDM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzMNCi0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3MCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDMzDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3MywgMTU2NSkNCi0JCQkJCSAgICAoOTU5LCAxNTY1KQ0KLQkJCQkJICAgICg5NTksIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkZhY2V0IiBAMTQzNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDMzDQotCQkJCQlsb2NhdGlvbiAgIAkoNDY5LCAxMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzUzLCAxNTMyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYzMDkxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4NjAyN0EiDQotCQkJCQljbGllbnQgICAgIAlAMTQzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAxNTY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTU2NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM0LCAxNTIzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ2NjY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMCIgQDE0MzgNCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgMTY1MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjk3MDAxREIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzExIiBAMTQzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM4DQotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBDRiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDM4DQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDgxNiwgMTY1MCkNCi0JCQkJCSAgICAoOTU5LCAxNjUwKQ0KLQkJCQkJICAgICg5NTksIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTYsIDE2NTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1pbkZhY2V0IiBAMTQ0MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM4DQotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjQsIDE2MTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNDE2MTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBEOSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDM4DQotCQkJCQlzdXBwbGllciAgIAlAMTMxNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTYsIDE2NTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAxNjUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjMsIDE2MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDI3NDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgwIiBAMTQ0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5NywgMjMyMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDRjAxOTkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgxIiBAMTQ0NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTcxOSwgNDk3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQyMDA4NSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQzDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4TGVuZ3RoRmFjZXQiIEAxNDQ1DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzE5LCA0OTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzAsIDIzODApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4TGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzIyNTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQyMDA4RiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQzDQotCQkJCQlzdXBwbGllciAgIAlAMTMxNw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyOTcsIDIzMjEpDQotCQkJCQkgICAgKDEyOTcsIDI0MDkpDQotCQkJCQkgICAgKDIxMDIsIDI0MDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDIsIDI0MDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTQsIDIzNjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkyMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgyIiBAMTQ0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE1OSwgMjI3MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENTAwQzUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgzIiBAMTQ0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4MSwgNDQ5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ2MDAxRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQ4DQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTU5LCAyMjczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNTksIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluTGVuZ3RoRmFjZXQiIEAxNDUwDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMjM3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5MZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxOTUyNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzE4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE1OSwgMjI3MykNCi0JCQkJCSAgICAoMTE1OSwgMjQwOSkNCi0JCQkJCSAgICAoNDUwLCAyNDA5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0MDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDUyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMjM2OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzYxMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDYiIEAxNDUzDQotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCAyMzM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCODk4MDE2RCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDciIEAxNDU0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTMNCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDU2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIgQDE0NTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1Mw0KLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgLTYxMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU2LCAyNDU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTUyNjA0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5OTAwNjAiDQotCQkJCQljbGllbnQgICAgIAlAMTQ1Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTk3LCAyMzM0KQ0KLQkJCQkJICAgICgxMTk3LCAyNDkzKQ0KLQkJCQkJICAgICg0NTAsIDI0OTMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAyMzM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgMjQ5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI3LCAyNDUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE2MDQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNCIgQDE0NTgNCi0JCQkJbG9jYXRpb24gICAJKDEyMzEsIDI0MzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDAwMDYyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNSIgQDE0NTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1OA0KLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MTAwMUQiDQotCQkJCQljbGllbnQgICAgIAlAMTQ1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiIEAxNDYwDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTgNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjMsIC03NDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgMjYzMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk3MDMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MTAwMjciDQotCQkJCQljbGllbnQgICAgIAlAMTQ1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjMxLCAyNDM4KQ0KLQkJCQkJICAgICgxMjMxLCAyNjY4KQ0KLQkJCQkJICAgICg0NTEsIDI2NjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMjY2OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM0LCAyNjMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE4ODEyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4NCIgQDE0NjMNCi0JCQkJbG9jYXRpb24gICAJKDEyMzEsIDIzOTcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwMERFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4NSIgQDE0NjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0yMDksIDI1MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAzQ0QiDQotCQkJCQljbGllbnQgICAgIAlAMTQ2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInRvdGFsRGlnaXRzRmFjZXQiIEAxNDY1DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MywgMjU1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0b3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTg1NTY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAzRDciDQotCQkJCQljbGllbnQgICAgIAlAMTQ2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjMxLCAyMzk3KQ0KLQkJCQkJICAgICgxMjMxLCAyNTg3KQ0KLQkJCQkJICAgICg0NTEsIDI1ODcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyMzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMjU4NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM1LCAyNTYwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE0NjQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMTQ2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDc2OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxOSwgNTc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJNDQ0DQotCQkJCWhlaWdodCAgICAgCTQxMw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNDY5DQotCQkJCWxvY2F0aW9uICAgCSgxMjA5LCAxMDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxNDY4DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEyMDksIDEwNjUpDQotCQkJCSAgICAoMTIwOSwgOTc0KSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDAiIEAxNDcwDQotCQkJCWxvY2F0aW9uICAgCSgxMDkwLCAxMDMxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjg4MEY1MDNEOSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxNDcxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NzANCi0JCQkJCWxvY2F0aW9uICAgCSgzMjIsIC0yNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk3LCAxMDM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTg3NjUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGOTAwM0MiDQotCQkJCQljbGllbnQgICAgIAlAMTQ3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDkwLCA5NzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMjEsIDEwMzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYxNzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDEiIEAxNDc0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NzANCi0JCQkJCWxvY2F0aW9uICAgCSgzMjIsIC0yNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGOTAwNDYiDQotCQkJCQljbGllbnQgICAgIAlAMTQ3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDg4KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ2IiBAMTQ3NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgODczKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBNkRCMDFFNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZSIgQDE0NzYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3NQ0KLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU4LCA3OTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNzYwODcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREQiDQotCQkJCQljbGllbnQgICAgIAlAMTQ3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM4LCA4NzMpDQotCQkJCQkgICAgKDE1MzgsIDkxOSkNCi0JCQkJCSAgICAoMTQ1NCwgOTE5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgODczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDkxOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwOSwgODc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDE2NjY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDciIEAxNDc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NzUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNzgsIDEwNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREUiDQotCQkJCQljbGllbnQgICAgIAlAMTQ3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM4LCA4NzMpDQotCQkJCQkgICAgKDE1MzgsIDgyOCkNCi0JCQkJCSAgICAoMTQ1NCwgODI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgODczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDgyOCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0OCIgQDE0ODANCi0JCQkJbG9jYXRpb24gICAJKDE1MzUsIDY4NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxMjAxMDgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGUiIEAxNDgxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODANCi0JCQkJCWxvY2F0aW9uICAgCSgxNzUsIC04NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNTk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjk3NzI3Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0ODANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDY4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzNSwgNjg0KQ0KLQkJCQkJICAgICgxNTM1LCA3MjgpDQotCQkJCQkgICAgKDE0NTQsIDcyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzUsIDY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA3MjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDYsIDY4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjc3NzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0OSIgQDE0ODQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ4MA0KLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzE0MDE1QiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDgwDQotCQkJCQlzdXBwbGllciAgIAlAMTQ2OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzUsIDY4NCkNCi0JCQkJCSAgICAoMTUzNSwgNjQxKQ0KLQkJCQkJICAgICgxNDU0LCA2NDEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgNjQxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUyIiBAMTQ4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjEzLCA5NDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RUQwM0MwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbXBsZXhUeXBlIiBAMTQ4Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTc0NywgMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjUsIDk4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb21wbGV4VHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3MzA1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0ODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjEzLCA5NDApDQotCQkJCQkgICAgKDI4NCwgOTQwKQ0KLQkJCQkJICAgICgyODQsIDEwMDgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MTMsIDk0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDEwMDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgOTcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTA5MzIwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTMiIEAxNDg5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTIxIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0ODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDY4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYxMywgOTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTAsIDk0MCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJY2xpZW50ICAgICAJQDE0NjgNCi0JCQkJc3VwcGxpZXIgICAJQDEyOTgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTIsIDU2MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTIsIDUxMCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI5OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDEzMjANCi0JCQkJc3VwcGxpZXIgICAJQDE0NjgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDYsIDEwODgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDY5KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUwIiBAMTQ5Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MiwgMTEzMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0QjAxNzgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2ltcGxlVHlwZSIgQDE0OTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ5Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTgsIC0xNjMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTksIDEwOTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2ltcGxlVHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yNDY3NTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0RDAxN0IiDQotCQkJCQljbGllbnQgICAgIAlAMTQ5Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MiwgMTEzMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxMjkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIxLCAxMDk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIyNzI3Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUxIiBAMTQ5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDkyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0RDAxODUiDQotCQkJCQljbGllbnQgICAgIAlAMTQ5Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MiwgMTEzMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCA5NzQpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAMTQ5Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCAzODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDMwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDM2MykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTU1MA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGdsb2JhbCA6IGJvb2xlYW4iDQotCQkJCQkiKyBmZWF0dXJlUmVmZXJlbmNlIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0OTgNCi0JCQkJbG9jYXRpb24gICAJKDIyNjIsIDU2OCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTQ5Nw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyMjYyLCA1NjgpDQotCQkJCSAgICAoMjI2MiwgNDc3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUAxMjk0DQotCQkJCXN1cHBsaWVyICAgCUAxNDk3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1OTUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzQ2LCA1NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0OTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDQiIEAxNTAwDQotCQkJCWxvY2F0aW9uICAgCSgxNTUzLCA0NTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjIwMUE0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGUiIEAxNTAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE1MDANCi0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMzMSwgNDk5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYyNjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBMEYzMDJFNSINCi0JCQkJCWNsaWVudCAgICAgCUAxNTAwDQotCQkJCQlzdXBwbGllciAgIAlAMTQ2OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1NTMsIDQ1MykNCi0JCQkJCSAgICAoMTIyMiwgNDUzKQ0KLQkJCQkJICAgICgxMjIyLCA1NjIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTUzLCA0NTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyMiwgNTYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTg1LCA0NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTIwMzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NSIgQDE1MDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUwMA0KLQkJCQkJbG9jYXRpb24gICAJKDgwMSwgMjkzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBMEYzMDJGMCINCi0JCQkJCWNsaWVudCAgICAgCUAxNTAwDQotCQkJCQlzdXBwbGllciAgIAlAMTQ5Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTUzLCA0NTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MywgNDUzKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM2IiBAMTUwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwOCwgMzUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwMTA2MDJENyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEZlYXR1cmUiIEAxNTA2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE1MDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjY4LCAtMTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzI5LCAzNTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRGZWF0dXJlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyOTQxMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjkwMTBCMDAwRSINCi0JCQkJCWNsaWVudCAgICAgCUAxNTA1DQotCQkJCQlzdXBwbGllciAgIAlAMTQ5Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE5MDgsIDM1MykNCi0JCQkJCSAgICAoMTkwOCwgMzg3KQ0KLQkJCQkJICAgICgxOTkzLCAzODcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA4LCAzNTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MywgMzg3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTQ1LCAzNTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTY2MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNyIgQDE1MDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUwNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE1MDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDk3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTkwOCwgMzUzKQ0KLQkJCQkJICAgICgxOTA4LCAzMTkpDQotCQkJCQkgICAgKDE5OTMsIDMxOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzMTkpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiDQotCQkJCWNsaWVudCAgICAgCUAxMjk4DQotCQkJCXN1cHBsaWVyICAgCUAxMjk3DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQ5NCwgMjg0KQ0KLQkJCQkgICAgKDQ5NCwgMjQ0KQ0KLQkJCQkgICAgKDk5NiwgMjQ0KSkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMjg0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTk2LCAyNDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTExDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIg0KLQkJCQljbGllbnQgICAgIAlAMTI4NQ0KLQkJCQlzdXBwbGllciAgIAlAMTQ5Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcxOCwgODEyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcxOCwgNTY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTEyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlAMTMyMg0KLQkJCQlzdXBwbGllciAgIAlAMTQ2OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NSwgMTI5MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjUsIDEwNjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0NjkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCWNsaWVudCAgICAgCUAxNDk3DQotCQkJCXN1cHBsaWVyICAgCUAxMjk3DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIxNDcsIDI5MSkNCi0JCQkJICAgICgyMTQ3LCAyNDQpDQotCQkJCSAgICAoMTQ2OCwgMjQ0KSkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNDcsIDI5MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDI0NCkpKSkpKSkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQUM5MTA1MTAzQjIiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om1pbWUiIEAxNTE0DQotCQkJbG9jYXRpb24gICAJKDQwMCwgMjQwKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjU2LCAxNTYpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJIm1pbWUiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzQUM5MTI3QzAyNjYiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OndzZGwiIEAxNTE1DQotCQkJbG9jYXRpb24gICAJKDg4MCwgMjQwKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzM2LCAxNTYpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJIndzZGwiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzQURGQjhFNTAyMUUiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKQ0KLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OnhzZCIgQDE1MTYNCi0JCQlsb2NhdGlvbiAgIAkoMTM3NiwgMjQwKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgMTU2KQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ4c2QiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzOUFCREM2RjAxQUEiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkNCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyINCi0JcXVpZCAgICAgICAJIjNBQzkxMDUxMDMxRiINCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBQzkxMDUyMDAxQSINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMNCi0JcXVpZCAgICAgICAJIjNBQzkxMDUxMDMyNiINCi0JUHJvY3NORGV2cyAJKGxpc3QNCi0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciDQotCQlxdWlkICAgICAgIAkiM0FDOTEwNTEwMzI4Ig0KLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzDQotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2UiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhQmFzZVNldCIgODAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIkFOU0kiDQotCQkJCXZhbHVlICAgICAgCTgwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIk9yYWNsZSINCi0JCQkJdmFsdWUgICAgICAJODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiU1FMU2VydmVyIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJTeWJhc2UiDQotCQkJCXZhbHVlICAgICAgCTgwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIldhdGNvbSINCi0JCQkJdmFsdWUgICAgICAJODA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVl8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJJbmhlcml0U3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSJfViIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQmFzZVZpZXdzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiVkFSQ0hBUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJOdWxsc09LIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImZyYW1ld29yayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExFbGVtZW50Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExTcGVjaWZpY2F0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIklETFNwZWNTZXQiIDIyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETFNwZWNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlR5cGVkZWYiDQotCQkJCXZhbHVlICAgICAgCTU0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiRW51bWVyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJFeGNlcHRpb24iDQotCQkJCXZhbHVlICAgICAgCTYxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU3RydWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAk1MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlVuaW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLm1pbWUvc3JjL3Jvc2UvbWltZWJpbmRpbmdNREwubWRsLCBjdGMsIGlibWN0YyIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSURMTW9kdWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLm1pbWUvc3JjL3Jvc2UvbWltZWJpbmRpbmdNREwubWRsLCBjdGMsIGlibWN0YyIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkibV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJInNfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJInZvaWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIg0KLQkJCXZhbHVlICAgICAgCTgwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk0iDQotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3VuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiTWljcm9zb2Z0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiSUJNIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIg0KLQkJCXZhbHVlICAgICAgCTMpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemVkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJNzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQm91bmQiDQotCQkJCXZhbHVlICAgICAgCTczKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSINCi0JCQkJdmFsdWUgICAgICAJODEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJNzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQm91bmQiDQotCQkJCXZhbHVlICAgICAgCTczKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSINCi0JCQkJdmFsdWUgICAgICAJODEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc05hdmlnYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiMzYwMDAwMDAyIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiX0lEIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlclR5cGVTZXQiIDE4MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2giDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiTWFwTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMTkwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiDQotCQkJCXZhbHVlICAgICAgCTE5MDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCINCi0JCQkJdmFsdWUgICAgICAJMTkwOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJBRlRFUiINCi0JCQkJdmFsdWUgICAgICAJMTgwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiDQotCQkJCXZhbHVlICAgICAgCTE4MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TVEVBRCBPRiINCi0JCQkJdmFsdWUgICAgICAJMTgwMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJST1ciDQotCQkJCXZhbHVlICAgICAgCTE3MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiU1RBVEVNRU5UIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiDQotCQkJCXZhbHVlICAgICAgCTE2MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiNiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSINCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSINCi0JCQkJdmFsdWUgICAgICAJMjA2KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLm1pbWUvc3JjL3Jvc2UvbWltZWJpbmRpbmdNREwubWRsLCBjdGMsIGlibWN0YyIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5taW1lL3NyYy9yb3NlL21pbWViaW5kaW5nTURMLm1kbCwgY3RjLCBpYm1jdGMiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0Ig0KLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGVudCINCi0JCQl2YWx1ZSAgICAgIAkyKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciINCi0JCQkJdmFsdWUgICAgICAJNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJTQ0MiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJUeXBlTGliSW1wb3J0ZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiDQotCQkJdmFsdWUgICAgICAJIjAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiDQotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlIg0KLQkJCXZhbHVlICAgICAgCSgiQ3JlYXRhYmxlU2V0IiAyMjEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbml0aWFsaXphdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVGVybWluYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIkNvbGxlY3Rpb24iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlRleHQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkb3BlcmF0aW9uIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTGV0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTGV0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkh0dHBfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUjJFZGl0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JcXVpZCAgICAgICAJIjNBQzkxMDUxMDMyNyIpKQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2Uvc29hcC5tZGwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL3NvYXAubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk5M2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2Uvc29hcC5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcwOCArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQyDQotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3Ig0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cw0KLQlyaWdodE1hcmdpbiAJMC4yNTAwMDANCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDANCi0JdG9wTWFyZ2luICAJMC4yNTAwMDANCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMA0KLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDANCi0JY2xpcEljb25MYWJlbHMgCVRSVUUNCi0JYXV0b1Jlc2l6ZSAJVFJVRQ0KLQlzbmFwVG9HcmlkIAlUUlVFDQotCWdyaWRYICAgICAgCTE2DQotCWdyaWRZICAgICAgCTE2DQotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQNCi0JICAgIHNpemUgICAgICAgCTEwDQotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JICAgIHVuZGVybGluZSAgCUZBTFNFDQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkgICAgY29sb3IgICAgICAJMA0KLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0Jc2hvd01lc3NhZ2VOdW0gCTENCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUNCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQ0KLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyINCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NCINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA3OCINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciDQotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjMiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiMzlFMjdGMDgwMDY1Ig0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCINCi0JCXF1aWQgICAgICAgCSIzQURGQjhFNTAyMUUiDQotCQlkb2N1bWVudGF0aW9uIAkNCi18VGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuDQotfA0KLXxXU0RMIGRlc2NyaWJlcyBuZXR3b3JrIHNlcnZpY2VzIGFzIHNldHMgb2YgZW5kcG9pbnRzIG9wZXJhdGluZyBvbiBtZXNzYWdlcy4gVGhlIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGFyZSBkZXNjcmliZWQgYWJzdHJhY3RseSwgYW5kIHRoZW4gYm91bmQgdG8gYSBjb25jcmV0ZSBuZXR3b3JrIHByb3RvY29sIGFuZCBtZXNzYWdlIGZvcm1hdCB0byBkZWZpbmUgYW4gZW5kcG9pbnQuDQotfA0KLXxXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLg0KLXwNCi18VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkNCi18LSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUNCi18LSAyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmcsIHNob3dzIHRoZSBuYW1lc3BhY2UgYW5kIGltcG9ydCBtZWNoYW5pc20NCi18LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQ0KLXwtIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwNCi18LSAyLjMgTWVzc2FnZXMsIDIuNCBQb3J0VHlwZXMsIDIuNSBCaW5kaW5ncyBhbmQgMi43IFNlcnZpY2VzLCBzaG93IHRoZSBtYWpvciBXU0RMIGVsZW1lbnRzIGFuZCB0aGVpciByZWxhdGlvbnMuDQotfA0KLXxUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4NCi0JCQ0KLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzcyAiV1NETEVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDNkEzMDJERCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBsYW5ndWFnZSBlbGVtZW50LiINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyOTYwMEM4Ig0KLQkJCQlyZXN1bHQgICAgIAkiRGVmaW5pdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyQjgwMzQ3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZGVmaW5pdGlvbiINCi0JCQkJCXR5cGUgICAgICAgCSJEZWZpbml0aW9uIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDQ0U0NDM2MDJBMyINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Y5N0RCRDMwMjA3Ig0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIg0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydFR5cGUiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0VHlwZSBlbGVtZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjEgYW5kIGFuIEludGVyZmFjZSBjb21wb25lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMi4gQSBwb3J0IHR5cGUgb3IgSW50ZXJmYWNlIGlzIGEgbmFtZWQgc2V0IG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgYW5kIHRoZSBhYnN0cmFjdCBtZXNzYWdlcyBpbnZvbHZlZC4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM5QjcwMTUwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZEODAxOUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4OEUwMDIzIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFFMzAxRTUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0RFQjAzMTYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRGRDAxQkEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRTlERTk4MDAzQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRTIwMTcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3R5bGUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiDQotCQkJCXR5cGUgICAgICAgCSJPcGVyYXRpb25UeXBlIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCREQ5NjQzMDA0QyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMjM1MDAzRSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTIyMDFBRCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTIwMDExQiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbWVzc2FnZSBlbGVtZW50LiBBIFdTREwgbWVzc2FnZSBpcyBhbiBhYnN0cmFjdCwgdHlwZWQgZGVmaW5pdGlvbiBvZiB0aGUgZGF0YSBiZWluZyBjb21tdW5pY2F0ZWQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMDU1MDFDNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4RDEwMkJBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4N0MwMUZFIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFEMjAyMjYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0U0QjAyQjAiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDU0MjAwRjEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUGFydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTZEMDJGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTdFMjMwMjM3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBCNzAzQzgiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50TmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMDg3MDNEQiINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBDMzAzQzUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEwRjAyRjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRjQwMUEzIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNkQwMTUxIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0REYwMzVDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDYwMDkyMDJGNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5QzRDQjAxOTkiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiU2VydmljZSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEyMDAyNUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTRFMDFCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0OEE0MDE1MSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYyMEQwMjAzIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0ODEwMjIwIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0QzUwMUUyIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENjAwQ0IwMEFBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0NTAyQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUEwMDM5MSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjE0OTAzRDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjUzNTAyQzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQUY5NTQzQzAwNzMiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCODVCMjFBMDI3MSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkRCODAzRDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMUY4MDM4MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDRDE0RkMyMDEyQiINCi0JCQkJcmVzdWx0ICAgICAJIkRPTURvY3VtZW50Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwREUwMUU3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnQiDQotCQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNDc0MDA0RSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiNDAzNTJCN0MwMzk2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg1NzAyRjUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwMEQwMDBEIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkltcG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RUU1ODAzN0EiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDBEMDM0MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM3OSINCi0JCQkJcmVzdWx0ICAgICAJIlhTRFNjaGVtYSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRTY2hlbWEiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NzJDMTAzOTciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzY2hlbWEiDQotCQkJCQl0eXBlICAgICAgIAkiWFNEU2NoZW1hIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTUwQTAwMzYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTE0MDIxMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmxlRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCWRvY3VtZW50YXRpb24gCSIgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkUzQzAzRDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxMkMwM0NEIg0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzE0NzAyOTUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRFbGVtZW50Ig0KLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQuIEFuIGlucHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTA0MDI1RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMjgwMkU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkVFMDMxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUlucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk91dHB1dCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTBDMDM1QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMzUwMEREIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkY4MDFDRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQuIEZhdWx0IGVsZW1lbnRzIHNwZWNpZnkgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgYmUgb3V0cHV0IGFzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFMUM4MjAwMkYyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzRDAzMTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjIwMDIwMDJEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ0lucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gaW5wdXQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMUIwMTEzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNTlCMDA3MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0E0MDIwMyINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0I1MDNBMiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklJbnB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMUVBMDIwRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNDMwMkFCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QjVBNDAyN0UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzRDkwMEYxIg0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNGMTAzMjYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMjAyMDBCRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nRmF1bHQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkzODYwMkM5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU3MTAzMzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDEzMDM3RiINCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDIxMDEwOSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVCRjlFMDE0QSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJRTmFtZSINCi0JCQlxdWlkICAgICAgIAkiM0FFOEVEMjIwMTQwIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUU5hbWUgY2xhc3MuIEEgUU5hbWUgaXMgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0OURBOTAwM0QiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiTmFtZXNwYWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5hbWVzcGFjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGluIGEgV1NETCBkb2N1bWVudC4iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNEMjkwMUIxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlZml4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNEMzIwMjM2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk9wZXJhdGlvblR5cGUiDQotCQkJcXVpZCAgICAgICAJIjNBRUI0NzgyMDI0RiINCi0JCQlkb2N1bWVudGF0aW9uIAkNCi18T05FX1dBWT0xDQotfFJFUVVFU1RfUkVTUE9OU0U9Mg0KLXxTT0xJQ0lUX1JFU1BPTlNFPTMNCi18Tk9USUZJQ0FUSU9OPTQNCi0JCQkNCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMzNTMwM0UzIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0VHlwZSINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE1QkUwMzMxIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZBQzEwMUNBIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkJBRjAxQTQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkY3MDMxQSINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBNjMyMDAwRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTc3NjAwRDEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM0MjAwNjUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCINCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzU5MDI4RiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNzEwMkIxIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzgxMDFCMCINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDOTkwMzFEIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyT3JkZXIiDQotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NEU1MDE4RCINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkM0MDEwNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklJbnB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkU0MDA5NCINCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRjAwMUQyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklPdXRwdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE3OTkwMTJCIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3RUUwMDE1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzMxMDBFRiINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjM0NzAyNzciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLklucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MDAwMDM5Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBODI5MDI3RCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0M0EwMzVEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDQ1MDFDOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MzkwMUQ1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4NjEwMzFEIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDZBMDBCRCINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ3NTAxMzEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4NzEwMjA4Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklNZXNzYWdlIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QThBRjAwNEYiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5NZXNzYWdlIG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjI0MDI3MyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnQiDQotCQkJCQl0eXBlICAgICAgIAkiSVBhcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyM0QwMjMzIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQYXJ0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyNTQwMjVFIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcmRlcmVkUGFydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI2MTAyMEQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0T3JkZXIiDQotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5NZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4QkMwMjYwIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQYXJ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTkzRjAxQkUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5QYXJ0IG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4NDUwMDUyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidmFsdWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJZXhjZXB0aW9ucyAJIldTRExFeGNlcHRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEwMTAxQzMiDQotCQkJCXJlc3VsdCAgICAgCSJJSXRlcmF0b3IiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjhBMkQwMkQ1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiUU5hbWUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTk1MDAyMzEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVNlcnZpY2UiDQotCQkJcXVpZCAgICAgICAJIjNCODRBQjQ5MDI4NyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RDU2MDFEMSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnQiDQotCQkJCQl0eXBlICAgICAgIAkiSVBvcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REEyMDAzNiINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REIwMDFCQyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjVCMDAzRSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJUG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCODAwMzI2Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUxRjMwMkI1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MjYzMDJGMiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjhDMDAxNiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZyINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGMTYwMTUzIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ09wZXJhdGlvbiINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUY1MDAwNjYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGQTQwMUM1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTJBOTAyODQiDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTJCRTAxQTgiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSINCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQkNGMDMwMiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ09wZXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEQzAwMDcyIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBCQzAwNDEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nRmF1bHQiDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEQ5MDA5RCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBGQzAwNjEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzJEMDAxNyINCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzM0YwMzdCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUwOTAwREEiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTFEMDA3RiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdJbnB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0lucHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTM0MDM0OSINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTU0NzAyQTYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3V0cHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3V0cHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QURDQjAyMUMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFERUIwMTAwIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0lucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERkUwMDBEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUUyMTAxMTEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTJEMDA1MCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0ZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUU0RjAwQkQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU1RjAwMkEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFGMzIwM0RCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFGNTYwMjkyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxMjQwMkFCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxMzUwM0QxIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QjFEOTAxNDIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODhGMTAzOUQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIg0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkSW1wb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NDkwMjU5Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW1wb3J0RGVmIg0KLQkJCQkJdHlwZSAgICAgICAJIklJbXBvcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NkUwMDVFIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTg0MDA0QiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUM1MDA0NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIg0KLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlFNDAxRUUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzZXJ2aWNlIg0KLQkJCQkJdHlwZSAgICAgICAJIklTZXJ2aWNlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMTcwMzhDIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEEzMjAyODYiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE0NjAxM0IiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNUMwMEIwIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUZFMDM3QyINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNzUwMkU3Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUltcG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTgzMDE0QyINCi0JCQkJcmVzdWx0ICAgICAJIklJbXBvcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE5RDAzM0UiDQotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUFGMDI1NCINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUMyMDNDNCINCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRTgwMEVEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRjgwMjZEIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjA4MDFEQSINCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMTUwMzlCIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIzMjAxM0EiDQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCNDIwMDc1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ3MiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI5MjAzNDEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJDRDAwNjAiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJFNzAxNDQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDMTcwMTA3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMzRTAwMUQiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzYyMDE0QiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2VzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNzQwMTE1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0JFMDA3MSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OENEQTAxQzYiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFByZWZpeCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0ZEMDAxNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThEMjMwMEE4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQzQjAzQ0UiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1QjgwMTJCIg0KLQkJCQlyZXN1bHQgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RDcwM0JCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnRCYXNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RkUwMjA4Ig0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50QmFzZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENjE4MDMyOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50QmFzZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDU2MDA4MCINCi0JCQkJcmVzdWx0ICAgICAJIklUeXBlcyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVTZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwN0UwMDRDIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEJBMDM1NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwRDgwMjlBIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZU1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBGQTAzMDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDZGMDMxQiINCi0JCQkJcmVzdWx0ICAgICAJIklUeXBlcyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDk1MDBFRSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInR5cGVzIg0KLQkJCQkJdHlwZSAgICAgICAJIklUeXBlcyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5EZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRTcwMkExIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbXBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNCODRCMjAyMDExOSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkltcG9ydCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkltcG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMjBDMDJFQSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJTGlzdCINCi0JCQlxdWlkICAgICAgIAkiM0I4NUMwQTIwM0M1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMwQUYwMjk3Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklNYXAiDQotCQkJcXVpZCAgICAgICAJIjNCODk2QjAzMDBENCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5NYXAiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkIxMTAyQjUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVVSTCINCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1NjMwMjc0Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS5uZXQuVVJMIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLm5ldC5VUkwiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU2RTAzRTIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg5RDU5MzAyQTUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENTlGMDJFOCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0QzQjAzODAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyINCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0YzODAzRTYiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWFzIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBRENGN0UwMzAxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUl0ZXJhdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQzQ2ODdEQTAxNjciDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5JdGVyYXRvciINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4ODA4MDBCOSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRXhjZXB0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQzQ2ODk2NTAzMTMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeGNlcHRpb24gY2xhc3MuIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLldTRExFeGNlcHRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODk3NDAzMTUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JCMjAwNTAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5UeXBlcyBub24tTU9GIGludGVyZmFjZSINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuVHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JGMTAxNzMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0NCMjRBRUMwMUNCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0NDMzYwRDcwMzlDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MjdGMDBCNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDRDE1MDJDMDIzQiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwNjAwMTgyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJcXVpZCAgICAgICAJIjNGNjc3MURCMDJEQyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjc2MkE2QTAzMDgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNGNjc4MEEwMDFBQiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlByb3RlY3RlZCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIg0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MjQwMThDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUMzIg0KLQkJCQlsYWJlbCAgICAgIAkicG9ydFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDODI3MDFDRCINCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRTAwRTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDRUJGMDA1NyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDYxIg0KLQkJCQlsYWJlbCAgICAgIAkiZVBhcnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyINCi0JCQlxdWlkICAgICAgIAkiM0FENUQzNTIwMTBGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMzU0MDE3NiINCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxODAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQzRTEwMTc5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMjUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIzOSINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciDQotCQkJcXVpZCAgICAgICAJIjNBRDVENDI1MDM4QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkY1Ig0KLQkJCQlsYWJlbCAgICAgIAkiZU9wZXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkZGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOTQwMDM5MyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUMiDQotCQkJCWxhYmVsICAgICAgCSJlUG9ydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOUI4MDExRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI0RCINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI2MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMyINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2MDMwMUUyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2MDQwMEI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQzEiDQotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2NzEwMTA0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzIwMzRBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzIwMzU0Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNyINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2NzcwMDk1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzgwMzcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ3MiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzN0IiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOSINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2N0IwMzExIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2N0QwMDdGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlU2VydmljZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwODkiDQotCQkJCWxhYmVsICAgICAgCSJlU2VydmljZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMSINCi0JCQlxdWlkICAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJCWxhYmVsICAgICAgCSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMiDQotCQkJcXVpZCAgICAgICAJIjNBREYyRTY0MDFGNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUxIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdJbnB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSINCi0JCQlxdWlkICAgICAgIAkiM0FERjJFQjMwMTYzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNDIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3Ig0KLQkJCXF1aWQgICAgICAgCSIzQURGMkY5NDAyNEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUlucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTkwIg0KLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkY5NTAxOUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOSINCi0JCQlxdWlkICAgICAgIAkiM0FERjJGQjgwMkY5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEEiDQotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEiDQotCQkJcXVpZCAgICAgICAJIjNBREYzMzE2MDFBNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjMzMTgwMzg3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzIiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMyINCi0JCQlxdWlkICAgICAgIAkiM0FERjM0MDAwM0U1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nRmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FBIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdGYXVsdHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNSINCi0JCQlxdWlkICAgICAgIAkiM0FFMDkxRjQwMkYzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRSINCi0JCQkJbGFiZWwgICAgICAJImVGYXVsdCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzciDQotCQkJcXVpZCAgICAgICAJIjNBRUEzRDU1MDAyRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzOCINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMyOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZU5hbWVzcGFjZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMzIiDQotCQkJCWxhYmVsICAgICAgCSJlTmFtZXNwYWNlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzkiDQotCQkJcXVpZCAgICAgICAJIjNBRUEzRTNBMDAyRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFFOCINCi0JCQkJbGFiZWwgICAgICAJImVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MCINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFGMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQxIg0KLQkJCXF1aWQgICAgICAgCSIzQUVBNDEyRjAwMzUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjU1Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjVGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDMiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRDI0MDBCRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNTAwODMiDQotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3OTAwRjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RCINCi0JCQkJbGFiZWwgICAgICAJImVPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDYiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3QTAxNEUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDciDQotCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDBDNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMyNyINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0OCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0OSINCi0JCQlxdWlkICAgICAgIAkiM0I4QjFDMTIwM0IyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQzE0MDAxQyINCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDI2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUxIg0KLQkJCXF1aWQgICAgICAgCSIzQjhCMURDQzAyRTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3MCINCi0JCQkJbGFiZWwgICAgICAJImVTY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUzIg0KLQkJCXF1aWQgICAgICAgCSIzQjhCRUEyNzAyOUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTQiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkJbGFiZWwgICAgICAJImVUeXBlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiDQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTUiDQotCQkJcXVpZCAgICAgICAJIjNDNDY4MjkzMDNFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDEwRSINCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NiINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDExOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NyINCi0JCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbXBvcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQlsYWJlbCAgICAgIAkiZUltcG9ydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1OCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY0REZGMDJFRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1OSINCi0JCQlxdWlkICAgICAgIAkiM0NDMzYxNDUwMEYyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYwIg0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNFIg0KLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MSINCi0JCQlxdWlkICAgICAgIAkiM0Y3NEU3ODQwMUIxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDBGIg0KLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYyIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDIzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYzIg0KLQkJCXF1aWQgICAgICAgCSIzRjc4OTZBMjAyNkUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicGFyZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJCIg0KLQkJCQlsYWJlbCAgICAgIAkicGFyZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNoaWxkcmVuIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJDIg0KLQkJCQlsYWJlbCAgICAgIAkiY2hpbGRyZW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi43IFNlcnZpY2VzIg0KLQkJCXF1aWQgICAgICAgCSIzOUFEM0VGNjAxMjciDQotCQkJdGl0bGUgICAgICAJIjIuNyBTZXJ2aWNlcyINCi0JCQl6b29tICAgICAgIAk5MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDY2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2MTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSINCi0JCQkJd2lkdGggICAgICAJNTIwDQotCQkJCWhlaWdodCAgICAgCTQwNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiIEAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgNTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0ODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiINCi0JCQkJd2lkdGggICAgICAJMjc4DQotCQkJCWhlaWdodCAgICAgCTIxOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiIEAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDkwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklTZXJ2aWNlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTI2NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCAzODkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCXdpZHRoICAgICAgCTQxMA0KLQkJCQloZWlnaHQgICAgIAkzMDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NEUwMUI0Ig0KLQkJCQljbGllbnQgICAgIAlANA0KLQkJCQlzdXBwbGllciAgIAlAMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQwLCAzNzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDAsIDI5MikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0NCwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTMwMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiDQotCQkJCWNsaWVudCAgICAgCUA2DQotCQkJCXN1cHBsaWVyICAgCUAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMwLCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMCwgMTAwMikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDkxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY3NSwgODQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJCQl3aWR0aCAgICAgIAkzMDANCi0JCQkJaGVpZ2h0ICAgICAJMTY4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQ1MDJDOSINCi0JCQkJY2xpZW50ICAgICAJQDgNCi0JCQkJc3VwcGxpZXIgICAJQDINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwOSwgODI4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODA5LCA2MzcpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDEwDQotCQkJCWxvY2F0aW9uICAgCSgzNDMsIDkxNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRzIiBAMTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEzLCA5NDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjE4OTc4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUMiDQotCQkJCQljbGllbnQgICAgIAlAMTANCi0JCQkJCXN1cHBsaWVyICAgCUA4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM0MywgOTE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgOTE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzOSwgODgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwODAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCA5OTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMjg0NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwIiBAMTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2LCA3NDQpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNDMsIDkxNikNCi0JCQkJCSAgICAoMjU3LCA5MTYpDQotCQkJCQkgICAgKDI1NywgNjc5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjU3LCA2NzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAxLCA3OTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzcwOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEAxOA0KLQkJCQlsb2NhdGlvbiAgIAkoODg2LCAxMjcwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOUI4MDExRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZyIgQDE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE4DQotCQkJCQlsb2NhdGlvbiAgIAkoMzgsIDQyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTEyLCAxMjM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQ4NTcxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDlCOTAyNEQiDQotCQkJCQljbGllbnQgICAgIAlAMTgNCi0JCQkJCXN1cHBsaWVyICAgCUA2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM1LCAxMjcwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzAsIDEzMTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQyODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyIiBAMjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MiwgMTEwNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODc5NDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI2MSINCi0JCQkJCWNsaWVudCAgICAgCUAxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4ODYsIDEyNzApDQotCQkJCQkgICAgKDgxMiwgMTI3MCkNCi0JCQkJCSAgICAoODEyLCA5OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEyLCA5OTYpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi41IEJpbmRpbmdzIg0KLQkJCXF1aWQgICAgICAgCSIzOUFENTEyNzAyNTIiDQotCQkJdGl0bGUgICAgICAJIjIuNSBCaW5kaW5ncyINCi0JCQl6b29tICAgICAgIAk4NQ0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxMTQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCA2NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMzc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIgQDI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAzNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCAxMzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiINCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTU2OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIgQDI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTMzNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0lucHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTI4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIg0KLQkJCQl3aWR0aCAgICAgIAkyNzgNCi0JCQkJaGVpZ2h0ICAgICAJMTc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCIgQDI3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTYzOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ091dHB1dCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE1ODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSINCi0JCQkJd2lkdGggICAgICAJMzEyDQotCQkJCWhlaWdodCAgICAgCTE3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIgQDI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTU4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nRmF1bHQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTA4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiDQotCQkJCXdpZHRoICAgICAgCTI5MA0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgNDg2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJd2lkdGggICAgICAJNjkxDQotCQkJCWhlaWdodCAgICAgCTMwMQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEAzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTI4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDMxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNTg3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAzMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk3LCA1MzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCXdpZHRoICAgICAgCTQzMg0KLQkJCQloZWlnaHQgICAgIAkzMjINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJY2xpZW50ICAgICAJQDMyDQotCQkJCXN1cHBsaWVyICAgCUAyNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc5LCA1MjcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzksIDQyOCkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAMzQNCi0JCQkJbG9jYXRpb24gICAJKDEwMzksIDc0MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1MjAxMEYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlIiBAMzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzQNCi0JCQkJCWxvY2F0aW9uICAgCSg1NzUsIDU5OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ5LCA3ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5MjkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxNzYiDQotCQkJCQljbGllbnQgICAgIAlAMzQNCi0JCQkJCXN1cHBsaWVyICAgCUAyOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1OSwgNzQyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTIsIDcxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjE5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDM4DQotCQkJCQlQYXJlbnRfVmlldyAJQDM0DQotCQkJCQlsb2NhdGlvbiAgIAkoNTc1LCA1OTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc2LCA2OTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA5NDQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxODAiDQotCQkJCQljbGllbnQgICAgIAlAMzQNCi0JCQkJCXN1cHBsaWVyICAgCUAzMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTIwLCA3NDIpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBANDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxMDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzIsIDg1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQl3aWR0aCAgICAgIAk0NTANCi0JCQkJaGVpZ2h0ICAgICAJMzcwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEA0MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDYyNCwgMTQwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzYsIDEyODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTI3NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MyIgQDQyDQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCAxMzU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRDI0MDBCRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEA0Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCQkJbG9jYXRpb24gICAJKDk2LCAyODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzNywgMTMxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzUxNDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4MyINCi0JCQkJCWNsaWVudCAgICAgCUA0Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDMwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTM1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk0LCAxMzk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5NTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NCIgQDQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODQiDQotCQkJCQljbGllbnQgICAgIAlANDINCi0JCQkJCXN1cHBsaWVyICAgCUA0MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4MSwgMTM1OSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBANDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDE2NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODEyLCAxNTM5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIg0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ1IiBANDgNCi0JCQkJbG9jYXRpb24gICAJKDE0MzIsIDE2NTQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFENzkwMEYyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEA0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ1LCAxNjEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NzQ3NzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RCINCi0JCQkJCWNsaWVudCAgICAgCUA0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDMxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTY1NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjgxLCAxNjk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkwMjc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NiIgQDUyDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RSINCi0JCQkJCWNsaWVudCAgICAgCUA0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTY1NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBANTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDEwMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCXdpZHRoICAgICAgCTM2NA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREU0MDFEQyINCi0JCQkJY2xpZW50ICAgICAJQDUzDQotCQkJCXN1cHBsaWVyICAgCUAyNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTY2LCA5MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjYsIDYzNikpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1IiBANTUNCi0JCQkJbG9jYXRpb24gICAJKDQ1NywgMTAyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMTAxNzkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNiIgQDU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzUsIDkyMCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjI1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU1DQotCQkJCQlzdXBwbGllciAgIAlAMzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0NTcsIDEwMjIpDQotCQkJCQkgICAgKDI3NiwgMTAyMikNCi0JCQkJCSAgICAoMjc2LCA4NDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc2LCA4NDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMwLCA4ODQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3BlcmF0aW9ucyIgQDU5DQotCQkJCQlQYXJlbnRfVmlldyAJQDU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIDk3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ09wZXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTE2OTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEM0UyMDIzOSINCi0JCQkJCWNsaWVudCAgICAgCUA1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTAsIDEwMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY5LCA5ODApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODQ5NTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgMTA2NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyNzU2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBANjMNCi0JCQkJbG9jYXRpb24gICAJKDE0MTgsIDEwNDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjUwMzhBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb24iIEA2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxMDc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA2MDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGNSINCi0JCQkJCWNsaWVudCAgICAgCUA2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2MywgMTA0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg5LCAxMDA1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk2NzIxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4IiBANjcNCi0JCQkJCVBhcmVudF9WaWV3IAlANjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3MywgMTA3MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTU0MjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGRiINCi0JCQkJCWNsaWVudCAgICAgCUA2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3NCwgMTA0MCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBANjkNCi0JCQkJbG9jYXRpb24gICAJKDc4NywgMTE5MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NDAxRjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdJbnB1dCIgQDcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2OSwgMTE1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0lucHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTExOTA1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTEiDQotCQkJCQljbGllbnQgICAgIAlANjkNCi0JCQkJCXN1cHBsaWVyICAgCUA0MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc4NywgMTE5MCkNCi0JCQkJCSAgICAoNjM2LCAxMTkwKQ0KLQkJCQkJICAgICg2MzYsIDEyNzEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCAxMjcxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY4NSwgMTIyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0MDQ3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQiIEA3Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODUsIDExNDQpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MiINCi0JCQkJCWNsaWVudCAgICAgCUA2OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzg3LCAxMTkwKQ0KLQkJCQkJICAgICg5MjYsIDExOTApDQotCQkJCQkgICAgKDkyNiwgMTA5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjYsIDEwOTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODcxLCAxMTM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzU4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1IiBANzYNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEzMTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjMwMTYzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3V0cHV0IiBANzcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxMiwgMTQyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ091dHB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0NTA4Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNDIg0KLQkJCQkJY2xpZW50ICAgICAJQDc2DQotCQkJCQlzdXBwbGllciAgIAlANDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2NywgMTQ3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3NDU5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYiIEA4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODMsIDExNDApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRUI0MDEzRCINCi0JCQkJCWNsaWVudCAgICAgCUA3Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTA5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDMxLCAxMTg2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkwMTY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAODMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIwLCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzIsIDE5MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRmF1bHQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMTc4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEA4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxMiwgMTg1OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU3MTAzMzMiDQotCQkJCWNsaWVudCAgICAgCUA4NA0KLQkJCQlzdXBwbGllciAgIAlAMjgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDMsIDIwMDcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDIwMDcpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzMiIEA4Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1NiwgMTM1MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMDAzRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdGYXVsdHMiIEA4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4Ng0KLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODIsIDE3NTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzAwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdGYXVsdHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDMxNTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQSINCi0JCQkJCWNsaWVudCAgICAgCUA4Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NiwgMTg0NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA5LCAxNzk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MTk0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU2LCAxODA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE5MjkxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzQiIEA5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4Ng0KLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQiINCi0JCQkJCWNsaWVudCAgICAgCUA4Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1NiwgMTM1MikNCi0JCQkJCSAgICAoMTM1NiwgMTIxNykNCi0JCQkJCSAgICAoMTExNywgMTIxNykNCi0JCQkJCSAgICAoMTExNywgMTA5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTA5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTUyLCAxMTY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg3MDA4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM1IiBAOTQNCi0JCQkJbG9jYXRpb24gICAJKDE2NDAsIDE5NzApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjQwMkYzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdCIgQDk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDk0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzQsIDE5MTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUZhdWx0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2NDIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkUiDQotCQkJCQljbGllbnQgICAgIAlAOTQNCi0JCQkJCXN1cHBsaWVyICAgCUA4Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjMsIDE5NzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcxOCwgMjAxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MjI3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzYiIEA5OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5NA0KLQkJCQkJbG9jYXRpb24gICAJKC0zNDQsIDgxOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkYiDQotCQkJCQljbGllbnQgICAgIAlAOTQNCi0JCQkJCXN1cHBsaWVyICAgCUA4NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MTcsIDE5NzApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNDMwMkFCIg0KLQkJCQljbGllbnQgICAgIAlANDcNCi0JCQkJc3VwcGxpZXIgICAJQDI3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MDMsIDE2NTYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjQsIDE2NTYpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUxQjAxMTMiDQotCQkJCWNsaWVudCAgICAgCUA0MQ0KLQkJCQlzdXBwbGllciAgIAlAMjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ2NywgMTM4NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMzMSwgMTM4NSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi40IFBvcnRUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0FENUQxQzQwMzY2Ig0KLQkJCXRpdGxlICAgICAgCSIyLjQgUG9ydFR5cGVzIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iDQotCQkJem9vbSAgICAgICAJODANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSIgQDEwMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDE3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUG9ydFR5cGUiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDEyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIg0KLQkJCQl3aWR0aCAgICAgIAk3MTgNCi0JCQkJaGVpZ2h0ICAgICAJMTk2DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIgQDEwMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNiwgMTc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg3Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklPcGVyYXRpb24iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxMjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg3Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSINCi0JCQkJd2lkdGggICAgICAJODkxDQotCQkJCWhlaWdodCAgICAgCTE4OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUlucHV0IiBAMTAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTQzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW5wdXQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTM4NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1Ig0KLQkJCQl3aWR0aCAgICAgIAk2NDQNCi0JCQkJaGVpZ2h0ICAgICAJMTk0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IiBAMTA0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAxNzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTc1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJT3V0cHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE3MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCINCi0JCQkJd2lkdGggICAgICAJNjc0DQotCQkJCWhlaWdodCAgICAgCTE5NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IiBAMTA1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjA3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRmF1bHQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjAyNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIg0KLQkJCQl3aWR0aCAgICAgIAk2NDQNCi0JCQkJaGVpZ2h0ICAgICAJMTk2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDEwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgODAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTgsIDY3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCXdpZHRoICAgICAgCTY5NQ0KLQkJCQloZWlnaHQgICAgIAkyODENCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMTA3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU3NiwgODAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzI1LCA2OTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCXdpZHRoICAgICAgCTUyMA0KLQkJCQloZWlnaHQgICAgIAkyNDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAMTA4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcyOCwgMjExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NywgMjA2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEAxMDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAxNDcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzAsIDE0MjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTI1DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMTEwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgMTc5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgMTc0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCQl3aWR0aCAgICAgIAkyNzQNCi0JCQkJaGVpZ2h0ICAgICAJMTI1DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEAxMTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA3ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTQsIDYyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQl3aWR0aCAgICAgIAk2OTUNCi0JCQkJaGVpZ2h0ICAgICAJMzUyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTEyDQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCA3OTcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjQwMThDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb25zIiBAMTEzDQotCQkJCQlQYXJlbnRfVmlldyAJQDExMg0KLQkJCQkJbG9jYXRpb24gICAJKDU5MiwgMjY5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgNzQ4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzU5NjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQ0QiDQotCQkJCQljbGllbnQgICAgIAlAMTEyDQotCQkJCQlzdXBwbGllciAgIAlAMTExDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjA1LCA3OTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTc2LCA4NjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDAzOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NCwgOTIzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2MjQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicG9ydFR5cGUiIEAxMTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyDQotCQkJCQlsb2NhdGlvbiAgIAkoNTkyLCAyNjkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUMzIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMg0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA3OTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODgsIDc1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MzQ4OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MSIgQDExOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjEwNywgNzczKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUE0MTJGMDAzNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFyYW1ldGVyT3JkZXJpbmciIEAxMjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5DQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NSwgNjQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MzMzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTYsIDc3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzIsIDgyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5NjYxMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcxLCA4ODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMDYyMjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MiIgQDEyNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQkJCWxvY2F0aW9uICAgCSgxODE5LCAxMDEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjVGIg0KLQkJCQkJY2xpZW50ICAgICAJQDExOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5OSwgNzczKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEiIEAxMjUNCi0JCQkJbG9jYXRpb24gICAJKDE3MDIsIDE1MDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTYwMUE0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdHMiIEAxMjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNSwgMTk4MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc4OTkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDIwNDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ0LCAyMDIwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQ5NTgwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTMsIDE5NjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDUzNzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMiIgQDEzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjYxLCAxMDY5KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODgiDQotCQkJCQljbGllbnQgICAgIAlAMTI1DQotCQkJCQlzdXBwbGllciAgIAlAMTExDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDIsIDE1MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgOTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTAzOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzM2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjciIEAxMzMNCi0JCQkJbG9jYXRpb24gICAJKDExNzgsIDEyMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTQwMjREIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDEzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMTM0MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTk4MjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOTAiDQotCQkJCQljbGllbnQgICAgIAlAMTMzDQotCQkJCQlzdXBwbGllciAgIAlAMTA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3OCwgMTIzNCkNCi0JCQkJCSAgICAoOTgwLCAxMjM0KQ0KLQkJCQkJICAgICg5ODAsIDE0MTApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc4LCAxMjM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMTQxMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDYsIDEzNjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Nzc2NjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4IiBAMTM3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMw0KLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNiwgMTAzNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTUwMTlBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDExMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzgsIDEyMzQpDQotCQkJCQkgICAgKDEyNzcsIDEyMzQpDQotCQkJCQkgICAgKDEyNzcsIDk2MCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3NywgOTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NywgMTA1OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjQxMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOSIgQDE0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OCwgMTM0NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCODAyRjkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDE0MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYyLCAxNjY5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDA5MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEEiDQotCQkJCQljbGllbnQgICAgIAlAMTQwDQotCQkJCQlzdXBwbGllciAgIAlAMTEwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMTczMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NDYsIDE2NzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM2MzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwIiBAMTQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MA0KLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjcsIDEwMzcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCA5NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIzLCAxMDgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjkwMzQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRDgwMTlGIg0KLQkJCQljbGllbnQgICAgIAlAMTA2DQotCQkJCXN1cHBsaWVyICAgCUAxMDENCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRTIwMTcxIg0KLQkJCQljbGllbnQgICAgIAlAMTExDQotCQkJCXN1cHBsaWVyICAgCUAxMDINCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRUUwMzFEIg0KLQkJCQljbGllbnQgICAgIAlAMTA5DQotCQkJCXN1cHBsaWVyICAgCUAxMDMNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRjgwMUNEIg0KLQkJCQljbGllbnQgICAgIAlAMTEwDQotCQkJCXN1cHBsaWVyICAgCUAxMDQNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMDIwMDJEIg0KLQkJCQljbGllbnQgICAgIAlAMTA4DQotCQkJCXN1cHBsaWVyICAgCUAxMDUNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTUyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjIyNCwgMTQ1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzNywgMTMxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJd2lkdGggICAgICAJNTkzDQotCQkJCWhlaWdodCAgICAgCTMxMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiIEAxNTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTIwLCAyNTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDI0NjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZVJlZmVyZW5jZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiDQotCQkJCXdpZHRoICAgICAgCTY3Mg0KLQkJCQloZWlnaHQgICAgIAkxODANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE1NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyNCwgMjI3NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTUzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE1MjQsIDIyNzUpDQotCQkJCSAgICAoMTUyNCwgMjQ1NCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIzRDAzMTkiDQotCQkJCWNsaWVudCAgICAgCUAxMDgNCi0JCQkJc3VwcGxpZXIgICAJQDE1Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3NiwgMjE3NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzYsIDIyNzUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE1NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyMzUwMEREIg0KLQkJCQljbGllbnQgICAgIAlAMTEwDQotCQkJCXN1cHBsaWVyICAgCUAxNTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNzEsIDE4NTQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzcxLCAyMjc1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxNTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjI4MDJFNyINCi0JCQkJY2xpZW50ICAgICAJQDEwOQ0KLQkJCQlzdXBwbGllciAgIAlAMTUzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODAsIDE1MzQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODAsIDIyNzUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE1NCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYxIiBAMTU4DQotCQkJCWxvY2F0aW9uICAgCSgyMjA2LCAyMjU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNzRFNzg0MDFCMSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDE1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTgNCi0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY4LCAxNjcwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEyMjMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDBGIg0KLQkJCQkJY2xpZW50ICAgICAJQDE1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDE1Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDYsIDE2MTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYwLCAxNjc4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MiIgQDE2Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTgNCi0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDIzIg0KLQkJCQkJY2xpZW50ICAgICAJQDE1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDE1Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIyMDYsIDIyNTkpDQotCQkJCQkgICAgKDIyMDYsIDI1NTYpDQotCQkJCQkgICAgKDE4NTYsIDI1NTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTYsIDI1NTYpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xIERlZmluaXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTQ4QTAyNjIiDQotCQkJdGl0bGUgICAgICAJIjIuMSBEZWZpbml0aW9ucyINCi0JCQl6b29tICAgICAgIAk4Mw0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iIEAxNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDE5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDE2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRGVmaW5pdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxMTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiINCi0JCQkJd2lkdGggICAgICAJNzA2DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAxNjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODYsIDg5NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCXdpZHRoICAgICAgCTI5NA0KLQkJCQloZWlnaHQgICAgIAkxMjANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDE2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxMCwgNTQ1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkltcG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxODINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAxNjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjExMiwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwMCwgMTA1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxNjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgwOCwgMTQ4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5NiwgMTM2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyODANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAxNjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEyNCwgMTYwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDE2OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDI0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgMzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTEwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTUyOA0KLQkJCQloZWlnaHQgICAgIAk0MjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTMiIEAxNzANCi0JCQkJbG9jYXRpb24gICAJKDEzNTgsIDg2MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAxNzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTcwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTcxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDUzNSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzU2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1OCwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwMywgNTExKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU2NjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAxNzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTcwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODYsIDkwOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzkwOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkJCWNsaWVudCAgICAgCUAxNzANCi0JCQkJCXN1cHBsaWVyICAgCUAxNjQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzU4LCA4NjApDQotCQkJCQkgICAgKDEzNTgsIDk0OCkNCi0JCQkJCSAgICAoMTY3NywgOTQ4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDk0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDk4NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MjY1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NyIgQDE3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTYxMiwgNTk1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDE3OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzcNCi0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTEyKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkJCQljbGllbnQgICAgIAlAMTc3DQotCQkJCQlzdXBwbGllciAgIAlAMTY5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYxMiwgNTk1KQ0KLQkJCQkJICAgICgxNDY0LCA1OTUpDQotCQkJCQkgICAgKDE0NjQsIDQ1MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY0LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTI0LCA0OTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTg2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMTgxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE3Nw0KLQkJCQkJbG9jYXRpb24gICAJKDEyLCAyMjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjkyLCA1NTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUltcG9ydHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODAzMzUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNzcNCi0JCQkJCXN1cHBsaWVyICAgCUAxNjUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDEsIDU5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDY1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MTAwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc2LCA2NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMjU5NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMiIEAxODUNCi0JCQkJbG9jYXRpb24gICAJKDEyNzksIDExMzcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDMwMUUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE4NQ0KLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzOCwgNTkxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQjciDQotCQkJCQljbGllbnQgICAgIAlAMTg1DQotCQkJCQlzdXBwbGllciAgIAlAMTY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3OSwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMCwgNTg2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA0OTc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZXMiIEAxODkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTg1DQotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAxMTcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzEzNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEMxIg0KLQkJCQkJY2xpZW50ICAgICAJQDE4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE2Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNzksIDExMzcpDQotCQkJCQkgICAgKDEyNzksIDEyMDgpDQotCQkJCQkgICAgKDE4OTEsIDEyMDgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTEsIDEyMDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMTcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MzQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTcsIDEyNDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjQ0MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUiIEAxOTMNCi0JCQkJbG9jYXRpb24gICAJKDEyMTIsIDExNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzEwMTA0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2IiBAMTk0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE5Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDU5NCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzIwMzRBIg0KLQkJCQkJY2xpZW50ICAgICAJQDE5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDE2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTIsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYyNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1Nzk2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlcyIgQDE5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxOTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkxLCAxNDUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0VHlwZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MjM2OTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM1NCINCi0JCQkJCWNsaWVudCAgICAgCUAxOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxNjcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjEyLCAxMTU5KQ0KLQkJCQkJICAgICgxMjEyLCAxNDkwKQ0KLQkJCQkJICAgICgxNTg3LCAxNDkwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTg3LCAxNDkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMywgMTQ1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNTYxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxNTQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk1ODU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3IiBAMjAxDQotCQkJCWxvY2F0aW9uICAgCSgxMTE0LCAxNTg1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjc3MDA5NSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOCIgQDIwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMDENCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCA2ODApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3MSINCi0JCQkJCWNsaWVudCAgICAgCUAyMDENCi0JCQkJCXN1cHBsaWVyICAgCUAxNjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE0LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTU1LCA3NTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY3MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5ncyIgQDIwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMDENCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUxLCAxNjc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5ncyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2NjM0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzdCIg0KLQkJCQkJY2xpZW50ICAgICAJQDIwMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE2OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExMTQsIDE1ODUpDQotCQkJCQkgICAgKDExMTQsIDE3MTYpDQotCQkJCQkgICAgKDIxMTUsIDE3MTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDE3MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDUzLCAxNjc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQ1MDc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTQsIDE3NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTEwNzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyMDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgMjA0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyOCwgMTkyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOSIgQDIxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA2NiwgMTUzMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3QjAzMTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAiIEAyMTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMjEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDY2OSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDdGIg0KLQkJCQkJY2xpZW50ICAgICAJQDIxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDE2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMDksIDc1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxOTY5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVNlcnZpY2VzIiBAMjE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDIxMA0KLQkJCQkJbG9jYXRpb24gICAJKC01MjEsIC0xMTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkzLCAyMDI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTZXJ2aWNlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5MTgyNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDg5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDIxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDIwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwNjYsIDE1MzMpDQotCQkJCQkgICAgKDEwNjYsIDIwNTkpDQotCQkJCQkgICAgKDE2MTksIDIwNTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTksIDIwNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU0LCAyMDMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQwMTk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzIsIDIxMTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjA1MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFGODAzODIiDQotCQkJCWNsaWVudCAgICAgCUAxNjkNCi0JCQkJc3VwcGxpZXIgICAJQDE2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NCwgMjYzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg1LCAyNjMpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4zIEV4dGVuc2liaWxpdHkiDQotCQkJcXVpZCAgICAgICAJIjNBRDYwQzUxMDE5MiINCi0JCQl0aXRsZSAgICAgIAkiMi4xLjMgRXh0ZW5zaWJpbGl0eSINCi0JCQl6b29tICAgICAgIAk4MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDIxOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAxNTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTQsIDE1MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCXdpZHRoICAgICAgCTE4Mg0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEAyMjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDE4ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0ODcsIDE4MzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIyMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0MiwgMTY3NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJd2lkdGggICAgICAJMTgyDQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMjIyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCAyMzM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAyMjgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiDQotCQkJCXdpZHRoICAgICAgCTI3NA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iIEAyMjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDczNiwgMTc2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYzLCAxNzA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjQNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCAxMzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgODYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiINCi0JCQkJd2lkdGggICAgICAJODA0DQotCQkJCWhlaWdodCAgICAgCTE3Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBAMjI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDE5NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMTg5OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzQNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBAMjI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAyMTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NjMsIDIwOTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJCXdpZHRoICAgICAgCTMwOA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAyMjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMTI5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEyMzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTIyMg0KLQkJCQloZWlnaHQgICAgIAkxNDYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMjI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM1LCAxMzU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDIyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgNjg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwOSwgNTgwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSINCi0JCQkJd2lkdGggICAgICAJNTYwDQotCQkJCWhlaWdodCAgICAgCTI0MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyMzANCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgMTAzOSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQ4MCwgMTAzOSkNCi0JCQkJICAgICg0ODAsIDgwOCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MDBDQjAwQUEiDQotCQkJCWNsaWVudCAgICAgCUAyMjANCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2NiwgMTgyNCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjYsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1QTQwMjdFIg0KLQkJCQljbGllbnQgICAgIAlAMjI2DQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTcsIDIwNzkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk3LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA5Mzg2MDJDOSINCi0JCQkJY2xpZW50ICAgICAJQDIyMg0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE5LCAyMjcxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxOSwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjU5QjAwNzIiDQotCQkJCWNsaWVudCAgICAgCUAyMjUNCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTg4LCAxODg3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg4LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDYwMDkyMDJGNyINCi0JCQkJY2xpZW50ICAgICAJQDIyMw0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3OTcsIDE2OTUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTcsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZBMEYwMkYwIg0KLQkJCQljbGllbnQgICAgIAlAMjE5DQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYwMSwgMTUxOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwMSwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkRCODAzRDQiDQotCQkJCWNsaWVudCAgICAgCUAyMjcNCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExLCAxMjIzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExLCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSINCi0JCQkJY2xpZW50ICAgICAJQDIyOA0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0MTQsIDEzNDQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZBMjAwMjVFIg0KLQkJCQljbGllbnQgICAgIAlAMjIxDQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE2NjMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI5LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDU4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkJCXdpZHRoICAgICAgCTU2Mw0KLQkJCQloZWlnaHQgICAgIAkyMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAyNDENCi0JCQkJbG9jYXRpb24gICAJKDExOTEsIDY3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAyNDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjQxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg0NywgNjMxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJCQljbGllbnQgICAgIAlAMjQxDQotCQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjAsIDY3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzMCwgNjI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM5Njk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMjQ1DQotCQkJCQlQYXJlbnRfVmlldyAJQDI0MQ0KLQkJCQkJbG9jYXRpb24gICAJKDIzLCA1NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzU1LCA1MjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3OTA3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkJCWNsaWVudCAgICAgCUAyNDENCi0JCQkJCXN1cHBsaWVyICAgCUAyNDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjMsIDY3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTYsIDYyNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTQwMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYzLCA3NjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI0NzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IiBAMjQ5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDE5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIldTRExFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCINCi0JCQkJd2lkdGggICAgICAJNzc0DQotCQkJCWhlaWdodCAgICAgCTI0MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNTANCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDQwMikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMjQ5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEwMDgsIDQwMikNCi0JCQkJICAgICgxMDA4LCAzMTIpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZFM0MwM0Q0Ig0KLQkJCQljbGllbnQgICAgIAlAMjI5DQotCQkJCXN1cHBsaWVyICAgCUAyNDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5MiwgNTY4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDkyLCA0MDIpDQotCQkJCWRyYXdTdXBwbGllciAJQDI1MCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxNDkwM0QwIg0KLQkJCQljbGllbnQgICAgIAlAMjQwDQotCQkJCXN1cHBsaWVyICAgCUAyMjQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMTUsIDU3MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTUsIDI0NikpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRERGNTM1MDJDMyINCi0JCQkJY2xpZW50ICAgICAJQDI0MA0KLQkJCQlzdXBwbGllciAgIAlAMjQ5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzYyLCA1NzEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYyLCA0MDIpDQotCQkJCWRyYXdTdXBwbGllciAJQDI1MCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDE2LCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzMxLCAxMzA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU3MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkJCXdpZHRoICAgICAgCTU4OA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFFQzAxQ0IiDQotCQkJCWNsaWVudCAgICAgCUAyNTQNCi0JCQkJc3VwcGxpZXIgICAJQDI0MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc5NiwgMTI5NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3OTYsIDgwNSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDI1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjMxMSwgMTY4NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBMjAyNkUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGFyZW50IiBAMjU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDI1Ng0KLQkJCQkJbG9jYXRpb24gICAJKDI3OSwgMjk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQyMiwgMTMzMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQiINCi0JCQkJCWNsaWVudCAgICAgCUAyNTYNCi0JCQkJCXN1cHBsaWVyICAgCUAyNTQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzExLCAxNjg2KQ0KLQkJCQkJICAgICgyNDMyLCAxNjg2KQ0KLQkJCQkJICAgICgyNDMyLCAxMzc0KQ0KLQkJCQkJICAgICgyMzEwLCAxMzc0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjMxMSwgMTY4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzEwLCAxMzc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2NiwgMTQyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY2hpbGRyZW4iIEAyNjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMjU2DQotCQkJCQlsb2NhdGlvbiAgIAkoMjc5LCAyOTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODk5LCAxNTM3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NoaWxkcmVuIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk4NTYxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJDIg0KLQkJCQkJY2xpZW50ICAgICAJQDI1Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDI1NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzMTEsIDE2ODYpDQotCQkJCQkgICAgKDIwMTYsIDE2ODYpDQotCQkJCQkgICAgKDIwMTYsIDE0MjUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTYsIDE0MjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDcwLCAxNDgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciDQotCQkJcXVpZCAgICAgICAJIjNBRThFRDcyMDFCRCINCi0JCQl0aXRsZSAgICAgIAkiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIg0KLQkJCXpvb20gICAgICAgCTkwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0IiBAMjYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcxMiwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAxNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTgwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUltcG9ydCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjIsIDEyNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTgwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5Ig0KLQkJCQl3aWR0aCAgICAgIAk1OTgNCi0JCQkJaGVpZ2h0ICAgICAJMjE4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiIEAyNjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDExMzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMiwgMTA0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJOYW1lc3BhY2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIg0KLQkJCQl3aWR0aCAgICAgIAk0NzkNCi0JCQkJaGVpZ2h0ICAgICAJMjE1DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDI2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMjE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjk0LCAxMTQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTY5NA0KLQkJCQloZWlnaHQgICAgIAkxNzMNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAyNjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDAwLCAzODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NCwgMjM2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQl3aWR0aCAgICAgIAk0OTANCi0JCQkJaGVpZ2h0ICAgICAJMzIwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM3IiBAMjY3DQotCQkJCWxvY2F0aW9uICAgCSgzMDksIDc4NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NTAwMkQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU5hbWVzcGFjZXMiIEAyNjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjY3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjEsIDk1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTmFtZXNwYWNlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5ODg0Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRDU2MDMzMiINCi0JCQkJCWNsaWVudCAgICAgCUAyNjcNCi0JCQkJCXN1cHBsaWVyICAgCUAyNjQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCAxMDI5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ4LCA5NzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Njg3MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4LCA5MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjUwOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM4IiBAMjcyDQotCQkJCQlQYXJlbnRfVmlldyAJQDI2Nw0KLQkJCQkJbG9jYXRpb24gICAJKC05MSwgMjU4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY4LCA1OTIpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMjgiDQotCQkJCQljbGllbnQgICAgIAlAMjY3DQotCQkJCQlzdXBwbGllciAgIAlAMjY2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgNTQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5LCA1ODMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDQ5NjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDI3NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0NzIsIDcyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NSwgNTgwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkltcG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiDQotCQkJCXdpZHRoICAgICAgCTQ1Mg0KLQkJCQloZWlnaHQgICAgIAkzMDQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTEiIEAyNzYNCi0JCQkJbG9jYXRpb24gICAJKDE0ODYsIDEwMDEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFEQ0MwMkU1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVTY2hlbWEiIEAyNzcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjc2DQotCQkJCQlsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNywgMTAxOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkyNTkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFEQ0UwMjcwIg0KLQkJCQkJY2xpZW50ICAgICAJQDI3Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDI2NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0ODYsIDEwMDEpDQotCQkJCQkgICAgKDE2MzIsIDEwMDEpDQotCQkJCQkgICAgKDE2MzIsIDExMzApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCAxMDAxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzIsIDExMzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTYzLCAxMDE4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkyNTkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MiIgQDI4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNzYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MTAsIC0xMDMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFEQ0UwMjdBIg0KLQkJCQkJY2xpZW50ICAgICAJQDI3Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDI3NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCAxMDAwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODYsIDg3MikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM5IiBAMjgxDQotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCA0MDMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0EwMDJEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQwIiBAMjgyDQotCQkJCQlQYXJlbnRfVmlldyAJQDI4MQ0KLQkJCQkJbG9jYXRpb24gICAJKDY4NywgLTEyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjgyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDYsIDQ4MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRTNDMDFGMiINCi0JCQkJCWNsaWVudCAgICAgCUAyODENCi0JCQkJCXN1cHBsaWVyICAgCUAyNzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDg3LCA0MDMpDQotCQkJCQkgICAgKDEzNjQsIDQwMykNCi0JCQkJCSAgICAoMTM2NCwgNTY4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgNDAzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjQsIDU2OCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRGVmaW5pdGlvbiIgQDI4NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyODENCi0JCQkJCWxvY2F0aW9uICAgCSg2ODcsIC0xMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDUsIDM2MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNzUzMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUU4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDI4MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDI2Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ1LCA0MDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjcsIDQ1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDkxMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NyIgQDI4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNzM3LCA4MjYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMjg4DQotCQkJCQlQYXJlbnRfVmlldyAJQDI4Nw0KLQkJCQkJbG9jYXRpb24gICAJKC02NzEsIDEwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1MiwgNjQ3KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIg0KLQkJCQkJY2xpZW50ICAgICAJQDI4Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDI2Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDczNywgODI2KQ0KLQkJCQkJICAgICg1MTAsIDgyNikNCi0JCQkJCSAgICAoNTEwLCA1NDQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDU0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ1NywgNTk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDI5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyODcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjcxLCAxMDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQ0LCA3NzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUltcG9ydHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTkxODkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRCINCi0JCQkJCWNsaWVudCAgICAgCUAyODcNCi0JCQkJCXN1cHBsaWVyICAgCUAyNzUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI0NiwgODI2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4MCwgODc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyMjExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNjIsIDkzMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzNzcyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyOTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMjAwRDAzNDAiDQotCQkJCWNsaWVudCAgICAgCUAyNzUNCi0JCQkJc3VwcGxpZXIgICAJQDI2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1NSwgNTY4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1NSwgMzMzKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjIgVHlwZXMiDQotCQkJcXVpZCAgICAgICAJIjNCODVBRTU5MDM3RSINCi0JCQl0aXRsZSAgICAgIAkiMi4yIFR5cGVzIg0KLQkJCXpvb20gICAgICAgCTkwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAk4MQ0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDI5Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDEyMzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODk1LCAxMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJNTAwDQotCQkJCWhlaWdodCAgICAgCTE3NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAyOTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMTYwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTA2LCAxNTMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTQ3OA0KLQkJCQloZWlnaHQgICAgIAkxNjINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAyOTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxOTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDIyLCAxODI4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQl3aWR0aCAgICAgIAk1MzUNCi0JCQkJaGVpZ2h0ICAgICAJMzA1DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMjk5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDEwNjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCXdpZHRoICAgICAgCTQ2Ng0KLQkJCQloZWlnaHQgICAgIAkyNTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDciIEAzMDANCi0JCQkJbG9jYXRpb24gICAJKDczNSwgMTE3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAwQzQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEAzMDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzAwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTQzLCA2NzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzUsIDExMzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNjkwMDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDMyNyINCi0JCQkJCWNsaWVudCAgICAgCUAzMDANCi0JCQkJCXN1cHBsaWVyICAgCUAyOTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NiwgMTE3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzOSwgMTIwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4ODcwNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDgiIEAzMDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzAwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTQzLCA2NzYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzMxIg0KLQkJCQkJY2xpZW50ICAgICAJQDMwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDI5OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg1LCAxMTcyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDkiIEAzMDUNCi0JCQkJbG9jYXRpb24gICAJKDUyNywgMTU5MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxMjAzQjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudERlY2xhcmF0aW9uIiBAMzA2DQotCQkJCQlQYXJlbnRfVmlldyAJQDMwNQ0KLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2NiwgMTU1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzUzOTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQzE0MDAxQyINCi0JCQkJCWNsaWVudCAgICAgCUAzMDUNCi0JCQkJCXN1cHBsaWVyICAgCUAyOTcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NywgMTU5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNywgMTY0NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1NTg3Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTAiIEAzMDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzA1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY1LCAxMDk2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQzE0MDAyNiINCi0JCQkJCWNsaWVudCAgICAgCUAzMDUNCi0JCQkJCXN1cHBsaWVyICAgCUAyOTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg1MjcsIDE1OTIpDQotCQkJCQkgICAgKDQzNywgMTU5MikNCi0JCQkJCSAgICAoNDM3LCAxMzEzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgMTMxMykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU1IiBAMzEwDQotCQkJCWxvY2F0aW9uICAgCSgzMjIsIDE5MTEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTMwM0U1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMzExDQotCQkJCQlQYXJlbnRfVmlldyAJQDMxMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xNCwgMTE5MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzOCwgMTg3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0ODU2MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTBFIg0KLQkJCQkJY2xpZW50ICAgICAJQDMxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDI5OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTkxMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk0MywgMTk2NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTYiIEAzMTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDExOCINCi0JCQkJCWNsaWVudCAgICAgCUAzMTANCi0JCQkJCXN1cHBsaWVyICAgCUAyOTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzMjIsIDE5MTEpDQotCQkJCQkgICAgKDIyOSwgMTkxMSkNCi0JCQkJCSAgICAoMjI5LCAxMzEzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOSwgMTMxMykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDMxNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgNjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDUxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCXdpZHRoICAgICAgCTM4OQ0KLQkJCQloZWlnaHQgICAgIAkyMTYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAzMTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQl3aWR0aCAgICAgIAkyMjINCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMzE3DQotCQkJCWxvY2F0aW9uICAgCSgyMzQsIDYwNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMzE4DQotCQkJCQlQYXJlbnRfVmlldyAJQDMxNw0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgNjQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNw0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VUeXBlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY2MTAxNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDMxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMxNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDYsIDYwNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyNiwgNTY5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgzODgzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDMyMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCAzOTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzMsIDMxMykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzU2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMxNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNCwgNjA0KQ0KLQkJCQkJICAgICgxNzQsIDYwNCkNCi0JCQkJCSAgICAoMTc0LCAyMjUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDIyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzIxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOCwgMjcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3NzI5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiIEAzMjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNSwgMjAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklUeXBlcyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNSwgMTUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0JCMjAwNTAiDQotCQkJCXdpZHRoICAgICAgCTI0OA0KLQkJCQloZWlnaHQgICAgIAkxNjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcyOCwgODAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzU5LCA3NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzM5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYwRDcwMzlDIg0KLQkJCQl3aWR0aCAgICAgIAk3NTcNCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDMyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxMjE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTI5LCAxMTAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTY3Mw0KLQkJCQloZWlnaHQgICAgIAkyNTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTkiIEAzMjcNCi0JCQkJbG9jYXRpb24gICAJKDE4MjYsIDk3NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NTAwRjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjAiIEAzMjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzI3DQotCQkJCQlsb2NhdGlvbiAgIAkoMzA2LCA0NDcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNEIg0KLQkJCQkJY2xpZW50ICAgICAJQDMyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMyNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgODU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3NCwgOTAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjU2NDg5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWEiIEAzMzANCi0JCQkJCVBhcmVudF9WaWV3IAlAMzI3DQotCQkJCQlsb2NhdGlvbiAgIAkoMzA2LCA0NDcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA2LCAxMDMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNzU3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRSINCi0JCQkJCWNsaWVudCAgICAgCUAzMjcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDEwOTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzg4LCAxMDUwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjUxNTE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzMzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NBRENEM0IwMzgwIg0KLQkJCQljbGllbnQgICAgIAlAMzE1DQotCQkJCXN1cHBsaWVyICAgCUAzMjQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwNSwgNTAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzA1LCAzMDcpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMzM0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA1NiwgMjI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxNSwgMTMwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSINCi0JCQkJd2lkdGggICAgICAJNTAwDQotCQkJCWhlaWdodCAgICAgCTIxMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSINCi0JCQkJY2xpZW50ICAgICAJQDMxNQ0KLQkJCQlzdXBwbGllciAgIAlAMzM0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTQsIDUwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NCwgMzMwKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDMzNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA0NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTAsIDM2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkJCXdpZHRoICAgICAgCTY4Nw0KLQkJCQloZWlnaHQgICAgIAkyMTYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAzMzcNCi0JCQkJbG9jYXRpb24gICAJKDEyMDYsIDQ5MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAzMzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzM3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgMzg2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIg0KLQkJCQkJY2xpZW50ICAgICAJQDMzNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMzNA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMDYsIDQ5MykNCi0JCQkJCSAgICAoMTA5NCwgNDkzKQ0KLQkJCQkJICAgICgxMDk0LCAzMzApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMzMwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0MiwgMzc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODI4MzI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMzQxDQotCQkJCQlQYXJlbnRfVmlldyAJQDMzNw0KLQkJCQkJbG9jYXRpb24gICAJKC01ODYsIDIzNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExOTYsIDQ1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAzOTcxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIg0KLQkJCQkJY2xpZW50ICAgICAJQDMzNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMzNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MSwgNDkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxNSwgNTQ2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY0OTU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTYsIDM5MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NDkxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjI3RjAwQjciDQotCQkJCWNsaWVudCAgICAgCUAzMjUNCi0JCQkJc3VwcGxpZXIgICAJQDMzNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgxMiwgNzQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgNTcyKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjMgTWVzc2FnZXMiDQotCQkJcXVpZCAgICAgICAJIjNCQ0U4NTNEMDJDOCINCi0JCQl0aXRsZSAgICAgIAkiMi4zIE1lc3NhZ2VzIg0KLQkJCXpvb20gICAgICAgCTg1DQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSIgQDM0Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCAxMjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSU1lc3NhZ2UiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiDQotCQkJCXdpZHRoICAgICAgCTM4MA0KLQkJCQloZWlnaHQgICAgIAkzMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IiBAMzQ3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCAxMjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTk5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBhcnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCA3NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTk5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5M0YwMUJFIg0KLQkJCQl3aWR0aCAgICAgIAk2MTcNCi0JCQkJaGVpZ2h0ICAgICAJMzI0DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDM0OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDgxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgNjkwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQl3aWR0aCAgICAgIAk0OTINCi0JCQkJaGVpZ2h0ICAgICAJMjc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzQ5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5NkQwMkYxIg0KLQkJCQljbGllbnQgICAgIAlAMzQ4DQotCQkJCXN1cHBsaWVyICAgCUAzNDcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDQsIDY3OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDQsIDM4NikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDM1MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgNjU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDUwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJd2lkdGggICAgICAJNDMyDQotCQkJCWhlaWdodCAgICAgCTMyMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM1MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOEQxMDJCQSINCi0JCQkJY2xpZW50ICAgICAJQDM1MA0KLQkJCQlzdXBwbGllciAgIAlAMzQ2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDUsIDQ5NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgMzg4KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEAzNTINCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgOTUyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRUJFMDBFMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFydHMiIEAzNTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzUyDQotCQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NTIsIDg5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUGFydHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTc0NTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDRUJGMDA2MSINCi0JCQkJCWNsaWVudCAgICAgCUAzNTINCi0JCQkJCXN1cHBsaWVyICAgCUAzNDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgOTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTg3LCAxMDA1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5ODA5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2NywgMTA2MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0MjAzOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIiIEAzNTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzUyDQotCQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MDQsIDg5MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkYwMDU3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDM1Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDM1MA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDY4OCwgOTUyKQ0KLQkJCQkJICAgICg0NDUsIDk1MikNCi0JCQkJCSAgICAoNDQ1LCA4MTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDk1MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDgxNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM5MywgOTEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ3NjA0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkpKSkpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJzb2FwIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkVkFCQVNFX1BMVUdJTlNfUEFUSFxcY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nc1xcc3JjXFxyb3NlXFxjb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLlNPQVAuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjNBMDFDRjBDMDFBMiIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ4c2QiDQotCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiWFNEIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIm9yZy5lY2xpcHNlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJInhzZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3hzZC8yMDAyL1hTRCIpKQ0KLQkJcXVpZCAgICAgICAJIjM5QUJEQzZGMDFBQSINCi0JCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREFubm90YXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTE3NzAxMTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZENEUyMDM2NiINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFwcGxpY2F0aW9uSW5mb3JtYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQkJGN0VCRjAyQzgiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZXJJbmZvcm1hdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RUVBMDE1NyINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RjA1MDFFMiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJET01BdHRyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUI3REMwMTkzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjEwM0JFIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4N0Y1MjAyQjQiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2OTQwMjAwMDg5Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNzJEOEUyMDBFQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwM0EwMjIxIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkVCMDJBOCINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjdCMDM4NiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlVXNlIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ3MzcwMzhGIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNzJEN0JCMDM0OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQ0YzMDI3RCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRERCMDNCNyINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RyYWludCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDREUwMDJEOCINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnN0cmFpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjAyMjAzODIiDQotCQkJCXR5cGUgICAgICAgCSJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjcxOUQ5MDM0MSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RCb3VuZGVkRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NTFEMDM0NCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzYzQzAyMjQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1MkEwMENDIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzU1RDAzRDIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NEYwMTMxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NTZDMDE1MyINCi0JCQkJdHlwZSAgICAgICAJIlhTRENhcmRpbmFsaXR5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEI4MDI4NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCQUEyMDMxMCINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcml2YXRpb25NZXRob2QiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzZFNDAyMEUiDQotCQkJCXR5cGUgICAgICAgCSJYU0REZXJpdmF0aW9uTWV0aG9kIg0KLQkJCQlpbml0diAgICAgIAkicmVzdHJpY3Rpb24iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNzFEMDI2QSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wbGV4RmluYWwiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhYnN0cmFjdCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNzM4MDBDNSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb250ZW50VHlwZUNhdGVnb3J5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNBNDIwMkI4Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNCOEEwM0U2Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2MTgwMTREIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBsZXhGaW5hbCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEZCOTcwMDZFIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWl4ZWQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzMxQUY1RTAzQTYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBvbmVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDRUE5MDNEMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUREQjUwMUE1Ig0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2QjM0MDA5MyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4MDAzOTQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpYWdub3N0aWMiDQotCQkJcXVpZCAgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRDRDMEY0QzAxQTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXZlcml0eSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OTFDMDA1RCINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpYWdub3N0aWNTZXZlcml0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNUZERDAyODAiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNDMDYzNzQzMDE2QiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpbmUiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjA3RTAyMTMiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWluaXR2ICAgICAgCSIxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29sdW1uIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYxMUUwMjk2Ig0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vZGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzAxNkI2QjAyMDAiDQotCQkJCXR5cGUgICAgICAgCSJET01Ob2RlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYW5ub3RhdGlvblVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNDMDYzNzRGMDE4NiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NUYxNzAwMkUiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTY2MDMzOSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuaWxsYWJsZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRkI0MDI5RiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNDY4MDM2OCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNEEwMDNCOSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhYnN0cmFjdCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNEUwMDAwRSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDE0QzAwQjIiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9jayINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMTY4MDFDMSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODlGNjIwM0NGIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzM0RENCMDAwMTgiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREVudW1lcmF0aW9uRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM5RDAzQzciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0M2NDAwNTQiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMjU2ODAyNTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzczNzQwMjUzIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFjZXROYW1lIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUZCNDAxRUMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlZmZlY3RpdmVWYWx1ZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEFBRTMwM0I2Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZlYXR1cmUiDQotCQkJcXVpZCAgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRjgxMDIwRiINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RyYWludCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRjg4MDBDNSINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnN0cmFpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmb3JtIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwMkIwMzNFIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjcxQTFCMDE2RiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImdsb2JhbCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwMDcwMzcyIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZlYXR1cmVSZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMDQ0MDE4NSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZpeGVkRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2OTlFMDBDMSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4ODAxQjQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaXhlZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QTYwMDIwMSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3OUJFMDJFRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I5OTAwMTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc5RDIwMDhBIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2OUU4MDFENiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM3QjAzOTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NEFBMzAyNDIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMUM3MDE0MyINCi0JCQkJdHlwZSAgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREltcG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDOTMwMTdGIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEQ5MDAzRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBREIxNTAzNkMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESW5jbHVkZSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDN0QwMjUwIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOERDMDM4MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIg0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRExlbmd0aEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3ODAwMkRGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NzZDMDA0QiINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhFeGNsdXNpdmVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4OTYwMEMyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjhFMDMwOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRDMxMDNBRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUVFMjAxRjciDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluY2x1c2l2ZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExNzQwMjdEIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2l2ZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExOTMwMzU0Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4SW5jbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODdEMDBEQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I4MzAzQjgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4TGVuZ3RoRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I3RDAwRkMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3REEwMEYzIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzkyRDAwMEEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTkwMjgxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFEMjQwMDk4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUQxMDM5OCINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFBMjAwOEUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhjbHVzaXZlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFCRTAzRTIiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5JbmNsdXNpdmVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4ODcwMkM5Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjUyMDM1MyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5MZW5ndGhGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3OEMwMDY1Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3N0M0MDBDMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc5OTAxNUUiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETW9kZWxHcm91cCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTY0MDI3OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tcG9zaXRvciINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjFEMDFDRiINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBvc2l0b3IiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJFMjAzODEiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QkQyNTUwMzg1Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM0MDA5MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFGNjAyRTgiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTIwMTk3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDcwMDAxNDIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDcwNDAzMUUiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGlhc05hbWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNTdGMDEyNyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVSSSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1ODcwMEUyIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxpYXNVUkkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNUFBMDJBRiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDk2MzAyNUUiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDk0MzAyRjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNEYwMjNDIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN5c3RlbUlkZW50aWZpZXIiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDMyRTAwRjAiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwdWJsaWNJZGVudGlmaWVyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQzMzQwMzk3Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE51bWVyaWNGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1OTUwMjA2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjQyMDA3NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzVBMzAwMTIiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE9yZGVyZWRGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc0REQwMjQ4Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjU5MDEyQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzRGNjAyREEiDQotCQkJCXR5cGUgICAgICAgCSJYU0RPcmRlcmVkIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhcnRpY2xlIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4RkMwMUU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1pbk9jY3VycyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjhFMDNCMiINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtYXhPY2N1cnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0Y5OTAzQUUiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWluaXR2ICAgICAgCSIxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QkQyMjMwMEM2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNzgwQkQ5MDA1OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGF0dGVybkZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDQTUwMzhEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdDNzkwMzExIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCINCi0JCQlxdWlkICAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZENEJBMDIzQyINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzI5MEEyNjAzNkQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaXJjdWxhciINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2ODAwMjE2Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBRTIwNjAxNzIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyQjMwMUQ1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5lIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5QjAyQUQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNjQwMjQwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiDQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVwZWF0YWJsZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNkFBNjAzMUEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDOEYwMDJFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWEiDQotCQkJcXVpZCAgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NEU1MDNERCINCi0JCQkJdHlwZSAgICAgICAJIkRPTURvY3VtZW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NoZW1hTG9jYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NjhFQzAyMjYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOUJGRjAxODAiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVGb3JtRGVmYXVsdCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDRCMDEwMiINCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iDQotCQkJCWluaXR2ICAgICAgCSJ1bnF1YWxpZmllZCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRGb3JtRGVmYXVsdCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDc4MDBBQyINCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iDQotCQkJCWluaXR2ICAgICAgCSJ1bnF1YWxpZmllZCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsRGVmYXVsdCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDNEE3MDAzOCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrRGVmYXVsdCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNTlEMDJEOCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZlcnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzRDIyRDZEODAzNTYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQlxdWlkICAgICAgIAkiM0MyMURCNDEwMkFFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhFNjAzNzIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMzIxMDJBRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NoZW1hTG9jYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRDlCMzAzMzAiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjb3BlIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNENjQwMjMxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODVGNTUwMzJCIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFyaWV0eSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzMTU4MDBBOSINCi0JCQkJdHlwZSAgICAgICAJIlhTRFZhcmlldHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NDRGMDE0NiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RTaW1wbGVGaW5hbCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNjVFMDM1QSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RTaW1wbGVGaW5hbCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbGlkRmFjZXRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEFCMEYwMEI2Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUZXJtIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4QUEwMUQzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI0NDAwNjkiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRvdGFsRGlnaXRzRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I2MTAzMzciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc5QUIwMjMyIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRjUwMTNBIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc4NjIwMDQ1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3ODUwMDIwMSINCi0JCQkJdHlwZSAgICAgICAJIlhTRFdoaXRlU3BhY2UiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2lsZGNhcmQiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NEEzQTAwNDEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMEU5MDE5RSINCi0JCQkJdHlwZSAgICAgICAJIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZUNvbnN0cmFpbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjk3Q0Y4NjAyMjMiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvY2Vzc0NvbnRlbnRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQxMkUwMUU0Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvY2Vzc0NvbnRlbnRzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkE3QkRCNzAxRjkiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4NEY3MDA5MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YXJpZXR5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDkwMTUwM0RFIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEWFBhdGhWYXJpZXR5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjdCQkJFMTAxQjEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NQXR0ciINCi0JCQlxdWlkICAgICAgIAkiM0JCRjhDODkwMUI2Ig0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5BdHRyIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjhDQjAwMEQ1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTURvY3VtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI3ODUwRTAzODEiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzg1MUIwM0M2Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCODE4OTc5MDIwMCINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCODE4OURCMDM3NCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Ob2RlIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjRBNTAxMTciDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLk5vZGUiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjVCRjAwMkQiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiVmFsdWUiDQotCQkJcXVpZCAgICAgICAJIjNDMDQwQjVCMDMxRiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5sYW5nLk9iamVjdCINCi0JCQkJcXVpZCAgICAgICAJIjNDMDQwQjhEMDNENSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSINCi0JCQlxdWlkICAgICAgIAkiM0JBN0IwRTgwMUE4Ig0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcHRpb25hbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTE1MDJCNyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2hpYml0ZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjEyMjAyRDMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTI5MDJGMCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDYXJkaW5hbGl0eSINCi0JCQlxdWlkICAgICAgIAkiM0JDNzcxNUQwMDlCIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5pdGUiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFEQzAyRUQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb3VudGFibHlJbmZpbml0ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUVDMDE0MSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4RmluYWwiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDMkNBMDFDQiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyRTcwMERBIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFQTAxNkEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjZEMjAxMTIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9zaXRvciINCi0JCQlxdWlkICAgICAgIAkiM0I4NjlCNjIwMDM3Ig0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2OUJEMDAwMDMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaG9pY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2OUNCODAxMUUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXF1ZW5jZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5Q0U1MDA1NyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg2OUUyNjAxQUUiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlZmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2OUU4RTAyNTgiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaXhlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5RTk5MDI3MSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb250ZW50VHlwZUNhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg2QTc5RjAzQTIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVtcHR5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3Q0QwMkYwIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2ltcGxlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDEwMENFIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWl4ZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMzAxQjciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50T25seSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0Q3MDJFOSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REZXJpdmF0aW9uTWV0aG9kIg0KLQkJCXF1aWQgICAgICAgCSIzQjg2QTBCMDAwQ0UiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMEM4MDMyOSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkEwQ0MwMTYyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpYWdub3N0aWNTZXZlcml0eSINCi0JCQlxdWlkICAgICAgIAkiM0JGRTY4QTcwMzJGIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYXRhbCINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEMzMDNEMCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVycm9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4RTcwMEUzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAid2FybmluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEVBMDFGRiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluZm9ybWF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTdGQzIwMTlBIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzVBNDAzREYiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN1YnN0aXR1dGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjc5MDA0NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjdGMDFBQyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2ODMwMjBCIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNDUwMDY5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZvcm0iDQotCQkJcXVpZCAgICAgICAJIjNCOUY5MTNCMDFFQiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicXVhbGlmaWVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkxNkYwMDIzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5xdWFsaWZpZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTE4QzAwN0YiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCODZBMUUwMDI3MiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2V5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTIwMDg1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2V5cmVmIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTMwMTRGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pcXVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTYwMzY1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1RUEwMDIzIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2MDAwMzQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJub3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2MjAwNUYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2NTAxMTciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNET3JkZXJlZCINCi0JCQlxdWlkICAgICAgIAkiM0JDNzcxNTIwMkU0Ig0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWxzZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUE5MDI3MSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcnRpYWwiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFCQjAxRkYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0b3RhbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUM0MDFCMiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQcm9jZXNzQ29udGVudHMiDQotCQkJcXVpZCAgICAgICAJIjNCOEZGOEM3MDI4NCINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3RyaWN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RjgwMDQ1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGF4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RjYwMzhCIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2tpcCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEU4MDJCQSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1QkUwMjcyIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4QjAwQjgiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjk0MDI5MSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGMjUwMDI5NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVGaW5hbCINCi0JCQlxdWlkICAgICAgIAkiM0I5N0MyNUQwMjk1Ig0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODEwMjMwIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4MzAxMzgiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjg4MDI0RSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNkUwMDM3NCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNTkxMDBBRSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NjQwMjMxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY2RDAyMTYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVmFyaWV0eSINCi0JCQlxdWlkICAgICAgIAkiM0I4RkY3NzMwMjQ5Ig0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdG9taWMiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBNzAyREYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QUQwMTM5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRjAzOUYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2hpdGVTcGFjZSINCi0JCQlxdWlkICAgICAgIAkiM0JFRUQwRjYwMzQyIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVzZXJ2ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTBGMDExNyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcGxhY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEyNzAzNEQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2xsYXBzZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTI5MDM5NiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RYUGF0aFZhcmlldHkiDQotCQkJcXVpZCAgICAgICAJIjNCOEZGQjg5MDMzQSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VsZWN0b3IiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRkJBQzAxOTIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaWVsZCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGQkIzMDI3OCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NCINCi0JCQlxdWlkICAgICAgIAkiM0M2MjZFQTcwMTAyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQTkwMTkxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVBOTAxOTIiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REFEQzAyRjUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjciDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REFERDAyMzgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURBREQwMjQyIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAwNkYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAzMEUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDMxOCINCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDcwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzU2QjAyQ0IiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1NkQwMEE3Ig0KLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDcyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZCNDI2QjAxOTQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2RDAzMDkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2RDAzMTMiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwNjAyOTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwNzAxNzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjA3MDE3MiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NiINCi0JCQlxdWlkICAgICAgIAkiM0I2OTQwNEUwMDY3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwNTAwMjlCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwNTAwMkE1Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzU5RjAwODYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzVBMDAwNjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1QTAwMDZBIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlVXNlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODAiDQotCQkJcXVpZCAgICAgICAJIjNDMjc1RDMyMDIyMCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc1RDNDMDEwQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3NUQzQzAxMEQiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODIiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4N0JGMDE1MCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4N0MwMDBBNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCNDI1RTAxRjkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2MjAwNDYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA1MCINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1ODUwMTBEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1ODYwMEZBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NjAwRkIiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODgiDQotCQkJcXVpZCAgICAgICAJIjNCNkYxREU5MDE4QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkYxREVBMDM2QyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzgwIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5MCINCi0JCQlxdWlkICAgICAgIAkiM0I5MDA2ODgwMUMyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2OEEwMTExIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRBbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2OEEwMTFCIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudEFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5MiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODMzMzUwMzQwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzMzYwMjhEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzMzYwMjhFIg0KLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5NCINCi0JCQlxdWlkICAgICAgIAkiM0I2RkRERDcwMTEzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RkREREEwMjZCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGREREQTAyNzUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5NiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM3REYwMjRGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3RTEwMEZEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTgiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzOTU5MDA2RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzOTU5MDM0OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAzNEEiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5OEUzNjAzODYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OThFMzgwMDcyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OThFMzgwMDdDIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlQ29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwMiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODUxQkEwMTI2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwMyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1MUJCMDE1MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUxIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwNCINCi0JCQlxdWlkICAgICAgIAkiM0I3NTFCMDgwM0M3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRhaW5lciINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjBDMDFDRSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRhaW5lciINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA1Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwNiINCi0JCQlxdWlkICAgICAgIAkiM0I3NTFCNDgwMjYxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RDb250YWluZXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODUiDQotCQkJCWxhYmVsICAgICAgCSJyb290Q29udGFpbmVyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDciDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMTAzNTYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFDMzMwMzMxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzM0IiDQotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExMCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEEwMDY2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExMSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBCMDIzRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEIwMjQ5Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExMiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODkxMTQwMUFGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExMyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNyINCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwMDU4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDNCRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0MwIg0KLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODMzRUYwMTYwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzM0YwMDI5OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzM0YwMDI5OSINCi0JCQkJbGFiZWwgICAgICAJImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCNDFFNjAyNTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQxRUEwMkY3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAzMEIiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5QzA1OTAxOTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUMwNUQwMUUzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUMwNUQwMUVEIg0KLQkJCQlsYWJlbCAgICAgIAkic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIyIg0KLQkJCXF1aWQgICAgICAgCSIzQzQyREJERDAyOTciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0MkRCRTAwMTFFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMjgiDQotCQkJCWxhYmVsICAgICAgCSJzdWJzdGl0dXRpb25Hcm91cCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZEMjNCOTAxQ0QiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDIzQkEwMUM0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDRSINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjYiDQotCQkJcXVpZCAgICAgICAJIjNCNkQ1OTcxMDJFQSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMDUiDQotCQkJCWxhYmVsICAgICAgCSJzaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI3Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU5NzUwMTE5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyOCINCi0JCQlxdWlkICAgICAgIAkiM0I2OUI2NTMwMTdBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjb3BlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZEIg0KLQkJCQlsYWJlbCAgICAgIAkic2NvcGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyOSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCNjU0MDA2RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzMCINCi0JCQlxdWlkICAgICAgIAkiM0MyOTAxMDYwMkQ3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkRmVhdHVyZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwMTBCMDAwRSINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRmVhdHVyZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzIiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDE4MyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAzM0MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAzNDYiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5RDI5RTAxNEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicmVmZXJlbmNlZEtleSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQyQTgwMTY1Ig0KLQkJCQlsYWJlbCAgICAgIAkicmVmZXJlbmNlZEtleSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzYiDQotCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNEMDAzRSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzciDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRTAyMkEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNlbGVjdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjM0Ig0KLQkJCQlsYWJlbCAgICAgIAkic2VsZWN0b3IiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzOCINCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMDI1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzOSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDM2NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZmllbGRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMzc5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZmllbGRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDAiDQotCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q4MDJGQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDEiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QyINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDIiDQotCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M1MDA3RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRENDNjAwNkIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzdEMDI1MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRENDNjAwNkMiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNzAyQzgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTgwM0UyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTkwMDA0Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0NiINCi0JCQlxdWlkICAgICAgIAkiM0I2QkNFQjEwMkY4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAxQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCNjAwMjUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDgiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNjA2MDI2RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNzAyMjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInBhcnRpY2xlcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM2MDcwMjIyIg0KLQkJCQlsYWJlbCAgICAgIAkicGFydGljbGVzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1MCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTUwMDhBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDA5NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxNjAwQTAiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzdBQzAyNUEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3QUQwMzM4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibW9kZWxHcm91cCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOSINCi0JCQkJbGFiZWwgICAgICAJIm1vZGVsR3JvdXAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTQiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ1MDM5OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOEEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOUUiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NiINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEYwMjEyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEwMDBDOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEwMDBEMyINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTgiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0NzE1MDExOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQ3MUEwM0I1Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4M0M4OTAxMjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODNDOEEwMTEwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidGVybSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODNDOEEwMTExIg0KLQkJCQlsYWJlbCAgICAgIAkidGVybSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2MiINCi0JCQlxdWlkICAgICAgIAkiM0I2QURFNDIwMDlBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDJGRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAzMDgiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NCINCi0JCQlxdWlkICAgICAgIAkiM0I2QUU4MjQwMDUxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFODI2MDJBRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkI3Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhFNkIwMDNEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTZDMDEwNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTZDMDExMSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RDAxQkYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRThFMDE5OSINCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzAiDQotCQkJcXVpZCAgICAgICAJIjNCNjZGREZBMDBDMyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQjAyN0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlRGVjbGFyYXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQjAyN0UiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3MiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFOTIwMjE2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MzAxOEMiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAwNDkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMzc0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMzdFIg0KLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzYiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRUZGMDI0RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzciDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUYwMDAyNUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibW9kZWxHcm91cERlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUYwMDAyNjQiDQotCQkJCWxhYmVsICAgICAgCSJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3OCINCi0JCQlxdWlkICAgICAgIAkiM0JGQzJBMTcwMUVEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3OSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3MyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGQzJBMUEwMjdEIg0KLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODAiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRUE3MDIzRSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUVBODAzOEEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibm90YXRpb25EZWNsYXJhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QiINCi0JCQkJbGFiZWwgICAgICAJIm5vdGF0aW9uRGVjbGFyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MiINCi0JCQlxdWlkICAgICAgIAkiM0I2OUU0NTYwMjkwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFNDU3MDE2NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTZGIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODQiDQotCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E1MDExMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZENUNBNzAzQjQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNDOCINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4NiINCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1QUQwMzc0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAwNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImZhY2V0Q29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRjAwMTAiDQotCQkJCWxhYmVsICAgICAgCSJmYWNldENvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4OCINCi0JCQlxdWlkICAgICAgIAkiM0JDOEFFMDIwM0E4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4OSINCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA1MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JDOEFFMDYwMDY1Ig0KLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5MCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzM0QjcwMjA4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNEJFMDI1OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1lbWJlclR5cGVEZWZpbml0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU5Ig0KLQkJCQlsYWJlbCAgICAgIAkibWVtYmVyVHlwZURlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5MiINCi0JCQlxdWlkICAgICAgIAkiM0I2QzM2MzIwMURCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNjM1MDA1OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImZ1bmRhbWVudGFsRmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzYzNTAwNjMiDQotCQkJCWxhYmVsICAgICAgCSJmdW5kYW1lbnRhbEZhY2V0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5NCINCi0JCQlxdWlkICAgICAgIAkiM0I2RDM1QUIwMjczIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQzNUIyMDI5MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMkE1Ig0KLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5NiINCi0JCQlxdWlkICAgICAgIAkiM0I2RDU1NzIwMTZDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDIyRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTU3NTAyNDMiDQotCQkJCWxhYmVsICAgICAgCSJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTgiDQotCQkJcXVpZCAgICAgICAJIjNCNjlFMjkxMDE1OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxOUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUUyOTIwMUE5Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMCINCi0JCQlxdWlkICAgICAgIAkiM0I5MDA2Q0YwMDg4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMSINCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE1RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImRlcml2YXRpb25Bbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTY3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZGVyaXZhdGlvbkFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDIiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjMzMDI2NCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIzNDAyODQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMzQwMjhFIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDQiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjExMDI2RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAxRjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTIwMjAzIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNiINCi0JCQlxdWlkICAgICAgIAkiM0M2MjZFQjMwMDA1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNyINCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUI0MDMyNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVCNDAzMzIiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwOCINCi0JCQlxdWlkICAgICAgIAkiM0JFQkRDODcwMjQ3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwOSINCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDJGOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQkVCREM4QzAzMDMiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEwIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjIyNzAzQ0QiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjExIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyMkIwMDYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiDQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbXBvbmVudHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2QyINCi0JCQkJbGFiZWwgICAgICAJImNvbXBvbmVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEyIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjI2OTAxNjUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEzIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZGlhZ25vc3RpY3MiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZGlhZ25vc3RpY3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTQiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2NDMxMDM1RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTUiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMjAxQzYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYWxsRGlhZ25vc3RpY3MiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNyINCi0JCQkJbGFiZWwgICAgICAJImFsbERpYWdub3N0aWNzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiDQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzIxRENDNzAwRUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkU2NoZW1hIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzIxRENDRTAwNDMiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZFNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzIxREQwQzAzREIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiDQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJpbmNvcnBvcmF0ZWRTY2hlbWEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNSINCi0JCQkJbGFiZWwgICAgICAJImluY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIwIg0KLQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNDAwNEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyMzkxMzYwMENBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwRDQiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI1RDNBNjAxMzEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVmZXJlbmNpbmdEaXJlY3RpdmVzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RDNBOTAzNzEiDQotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNCINCi0JCQlxdWlkICAgICAgIAkiM0MyNUVDRjAwMDVFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFQ0Y0MDAxRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RWZXJzaW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDI4Ig0KLQkJCQlsYWJlbCAgICAgIAkicm9vdFZlcnNpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNiINCi0JCQlxdWlkICAgICAgIAkiM0MyNUVEMEIwMTFCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRDBGMDEyMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm9yaWdpbmFsVmVyc2lvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRDBGMDEyQiINCi0JCQkJbGFiZWwgICAgICAJIm9yaWdpbmFsVmVyc2lvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUVBQjAwMUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTBCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFZlcnNpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRUFGMDExNSINCi0JCQkJbGFiZWwgICAgICAJImluY29ycG9yYXRlZFZlcnNpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzAiDQotCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwREYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJpdGVtVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBFMCINCi0JCQkJbGFiZWwgICAgICAJIml0ZW1UeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzIiDQotCQkJcXVpZCAgICAgICAJIjNDMjc4NDczMDE5NCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3NTAxRjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWFGb3JTY2hlbWEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3NTAxRkIiDQotCQkJCWxhYmVsICAgICAgCSJzY2hlbWFGb3JTY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNCINCi0JCQlxdWlkICAgICAgIAkiM0MyODgwRjUwM0Q5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MEY5MDAzQyINCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM1Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODgwRjkwMDQ2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzYiDQotCQkJcXVpZCAgICAgICAJIjNDMjg4MkM1MDEzNyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzciDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWFyeUNvbXBvbmVudCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODgyQzcwMTEzIg0KLQkJCQlsYWJlbCAgICAgIAkicHJpbWFyeUNvbXBvbmVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBMEYyMDFBNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwRjMwMkU1Ig0KLQkJCQlsYWJlbCAgICAgIAkidHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwRjMwMkYwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTZEQjAxRTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTZERDAzREQiDQotCQkJCWxhYmVsICAgICAgCSJyb290VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQxIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0RFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3MTIwMTA4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTUxIg0KLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzE0MDE1QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBNzRCMDE3OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzaW1wbGVUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3NEQwMTdCIg0KLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ1Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3NEQwMTg1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3RUQwM0MwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbXBsZXhUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3RjQwMTE3Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29tcGxleFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDEyMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBOTk0MDMwQSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwREQiDQotCQkJCWxhYmVsICAgICAgCSJyb290VHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0OSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBFNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMDg1MDI1QiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyNzAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDg2MDI3QSINCi0JCQkJbGFiZWwgICAgICAJIm1pbkZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwOEQwMjUyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDhFMDA5MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDlCIg0KLQkJCQlsYWJlbCAgICAgIAkibWF4RmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQjAzOTYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQUMwM0M5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4SW5jbHVzaXZlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzRDQiDQotCQkJCWxhYmVsICAgICAgCSJtYXhJbmNsdXNpdmVGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFGMDMzOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTciDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAxRjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5JbmNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEIwMDIwMyINCi0JCQkJbGFiZWwgICAgICAJIm1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQjMwMjA3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1OSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI0MDE5MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTlBIg0KLQkJCQlsYWJlbCAgICAgIAkibWluRXhjbHVzaXZlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNjAyOEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjcwMjE3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMjEiDQotCQkJCWxhYmVsICAgICAgCSJtYXhFeGNsdXNpdmVGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDA1MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNDYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJsZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDI1MCINCi0JCQkJbGFiZWwgICAgICAJImxlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkYwMThDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2NSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA2QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIndoaXRlU3BhY2VGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA3NSINCi0JCQkJbGFiZWwgICAgICAJIndoaXRlU3BhY2VGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMjAyMUQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzMwMEFCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZW51bWVyYXRpb25GYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUMiDQotCQkJCWxhYmVsICAgICAgCSJlbnVtZXJhdGlvbkZhY2V0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzUwMTU5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2OSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInBhdHRlcm5GYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNjAwQkEiDQotCQkJCWxhYmVsICAgICAgCSJwYXR0ZXJuRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEM4MDJBNyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUY1Ig0KLQkJCQlsYWJlbCAgICAgIAkiY2FyZGluYWxpdHlGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQ0IwMzlDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMENDMDNEMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm51bWVyaWNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMENDMDNEMSINCi0JCQkJbGFiZWwgICAgICAJIm51bWVyaWNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROdW1lcmljRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDRjAxOTkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDg1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4TGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEMjAwOEYiDQotCQkJCWxhYmVsICAgICAgCSJtYXhMZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ1MDBDNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzciDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBENjAwMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5MZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAyNyINCi0JCQkJbGFiZWwgICAgICAJIm1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwMERFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3OSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDNDRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAzRDciDQotCQkJCWxhYmVsICAgICAgCSJ0b3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQjAzNzciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzVBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERDMDM2NCINCi0JCQkJbGFiZWwgICAgICAJImZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDA0OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmRlcmVkRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQzMiDQotCQkJCWxhYmVsICAgICAgCSJvcmRlcmVkRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwRTMwMEQ5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEU0MDM4RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImJvdW5kZWRGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEU0MDM5OCINCi0JCQkJbGFiZWwgICAgICAJImJvdW5kZWRGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RCb3VuZGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NDAxRUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzYwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTWF4RmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NTAzNkEiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNTRGMDE0NSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOEMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOTYiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI1QzQwMTFDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNUM1MDIwRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjE3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQTAwQUEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTM4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNjJCMDE0MiINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNkIwMDNBNiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTIiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI3Q0EwMjZCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCN0NCMDE4NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQjAxOTAiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MDAwNjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODQxMDAyNyINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCODk4MDE2RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5OTAwNTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA2MCINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI4REMwMDUyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDNCOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0MzIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MDAxREIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMENGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTWluRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MTAwRDkiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNaW5GYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDYiDQotCQkJcXVpZCAgICAgICAJIjNENEJCNEFFMDFDQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDciDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRjAxMEYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNGYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDExQSINCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY0ZhY2V0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDgiDQotCQkJcXVpZCAgICAgICAJIjNENEJCNEQzMDI4RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDkiDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRENDAyRjMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljUGFydGljbGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGRCINCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1BhcnRpY2xlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMCINCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0RDkwMUY2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMSINCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNERBMDI4NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjhFIg0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljV2lsZGNhcmQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEyIg0KLQkJCXF1aWQgICAgICAgCSIzRDRDNjhGRjAxQkYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzEzIg0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QzY5MDIwMzE3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QzY5MDIwMzE4Ig0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljV2lsZGNhcmQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQ0KLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiDQotCQkJcXVpZCAgICAgICAJIjNCNjg0NzY4MDEzOCINCi0JCQl0aXRsZSAgICAgIAkiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAMzYwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCA4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMzYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgNTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk0MCwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJd2lkdGggICAgICAJNDc0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzYyDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDIyNSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDkyOCwgMjI1KQ0KLQkJCQkgICAgKDkyOCwgMTM1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAMzYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMzIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjAsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzY0DQotCQkJCWxvY2F0aW9uICAgCSgxMjAzLCA3MDYpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMjAzLCA3MDYpDQotCQkJCSAgICAoMTIwMywgNjE1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEAzNjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCA1NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzcyLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJd2lkdGggICAgICAJNTIyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzY2DQotCQkJCWxvY2F0aW9uICAgCSg0NDQsIDcwOSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzY1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQ0NCwgNzA5KQ0KLQkJCQkgICAgKDQ0NCwgNjE1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjcNCi0JCQkJbG9jYXRpb24gICAJKDE1NzIsIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzYzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE1NzIsIDQ2NSkNCi0JCQkJICAgICgxNTcyLCAzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMzY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgODAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyOTAsIDc1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMzY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMTA1NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjIsIDEwMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEAzNzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEwNCwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MzYsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAkzNTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNzENCi0JCQkJbG9jYXRpb24gICAJKDQ1MywgMTIwMykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzY5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQ1MywgMTIwMykNCi0JCQkJICAgICg0NTMsIDExMTEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAMzcyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCXdpZHRoICAgICAgCTI0Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEAzNzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCA4MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0NiwgNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNzQNCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDk1MCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzczDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE4NzIsIDk1MCkNCi0JCQkJICAgICgxODcyLCA4NTUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM3NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgxLCA0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDM3Mg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxODEsIDQ2NSkNCi0JCQkJICAgICgxODEsIDM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAzNzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTI4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MCwgMTIzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTU1MA0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDM3Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzM0LCAxMDEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEAzNzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTQ4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OSwgMTQ0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJNjU2DQotCQkJCWhlaWdodCAgICAgCTExMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDM3OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTg0LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDMsIDE0NDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTYzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTU4MQ0KLQkJCQloZWlnaHQgICAgIAkxMTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMzgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDU2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjk0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEAzODENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTA1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMDEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDM4Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCA1NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDYsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAzODMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDYsIDEyNTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCA1NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYwLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjgyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMzg1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDEyODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMiwgMTIzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAzODYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMCwgMTQ0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk2OTQNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEAzODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDI2LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCXdpZHRoICAgICAgCTMxOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDM4OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTQwMg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzODkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDdCQjAzNDkiDQotCQkJCWNsaWVudCAgICAgCUAzNzANCi0JCQkJc3VwcGxpZXIgICAJQDM2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NCwgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDM5MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgODAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY5MCwgNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzOTENCi0JCQkJbG9jYXRpb24gICAJKDk2MiwgOTQ3KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoOTYyLCA5NDcpDQotCQkJCSAgICAoOTYyLCA4NTUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzkyDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDM5Mw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTgsIDExNTQpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNjM1MzQNCi0JCQkJICAgIGhlaWdodCAgICAgCTY5DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIg0KLQkJCQljbGllbnQgICAgIAlAMzgzDQotCQkJCXN1cHBsaWVyICAgCUAzNjUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OSwgMTI0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OSwgNzA5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDM4Mw0KLQkJCQlzdXBwbGllciAgIAlAMzY5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTYsIDEyNDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTYsIDEyMDMpDQotCQkJCWRyYXdTdXBwbGllciAJQDM3MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIg0KLQkJCQljbGllbnQgICAgIAlAMzg0DQotCQkJCXN1cHBsaWVyICAgCUAzNzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NCwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg0LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM3NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5Ig0KLQkJCQljbGllbnQgICAgIAlAMzgyDQotCQkJCXN1cHBsaWVyICAgCUAzNjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMDIsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMDIsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhBQTAxRDMiDQotCQkJCWNsaWVudCAgICAgCUAzNjMNCi0JCQkJc3VwcGxpZXIgICAJQDM2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2OSwgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OSwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSINCi0JCQkJY2xpZW50ICAgICAJQDM4MA0KLQkJCQlzdXBwbGllciAgIAlAMzYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkwLCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDkwLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3Ig0KLQkJCQljbGllbnQgICAgIAlAMzY4DQotCQkJCXN1cHBsaWVyICAgCUAzNjUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUxMCwgNzQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA3MDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDAwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzgwMEQyIg0KLQkJCQljbGllbnQgICAgIAlAMzg1DQotCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjEsIDEyMjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzIxLCA5NDcpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDAxDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQwMg0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM3LCA4ODYpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTU4MTINCi0JCQkJICAgIGhlaWdodCAgICAgCTY0DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIg0KLQkJCQljbGllbnQgICAgIAlAMzc3DQotCQkJCXN1cHBsaWVyICAgCUAzNjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDAsIDEwMDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjAwLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDAzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQljbGllbnQgICAgIAlAMzc3DQotCQkJCXN1cHBsaWVyICAgCUAzNzMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEwMDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCA5NTApDQotCQkJCWRyYXdTdXBwbGllciAJQDM3NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlAMzY5DQotCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1MCwgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgOTQ3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJY2xpZW50ICAgICAJQDM3Mg0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NywgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4NEY3MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDM4OA0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDEyLCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDEyLCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QjgwMjg2Ig0KLQkJCQljbGllbnQgICAgIAlAMzY1DQotCQkJCXN1cHBsaWVyICAgCUAzNjANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNCwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODM0LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3Ig0KLQkJCQljbGllbnQgICAgIAlAMzYxDQotCQkJCXN1cHBsaWVyICAgCUAzNjANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTAsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTAsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiDQotCQkJCWNsaWVudCAgICAgCUAzODcNCi0JCQkJc3VwcGxpZXIgICAJQDM2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTcyLCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzIsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCWNsaWVudCAgICAgCUAzNzYNCi0JCQkJc3VwcGxpZXIgICAJQDM3Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MywgMTIyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2OTMsIDk1MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiDQotCQkJCWNsaWVudCAgICAgCUAzNzgNCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU5MCwgMTQzMikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDcwNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDk0MzAyRjEiDQotCQkJCWNsaWVudCAgICAgCUAzNzkNCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMSwgMTQzMikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzEsIDcwNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiDQotCQkJCWNsaWVudCAgICAgCUAzOTANCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTU5LCA3NDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDcwNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCWNsaWVudCAgICAgCUAzNzMNCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg3MiwgNzQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3MiwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCINCi0JCQkJY2xpZW50ICAgICAJQDM4MQ0KLQkJCQlzdXBwbGllciAgIAlAMzkwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjIsIDEwMDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjIsIDk0NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTYNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDE3DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk1LCAxMzg4KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE4Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDQyNTMxDQotCQkJCSAgICBoZWlnaHQgICAgIAk2Nw0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCQUEyMDMxMCINCi0JCQkJY2xpZW50ICAgICAJQDM4Ng0KLQkJCQlzdXBwbGllciAgIAlAMzcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOCwgMTQyOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM3NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDE4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAMzg2DQotCQkJCXN1cHBsaWVyICAgCUAzNjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY1NiwgMTQyOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMTIwMykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzcxKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuIENvbXBvbmVudCBSZWxhdGlvbnMgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIg0KLQkJCXF1aWQgICAgICAgCSIzNzRCMTgxOTAwMjgiDQotCQkJdGl0bGUgICAgICAJIjIuIENvbXBvbmVudCBSZWxhdGlvbnMgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIg0KLQkJCXpvb20gICAgICAgCTk2DQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBANDE5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzg0LCAxNjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY3MCwgMTU5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCXdpZHRoICAgICAgCTI0Ng0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA0MjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDE2MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDE1OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyOCIgQDQyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk0LCAxNjI3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNjUzMDE3QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY29wZSIgQDQyMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0MjENCi0JCQkJCWxvY2F0aW9uICAgCSgyODYsIC00ODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTUsIDE1ODkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NvcGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzEyNTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlCNjU0MDA2RCINCi0JCQkJCWNsaWVudCAgICAgCUA0MjENCi0JCQkJCXN1cHBsaWVyICAgCUA0MTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MSwgMTYyNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTY2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MTAxOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI5IiBANDI1DQotCQkJCQlQYXJlbnRfVmlldyAJQDQyMQ0KLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkUiDQotCQkJCQljbGllbnQgICAgIAlANDIxDQotCQkJCQlzdXBwbGllciAgIAlANDIwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMTYyNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMjcsIDE2MjcpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBANDI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDEyMzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4NCwgMTE5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA0MjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE3NiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDUxLCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNjgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjAiIEA0MjgNCi0JCQkJbG9jYXRpb24gICAJKDIyMjksIDExMTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDODkwMTIyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MSIgQDQyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0MjgNCi0JCQkJCWxvY2F0aW9uICAgCSg1NDksIC0yNDgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDOEEwMTEwIg0KLQkJCQkJY2xpZW50ICAgICAJQDQyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDQyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDEwNDUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidGVybSIgQDQzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0MjgNCi0JCQkJCWxvY2F0aW9uICAgCSg1NDksIC0yNDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTU3LCAxMTIxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Rlcm0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzQzMjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMSINCi0JCQkJCWNsaWVudCAgICAgCUA0MjgNCi0JCQkJCXN1cHBsaWVyICAgCUA0MjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyOSwgMTExMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3NCwgMTExOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExOTQwMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEA0MzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMTIzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDc2LCAxMTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCXdpZHRoICAgICAgCTUyMg0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA0MzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNzY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTc3LCA3MjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTM1Mg0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0OCIgQDQzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjIxOSwgODgwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNjA2MDI2RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDkiIEA0MzYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1NywgLTI0MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNzAyMjEiDQotCQkJCQljbGllbnQgICAgIAlANDM1DQotCQkJCQlzdXBwbGllciAgIAlANDM0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA4MjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGFydGljbGVzIiBANDM3DQotCQkJCQlQYXJlbnRfVmlldyAJQDQzNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTA1LCA4ODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFydGljbGVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU2NjI3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIyIg0KLQkJCQkJY2xpZW50ICAgICAJQDQzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE5LCA4ODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxOSwgOTM5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4MSwgODg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU2NjI3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NzYsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzOSwgOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjkyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANDQxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkwNSwgMTM4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAkzNTINCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQ0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTQiIEA0NDMNCi0JCQkJbG9jYXRpb24gICAJKDU5MCwgMTE0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVBQjAyNzMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk1IiBANDQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ0Mw0KLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDI5MSINCi0JCQkJCWNsaWVudCAgICAgCUA0NDMNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg1OTAsIDExNDApDQotCQkJCQkgICAgKDU0MCwgMTE0MCkNCi0JCQkJCSAgICAoNTQwLCAxMDQ1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU0MCwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA0NDUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDQzDQotCQkJCQlsb2NhdGlvbiAgIAkoMzAyLCAxNDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDExNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMDUzNTcxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyQTUiDQotCQkJCQljbGllbnQgICAgIAlANDQzDQotCQkJCQlzdXBwbGllciAgIAlANDQyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNTkwLCAxMTQwKQ0KLQkJCQkJICAgICg2NDEsIDExNDApDQotCQkJCQkgICAgKDY0MSwgMTA0NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MCwgMTE0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDEsIDEwNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODQsIDEwOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTIyNDQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQ0OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NSwgOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTU0NA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk2IiBANDQ5DQotCQkJCWxvY2F0aW9uICAgCSgxMTE5LCAxMTEyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0RGMDI0RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5NyIgQDQ1MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZEIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEwNDUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudFR5cGUiIEA0NTENCi0JCQkJCVBhcmVudF9WaWV3IAlANDQ5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1NjksIC04KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1OSwgMTEyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50VHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0UxMDBGRSINCi0JCQkJCWNsaWVudCAgICAgCUA0NDkNCi0JCQkJCXN1cHBsaWVyICAgCUA0MzMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MywgMTEyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDIiIEA0NTQNCi0JCQkJbG9jYXRpb24gICAJKDE0NTUsIDk4MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQTAxMjYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAzIiBANDU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ1NA0KLQkJCQkJbG9jYXRpb24gICAJKDE1OSwgLTU3MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQjAxNTAiDQotCQkJCQljbGllbnQgICAgIAlANDU0DQotCQkJCQlzdXBwbGllciAgIAlANDQ4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjgwLCA5ODIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmQiIEA0NTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDU0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NSwgOTI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2Mjg1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ1NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMCwgOTgyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1MCwgMTAyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0Mjg1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5OCIgQDQ1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTIxLCAxMjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDA2RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5OSIgQDQ2MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0OSINCi0JCQkJCWNsaWVudCAgICAgCUA0NTkNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyMSwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANDYxDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ1OQ0KLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzgsIDEyNTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTkzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0QSINCi0JCQkJCWNsaWVudCAgICAgCUA0NTkNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyMSwgMTM3MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3OSwgMTI1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4ODM0NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA0NjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA3NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMjIsIDcyNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA0NjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTYzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMywgMTU5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA0NjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgNDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODAzLCA0MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTIiIEA0NjcNCi0JCQkJbG9jYXRpb24gICAJKDIyMTYsIDYwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUzIiBANDY4DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ2Nw0KLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxNiwgNTAxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEA0NjkNCi0JCQkJCVBhcmVudF9WaWV3IAlANDY3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDY5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDYyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyNjA5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDQzNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxNiwgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NiwgNjMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjMzNjQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDQ3Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjE5LCAxMzgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgyIiBANDczDQotCQkJCWxvY2F0aW9uICAgCSgxNjc2LCAxMjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4N0JGMDE1MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4MyIgQDQ3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzMNCi0JCQkJCWxvY2F0aW9uICAgCSg0MTIsIC0zNDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QzAwMEE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEzNzEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmQiIEA0NzUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDczDQotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NywgMTEwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYyNTc2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBOCINCi0JCQkJCWNsaWVudCAgICAgCUA0NzMNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY3NiwgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc2LCAxMDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOCwgMTEwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxOTYzMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3OCIgQDQ3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyOSwgMTQzOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU5RjAwODYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzkiIEA0NzkNCi0JCQkJCVBhcmVudF9WaWV3IAlANDc4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNjkiDQotCQkJCQljbGllbnQgICAgIAlANDc4DQotCQkJCQlzdXBwbGllciAgIAlANDcyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMCwgMTQzOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANDgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3OA0KLQkJCQkJbG9jYXRpb24gICAJKC0zNjMsIC0xNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA1LCAxNTA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVVzZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzI1OTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNUEwMDA2QSINCi0JCQkJCWNsaWVudCAgICAgCUA0NzgNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ4LCAxNDM4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNywgMTM5MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU2MzUzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDQ4Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg2IiBANDg0DQotCQkJCWxvY2F0aW9uICAgCSg3NzcsIDE0MjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODUwMTBEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDg3IiBANDg1DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4NA0KLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzcsIDE0MjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk2LCAxNDI1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANDg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4NA0KLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDE1MDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU5MjU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkIiDQotCQkJCQljbGllbnQgICAgIAlANDg0DQotCQkJCQlzdXBwbGllciAgIAlANDgzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTgsIDE0MjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjEsIDEzODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzI0NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzAiIEA0ODkNCi0JCQkJbG9jYXRpb24gICAJKDIzNywgMTIwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2QjAyQ0IiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzEiIEA0OTANCi0JCQkJCVBhcmVudF9WaWV3IAlANDg5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNDMsIDcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTZEMDBBNiINCi0JCQkJCWNsaWVudCAgICAgCUA0ODkNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTM3MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDQ5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODgsIDEyNDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjM5MjY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ4OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzcsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1LCAxMjQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDQ5NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDc4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgsIDc0MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkyIiBANDk1DQotCQkJCWxvY2F0aW9uICAgCSg3MjgsIDc3NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNTAzNDAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTMiIEA0OTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1NiwgLTU3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzM2MDI4RCINCi0JCQkJCWNsaWVudCAgICAgCUA0OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3MjgsIDc3NSkNCi0JCQkJCSAgICAoNzg4LCA3NzUpDQotCQkJCQkgICAgKDc4OCwgOTM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg4LCA5MzkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANDk3DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NQ0KLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1OCwgODgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjE0MDk0MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzM2MDI4RSINCi0JCQkJCWNsaWVudCAgICAgCUA0OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA0OTQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc5LCA3NzUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTAsIDgxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNTI0MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDUwMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTcsIDQwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJNjA4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM0IiBANTAxDQotCQkJCWxvY2F0aW9uICAgCSgxNjI5LCA1NzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyOUUwMTREIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jZWRLZXkiIEA1MDINCi0JCQkJCVBhcmVudF9WaWV3IAlANTAxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzLCA5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NjEsIDYwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2VkS2V5Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjc5NzI5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyQTgwMTY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUwMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUwMA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MjksIDU3NCkNCi0JCQkJCSAgICAoMTU1NSwgNTc0KQ0KLQkJCQkJICAgICgxNTU1LCA1MDEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1NSwgNTAxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTA0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMiwgNTM5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ3NjE5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzUiIEA1MDUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTAxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzLCA5NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNkYiDQotCQkJCQljbGllbnQgICAgIAlANTAxDQotCQkJCQlzdXBwbGllciAgIAlANTAwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYyOSwgNTc0KQ0KLQkJCQkJICAgICgxNjg5LCA1NzQpDQotCQkJCQkgICAgKDE2ODksIDQ0NCkNCi0JCQkJCSAgICAoMTYxNiwgNDQ0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyOSwgNTc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTYsIDQ0NCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOCIgQDUwNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgNjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDAyNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzkiIEA1MDcNCi0JCQkJCVBhcmVudF9WaWV3IAlANTA2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNSwgMzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUwNg0KLQkJCQkJc3VwcGxpZXIgICAJQDUwMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNTAxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDUwOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE1LCAzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTksIDY1NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmaWVsZHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzkyNTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM3OSINCi0JCQkJCWNsaWVudCAgICAgCUA1MDYNCi0JCQkJCXN1cHBsaWVyICAgCUA0NjQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTMsIDY1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyOTkwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzYiIEA1MTENCi0JCQkJbG9jYXRpb24gICAJKDE0MTUsIDYwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRDAwM0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM3IiBANTEyDQotCQkJCQlQYXJlbnRfVmlldyAJQDUxMQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIg0KLQkJCQkJY2xpZW50ICAgICAJQDUxMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUwMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE1LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNTAxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBANTEzDQotCQkJCQlQYXJlbnRfVmlldyAJQDUxMQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEzLCA2NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2VsZWN0b3IiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MTEyMTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIzNCINCi0JCQkJCWNsaWVudCAgICAgCUA1MTENCi0JCQkJCXN1cHBsaWVyICAgCUA0NjQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODEsIDY1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5MjUyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA1MTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgNjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTgxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNTk5DQotCQkJCWhlaWdodCAgICAgCTIwOQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgwIiBANTE3DQotCQkJCWxvY2F0aW9uICAgCSgyMzk1LCA2MDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTcwMjNFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4MSIgQDUxOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhBIg0KLQkJCQkJY2xpZW50ICAgICAJQDUxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzOTUsIDYwNikNCi0JCQkJCSAgICAoMjM5NSwgNjUpDQotCQkJCQkgICAgKDE2MTEsIDY1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM5NSwgNjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDY1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm5vdGF0aW9uRGVjbGFyYXRpb25zIiBANTE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDUxNw0KLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODksIDEwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitub3RhdGlvbkRlY2xhcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODk3NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEIiDQotCQkJCQljbGllbnQgICAgIAlANTE3DQotCQkJCQlzdXBwbGllciAgIAlANDY1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM5NSwgNjA2KQ0KLQkJCQkJICAgICgyMzk1LCAxNjMzKQ0KLQkJCQkJICAgICgyMDk4LCAxNjMzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM5NSwgNjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTgsIDE2MzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzQ0LCAxMDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDg3ODI5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3NiIgQDUyMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTc3MiwgMjQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUZGMDI0RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzciIEA1MjMNCi0JCQkJCVBhcmVudF9WaWV3IAlANTIyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNUEiDQotCQkJCQljbGllbnQgICAgIAlANTIyDQotCQkJCQlzdXBwbGllciAgIAlANTE2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCAyNDkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cERlZmluaXRpb25zIiBANTI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDUyMg0KLQkJCQkJbG9jYXRpb24gICAJKC05NDgsIC0zMjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc2LCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzNTkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVGMDAwMjY0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUyMg0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3NzIsIDI0OSkNCi0JCQkJCSAgICAoMTgzMiwgMjQ5KQ0KLQkJCQkJICAgICgxODMyLCAzOTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzcyLCAyNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgzMiwgMzk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMzQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM3ODY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3MiIgQDUyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0NiwgNTE4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRTkyMDIxNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzMiIEA1MjgNCi0JCQkJCVBhcmVudF9WaWV3IAlANTI3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NzIsIDE4NTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuNjMwMDcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDc1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThCIg0KLQkJCQkJY2xpZW50ICAgICAJQDUyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNDYsIDUxOCkNCi0JCQkJCSAgICAoMjM0NiwgMTQ5KQ0KLQkJCQkJICAgICgxNjExLCAxNDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1MTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMTQ5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiIEA1MzANCi0JCQkJCVBhcmVudF9WaWV3IAlANTI3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDgsIDE5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0OTk0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QyINCi0JCQkJCWNsaWVudCAgICAgCUA1MjcNCi0JCQkJCXN1cHBsaWVyICAgCUA0NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQ2LCA1MTgpDQotCQkJCQkgICAgKDIzNDYsIDE0NDEpDQotCQkJCQkgICAgKDIxNjYsIDE0NDEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1MTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2NiwgMTQ0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOTksIDE5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zNDg4NjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc0IiBANTMzDQotCQkJCWxvY2F0aW9uICAgCSgyMDMsIDE1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAwNDkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc1IiBANTM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDUzMw0KLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzc0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMsIDE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxNTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb25zIiBANTM1DQotCQkJCQlQYXJlbnRfVmlldyAJQDUzMw0KLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNDksIDE5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDc1NzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAzN0UiDQotCQkJCQljbGllbnQgICAgIAlANTMzDQotCQkJCQlzdXBwbGllciAgIAlANDk0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjAzLCAxNTkpDQotCQkJCQkgICAgKDEwNCwgMTU5KQ0KLQkJCQkJICAgICgxMDQsIDc4NCkNCi0JCQkJCSAgICAoMTg5LCA3ODQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMsIDE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODksIDc4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NSwgMjAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU5NzAxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3OCIgQDUzOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgMzI5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkMyQTE3MDFFRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzkiIEA1MzkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTM4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3MyINCi0JCQkJCWNsaWVudCAgICAgCUA1MzgNCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgMzI5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDI2NCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU0MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTc3LCAtMjMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzc1LCAzMzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA5NTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExQTAyN0QiDQotCQkJCQljbGllbnQgICAgIAlANTM4DQotCQkJCQlzdXBwbGllciAgIAlANTAwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAzOTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE4LCAzMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMDcxNDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcwIiBANTQzDQotCQkJCWxvY2F0aW9uICAgCSg0OCwgMzIwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZGREZBMDBDMyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzEiIEA1NDQNCi0JCQkJCVBhcmVudF9WaWV3IAlANTQzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC0yODgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkIwMjdEIg0KLQkJCQkJY2xpZW50ICAgICAJQDU0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ5LCAzMjIpDQotCQkJCQkgICAgKDQ5LCA2OCkNCi0JCQkJCSAgICAoMTAxMywgNjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDY4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9ucyIgQDU0NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzOCwgMTA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xOTg1MzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0UiDQotCQkJCQljbGllbnQgICAgIAlANTQzDQotCQkJCQlzdXBwbGllciAgIAlANDgzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDksIDMyMikNCi0JCQkJCSAgICAoNDksIDE0MTUpDQotCQkJCQkgICAgKDE3NCwgMTQxNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAxNDE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTEsIDEwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xOTY3MDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANTQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgNDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzUsIDQxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDENCi0JCQkJaGVpZ2h0ICAgICAJOTcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMCIgQDU0OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk5LCA1ODkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNTkwMTk4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMSIgQDU1MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1RDAxRTMiDQotCQkJCQljbGllbnQgICAgIAlANTQ5DQotCQkJCQlzdXBwbGllciAgIAlANTQ4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDk5LCA1ODkpDQotCQkJCQkgICAgKDQ1MiwgNTg5KQ0KLQkJCQkJICAgICg0NTIsIDQ5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MiwgNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iIEA1NTENCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzLCAxMDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MTEsIDU4NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTYuNTIwODMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFRCINCi0JCQkJCWNsaWVudCAgICAgCUA1NDkNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OTksIDU4OSkNCi0JCQkJCSAgICAoNTQ3LCA1ODkpDQotCQkJCQkgICAgKDU0NywgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQ3LCA0OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0OTksIDU1OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTQiIEA1NTQNCi0JCQkJbG9jYXRpb24gICAJKDI0MSwgNjEzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDA1OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTUiIEA1NTUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTU0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzNDMsIC0yMTkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0JGIg0KLQkJCQkJY2xpZW50ICAgICAJQDU1NA0KLQkJCQkJc3VwcGxpZXIgICAJQDU0OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDEsIDYxMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDQ5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDU1Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwOCwgNjk0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg2NDQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0MwIg0KLQkJCQkJY2xpZW50ICAgICAJQDU1NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ5NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDEsIDYxMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDczMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMiwgNjg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjEwMTY5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNiIgQDU1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoODM3LCA0NjApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRUYwMTYwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNyIgQDU2MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OCINCi0JCQkJCWNsaWVudCAgICAgCUA1NTkNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA0NjApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEA1NjENCi0JCQkJCVBhcmVudF9WaWV3IAlANTU5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4MCwgNTI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjUxNDYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiDQotCQkJCQljbGllbnQgICAgIAlANTU5DQotCQkJCQlzdXBwbGllciAgIAlANTAwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNywgNDYwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDgsIDQ2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgNDA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMwNDM1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2OCIgQDU2NA0KLQkJCQlsb2NhdGlvbiAgIAkoNTQxLCAyNDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEQwMUJGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2OSIgQDU2NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTgiDQotCQkJCQljbGllbnQgICAgIAlANTY0DQotCQkJCQlzdXBwbGllciAgIAlANTE2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDI0NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb25zIiBANTY2DQotCQkJCQlQYXJlbnRfVmlldyAJQDU2NA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTIzLCAtMTg2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQzLCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwOTMwMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEUwMTk5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU2NA0KLQkJCQkJc3VwcGxpZXIgICAJQDU0OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDU0MSwgMjQ2KQ0KLQkJCQkJICAgICgyMjQsIDI0NikNCi0JCQkJCSAgICAoMjI0LCA0MDApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NDEsIDI0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjQsIDQwMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NiwgMzM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NjkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMiIgQDU2OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUzLCA2MjEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCREQwMjk3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMyIgQDU3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMUUiDQotCQkJCQljbGllbnQgICAgIAlANTY5DQotCQkJCQlzdXBwbGllciAgIAlANTQ4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzUzLCA2MjEpDQotCQkJCQkgICAgKDMwNiwgNjIxKQ0KLQkJCQkJICAgICgzMDYsIDQ5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM1MywgNjIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwNiwgNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwIiBANTcxDQotCQkJCQlQYXJlbnRfVmlldyAJQDU2OQ0KLQkJCQkJbG9jYXRpb24gICAJKC02MywgMTczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc5LCA2MzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3Vic3RpdHV0aW9uR3JvdXAiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJNC44MDg1MTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDJEQkUwMDEyOCINCi0JCQkJCWNsaWVudCAgICAgCUA1NjkNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNTMsIDYyMSkNCi0JCQkJCSAgICAoNDAwLCA2MjEpDQotCQkJCQkgICAgKDQwMCwgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA0OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTAsIDU4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjk3NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJcXVpZCAgICAgICAJIjNCNjlFNzg2MDJDNSINCi0JCQl0aXRsZSAgICAgIAkiMy4gQ29tcG9uZW50IEF0dHJpYnV0ZXMgIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA1NzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDEwNykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4Mg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG5hbWUgOiBTdHJpbmciDQotCQkJCQkiKyB0YXJnZXROYW1lc3BhY2UgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNTM0DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDU3NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTY0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE1NjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDU3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAxNjgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAxNTI0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAxNTg0KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTEzOQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGRlcml2YXRpb25NZXRob2QgOiBYU0REZXJpdmF0aW9uTWV0aG9kID0gcmVzdHJpY3Rpb24iDQotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRENvbXBsZXhGaW5hbCINCi0JCQkJCSIrIGFic3RyYWN0IDogYm9vbGVhbiINCi0JCQkJCSIrIGNvbnRlbnRUeXBlQ2F0ZWdvcnkgOiBYU0RDb250ZW50VHlwZUNhdGVnb3J5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgcHJvaGliaXRlZFN1YnN0aXR1dGlvbnMgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpKQ0KLQkJCQl3aWR0aCAgICAgIAkxMTkyDQotCQkJCWhlaWdodCAgICAgCTMzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1NzcNCi0JCQkJbG9jYXRpb24gICAJKDQ2MywgMzYyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA1NzQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDYzLCAzNjIpDQotCQkJCSAgICAoNDYzLCAyMjEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANTc4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDE2MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1MTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTc5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTkyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiDQotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpDQotCQkJCXdpZHRoICAgICAgCTY0Ng0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANTc5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkxMiwgMTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY0NywgOTgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyByZXF1aXJlZCA6IGJvb2xlYW4iDQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIg0KLQkJCQkJIisgY29uc3RyYWludCA6IFhTRENvbnN0cmFpbnQiKSkNCi0JCQkJd2lkdGggICAgICAJNTQ4DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDU4MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDE5MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODMwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEyODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODkwKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTI2MA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSA6IFhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQkJCSI8PDAuLio+PiArIG5hbWVzcGFjZUNvbnN0cmFpbnQgOiBTdHJpbmciDQotCQkJCQkiKyBwcm9jZXNzQ29udGVudHMgOiBYU0RQcm9jZXNzQ29udGVudHMiKSkNCi0JCQkJd2lkdGggICAgICAJMTMwNA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDU4MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTQ0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDEzODQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTc4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTU5Ng0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDU4Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDUxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgNDMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgNDkxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA2DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSINCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTgzDQotCQkJCWxvY2F0aW9uICAgCSgyOTQsIDY5NykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANTgyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI5NCwgNjk3KQ0KLQkJCQkgICAgKDI5NCwgNjA1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA1ODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjU2LCAxMjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTUsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTU0MA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA1ODUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgNTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MTgsIDQ2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTg2DQotCQkJCWxvY2F0aW9uICAgCSgyNjg0LCA5NjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDU4NQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyNjg0LCA5NjIpDQotCQkJCSAgICAoMjY4NCwgNTc2KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb3NpdG9yIiBANTg3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTExNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb3NpdG9yIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDEwNjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODY5QjYyMDAzNyINCi0JCQkJd2lkdGggICAgICAJMzQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW50IiBANTg4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDY5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzgsIDQxOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlFMjYwMUFFIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERlcml2YXRpb25NZXRob2QiIEA1ODkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAyMjcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMjEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMTYzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTBCMDAwQ0UiDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiIEA1OTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyODEsIDg4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYwNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4MSwgMzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYwNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODZBMUUwMDI3MiINCi0JCQkJd2lkdGggICAgICAJNjI1DQotCQkJCWhlaWdodCAgICAgCTMwMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb250ZW50VHlwZUNhdGVnb3J5IiBANTkxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcwNCwgMjIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjExNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjA2NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NkE3OUYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk1MTQNCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFZhcmlldHkiIEA1OTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE2MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcwOCwgMTUxNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNDY2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjc3MzAyNDkiDQotCQkJCXdpZHRoICAgICAgCTM2Mg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvY2Vzc0NvbnRlbnRzIiBANTkzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAyMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvY2Vzc0NvbnRlbnRzIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTA2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjhDNzAyODQiDQotCQkJCXdpZHRoICAgICAgCTQzOA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhWYXJpZXR5IiBANTk0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjc2OCwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aFZhcmlldHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4RkZCODkwMzNBIg0KLQkJCQl3aWR0aCAgICAgIAkzODENCi0JCQkJaGVpZ2h0ICAgICAJMjUwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANTk1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDE4NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3ODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxNzM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE4NDgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkxOTkNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBsaXN0Ig0KLQkJCQkJIisgcmVzdHJpY3Rpb24iDQotCQkJCQkiKyB1bmlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDU5Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyMDAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxOTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDE4OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMjAwMSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpDQotCQkJCXdpZHRoICAgICAgCTM4Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIiBANTk3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDg1LCAxMDc1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzU5MTAwQUUiDQotCQkJCXdpZHRoICAgICAgCTY0OA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA1OTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTExNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDEwNjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTE3NikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHN1YnN0aXR1dGlvbiINCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiIEA1OTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY2NCwgMjI3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjIxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIxNjMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjI3MykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpDQotCQkJCXdpZHRoICAgICAgCTU1MA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IiBANjAwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAyMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjE1NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjEwNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1RUEwMDIzIg0KLQkJCQl3aWR0aCAgICAgIAk2OTYNCi0JCQkJaGVpZ2h0ICAgICAJMjk2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDYwMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCA4ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgNzQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEzODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDgwOSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTEzNTcNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBuaWxsYWJsZSA6IGJvb2xlYW4iDQotCQkJCQkiPDwwLi4qPj4gKyBkaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQkJIjw8MC4uKj4+ICsgc3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIDogWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCQkJIisgYWJzdHJhY3QgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTE0MDQNCi0JCQkJaGVpZ2h0ICAgICAJMjg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjAyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQljbGllbnQgICAgIAlANjAxDQotCQkJCXN1cHBsaWVyICAgCUA1ODINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4MSwgNzM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjgxLCA2OTcpDQotCQkJCWRyYXdTdXBwbGllciAJQDU4MykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANjAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgODEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDkyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA2MDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQyMCwgMTEwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjA1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzgwMEQyIg0KLQkJCQljbGllbnQgICAgIAlANjA0DQotCQkJCXN1cHBsaWVyICAgCUA1ODUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NjIsIDEwODgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODYyLCA5NjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDU4NikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANjA2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEzMTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2OCwgMTI2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM4Ng0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjA3DQotCQkJCWxvY2F0aW9uICAgCSgyMzc1LCAxNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2MDYNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjM3NSwgMTQ2NSkNCi0JCQkJICAgICgyMzc1LCAxMzc1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJY2xpZW50ICAgICAJQDYwNg0KLQkJCQlzdXBwbGllciAgIAlANTg1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzY4LCAxMjQ5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM2OCwgOTYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1ODYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDU3Ng0KLQkJCQlzdXBwbGllciAgIAlANjA2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODE4LCAxNTEyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxOCwgMTQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjA3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUA1NzgNCi0JCQkJc3VwcGxpZXIgICAJQDYwNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwNiwgMTUwNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDYsIDE0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDYwNykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANjExDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDExNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTgsIDExMDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjEyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlANjExDQotCQkJCXN1cHBsaWVyICAgCUA1ODUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMTUsIDEwODkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTE1LCA5NjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDU4NikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA2MTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzQsIDQ2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTExNTANCi0JCQkJaGVpZ2h0ICAgICAJMTQ0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjE0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBQTMwMjQyIg0KLQkJCQljbGllbnQgICAgIAlANjEzDQotCQkJCXN1cHBsaWVyICAgCUA1NzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjgsIDQ1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjgsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTc3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDYxNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3OCwgNzAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk1MDINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDYxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDI2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjE3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ5NDMwMkYxIg0KLQkJCQljbGllbnQgICAgIAlANjE1DQotCQkJCXN1cHBsaWVyICAgCUA1NzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOTAsIDY5MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTAsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTc3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCWNsaWVudCAgICAgCUA2MDMNCi0JCQkJc3VwcGxpZXIgICAJQDU4Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxLCA4MDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEsIDY5NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTgzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCWNsaWVudCAgICAgCUA1ODINCi0JCQkJc3VwcGxpZXIgICAJQDU3NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzcyLCA0MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNzIsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTc3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiDQotCQkJCWNsaWVudCAgICAgCUA1ODUNCi0JCQkJc3VwcGxpZXIgICAJQDU3NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjY4NywgNDQ4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY4NywgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1NzcpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNC4gQ29tcG9uZW50IEhpZXJhcmNoeSwgUmVsYXRpb25zIGFuZCBBdHRyaWJ1dGVzIChQYXJ0IDI6IERhdGF0eXBlcykiDQotCQkJcXVpZCAgICAgICAJIjNCNkMzMjY1MDA1RiINCi0JCQl0aXRsZSAgICAgIAkiNC4gQ29tcG9uZW50IEhpZXJhcmNoeSwgUmVsYXRpb25zIGFuZCBBdHRyaWJ1dGVzIChQYXJ0IDI6IERhdGF0eXBlcykiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiIEA2MjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDg5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMiwgODQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZpeGVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIg0KLQkJCQl3aWR0aCAgICAgIAkzMzgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIgQDYyMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgODk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNCwgODQ1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlcGVhdGFibGVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTQ1MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDYyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY2LCAxMTEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQl3aWR0aCAgICAgIAk0NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDYyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc3NywgMTExMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXR0ZXJuRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzE4LCAxMDQ5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2MjINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNzE4LCAxMDQ5KQ0KLQkJCQkgICAgKDcxOCwgOTU5KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEA2MjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCA5MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTksIDg3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4Ig0KLQkJCQl3aWR0aCAgICAgIAk0MjANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDYyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDkyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MywgODcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREJvdW5kZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJCXdpZHRoICAgICAgCTM4OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIgQDYyOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMzIsIDExMDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDcsIDEwNDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTQ2OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBANjI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwNCwgMTEwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxOSwgMTA0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2Ig0KLQkJCQl3aWR0aCAgICAgIAkzODgNCi0JCQkJaGVpZ2h0ICAgICAJMTM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IiBANjMwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCAxMzc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTEsIDEzMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IiBANjMxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjA4LCAxNTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MDUsIDE0OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MjQNCi0JCQkJaGVpZ2h0ICAgICAJMTM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYzMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAxMjYyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTQ0LCAxMjYyKQ0KLQkJCQkgICAgKDE0NCwgOTY0KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIgQDYzMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDE1NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDcsIDE0OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDYzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDEzNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4MCwgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCQl3aWR0aCAgICAgIAk0OTgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IiBANjM1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgMTY3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhJbmNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiDQotCQkJCXdpZHRoICAgICAgCTQ2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiIEA2MzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxOTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAxODUyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDYzNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgyLCAxNjc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSINCi0JCQkJd2lkdGggICAgICAJNDQ2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCIgQDYzOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTkwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0LCAxODUyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQkJd2lkdGggICAgICAJNDc0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IiBANjM5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MiwgMjA1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJd2lkdGggICAgICAJNDI2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBANjQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxOCwgMjA1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzlEMDNDNyINCi0JCQkJY2xpZW50ICAgICAJQDYyMw0KLQkJCQlzdXBwbGllciAgIAlANjIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTQsIDExMDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTQsIDEwNDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDYyNSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NjIwMDQ1Ig0KLQkJCQljbGllbnQgICAgIAlANjM0DQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA2NDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQsIDExNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDQTUwMzhEIg0KLQkJCQljbGllbnQgICAgIAlANjI0DQotCQkJCXN1cHBsaWVyICAgCUA2MjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNDQsIDExMDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMDQ5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzgwMDJERiINCi0JCQkJY2xpZW50ICAgICAJQDYzMA0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjMsIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjMsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWQiIEA2NDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxMzI0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxMjc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkM3NzE1MjAyRTQiDQotCQkJCXdpZHRoICAgICAgCTQ0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHkiIEA2NDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjY5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTYxOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNUQwMDlCIg0KLQkJCQl3aWR0aCAgICAgIAk0NDQNCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2UiIEA2NDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCAyMDMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2UiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkVFRDBGNjAzNDIiDQotCQkJCXdpZHRoICAgICAgCTQyNA0KLQkJCQloZWlnaHQgICAgIAkyODcNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6VmFsdWUiIEA2NDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDIwOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgMjA2MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJWYWx1ZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgMjAxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNDMDQwQjVCMDMxRiINCi0JCQkJd2lkdGggICAgICAJNjM2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjYxMDMzNyINCi0JCQkJY2xpZW50ICAgICAJQDYzOQ0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMjA0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDY1MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDEzNzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzLCAxMzgwKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU0DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzMDQNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBANjUyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1ODQsIDEzNzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDEzODApDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIikpDQotCQkJCXdpZHRoICAgICAgCTMwNg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQyNDAwOTgiDQotCQkJCWNsaWVudCAgICAgCUA2NTENCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM1LCAxMzA4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM1LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExRDMxMDNBRCINCi0JCQkJY2xpZW50ICAgICAJQDY1Mg0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCAxMzA4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I1MjAzNTMiDQotCQkJCWNsaWVudCAgICAgCUA2MzcNCi0JCQkJc3VwcGxpZXIgICAJQDY1MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg1LCAxNjY0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg1LCAxNDQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCODMwM0I4Ig0KLQkJCQljbGllbnQgICAgIAlANjM1DQotCQkJCXN1cHBsaWVyICAgCUA2NTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDAsIDE2NjQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAwLCAxNDQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCOEUwMzA5Ig0KLQkJCQljbGllbnQgICAgIAlANjM2DQotCQkJCXN1cHBsaWVyICAgCUA2NTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjIsIDE4NDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjIyLCAxNDQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzQwMEMwIg0KLQkJCQljbGllbnQgICAgIAlANjMxDQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NywgMTQ4NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NywgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I3RDAwRkMiDQotCQkJCWNsaWVudCAgICAgCUA2MzMNCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM5NywgMTQ4NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzOTcsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjYwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCOTkwMDE2Ig0KLQkJCQljbGllbnQgICAgIAlANjQwDQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzUsIDIwNDQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc1LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDY2MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDM2OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQsIDMxOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTQwNg0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjYyDQotCQkJCWxvY2F0aW9uICAgCSgzNjYsIDUyMikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjYxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDM2NiwgNTIyKQ0KLQkJCQkgICAgKDM2NiwgNDMwKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDY2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgNjI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM0LCA1NzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQl3aWR0aCAgICAgIAk0NjINCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2NA0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA3ODEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY2Mw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyNzIsIDc4MSkNCi0JCQkJICAgICgyNzIsIDY4NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiDQotCQkJCWNsaWVudCAgICAgCUA2MjINCi0JCQkJc3VwcGxpZXIgICAJQDY2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTk0LCA4MzMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTQsIDc4MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY0KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIgQDY2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDc1MiwgNjI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNiwgNTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZ1bmRhbWVudGFsRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNzY4LCA3ODkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY2Ng0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg3NjgsIDc4OSkNCi0JCQkJICAgICg3NjgsIDY4NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY1OTAxMkMiDQotCQkJCWNsaWVudCAgICAgCUA2MjYNCi0JCQkJc3VwcGxpZXIgICAJQDY2Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA1MCwgODYwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1MCwgNzg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjNDMDIyNCINCi0JCQkJY2xpZW50ICAgICAJQDYyNw0KLQkJCQlzdXBwbGllciAgIAlANjY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTI1LCA4NjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI1LCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjcwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NEYwMTMxIg0KLQkJCQljbGllbnQgICAgIAlANjI4DQotCQkJCXN1cHBsaWVyICAgCUA2NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMzcsIDEwMzYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM3LCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjcxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NDIwMDc0Ig0KLQkJCQljbGllbnQgICAgIAlANjI5DQotCQkJCXN1cHBsaWVyICAgCUA2NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDEwMzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANjcyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0NTYsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCAxMDcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSINCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkNCi0JCQkJd2lkdGggICAgICAJNjU2DQotCQkJCWhlaWdodCAgICAgCTI1MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjYiIEA2NzMNCi0JCQkJbG9jYXRpb24gICAJKDc3NSwgMTc4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ1OTcxMDJFQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjciIEA2NzQNCi0JCQkJCVBhcmVudF9WaWV3IAlANjczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjc0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwOSwgMjM1KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzUwMTE5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3NSwgMTc4KQ0KLQkJCQkJICAgICg1NTAsIDE3OCkNCi0JCQkJCSAgICAoNTUwLCAzMDYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzUsIDE3OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NTAsIDMwNikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDY3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2NzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc1LCAxMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODMxMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDEwNSINCi0JCQkJCWNsaWVudCAgICAgCUA2NzMNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgMTc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MSwgMjE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODEyNTAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4OCIgQDY3OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY5LCA3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwMjAzQTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmFjZXRzIiBANjgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDY3OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xNjE1LCAtMTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA0OTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzODYzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNjUiDQotCQkJCQljbGllbnQgICAgIAlANjc5DQotCQkJCQlzdXBwbGllciAgIAlANjYzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzY5LCA3MikNCi0JCQkJCSAgICAoMTAwLCA3MikNCi0JCQkJCSAgICAoMTAwLCA1NjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMCwgNTYxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjAsIDQ5OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNzkwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg5IiBANjgzDQotCQkJCQlQYXJlbnRfVmlldyAJQDY3OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xNjE1LCAtMTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjg0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc2LCAzMSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA1MSINCi0JCQkJCWNsaWVudCAgICAgCUA2NzkNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCA3MikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMCIgQDY4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgNTA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODYNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOCwgNDQ5KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjANCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzEiIEA2ODcNCi0JCQkJCVBhcmVudF9WaWV3IAlANjg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NiwgMzQwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMERGIg0KLQkJCQkJY2xpZW50ICAgICAJQDY4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDUwOCkNCi0JCQkJCSAgICAoMTQ4NywgNTA4KQ0KLQkJCQkJICAgICgxNDg3LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA1MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIml0ZW1UeXBlRGVmaW5pdGlvbiIgQDY4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2ODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIzLCA1NzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraXRlbVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjIxMTUzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMEUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDY4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDUwOCkNCi0JCQkJCSAgICAoMTU5MCwgNTA4KQ0KLQkJCQkJICAgICgxNTkwLCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA1MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU5MCwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjkxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNDY4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAzOTg0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5MCIgQDY5Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTcyOSwgNTc0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNEI3MDIwOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTEiIEA2OTMNCi0JCQkJCVBhcmVudF9WaWV3IAlANjkyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgMzUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzNywgMzUzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY5Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3MjksIDU3NCkNCi0JCQkJCSAgICAoMTY3OCwgNTc0KQ0KLQkJCQkJICAgICgxNjc4LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OCwgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1lbWJlclR5cGVEZWZpbml0aW9ucyIgQDY5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2OTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA2NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWVtYmVyVHlwZURlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjI2OTIzMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY5Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3MjksIDU3NCkNCi0JCQkJCSAgICAoMTc4MSwgNTc0KQ0KLQkJCQkJICAgICgxNzgxLCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4MSwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMCwgNTIwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzEyMTIxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5MiIgQDY5OA0KLQkJCQlsb2NhdGlvbiAgIAkoNzQ4LCAyNjkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzIwMURCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZ1bmRhbWVudGFsRmFjZXRzIiBANjk5DQotCQkJCQlQYXJlbnRfVmlldyAJQDY5OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgMzEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Z1bmRhbWVudGFsRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjQwOTA5MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDYzIg0KLQkJCQkJY2xpZW50ICAgICAJQDY5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDY2Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc0OCwgMjY5KQ0KLQkJCQkJICAgICg2NTksIDI2OSkNCi0JCQkJCSAgICAoNjU5LCA1NjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NDgsIDI2OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTksIDU2MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyOCwgMzg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM4MDI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTMiIEA3MDINCi0JCQkJCVBhcmVudF9WaWV3IAlANjk4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1MiwgMjI4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDU5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NDgsIDI2OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAyNjkpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTQiIEA3MDQNCi0JCQkJbG9jYXRpb24gICAJKDExNzUsIDM5NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVBQjAyNzMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk1IiBANzA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDcwNA0KLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDMxNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDI5MSINCi0JCQkJCWNsaWVudCAgICAgCUA3MDQNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc1LCAzOTYpDQotCQkJCQkgICAgKDExMzUsIDM5NikNCi0JCQkJCSAgICAoMTEzNSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzUsIDI4NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA3MDcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzA0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTgwOSwgMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NCwgNDQzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi41MzMzMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDJBNSINCi0JCQkJCWNsaWVudCAgICAgCUA3MDQNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc1LCAzOTYpDQotCQkJCQkgICAgKDEyMTUsIDM5NikNCi0JCQkJCSAgICAoMTIxNSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTUsIDI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzIsIDM1OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTYxNTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk2IiBANzEwDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0NDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzIwMTZDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NyIgQDcxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNjI0LCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjY4LCAzMjcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3NTAyMkYiDQotCQkJCQljbGllbnQgICAgIAlANzEwDQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQ0KLQkJCQkJICAgICgxMzA5LCA0NDYpDQotCQkJCQkgICAgKDEzMDksIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA5LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iIEA3MTMNCi0JCQkJCVBhcmVudF9WaWV3IAlANzEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTYyNCwgMjIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIwNCwgNTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3ByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjAwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjQzIg0KLQkJCQkJY2xpZW50ICAgICAJQDcxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNjAsIDQ0NikNCi0JCQkJCSAgICAoMTQxMiwgNDQ2KQ0KLQkJCQkJICAgICgxNDEyLCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYwLCA0NDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxMiwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3MywgNDA5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYyMTQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANzE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDUxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDI4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgMzc4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDQ4OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGxpc3QiDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIHVuaW9uIikpDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDcxNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDE3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzE3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgOTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVmFyaWV0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjc3MzAyNDkiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM3QjAzOTYiDQotCQkJCWNsaWVudCAgICAgCUA2NjYNCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkxLCA1NjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTEsIDUyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4MDAzOTQiDQotCQkJCWNsaWVudCAgICAgCUA2NjMNCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA1NjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzIsIDUyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiDQotCQkJCWNsaWVudCAgICAgCUA2NjENCi0JCQkJc3VwcGxpZXIgICAJQDY0Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY2LCAzMDYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjYsIDIxNSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2Qzg4MDFCNCINCi0JCQkJY2xpZW50ICAgICAJQDYyMQ0KLQkJCQlzdXBwbGllciAgIAlANjYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcsIDgyOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NywgNzgxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjU5MDI4MSINCi0JCQkJY2xpZW50ICAgICAJQDYzOA0KLQkJCQlzdXBwbGllciAgIAlANjUxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAsIDE4NDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAsIDE0NDQpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjUuIENvbXBvbmVudCBBbm5vdGF0aW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I2OUQ2OEQwMEQyIg0KLQkJCXRpdGxlICAgICAgCSI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDcyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAkzNTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANzI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MiwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA3MjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCAxNTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI2LCAxNDYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDcyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDMwNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjYzLCAyNjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQl3aWR0aCAgICAgIAk0NjgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA3MjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMzE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANzI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA3MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA2NjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANzI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTE0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDczMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgNTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDczMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDY4LCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDczMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyMTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgMTE3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANzMzDQotCQkJCWxvY2F0aW9uICAgCSgxOTk0LCAxNDEyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA3MzINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTk5NCwgMTQxMikNCi0JCQkJICAgICgxOTk0LCAxMjcxKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDczNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDcyNQ0KLQkJCQlzdXBwbGllciAgIAlANzMyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDg0LCAxNDQ5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA4NCwgMTQxMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzMzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANzM1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA4NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgwLCA4MjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNDAyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDczNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTIsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA3MzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODQsIDM0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDczOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgMTgxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANzM5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc5MiwgMTcxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2NywgMTY3NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk2NjkNCi0JCQkJaGVpZ2h0ICAgICAJMTAwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc0MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDczOQ0KLQkJCQlzdXBwbGllciAgIAlANzMyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTcyLCAxNjYyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU3MiwgMTQxMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzMzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDc0MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTAyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgsIDk4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IiBANzQyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODgsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk0NTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANzQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MSwgMTQ5MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA3NDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MiwgNjg1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQl3aWR0aCAgICAgIAk3MzgNCi0JCQkJaGVpZ2h0ICAgICAJNTQzDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzIiIEA3NDUNCi0JCQkJbG9jYXRpb24gICAJKDg2NSwgMTM1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAxODMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMzIiBANzQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDc0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzM0MiDQotCQkJCQljbGllbnQgICAgIAlANzQ1DQotCQkJCQlzdXBwbGllciAgIAlANzI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg2NSwgMTM1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NzEsIDEzNTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc0Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCA1NTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTgsIDEzMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS4xMTY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDM0NiINCi0JCQkJCWNsaWVudCAgICAgCUA3NDUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4NjUsIDEzNTkpDQotCQkJCQkgICAgKDkyNSwgMTM1OSkNCi0JCQkJCSAgICAoOTI1LCAxMjE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4NywgMTI3NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjQyMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTYiIEA3NTANCi0JCQkJbG9jYXRpb24gICAJKDcxMywgNzA5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBGMDIxMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTciIEA3NTENCi0JCQkJCVBhcmVudF9WaWV3IAlANzUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNywgLTkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBDOSINCi0JCQkJCWNsaWVudCAgICAgCUA3NTANCi0JCQkJCXN1cHBsaWVyICAgCUA3MjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCA3MDkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc1Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA3LCAtOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjcsIDY2NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDk1MjM4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwRDMiDQotCQkJCQljbGllbnQgICAgIAlANzUwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxMywgNzA5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgNzA5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk2LCA3NTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTM1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUwIiBANzU1DQotCQkJCWxvY2F0aW9uICAgCSg3MTksIDExOTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTUwMDhBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MSIgQDc1Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMDk2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDcyOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExOTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCAxMTkzKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NTcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwMSwgMzkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIwLCAxMTQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDY5OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE2MDBBMCINCi0JCQkJCWNsaWVudCAgICAgCUA3NTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgMTE5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNiwgMTI0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwNDE2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTAiIEA3NjANCi0JCQkJbG9jYXRpb24gICAJKDc4NSwgNTUwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBBMDA2NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTEiIEA3NjENCi0JCQkJCVBhcmVudF9WaWV3IAlANzYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyM0YiDQotCQkJCQljbGllbnQgICAgIAlANzYwDQotCQkJCQlzdXBwbGllciAgIAlANzMwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NSwgNTUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNTUwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NjINCi0JCQkJCVBhcmVudF9WaWV3IAlANzYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OSwgNTE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDcwNzA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyNDkiDQotCQkJCQljbGllbnQgICAgIAlANzYwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzg1LCA1NTApDQotCQkJCQkgICAgKDg4NCwgNTUwKQ0KLQkJCQkJICAgICg4ODQsIDY3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NSwgNTUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NCwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzY0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM1LCA2MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mjk3MzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgyIiBANzY1DQotCQkJCWxvY2F0aW9uICAgCSgxMTg0LCA0MDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTYwMjkwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4MyIgQDc2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDczMQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTg0LCA0MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4NCwgMTM1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBANzY3DQotCQkJCQlQYXJlbnRfVmlldyAJQDc2NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMiwgLTQxMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzY3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjQsIDIyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC42NjU0MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NzAxNkYiDQotCQkJCQljbGllbnQgICAgIAlANzY1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg0LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUxLCA2MTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODQzODcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk4IiBANzcwDQotCQkJCWxvY2F0aW9uICAgCSgxNzUyLCAxMDM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMjkxMDE1OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTkiIEA3NzENCi0JCQkJCVBhcmVudF9WaWV3IAlANzcwDQotCQkJCQlsb2NhdGlvbiAgIAkoNTM2LCAyMTgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTIwMTlGIg0KLQkJCQkJY2xpZW50ICAgICAJQDc3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDczMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3NTIsIDEwMzQpDQotCQkJCQkgICAgKDE4MTIsIDEwMzQpDQotCQkJCQkgICAgKDE4MTIsIDExNjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDExNjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc3Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzANCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NDMsIDk5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU5NjAzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxQTkiDQotCQkJCQljbGllbnQgICAgIAlANzcwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTIsIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgMTAzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODQsIDEwNjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTAzMzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAwIiBANzc1DQotCQkJCWxvY2F0aW9uICAgCSgxODk2LCA4ODEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2Q0YwMDg4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwMSIgQDc3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzUNCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE1RCINCi0JCQkJCWNsaWVudCAgICAgCUA3NzUNCi0JCQkJCXN1cHBsaWVyICAgCUA3MzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxODk2LCA4ODEpDQotCQkJCQkgICAgKDE5NTYsIDg4MSkNCi0JCQkJCSAgICAoMTk1NiwgMTE2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4OTYsIDg4MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTU2LCAxMTYxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRlcml2YXRpb25Bbm5vdGF0aW9uIiBANzc3DQotCQkJCQlQYXJlbnRfVmlldyAJQDc3NQ0KLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCA4NDIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzkwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGVyaXZhdGlvbkFubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNTQyMzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE2NyINCi0JCQkJCWNsaWVudCAgICAgCUA3NzUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg5NiwgODgxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDg4MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODksIDkxNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNTA4NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDIiIEA3ODANCi0JCQkJbG9jYXRpb24gICAJKDIwNDAsIDcxNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzMzAyNjQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAzIiBANzgxDQotCQkJCQlQYXJlbnRfVmlldyAJQDc4MA0KLQkJCQkJbG9jYXRpb24gICAJKDkyMCwgLTg1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjM0MDI4NCINCi0JCQkJCWNsaWVudCAgICAgCUA3ODANCi0JCQkJCXN1cHBsaWVyICAgCUA3MzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMDQwLCA3MTUpDQotCQkJCQkgICAgKDIxMDAsIDcxNSkNCi0JCQkJCSAgICAoMjEwMCwgMTE2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAwLCAxMTYxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBANzgyDQotCQkJCQlQYXJlbnRfVmlldyAJQDc4MA0KLQkJCQkJbG9jYXRpb24gICAJKDkyMCwgLTg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1OCwgNjgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyOEUiDQotCQkJCQljbGllbnQgICAgIAlANzgwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA3MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg1LCA3NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDkzMTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIwIiBANzg1DQotCQkJCWxvY2F0aW9uICAgCSg2NjgsIDg2NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNDAwNEYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIxIiBANzg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDc4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC02MTIsIDMzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBDQSINCi0JCQkJCWNsaWVudCAgICAgCUA3ODUNCi0JCQkJCXN1cHBsaWVyICAgCUA3MzUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA4NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDczLCA4NjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgODI1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMzQxNDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBENCINCi0JCQkJCWNsaWVudCAgICAgCUA3ODUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA4NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCA4NjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDEsIDkwMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4MjA1MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjQiIEA3OTANCi0JCQkJbG9jYXRpb24gICAJKDE0NzIsIDE2NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCOTAxQ0QiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI1IiBANzkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDc5MA0KLQkJCQkJbG9jYXRpb24gICAJKDI1NiwgLTY0OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCQTAxQzQiDQotCQkJCQljbGllbnQgICAgIAlANzkwDQotCQkJCQlzdXBwbGllciAgIAlANzM2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ3MiwgMTY3KQ0KLQkJCQkJICAgICgxNDcyLCA3MikNCi0JCQkJCSAgICAoMTg4MywgNzIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCAxNjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg4MywgNzIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTANCi0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA0LCAxMjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzYzMDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCQTAxQ0UiDQotCQkJCQljbGllbnQgICAgIAlANzkwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcyLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE5LCA2MTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTM1NzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzQiIEA3OTUNCi0JCQkJbG9jYXRpb24gICAJKDkyNywgMzUwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjA2MDI5MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NSIgQDc5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MSINCi0JCQkJCWNsaWVudCAgICAgCUA3OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3MzcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI3LCAzNTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjI5LCAzNTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAzMTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC44MTY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MiINCi0JCQkJCWNsaWVudCAgICAgCUA3OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MjcsIDM1MCkNCi0JCQkJCSAgICAoOTg3LCAzNTApDQotCQkJCQkgICAgKDk4NywgNjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI3LCAzNTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg3LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM3LCA2MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDMzNDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjYiIEA4MDANCi0JCQkJbG9jYXRpb24gICAJKDEwMjcsIDIyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REFEQzAyRjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjciIEA4MDENCi0JCQkJCVBhcmVudF9WaWV3IAlAODAwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDIzOCINCi0JCQkJCWNsaWVudCAgICAgCUA4MDANCi0JCQkJCXN1cHBsaWVyICAgCUA3MzgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgMjIyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MDINCi0JCQkJCVBhcmVudF9WaWV3IAlAODAwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwMywgMTg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDA2MjUwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REFERDAyNDIiDQotCQkJCQljbGllbnQgICAgIAlAODAwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTAyNywgMjIyKQ0KLQkJCQkJICAgICgxMDg3LCAyMjIpDQotCQkJCQkgICAgKDEwODcsIDY3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjcsIDIyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA2MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTAwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgyNTgzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkwIiBAODA1DQotCQkJCWxvY2F0aW9uICAgCSgxNDk0LCAxNDM4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOTAwNjg4MDFDMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MSIgQDgwNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDUNCi0JCQkJCWxvY2F0aW9uICAgCSgyMTQsIDU5MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4QTAxMTEiDQotCQkJCQljbGllbnQgICAgIAlAODA1DQotCQkJCQlzdXBwbGllciAgIAlANzM5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTY2MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50QW5ub3RhdGlvbiIgQDgwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDUNCi0JCQkJCWxvY2F0aW9uICAgCSgyMTQsIDU5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTYsIDEzNTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudEFubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNjc3MTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4QTAxMUIiDQotCQkJCQljbGllbnQgICAgIAlAODA1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDMsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTMwMDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ0IiBAODEwDQotCQkJCWxvY2F0aW9uICAgCSg2MzcsIDEwMjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTcwMkM4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0NSIgQDgxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTgwM0UyIg0KLQkJCQkJY2xpZW50ICAgICAJQDgxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDExLCAxMDIyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MTINCi0JCQkJCVBhcmVudF9WaWV3IAlAODEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4MywgMjIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEwLCA5NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODg4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTkwMDA0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAyLCAxMDYyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMwMDg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY0IiBAODE1DQotCQkJCWxvY2F0aW9uICAgCSgxNTgxLCA2MDcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTcwMTAyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY1IiBAODE2DQotCQkJCQlQYXJlbnRfVmlldyAJQDgxNQ0KLQkJCQkJbG9jYXRpb24gICAJKDMwMSwgLTIyNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTEiDQotCQkJCQljbGllbnQgICAgIAlAODE1DQotCQkJCQlzdXBwbGllciAgIAlANzQyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU4MSwgNjA3KQ0KLQkJCQkJICAgICgxNTgxLCA1NDcpDQotCQkJCQkgICAgKDE2NzksIDU0NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc5LCA1NDcpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4MTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAODE1DQotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2OSwgNDYyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjE5Njk3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTkwMTkyIg0KLQkJCQkJY2xpZW50ICAgICAJQDgxNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCA2MDcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNjIwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTk2OTcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNCIgQDgyMA0KLQkJCQlsb2NhdGlvbiAgIAkoODQ5LCAxNDk2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjExMDI2RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDUiIEA4MjENCi0JCQkJCVBhcmVudF9WaWV3IAlAODIwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDFGOSINCi0JCQkJCWNsaWVudCAgICAgCUA4MjANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxNDk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1NCwgMTQ5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDgyMA0KLQkJCQkJbG9jYXRpb24gICAJKC0yNzEsIDY5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk0MiwgMTQ2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTg4MjU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMjAyMDMiDQotCQkJCQljbGllbnQgICAgIAlAODIwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODQ5LCAxNDk2KQ0KLQkJCQkJICAgICgxMDYyLCAxNDk2KQ0KLQkJCQkJICAgICgxMDYyLCAxMjE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxNDk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjIsIDEyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTE1LCAxMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyNjkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNiIgQDgyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTUyLCAxNTY1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDNjI2RUIzMDAwNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDciIEA4MjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAODI1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyOCwgNzMzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMyNyINCi0JCQkJCWNsaWVudCAgICAgCUA4MjUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1NCwgMTU2NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDgyNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI4LCA3MzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCAxNTM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA0OTU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMzIiDQotCQkJCQljbGllbnQgICAgIAlAODI1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTUyLCAxNTY1KQ0KLQkJCQkJICAgICgxMjAwLCAxNTY1KQ0KLQkJCQkJICAgICgxMjAwLCAxMjE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDAsIDEyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU0LCAxMjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODMwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0Ig0KLQkJCQljbGllbnQgICAgIAlANzI2DQotCQkJCXN1cHBsaWVyICAgCUA3MzYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5ODQsIDI0OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5ODQsIDEzNSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgzMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzhGMDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDc0Mg0KLQkJCQlzdXBwbGllciAgIAlANzI2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTk3LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTk3LCAzNTkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjYuIENvbmNyZXRlIENvbXBvbmVudHMiDQotCQkJcXVpZCAgICAgICAJIjNCNkFENzREMDNDNCINCi0JCQl0aXRsZSAgICAgIAkiNi4gQ29uY3JldGUgQ29tcG9uZW50cyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAODMyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IiBAODMzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTY4LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJd2lkdGggICAgICAJNTQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA4MzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTkxLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQkJd2lkdGggICAgICAJNDM2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAODM1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNTYsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJd2lkdGggICAgICAJNDI2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4MzYNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDU2MSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODM1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEzNjAsIDU2MSkNCi0JCQkJICAgICgxMzYwLCA0NzEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiIEA4MzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREluY2x1ZGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIg0KLQkJCQl3aWR0aCAgICAgIAkyNTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiIEA4MzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjk0LCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiIEA4MzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA1LCAxMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDg0MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM3NSwgMTE1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJODY5DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQyIiBAODQxDQotCQkJCWxvY2F0aW9uICAgCSgxMzY4LCAxMjA2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M1MDA3RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDMiIEA4NDINCi0JCQkJCVBhcmVudF9WaWV3IAlAODQxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTE2MCwgNDA2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QiINCi0JCQkJCWNsaWVudCAgICAgCUA4NDENCi0JCQkJCXN1cHBsaWVyICAgCUA4MzcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjA2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NDMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODQxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTE2MCwgNDA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0NywgMTE1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU0NDEyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkMiDQotCQkJCQljbGllbnQgICAgIAlAODQxDQotCQkJCQlzdXBwbGllciAgIAlAODQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjgsIDEyMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNCwgMTIwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDAsIDEyNTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA3DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE0NzA2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MCIgQDg0Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgMTAyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEODAyRkMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQxIiBAODQ3DQotCQkJCQlQYXJlbnRfVmlldyAJQDg0Ng0KLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QiINCi0JCQkJCWNsaWVudCAgICAgCUA4NDYNCi0JCQkJCXN1cHBsaWVyICAgCUA4MzgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTY4LCAxMDIyKQ0KLQkJCQkJICAgICgxMTY4LCA5NjIpDQotCQkJCQkgICAgKDEyODUsIDk2MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNjgsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NSwgOTYyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NDgNCi0JCQkJCVBhcmVudF9WaWV3IAlAODQ2DQotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjkwLCAxMDc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDUzNzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEMiDQotCQkJCQljbGllbnQgICAgIAlAODQ2DQotCQkJCQlzdXBwbGllciAgIAlAODQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNjgsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE2OCwgMTE0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMjcsIDEwNzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzY5NzUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYyIiBAODUxDQotCQkJCWxvY2F0aW9uICAgCSgxNTYzLCAxMzUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFERTQyMDA5QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjMiIEA4NTINCi0JCQkJCVBhcmVudF9WaWV3IAlAODUxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTM1NSwgNTUzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFERTQzMDJGRSINCi0JCQkJCWNsaWVudCAgICAgCUA4NTENCi0JCQkJCXN1cHBsaWVyICAgCUA4MzkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTYzLCAxMzUzKQ0KLQkJCQkJICAgICgxOTQwLCAxMzUzKQ0KLQkJCQkJICAgICgxOTQwLCAxMjU1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgMTM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQwLCAxMjU1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDg1MQ0KLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDEzMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTY4MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFERTQzMDMwOCINCi0JCQkJCWNsaWVudCAgICAgCUA4NTENCi0JCQkJCXN1cHBsaWVyICAgCUA4NDANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTYzLCAxMzUzKQ0KLQkJCQkJICAgICgxMTgxLCAxMzUzKQ0KLQkJCQkJICAgICgxMTgxLCAxMjU5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgMTM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTgxLCAxMjU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzMCwgMTMyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MTM0NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4NTYNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNTYxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4MzINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjg4LCA1NjEpDQotCQkJCSAgICAoMjg4LCA0NzEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAODU3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYwLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDg1OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjU4LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQkJd2lkdGggICAgICAJNDE0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDg1OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgOTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1MCwgOTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDg2MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNCwgNjcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMCwgNjI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJY2xpZW50ICAgICAJQDg2MA0KLQkJCQlzdXBwbGllciAgIAlAODMyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjEsIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMSwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NTYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyINCi0JCQkJY2xpZW50ICAgICAJQDg1Nw0KLQkJCQlzdXBwbGllciAgIAlAODMyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1ODksIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OSwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NTYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkIzMDFENSINCi0JCQkJY2xpZW50ICAgICAJQDgzNA0KLQkJCQlzdXBwbGllciAgIAlAODM1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDE2LCA2MTcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDE2LCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDgzNikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEA4NjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MCwgOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg2NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgMTA4OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODY0DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE4MjQsIDEwODkpDQotCQkJCSAgICAoMTgyNCwgOTk5KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOERDMDM4MSINCi0JCQkJY2xpZW50ICAgICAJQDgzNw0KLQkJCQlzdXBwbGllciAgIAlAODY0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY2LCAxMTQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2NiwgMTA4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODY1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NjcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCWNsaWVudCAgICAgCUA4MzkNCi0JCQkJc3VwcGxpZXIgICAJQDg2NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkzNCwgMTE0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzQsIDEwODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg2NSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDg2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgNjI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTQzOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg2OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2MiwgODE5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4NjgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTc2MiwgODE5KQ0KLQkJCQkgICAgKDE3NjIsIDcyNykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NzANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiDQotCQkJCWNsaWVudCAgICAgCUA4MzgNCi0JCQkJc3VwcGxpZXIgICAJQDg2OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNiwgODg5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNiwgODE5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg3MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiINCi0JCQkJY2xpZW50ICAgICAJQDg2OA0KLQkJCQlzdXBwbGllciAgIAlAODM1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU2LCA2MTcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU2LCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDgzNikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAODcyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxNDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODc1LCAxMDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4NzMNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDI4OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDExMjAsIDI4OSkNCi0JCQkJICAgICgxMTIwLCAxOTkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwNCIgQDg3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NSwgMjE1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjA4MDNDNyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250YWluZXIiIEA4NzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAODc0DQotCQkJCQlsb2NhdGlvbiAgIAkoOTg5LCAxMDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA0LCAyMTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGFpbmVyIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDMzMTEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMEMwMUNFIg0KLQkJCQkJY2xpZW50ICAgICAJQDg3NA0KLQkJCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0ODUsIDIxNSkNCi0JCQkJCSAgICAoMTQ4NSwgMTc2KQ0KLQkJCQkJICAgICgxMzc0LCAxNzYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3NCwgMTc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzNSwgMjI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTY5DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjAyNjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDUiIEA4NzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAODc0DQotCQkJCQlsb2NhdGlvbiAgIAkoOTg5LCAxMDMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMEMwMUNGIg0KLQkJCQkJY2xpZW50ICAgICAJQDg3NA0KLQkJCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0ODUsIDIxNSkNCi0JCQkJCSAgICAoMTQ4NSwgMjU0KQ0KLQkJCQkJICAgICgxMzQ1LCAyNTQpDQotCQkJCQkgICAgKDEzNDUsIDE5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODUsIDIxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzQ1LCAxOTkpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDYiIEA4NzkNCi0JCQkJbG9jYXRpb24gICAJKDc3MywgMjE2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjQ4MDI2MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290Q29udGFpbmVyIiBAODgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDg3OQ0KLQkJCQkJbG9jYXRpb24gICAJKDUzLCAxMDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDIxNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290Q29udGFpbmVyIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNTAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE2MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjRDMDI4NSINCi0JCQkJCWNsaWVudCAgICAgCUA4NzkNCi0JCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NzMsIDIxNikNCi0JCQkJCSAgICAoNzczLCAxNzYpDQotCQkJCQkgICAgKDg2NiwgMTc2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAyMTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxNzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDIyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zMDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwNyIgQDg4Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzkNCi0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjRDMDI4NiINCi0JCQkJCWNsaWVudCAgICAgCUA4NzkNCi0JCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NzMsIDIxNikNCi0JCQkJCSAgICAoNzczLCAyNTcpDQotCQkJCQkgICAgKDg5NSwgMjU3KQ0KLQkJCQkJICAgICg4OTUsIDE5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMjE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NSwgMTk5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhFNjAzNzIiDQotCQkJCWNsaWVudCAgICAgCUA4MzUNCi0JCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2NywgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NywgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NzMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJEOEUyMDBFQSINCi0JCQkJY2xpZW50ICAgICAJQDgzMw0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTIsIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1MiwgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NzMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiINCi0JCQkJY2xpZW50ICAgICAJQDgzMg0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTksIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5OSwgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NzMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA4ODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODg4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIg0KLQkJCQljbGllbnQgICAgIAlAODg3DQotCQkJCXN1cHBsaWVyICAgCUA4NjANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNiwgMTE0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNiwgNzI3KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxOCIgQDg4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgMTQyNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE5IiBAODkwDQotCQkJCQlQYXJlbnRfVmlldyAJQDg4OQ0KLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCQljbGllbnQgICAgIAlAODg5DQotCQkJCQlzdXBwbGllciAgIAlAODY0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM4MiwgMTQyNSkNCi0JCQkJCSAgICAoMjE0NywgMTQyNSkNCi0JCQkJCSAgICAoMjE0NywgOTQzKQ0KLQkJCQkJICAgICgyMDY3LCA5NDMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjcsIDk0MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEA4OTENCi0JCQkJCVBhcmVudF9WaWV3IAlAODg5DQotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ1LCAxMzg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjU0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg4OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg4Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzODIsIDE0MjUpDQotCQkJCQkgICAgKDIyNSwgMTQyNSkNCi0JCQkJCSAgICAoMjI1LCAxMjU1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjUsIDEyNTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMsIDEzOTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTY5MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE2IiBAODk0DQotCQkJCWxvY2F0aW9uICAgCSgxNTA1LCAxNTAzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQ0M3MDBFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTciIEA4OTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAODk0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTMxMywgMzAzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MiINCi0JCQkJCWNsaWVudCAgICAgCUA4OTQNCi0JCQkJCXN1cHBsaWVyICAgCUA4NjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTA1LCAxNTAzKQ0KLQkJCQkJICAgICgyMTg4LCAxNTAzKQ0KLQkJCQkJICAgICgyMTg4LCA2NzUpDQotCQkJCQkgICAgKDIwNTksIDY3NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1OSwgNjc1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAODk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDg5NA0KLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMywgMTQ3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMzMzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIg0KLQkJCQkJY2xpZW50ICAgICAJQDg5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDg4Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MDUsIDE1MDMpDQotCQkJCQkgICAgKDExMywgMTUwMykNCi0JCQkJCSAgICAoMTEzLCAxMjU1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNSwgMTUwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMsIDEyNTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NzY4Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDgiIEA4OTkNCi0JCQkJbG9jYXRpb24gICAJKDY2LCAyNDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzEwMzU2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwOSIgQDkwMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzMxIg0KLQkJCQkJY2xpZW50ICAgICAJQDg5OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDY2LCAyNDQpDQotCQkJCQkgICAgKDY2LCAxNDQpDQotCQkJCQkgICAgKDg2NiwgMTQ0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE0NCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWEiIEA5MDENCi0JCQkJCVBhcmVudF9WaWV3IAlAODk5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1LCA5MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTY4MTEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzM0IiDQotCQkJCQljbGllbnQgICAgIAlAODk5DQotCQkJCQlzdXBwbGllciAgIAlAODg3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYsIDExNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYsIDE4NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMTMNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY2NTkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTA0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3ODBCRDkwMDU5Ig0KLQkJCQljbGllbnQgICAgIAlAODU4DQotCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTksIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTksIDI4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODczKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiDQotCQkJCWNsaWVudCAgICAgCUA4NDANCi0JCQkJc3VwcGxpZXIgICAJQDgzMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDAwLCAxMTQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg1NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkwNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTAxMiwgODM3KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4MzQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTAxMiwgODM3KQ0KLQkJCQkgICAgKDEwMTIsIDcyNykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDcNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAOTA4DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzEsIDg3MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4ODE1OA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGRDRFMjAzNjYiDQotCQkJCWNsaWVudCAgICAgCUA4NDANCi0JCQkJc3VwcGxpZXIgICAJQDgzNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzNywgMTE0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMzcsIDgzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDkNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAOTEwDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg5MCwgODY1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTgxNjMzDQotCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZENEJBMDIzQyINCi0JCQkJY2xpZW50ICAgICAJQDg1OQ0KLQkJCQlzdXBwbGllciAgIAlAODM0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjUsIDkwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgODM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDg2NA0KLQkJCQlzdXBwbGllciAgIAlAODY4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI4LCA4ODkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI4LCA4MTkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg2OSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQjlGOEY3NjAyQzciDQotCQkJdGl0bGUgICAgICAJIjcuIENvbmNyZXRlIEF0dHJpYnV0ZXMiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA5MTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgMTQ0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxMzU5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxNDE5KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzgyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZm9ybSA6IFhTREZvcm0iDQotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNDMwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGb3JtIiBAOTEzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2MCwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5OCwgMTM2NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGb3JtIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5OCwgMTMxNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5RjkxM0IwMUVCIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAOTE0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgOTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDk3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ2DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZWxlbWVudCA6IERPTUVsZW1lbnQiKSkNCi0JCQkJd2lkdGggICAgICAJNjc1DQotCQkJCWhlaWdodCAgICAgCTE0Mw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAOTE1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAzODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg3LCAzMzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA5MTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA5NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3OCwgODkyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJd2lkdGggICAgICAJNDcwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDkxNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCAxNDA4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDEzNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAOTE4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODY0LCA2MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA1NzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQl3aWR0aCAgICAgIAkyNTYNCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoODUwLCA1MzcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg4NTAsIDUzNykNCi0JCQkJICAgICg4NTAsIDQ0NykpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRWxlbWVudCIgQDkyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyNDgsIDEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA5MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01FbGVtZW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzUxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODE4OTc5MDIwMCINCi0JCQkJd2lkdGggICAgICAJNzY5DQotCQkJCWhlaWdodCAgICAgCTIwMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5MjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDY0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNTg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTUxMg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA5MjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDM4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMzMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkyMw0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAyNjMpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDkxNA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgzNjgsIDI2MykNCi0JCQkJICAgICgzNjgsIDE2NykpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA5MjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTkyLCAxNDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEzNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEyOTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxNDA3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgc3Vic3RpdHV0aW9uIg0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iDQotCQkJCQkiKyBhbGwiKSkNCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIgQDkyNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE3OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTcwOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTY1OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QkUwMjcyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3NjgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkxOTgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIGFsbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTANCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAOTI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkxMiwgMjA5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMDQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMTAwKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzIzDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkNCi0JCQkJd2lkdGggICAgICAJNzc4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDkyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTk4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4NzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDkyOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NDQsIDIwMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE5MzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleEZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2MiwgMTg4MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyQ0EwMUNCIg0KLQkJCQl3aWR0aCAgICAgIAkzODINCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDkyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMjc5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMzM5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTg4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdXNlIDogWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiDQotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNjQwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIgQDkzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTYzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE1NDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTQ5OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JBN0IwRTgwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTINCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA5MzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjA4LCA5MjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ5OCwgODgxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzgNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA5MzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI0MCwgMTcxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NywgMTYzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk5NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjkxKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTM0DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikpDQotCQkJCXdpZHRoICAgICAgCTk4NA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA5MzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTA5NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4ODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDExNTYpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NTINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk5MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDkzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDEwMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyMiwgNzc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTk5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTEwMTQNCi0JCQkJaGVpZ2h0ICAgICAJNDg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIgQDkzNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgOTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNywgOTA0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREltcG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJCXdpZHRoICAgICAgCTQyNA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAOTM2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNDQsIDY1NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM4LCA2MDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM4LCA2NjApDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNDMwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA5MzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgMjA0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxMCwgMTk0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAyMDAyKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJODIyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEQ29tcGxleEZpbmFsIg0KLQkJCQkJIjw8MC4uKj4+ICsgYmxvY2sgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJCSIrIG1peGVkIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk4NzgNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAOTM4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4OCwgMTY5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzA0LCAxNjQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzg2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJY2xpZW50ICAgICAJQDkzOA0KLQkJCQlzdXBwbGllciAgIAlAOTE3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA2LCAxNjMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwNiwgMTQ3MikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAOTQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjIwOCwgNzA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA1OTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCXdpZHRoICAgICAgCTkxOA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhBQTAxRDMiDQotCQkJCWNsaWVudCAgICAgCUA5MzENCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjY5NiwgODY5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY5NiwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDkzMg0KLQkJCQlzdXBwbGllciAgIAlAOTEyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDk0LCAxNjE5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5NCwgMTUzMykpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NDMNCi0JCQkJbG9jYXRpb24gICAJKDE0ODcsIDE4NTYpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDkzOA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNDg3LCAxODU2KQ0KLQkJCQkgICAgKDE0ODcsIDE3NjApKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTUF0dHIiIEA5NDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAwLCAzODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDM1MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01BdHRyIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JCRjhDODkwMUI2Ig0KLQkJCQl3aWR0aCAgICAgIAk2NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAOTM3DQotCQkJCXN1cHBsaWVyICAgCUA5MzgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzQsIDE5MzApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzM0LCAxODU2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSINCi0JCQkJY2xpZW50ICAgICAJQDkzNg0KLQkJCQlzdXBwbGllciAgIAlAOTE1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCA1ODgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2Ig0KLQkJCQljbGllbnQgICAgIAlAOTQwDQotCQkJCXN1cHBsaWVyICAgCUA5MTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxOTAsIDU4NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxOTAsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCWNsaWVudCAgICAgCUA5MjENCi0JCQkJc3VwcGxpZXIgICAJQDkyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyLCA1NzIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjIsIDQ0NykpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiINCi0JCQkJY2xpZW50ICAgICAJQDkyMg0KLQkJCQlzdXBwbGllciAgIAlAOTE0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjAsIDMyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MCwgMjYzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEQ5MDAzRSINCi0JCQkJY2xpZW50ICAgICAJQDkzNQ0KLQkJCQlzdXBwbGllciAgIAlAOTIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjMsIDg5MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMywgNzA4KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQljbGllbnQgICAgIAlAOTMzDQotCQkJCXN1cHBsaWVyICAgCUA5MzENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDAsIDEwODQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAwLCA5ODcpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRG9jdW1lbnQiIEA5NTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxMjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDk0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTURvY3VtZW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1NywgNDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI3ODUwRTAzODEiDQotCQkJCXdpZHRoICAgICAgCTc3Ng0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBOTAzRDIiDQotCQkJCWNsaWVudCAgICAgCUA5MTUNCi0JCQkJc3VwcGxpZXIgICAJQDkxNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU2LCAzMjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDI2MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTIzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NTm9kZSIgQDk1NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNCwgMzUwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzMDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjRBNTAxMTciDQotCQkJCXdpZHRoICAgICAgCTY4Ng0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCWNsaWVudCAgICAgCUA5MTgNCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODUwLCA1NjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTAsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDdCQjAzNDkiDQotCQkJCWNsaWVudCAgICAgCUA5MjkNCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAxMjY3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTU3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3Ig0KLQkJCQljbGllbnQgICAgIAlAOTE2DQotCQkJCXN1cHBsaWVyICAgCUA5MTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTQsIDg4MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2OTQsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCWNsaWVudCAgICAgCUA5MzQNCi0JCQkJc3VwcGxpZXIgICAJQDkxOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU2LCA3NjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDY4NykpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NTkNCi0JCQkJbG9jYXRpb24gICAJKDE3MDMsIDEyOTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDkxNg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNzAzLCAxMjkwKQ0KLQkJCQkgICAgKDE3MDMsIDEwMDgpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTYwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQljbGllbnQgICAgIAlAOTE3DQotCQkJCXN1cHBsaWVyICAgCUA5MTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDMsIDEzNDQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk2MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDkxMg0KLQkJCQlzdXBwbGllciAgIAlAOTE2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMzQ3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMTI5MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUA5MjYNCi0JCQkJc3VwcGxpZXIgICAJQDkzOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MywgMjAyOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNTMsIDE4NTYpDQotCQkJCWRyYXdTdXBwbGllciAJQDk0MykpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI4LiBDb25jcmV0ZSBDb250YWlubWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QTgwOTcwMjdBIg0KLQkJCXRpdGxlICAgICAgCSI4LiBDb25jcmV0ZSBDb250YWlubWVudCINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDk2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NzIsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQzOSwgOTQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5NjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjQwLCA1NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQzMSwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiIEA5NjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTMsIDc0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiDQotCQkJCXdpZHRoICAgICAgCTI4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDk2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDU3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODU0LCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQkJd2lkdGggICAgICAJNDM4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NjcNCi0JCQkJbG9jYXRpb24gICAJKDE5NDMsIDg2OCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTY2DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE5NDMsIDg2OCkNCi0JCQkJICAgICgxOTQzLCA2MzEpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2NCIgQDk2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjEyNSwgNjgwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFODI0MDA1MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjUiIEA5NjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTY4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDk2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDk2NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNzI5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAOTcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDk2OA0KLQkJCQkJbG9jYXRpb24gICAJKDE1NywgMzQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NSwgNjcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTc1NDM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDk2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDk2Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNjMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA2NywgNjcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTc1NDM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA5NzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDgsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTc0DQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTczDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI3MiwgNDY1KQ0KLQkJCQkgICAgKDI3MiwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDk3NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NTYsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNzIsIDExMjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTY5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1ODcNCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBAOTc2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA1NzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg5LCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTM1Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MiIgQDk3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3MCwgMTM1NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDk3OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5NzcNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OSwgMTM4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM0MDQ0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiDQotCQkJCQljbGllbnQgICAgIAlAOTc3DQotCQkJCQlzdXBwbGllciAgIAlAOTc2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3MCwgMTM1NikNCi0JCQkJCSAgICAoMjA2LCAxMzU2KQ0KLQkJCQkJICAgICgyMDYsIDYzMSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2LCA2MzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5ODANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYsIDEzMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTkxNDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MyIgQDk4MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5NzcNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI1MjEsIDEzOTgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiDQotCQkJCQljbGllbnQgICAgIAlAOTc3DQotCQkJCQlzdXBwbGllciAgIAlAOTc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3MCwgMTM1NikNCi0JCQkJCSAgICAoMjczMSwgMTM1NikNCi0JCQkJCSAgICAoMjczMSwgMTIyNykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjczMSwgMTIyNykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAOTgzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAxNjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NiIgQDk4NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyLCAxMTM2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJDRUIxMDJGOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDciIEA5ODUNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTg0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMUIiDQotCQkJCQljbGllbnQgICAgIAlAOTg0DQotCQkJCQlzdXBwbGllciAgIAlAOTc2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMiwgMTEzNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDYzMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDk4Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5ODQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMwLCAtMjU2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIzLCAxNTE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUwNDk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjYwMDI1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDk4NA0KLQkJCQkJc3VwcGxpZXIgICAJQDk4Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyLCAxNjQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwLCAxNTgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgxMTg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDk4OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgODApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJCXdpZHRoICAgICAgCTUxMw0KLQkJCQloZWlnaHQgICAgIAkxMDANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1OCIgQDk5MA0KLQkJCQlsb2NhdGlvbiAgIAkoNDcsIDg4NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxNTAxMTkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU5IiBAOTkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDk5MA0KLQkJCQkJbG9jYXRpb24gICAJKC0yODksIDgyMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQUIiDQotCQkJCQljbGllbnQgICAgIAlAOTkwDQotCQkJCQlzdXBwbGllciAgIAlAOTgzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3LCA4ODUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDE2NDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDk5Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMjg5LCA4MjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIsIDE4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIxODU0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQjUiDQotCQkJCQljbGllbnQgICAgIAlAOTkwDQotCQkJCQlzdXBwbGllciAgIAlAOTg5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3LCA4ODUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDEzMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI4LCAxOTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc4ODENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAOTk1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgODk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjUyLCA4NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJd2lkdGggICAgICAJMzYzDQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDk5Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzUsIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4OCIgQDk5Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxOSwgMTAzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFOTAxOEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODkiIEA5OTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTk3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3LCAtMTAyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM2QyINCi0JCQkJCWNsaWVudCAgICAgCUA5OTcNCi0JCQkJCXN1cHBsaWVyICAgCUA5OTUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCA5NTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDk5OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDAwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTAzOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDczMTcxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzgwIg0KLQkJCQkJY2xpZW50ICAgICAJQDk5Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDk5Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE5LCAxMDM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDExMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3OSwgMTAzMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNDA4MTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEAxMDAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTY5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NSwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCXdpZHRoICAgICAgCTQ2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMDAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODQiIEAxMDA0DQotCQkJCWxvY2F0aW9uICAgCSgxMzUxLCAxODQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E1MDExMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODUiIEAxMDA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjk3LCAyMjQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0I0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMDQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDAzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1MSwgMTg0MCkNCi0JCQkJCSAgICAoMTI5NCwgMTg0MCkNCi0JCQkJCSAgICAoMTI5NCwgMTc1MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NCwgMTc1MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwNA0KLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNywgMTgwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjY1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E3MDNDOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDA0DQotCQkJCQlzdXBwbGllciAgIAlAMTAwMw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTEsIDE4NDApDQotCQkJCQkgICAgKDE0MDksIDE4NDApDQotCQkJCQkgICAgKDE0MDksIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE3NTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjEsIDE4MDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzI4NDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjgiIEAxMDA5DQotCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAxNDMyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDA2RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIgQDEwMTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwOQ0KLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDE1MjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDQ5NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMTgiDQotCQkJCQljbGllbnQgICAgIAlAMTAwOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MCwgMTQzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxNjQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAxNTI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0NTQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2OSIgQDEwMTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwOQ0KLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDksIDEyNjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMEUiDQotCQkJCQljbGllbnQgICAgIAlAMTAwOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDk5Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkwLCAxNDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTAsIDEyMjMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODYiIEAxMDE1DQotCQkJCWxvY2F0aW9uICAgCSgxNjkwLCAxNjg0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNUFEMDM3NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldENvbnRlbnRzIiBAMTAxNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNiwgLTEyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk1LCAxNzMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZhY2V0Q29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzIwNTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNUFGMDAxMCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDE1DQotCQkJCQlzdXBwbGllciAgIAlAMTAwMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NDYsIDE2ODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDE4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDE2NDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJOTQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA3MzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NyIgQDEwMTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAxNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2NiwgMTY0MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNUFGMDAwNiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDE1DQotCQkJCQlzdXBwbGllciAgIAlAMTAwMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzQsIDE2ODQpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTAyMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2MjQsIDc4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM4OCwgNzQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIg0KLQkJCQl3aWR0aCAgICAgIAk0OTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEAxMDIyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMzIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTA4LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJCXdpZHRoICAgICAgCTQyNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDEwMjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1NywgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2NiIgQDEwMjQNCi0JCQkJbG9jYXRpb24gICAJKDk2MywgMzE5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTZCMDAzRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAyNA0KLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDM2MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4MTA4MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTExIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMjQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MywgMzE5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTksIDMxOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNiwgMjkwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk2Mzk2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjciIEAxMDI4DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQNCi0JCQkJCWxvY2F0aW9uICAgCSg1OTUsIC0xNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU1LCAzNjEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QzAxMDciDQotCQkJCQljbGllbnQgICAgIAlAMTAyNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODI4LCAzMTkpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDEwMzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA5OTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzQsIDk0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwMzENCi0JCQkJbG9jYXRpb24gICAJKDIzMjIsIDE1OTMpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwMzANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjMyMiwgMTU5MykNCi0JCQkJICAgICgyMzIyLCAxMDQ3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMzINCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTAzMw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NiwgOTA1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDYwMDAwDQotCQkJCSAgICBoZWlnaHQgICAgIAk1DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRjUwMTNBIg0KLQkJCQljbGllbnQgICAgIAlAMTAzMA0KLQkJCQlzdXBwbGllciAgIAlAOTY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTUwLCA5MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTUwLCA4NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDk2NykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEwMzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDU3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgNTMyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTY2Mg0KLQkJCQloZWlnaHQgICAgIAkxMTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExMiIgQDEwMzUNCi0JCQkJbG9jYXRpb24gICAJKDE0OTgsIDE0MzEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTQwMUFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFub255bW91c1R5cGVEZWZpbml0aW9uIiBAMTAzNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzOCwgLTE4MTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMjcsIDE0NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQzODkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MTE1MDAxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDM1DQotCQkJCQlzdXBwbGllciAgIAlAMTAzMA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0OTgsIDE0MzEpDQotCQkJCQkgICAgKDIyODEsIDE0MzEpDQotCQkJCQkgICAgKDIyODEsIDEwNDcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCAxNDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyODEsIDEwNDcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMDQsIDEzOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDU0MTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMyIgQDEwMzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDkwLCA4NjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTYiDQotCQkJCQljbGllbnQgICAgIAlAMTAzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMzQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDk4LCAxNDMxKQ0KLQkJCQkJICAgICgxMTMxLCAxNDMxKQ0KLQkJCQkJICAgICgxMTMxLCA2MzIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCAxNDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzEsIDYzMikpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDEwNDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NTUsIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNDA0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBAMTA0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgODk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA1LCA4NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTYwOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNiIgQDEwNDMNCi0JCQkJbG9jYXRpb24gICAJKDUzNCwgNzM2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzM0VGMDE2MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDEwNDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0Mw0KLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIwLCA3NDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMTExMTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiDQotCQkJCQljbGllbnQgICAgIAlAMTA0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM0LCA4NDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU5NSwgODA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc1OTI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTciIEAxMDQ3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDMNCi0JCQkJCWxvY2F0aW9uICAgCSg4NiwgLTIxNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgNjUzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDM0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUzNCwgNzM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgNjMyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM2IiBAMTA0OQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTAwLCAxMDMyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNEMDAzRSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDEwNTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0OQ0KLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTMsIDEwNDIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2VsZWN0b3IiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMyODgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiDQotCQkJCQljbGllbnQgICAgIAlAMTA0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgMTExMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAxMDQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDk1ODkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzciIEAxMDUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDkNCi0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDk2OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIyQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDQ5DQotCQkJCQlzdXBwbGllciAgIAlAMTA0Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCA5NTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzgiIEAxMDU1DQotCQkJCWxvY2F0aW9uICAgCSg3MDAsIDEwMzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDEwNTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA1NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTYsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE2LCAxMDM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1NDc5NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwMCwgMTAzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDExMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3MSwgMTA0MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEyMzA3Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM5IiBAMTA1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTksIDk2OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDU1DQotCQkJCQlzdXBwbGllciAgIAlAMTA0Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCA5NTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEAxMDYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCAxNDQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDAsIDEzOTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJd2lkdGggICAgICAJNTIyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTA2Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNTUwLCAxNTkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDYxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDU1MCwgMTU5MCkNCi0JCQkJICAgICg1NTAsIDE0OTUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDEwNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCA1NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDAsIDUzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5Ig0KLQkJCQl3aWR0aCAgICAgIAk1NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDY0DQotCQkJCWxvY2F0aW9uICAgCSgxNDA2LCA3NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTQwNiwgNzY1KQ0KLQkJCQkgICAgKDE0MDYsIDYzMSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTA2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NTYsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzkzLCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTU0NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk0IiBAMTA2Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTYxNCwgMTg2OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZGRERENzAxMTMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTUiIEAxMDY3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNkIiDQotCQkJCQljbGllbnQgICAgIAlAMTA2Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjE0LCAxODY4KQ0KLQkJCQkJICAgICgyNTAwLCAxODY4KQ0KLQkJCQkJICAgICgyNTAwLCAxNzUxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxNCwgMTg2OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAwLCAxNzUxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDY4DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxNzg3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk4NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI3NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDY2DQotCQkJCQlzdXBwbGllciAgIAlAMTA2MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MTQsIDE4NjgpDQotCQkJCQkgICAgKDk4NCwgMTg2OCkNCi0JCQkJCSAgICAoOTg0LCAxNDk1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxNCwgMTg2OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODQsIDE0OTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDE4MjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzEyODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAwIiBAMTA3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjkyNywgMzg3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk4RTM2MDM4NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVDb250ZW50cyIgQDEwNzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3MQ0KLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTE1LCAzNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlQ29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzMwNjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3QyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDcxDQotCQkJCQlzdXBwbGllciAgIAlAMTA2Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDI5MjcsIDM4NykNCi0JCQkJCSAgICAoMTc1MCwgMzg3KQ0KLQkJCQkJICAgICgxNzUwLCA1MjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTI3LCAzODcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNTIxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODA0LCA0MjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTcyNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMSIgQDEwNzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3MQ0KLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOTQ2LCAxNDQ4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzgwMDcyIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwNzENCi0JCQkJCXN1cHBsaWVyICAgCUAxMDY1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjkyNywgMzg3KQ0KLQkJCQkJICAgICgyOTg3LCAzODcpDQotCQkJCQkgICAgKDI5ODcsIDE2NzEpDQotCQkJCQkgICAgKDI5MjgsIDE2NzEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTI3LCAzODcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjkyOCwgMTY3MSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEwNzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5OSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3NiIgQDEwNzgNCi0JCQkJbG9jYXRpb24gICAJKDE3NTAsIDg3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA0RTAwNjciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgNjkxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUxMDM3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMkE1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDYzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCA2MzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTQsIDY5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNDQ0MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzciIEAxMDgyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcwOSwgMTA2NSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDI5QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDc4DQotCQkJCQlzdXBwbGllciAgIAlAMTA3Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA4NzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgMTExMykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTA4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI3OSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwOCIgQDEwODUNCi0JCQkJbG9jYXRpb24gICAJKDEyNTIsIDE4OTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDODcwMjQ3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwOSIgQDEwODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA4NQ0KLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAyRjkiDQotCQkJCQljbGllbnQgICAgIAlAMTA4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjUyLCAxODk2KQ0KLQkJCQkJICAgICgyNjAzLCAxODk2KQ0KLQkJCQkJICAgICgyNjAzLCAxNzUxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAzLCAxNzUxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIgQDEwODcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA4NQ0KLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjgyLCAxODU4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM4MTE0Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMzAzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI1MiwgMTg5NikNCi0JCQkJCSAgICAoNDI4LCAxODk2KQ0KLQkJCQkJICAgICg0MjgsIDEyMjMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUyLCAxODk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQyOCwgMTIyMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgyLCAxODYwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTc1MDMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgwIiBAMTA5MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5OSwgMTMyMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzMjAyMjAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODEiIEAxMDkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTANCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEMiDQotCQkJCQljbGllbnQgICAgIAlAMTA5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNzcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTk5LCAxMzIxKQ0KLQkJCQkJICAgICgxODk3LCAxMzIxKQ0KLQkJCQkJICAgICgxODk3LCAxMjIzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5OSwgMTMyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk3LCAxMjIzKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIgQDEwOTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5MA0KLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5NTY5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEQiDQotCQkJCQljbGllbnQgICAgIAlAMTA5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTk5LCAxMzIxKQ0KLQkJCQkJICAgICg1MDAsIDEzMjEpDQotCQkJCQkgICAgKDUwMCwgMTIyMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTAwLCAxMjIzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODIzMDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDk1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAMTA2NQ0KLQkJCQlzdXBwbGllciAgIAlAMTAzMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwNiwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDYsIDE1OTMpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwMzEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwOTYNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTA5Nw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCA0OTUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjQzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDY0MjkNCi0JCQkJICAgIGhlaWdodCAgICAgCTYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiDQotCQkJCWNsaWVudCAgICAgCUAxMDM0DQotCQkJCXN1cHBsaWVyICAgCUA5NzMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MywgNTIwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUzLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDk3NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA5OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDEwMDMNCi0JCQkJc3VwcGxpZXIgICAJQDEwMzANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDksIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA5LCAxNTkzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDMxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDk5DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMDANCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgMTU5MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk4MDM5Mg0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMzg1DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIg0KLQkJCQljbGllbnQgICAgIAlAMTAwMw0KLQkJCQlzdXBwbGllciAgIAlAMTA2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE0NCwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDQsIDE1OTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEwNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiDQotCQkJCWNsaWVudCAgICAgCUA5NzYNCi0JCQkJc3VwcGxpZXIgICAJQDk3Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2LCA1MjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjYsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTc0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEwMg0KLQkJCQlsb2NhdGlvbiAgIAkoNDMxLCAyMjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDk4OQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0MzEsIDIyMikNCi0JCQkJICAgICg0MzEsIDEzMCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTAzDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMDQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2MSwgMjI0KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTc2NzQ0DQotCQkJCSAgICBoZWlnaHQgICAgIAk4Ng0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjQ0MDA2OSINCi0JCQkJY2xpZW50ICAgICAJQDk3Mw0KLQkJCQlzdXBwbGllciAgIAlAOTg5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzUsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3NSwgMjIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMwOSwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEzMDksIDQ2NSkNCi0JCQkJICAgICgxMzA5LCAzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEwNg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTA3DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDEsIDQ5NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NDI4Ng0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMTANCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2NjAzMzkiDQotCQkJCWNsaWVudCAgICAgCUAxMDM0DQotCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzEsIDUyMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzMSwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTA4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3Ig0KLQkJCQljbGllbnQgICAgIAlAOTgzDQotCQkJCXN1cHBsaWVyICAgCUAxMDYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTAsIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAsIDE1OTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEwNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDkNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTExMA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIwNSwgNDkzKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTU4MzMzDQotCQkJCSAgICBoZWlnaHQgICAgIAk4DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjEwM0JFIg0KLQkJCQljbGllbnQgICAgIAlAOTk2DQotCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTExDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMTINCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTEsIDkwNSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0ODk4MA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNzMNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJFQjAyQTgiDQotCQkJCWNsaWVudCAgICAgCUAxMDc3DQotCQkJCXN1cHBsaWVyICAgCUA5NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzgsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODc4LCA4NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDk2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExMw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE0DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQyLCA4MDcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkzMTANCi0JCQkJICAgIGhlaWdodCAgICAgCTYxDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwM0EwMjIxIg0KLQkJCQljbGllbnQgICAgIAlAMTA3Nw0KLQkJCQlzdXBwbGllciAgIAlAMTA2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMywgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDMsIDc2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA2NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExNQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE2DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzU0LCA4MDEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3MzcwMzhGIg0KLQkJCQljbGllbnQgICAgIAlAOTk1DQotCQkJCXN1cHBsaWVyICAgCUAxMDYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjg0LCA4MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg0LCA3NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCWNsaWVudCAgICAgCUA5NjUNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyODQsIDc2MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNzksIDc2MikpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCWNsaWVudCAgICAgCUA5NjQNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDUyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDEwMjENCi0JCQkJc3VwcGxpZXIgICAJQDk2NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzNywgNzI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNjMxKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkIzMDFENSINCi0JCQkJY2xpZW50ICAgICAJQDk2Ng0KLQkJCQlzdXBwbGllciAgIAlAMTAyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk1MCwgNTIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1MCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIxDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMjINCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MjEsIDg5NykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxODENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4NzcxOQ0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNzYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU0RjAyM0MiDQotCQkJCWNsaWVudCAgICAgCUA5NjMNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4OTYsIDkzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4OTYsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyMw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI0DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzEzLCA5MDQpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTA2MjINCi0JCQkJICAgIGhlaWdodCAgICAgCTY4DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRTIwMzgxIg0KLQkJCQljbGllbnQgICAgIAlAOTc1DQotCQkJCXN1cHBsaWVyICAgCUA5NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzODEsIDExMDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzgxLCA4NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDk2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyNQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI2DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyODc4LCAyNjkpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDY2NjcNCi0JCQkJICAgIGhlaWdodCAgICAgCTY2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyNTUwMzg1Ig0KLQkJCQljbGllbnQgICAgIAlAOTc1DQotCQkJCXN1cHBsaWVyICAgCUA5ODkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5NDMsIDExMDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTQzLCAyMjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiDQotCQkJCWNsaWVudCAgICAgCUAxMDg0DQotCQkJCXN1cHBsaWVyICAgCUA5NzMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ2MiwgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ2MiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzQpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUI3QTAzOEMiDQotCQkJdGl0bGUgICAgICAJIjkuIENvbmNyZXRlIFNjaGVtYSBDb21wb3NpdGlvbiINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTEyOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTUzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE4IiBAMTEyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCAxNjk1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MUU2MDI1MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTkiIEAxMTMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDExMjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcsIDE2MjMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFQTAyRjciDQotCQkJCQljbGllbnQgICAgIAlAMTEyOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMjgsIDE2OTUpDQotCQkJCQkgICAgKDE3NSwgMTY5NSkNCi0JCQkJCSAgICAoMTc1LCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NSwgMTU5MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIgQDExMzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyOQ0KLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMyOSwgMTc0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjkyNDUyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMzBCIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMjkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTI4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjI4LCAxNjk1KQ0KLQkJCQkJICAgICgyODEsIDE2OTUpDQotCQkJCQkgICAgKDI4MSwgMTU5MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOCwgMTY5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODEsIDE1OTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOSwgMTY0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNTcxNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExMzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkwLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTE4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTQiIEAxMTM2DQotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE2OTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDUwMzk4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NSIgQDExMzcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEzNg0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NjAsIDE2MjMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0OTAzOEEiDQotCQkJCQljbGllbnQgICAgIAlAMTEzNg0KLQkJCQkJc3VwcGxpZXIgICAJQDExMzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5NTIsIDE2OTgpDQotCQkJCQkgICAgKDkwMSwgMTY5OCkNCi0JCQkJCSAgICAoOTAxLCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNjk4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMSwgMTU5MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTEzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTM2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjAsIDE3MzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjMyNjkyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzlFIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMzYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTM1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTUyLCAxNjk4KQ0KLQkJCQkJICAgICgxMDA0LCAxNjk4KQ0KLQkJCQkJICAgICgxMDA0LCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNjk4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDQsIDE1OTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgMTY0OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTE0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgOTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjAsIDk0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJd2lkdGggICAgICAJNDkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEAxMTQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA3ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxMiwgNzM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTQ3NQ0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTE0NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNDE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ2LCAyODUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNDA2DQotCQkJCWhlaWdodCAgICAgCTI4Nw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTgiIEAxMTQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMzAzLCA2NzkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMEMwM0RCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFNjaGVtYSIgQDExNDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1OSwgMzgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMDM4NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExNDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTMwMywgNjc5KQ0KLQkJCQkJICAgICgxMzAzLCA0MTkpDQotCQkJCQkgICAgKDg0MywgNDE5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwMywgNjc5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNDE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjIsIDQ1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MDc0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE5IiBAMTE0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ1LCA5NTYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCQljbGllbnQgICAgIAlAMTE0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzAzLCA2NzkpDQotCQkJCQkgICAgKDEzMDMsIDk5NykNCi0JCQkJCSAgICAoOTAxLCA5OTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAxLCA5OTcpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTYiIEAxMTUxDQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCA2NDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAMTE1Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTUxDQotCQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAtMTM5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzOCwgNTAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjAxOTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDMiDQotCQkJCQljbGllbnQgICAgIAlAMTE1MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjE2LCA2NDkpDQotCQkJCQkgICAgKDEyMTYsIDUzNCkNCi0JCQkJCSAgICAoODQzLCA1MzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA1MzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkyNiwgNTc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODMxNjQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTciIEAxMTU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNTENCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDc1NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTUxDQotCQkJCQlzdXBwbGllciAgIAlAMTE0Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMTYsIDY0OSkNCi0JCQkJCSAgICAoMTIxNiwgNzk3KQ0KLQkJCQkJICAgICg4NzcsIDc5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDY0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDc5NykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMiIgQDExNTcNCi0JCQkJbG9jYXRpb24gICAJKDY2MiwgNjQyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVEM0E2MDEzMSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiIEAxMTU4DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjM0LCAxMTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgNjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jaW5nRGlyZWN0aXZlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQwODc1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIxNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVEM0E5MDM3MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTU3DQotCQkJCQlzdXBwbGllciAgIAlAMTE0Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDcyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA2NzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzA2NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMyIgQDExNjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE1Nw0KLQkJCQkJbG9jYXRpb24gICAJKC0yMzQsIDExNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIxLCA1NzYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzAiDQotCQkJCQljbGllbnQgICAgIAlAMTE1Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYyLCA1NTkpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjQiIEAxMTYzDQotCQkJCWxvY2F0aW9uICAgCSg3NSwgMTg4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVFQ0YwMDA1RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjUiIEAxMTY0DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAxRSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTYzDQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc1LCAxODgpDQotCQkJCQkgICAgKDc1LCAxMjgpDQotCQkJCQkgICAgKDUxMCwgMTI4KQ0KLQkJCQkJICAgICg1MTAsIDI3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAxODgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCAyNzMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFZlcnNpb24iIEAxMTY1DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RWZXJzaW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjU5Mzc1MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAyOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTYzDQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc1LCAxODgpDQotCQkJCQkgICAgKDc1LCAzODApDQotCQkJCQkgICAgKDQzNywgMzgwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDM4MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzY4LCAzMjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzQ3NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI2IiBAMTE2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMTM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVFRDBCMDExQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjciIEAxMTY5DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNjgNCi0JCQkJCWxvY2F0aW9uICAgCSgzMzQsIC0zNjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTIxIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2MiwgMTM0KQ0KLQkJCQkJICAgICg3NjYsIDEzNCkNCi0JCQkJCSAgICAoNzY2LCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzY2LCAyNzMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JpZ2luYWxWZXJzaW9uIiBAMTE3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTY4DQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTY0LCA5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitvcmlnaW5hbFZlcnNpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNjUwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwRjAxMkIiDQotCQkJCQljbGllbnQgICAgIAlAMTE2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAxMzQpDQotCQkJCQkgICAgKDEzMjIsIDEzNCkNCi0JCQkJCSAgICAoMTMyMiwgMzM0KQ0KLQkJCQkJICAgICg4NDMsIDMzNCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDMzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTgxMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI4IiBAMTE3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2LCA2NTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUIwMDFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyOSIgQDExNzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMEIiDQotCQkJCQljbGllbnQgICAgIAlAMTE3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYsIDY1NikNCi0JCQkJCSAgICAoNTEzLCA2NTYpDQotCQkJCQkgICAgKDUxMywgNTU5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2LCA2NTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEzLCA1NTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiIEAxMTc1DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgNDMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFZlcnNpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzOTAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMTUiDQotCQkJCQljbGllbnQgICAgIAlAMTE3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYsIDY1NikNCi0JCQkJCSAgICAoNjYsIDY1NikNCi0JCQkJCSAgICAoNjYsIDQ3MikNCi0JCQkJCSAgICAoNDM3LCA0NzIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDQ3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzU2LCA1MjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Njg0NjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMyIiBAMTE3OA0KLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCAxMjYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzMwMTk0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzMyIgQDExNzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3OA0KLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTc4DQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDY0MiwgMTI2KQ0KLQkJCQkJICAgICg1ODgsIDEyNikNCi0JCQkJCSAgICAoNTg4LCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODgsIDI3MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWFGb3JTY2hlbWEiIEAxMTgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzgNCi0JCQkJCWxvY2F0aW9uICAgCSg4MiwgLTQxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM5LCA3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWFGb3JTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU1NTU2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3NTAxRkIiDQotCQkJCQljbGllbnQgICAgIAlAMTE3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2NDIsIDEyNikNCi0JCQkJCSAgICAoNjk3LCAxMjYpDQotCQkJCQkgICAgKDY5NywgMjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjk3LCAyNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0MywgMjEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAxODYzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE4Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDExNDINCi0JCQkJc3VwcGxpZXIgICAJQDExNDMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzOCwgOTM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM4LCA4NDMpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMTg0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcsIDExNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0OTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDcyIiBAMTE4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCAxMzQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjZCMDE5NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MyIgQDExODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAsIDEyNzEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2RDAzMDkiDQotCQkJCQljbGllbnQgICAgIAlAMTE4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDEzNDApDQotCQkJCQkgICAgKDE4MSwgMTM0MCkNCi0JCQkJCSAgICAoMTgxLCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MSwgMTIzOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTE4OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxMCwgLTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzMywgMTM4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuODY3OTI1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2RDAzMTMiDQotCQkJCQljbGllbnQgICAgIAlAMTE4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDEzNDApDQotCQkJCQkgICAgKDI4NywgMTM0MCkNCi0JCQkJCSAgICAoMjg3LCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NywgMTIzOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCAxMjk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQyOTQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTE5MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NjAsIDE0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTcsIDEwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUwNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEAxMTkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcxMiwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNiIgQDExOTMNCi0JCQkJbG9jYXRpb24gICAJKDE2NjgsIDI4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRTAxQ0MiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA3IiBAMTE5NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkzDQotCQkJCQlsb2NhdGlvbiAgIAkoOCwgLTE1MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRjAxMEYiDQotCQkJCQljbGllbnQgICAgIAlAMTE5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExOTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDE5OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNGYWNldHMiIEAxMTk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTMNCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUyLCAzMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjQ2MTU0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTFBIg0KLQkJCQkJY2xpZW50ICAgICAJQDExOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTkyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY4LCAzNjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjUsIDMwMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjkyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDExOTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDI2LCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDExOTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA2NDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCA1OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDgiIEAxMjAwDQotCQkJCWxvY2F0aW9uICAgCSgxNTA4LCA3OTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDMwMjhFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwOSIgQDEyMDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRjMiDQotCQkJCQljbGllbnQgICAgIAlAMTIwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDExOTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwOCwgNzkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDgsIDY5NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNQYXJ0aWNsZSIgQDEyMDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgNzY3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1BhcnRpY2xlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI1OTI1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEQ0MDJGRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjAwDQotCQkJCQlzdXBwbGllciAgIAlAMTE5OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwOCwgODg5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDU0LCA4MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTUwNjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTIwNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTYsIDExNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NCIgQDEyMDYNCi0JCQkJbG9jYXRpb24gICAJKDkxOSwgMTM0OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI1RTAxRjkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODUiIEAxMjA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyNSwgMTI3MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjYyMDA0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjA2DQotCQkJCQlzdXBwbGllciAgIAlAMTIwNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkxOSwgMTM0OSkNCi0JCQkJCSAgICAoODY2LCAxMzQ5KQ0KLQkJCQkJICAgICg4NjYsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxMjM5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTIwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjA2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTIzMywgLTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5OTMsIDEzOTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4zNzczNTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjYyMDA1MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjA2DQotCQkJCQlzdXBwbGllciAgIAlAMTIwNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkxOSwgMTM0OSkNCi0JCQkJCSAgICAoOTczLCAxMzQ5KQ0KLQkJCQkJICAgICg5NzMsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTczLCAxMjM5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MTksIDEyOTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDE0OTI1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTIxMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NTIsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTYsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEwIiBAMTIxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMjAyNSwgNzkyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQ5MDFGNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTEiIEAxMjE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTMNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjg0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTk5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMjUsIDc5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA2OTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjE1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTMNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjYsIDgzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODA5NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIwMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNERBMDI4RSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjEzDQotCQkJCQlzdXBwbGllciAgIAlAMTIxMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgODg5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDk4LCA4NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYxNzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEyIiBAMTIxOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTE3OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRDNjhGRjAxQkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEzIiBAMTIxOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjE4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5OCwgMjM0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjE4DQotCQkJCQlzdXBwbGllciAgIAlAMTIwNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDEsIDExNzgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNjMzNTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjE4DQotCQkJCQlzdXBwbGllciAgIAlAMTIxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3NTQsIDExNzgpDQotCQkJCQkgICAgKDIwMjgsIDExNzgpDQotCQkJCQkgICAgKDIwMjgsIDk5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTQsIDExNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyOCwgOTk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgyLCAxMDk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgzNjY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxMC4gRGlhZ25vc3RpY3MiDQotCQkJcXVpZCAgICAgICAJIjNCRkU1RjA4MDNFMiINCi0JCQl0aXRsZSAgICAgIAkiMTAuIERpYWdub3N0aWNzIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAMTIyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMTAyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5OTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgOTQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3Ig0KLQkJCQl3aWR0aCAgICAgIAk2ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWNTZXZlcml0eSIgQDEyMjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCA2NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTgsIDU0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA0OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2OEE3MDMyRiINCi0JCQkJd2lkdGggICAgICAJNDYyDQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMjI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTksIDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg5NiwgMTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NDAsIDYyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcxMw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJd2lkdGggICAgICAJNzMxDQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTIyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgNjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQsIDQwMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJd2lkdGggICAgICAJNjU4DQotCQkJCWhlaWdodCAgICAgCTQzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTQiIEAxMjI4DQotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDI4MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMTAzNUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE1IiBAMTIyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMTc2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFsbERpYWdub3N0aWNzIiBAMTIzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwOSwgMzMwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2FsbERpYWdub3N0aWNzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ4NTk4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMzI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNTYxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxMCIgQDEyMzMNCi0JCQkJbG9jYXRpb24gICAJKDEwMjgsIDQ0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyNzAzQ0QiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjExIiBAMTIzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzDQotCQkJCQlzdXBwbGllciAgIAlAMTIyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI4LCA0NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzEzLCA0NDApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50cyIgQDEyMzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIzMw0KLQkJCQkJbG9jYXRpb24gICAJKC0zOTYsIC03MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM4LCAyMzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29tcG9uZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyOTE4MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2QyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzDQotCQkJCQlzdXBwbGllciAgIAlAMTIyNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwMjgsIDQ0MCkNCi0JCQkJCSAgICAoMTA4OCwgNDQwKQ0KLQkJCQkJICAgICgxMDg4LCAxNzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI4LCA0NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4OCwgMTc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAyMzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjM4NDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEyIiBAMTIzOA0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAyODIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNjkwMTY1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMyIgQDEyMzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIzOA0KLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjYiDQotCQkJCQljbGllbnQgICAgIAlAMTIzOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjg4LCAxNzQpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGlhZ25vc3RpY3MiIEAxMjQwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMiwgMzMwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2RpYWdub3N0aWNzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDUyNjMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgMjgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDUsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5NDczNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNDMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRDMEY0QzAxQTEiDQotCQkJCWNsaWVudCAgICAgCUAxMjI3DQotCQkJCXN1cHBsaWVyICAgCUAxMjI2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzUsIDM5MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTc0KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxMS4gU3VwcGxlbWVudGFsIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4N0U0OTAxOUIiDQotCQkJdGl0bGUgICAgICAJIjExLiBTdXBwbGVtZW50YWwiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NjQsIDgxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA3NjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJODUyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyNDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTEyLCA4ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzMxLCA4MjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk3ODANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI0Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDExMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJd2lkdGggICAgICAJNDk4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTI0Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzg0LCAxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMjM2LCA2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzYiIEAxMjQ4DQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCA4NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNTAxMzciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWFyeUNvbXBvbmVudCIgQDEyNDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0OA0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTAsIC01MDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1NiwgMTE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3ByaW1hcnlDb21wb25lbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDA4MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjQ4DQotCQkJCQlzdXBwbGllciAgIAlAMTI0Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCA4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzcsIDg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjQsIDU1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3MjYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzciIEAxMjUyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDU4LCAxMjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNzAxMTIiDQotCQkJCQljbGllbnQgICAgIAlAMTI0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyNywgODQpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMjU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNjAsIDY4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDYwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3OCwgNjY3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzIyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiINCi0JCQkJCSIrIGNpcmN1bGFyIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk3ODINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTI1NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxMDcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCA5OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgMTA1MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGZhY2V0TmFtZSA6IFN0cmluZyINCi0JCQkJCSIrIGVmZmVjdGl2ZVZhbHVlIDogVmFsdWUiKSkNCi0JCQkJd2lkdGggICAgICAJNDU4DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEyNTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNTY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTgwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA2MjgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjkNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJODIwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDEyNTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMjg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAxNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNSwgMjE3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzU2DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgYWxpYXNOYW1lIDogU3RyaW5nIg0KLQkJCQkJIisgdVJJIDogU3RyaW5nIg0KLQkJCQkJIisgYWxpYXNVUkkgOiBTdHJpbmciDQotCQkJCQkiKyBxTmFtZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0NzINCi0JCQkJaGVpZ2h0ICAgICAJMjg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMTI1OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMzUyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgMjk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTYyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMjU5DQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDUxMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTI1OA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgzMjAsIDUxMCkNCi0JCQkJICAgICgzMjAsIDQyMCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjYwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlAMTI1Ng0KLQkJCQlzdXBwbGllciAgIAlAMTI1OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODEsIDU1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxLCA1MTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEyNTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNjENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUAxMjQ0DQotCQkJCXN1cHBsaWVyICAgCUAxMjU4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NzcsIDc0OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg3NywgNTEwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjU5KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEAxMjYyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDE4MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAxLCAxNzYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSINCi0JCQkJd2lkdGggICAgICAJNDU2DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDEyNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxNzc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE3MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5Ig0KLQkJCQl3aWR0aCAgICAgIAk0OTMNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTI2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDE5MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTg4OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiDQotCQkJCXdpZHRoICAgICAgCTQ5Mw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiIEAxMjY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDE5NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDczLCAxOTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IiBAMTI2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNCwgMTM3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RCb3VuZGVkRmFjZXQiIEAxMjY3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEyNjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTYzLCAxMjEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREJvdW5kZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJCXdpZHRoICAgICAgCTM5Ng0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IiBAMTI2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDEzOTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMTM0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4Ig0KLQkJCQl3aWR0aCAgICAgIAkzODANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIgQDEyNjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxMjMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDksIDExNzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETnVtZXJpY0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQkJd2lkdGggICAgICAJNDAwDQotCQkJCWhlaWdodCAgICAgCTEzMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIgQDEyNzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTYxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNSwgMTUzNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTk1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgaW5jbHVzaXZlIDogYm9vbGVhbiINCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiIEAxMjcxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDIyODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMjM2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCXdpZHRoICAgICAgCTQ1NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIgQDEyNzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMwNCwgMjYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzQsIDI1NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJCXdpZHRoICAgICAgCTQ3OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IiBAMTI3Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAyMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE5NiwgMjA3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXR0ZXJuRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAkzNjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEAxMjc0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMjA5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCAyMDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQl3aWR0aCAgICAgIAk0NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IiBAMTI3NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDIyNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjIyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCXdpZHRoICAgICAgCTM1OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEAxMjc2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTU4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDE1MDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDE1NjMpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIg0KLQkJCQkJIisgZXhjbHVzaXZlIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IiBAMTI3Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyNDY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjExMSwgMjQxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiIEAxMjc4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMjQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM5LCAyMzk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkxlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IiBAMTI3OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI2MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjU1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMjgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2NywgMTEwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTI4MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEwNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgMTAyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMjgyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDEzMDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzY0KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgdmFsaWRGYWNldHMgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNTk0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDgiIEAxMjgzDQotCQkJCWxvY2F0aW9uICAgCSgxNDQ2LCAxMjE4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBOTk0MDMwQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxMjg0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODMNCi0JCQkJCWxvY2F0aW9uICAgCSg1ODIsIC03OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4MCwgMTE3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMy4yNjgyOTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBERCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjgzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NDYsIDEyMTgpDQotCQkJCQkgICAgKDE0ODcsIDEyMTgpDQotCQkJCQkgICAgKDE0ODcsIDEyOTIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDEyOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEyNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTg0MjExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDkiIEAxMjg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODMNCi0JCQkJCWxvY2F0aW9uICAgCSg1ODIsIC03OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NzAwRTciDQotCQkJCQljbGllbnQgICAgIAlAMTI4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDQ2LCAxMjE4KQ0KLQkJCQkJICAgICgxNDA1LCAxMjE4KQ0KLQkJCQkJICAgICgxNDA1LCAxMjkyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA1LCAxMjkyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUyIiBAMTI4OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTczMywgMTU3NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RDAyNTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUzIiBAMTI4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjg4DQotCQkJCQlsb2NhdGlvbiAgIAkoOTE3LCA3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDhFMDA5MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjg4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3MzMsIDE1NzUpDQotCQkJCQkgICAgKDE0ODcsIDE1NzUpDQotCQkJCQkgICAgKDE0ODcsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RmFjZXQiIEAxMjkwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODgNCi0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTEsIDE1NDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDYyNDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDhFMDA5QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjg4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE1NzUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDIsIDE1MzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkxNTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU0IiBAMTI5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NywgMTc5MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQjAzOTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU1IiBAMTI5NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjkzDQotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0M5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU4NywgMTc5MykNCi0JCQkJCSAgICAoMTQ0NywgMTc5MykNCi0JCQkJCSAgICAoMTQ0NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODcsIDE3OTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhJbmNsdXNpdmVGYWNldCIgQDEyOTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI5Mw0KLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxNzUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjk4NDQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzRDQiDQotCQkJCQljbGllbnQgICAgIAlAMTI5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4NywgMTc5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkyLCAxNzkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIwLCAxNzU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU5MTU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1NiIgQDEyOTgNCi0JCQkJbG9jYXRpb24gICAJKDkzNywgMTc4NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBRjAzMzgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU3IiBAMTI5OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjk4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjE3LCAtNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMDAxRjkiDQotCQkJCQljbGllbnQgICAgIAlAMTI5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MzcsIDE3ODcpDQotCQkJCQkgICAgKDk5NywgMTc4NykNCi0JCQkJCSAgICAoOTk3LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTM3LCAxNzg3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5JbmNsdXNpdmVGYWNldCIgQDEzMDANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI5OA0KLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5MiwgMTc0NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5JbmNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0NjA2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMjAzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjYzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE3ODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NSwgMTc0MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2Mzk2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTgiIEAxMzAzDQotCQkJCWxvY2F0aW9uICAgCSg5ODEsIDE5MzcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjMwMjA3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1OSIgQDEzMDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMwMw0KLQkJCQkJbG9jYXRpb24gICAJKDY3NywgLTc5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI0MDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzAzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDk4MSwgMTkzNykNCi0JCQkJCSAgICAoMTA0MSwgMTkzNykNCi0JCQkJCSAgICAoMTA0MSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQxLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTMwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzAzDQotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzA2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMywgMTkwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0MTI1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTlBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE5MzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4OSwgMTg5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NjY1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjAiIEAxMzA4DQotCQkJCWxvY2F0aW9uICAgCSgxNDY5LCAxOTUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEI2MDI4RCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjEiIEAxMzA5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMDgNCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMTciDQotCQkJCQljbGllbnQgICAgIAlAMTMwOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDY5LCAxOTUzKQ0KLQkJCQkJICAgICgxNDAwLCAxOTUzKQ0KLQkJCQkJICAgICgxNDAwLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OSwgMTk1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDAwLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEV4Y2x1c2l2ZUZhY2V0IiBAMTMxMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzA4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDYsIDE5MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTgwOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIyMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzA4DQotCQkJCQlzdXBwbGllciAgIAlAMTI2NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY5LCAxOTUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjQsIDE5NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NjEsIDE5MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjcyMzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYyIiBAMTMxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjE4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAwNTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYzIiBAMTMxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzEzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxOCwgNjI4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDI0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzEzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibGVuZ3RoRmFjZXQiIEAxMzE1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzE4LCA2MjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNCwgMjIwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitsZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3NTQ3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMjUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTEyMiwgMjE4MCkNCi0JCQkJCSAgICAoMTEyMiwgMjI0MCkNCi0JCQkJCSAgICAoMzg3LCAyMjQwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIyNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MSwgMjIwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NTU5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjYiIEAxMzE4DQotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAxOTg5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEMyMDIxRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjciIEAxMzE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzE4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZW51bWVyYXRpb25GYWNldHMiIEAxMzIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzcsIDIwMTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZW51bWVyYXRpb25GYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjU4NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzE4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODQsIDE5ODkpDQotCQkJCQkgICAgKDEwODQsIDIwNDkpDQotCQkJCQkgICAgKDQ4NSwgMjA0OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDE5ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMDQ5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODMsIDIwMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTEyOTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY4IiBAMTMyMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1MSwgMjA3NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNTAxNTkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY5IiBAMTMyNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQjAiDQotCQkJCQljbGllbnQgICAgIAlAMTMyMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDUxLCAyMDc0KQ0KLQkJCQkJICAgICgxMzYyLCAyMDc0KQ0KLQkJCQkJICAgICgxMzYyLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MSwgMjA3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhdHRlcm5GYWNldHMiIEAxMzI1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzIwLCAyMDM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhdHRlcm5GYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNjcyMjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzIzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDUxLCAyMDc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxODcsIDIwNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzIsIDIwMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDg2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcwIiBAMTMyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNywgMTQwMCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDODAyQTciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjcxIiBAMTMyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUVBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyOSwgMTQwMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjYXJkaW5hbGl0eUZhY2V0IiBAMTMzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NDcsIDEzNTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2FyZGluYWxpdHlGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3MTczMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgMTQwMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MywgMTM1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzQyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODAiIEAxMzMzDQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDEzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERCMDM3NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODEiIEAxMzM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzVBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTMzNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTc4NiwgMzAxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA4LCAyNTU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzczOTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERDMDM2NCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzMzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNjIsIDI0MTMpDQotCQkJCQkgICAgKDEyNjIsIDI1OTYpDQotCQkJCQkgICAgKDIwNjUsIDI1OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjUsIDI1OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzksIDI1NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4ODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg0IiBAMTMzOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MSwgMTMwNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFMzAwRDkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg1IiBAMTMzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMzUsIC03OTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTQwMzhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyOSwgMTMwNikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJib3VuZGVkRmFjZXQiIEAxMzQwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEzNSwgLTc5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzMiwgMTI3MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitib3VuZGVkRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDMxNzQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFNDAzOTgiDQotCQkJCQljbGllbnQgICAgIAlAMTMzOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgMTMwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTU0LCAxMzA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc3LCAxMjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU0NzE3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2NCIgQDEzNDMNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIxODYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkYwMThDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2NSIgQDEzNDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0Mw0KLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNkIiDQotCQkJCQljbGllbnQgICAgIAlAMTM0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjE4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIndoaXRlU3BhY2VGYWNldCIgQDEzNDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0Mw0KLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MywgMjIwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit3aGl0ZVNwYWNlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTA5MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMwMDA3NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMjgsIDIxODYpDQotCQkJCQkgICAgKDEzMjgsIDIyNDYpDQotCQkJCQkgICAgKDIwOTMsIDIyNDYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIyNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMzMsIDIyMDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY3NjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgyIiBAMTM0OA0KLQkJCQlsb2NhdGlvbiAgIAkoNjc0LCAxMzkwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDA0OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODMiIEAxMzQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQjkiDQotCQkJCQljbGllbnQgICAgIAlAMTM0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTM5MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJvcmRlcmVkRmFjZXQiIEAxMzUwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU4LCAxMzUzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK29yZGVyZWRGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MTUzOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0MzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY3NCwgMTM5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEzOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgMTM1NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNDYxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzIiIEAxMzUzDQotCQkJCWxvY2F0aW9uICAgCSg2ODcsIDEyOTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0IwMzlDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3MyIgQDEzNTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzUzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODcsIDEyOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMjk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm51bWVyaWNGYWNldCIgQDEzNTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjgsIDEyNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbnVtZXJpY0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgwOTcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQzAzRDEiDQotCQkJCQljbGllbnQgICAgIAlAMTM1Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0MCwgMTI5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA2LCAxMjYwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2ODQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4NiIgQDEzNTgNCi0JCQkJbG9jYXRpb24gICAJKDE2ODksIDE2NjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDQwMUVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4NyIgQDEzNTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xODMsIC0zNTQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzYwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTY4OSwgMTY2MikNCi0JCQkJCSAgICAoMTQ4NywgMTY2MikNCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhGYWNldCIgQDEzNjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xODMsIC0zNTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NjksIDE2MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWF4RmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODIwNTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ1MDM2QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzU4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjg5LCAxNjYyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE2NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDQsIDE2MjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTUzODUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg4IiBAMTM2Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI1OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU0RjAxNDUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg5IiBAMTM2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzhDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiIEAxMzY1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTQ2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NSwgMjI4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDg1NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNTUwMDM5NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzYzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMjgsIDIyNTgpDQotCQkJCQkgICAgKDEzMjgsIDIzMjQpDQotCQkJCQkgICAgKDIwOTMsIDIzMjQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMjU4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIzMjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDksIDIyOTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg4MTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkwIiBAMTM2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5NywgMjM2NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNDAxMUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkxIiBAMTM2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMEQiDQotCQkJCQljbGllbnQgICAgIAlAMTM2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0IiBAMTM3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1NywgMjQ2MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNjkwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI5NywgMjM2NikNCi0JCQkJCSAgICAoMTI5NywgMjQ5OSkNCi0JCQkJCSAgICAoMjEwMiwgMjQ5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQ5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwNywgMjQ3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTMwOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTIiIEAxMzczDQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNjJBMDBBQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTMiIEAxMzc0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxMzgiDQotCQkJCQljbGllbnQgICAgIAlAMTM3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxMzc1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgMjYzNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTg1MzE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxNDIiDQotCQkJCQljbGllbnQgICAgIAlAMTM3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAyNDQ5KQ0KLQkJCQkJICAgICgxMjYyLCAyNjY4KQ0KLQkJCQkJICAgICgyMDY1LCAyNjY4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNjY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTg5LCAyNjI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI2NDg1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NCIgQDEzNzgNCi0JCQkJbG9jYXRpb24gICAJKDE0MjIsIDIxNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjAwM0E2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5NSIgQDEzNzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3OA0KLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzc4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0MjIsIDIxNTkpDQotCQkJCQkgICAgKDEzNjIsIDIxNTkpDQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlUGF0dGVybkZhY2V0IiBAMTM4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjcsIDIxMjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlUGF0dGVybkZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk5MDkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTIiDQotCQkJCQljbGllbnQgICAgIAlAMTM3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMTE5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5MjI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NiIgQDEzODMNCi0JCQkJbG9jYXRpb24gICAJKDEwODQsIDIwODMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0EwMjZCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5NyIgQDEzODQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4Mw0KLQkJCQkJbG9jYXRpb24gICAJKDgyOCwgLTEzNzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTg2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzODMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IiBAMTM4NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzgzDQotCQkJCQlsb2NhdGlvbiAgIAkoODI4LCAtMTM3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAyMTAxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40ODg2MTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzgzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODQsIDIwODMpDQotCQkJCQkgICAgKDEwODQsIDIxNDMpDQotCQkJCQkgICAgKDQ4NSwgMjE0MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMTQzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIDIxMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MzE3MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAyIiBAMTM4OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjI0MSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAwNTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAzIiBAMTM4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg4DQotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtNDc5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDNCOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzg4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMjQxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiIEAxMzkwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODgNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MTczMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0MzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzODgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTEyMiwgMjI0MSkNCi0JCQkJCSAgICAoMTEyMiwgMjMxOCkNCi0JCQkJCSAgICAoMzg3LCAyMzE4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIzMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MCwgMjI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODU2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTAiIEAxMzkzDQotCQkJCWxvY2F0aW9uICAgCSg3NzMsIDE1NjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODUwMjVCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1MSIgQDEzOTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5Mw0KLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjcwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzczLCAxNTY1KQ0KLQkJCQkJICAgICg5NTksIDE1NjUpDQotCQkJCQkgICAgKDk1OSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluRmFjZXQiIEAxMzk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTMNCi0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTMsIDE1MzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjMwOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzkzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAxNTY1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDE1MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA0IiBAMTM5OA0KLQkJCQlsb2NhdGlvbiAgIAkoODE2LCAxNjUwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCOTcwMDFEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDUiIEAxMzk5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTgNCi0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMENGIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODE2LCAxNjUwKQ0KLQkJCQkJICAgICg5NTksIDE2NTApDQotCQkJCQkgICAgKDk1OSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluRmFjZXQiIEAxNDAwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTgNCi0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc2NCwgMTYxNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5GYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE0MTYxOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMEQ5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDE2NTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMTYwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMjc0MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzQiIEAxNDAzDQotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzIxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENGMDE5OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzUiIEAxNDA0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzE5LCA0OTcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDg1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhMZW5ndGhGYWNldCIgQDE0MDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMw0KLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgMjM4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3MjI1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDhGIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI5NywgMjMyMSkNCi0JCQkJCSAgICAoMTI5NywgMjQwOSkNCi0JCQkJCSAgICAoMjEwMiwgMjQwOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NCwgMjM2NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3OTIwOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzYiIEAxNDA4DQotCQkJCWxvY2F0aW9uICAgCSgxMTU5LCAyMjczKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ1MDBDNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzciIEAxNDA5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE1OSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5MZW5ndGhGYWNldCIgQDE0MTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwOA0KLQkJCQkJbG9jYXRpb24gICAJKC0yODEsIDQ0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU3LCAyMzcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkxlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE5NTI3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENjAwMjciDQotCQkJCQljbGllbnQgICAgIAlAMTQwOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTU5LCAyMjczKQ0KLQkJCQkJICAgICgxMTU5LCAyNDA5KQ0KLQkJCQkJICAgICg0NTAsIDI0MDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTU5LCAyMjczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgMjQwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAyMzY5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzNjEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMCIgQDE0MTMNCi0JCQkJbG9jYXRpb24gICAJKDExOTcsIDIzMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTgwMTZEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMSIgQDE0MTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxMw0KLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgLTYxMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5OTAwNTYiDQotCQkJCQljbGllbnQgICAgIAlAMTQxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IiBAMTQxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEzDQotCQkJCQlsb2NhdGlvbiAgIAkoOTQxLCAtNjEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTYsIDI0NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTI2MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODk5MDA2MCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDEzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExOTcsIDIzMzQpDQotCQkJCQkgICAgKDExOTcsIDI0OTMpDQotCQkJCQkgICAgKDQ1MCwgMjQ5MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCAyNDkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjcsIDI0NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTYwNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk4IiBAMTQxOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjQzOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MDAwNjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk5IiBAMTQxOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE4DQotCQkJCQlsb2NhdGlvbiAgIAkoODYzLCAtNzQ2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAxRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDE4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCIgQDE0MjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxOA0KLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAyNjMyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTcwMzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAyNyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDE4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMzEsIDI0MzgpDQotCQkJCQkgICAgKDEyMzEsIDI2NjgpDQotCQkJCQkgICAgKDQ1MSwgMjY2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDI0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNjY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDI2MzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTg4MTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc4IiBAMTQyMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjM5NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAwREUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc5IiBAMTQyNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDIzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNDRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDIzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyMzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidG90YWxEaWdpdHNGYWNldCIgQDE0MjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMw0KLQkJCQkJbG9jYXRpb24gICAJKC0yMDksIDI1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUzLCAyNTUwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3RvdGFsRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODU1NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNENyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDIzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMzEsIDIzOTcpDQotCQkJCQkgICAgKDEyMzEsIDI1ODcpDQotCQkJCQkgICAgKDQ1MSwgMjU4NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNTg3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzUsIDI1NjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTQ2NDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxNDI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgNzY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDE5LCA1NzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDQNCi0JCQkJaGVpZ2h0ICAgICAJNDEzDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0MjkNCi0JCQkJbG9jYXRpb24gICAJKDEyMDksIDEwNjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTIwOSwgMTA2NSkNCi0JCQkJICAgICgxMjA5LCA5NzQpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzNCIgQDE0MzANCi0JCQkJbG9jYXRpb24gICAJKDEwOTAsIDEwMzEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjUwM0Q5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlRGVmaW5pdGlvbiIgQDE0MzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMA0KLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4OTcsIDEwMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5ODc2NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE5NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDAzQyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDMwDQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDk3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMSwgMTAzNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjE3MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNSIgQDE0MzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMA0KLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDA0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDMwDQotCQkJCQlzdXBwbGllciAgIAlAMTI4MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDEwODgpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDAiIEAxNDM1DQotCQkJCWxvY2F0aW9uICAgCSgxNTM4LCA4NzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REIwMUU1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlIiBAMTQzNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTc4LCAxMDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTgsIDc5MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43NjA4NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDM1DQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDg3MykNCi0JCQkJCSAgICAoMTUzOCwgOTE5KQ0KLQkJCQkJICAgICgxNDU0LCA5MTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA4NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgOTE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA5LCA4NzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMTY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0MSIgQDE0MzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzNQ0KLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDM1DQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDg3MykNCi0JCQkJCSAgICAoMTUzOCwgODI4KQ0KLQkJCQkJICAgICgxNDU0LCA4MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA4NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgODI4KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQyIiBAMTQ0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzNSwgNjg0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzEyMDEwOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZSIgQDE0NDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0MA0KLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA1OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuOTc3MjczDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxNDAxNTEiDQotCQkJCQljbGllbnQgICAgIAlAMTQ0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM1LCA2ODQpDQotCQkJCQkgICAgKDE1MzUsIDcyOCkNCi0JCQkJCSAgICAoMTQ1NCwgNzI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDcyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwNiwgNjgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNzc3OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQzIiBAMTQ0NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTc1LCAtODQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTVCIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzNSwgNjg0KQ0KLQkJCQkJICAgICgxNTM1LCA2NDEpDQotCQkJCQkgICAgKDE0NTQsIDY0MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzUsIDY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA2NDEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDYiIEAxNDQ1DQotCQkJCWxvY2F0aW9uICAgCSg2MTMsIDk0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdFRDAzQzAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcGxleFR5cGUiIEAxNDQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2NSwgOTgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBsZXhUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzczMDU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMTciDQotCQkJCQljbGllbnQgICAgIAlAMTQ0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2MTMsIDk0MCkNCi0JCQkJCSAgICAoMjg0LCA5NDApDQotCQkJCQkgICAgKDI4NCwgMTAwOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYxMywgOTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgMTAwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCA5NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDkzMjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NyIgQDE0NDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC03NDcsIDE3MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMjEiDQotCQkJCQljbGllbnQgICAgIAlAMTQ0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMCwgOTQwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDUwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlAMTQyOA0KLQkJCQlzdXBwbGllciAgIAlAMTI1OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExMiwgNTYyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExMiwgNTEwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAMTI4MA0KLQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE0NiwgMTA4OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDYsIDEwNjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0MjkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDQiIEAxNDUyDQotCQkJCWxvY2F0aW9uICAgCSgxMzYyLCAxMTMzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzRCMDE3OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlIiBAMTQ1Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5OSwgMTA5NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI0Njc1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE3QiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDUyDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDEyOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjEsIDEwOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjI3MjczDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDUiIEAxNDU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU4LCAtMTYzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE4NSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDUyDQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDk3NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEAxNDU3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDM4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzYzKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZ2xvYmFsIDogYm9vbGVhbiINCi0JCQkJCSIrIGZlYXR1cmVSZWZlcmVuY2UgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQ1OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjI2MiwgNTY4KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxNDU3DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIyNjIsIDU2OCkNCi0JCQkJICAgICgyMjYyLCA0NzcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ1OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDEyNTQNCi0JCQkJc3VwcGxpZXIgICAJQDE0NTcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDU5NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDYsIDU2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ1OCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzOCIgQDE0NjANCi0JCQkJbG9jYXRpb24gICAJKDE1NTMsIDQ1MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMjAxQTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZSIgQDE0NjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2MA0KLQkJCQkJbG9jYXRpb24gICAJKDgwMSwgMjkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzMxLCA0OTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNjI2Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjMwMkU1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NjANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU1MywgNDUzKQ0KLQkJCQkJICAgICgxMjIyLCA0NTMpDQotCQkJCQkgICAgKDEyMjIsIDU2MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIyLCA1NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExODUsIDQ3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjAzMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM5IiBAMTQ2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYwDQotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjMwMkYwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NjANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCA0NTMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzAiIEAxNDY1DQotCQkJCWxvY2F0aW9uICAgCSgxOTA4LCAzNTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMDYwMkQ3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkRmVhdHVyZSIgQDE0NjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjksIDM1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEZlYXR1cmUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI5NDEyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDBFIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTkwOCwgMzUzKQ0KLQkJCQkJICAgICgxOTA4LCAzODcpDQotCQkJCQkgICAgKDE5OTMsIDM4NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NDUsIDM1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NjYzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMxIiBAMTQ2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMTgiDQotCQkJCQljbGllbnQgICAgIAlAMTQ2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NTcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxOTA4LCAzNTMpDQotCQkJCQkgICAgKDE5MDgsIDMxOSkNCi0JCQkJCSAgICAoMTk5MywgMzE5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkwOCwgMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDMxOSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDEyNTgNCi0JCQkJc3VwcGxpZXIgICAJQDEyNTcNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDk0LCAyODQpDQotCQkJCSAgICAoNDk0LCAyNDQpDQotCQkJCSAgICAoOTk2LCAyNDQpKQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAyODQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTYsIDI0NCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCWNsaWVudCAgICAgCUAxMjQ1DQotCQkJCXN1cHBsaWVyICAgCUAxNDU3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzE4LCA4MTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzE4LCA1NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0NTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUAxMjgyDQotCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY1LCAxMjkyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2NSwgMTA2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQyOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDE0NTcNCi0JCQkJc3VwcGxpZXIgICAJQDEyNTcNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjE0NywgMjkxKQ0KLQkJCQkgICAgKDIxNDcsIDI0NCkNCi0JCQkJICAgICgxNDY4LCAyNDQpKQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE0NywgMjkxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMjQ0KSkpKSkpKQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA3NiINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NkbCIgQDE0NzQNCi0JCQlsb2NhdGlvbiAgIAkoMjcyLCAyNTYpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDE3MikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkid3NkbCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNBREZCOEU1MDIxRSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6c29hcCIgQDE0NzUNCi0JCQlsb2NhdGlvbiAgIAkoNzA0LCAyNTYpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc1DQotCQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDE3MikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkic29hcCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNBMDFDRjBDMDFBMiINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6eHNkIiBAMTQ3Ng0KLQkJCWxvY2F0aW9uICAgCSgxMTUyLCAyNTYpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDA4LCAxNzIpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJInhzZCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM5QUJEQzZGMDFBQSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQ0KLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY1Ig0KLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDc3Ig0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3Nlcw0KLQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY2Ig0KLQlQcm9jc05EZXZzIAkobGlzdA0KLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyINCi0JCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjgiDQotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3Ig0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMNCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFCYXNlU2V0IiA4MDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiQU5TSSINCi0JCQkJdmFsdWUgICAgICAJODAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiT3JhY2xlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJTUUxTZXJ2ZXIiDQotCQkJCXZhbHVlICAgICAgCTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIlN5YmFzZSINCi0JCQkJdmFsdWUgICAgICAJODAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiV2F0Y29tIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJJZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJWXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIl9WIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJCYXNlVmlld3MiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJWQVJDSEFSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIk51bGxzT0siDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcmVzZXJ2ZVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETEVsZW1lbnQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETFNwZWNpZmljYXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSURMU3BlY1NldCIgMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMU3BlY1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiVHlwZWRlZiINCi0JCQkJdmFsdWUgICAgICAJNTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkV4Y2VwdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTdHJ1Y3QiDQotCQkJCXZhbHVlICAgICAgCTUxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiVW5pb24iDQotCQkJCXZhbHVlICAgICAgCTgxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuc29hcC9zcmMvcm9zZS9zb2FwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJRExNb2R1bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuc29hcC9zcmMvcm9zZS9zb2FwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlJhaXNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJtXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkic18iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9vdERpciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTSINCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdW4iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJNaWNyb3NvZnQiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJJQk0iDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiDQotCQkJdmFsdWUgICAgICAJMykNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSZXBvc2l0b3J5Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSINCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSINCi0JCQkJdmFsdWUgICAgICAJMjA2KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLnNvYXAvc3JjL3Jvc2Uvc29hcGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5zb2FwL3NyYy9yb3NlL3NvYXBiaW5kaW5nTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0Ig0KLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGVudCINCi0JCQl2YWx1ZSAgICAgIAkyKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciINCi0JCQkJdmFsdWUgICAgICAJNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJTQ0MiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJUeXBlTGliSW1wb3J0ZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiDQotCQkJdmFsdWUgICAgICAJIjAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiDQotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlIg0KLQkJCXZhbHVlICAgICAgCSgiQ3JlYXRhYmxlU2V0IiAyMjEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbml0aWFsaXphdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVGVybWluYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIkNvbGxlY3Rpb24iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlRleHQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkb3BlcmF0aW9uIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTGV0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTGV0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkh0dHBfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUjJFZGl0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NyIpKQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL2NvbXBvbmVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMTNhOQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS9jb21wb25lbnQueG1sCkBAIC0wLDAgKzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzaSI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0iZmFsc2UiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzaSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzaS51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2ZTg2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgkKLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotICAgICAJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNGIwZjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLnBlcmZvcm1hbmNlLmphciA9IHBlcmZvcm1hbmNlLwotb3V0cHV0LnBlcmZvcm1hbmNlLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UuamFyLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGRhdGEvCi1zcmMuaW5jbHVkZXMgPSBkYXRhLyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9kYXRhL1N0b2NrUXVvdGUvU3RvY2tRdW90ZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvZGF0YS9TdG9ja1F1b3RlL1N0b2NrUXVvdGUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiZjk2NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9kYXRhL1N0b2NrUXVvdGUvU3RvY2tRdW90ZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9TdG9ja1F1b3RlLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlN0b2NrUXVvdGUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1N0b2NrUXVvdGUvIj4NCi0gIDx3c2RsOnR5cGVzPg0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9TdG9ja1F1b3RlLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdldFF1b3RlUmVzcG9uc2UiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzZDphbGw+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpY2tlclN5bWJvbCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICA8L3hzZDphbGw+DQotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZXRRdW90ZVJlcXVlc3QiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzZDphbGw+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJ4c2Q6ZmxvYXQiLz4NCi0gICAgICAgICAgPC94c2Q6YWxsPg0KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgPC94c2Q6ZWxlbWVudD4NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGVhZGVycyI+DQotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+DQotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPg0KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgPC94c2Q6ZWxlbWVudD4NCi0gICAgPC94c2Q6c2NoZW1hPg0KLSAgPC93c2RsOnR5cGVzPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRRdW90ZVJlc3BvbnNlIj4NCi0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6Z2V0UXVvdGVSZXNwb25zZSIgbmFtZT0iZ2V0UXVvdGVSZXNwb25zZSIvPg0KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpIZWFkZXJzIiBuYW1lPSJoZWFkZXJzIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UXVvdGVSZXF1ZXN0Ij4NCi0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6Z2V0UXVvdGVSZXF1ZXN0IiBuYW1lPSJnZXRRdW90ZVJlcXVlc3QiLz4NCi0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6SGVhZGVycyIgbmFtZT0iaGVhZGVycyIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJTdG9ja1F1b3RlIj4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFF1b3RlIj4NCi0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0UXVvdGVSZXF1ZXN0Ii8+DQotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpnZXRRdW90ZVJlc3BvbnNlIi8+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6cG9ydFR5cGU+DQotICA8d3NkbDpiaW5kaW5nIG5hbWU9IlN0b2NrUXVvdGVTT0FQIiB0eXBlPSJ0bnM6U3RvY2tRdW90ZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UXVvdGUiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvU3RvY2tRdW90ZS9nZXRRdW90ZSIvPg0KLSAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0iZ2V0UXVvdGVSZXF1ZXN0IiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgIDxzb2FwOmhlYWRlciBtZXNzYWdlPSJ0bnM6Z2V0UXVvdGVSZXF1ZXN0IiBwYXJ0PSJoZWFkZXJzIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0iZ2V0UXVvdGVSZXNwb25zZSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICA8c29hcDpoZWFkZXIgbWVzc2FnZT0idG5zOmdldFF1b3RlUmVzcG9uc2UiIHBhcnQ9ImhlYWRlcnMiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6YmluZGluZz4NCi0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iU3RvY2tRdW90ZSI+DQotICAgIDx3c2RsOnBvcnQgYmluZGluZz0idG5zOlN0b2NrUXVvdGVTT0FQIiBuYW1lPSJTdG9ja1F1b3RlU09BUCI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnIi8+DQotICAgIDwvd3NkbDpwb3J0Pg0KLSAgPC93c2RsOnNlcnZpY2U+DQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTQyZTUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0goCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMKLXsKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlIik7Ci0gICAgLy8kSlVuaXQtQkVHSU4kCi0gICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlLmNsYXNzKTsKLSAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAuY2xhc3MpOwotICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShPcGVuU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgLy8kSlVuaXQtRU5EJAotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL09wZW5TdG9ja1F1b3RlV1NETFNldHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNWM0Y2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5JSW50cm9QYXJ0OwotCi1wdWJsaWMgY2xhc3MgT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiUHJvamVjdCI7Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE9wZW5TdG9ja1F1b3RlV1NETFNldHVwLmNsYXNzLCAiT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAiKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNsb3NlSW50cm8oKQotICB7Ci0gICAgSUludHJvTWFuYWdlciBpbnRyb01hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEludHJvTWFuYWdlcigpOwotICAgIElJbnRyb1BhcnQgaW50cm9QYXJ0ID0gaW50cm9NYW5hZ2VyLmdldEludHJvKCk7Ci0gICAgaWYgKGludHJvUGFydCAhPSBudWxsKQotICAgICAgaW50cm9NYW5hZ2VyLmNsb3NlSW50cm8oaW50cm9QYXJ0KTsKLSAgfQotCi0gIHByb3RlY3RlZCBJUHJvamVjdCBjcmVhdGVTaW1wbGVQcm9qZWN0KFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSVByb2plY3Qgc2ltcGxlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKTsKLSAgICBzaW1wbGVQcm9qZWN0LmNyZWF0ZShudWxsKTsKLSAgICBzaW1wbGVQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgcmV0dXJuIHNpbXBsZVByb2plY3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjb3B5RmlsZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKGRlc3QpOwotICAgIGZpbGUuY3JlYXRlKFBlcmZvcm1hbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeShzb3VyY2UpLm9wZW5TdHJlYW0oKSwgdHJ1ZSwgbnVsbCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBqb2luQXV0b0J1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQgPSB0cnVlOwotICAgIHdoaWxlIChpbnRlcnJ1cHRlZCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLSAgICAgICAgaW50ZXJydXB0ZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBpbnRlcnJ1cHRlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgY2xvc2VJbnRybygpOwotICAgIElQcm9qZWN0IHByb2plY3QgPSBjcmVhdGVTaW1wbGVQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0gICAgY29weUZpbGUocHJvamVjdCwgImRhdGEvU3RvY2tRdW90ZS9TdG9ja1F1b3RlLndzZGwiLCAiU3RvY2tRdW90ZS53c2RsIik7Ci0gICAgam9pbkF1dG9CdWlsZCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxOTEyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSBleHRlbmRzIFBlcmZvcm1hbmNlVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLmVkaXRvci5pbnRlcm5hbC5XU0RMRWRpdG9yIjsKLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UuY2xhc3MsICJPcGVuU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm9qZWN0LmV4aXN0cygpKTsKLSAgICBwcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoSVByb2plY3QuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotICAgIGpvaW5BdXRvQnVpbGQoKTsKLSAgICByZXR1cm4gcHJvamVjdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGpvaW5BdXRvQnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBpbnRlcnJ1cHRlZCA9IHRydWU7Ci0gICAgd2hpbGUgKGludGVycnVwdGVkKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotICAgICAgICBpbnRlcnJ1cHRlZCA9IGZhbHNlOwotICAgICAgfQotICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGludGVycnVwdGVkID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgb3BlbkVkaXRvcihJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQsIFN0cmluZyBlZGl0b3JpZCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0gIHsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgcmV0dXJuIHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgZWRpdG9yaWQsIHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2xvc2VFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKQotICB7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIHJldHVybiB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9wZW5TdG9ja1F1b3RlV1NETCgpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KE9wZW5TdG9ja1F1b3RlV1NETFNldHVwLlBST0pFQ1RfTkFNRSk7Ci0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpcHJvamVjdC5maW5kTWVtYmVyKCJTdG9ja1F1b3RlLndzZGwiKSk7Ci0gICAgc3RhcnRNZWFzdXJpbmcoKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gb3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgRURJVE9SX0lEKTsKLSAgICBzdG9wTWVhc3VyaW5nKCk7Ci0gICAgY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0gICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICBjbG9zZUVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OGY0YWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGVyZm9ybWFuY2VQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQZXJmb3JtYW5jZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyZm9ybWFuY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFBlcmZvcm1hbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9SZWFkU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4ZmM2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9SZWFkU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1wdWJsaWMgY2xhc3MgUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlCi17Ci0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShSZWFkU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5jbGFzcywgIlJlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkU3RvY2tRdW90ZVdTREwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdGFydE1lYXN1cmluZygpOwotICAgIFVSTCB3c2RsID0gUGVyZm9ybWFuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhL1N0b2NrUXVvdGUvU3RvY2tRdW90ZS53c2RsIik7Ci0gICAgV1NETEZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgV1NETEZhY3RvcnlJbXBsKCk7Ci0gICAgV1NETFJlYWRlciByZWFkZXIgPSBmYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSByZWFkZXIucmVhZFdTREwod3NkbC50b1N0cmluZygpLCBuZXcgSW5wdXRTb3VyY2Uod3NkbC5vcGVuU3RyZWFtKCkpKTsKLSAgICBzdG9wTWVhc3VyaW5nKCk7Ci0JY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjM2RkNzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UiCi0gICBuYW1lPSJXU0RMIFBlcmZvcm1hbmNlIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0icGVyZm9ybWFuY2UuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTAzOTQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icGVyZm9ybWFuY2UiIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJ3b3Jrc3BhY2UiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vd29ya3NwYWNlX3dzZGxfcGVyZm9ybWFuY2UiLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHBlcmZvcm1hbmNlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlX3N1aXRlIj4KLQotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UuUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UiLz4KLSAgICA8L2FudD4KLQotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLk9wZW5TdG9ja1F1b3RlV1NETFNldHVwIi8+Ci0gICAgPC9hbnQ+Ci0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLk9wZW5TdG9ja1F1b3RlV1NETFRlc3RDYXNlIi8+Ci0gICAgPC9hbnQ+Ci0KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotCTxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSBwZXJmb3JtYW5jZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2UiIGRlcGVuZHM9ImluaXQscGVyZm9ybWFuY2Vfc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5ODhkNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PmNvbS5pYm0uZXRvb2xzLndzZGw8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnhzZDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPmNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udmFsaWRhdGlvbmJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+Y29tLmlibS5zc2UubW9kZWwuc3RydWN0dXJlZGJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnN0cnVjdHVyZWRidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MGYxMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXNvdXJjZS53c2RsLnRlc3RzLnVpLmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgd3NkbC50ZXN0cy51aS5qYXIsXAotICAgICAgICAgICAgICAgVGVtcGVyYXR1cmVTZXJ2aWNlLndzZGwsXAotICAgICAgICAgICAgICAgamFycy8KLXNyYy5pbmNsdWRlcyA9IHNyYy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIFRlbXBlcmF0dXJlU2VydmljZS53c2RsLFwKLSAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKLSAgICAgICAgICAgICAgIC5jbGFzc3BhdGgsXAotICAgICAgICAgICAgICAgamFycy8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGFkMGE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpIgotICAgbmFtZT0iV1NETCBNb2RlbCBVSSBTYW1wbGVzIgotICAgdmVyc2lvbj0iMS4wLjAiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzZGwudGVzdHMudWkuamFyIi8+Ci0gICA8L3J1bnRpbWU+Ci0gICAKLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS54c2QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICA8L3JlcXVpcmVzPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS5vYmplY3RfY29udHJpYnV0aW9uIj4KLSAgICAgICAgIDwhLS0KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBsYWJlbD0iR2VuZXJhdGUgV1NETCBTYW1wbGUiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLkdlbmVyYXRlV1NETEFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLmdlbmVyYXRlX3dzZGxfYWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgLS0+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgbGFiZWw9IkNvbnZlcnQgdG8gV1NETCAyLjAgRG9jdW1lbnQiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLkNvbnZlcnRXU0RMMjBBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS5jb252ZXJ0X3dzZGxfYWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgCi0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91aS9Db252ZXJ0V1NETDIwQWN0aW9uRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91aS9Db252ZXJ0V1NETDIwQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4N2YwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdWkvQ29udmVydFdTREwyMEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuV1NETENvbnZlcnRlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDb252ZXJ0V1NETDIwQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUKLXsKLSAgcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLSAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotICB7Ci0gICAgSUZpbGUgaWZpbGUgPSBudWxsOwotICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICBPYmplY3QgZWxlbWVudCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICB7Ci0gICAgICAJaWZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7Ci0gICAgICAgIElQYXRoIHBhdGggPSBpZmlsZS5nZXRMb2NhdGlvbigpOwotICAgICAgICBJUGF0aCBwYXRoMiA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcGF0aDIudG9TdHJpbmcoKSArICIvIiArIGdldE5ld05hbWUoaWZpbGUpOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0JCSAgICB7ICAKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCJmaWxlOi8iICsgcGF0aC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIFdTRExDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IFdTRExDb252ZXJ0ZXIoZGVmKTsKLSAgICAgICAgICAgIGNvbnZlcnRlci5nZW5lcmF0ZTIwKG91dHB1dCk7Ci0gICAgICAgICAgICBJQ29udGFpbmVyIGZvbGRlciA9IGlmaWxlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgZm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLG51bGwpOwotCQkgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0JCSAgICB7Ci0gICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldE5ld05hbWUoSUZpbGUgaWZpbGUpCi0gIHsKLSAgICAvLyBBc3NlcnQgY3VycmVudE5hbWUgaGFzIGEgZmlsZSBleHRlbnNpb24sIGUuZy4gZm9vLndzZGwuCi0gICAgLy8gVGhpcyB3aWxsIHJldHVybiBmb29WMjAud3NkbC4KLSAgICBTdHJpbmcgY3VycmVudE5hbWUgPSBpZmlsZS5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBjdXJyZW50TmFtZS5zdWJzdHJpbmcoMCxjdXJyZW50TmFtZS5pbmRleE9mKCIuIikpOwotICAgIFN0cmluZyBleHRlbnNpb24gPSBjdXJyZW50TmFtZS5zdWJzdHJpbmcoY3VycmVudE5hbWUuaW5kZXhPZigiLiIpKTsKLSAgICBTdHJpbmcgbmV3TmFtZSA9IG5hbWUgKyAiVjIwIiArIGV4dGVuc2lvbjsKLSAgICByZXR1cm4gbmV3TmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdWkvR2VuZXJhdGVXU0RMQWN0aW9uRGVsZWdhdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91aS9HZW5lcmF0ZVdTRExBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWFlOGMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91aS9HZW5lcmF0ZVdTRExBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMuV1NETEdlbmVyYXRpb25UZXN0OwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVXU0RMQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUKLXsKLSAgcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLSAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotICB7Ci0gICAgSUZpbGUgaWZpbGUgPSBudWxsOwotICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICBPYmplY3QgZWxlbWVudCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICB7Ci0gICAgICAJaWZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7Ci0gICAgICAgIElQYXRoIHBhdGggPSBpZmlsZS5nZXRMb2NhdGlvbigpOwotICAgICAgICBwYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBwYXRoLnRvU3RyaW5nKCkgKyAiL015U2FtcGxlLndzZGwiOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0JCXsKLSAgICAgICAgICAobmV3IFdTRExHZW5lcmF0aW9uVGVzdCgpKS5nZW5lcmF0ZVRlbXBlcmF0dXJlU2VydmljZShvdXRwdXQpOwotCQl9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzMWQ4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PmNvbS5pYm0uZXRvb2xzLndzZGw8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0PmNvbS5pYm0ud3NkbDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmFwYWNoZS54ZXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuZW1mLmVjb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UueHNkPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuanVuaXQ8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuc3RydWN0dXJlZGJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkODQxNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICB0ZXN0UmVzb3VyY2VzLyxcCi0gICAgICAgICAgICAgICBydW50ZXN0cy5iYXQsXAotICAgICAgICAgICAgICAgSlVOSVQuWFNMLFwKLSAgICAgICAgICAgICAgIHJ1bnRpbWUvLFwKLSAgICAgICAgICAgICAgIHdzZGwudGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIHNhbXBsZXMvCi1zb3VyY2Uud3NkbC50ZXN0cy5qYXIgPSBzcmMvCi1zcmMuaW5jbHVkZXMgPSB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYnVpbGQueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgLmNsYXNzcGF0aCxcCi0gICAgICAgICAgICAgICAuY3ZzaWdub3JlLFwKLSAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKLSAgICAgICAgICAgICAgIEpVTklULlhTTCxcCi0gICAgICAgICAgICAgICBydW50ZXN0cy5iYXQsXAotICAgICAgICAgICAgICAgdGVzdFJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgcnVudGltZS8sXAotICAgICAgICAgICAgICAgUFRBVGltZURpc3RyaWJ1dGlvbi53c2RsLFwKLSAgICAgICAgICAgICAgIFRERGF0YVNldC54c2QsXAotICAgICAgICAgICAgICAgc2FtcGxlcy8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWY3NWY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIgotICAgbmFtZT0iV1NETCBKVW5pdCBUZXN0IgotICAgdmVyc2lvbj0iMS4wLjAiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzZGwudGVzdHMuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnhzZCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlciIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9Mb2FkQW5kUHJpbnRUZXN0LndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0xvYWRBbmRQcmludFRlc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiM2E1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0xvYWRBbmRQcmludFRlc3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9Mb2FkQW5kUHJpbnRUZXN0LyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkxvYWRBbmRQcmludFRlc3QiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0xvYWRBbmRQcmludFRlc3QvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvTG9hZEFuZFByaW50VGVzdC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOnNjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSIgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdCIgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iTG9hZEFuZFByaW50VGVzdCI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJMb2FkQW5kUHJpbnRUZXN0U09BUCIgdHlwZT0idG5zOkxvYWRBbmRQcmludFRlc3QiPgotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJOZXdPcGVyYXRpb24iPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9Mb2FkQW5kUHJpbnRUZXN0L05ld09wZXJhdGlvbiIvPgotICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkxvYWRBbmRQcmludFRlc3QiPgotICAgIDx3c2RsOnBvcnQgYmluZGluZz0idG5zOkxvYWRBbmRQcmludFRlc3RTT0FQIiBuYW1lPSJMb2FkQW5kUHJpbnRUZXN0U09BUCI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmciLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvQWxsVGVzdENhc2VzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvQWxsVGVzdENhc2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiN2Q3ZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL0FsbFRlc3RDYXNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RDYXNlcyBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgcHVibGljIEFsbFRlc3RDYXNlcygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdChJbmxpbmVTY2hlbWFUZXN0LnN1aXRlKCkpOyAgCi0gICAgc3VpdGUuYWRkVGVzdChMb2FkQW5kU2VyaWFsaXphdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgc3VpdGUuYWRkVGVzdChTZW1hbnRpY1Rlc3Quc3VpdGUoKSk7Ci0gICAgc3VpdGUuYWRkVGVzdChXU0RMR2VuZXJhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgCi0gICAgcmV0dXJuIHN1aXRlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9JbmxpbmVTY2hlbWFUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvSW5saW5lU2NoZW1hVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzY4YzkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9JbmxpbmVTY2hlbWFUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqLldTRExGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25Mb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmxpbmVTY2hlbWFUZXN0IGV4dGVuZHMgVGVzdENhc2UgCi17Ci0gIHB1YmxpYyBJbmxpbmVTY2hlbWFUZXN0KFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0JCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIAotICB7Ci0gICAgLy9qdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oSW5saW5lU2NoZW1hVGVzdC5jbGFzcyk7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0JCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgSW5saW5lU2NoZW1hVGVzdCgiSW5saW5lU2NoZW1hIikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotCSAgICAgICAgIHRlc3RJbmxpbmVTY2hlbWEoKTsKLQkgICAgICAgfQotCSAgICAgfQotCSAgICk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdAotICAgICAgKG5ldyBJbmxpbmVTY2hlbWFUZXN0KCJJbmxpbmVTY2hlbWFXaXRoV1NETDRKIikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RJbmxpbmVTY2hlbWFXaXRoV1NETDRKKCk7Ci0gICAgICAgICAgIH0KLQkgICAgIH0KLQkgICApOwotICAgIAotCSAgcmV0dXJuIHN1aXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICAKLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgCi0gICAgLy8gV2UgbmVlZCB0aGlzIGZvciBYU0QgPGltcG9ydD4uCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInhzZCIsIG5ldyBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdElubGluZVNjaGVtYSgpIAotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIik7Ci0gICAgICB0cmF2ZXJzZURlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RJbmxpbmVTY2hlbWFXaXRoV1NETDRKKCkgCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBsb2FkRGVmaW5pdGlvbkZvcldTREw0SigiLi9zYW1wbGVzL0xvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICAgICAgdHJhdmVyc2VEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdHJhdmVyc2VEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZGVmaW5pdGlvbik7Ci0gICAgICAKLSAgICAvLyBHZXQgSW5saW5lIFNjaGVtYQotICAgIFR5cGVzIHR5cGVzID0gKG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzKWRlZmluaXRpb24uZ2V0VHlwZXMoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiPHR5cGVzPiBpcyBudWxsIix0eXBlcyk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlcy5nZXRTY2hlbWFzKCkuaXRlcmF0b3IoKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCI8dHlwZXM+IGRvZXMgbm90IGhhdmUgaW5saW5lIDxzY2hlbWE+cyIsaXRlcmF0b3IuaGFzTmV4dCgpKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdHJhdmVyc2VTY2hlbWEoc2NoZW1hKTsKLSAgICAgIH0KLSAgICB9ICAJCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZVNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gIAlJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG51bGw7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUoIk5vIDxlbGVtZW50PnMgYXJlIGZvdW5kIixpdGVyYXRvci5oYXNOZXh0KCkpOwotICAJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBlbGVtZW50RGVjbCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24paXRlcmF0b3IubmV4dCgpOwotCi0gICAgICBpZiAoZWxlbWVudERlY2wuZ2V0TmFtZSgpLmVxdWFscygiTmV3T3BlcmF0aW9uUmVzcG9uc2UiKSkKLSAgICAgIAl0cmF2ZXJzZUVsZW1lbnREZWNsKGVsZW1lbnREZWNsKTsKLSAgICAgIGVsc2UgaWYgKGVsZW1lbnREZWNsLmdldE5hbWUoKS5lcXVhbHMoIk5ld09wZXJhdGlvblJlcXVlc3QiKSkKLSAgICAgICAgdHJhdmVyc2VFbGVtZW50RGVjbChlbGVtZW50RGVjbCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlRWxlbWVudERlY2woWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGVsZW1lbnREZWNsLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUoIjxlbGVtZW50PiBkb2VzIG5vdCBoYXZlIDxzaW1wbGVUeXBlPiIsdHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLSAgICBpZiAodHlwZS5nZXRDb21wbGV4VHlwZSgpID09IG51bGwpIC8vIHNpbXBsZSB0eXBlCi0gICAgICByZXR1cm47IC8vIFRCRCAtIEN1cnJlbnRseSB0aGlzIGFsd2F5cyByZXR1cm5zIGF0IHRoaXMgcG9pbnQuCi0gICAgWFNEUGFydGljbGVDb250ZW50IGNvbnRlbnQgPSB0eXBlLmdldENvbXBsZXhUeXBlKCkuZ2V0Q29udGVudCgpOyAgIAotICAgIHRyYXZlcnNlTW9kZWxHcm91cCgoWFNETW9kZWxHcm91cCljb250ZW50KTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlTW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgIFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgcGFydGljbGVDb250ZW50ID0gKChYU0RQYXJ0aWNsZSlpdGVyYXRvci5uZXh0KCkpLmdldENvbnRlbnQoKTsKLSAgICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgdHJhdmVyc2VFbGVtZW50RGVjbCgoKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdHJhdmVyc2VFbGVtZW50RGVjbCgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIERlZmluaXRpb24gbG9hZERlZmluaXRpb24oU3RyaW5nIHdzZGxGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHJldHVybiBEZWZpbml0aW9uTG9hZGVyLmxvYWQoIi4vUFRBVGltZURpc3RyaWJ1dGlvbi53c2RsIik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBsb2FkRGVmaW5pdGlvbkZvcldTREw0SihTdHJpbmcgd3NkbEZpbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFdTRExSZWFkZXIgcmVhZGVyID0gKG5ldyBXU0RMRmFjdG9yeUltcGwoKSkubmV3V1NETFJlYWRlcigpOwotICAgIElQbHVnaW5EZXNjcmlwdG9yIHBkID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIpOwotICAgIFVSTCB1cmwgPSBwZC5nZXRJbnN0YWxsVVJMKCk7Ci0gICAgdXJsID0gbmV3IFVSTCh1cmwsd3NkbEZpbGUpOwotICAgIFN0cmluZyBzID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldEZpbGUoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAob3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbilyZWFkZXIucmVhZFdTREwocyxuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShzKSkpOwotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9Mb2FkQW5kU2VyaWFsaXphdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9Mb2FkQW5kU2VyaWFsaXphdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MzBhZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvbkxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGNsYXNzIExvYWRBbmRTZXJpYWxpemF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17ICAgIAotICAvKioKLSAgICogRXhlY3V0ZXMgYSBzdGFuZC1hbG9uZSB0ZXN0LgotICAgKiBAcGFyYW0gb2JqZWN0cyBhbiBhcnJheSBvZiBTdHJpbmdzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICogQHNlZSAjcnVuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSAKLSAgewotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0KFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IExvYWRBbmRTZXJpYWxpemF0aW9uVGVzdCgiTG9hZCIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0TG9hZCgpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IExvYWRBbmRTZXJpYWxpemF0aW9uVGVzdCgiUHJpbnQiKSAKLSAgICAgICAgewotICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0ZXN0UHJpbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICk7Ci0gICAgcmV0dXJuIHN1aXRlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIAotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICB9ICAKLSAgCi0gIHN0YXRpYyBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gIAotICAvKioKLSAgICogTG9hZCB0aGUgV1NETCBkZWZpbml0aW9ucyBmaWxlIGFuZCBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBpdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RMb2FkKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoIi4vc2FtcGxlcy9Mb2FkQW5kUHJpbnRUZXN0LndzZGwiKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRlZmluaXRpb24uZVJlc291cmNlKCkgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKTsKLSAgICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbFJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpZGVmaW5pdGlvbi5lUmVzb3VyY2UoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPCEtLSA9PT09PSBEZWZpbml0aW9uIENvbXBvc2l0aW9uID09PT09Iik7Ci0gICAgICBwcmludERlZmluaXRpb25TdGFydChkZWZpbml0aW9uKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0+Iik7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBkZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIFByaW50IHRoZSBzZXJpYWxpemF0aW9uIG9mIHRoZSBtb2RlbC4KLSAgICAgICAgLy8KLSAgICAgICAgV1NETFJlc291cmNlSW1wbC5zZXJpYWxpemUoU3lzdGVtLm91dCwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFByaW50KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFRoaXMgcmVtb3ZlcyB0aGUgYXNzb2NpYXRlZCBET00gZWxlbWVudCwgY3JlYXRlcyBhIG5ldyBhc3NvY2lhdGVkIERPTSBlbGVtZW50LCBhbmQgdGhlbiBwcmludHMgaXQuCi0gICAgICAvLyBUaGlzIGlzIGEgZ29vZCB0ZXN0IGZvciBob3cgd2VsbCBzZXJpYWxpemF0aW9uIHdvcmtzIGZvciBhIG1vZGVsIGNyZWF0ZWQgImJvdHRvbSB1cCIuCi0gICAgICAvLwotICAgICAgZGVmaW5pdGlvbi5zZXREb2N1bWVudChudWxsKTsKLSAgICAgIGRlZmluaXRpb24uc2V0RWxlbWVudChudWxsKTsKLSAgICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikudXBkYXRlRWxlbWVudCgpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI8IS0tIFsgZGVmaW5pdGlvbnM6ICIgKyBkZWZpbml0aW9uLmdldFFOYW1lKCkgKyAiIF0gLS0+Iik7Ci0gICAgICBXU0RMUmVzb3VyY2VJbXBsLnNlcmlhbGl6ZShTeXN0ZW0ub3V0LCBkZWZpbml0aW9uLmdldERvY3VtZW50KCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgfSAgIAotICB9Ci0gIAotICAvKioKLSAgICogUHJpbnRzIGEgaGVhZGVyIHRhZyBmb3IgdGhlIGdpdmVuIFdTREwgZGVmaW5pdGlvbnMuCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uIGEgV1NETCBkZWZpbml0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJpbnREZWZpbml0aW9uU3RhcnQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludCgiPGRlZmluaXRpb25zIG5hbWU9XCIiKTsKLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludChkZWZpbml0aW9uLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50KCJcIiB0YXJnZXROYW1lc3BhY2U9XCIiKTsKLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnQoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfSAgICAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlwiPiIpOwotICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvU2VtYW50aWNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvU2VtYW50aWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZGVkNmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1NlbWFudGljVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgY2xhc3MgU2VtYW50aWNUZXN0IGV4dGVuZHMgRGVmaW5pdGlvblZpc2l0b3IKLXsKLSAgCi0gIC8vcHJpdmF0ZSBTdHJpbmcgd3NkbE5hbWVzcGFjZVByZWZpeDsKLSAgLy9wcml2YXRlIFN0cmluZyB4c2ROYW1lc3BhY2VQcmVmaXg7Ci0gIAotICB7Ci0gICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHBsdWdpbi54bWwKLSAgICAvLwotICAgIC8vICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS5lbWYuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgLy8gICAgIDxwYXJzZXIgdHlwZT0id3NkbCIgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCIvPgotICAgIC8vICAgPC9leHRlbnNpb24+Ci0gICAgLy8KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0gIAotICAvLyBBZGRlZCBmb3IgSlVuaXQKLSAgcHVibGljIFNlbWFudGljVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAqLwotICBwdWJsaWMgU2VtYW50aWNUZXN0KERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGRlZmluaXRpb24pOwotICB9Ci0vKiAgCi0gIHByaXZhdGUgdm9pZCBzZXJpYWxpemUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBTb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwieWVzIik7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywiVVRGLTgiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCI0Iik7Ci0gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGRvbVNvdXJjZSxuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSkpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY3JlYXRlRG9jdW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudCBjcmVhdGVXU0RMRWxlbWVudChTdHJpbmcgbmFtZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbCIsbmFtZSk7Ci0gICAgaWYgKHdzZGxOYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkKLSAgICAgIGVsZW1lbnQuc2V0UHJlZml4KHdzZGxOYW1lc3BhY2VQcmVmaXgpOwotICAgIAotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gKi8gCi0gIHByaXZhdGUgdm9pZCB2aXNpdERvY3VtZW50YXRpb24oRWxlbWVudCBkb2NFbGVtZW50KQotICB7Ci0gICAgaWYgKGRvY0VsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBwcmludGxuKCJkb2N1bWVudGF0aW9uOiAiICsgZG9jRWxlbWVudCk7IC8vIFRCRCAtIHNlcmlhbGl6ZSBkb2NFbGVtZW50Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBwcmludGxuKFN0cmluZyBzKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHMpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBkZWZpbml0aW9ucy4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihkZWYuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgCi0gICAgUU5hbWUgcW5hbWUgPSBkZWYuZ2V0UU5hbWUoKTsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICBwcmludGxuKCJ0YXJnZXROYW1lc3BhY2U6ICIgKyB0YXJnZXROYW1lc3BhY2UpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldE5hbWVzcGFjZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcmVmaXggPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5hbWVzcGFjZSA9IGRlZi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgIHByaW50bG4oIm5hbWVzcGFjZSBwcmVmaXg6ICIgKyBwcmVmaXggKyAiLCBuYW1lc3BhY2UgVVJJOiAiICsgbmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgc3VwZXIudmlzaXREZWZpbml0aW9uKGRlZik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBkZWZpbml0aW9ucy4uLiIpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdEltcG9ydChvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgd3NkbEltcG9ydCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGltcG9ydC4uLiIpOwotICAgIC8vIERldGVybWluZSBpZiB3ZSA8aW1wb3J0PiBhIHNjaGVtYS4KLSAgICBpZiAoaW1wb3J0aW5nU2NoZW1hKHdzZGxJbXBvcnQpKQotICAgIHsKLSAgICAgIHByaW50bG4oIjxpbXBvcnQ+aW5nIFhNTCBTY2hlbWEiKTsKLSAgICAgIAotICAgICAgLy8gIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZm9vLmNvbSIgc2NoZW1hTG9jYXRpb249ICJiYXIueHNkIi8+Ci0gICAgICBwcmludGxuKCJuYW1lc3BhY2U6ICIgKyB3c2RsSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIHByaW50bG4oInNjaGVtYUxvY2F0aW9uOiAiICsgd3NkbEltcG9ydC5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgIHZpc2l0RG9jdW1lbnRhdGlvbih3c2RsSW1wb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAgIAotICAgIH0KLSAgCWVsc2UKLSAgICB7Ci0gICAgICBwcmludGxuKCI8aW1wb3J0PmluZyBXU0RMIik7Ci0gICAgICB2aXNpdERvY3VtZW50YXRpb24od3NkbEltcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICB9Ci0gICAgcHJpbnRsbigiTGVhdmluZyBpbXBvcnQuLi4iKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGltcG9ydGluZ1NjaGVtYShJbXBvcnQgbXlJbXBvcnQpCi0gIHsKLSAgICBpZiAobXlJbXBvcnQuZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpIC8vIGl0IGlzIFdTREwgaW1wb3J0Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdFR5cGVzKG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRUeXBlcyhUeXBlcyB0eXBlcykKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIHR5cGVzLi4uIik7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHR5cGVzLmdldFNjaGVtYXMoKS5pdGVyYXRvcigpOwotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgc2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBwcmludGxuKCJpbi1saW5lIHNjaGVtYTogIiArIHNjaGVtYSk7Ci0gICAgfSAgIAotICAgIHByaW50bG4oIkxlYXZpbmcgdHlwZXMuLi4iKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0UGFydChvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIHBhcnQuLi4iKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBwb3J0VHlwZS4uLiIpOwotICAJdmlzaXREb2N1bWVudGF0aW9uKHBvcnRUeXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAJCi0gICAgUU5hbWUgcW5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpOwotICAgIGlmIChxbmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAKLSAgICBzdXBlci52aXNpdFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIHBvcnRUeXBlLi4uIik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBvcGVyYXRpb24uLi4iKTsKLSAgICB2aXNpdERvY3VtZW50YXRpb24ob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotCQotICAgIFN0cmluZyBuYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG5hbWUpOwotCi0gICAgT3BlcmF0aW9uVHlwZSBvcFR5cGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIGRldGVybWluaW5nIE9wZXJhdGlvbiBUeXBlIixvcFR5cGUpOwotICAgIAotICAgIGlmIChPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZTogIiArICJpbi1vdXQiKTsKLSAgICBlbHNlIGlmIChPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAib3V0LWluIik7Ci0gICAgZWxzZSBpZiAoT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04gPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAib3V0LW9ubHkiKTsKLSAgICBlbHNlIGlmIChPcGVyYXRpb25UeXBlLk9ORV9XQVkgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAiaW4tb25seSIpOwotICAgIAotICAgIHN1cGVyLnZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBvcGVyYXRpb24uLi4iKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRJbnB1dChvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0SW5wdXQoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBpbnB1dC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgbmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG5hbWUpOwotICAgIAotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkZhaWxlZCB0byByZXNvbHZlIHRoZSBtZXNzYWdlIixtZXNzYWdlKTsKLSAgICAKLSAgICBwcmludGxuKCJMZWF2aW5nIGlucHV0Li4uIik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudCBnZXRQYXJ0RWxlbWVudChNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2VSZWYuZ2V0RU1lc3NhZ2UoKS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIC8vIFRCRCAtIGZvciBub3csIHRha2UgdGhlIGZpcnN0IHBhcnQuCi0gICAgUGFydCBwYXJ0ID0gKFBhcnQpaXRlcmF0b3IubmV4dCgpOwotICAgIEVsZW1lbnQgcGFydEVsZW1lbnQgPSBwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICByZXR1cm4gcGFydEVsZW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdE91dHB1dChvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgb3V0cHV0Li4uIik7Ci0gICAgdmlzaXREb2N1bWVudGF0aW9uKG91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgbmFtZSA9IG91dHB1dC5nZXROYW1lKCk7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBuYW1lKTsKLSAgICAKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvdXRwdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIHJlc29sdmUgdGhlIG1lc3NhZ2UiLG1lc3NhZ2UpOwotICAgIAotICAgIHByaW50bG4oIkxlYXZpbmcgb3V0cHV0Li4uIik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdEZhdWx0KG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGZhdWx0Li4uIik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBmYXVsdC4uLiIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRCaW5kaW5nKG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZy4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFFOYW1lIHFuYW1lID0gYmluZGluZy5nZXRRTmFtZSgpOwotICAgIGlmIChxbmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkZhaWxlZCB0byByZXNvbHZlIHRoZSBwb3J0VHlwZSIscG9ydFR5cGUpOwotCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKCI8c29hcEJvZHk+IGlzIG1pc3NpbmciLHNvYXBCb2R5VmlzaXRlZCk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUoIjxzb2FwQmluZGluZz4gaXMgbWlzc2luZyIsc29hcEJpbmRpbmdWaXNpdGVkKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiPHNvYXBPcGVyYXRpb24+IGlzIG1pc3NpbmciLHNvYXBPcGVyYXRpb25WaXNpdGVkKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGJpbmRpbmcgb3BlcmF0aW9uLi4uIik7Ci0gICAgdmlzaXREb2N1bWVudGF0aW9uKGJpbmRpbmdPcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpOwotICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcmVzb2x2ZSB0aGUgb3BlcmF0aW9uIixvcGVyYXRpb24pOwotICAgIAotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICBwcmludGxuKCJuYW1lOiAiICsgb3BlcmF0aW9uTmFtZSk7Ci0gICAgfQotIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgb3BlcmF0aW9uLi4uIik7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGlucHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBpbnB1dC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgaW5wdXROYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotICAgIGlmIChpbnB1dE5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBpbnB1dE5hbWUpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ0lucHV0KGlucHV0KTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgaW5wdXQuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBvdXRwdXQuLi4iKTsKLSAgICB2aXNpdERvY3VtZW50YXRpb24ob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFN0cmluZyBvdXRwdXROYW1lID0gb3V0cHV0LmdldE5hbWUoKTsKLSAgICBpZiAob3V0cHV0TmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG91dHB1dE5hbWUpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ091dHB1dChvdXRwdXQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgYmluZGluZyBvdXRwdXQuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGZhdWx0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBmYXVsdC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihmYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBFbGVtZW50IGZhdWx0RWxlbWVudCA9IGZhdWx0LmdldEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHQuZ2V0TmFtZSgpOwotICAgIGlmIChmYXVsdE5hbWUgIT0gbnVsbCkKLSAgICAgIGZhdWx0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGZhdWx0TmFtZSk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nRmF1bHQoZmF1bHQpOyAKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgZmF1bHQuLi4iKTsKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgc2VydmljZS4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihzZXJ2aWNlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFFOYW1lIHFuYW1lID0gc2VydmljZS5nZXRRTmFtZSgpOwotICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJWYWxpZGF0aW9uIEVycm9yOiBzZXJ2aWNlIGlzIG1pc3NpbmcgdGhlIG5hbWUgYXR0cmlidXRlIixxbmFtZSk7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgICBwcmludGxuKCJuYW1lOiAiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIAotICAgIHN1cGVyLnZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIHNlcnZpY2UuLi4iKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRQb3J0KG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnQoUG9ydCBwb3J0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgcG9ydC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihwb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFN0cmluZyBuYW1lID0gcG9ydC5nZXROYW1lKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIlZhbGlkYXRpb24gRXJyb3I6IHBvcnQgaXMgbWlzc2luZyB0aGUgbmFtZSBhdHRyaWJ1dGUiLHBvcnQpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBwcmludGxuKCJuYW1lOiAiICsgcG9ydC5nZXROYW1lKCkpOwotICAgIAotICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIHJlc29sdmUgdGhlIGJpbmRpbmciLGJpbmRpbmcpOwotICAgIAotICAgIHN1cGVyLnZpc2l0UG9ydChwb3J0KTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiPHNvYXBBZGRyZXNzPiBpcyBtaXNzaW5nIixzb2FwQWRkcmVzc1Zpc2l0ZWQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgcG9ydC4uLiIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG93bmVyLCBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGV4dGVuc2liaWxpdHkgZWxlbWVudC4uLiIpOwotICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgdmlzaXRTT0FQQm9keSgoU09BUEJvZHkpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEJpbmRpbmcpCi0gICAgICB2aXNpdFNPQVBCaW5kaW5nKChTT0FQQmluZGluZylleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgIHZpc2l0U09BUEFkZHJlc3MoKFNPQVBBZGRyZXNzKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICB2aXNpdFNPQVBPcGVyYXRpb24oKFNPQVBPcGVyYXRpb24pZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgZXh0ZW5zaWJpbGl0eSBlbGVtZW50Li4uIik7Ci0gIH0KLSAKLSAgLy9OZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcE9wZXJhdGlvblZpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUE9wZXJhdGlvbihTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24pCi0gIHsKLSAgICBzb2FwT3BlcmF0aW9uVmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUE9wZXJhdGlvbi4uLiIpOwotICAgIHByaW50bG4oInNvYXBBY3Rpb246ICIgKyBzb2FwT3BlcmF0aW9uLmdldFNvYXBBY3Rpb25VUkkoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQT3BlcmF0aW9uLi4uIik7Ci0gIH0KLSAgCi0gIC8vTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBCb2R5VmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQm9keShTT0FQQm9keSBzb2FwQm9keSkKLSAgewotICAgIHNvYXBCb2R5VmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUEJvZHkuLi4iKTsKLSAgICBwcmludGxuKCJ1c2U6ICIgKyBzb2FwQm9keS5nZXRVc2UoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQQm9keS4uLiIpOwotICB9Ci0gIAotICAvL05lZWRzIHRvIGltcHJvdmUgdGhpcyBwYXJ0Ci0gIHByaXZhdGUgYm9vbGVhbiBzb2FwQmluZGluZ1Zpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEJpbmRpbmcoU09BUEJpbmRpbmcgc29hcEJpbmRpbmcpCi0gIHsKLSAgICBzb2FwQmluZGluZ1Zpc2l0ZWQgPSB0cnVlOwotICAgIHByaW50bG4oIlZpc2l0aW5nIFNPQVBCaW5kaW5nLi4uIik7Ci0gICAgcHJpbnRsbigic3R5bGU6ICIgKyBzb2FwQmluZGluZy5nZXRTdHlsZSgpKTsKLSAgICBwcmludGxuKCJ0cmFuc3BvcnQ6ICIgKyBzb2FwQmluZGluZy5nZXRUcmFuc3BvcnRVUkkoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQQmluZGluZy4uLiIpOyAgCi0gIH0KLSAKLSAgLy8gTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBBZGRyZXNzVmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQWRkcmVzcyhTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcykKLSAgewotICAgIHNvYXBBZGRyZXNzVmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUEFkZHJlc3MuLi4iKTsKLSAgICBwcmludGxuKCJsb2NhdGlvbjogIiArIHNvYXBBZGRyZXNzLmdldExvY2F0aW9uVVJJKCkpOwotICAgIHByaW50bG4oIkxlYXZpbmcgU09BUEFkZHJlc3MuLi4iKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgU2VtYW50aWNUZXN0KCJNb2RlbFNlbWFudGljVGVzdCIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0TW9kZWxTZW1hbnRpYygpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFNlbWFudGljKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIix0cnVlKTsKLSAgICAgIFNlbWFudGljVGVzdCB0ZXN0ID0gbmV3IFNlbWFudGljVGVzdChkZWYpOwotICAgICAgdGVzdC52aXNpdCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoZS50b1N0cmluZygpKTsKLSAgICB9ICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETEdlbmVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETEdlbmVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGJiZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1dTRExHZW5lcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvbkxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotcHVibGljIGNsYXNzIFdTRExHZW5lcmF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIHB1YmxpYyBXU0RMR2VuZXJhdGlvblRlc3QoKQotICB7Ci0gICAgaW5pdCgpOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEdlbmVyYXRpb25UZXN0KFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9ICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgV1NETEdlbmVyYXRpb25UZXN0KCJTYW1wbGVXU0RMR2VuZXJhdGlvbiIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0U2FtcGxlV1NETEdlbmVyYXRpb24oKTsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICk7Ci0gICAgCi0gICAgcmV0dXJuIHN1aXRlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0U2FtcGxlV1NETEdlbmVyYXRpb24oKSAKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGdlbmVyYXRlVGVtcGVyYXR1cmVTZXJ2aWNlKCIuL1RlbXBlcmF0dXJlU2VydmljZS53c2RsIik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAgIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0gICAgc3VwZXIudGVhckRvd24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVUZW1wZXJhdHVyZVNlcnZpY2UoU3RyaW5nIG91dHB1dEZpbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotICAgIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZUZpbGVVUkkob3V0cHV0RmlsZSkpOwotICAgIHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0KLSAgICAvLyBDcmVhdGUgYSBEZWZpbml0aW9uIC0gVGVtcGVyYXR1cmUKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgIGRlZmluaXRpb24uc2V0UU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJLCJUZW1wYXJhdHVyZSIpKTsKLSAgICByZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkZWZpbml0aW9uKTsKLSAgICAKLSAgICAvLyBUYXJnZXQgbmFtZXNwYWNlIC0gaHR0cDovL3d3dy50ZW1wZXJhdHVyZS5jb20KLSAgICBkZWZpbml0aW9uLnNldFRhcmdldE5hbWVzcGFjZSgiaHR0cDovL3d3dy50ZW1wZXJhdHVyZS5jb20iKTsKLSAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgidG5zIiwgImh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tIik7Ci0gICAgCi0gICAgLy8gT3RoZXIgbmFtZXNwYWNlcyAtIHdzZGwsIHNvYXAsIHhzZAotICAgIGRlZmluaXRpb24uYWRkTmFtZXNwYWNlKCJ3c2RsIiwgV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgIGRlZmluaXRpb24uYWRkTmFtZXNwYWNlKCJ4c2QiLCBXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLSAgICBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKS5wdXQoInNvYXAiLCBTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAvLwotICAgIC8vIExldCdzIHN0YXJ0IGJ1aWxkaW5nIHR3byBtZXNzYWdlcwotICAgIC8vCi0gICAgCi0gICAgLy8gQ3JlYXRlIGEgUGFydCAtIFppcENvZGUKLSAgICBQYXJ0IHBhcnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFydCgpOwotICAgIHBhcnQuc2V0TmFtZSgiWmlwQ29kZSIpOwotICAgIHBhcnQuc2V0VHlwZU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsInN0cmluZyIpKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBNZXNzYWdlIC0gR2V0VGVtcGVyYXR1cmVJbnB1dAotICAgIE1lc3NhZ2UgaW5wdXRNZXNzYWdlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICBpbnB1dE1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksICJHZXRUZW1wYXJhdHVyZUlucHV0IikpOwotICAgIGlucHV0TWVzc2FnZS5hZGRQYXJ0KHBhcnQpOwotICAgIGRlZmluaXRpb24uYWRkTWVzc2FnZShpbnB1dE1lc3NhZ2UpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIFBhcnQgLSBUZW1wZXJhdHVyZQotICAgIHBhcnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFydCgpOwotICAgIHBhcnQuc2V0TmFtZSgiVGVtcGVyYXR1cmUiKTsKLSAgICBwYXJ0LnNldFR5cGVOYW1lKG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCJmbG9hdCIpKTsKLQotICAgIC8vIENyZWF0ZSBhIE1lc3NhZ2UgLSBHZXRUZW1wZXJhdHVyZU91dHB1dAotICAgIE1lc3NhZ2Ugb3V0cHV0TWVzc2FnZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgb3V0cHV0TWVzc2FnZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgIkdldFRlbXBhcmF0dXJlT3V0cHV0IikpOwotICAgIG91dHB1dE1lc3NhZ2UuYWRkUGFydChwYXJ0KTsKLSAgICBkZWZpbml0aW9uLmFkZE1lc3NhZ2Uob3V0cHV0TWVzc2FnZSk7Ci0gICAgCi0gICAgLy8KLSAgICAvLyBOZXh0LCBidWlsZCBhIFBvcnRUeXBlCi0gICAgLy8KLSAgICAKLSAgICAvLyBDcmVhdGUgYW4gSW5wdXQgLSBHZXRUZW1wZXJhdHVyZUlucHV0Ci0gICAgSW5wdXQgaW5wdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5wdXQoKTsKLSAgICBpbnB1dC5zZXRNZXNzYWdlKGlucHV0TWVzc2FnZSk7Ci0KLSAgICAvLyBDcmVhdGUgYW4gT3V0cHV0IC0gR2V0VGVtcGVyYXR1cmVPdXRwdXQKLSAgICBPdXRwdXQgb3V0cHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dHB1dCgpOwotICAgIG91dHB1dC5zZXRNZXNzYWdlKG91dHB1dE1lc3NhZ2UpOwotICAgCi0gICAgLy8gQ3JlYXRlIGFuIE9wZXJhdGlvbiAtIEdldFRlbXBlcmF0dXJlRm9yWmlwQ29kZQotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgb3BlcmF0aW9uLnNldE5hbWUoIkdldFRlbXBlcmF0dXJlRm9yWmlwQ29kZSIpOwotICAgIG9wZXJhdGlvbi5zZXRJbnB1dChpbnB1dCk7Ci0gICAgb3BlcmF0aW9uLnNldE91dHB1dChvdXRwdXQpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIFBvcnRUeXBlCi0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydFR5cGUoKTsKLSAgICBwb3J0VHlwZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwiR2V0VGVtcGFyYXR1cmVJbmZvU09BUCIpKTsKLSAgICBwb3J0VHlwZS5hZGRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICBkZWZpbml0aW9uLmFkZFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICAKLSAgICAvLwotICAgIC8vIE5vdywgbGV0J3Mgd29yayBvbiBCaW5kaW5nCi0gICAgLy8KLSAgICAKLSAgICAvLyBDcmVhdGUgYSBCaW5kaW5nIC0gR2V0VGVtcGVyYXR1cmVJbmZvU09BUAotICAgIEJpbmRpbmcgYmluZGluZyA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgYmluZGluZy5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgIkdldFRlbXBhcmF0dXJlSW5mb1NPQVAiKSk7Ci0gICAgYmluZGluZy5zZXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgZGVmaW5pdGlvbi5hZGRCaW5kaW5nKGJpbmRpbmcpOwotCi0gICAgLy8gQ3JlYXRlIGEgU09BUCBCaW5kaW5nCi0gICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEJpbmRpbmcoKTsKLSAgICBzb2FwQmluZGluZy5zZXRTdHlsZSgicnBjIik7Ci0gICAgc29hcEJpbmRpbmcuc2V0VHJhbnNwb3J0VVJJKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiKTsKLSAgICBiaW5kaW5nLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBCaW5kaW5nKTsKLQotICAgIC8vIENyZWF0ZSBhIEJpbmRpbmcgT3BlcmF0aW9uCi0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE5hbWUoIkdldFRlbXBlcmF0dXJlRm9yWmlwQ29kZSIpOwotICAgIGJpbmRpbmcuYWRkQmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgIC8vIENyZWF0ZSBhIFNPQVAgT3BlcmF0aW9uCi0gICAgU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBPcGVyYXRpb24oKTsKLSAgICBzb2FwT3BlcmF0aW9uLnNldFNvYXBBY3Rpb25VUkkoImh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tL0dldFRlbXBlcmF0dXJlRm9yWmlwQ29kZSIpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcE9wZXJhdGlvbik7ICAgIAotCi0gICAgLy8gQ3JlYXRlIGEgU09BUCBCb2R5Ci0gICAgU09BUEJvZHkgc29hcEJvZHkgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEJvZHkoKTsKLSAgICBzb2FwQm9keS5zZXRVc2UoImVuY29kZWQiKTsKLSAgICBzb2FwQm9keS5nZXRFbmNvZGluZ1N0eWxlcygpLmFkZCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICBzb2FwQm9keS5zZXROYW1lc3BhY2VVUkkoImh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tLyIpOwotCi0gICAgLy8gQ3JlYXRlIGEgQmluZGluZyBJbnB1dAotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0lucHV0KCk7Ci0gICAgYmluZGluZ0lucHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBCb2R5KTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEJpbmRpbmdJbnB1dChiaW5kaW5nSW5wdXQpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIFNPQVAgQm9keQotICAgIHNvYXBCb2R5ID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgc29hcEJvZHkuc2V0VXNlKCJlbmNvZGVkIik7Ci0gICAgc29hcEJvZHkuZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgc29hcEJvZHkuc2V0TmFtZXNwYWNlVVJJKCJodHRwOi8vd3d3LnRlbXBlcmF0dXJlLmNvbS8iKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBCaW5kaW5nIE91dHB1dAotICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091cHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICBiaW5kaW5nT3VwdXQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJvZHkpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dChiaW5kaW5nT3VwdXQpOwotICAgIAotICAgIC8vCi0gICAgLy8gRmluYWxseSwgd2UgYXJlIGJ1aWxkaW5nIGEgU2VydmljZQotICAgIC8vCi0KLSAgICAvLyBDcmVhdGUgYSBTT0FQIEFkZHJlc3MKLSAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQWRkcmVzcygpOwotICAgIHNvYXBBZGRyZXNzLnNldExvY2F0aW9uVVJJKCJodHRwOi8vdG9kby1zb21lLWFkZHJlc3MvIik7Ci0KLSAgICAvLyBDcmVhdGUgYSBQb3J0IC0gR2V0VGVtcGVyYXR1cmVJbmZvU09BUAotICAgIFBvcnQgcG9ydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0KCk7Ci0gICAgcG9ydC5zZXROYW1lKCJHZXRUZW1wZXJhdHVyZUluZm9TT0FQIik7Ci0gICAgcG9ydC5zZXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIHBvcnQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEFkZHJlc3MpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIFNlcnZpY2UgLSBUZW1wZXJhdHVyZVNlcnZpY2UKLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZSgpOwotICAgIHNlcnZpY2Uuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIlRlbXBlcmF0dXJlU2VydmljZSIpKTsKLSAgICBzZXJ2aWNlLmFkZFBvcnQocG9ydCk7Ci0gICAgZGVmaW5pdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIAotICAgIC8vCi0gICAgLy8gUGhldywgd2UgYXJlIGRvbmUuIExldCdzIHNlcmlhbGl6ZSBpdC4KLSAgICAvLwotICAgIAotICAgIHJlc291cmNlLnNhdmUobnVsbCk7Ci0gCi0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7ICAKLSAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9EZWZpbml0aW9uTG9hZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9EZWZpbml0aW9uTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2M2E3NmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvRGVmaW5pdGlvbkxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERlZmluaXRpb25Mb2FkZXIKLXsKLSAgewotICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZm9sbG93aW5nIGluIHRoZSBwbHVnaW4ueG1sCi0gICAgLy8KLSAgICAvLyAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2UuZW1mLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgIC8vICAgICA8cGFyc2VyIHR5cGU9IndzZGwiIGNsYXNzPSJjb20uaWJtLmV0b29scy53c2RsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGwiLz4KLSAgICAvLyAgIDwvZXh0ZW5zaW9uPgotICAgIC8vCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgb25seS4KLSAgICovCi0gIHByaXZhdGUgRGVmaW5pdGlvbkxvYWRlcigpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgRGVmaW5pdGlvbiBsb2FkKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbG9hZChmaWxlbmFtZSxmYWxzZSk7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIERlZmluaXRpb24gbG9hZChTdHJpbmcgZmlsZW5hbWUsIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFVSSSB1cmk7Ci0gICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotICAgIGlmIChmaWxlLmlzRmlsZSgpKQotICAgICAgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRDYW5vbmljYWxGaWxlKCkudG9TdHJpbmcoKSk7Ci0gICAgZWxzZQotICAgIHsgLy8gQXNzdW1lIHRoYXQgdGhpcyBpcyBydW4gYXMgYSBKVW5pdCBQbHVnLWluIHRlc3QuCi0gICAgICAvL3VyaSA9IFVSSS5jcmVhdGVVUkkoZmlsZW5hbWUpOwotICAgICAgSVBsdWdpbkRlc2NyaXB0b3IgcGQgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIik7Ci0gICAgICBVUkwgdXJsID0gcGQuZ2V0SW5zdGFsbFVSTCgpOwotICAgICAgdXJsID0gbmV3IFVSTCh1cmwsZmlsZW5hbWUpOwotICAgICAgU3RyaW5nIHMgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0RmlsZSgpOwotICAgICAgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocyk7Ci0gICAgfQotICAKLSAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBXU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5KCkpOwotICAgIAotICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbE1haW5SZXNvdXJjZSA9IChXU0RMUmVzb3VyY2VJbXBsKXJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIioud3NkbCIpKTsKLSAgICB3c2RsTWFpblJlc291cmNlLnNldFVSSSh1cmkpOwotICAgIGphdmEudXRpbC5NYXAgbWFwID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIG1hcC5wdXQoV1NETFJlc291cmNlSW1wbC5DT05USU5VRV9PTl9MT0FEX0VSUk9SLEJvb2xlYW4udmFsdWVPZih0cnVlKSk7Ci0gICAgbWFwLnB1dChXU0RMUmVzb3VyY2VJbXBsLlVTRV9FWFRFTlNJT05fRkFDVE9SSUVTLEJvb2xlYW4udmFsdWVPZih1c2VFeHRlbnNpb25GYWN0b3JpZXMpKTsKLSAgICB3c2RsTWFpblJlc291cmNlLmxvYWQobWFwKTsKLSAgCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIHJlc291cmNlcyA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IHJlc291cmNlcy5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzb3VyY2UgPSByZXNvdXJjZXMubmV4dCgpOwotICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkKLSAgICAgIHsKLSAgICAgICAgV1NETFJlc291cmNlSW1wbCB3c2RsUmVzb3VyY2UgPSAoV1NETFJlc291cmNlSW1wbClyZXNvdXJjZTsKLSAgICAgICAgZGVmaW5pdGlvbiA9IHdzZGxSZXNvdXJjZS5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgIHJldHVybiBkZWZpbml0aW9uOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgdm9pZCBzdG9yZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGRlZmluaXRpb24uZVJlc291cmNlKCk7Ci0gICAgcmVzb3VyY2Uuc2V0VVJJKFVSSS5jcmVhdGVGaWxlVVJJKGZpbGVuYW1lKSk7Ci0gICAgcmVzb3VyY2Uuc2F2ZShudWxsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvRGVmaW5pdGlvblZpc2l0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL0RlZmluaXRpb25WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTQxMTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvRGVmaW5pdGlvblZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZpbml0aW9uVmlzaXRvciBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIAotICAvKioKLSAgICogVXNlIERlZmluaXRpb25WaXNpdG9yKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgICovCi0gIHByaXZhdGUgRGVmaW5pdGlvblZpc2l0b3IoKQotICB7Ci0gIH0KLSAgCi0gIC8vIEFkZGVkIGZvciBKVW5pdAotICBwdWJsaWMgRGVmaW5pdGlvblZpc2l0b3IoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIERlZmluaXRpb25WaXNpdG9yKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIH0KLQotICAvLyBtYWluIGVudHJ5Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KCkKLSAgewotICAgIHZpc2l0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWYuZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEltcG9ydCgoSW1wb3J0KWl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgCi0gICAgVHlwZXMgdHlwZXMgPSBkZWYuZ2V0RVR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICB2aXNpdFR5cGVzKHR5cGVzKTsKLQotICAgIGl0ZXJhdG9yID0gZGVmLmdldEVNZXNzYWdlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0TWVzc2FnZSgoTWVzc2FnZSlpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGl0ZXJhdG9yID0gZGVmLmdldEVQb3J0VHlwZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdFBvcnRUeXBlKChQb3J0VHlwZSlpdGVyYXRvci5uZXh0KCkpOwotCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0RUJpbmRpbmdzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRCaW5kaW5nKChCaW5kaW5nKWl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0RVNlcnZpY2VzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRTZXJ2aWNlKChTZXJ2aWNlKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGRlZi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChkZWYsKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgfQotICAKLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdmlzaXRJbXBvcnQoSW1wb3J0IHdzZGxJbXBvcnQpOwotICAKLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdmlzaXRUeXBlcyhUeXBlcyB0eXBlcyk7Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdFBhcnQoKFBhcnQpaXRlcmF0b3IubmV4dCgpKTsgCi0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBhcnQoUGFydCBwYXJ0KTsKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRPcGVyYXRpb24oKE9wZXJhdGlvbilpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgdmlzaXRJbnB1dCgoSW5wdXQpaW5wdXQpOyAgCi0gICAgCi0gICAgT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgdmlzaXRPdXRwdXQoKE91dHB1dClvdXRwdXQpOyAKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRGYXVsdCgoRmF1bHQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRJbnB1dChJbnB1dCBpbnB1dCk7Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KTsKLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZpc2l0RmF1bHQoRmF1bHQgZmF1bHQpOwotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKChCaW5kaW5nT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGJpbmRpbmcuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoYmluZGluZywoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgQmluZGluZ0lucHV0IGlucHV0ID0gb3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKTsKLSAgICB2aXNpdEJpbmRpbmdJbnB1dCgoQmluZGluZ0lucHV0KWlucHV0KTsgIAotICAgIAotICAgIEJpbmRpbmdPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgdmlzaXRCaW5kaW5nT3V0cHV0KChCaW5kaW5nT3V0cHV0KW91dHB1dCk7IAotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRCaW5kaW5nRmF1bHQoKEJpbmRpbmdGYXVsdClpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGl0ZXJhdG9yID0gb3BlcmF0aW9uLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KG9wZXJhdGlvbiwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLQotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBpbnB1dCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5wdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoaW5wdXQsKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG91dHB1dCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb3V0cHV0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KG91dHB1dCwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGZhdWx0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBmYXVsdC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChmYXVsdCwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRQb3J0KChQb3J0KWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoc2VydmljZSwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9ydC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChwb3J0LChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgIChFeHRlbnNpYmxlRWxlbWVudCBvd25lciwKLSAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMQ29udmVydGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDg1YTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgY2xhc3MgV1NETENvbnZlcnRlciBleHRlbmRzIERlZmluaXRpb25WaXNpdG9yCi17Ci0gIHByaXZhdGUgRG9jdW1lbnQgZG9jOwotICBwcml2YXRlIEVsZW1lbnQgZGVzY3JpcHRpb247Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50VHlwZXM7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50U2VydmljZTsKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRFbmRwb2ludDsKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRJbnRlcmZhY2U7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50T3BlcmF0aW9uOwotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRCaW5kaW5nOwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudEJpbmRpbmdPcGVyYXRpb247Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50QmluZGluZ0lucHV0OwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudEJpbmRpbmdPdXRwdXQ7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50QmluZGluZ0ZhdWx0OwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbE5hbWVzcGFjZVByZWZpeDsKLSAgcHJpdmF0ZSBTdHJpbmcgeHNkTmFtZXNwYWNlUHJlZml4OwotICAKLSAgewotICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZm9sbG93aW5nIGluIHRoZSBwbHVnaW4ueG1sCi0gICAgLy8KLSAgICAvLyAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2UuZW1mLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgIC8vICAgICA8cGFyc2VyIHR5cGU9IndzZGwiIGNsYXNzPSJjb20uaWJtLmV0b29scy53c2RsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGwiLz4KLSAgICAvLyAgIDwvZXh0ZW5zaW9uPgotICAgIC8vCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsKLSAgfQotICAKLSAgLy8gQWRkZWQgZm9yIEpVbml0Ci0gIHB1YmxpYyBXU0RMQ29udmVydGVyKFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGRlZmluaXRpb24KLSAgICovCi0gIHB1YmxpYyBXU0RMQ29udmVydGVyKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGRlZmluaXRpb24pOwotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGUyMChTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGNyZWF0ZURvY3VtZW50KCk7Ci0gICAgdmlzaXQoKTsKLSAgICBzZXJpYWxpemUoZmlsZW5hbWUpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2VyaWFsaXplKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKLSAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsInllcyIpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIlVURi04Iik7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwiNCIpOwotICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShkb21Tb3VyY2UsbmV3IFN0cmVhbVJlc3VsdChuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSkpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIGRvYyA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotICB9Ci0gIAotICBwcml2YXRlIEVsZW1lbnQgY3JlYXRlV1NETEVsZW1lbnQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwiLG5hbWUpOwotICAgIGlmICh3c2RsTmFtZXNwYWNlUHJlZml4ICE9IG51bGwpCi0gICAgICBlbGVtZW50LnNldFByZWZpeCh3c2RsTmFtZXNwYWNlUHJlZml4KTsKLSAgICAKLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEb2N1bWVudGF0aW9uKEVsZW1lbnQgZG9jRWxlbWVudCwgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBpZiAoZG9jRWxlbWVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgRWxlbWVudCBhZG9wdGVkRG9jRWxlbWVudCA9IChFbGVtZW50KWRvYy5pbXBvcnROb2RlKGRvY0VsZW1lbnQsdHJ1ZSk7Ci0gICAgcGFyZW50LmFwcGVuZENoaWxkKGFkb3B0ZWREb2NFbGVtZW50KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgZGVzY3JpcHRpb24gPSBjcmVhdGVXU0RMRWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihkZWYuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxkZXNjcmlwdGlvbik7Ci0gICAgCi0gICAgLy8gVEJEIC0gRGV0ZXJtaW5lIGxhdGVyIGlmIHdlIHdhbnQgdG8gY29udmVydCB0aGUgZG9jdW1lbnQgdG8gdXNlIFNPQVAgMS4yLgotICAgIC8vIEhvd2V2ZXIgYWRkaW5nIHRoZXNlIHR3byBuYW1lc3BhY2VzIG1heSBub3QgYmUgaGFybWZ1bC4KLSAgICBkZXNjcmlwdGlvbi5zZXRBdHRyaWJ1dGUoInhtbG5zOnNvYXBlbnYiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcCIpOwotICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6d3NvYXAiLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3NvYXAxMiIpOwotCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICBkZXNjcmlwdGlvbi5zZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGRlZi5nZXROYW1lc3BhY2VzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAvKgotCXhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotCQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiovCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcmVmaXggPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5hbWVzcGFjZSA9IGRlZi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgIAotICAgICAgaWYgKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAJaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSAvLyBtZWFudCB0byBiZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgCSAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbCIpOwotICAgICAgCWVsc2UKLSAgICAgIAl7Ci0gICAgICAgICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwiKTsKLSAgICAgICAgICB3c2RsTmFtZXNwYWNlUHJlZml4ID0gcHJlZml4OwotICAgICAgICAgIGRlc2NyaXB0aW9uLnNldFByZWZpeCh3c2RsTmFtZXNwYWNlUHJlZml4KTsKLSAgICAgIAl9Ci0gICAgICAJY29udGludWU7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIFNPQVAgMS4yCi0gICAgICBpZiAoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgewotICAgICAgCS8vIFNPQVAgMS4yCi0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3AiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgMi4wIGJpbmRpbmcgZm9yIFNPQVAgMS4yCi0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6d3NvYXAiLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3NvYXAxMiIpOwotICAgICAgCWNvbnRpbnVlOwotICAgICAgfQotICAgICAgCi0gICAgICAvL2lmICgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgLy8gIGNvbnRpbnVlOwotICAgICAgCi0gICAgICBpZiAoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgeHNkTmFtZXNwYWNlUHJlZml4ID0gcHJlZml4OyAvLyBXZSB3aWxsIHVzZSB0aGlzIGluIHZpc2l0SW1wb3J0KCkuCi0gICAgICAKLSAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkgLy8gbWVhbnQgdG8gYmUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxucyIgKyBwcmVmaXgsbmFtZXNwYWNlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIAotICAgIGRvYy5hcHBlbmRDaGlsZChkZXNjcmlwdGlvbik7Ci0gICAgc3VwZXIudmlzaXREZWZpbml0aW9uKGRlZik7Ci0gICAgCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0SW1wb3J0KG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB3c2RsSW1wb3J0KQotICB7Ci0gICAgLy8gRGV0ZXJtaW5lIGlmIHdlIDxpbXBvcnQ+IGEgc2NoZW1hLgotICAgIGlmIChpbXBvcnRpbmdTY2hlbWEod3NkbEltcG9ydCkpCi0gICAgewotICAgICAgY3VycmVudFR5cGVzID0gY3JlYXRlV1NETEVsZW1lbnQoInR5cGVzIik7Ci0gICAgICBkZXNjcmlwdGlvbi5hcHBlbmRDaGlsZChjdXJyZW50VHlwZXMpOwotICAgICAgCi0gICAgICAvLyAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9mb28uY29tIiBzY2hlbWFMb2NhdGlvbj0gImJhci54c2QiLz4KLSAgICAgIEVsZW1lbnQgc2NoZW1hSW1wb3J0ID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCJpbXBvcnQiKTsKLSAgICAgIGlmICh4c2ROYW1lc3BhY2VQcmVmaXggPT0gbnVsbCkgLy8gbmVlZCB0byBhZGQgb25lCi0gICAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6eHMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICB4c2ROYW1lc3BhY2VQcmVmaXggPSAieHMiOwotICAgICAgICBzY2hlbWFJbXBvcnQuc2V0UHJlZml4KHhzZE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghIiIuZXF1YWxzKHhzZE5hbWVzcGFjZVByZWZpeCkpIC8vIGl0IGlzIG5vdCBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgCXNjaGVtYUltcG9ydC5zZXRQcmVmaXgoeHNkTmFtZXNwYWNlUHJlZml4KTsKLSAgICAgIAotICAgICAgc2NoZW1hSW1wb3J0LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIix3c2RsSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIHNjaGVtYUltcG9ydC5zZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIix3c2RsSW1wb3J0LmdldExvY2F0aW9uVVJJKCkpOwotICAgICAgcHJvY2Vzc0RvY3VtZW50YXRpb24od3NkbEltcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLHNjaGVtYUltcG9ydCk7Ci0gICAgICBjdXJyZW50VHlwZXMuYXBwZW5kQ2hpbGQoc2NoZW1hSW1wb3J0KTsKLSAgICB9Ci0gIAllbHNlCi0gICAgewotICAgICAgRWxlbWVudCBpbXBvcnRFbGVtZW50ID0gd3NkbEltcG9ydC5nZXRFbGVtZW50KCk7Ci0gICAgICBFbGVtZW50IGFkb3B0ZWRJbXBvcnRFbGVtZW50ID0gKEVsZW1lbnQpZG9jLmltcG9ydE5vZGUoaW1wb3J0RWxlbWVudCx0cnVlKTsKLSAgICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHdzZGxJbXBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxhZG9wdGVkSW1wb3J0RWxlbWVudCk7Ci0gICAgICBkZXNjcmlwdGlvbi5hcHBlbmRDaGlsZChhZG9wdGVkSW1wb3J0RWxlbWVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gaW1wb3J0aW5nU2NoZW1hKEltcG9ydCBteUltcG9ydCkKLSAgewotICAgIGlmIChteUltcG9ydC5nZXREZWZpbml0aW9uKCkgIT0gbnVsbCkgLy8gaXQgaXMgV1NETCBpbXBvcnQKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0VHlwZXMob3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXMpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFR5cGVzKFR5cGVzIHR5cGVzKQotICB7Ci0gIAkvLyBjdXJyZW50VHlwZXMgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGluIHZpc2l0SW1wb3J0KCkuCi0gICAgaWYgKGN1cnJlbnRUeXBlcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRUeXBlcyA9IGNyZWF0ZVdTRExFbGVtZW50KCJ0eXBlcyIpOwotICAgICAgcHJvY2Vzc0RvY3VtZW50YXRpb24odHlwZXMuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50VHlwZXMpOwotICAgICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoY3VycmVudFR5cGVzKTsKLSAgICB9Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlcy5nZXRTY2hlbWFzKCkuaXRlcmF0b3IoKTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gbnVsbDsKLSAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBudWxsOwotICAgIEVsZW1lbnQgYWRvcHRlZFNjaGVtYUVsZW1lbnQgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgc2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBzY2hlbWEudXBkYXRlRWxlbWVudCgpOwotICAgICAgc2NoZW1hRWxlbWVudCA9IHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICBhZG9wdGVkU2NoZW1hRWxlbWVudCA9IChFbGVtZW50KWRvYy5pbXBvcnROb2RlKHNjaGVtYUVsZW1lbnQsdHJ1ZSk7Ci0gICAgICBjdXJyZW50VHlwZXMuYXBwZW5kQ2hpbGQoYWRvcHRlZFNjaGVtYUVsZW1lbnQpOwotICAgIH0gICAgCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdFBhcnQob3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UGFydChQYXJ0IHBhcnQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgY3VycmVudEludGVyZmFjZSA9IGNyZWF0ZVdTRExFbGVtZW50KCJpbnRlcmZhY2UiKTsKLSAgCXByb2Nlc3NEb2N1bWVudGF0aW9uKHBvcnRUeXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEludGVyZmFjZSk7Ci0gIAkKLSAgICBFbGVtZW50IHBvcnRUeXBlRWxlbWVudCA9IHBvcnRUeXBlLmdldEVsZW1lbnQoKTsKLSAgICBpZiAocG9ydFR5cGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgibmFtZSIpKQotICAgICAgY3VycmVudEludGVyZmFjZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLHBvcnRUeXBlRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgCi0gICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEludGVyZmFjZSk7Ci0gICAgc3VwZXIudmlzaXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBjdXJyZW50T3BlcmF0aW9uID0gY3JlYXRlV1NETEVsZW1lbnQoIm9wZXJhdGlvbiIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRPcGVyYXRpb24pOwotCQotICAgIEVsZW1lbnQgb3BlcmF0aW9uRWxlbWVudCA9IG9wZXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKG9wZXJhdGlvbkVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50T3BlcmF0aW9uLnNldEF0dHJpYnV0ZSgibmFtZSIsb3BlcmF0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0KLSAgICBPcGVyYXRpb25UeXBlIG9wVHlwZSA9IG9wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgIGlmIChPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgY3VycmVudE9wZXJhdGlvbi5zZXRBdHRyaWJ1dGUoInBhdHRlcm4iLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzAzL3dzZGwvaW4tb3V0Iik7Ci0gICAgZWxzZSBpZiAoT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFID09IG9wVHlwZSkKLSAgICAgICAgY3VycmVudE9wZXJhdGlvbi5zZXRBdHRyaWJ1dGUoInBhdHRlcm4iLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzAzL3dzZGwvb3V0LWluIik7Ci0gICAgZWxzZSBpZiAoT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04gPT0gb3BUeXBlKQotICAgICAgICBjdXJyZW50T3BlcmF0aW9uLnNldEF0dHJpYnV0ZSgicGF0dGVybiIsImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDMvd3NkbC9vdXQtb25seSIpOwotICAgIGVsc2UgaWYgKE9wZXJhdGlvblR5cGUuT05FX1dBWSA9PSBvcFR5cGUpCi0gICAgICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0QXR0cmlidXRlKCJwYXR0ZXJuIiwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wMy93c2RsL2luLW9ubHkiKTsKLSAgICAKLSAgICBjdXJyZW50SW50ZXJmYWNlLmFwcGVuZENoaWxkKGN1cnJlbnRPcGVyYXRpb24pOwotICAgIHN1cGVyLnZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0SW5wdXQob3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdElucHV0KElucHV0IGlucHV0KQotICB7Ci0gICAgRWxlbWVudCBjdXJyZW50SW5wdXQgPSBjcmVhdGVXU0RMRWxlbWVudCgiaW5wdXQiKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRJbnB1dCk7Ci0gICAgCi0gICAgRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBpbnB1dC5nZXRFbGVtZW50KCk7Ci0gICAgCi0gICAgaWYgKGlucHV0RWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgIGN1cnJlbnRJbnB1dC5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2VMYWJlbCIsaW5wdXRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICAKLSAgICBFbGVtZW50IHBhcnRFbGVtZW50ID0gZ2V0UGFydEVsZW1lbnQoaW5wdXQpOwotICAgIGlmIChwYXJ0RWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICAgIGN1cnJlbnRJbnB1dC5zZXRBdHRyaWJ1dGUoImVsZW1lbnQiLHBhcnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZWxlbWVudCIpKTsKLSAgICAvLyBUQkQgLSB3aGF0IGlmIHRoZSBwYXJ0IHVzZXMgInR5cGUiPwotICAgIAotICAgIGN1cnJlbnRPcGVyYXRpb24uYXBwZW5kQ2hpbGQoY3VycmVudElucHV0KTsKLSAgfQotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGdldFBhcnRFbGVtZW50KE1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZikKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZVJlZi5nZXRFTWVzc2FnZSgpLmdldEVQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgLy8gVEJEIC0gZm9yIG5vdywgdGFrZSB0aGUgZmlyc3QgcGFydC4KLSAgICBQYXJ0IHBhcnQgPSAoUGFydClpdGVyYXRvci5uZXh0KCk7Ci0gICAgRWxlbWVudCBwYXJ0RWxlbWVudCA9IHBhcnQuZ2V0RWxlbWVudCgpOwotICAgIHJldHVybiBwYXJ0RWxlbWVudDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0T3V0cHV0KG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBFbGVtZW50IGN1cnJlbnRPdXRwdXQgPSBjcmVhdGVXU0RMRWxlbWVudCgib3V0cHV0Iik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24ob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudE91dHB1dCk7Ci0gICAgCi0gICAgRWxlbWVudCBvdXRwdXRFbGVtZW50ID0gb3V0cHV0LmdldEVsZW1lbnQoKTsKLSAgICAKLSAgICBpZiAob3V0cHV0RWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgIGN1cnJlbnRPdXRwdXQuc2V0QXR0cmlidXRlKCJtZXNzYWdlTGFiZWwiLG91dHB1dEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgIAotICAgIEVsZW1lbnQgcGFydEVsZW1lbnQgPSBnZXRQYXJ0RWxlbWVudChvdXRwdXQpOwotICAgIGlmIChwYXJ0RWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICAgIGN1cnJlbnRPdXRwdXQuc2V0QXR0cmlidXRlKCJlbGVtZW50IixwYXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGUoImVsZW1lbnQiKSk7Ci0gICAgLy8gVEJEIC0gd2hhdCBpZiB0aGUgcGFydCB1c2VzICJ0eXBlIj8KLSAgICAKLSAgICBjdXJyZW50T3BlcmF0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRPdXRwdXQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRGYXVsdChvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RmF1bHQoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0QmluZGluZyhvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nID0gY3JlYXRlV1NETEVsZW1lbnQoImJpbmRpbmciKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmcpOwotICAgIAotICAgIEVsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSBiaW5kaW5nLmdldEVsZW1lbnQoKTsKLSAgICBpZiAoYmluZGluZ0VsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50QmluZGluZy5zZXRBdHRyaWJ1dGUoIm5hbWUiLGJpbmRpbmdFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICBpZiAoYmluZGluZ0VsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikpCi0gICAgICBjdXJyZW50QmluZGluZy5zZXRBdHRyaWJ1dGUoImludGVyZmFjZSIsYmluZGluZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpOwotICAgIAotICAgIC8vIFRCRCAtIGlzIHRoZSBuZXh0IGxpbmUgZml4ZWQgZm9yIFNPQVA/Ci0gICAgY3VycmVudEJpbmRpbmcuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL3NvYXAxMiIpOwotICAgIGN1cnJlbnRCaW5kaW5nLnNldEF0dHJpYnV0ZSgid3NvYXA6cHJvdG9jb2wiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUCIpOwotICAgIGN1cnJlbnRCaW5kaW5nLnNldEF0dHJpYnV0ZSgid3NvYXA6bWVwRGVmYXVsdCIsImh0dHA6Ly93d3cudzMub3JnLjIwMDMvMDUvc29hcC9tZXAvcmVxdWVzdC1yZXNwb25zZSIpOwotCi0gICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEJpbmRpbmcpOwotICAgIHN1cGVyLnZpc2l0QmluZGluZyhiaW5kaW5nKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24gPSBjcmVhdGVXU0RMRWxlbWVudCgib3BlcmF0aW9uIik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24ob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmdPcGVyYXRpb24pOwotICAgIAotICAgIEVsZW1lbnQgb3BlcmF0aW9uRWxlbWVudCA9IG9wZXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpLmdldE5hbWUoKTsKLSAKLSAgICAvLyBEZXRlcm1pbmUgcHJlZml4Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWYgPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIGlmIChkZWYgIT0gbnVsbCkKLSAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICBwcmVmaXggPSBkZWYuZ2V0UHJlZml4KHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgCi0gICAgaWYgKHByZWZpeCA9PSBudWxsKQotICAgICAgcHJlZml4ID0gIiI7Ci0gICAgZWxzZQotICAgICAgcHJlZml4ICs9ICI6IjsKLSAgICAgIAotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLnNldEF0dHJpYnV0ZSgicmVmIixwcmVmaXggKyBvcGVyYXRpb25OYW1lKTsKLSAgICAKLSAgICBjdXJyZW50QmluZGluZy5hcHBlbmRDaGlsZChjdXJyZW50QmluZGluZ09wZXJhdGlvbik7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGlucHV0KQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdJbnB1dCA9IGNyZWF0ZVdTRExFbGVtZW50KCJpbnB1dCIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKGlucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmdJbnB1dCk7Ci0gICAgCi0gICAgRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBpbnB1dC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIGlucHV0TmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICBpZiAoaW5wdXROYW1lICE9IG51bGwpCi0gICAgICBpbnB1dEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIixpbnB1dE5hbWUpOwotICAgIAotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRCaW5kaW5nSW5wdXQpOwotICAgIHN1cGVyLnZpc2l0QmluZGluZ0lucHV0KGlucHV0KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdPdXRwdXQgPSBjcmVhdGVXU0RMRWxlbWVudCgib3V0cHV0Iik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24ob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmdPdXRwdXQpOwotICAgIAotICAgIEVsZW1lbnQgb3V0cHV0RWxlbWVudCA9IG91dHB1dC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIG91dHB1dE5hbWUgPSBvdXRwdXQuZ2V0TmFtZSgpOwotICAgIGlmIChvdXRwdXROYW1lICE9IG51bGwpCi0gICAgICBvdXRwdXRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsb3V0cHV0TmFtZSk7Ci0gICAgCi0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEJpbmRpbmdPdXRwdXQpOwotICAgIHN1cGVyLnZpc2l0QmluZGluZ091dHB1dChvdXRwdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBjdXJyZW50QmluZGluZ0ZhdWx0ID0gY3JlYXRlV1NETEVsZW1lbnQoImZhdWx0Iik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24oZmF1bHQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50QmluZGluZ0ZhdWx0KTsKLSAgICAKLSAgICBFbGVtZW50IGZhdWx0RWxlbWVudCA9IGZhdWx0LmdldEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHQuZ2V0TmFtZSgpOwotICAgIGlmIChmYXVsdE5hbWUgIT0gbnVsbCkKLSAgICAgIGZhdWx0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGZhdWx0TmFtZSk7Ci0gICAgCi0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEJpbmRpbmdGYXVsdCk7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nRmF1bHQoZmF1bHQpOyAKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgY3VycmVudFNlcnZpY2UgPSBjcmVhdGVXU0RMRWxlbWVudCgic2VydmljZSIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHNlcnZpY2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50U2VydmljZSk7Ci0gICAgCi0gICAgRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IHNlcnZpY2UuZ2V0RWxlbWVudCgpOwotICAgIGlmIChzZXJ2aWNlRWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgIGN1cnJlbnRTZXJ2aWNlLnNldEF0dHJpYnV0ZSgibmFtZSIsc2VydmljZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgIAotICAgIGRlc2NyaXB0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRTZXJ2aWNlKTsKLSAgICBzdXBlci52aXNpdFNlcnZpY2Uoc2VydmljZSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0UG9ydChvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIGN1cnJlbnRFbmRwb2ludCA9IGNyZWF0ZVdTRExFbGVtZW50KCJlbmRwb2ludCIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50RW5kcG9pbnQpOwotICAgIAotICAgIEVsZW1lbnQgcG9ydEVsZW1lbnQgPSBwb3J0LmdldEVsZW1lbnQoKTsKLSAgICBpZiAocG9ydEVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50RW5kcG9pbnQuc2V0QXR0cmlidXRlKCJuYW1lIixwb3J0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgaWYgKHBvcnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgiYmluZGluZyIpKQotICAgICAgY3VycmVudEVuZHBvaW50LnNldEF0dHJpYnV0ZSgiYmluZGluZyIscG9ydEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJiaW5kaW5nIikpOwotICAgIAotICAgIC8vIEFkZCBpbnRlcmZhY2UgdG8gY3VycmVudCBzZXJ2aWNlCi0gICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRFQmluZGluZygpOwotICAgIGlmIChiaW5kaW5nICE9IG51bGwpIC8vIGJpbmRpbmcgY291bGQgbm90IGJlIHJlc29sdmVkCi0gICAgewotICAgICAgRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IGJpbmRpbmcuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGJpbmRpbmdFbGVtZW50Lmhhc0F0dHJpYnV0ZSgidHlwZSIpKQotICAgICAgICBjdXJyZW50U2VydmljZS5zZXRBdHRyaWJ1dGUoImludGVyZmFjZSIsYmluZGluZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpOwotICAgIH0KLSAgIAotICAgIGN1cnJlbnRTZXJ2aWNlLmFwcGVuZENoaWxkKGN1cnJlbnRFbmRwb2ludCk7Ci0gICAgc3VwZXIudmlzaXRQb3J0KHBvcnQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG93bmVyLCBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIC8vIFRCRCAtIEl0IGlzIG5vdCBqdXN0IFNPQVAgYmluZGluZwotICAgIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuUG9ydEltcGwpCi0gICAgewotICAgICAgRWxlbWVudCBzb2FwRWxlbWVudCA9IGV4dGVuc2liaWxpdHlFbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChzb2FwRWxlbWVudC5oYXNBdHRyaWJ1dGUoImxvY2F0aW9uIikpCi0gICAgICAgIGN1cnJlbnRFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImFkZHJlc3MiLHNvYXBFbGVtZW50LmdldEF0dHJpYnV0ZSgibG9jYXRpb24iKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBFbGVtZW50IGFkb3B0ZWRET01FbGVtZW50ID0gKEVsZW1lbnQpZG9jLmltcG9ydE5vZGUoZG9tRWxlbWVudCx0cnVlKTsKLSAgICAgIAotICAgICAgaWYgKG93bmVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5EZWZpbml0aW9uSW1wbCkKLSAgICAgICAgZGVzY3JpcHRpb24uaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGRlc2NyaXB0aW9uLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGwpCi0gICAgICAgIGN1cnJlbnRTZXJ2aWNlLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50U2VydmljZS5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlBvcnRUeXBlSW1wbCkKLSAgICAgIAljdXJyZW50SW50ZXJmYWNlLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50SW50ZXJmYWNlLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuT3BlcmF0aW9uSW1wbCkKLSAgICAgIAljdXJyZW50T3BlcmF0aW9uLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50T3BlcmF0aW9uLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ0ltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmcuaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGN1cnJlbnRCaW5kaW5nLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmdPcGVyYXRpb24uaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ0lucHV0SW1wbCkKLSAgICAgIAljdXJyZW50QmluZGluZ0lucHV0Lmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50QmluZGluZ0lucHV0LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ091dHB1dEltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmdPdXRwdXQuaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGN1cnJlbnRCaW5kaW5nT3V0cHV0LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ0ZhdWx0SW1wbCkKLSAgICAgIAljdXJyZW50QmluZGluZ0ZhdWx0Lmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50QmluZGluZ0ZhdWx0LmdldEZpcnN0Q2hpbGQoKSk7Ci0KLSAgICB9Ci0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdAotICAgICAgKG5ldyBXU0RMQ29udmVydGVyKCJDb252ZXJ0IikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RDb252ZXJ0KCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICApOwotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdENvbnZlcnQoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoImQ6L2VjbGlwc2UzMDEvZWNsaXBzZS93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvUFRBVGltZURpc3RyaWJ1dGlvbi53c2RsIik7Ci0gICAgICBXU0RMQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBXU0RMQ29udmVydGVyKGRlZik7Ci0gICAgICBjb252ZXJ0ZXIuZ2VuZXJhdGUyMCgiZDovZWNsaXBzZTMwMS9lY2xpcHNlL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9QVEFUaW1lRGlzdHJpYnV0aW9uMjAud3NkbCIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9ICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIC8qCi0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoYXJnc1swXSk7Ci0gICAgICBXU0RMQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBXU0RMQ29udmVydGVyKGRlZik7Ci0gICAgICBjb252ZXJ0ZXIuZ2VuZXJhdGUyMCgidGVzdDIwLndzZGwiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfSovCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1dTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZGFjMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExNb2RlbExvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgcHJvdGVjdGVkIEN1c3RvbVdTRExNb2RlbExvY2F0b3IgY3VzdG9tV1NETE1vZGVsTG9jYXRvciA9IG5ldyBDdXN0b21XU0RMTW9kZWxMb2NhdG9yKCk7Ci0gIAotICBjbGFzcyBDdXN0b21XU0RMTW9kZWxMb2NhdG9yIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBXU0RMTW9kZWxMb2NhdG9yCi0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICAgIHsKLSAgICAgIHJldHVybiBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBuYW1lc3BhY2UsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gIH0KLQotICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICB7Ci0gICAgcmV0dXJuIGN1c3RvbVdTRExNb2RlbExvY2F0b3I7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJiYTg3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsIHNjaGVtYUxvY2F0b3IgPSBuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlci5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBzY2hlbWFMb2NhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWI4YzE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcgotewotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVNjaGVtYUxvY2F0aW9uKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBzY2hlbWFMb2NhdGlvblVSSSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7ICAgICAgCi0gICAgICByZXR1cm4gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlVVJJLCBzY2hlbWFMb2NhdGlvblVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0gIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhNTgzZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTwhLS0gPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iIC8+IC0tPgotCQkKLQkJPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotCQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQkKLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0JPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiIC8+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0JPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLQk8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQkJPGRlbGV0ZT4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMuKnhtbCIgLz4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotCTx0YXJnZXQgbmFtZT0ic3VpdGUiPgotCQk8cHJvcGVydHkgbmFtZT0id3N0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS93c3RfZm9sZGVyIi8+Ci0JCTxkZWxldGUgZGlyPSIke3dzdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIAk8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIAkJPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3c3QtZm9sZGVyfSIvPgotICAgICAgCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgCQk8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMuQWxsVGVzdENhc2VzIiAvPgotICAgCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAJPC9hbnQ+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLQk8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0JPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotCTx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0JCTwhLS08ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIgLz4tLT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0JCTxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLip4bWwiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiIC8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=